diff options
author | Sebastiano Barezzi <barezzisebastiano@gmail.com> | 2020-11-23 19:36:19 +0100 |
---|---|---|
committer | Sebastiano Barezzi <barezzisebastiano@gmail.com> | 2021-03-12 21:12:12 +0100 |
commit | 40ec6194de378a84ee0e93a98cbd8af9bb7850ef (patch) | |
tree | 6b63daa1c24ad684bcef014c3929461e1f410b4a | |
parent | 21b0850786a301ddae3b01ef71d7ec8de1c65bda (diff) |
drivers: touchscreen: Import platina drivers
* From nitrogen-q-oss
Change-Id: Ib7e86526d81daebdb731922205e1d3e430319c94
59 files changed, 63850 insertions, 0 deletions
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 7d4f3a0823ae..08732d7894bf 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -27,6 +27,9 @@ source "drivers/input/touchscreen/synaptics_dsx_e7s/Kconfig" source "drivers/input/touchscreen/nvt_touch_f7a/Kconfig" source "drivers/input/touchscreen/synaptics_tcm_f7a/Kconfig" +source "drivers/input/touchscreen/focal_ft8719_d2t/Kconfig" +source "drivers/input/touchscreen/synaptics_tcm_d2t/Kconfig" + config OF_TOUCHSCREEN def_tristate INPUT depends on INPUT @@ -1187,6 +1190,18 @@ config TOUCHSCREEN_NVT_F7A To compile this driver as a module, choose M here: the module will be called nvt. +config TOUCHSCREEN_NVT_D2T + tristate "novatek touchscreens" + help + Say Y here if you have a nvt touchscreen. + nvt controllers are multi touch controllers which can + report 5 touches at a time. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called nvt. + config TOUCHSCREEN_ROHM_BU21023 tristate "ROHM BU21023/24 Dual touch support resistive touchscreens" depends on I2C @@ -1282,6 +1297,14 @@ config TOUCHSCREEN_COMMON If unsure, say N. +config TOUCHSCREEN_FOCAL_FT8719_D2T + bool "Focaltech Touchscreen" + depends on I2C + default n + help + Say Y here if you have Focaltech touch panel. + If unsure, say N. + config TOUCHSCREEN_FOCAL_FT8719_E7T bool "Focaltech Touchscreen" depends on I2C @@ -1290,6 +1313,13 @@ config TOUCHSCREEN_FOCAL_FT8719_E7T Say Y here if you have Focaltech touch panel. If unsure, say N. +config TOUCHSCREEN_SYNAPTICS_TCM_D2T + bool "Synaptics TCM touchscreen" + default n + help + Say Y here, if you have a Synaptics TCM touchscreen connected. + If unsure, say N. + config TOUCHSCREEN_SYNAPTICS_TCM_F7A bool "Synaptics TCM touchscreen" default n diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index a46bfb9b9b10..17656ed03dd3 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -70,11 +70,14 @@ obj-$(CONFIG_TOUCHSCREEN_STMPE) += stmpe-ts.o obj-$(CONFIG_TOUCHSCREEN_SUN4I) += sun4i-ts.o obj-$(CONFIG_TOUCHSCREEN_SUR40) += sur40.o obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_v21) += synaptics_dsx/ +obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_D2T) += synaptics_tcm_d2t/ obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_F7A) += synaptics_tcm_f7a/ obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FORCE) += synaptics_dsx_force/ obj-$(CONFIG_TOUCHSCREEN_NVT_D2S) += nvt_touch_d2s/ +obj-$(CONFIG_TOUCHSCREEN_FOCAL_FT8719_D2T) += focal_ft8719_d2t/ obj-$(CONFIG_TOUCHSCREEN_FOCAL_FT8719_E7T) += focal_ft8719_e7t/ obj-$(CONFIG_TOUCHSCREEN_NVT_A) += nvt_touch_a/ +obj-$(CONFIG_TOUCHSCREEN_NVT_D2T) += nvt_touch_d2t/ obj-$(CONFIG_TOUCHSCREEN_NVT_F7A) += nvt_touch_f7a/ obj-$(CONFIG_TOUCHSCREEN_TI_AM335X_TSC) += ti_am335x_tsc.o obj-$(CONFIG_TOUCHSCREEN_TOUCHIT213) += touchit213.o diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/Kconfig b/drivers/input/touchscreen/focal_ft8719_d2t/Kconfig new file mode 100644 index 000000000000..e1ec3b91202e --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/Kconfig @@ -0,0 +1,16 @@ +# +# Focaltech Touchscreen driver configuration +# + +config TOUCHSCREEN_FTS + bool "Focaltech Touchscreen" + depends on I2C + default n + help + Say Y here if you have Focaltech touch panel. + If unsure, say N. + +config TOUCHSCREEN_FTS_DIRECTORY + string "Focaltech ts directory name" + default "focaltech_touch" + depends on TOUCHSCREEN_FTS diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/Makefile b/drivers/input/touchscreen/focal_ft8719_d2t/Makefile new file mode 100644 index 000000000000..66acd75cfa30 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/Makefile @@ -0,0 +1,17 @@ +# +# Makefile for the focaltech touchscreen drivers. +# + +# Each configuration option enables a list of files. + +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_core.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_ex_fun.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_ex_mode.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_flash.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_gesture.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_esdcheck.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_i2c.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_point_report_check.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_flash/ +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test/ + diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_common.h b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_common.h new file mode 100644 index 000000000000..0caaca4de5ae --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_common.h @@ -0,0 +1,161 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2020 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +/***************************************************************************** +* +* File Name: focaltech_common.h +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-16 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +#ifndef __LINUX_FOCALTECH_COMMON_H__ +#define __LINUX_FOCALTECH_COMMON_H__ + +#include "focaltech_config.h" + +/***************************************************************************** +* Macro definitions using #define +*****************************************************************************/ +#define FTS_DRIVER_VERSION "Focaltech V2.1 20171229" + +#define BYTE_OFF_0(x) (u8)((x) & 0xFF) +#define BYTE_OFF_8(x) (u8)((x >> 8) & 0xFF) +#define BYTE_OFF_16(x) (u8)((x >> 16) & 0xFF) +#define BYTE_OFF_24(x) (u8)((x >> 24) & 0xFF) +#define FLAGBIT(x) (0x00000001 << (x)) +#define FLAGBITS(x, y) ((0xFFFFFFFF >> (32 - (y) - 1)) << (x)) + +#define FLAG_ICSERIALS_LEN 8 +#define FLAG_HID_BIT 10 +#define FLAG_IDC_BIT 11 + +#define IC_SERIALS (FTS_CHIP_TYPE & FLAGBITS(0, FLAG_ICSERIALS_LEN-1)) +#define IC_TO_SERIALS(x) ((x) & FLAGBITS(0, FLAG_ICSERIALS_LEN-1)) +#define FTS_CHIP_IDC ((FTS_CHIP_TYPE & FLAGBIT(FLAG_IDC_BIT)) == FLAGBIT(FLAG_IDC_BIT)) +#define FTS_HID_SUPPORTTED ((FTS_CHIP_TYPE & FLAGBIT(FLAG_HID_BIT)) == FLAGBIT(FLAG_HID_BIT)) + +#define FTS_CHIP_TYPE_MAPPING { {0x0D, 0x87, 0x19, 0x87, 0x19, 0x87, 0xA9, 0x87, 0xB9} } + +#define I2C_BUFFER_LENGTH_MAXINUM 256 +#define FILE_NAME_LENGTH 128 +#define ENABLE 1 +#define DISABLE 0 +#define VALID 1 +#define INVALID 0 +#define FTS_CMD_START1 0x55 +#define FTS_CMD_START2 0xAA +#define FTS_CMD_START_DELAY 10 +#define FTS_CMD_READ_ID 0x90 +#define FTS_CMD_READ_ID_LEN 4 +#define FTS_CMD_READ_ID_LEN_INCELL 1 +/*register address*/ +#define FTS_REG_INT_CNT 0x8F +#define FTS_REG_FLOW_WORK_CNT 0x91 +#define FTS_REG_WORKMODE 0x00 +#define FTS_REG_WORKMODE_FACTORY_VALUE 0x40 +#define FTS_REG_WORKMODE_WORK_VALUE 0x00 +#define FTS_REG_DYNAMIC_EGDE_RESTRAIN 0X8C +#define FTS_REG_ESDCHECK_DISABLE 0x8D +#define FTS_REG_CHIP_ID 0xA3 +#define FTS_REG_CHIP_ID2 0x9F +#define FTS_REG_POWER_MODE 0xA5 +#define FTS_REG_POWER_MODE_SLEEP_VALUE 0x03 +#define FTS_REG_FW_VER 0xA6 +#define FTS_REG_VENDOR_ID 0xA8 +#define FTS_REG_LCD_BUSY_NUM 0xAB +#define FTS_REG_FACE_DEC_MODE_EN 0xB0 +#define FTS_REG_FACE_DEC_MODE_STATUS 0x01 +#define FTS_REG_IDE_PARA_VER_ID 0xB5 +#define FTS_REG_IDE_PARA_STATUS 0xB6 +#define FTS_REG_GLOVE_MODE_EN 0xC0 +#define FTS_REG_COVER_MODE_EN 0xC1 +#define FTS_REG_CHARGER_MODE_EN 0x8B +#define FTS_REG_GESTURE_EN 0xD0 +#define FTS_REG_GESTURE_OUTPUT_ADDRESS 0xD3 +#define FTS_REG_MODULE_ID 0xE3 +#define FTS_REG_LIC_VER 0xE4 +#define FTS_REG_ESD_SATURATE 0xED + +#define FTS_SYSFS_ECHO_ON(buf) (buf[0] == '1') +#define FTS_SYSFS_ECHO_OFF(buf) (buf[0] == '0') + +#define kfree_safe(pbuf) do {\ + if (pbuf) {\ + kfree(pbuf);\ + pbuf = NULL;\ + } \ +} while (0) + +/***************************************************************************** +* Alternative mode (When something goes wrong, the modules may be able to solve the problem.) +*****************************************************************************/ +/* + * point report check + * default: disable + */ +#define FTS_POINT_REPORT_CHECK_EN 0 + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +struct ft_chip_t { + u64 type; + u8 chip_idh; + u8 chip_idl; + u8 rom_idh; + u8 rom_idl; + u8 pb_idh; + u8 pb_idl; + u8 bl_idh; + u8 bl_idl; +}; + +struct ts_ic_info { + bool is_incell; + bool hid_supported; + struct ft_chip_t ids; +}; + +/***************************************************************************** +* DEBUG function define here +*****************************************************************************/ +#if FTS_DEBUG_EN +#define FTS_DEBUG_LEVEL 1 +#if (FTS_DEBUG_LEVEL == 2) +#define FTS_DEBUG(fmt, args...) printk("[FTS][%s]"fmt"\n", __func__, ##args) +#else +#define FTS_DEBUG(fmt, args...) printk("[FTS]"fmt"\n", ##args) +#endif +#define FTS_FUNC_ENTER() printk("[FTS]%s: Enter\n", __func__) +#define FTS_FUNC_EXIT() printk("[FTS]%s: Exit(%d)\n", __func__, __LINE__) +#else /* #if FTS_DEBUG_EN */ +#define FTS_DEBUG(fmt, args...) +#define FTS_FUNC_ENTER() +#define FTS_FUNC_EXIT() +#endif + +#define FTS_INFO(fmt, args...) printk(KERN_INFO "[FTS][Info]"fmt"\n", ##args) +#define FTS_ERROR(fmt, args...) printk(KERN_ERR "[FTS][Error]"fmt"\n", ##args) + +#endif /* __LINUX_FOCALTECH_COMMON_H__ */ diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_config.h b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_config.h new file mode 100644 index 000000000000..975adc6ead33 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_config.h @@ -0,0 +1,226 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2020 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +/************************************************************************ +* +* File Name: focaltech_config.h +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: global configurations +* +* Version: v1.0 +* +************************************************************************/ +#ifndef _LINUX_FOCLATECH_CONFIG_H_ +#define _LINUX_FOCLATECH_CONFIG_H_ + +/**************************************************/ +/****** G: A, I: B, S: C, U: D ******************/ +/****** chip type defines, do not modify *********/ +#define _FT8716 0x87160805 +#define _FT8736 0x87360806 +#define _FT8006M 0x80060807 +#define _FT8201 0x82010807 +#define _FT7250 0x72500807 +#define _FT8606 0x86060808 +#define _FT8607 0x86070809 +#define _FTE716 0xE716080A +#define _FT8006U 0x8006D80B +#define _FT8613 0x8613080C +#define _FT8719 0x8719080D + +#define _FT5416 0x54160402 +#define _FT5426 0x54260402 +#define _FT5435 0x54350402 +#define _FT5436 0x54360402 +#define _FT5526 0x55260402 +#define _FT5526I 0x5526B402 +#define _FT5446 0x54460402 +#define _FT5346 0x53460402 +#define _FT5446I 0x5446B402 +#define _FT5346I 0x5346B402 +#define _FT7661 0x76610402 +#define _FT7511 0x75110402 +#define _FT7421 0x74210402 +#define _FT7681 0x76810402 +#define _FT3C47U 0x3C47D402 +#define _FT3417 0x34170402 +#define _FT3517 0x35170402 +#define _FT3327 0x33270402 +#define _FT3427 0x34270402 +#define _FT7311 0x73110402 + +#define _FT5626 0x56260401 +#define _FT5726 0x57260401 +#define _FT5826B 0x5826B401 +#define _FT5826S 0x5826C401 +#define _FT7811 0x78110401 +#define _FT3D47 0x3D470401 +#define _FT3617 0x36170401 +#define _FT3717 0x37170401 +#define _FT3817B 0x3817B401 +#define _FT3517U 0x3517D401 + +#define _FT6236U 0x6236D003 +#define _FT6336G 0x6336A003 +#define _FT6336U 0x6336D003 +#define _FT6436U 0x6436D003 + +#define _FT3267 0x32670004 +#define _FT3367 0x33670004 +#define _FT5422U 0x5422D482 +#define _FT3327DQQ_001 0x3327D482 + +/*************************************************/ + +/* + * choose your ic chip type of focaltech + */ +#define FTS_CHIP_TYPE _FT8719 + +/******************* Enables *********************/ +/*********** 1 to enable, 0 to disable ***********/ + +/* + * show debug log info + * enable it for debug, disable it for release + */ +#define FTS_DEBUG_EN 1 + +/* + * Linux MultiTouch Protocol + * 1: Protocol B(default), 0: Protocol A + */ +#define FTS_MT_PROTOCOL_B_EN 1 + +/* + * Report Pressure in multitouch + * 1:enable(default),0:disable +*/ +#define FTS_REPORT_PRESSURE_EN 1 + +/* + * Gesture function enable + * default: disable + */ +#define FTS_GESTURE_EN 1 + +/* + * ESD check & protection + * default: disable + */ +#define FTS_ESDCHECK_EN 0 + +/* + * Production test enable + * 1: enable, 0:disable(default) + */ +#define FTS_TEST_EN 1 + +/* + * Glove mode enable + * 1: enable, 0:disable(default) + */ +#define FTS_GLOVE_EN 0 +/* + * cover enable + * 1: enable, 0:disable(default) + */ +#define FTS_COVER_EN 0 +/* + * Charger enable + * 1: enable, 0:disable(default) + */ +#define FTS_CHARGER_EN 0 + +/* + * Nodes for tools, please keep enable + */ +#define FTS_SYSFS_NODE_EN 1 +#define FTS_APK_NODE_EN 1 + +/* + * Pinctrl enable + * default: disable + */ +#define FTS_PINCTRL_EN 1 + +/* + * Customer power enable + * enable it when customer need control TP power + * default: disable + */ +#define FTS_POWER_SOURCE_CUST_EN 1 + +/****************************************************/ + +/********************** Upgrade ****************************/ +/* + * auto upgrade, please keep enable + */ +#define FTS_AUTO_UPGRADE_EN 1 + +/* + * auto upgrade for lcd cfg + */ +#define FTS_AUTO_LIC_UPGRADE_EN 0 + +/* + * Check vendor_id number + * 0:No check vendor_id (default) + * 1/2/3: Check vendor_id for vendor compatibility + */ +#define FTS_GET_VENDOR_ID_NUM 0 + +/* + * vendor_id(s) for vendor(s) to be compatible with. + * a confirmation of vendor_id(s) is recommended. + * FTS_VENDOR_ID = PANEL_ID << 8 + VENDOR_ID + * FTS_GET_VENDOR_ID_NUM == 0/1, no check vendor id, you may ignore them + * FTS_GET_VENDOR_ID_NUM > 1, compatible with FTS_VENDOR_ID + * FTS_GET_VENDOR_ID_NUM >= 2, compatible with FTS_VENDOR_ID2 + * FTS_GET_VENDOR_ID_NUM >= 3, compatible with FTS_VENDOR_ID3 + */ +#define FTS_VENDOR_ID 0x0000 +#define FTS_VENDOR_ID2 0x0000 +#define FTS_VENDOR_ID3 0x0000 + +/* + * FW.i file for auto upgrade, you must replace it with your own + * define your own fw_file, the sample one to be replaced is invalid + * NOTE: if FTS_GET_VENDOR_ID_NUM > 1, it's the fw corresponding with FTS_VENDOR_ID + */ +#define FTS_UPGRADE_FW_FILE "include/firmware/fw_ft8719_d2t.i" + +/* + * if FTS_GET_VENDOR_ID_NUM >= 2, fw corrsponding with FTS_VENDOR_ID2 + * define your own fw_file, the sample one is invalid + */ +#define FTS_UPGRADE_FW2_FILE "include/firmware/fw_sample.i" + +/* + * if FTS_GET_VENDOR_ID_NUM >= 3, fw corrsponding with FTS_VENDOR_ID3 + * define your own fw_file, the sample one is invalid + */ +#define FTS_UPGRADE_FW3_FILE "include/firmware/fw_sample.i" + +/*********************************************************/ + +#endif /* _LINUX_FOCLATECH_CONFIG_H_ */ diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_core.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_core.c new file mode 100644 index 000000000000..66920a465142 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_core.c @@ -0,0 +1,2314 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2020 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +/***************************************************************************** +* +* File Name: focaltech_core.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: entrance for focaltech ts driver +* +* Version: V1.0 +* +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" +#include <linux/notifier.h> +#include <linux/fb.h> +#ifdef CONFIG_DRM +#include <drm/drm_notifier.h> +#include <drm/drm_panel.h> +#elif defined(CONFIG_HAS_EARLYSUSPEND) +#include <linux/earlysuspend.h> +#define FTS_SUSPEND_LEVEL 1 /* Early-suspend level */ +#endif +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FTS_DRIVER_NAME "fts_ts" +#define INTERVAL_READ_REG 100 /* unit:ms */ +#define TIMEOUT_READ_REG 1000 /* unit:ms */ +#if FTS_POWER_SOURCE_CUST_EN +#define FTS_VTG_MIN_UV 2600000 +#define FTS_VTG_MAX_UV 3300000 +#define FTS_I2C_VTG_MIN_UV 1800000 +#define FTS_I2C_VTG_MAX_UV 1800000 +#endif + +#define INPUT_EVENT_START 0 +#define INPUT_EVENT_SENSITIVE_MODE_OFF 0 +#define INPUT_EVENT_SENSITIVE_MODE_ON 1 +#define INPUT_EVENT_STYLUS_MODE_OFF 2 +#define INPUT_EVENT_STYLUS_MODE_ON 3 +#define INPUT_EVENT_WAKUP_MODE_OFF 4 +#define INPUT_EVENT_WAKUP_MODE_ON 5 +#define INPUT_EVENT_COVER_MODE_OFF 6 +#define INPUT_EVENT_COVER_MODE_ON 7 +#define INPUT_EVENT_SLIDE_FOR_VOLUME 8 +#define INPUT_EVENT_DOUBLE_TAP_FOR_VOLUME 9 +#define INPUT_EVENT_SINGLE_TAP_FOR_VOLUME 10 +#define INPUT_EVENT_LONG_SINGLE_TAP_FOR_VOLUME 11 +#define INPUT_EVENT_PALM_OFF 12 +#define INPUT_EVENT_PALM_ON 13 +#define INPUT_EVENT_END 13 + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +struct fts_ts_data *fts_data; +static bool gesture_enabled_when_resume; +static bool gesture_disabled_when_resume; +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static void fts_release_all_finger(void); +static int fts_ts_suspend(struct device *dev); +static int fts_ts_resume(struct device *dev); +static void fts_resume_work(struct work_struct *work); +static void fts_suspend_work(struct work_struct *work); +#ifdef CONFIG_FB +extern void mdss_panel_reset_skip_enable(bool enable); +extern bool mdss_panel_is_prim(void *fbinfo); +#endif +/***************************************************************************** +* Name: fts_wait_tp_to_valid +* Brief: Read chip id until TP FW become valid(Timeout: TIMEOUT_READ_REG), +* need call when reset/power on/resume... +* Input: +* Output: +* Return: return 0 if tp valid, otherwise return error code +*****************************************************************************/ +int fts_wait_tp_to_valid(struct i2c_client *client) +{ + int ret = 0; + int cnt = 0; + u8 reg_value = 0; + u8 chip_id = fts_data->ic_info.ids.chip_idh; + + do { + ret = fts_i2c_read_reg(client, FTS_REG_CHIP_ID, ®_value); + if ((ret < 0) || (reg_value != chip_id)) { + FTS_DEBUG("TP Not Ready, ReadData = 0x%x", reg_value); + } else if (reg_value == chip_id) { + FTS_INFO("TP Ready, Device ID = 0x%x", reg_value); + return 0; + } + cnt++; + msleep(INTERVAL_READ_REG); + } while ((cnt * INTERVAL_READ_REG) < TIMEOUT_READ_REG); + + return -EIO; +} + +/************************************************************************ +* Name: fts_get_chip_types +* Brief: verity chip id and get chip type data +* Input: +* Output: +* Return: return 0 if success, otherwise return error code +***********************************************************************/ +static int fts_get_chip_types(struct fts_ts_data *ts_data, u8 id_h, u8 id_l, bool fw_valid) +{ + int i = 0; + struct ft_chip_t ctype[] = FTS_CHIP_TYPE_MAPPING; + u32 ctype_entries = sizeof(ctype) / sizeof(struct ft_chip_t); + + if ((0x0 == id_h) || (0x0 == id_l)) { + FTS_ERROR("id_h/id_l is 0"); + return -EINVAL; + } + + FTS_DEBUG("verify id:0x%02x%02x", id_h, id_l); + for (i = 0; i < ctype_entries; i++) { + if (VALID == fw_valid) { + if ((id_h == ctype[i].chip_idh) && (id_l == ctype[i].chip_idl)) + break; + } else { + if (((id_h == ctype[i].rom_idh) && (id_l == ctype[i].rom_idl)) + || ((id_h == ctype[i].pb_idh) && (id_l == ctype[i].pb_idl)) + || ((id_h == ctype[i].bl_idh) && (id_l == ctype[i].bl_idl))) + break; + } + } + + if (i >= ctype_entries) { + return -ENODATA; + } + + ts_data->ic_info.ids = ctype[i]; + return 0; +} + +/***************************************************************************** +* Name: fts_get_ic_information +* Brief: +* Input: +* Output: +* Return: return 0 if success, otherwise return error code +*****************************************************************************/ +static int fts_get_ic_information(struct fts_ts_data *ts_data) +{ + int ret = 0; + int cnt = 0; + u8 chip_id[2] = { 0 }; + u8 id_cmd[4] = { 0 }; + u32 id_cmd_len = 0; + struct i2c_client *client = ts_data->client; + + ts_data->ic_info.is_incell = FTS_CHIP_IDC; + ts_data->ic_info.hid_supported = FTS_HID_SUPPORTTED; + do { + ret = fts_i2c_read_reg(client, FTS_REG_CHIP_ID, &chip_id[0]); + ret = fts_i2c_read_reg(client, FTS_REG_CHIP_ID2, &chip_id[1]); + FTS_DEBUG("CHIP ID=: 0x%02x%02x", chip_id[0], chip_id[1]); + if ((ret < 0) || (0x0 == chip_id[0]) || (0x0 == chip_id[1])) { + FTS_DEBUG("i2c read invalid, read:0x%02x%02x", chip_id[0], chip_id[1]); + } else { + ret = fts_get_chip_types(ts_data, chip_id[0], chip_id[1], VALID); + if (!ret) + break; + else + FTS_DEBUG("TP not ready, read:0x%02x%02x", chip_id[0], chip_id[1]); + } + + cnt++; + msleep(INTERVAL_READ_REG); + } while ((cnt * INTERVAL_READ_REG) < TIMEOUT_READ_REG); + + if ((cnt * INTERVAL_READ_REG) >= TIMEOUT_READ_REG) { + FTS_INFO("fw is invalid, need read boot id"); + if (ts_data->ic_info.hid_supported) { + fts_i2c_hid2std(client); + } + + id_cmd[0] = FTS_CMD_START1; + id_cmd[1] = FTS_CMD_START2; + ret = fts_i2c_write(client, id_cmd, 2); + if (ret < 0) { + FTS_ERROR("start cmd write fail"); + return ret; + } + + msleep(FTS_CMD_START_DELAY); + id_cmd[0] = FTS_CMD_READ_ID; + id_cmd[1] = id_cmd[2] = id_cmd[3] = 0x00; + if (ts_data->ic_info.is_incell) + id_cmd_len = FTS_CMD_READ_ID_LEN_INCELL; + else + id_cmd_len = FTS_CMD_READ_ID_LEN; + ret = fts_i2c_read(client, id_cmd, id_cmd_len, chip_id, 2); + if ((ret < 0) || (0x0 == chip_id[0]) || (0x0 == chip_id[1])) { + FTS_ERROR("read boot id fail"); + return -EIO; + } + ret = fts_get_chip_types(ts_data, chip_id[0], chip_id[1], INVALID); + if (ret < 0) { + FTS_ERROR("can't get ic informaton"); + return ret; + } + } + ts_data->chipid = (short)(chip_id[0] << 8 | chip_id[1]); + FTS_INFO("get ic information, chip id = 0x%02x%02x", ts_data->ic_info.ids.chip_idh, + ts_data->ic_info.ids.chip_idl); + + return 0; +} + +/***************************************************************************** +* Name: fts_tp_state_recovery +* Brief: Need execute this function when reset +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_tp_state_recovery(struct i2c_client *client) +{ + FTS_FUNC_ENTER(); + /* wait tp stable */ + fts_wait_tp_to_valid(client); + /* recover TP charger state 0x8B */ + /* recover TP glove state 0xC0 */ + /* recover TP cover state 0xC1 */ + fts_ex_mode_recovery(client); + /* recover TP gesture state 0xD0 */ +#if FTS_GESTURE_EN + fts_gesture_recovery(client); +#endif + FTS_FUNC_EXIT(); +} + +/***************************************************************************** +* Name: fts_reset_proc +* Brief: Execute reset operation +* Input: hdelayms - delay time unit:ms +* Output: +* Return: +*****************************************************************************/ +int fts_reset_proc(int hdelayms) +{ + FTS_FUNC_ENTER(); + gpio_direction_output(fts_data->pdata->reset_gpio, 0); + msleep(20); + gpio_direction_output(fts_data->pdata->reset_gpio, 1); + if (hdelayms) { + msleep(hdelayms); + } + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_irq_disable +* Brief: disable irq +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_irq_disable(void) +{ + unsigned long irqflags; + + FTS_FUNC_ENTER(); + spin_lock_irqsave(&fts_data->irq_lock, irqflags); + + if (!fts_data->irq_disabled) { + disable_irq_nosync(fts_data->irq); + fts_data->irq_disabled = true; + } + + spin_unlock_irqrestore(&fts_data->irq_lock, irqflags); + FTS_FUNC_EXIT(); +} + +/***************************************************************************** +* Name: fts_irq_disable sync +* Brief: disable irq sync +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_irq_disable_sync(void) +{ + FTS_FUNC_ENTER(); + + if (!fts_data->irq_disabled) { + disable_irq(fts_data->irq); + fts_data->irq_disabled = true; + } + + FTS_FUNC_EXIT(); +} + + +/***************************************************************************** +* Name: fts_irq_enable +* Brief: enable irq +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_irq_enable(void) +{ + unsigned long irqflags = 0; + + FTS_FUNC_ENTER(); + spin_lock_irqsave(&fts_data->irq_lock, irqflags); + + if (fts_data->irq_disabled) { + enable_irq(fts_data->irq); + fts_data->irq_disabled = false; + } + + spin_unlock_irqrestore(&fts_data->irq_lock, irqflags); + FTS_FUNC_EXIT(); +} +#if FTS_POWER_SOURCE_CUST_EN +/***************************************************************************** +* Power Control +*****************************************************************************/ +static int fts_power_source_init(struct fts_ts_data *data) +{ + int ret = 0; + + FTS_FUNC_ENTER(); + + data->vddio = regulator_get(&data->client->dev, "vddio"); + if (IS_ERR(data->vddio)) { + ret = PTR_ERR(data->vddio); + FTS_ERROR("get vddio regulator failed,ret=%d", ret); + return ret; + } + + if (regulator_count_voltages(data->vddio) > 0) { + ret = regulator_set_voltage(data->vddio, FTS_I2C_VTG_MIN_UV, FTS_I2C_VTG_MAX_UV); + if (ret) { + FTS_ERROR("vdd regulator set_vddio failed ret=%d", ret); + goto err_set_vtg_vdd; + } + } + + data->vsp = regulator_get(&data->client->dev, "lab"); + if (IS_ERR(data->vsp)) { + ret = PTR_ERR(data->vsp); + FTS_ERROR("ret vsp regulator failed,ret=%d", ret); + goto err_get_vsp; + } + + data->vsn = regulator_get(&data->client->dev, "ibb"); + if (IS_ERR(data->vsn)) { + ret = PTR_ERR(data->vsn); + FTS_ERROR("ret vsn regulator failed,ret=%d", ret); + goto err_get_vsn; + } + + + data->i2c = regulator_get(&data->client->dev, "i2c"); + if (IS_ERR(data->i2c)) { + ret = PTR_ERR(data->i2c); + FTS_ERROR("ret i2c regulator failed,ret=%d", ret); + return ret; + } + + if (regulator_count_voltages(data->i2c) > 0) { + ret = regulator_set_voltage(data->i2c, FTS_I2C_VTG_MIN_UV, FTS_I2C_VTG_MAX_UV); + if (ret) { + FTS_ERROR("vdd regulator set_i2c failed ret=%d", ret); + goto err_set_vtg_i2c; + } + } + FTS_FUNC_EXIT(); + return 0; + +err_get_vsn: + regulator_put(data->vsp); +err_get_vsp: +err_set_vtg_vdd: + regulator_put(data->vddio); + +err_set_vtg_i2c: + regulator_put(data->i2c); + + + FTS_FUNC_EXIT(); + return ret; +} + +static int fts_power_source_release(struct fts_ts_data *data) +{ + + if (regulator_count_voltages(data->vddio) > 0) + regulator_set_voltage(data->vddio, 0, FTS_I2C_VTG_MAX_UV); + regulator_put(data->vddio); + + regulator_put(data->vsp); + + regulator_put(data->vsn); + + + if (regulator_count_voltages(data->i2c) > 0) + regulator_set_voltage(data->i2c, 0, FTS_I2C_VTG_MAX_UV); + return 0; +} + +static int fts_power_source_ctrl(struct fts_ts_data *data, int enable) +{ + int ret = 0; + + FTS_FUNC_ENTER(); + if (enable) { + if (data->power_disabled) { + + ret = regulator_enable(data->vddio); + if (ret) { + FTS_ERROR("enable vddio regulator failed,ret=%d", ret); + } + + ret = regulator_enable(data->i2c); + if (ret) { + FTS_ERROR("enable i2c regulator failed,ret=%d", ret); + } + + ret = regulator_enable(data->vsp); + if (ret) { + FTS_ERROR("enable vsp regulator failed,ret=%d", ret); + } + + ret = regulator_enable(data->vsn); + if (ret) { + FTS_ERROR("enable vsn regulator failed,ret=%d", ret); + } + + data->power_disabled = false; + } + } else { + if (!data->power_disabled) { + + ret = regulator_disable(data->vsp); + if (ret) { + FTS_ERROR("disable vsp regulator failed,ret=%d", ret); + } + + ret = regulator_disable(data->vsn); + if (ret) { + FTS_ERROR("disable vsn regulator failed,ret=%d", ret); + } + + msleep(20); + ret = regulator_disable(data->vddio); + if (ret) { + FTS_ERROR("disable vddio regulator failed,ret=%d", ret); + } + + ret = regulator_disable(data->i2c); + if (ret) { + FTS_ERROR("disable i2c regulator failed,ret=%d", ret); + } + data->power_disabled = true; + } + } + + FTS_FUNC_EXIT(); + return ret; +} + +#if FTS_PINCTRL_EN +/***************************************************************************** +* Name: fts_pinctrl_init +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_pinctrl_init(struct fts_ts_data *ts) +{ + int ret = 0; + struct i2c_client *client = ts->client; + + ts->pinctrl = devm_pinctrl_get(&client->dev); + if (IS_ERR_OR_NULL(ts->pinctrl)) { + FTS_ERROR("Failed to get pinctrl, please check dts"); + ret = PTR_ERR(ts->pinctrl); + goto err_pinctrl_get; + } + + ts->pins_active = pinctrl_lookup_state(ts->pinctrl, "pmx_ts_active"); + if (IS_ERR_OR_NULL(ts->pins_active)) { + FTS_ERROR("Pin state[active] not found"); + ret = PTR_ERR(ts->pins_active); + goto err_pinctrl_lookup; + } + + ts->pins_suspend = pinctrl_lookup_state(ts->pinctrl, "pmx_ts_suspend"); + if (IS_ERR_OR_NULL(ts->pins_suspend)) { + FTS_ERROR("Pin state[suspend] not found"); + ret = PTR_ERR(ts->pins_suspend); + goto err_pinctrl_lookup; + } + + ts->pins_release = pinctrl_lookup_state(ts->pinctrl, "pmx_ts_release"); + if (IS_ERR_OR_NULL(ts->pins_release)) { + FTS_ERROR("Pin state[release] not found"); + ret = PTR_ERR(ts->pins_release); + } + + return 0; +err_pinctrl_lookup: + if (ts->pinctrl) { + devm_pinctrl_put(ts->pinctrl); + } +err_pinctrl_get: + ts->pinctrl = NULL; + ts->pins_release = NULL; + ts->pins_suspend = NULL; + ts->pins_active = NULL; + return ret; +} + +static int fts_pinctrl_select_normal(struct fts_ts_data *ts) +{ + int ret = 0; + + if (ts->pinctrl && ts->pins_active) { + ret = pinctrl_select_state(ts->pinctrl, ts->pins_active); + if (ret < 0) { + FTS_ERROR("Set normal pin state error:%d", ret); + } + } + + return ret; +} + +static int fts_pinctrl_select_suspend(struct fts_ts_data *ts) +{ + int ret = 0; + + if (ts->pinctrl && ts->pins_suspend) { + ret = pinctrl_select_state(ts->pinctrl, ts->pins_suspend); + if (ret < 0) { + FTS_ERROR("Set suspend pin state error:%d", ret); + } + } + + return ret; +} + +static int fts_pinctrl_select_release(struct fts_ts_data *ts) +{ + int ret = 0; + + if (ts->pinctrl) { + if (IS_ERR_OR_NULL(ts->pins_release)) { + devm_pinctrl_put(ts->pinctrl); + ts->pinctrl = NULL; + } else { + ret = pinctrl_select_state(ts->pinctrl, ts->pins_release); + if (ret < 0) + FTS_ERROR("Set gesture pin state error:%d", ret); + } + } + + return ret; +} +#endif /* FTS_PINCTRL_EN */ +#endif /* FTS_POWER_SOURCE_CUST_EN */ + +/***************************************************************************** +* Reprot related +*****************************************************************************/ +#if (FTS_DEBUG_EN && (FTS_DEBUG_LEVEL == 2)) +char g_sz_debug[1024] = { 0 }; + +static void fts_show_touch_buffer(u8 *buf, int point_num) +{ + int len = point_num * FTS_ONE_TCH_LEN; + int count = 0; + int i; + + memset(g_sz_debug, 0, 1024); + if (len > (fts_data->pnt_buf_size - 3)) { + len = fts_data->pnt_buf_size - 3; + } else if (len == 0) { + len += FTS_ONE_TCH_LEN; + } + count += snprintf(g_sz_debug, PAGE_SIZE, "%02X,%02X,%02X", buf[0], buf[1], buf[2]); + for (i = 0; i < len; i++) { + count += snprintf(g_sz_debug + count, PAGE_SIZE, ",%02X", buf[i + 3]); + } + FTS_DEBUG("buffer: %s", g_sz_debug); +} +#endif + +/***************************************************************************** + * Name: fts_release_all_finger + * Brief: report all points' up events, release touch + * Input: + * Output: + * Return: + *****************************************************************************/ +static void fts_release_all_finger(void) +{ + struct input_dev *input_dev = fts_data->input_dev; +#if FTS_MT_PROTOCOL_B_EN + u32 finger_count = 0; +#endif + + FTS_FUNC_ENTER(); + mutex_lock(&fts_data->report_mutex); +#if FTS_MT_PROTOCOL_B_EN + for (finger_count = 0; finger_count < fts_data->pdata->max_touch_number; finger_count++) { + input_mt_slot(input_dev, finger_count); + input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, false); + } +#else + input_mt_sync(input_dev); +#endif + input_report_key(input_dev, BTN_TOUCH, 0); + input_sync(input_dev); + + mutex_unlock(&fts_data->report_mutex); + FTS_FUNC_EXIT(); +} + +/************************************************************************ + * Name: fts_input_report_key + * Brief: report key event + * Input: events info + * Output: + * Return: return 0 if success + ***********************************************************************/ +static int fts_input_report_key(struct fts_ts_data *data, int index) +{ + u32 ik; + int id = data->events[index].id; + int x = data->events[index].x; + int y = data->events[index].y; + int flag = data->events[index].flag; + u32 key_num = data->pdata->key_number; + + if (!KEY_EN(data)) { + return -EINVAL; + } + for (ik = 0; ik < key_num; ik++) { + if (TOUCH_IN_KEY(x, data->pdata->key_x_coords[ik])) { + if (EVENT_DOWN(flag)) { + data->key_down = true; + input_report_key(data->input_dev, data->pdata->keys[ik], 1); + FTS_DEBUG("Key%d(%d, %d) DOWN!", ik, x, y); + } else { + data->key_down = false; + input_report_key(data->input_dev, data->pdata->keys[ik], 0); + FTS_DEBUG("Key%d(%d, %d) Up!", ik, x, y); + } + return 0; + } + } + + FTS_ERROR("invalid touch for key, [%d](%d, %d)", id, x, y); + return -EINVAL; +} + +#if FTS_MT_PROTOCOL_B_EN +static int fts_input_report_b(struct fts_ts_data *data) +{ + int i = 0; + int uppoint = 0; + int touchs = 0; + bool va_reported = false; + u32 max_touch_num = data->pdata->max_touch_number; + u32 key_y_coor = data->pdata->key_y_coord; + struct ts_event *events = data->events; + + for (i = 0; i < data->touch_point; i++) { + if (KEY_EN(data) && TOUCH_IS_KEY(events[i].y, key_y_coor)) { + fts_input_report_key(data, i); + continue; + } + + if (events[i].id >= max_touch_num) + break; + + va_reported = true; + input_mt_slot(data->input_dev, events[i].id); + + if (EVENT_DOWN(events[i].flag)) { + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, true); + +#if FTS_REPORT_PRESSURE_EN + if (events[i].p <= 0) { + events[i].p = 0x3f; + } + input_report_abs(data->input_dev, ABS_MT_PRESSURE, events[i].p); +#endif + if (events[i].area <= 0) { + events[i].area = 0x09; + } + input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, events[i].area); + input_report_abs(data->input_dev, ABS_MT_POSITION_X, events[i].x); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, events[i].y); + + touchs |= BIT(events[i].id); + data->touchs |= BIT(events[i].id); + + /*FTS_DEBUG("[B]P%d(%d, %d)[p:%d,tm:%d] DOWN!", events[i].id, events[i].x, + events[i].y, events[i].p, events[i].area); */ + } else { + uppoint++; + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false); + data->touchs &= ~BIT(events[i].id); + /*FTS_DEBUG("[B]P%d UP!", events[i].id); */ + } + } + + if (unlikely(data->touchs ^ touchs)) { + for (i = 0; i < max_touch_num; i++) { + if (BIT(i) & (data->touchs ^ touchs)) { + /*FTS_DEBUG("[B]P%d UP!", i); */ + va_reported = true; + input_mt_slot(data->input_dev, i); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false); + } + } + } + data->touchs = touchs; + + if (va_reported) { + /* touchs==0, there's no point but key */ + if (EVENT_NO_DOWN(data) || (!touchs)) { + /*FTS_DEBUG("[B]Points All Up!"); */ + input_report_key(data->input_dev, BTN_TOUCH, 0); + } else { + input_report_key(data->input_dev, BTN_TOUCH, 1); + } + } + + input_sync(data->input_dev); + return 0; +} + +#else +static int fts_input_report_a(struct fts_ts_data *data) +{ + int i = 0; + int touchs = 0; + bool va_reported = false; + u32 key_y_coor = data->pdata->key_y_coord; + struct ts_event *events = data->events; + + for (i = 0; i < data->touch_point; i++) { + if (KEY_EN(data) && TOUCH_IS_KEY(events[i].y, key_y_coor)) { + fts_input_report_key(data, i); + continue; + } + + va_reported = true; + if (EVENT_DOWN(events[i].flag)) { + input_report_abs(data->input_dev, ABS_MT_TRACKING_ID, events[i].id); +#if FTS_REPORT_PRESSURE_EN + if (events[i].p <= 0) { + events[i].p = 0x3f; + } + input_report_abs(data->input_dev, ABS_MT_PRESSURE, events[i].p); +#endif + if (events[i].area <= 0) { + events[i].area = 0x09; + } + input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, events[i].area); + + input_report_abs(data->input_dev, ABS_MT_POSITION_X, events[i].x); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, events[i].y); + + input_mt_sync(data->input_dev); + + FTS_DEBUG("[A]P%d(%d, %d)[p:%d,tm:%d] DOWN!", events[i].id, events[i].x, events[i].y, + events[i].p, events[i].area); + touchs++; + } + } + + /* last point down, current no point but key */ + if (data->touchs && !touchs) { + va_reported = true; + } + data->touchs = touchs; + + if (va_reported) { + if (EVENT_NO_DOWN(data)) { + FTS_DEBUG("[A]Points All Up!"); + input_report_key(data->input_dev, BTN_TOUCH, 0); + input_mt_sync(data->input_dev); + } else { + input_report_key(data->input_dev, BTN_TOUCH, 1); + } + } + + input_sync(data->input_dev); + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_read_touchdata +* Brief: +* Input: +* Output: +* Return: return 0 if succuss +*****************************************************************************/ +static int fts_read_touchdata(struct fts_ts_data *data) +{ + int ret = 0; + int i = 0; + u8 pointid; + int base; + struct ts_event *events = data->events; + int max_touch_num = data->pdata->max_touch_number; + u8 *buf = data->point_buf; + struct i2c_client *client = data->client; + +#if FTS_GESTURE_EN + if (0 == fts_gesture_readdata(data)) { + FTS_INFO("succuss to get gesture data in irq handler"); + return 1; + } +#endif + +#if FTS_POINT_REPORT_CHECK_EN + fts_prc_queue_work(data); +#endif + + data->point_num = 0; + data->touch_point = 0; + + memset(buf, 0xFF, data->pnt_buf_size); + buf[0] = 0x00; + + ret = fts_i2c_read(data->client, buf, 1, buf, data->pnt_buf_size); + if (ret < 0) { + FTS_ERROR("read touchdata failed, ret:%d", ret); + return ret; + } + data->point_num = buf[FTS_TOUCH_POINT_NUM] & 0x0F; + + if (data->ic_info.is_incell) { + if ((data->point_num == 0x0F) && (buf[1] == 0xFF) && (buf[2] == 0xFF) + && (buf[3] == 0xFF) && (buf[4] == 0xFF) && (buf[5] == 0xFF) && (buf[6] == 0xFF)) { + FTS_INFO("touch buff is 0xff, need recovery state"); + fts_tp_state_recovery(client); + return -EIO; + } + } + + if (data->point_num > max_touch_num) { + FTS_INFO("invalid point_num(%d)", data->point_num); + return -EIO; + } +#if (FTS_DEBUG_EN && (FTS_DEBUG_LEVEL == 2)) + fts_show_touch_buffer(buf, data->point_num); +#endif + + for (i = 0; i < max_touch_num; i++) { + base = FTS_ONE_TCH_LEN * i; + + pointid = (buf[FTS_TOUCH_ID_POS + base]) >> 4; + if (pointid >= FTS_MAX_ID) + break; + else if (pointid >= max_touch_num) { + FTS_ERROR("ID(%d) beyond max_touch_number", pointid); + return -EINVAL; + } + + data->touch_point++; + + events[i].x = ((buf[FTS_TOUCH_X_H_POS + base] & 0x0F) << 8) + (buf[FTS_TOUCH_X_L_POS + base] & 0xFF); + events[i].y = ((buf[FTS_TOUCH_Y_H_POS + base] & 0x0F) << 8) + (buf[FTS_TOUCH_Y_L_POS + base] & 0xFF); + events[i].flag = buf[FTS_TOUCH_EVENT_POS + base] >> 6; + events[i].id = buf[FTS_TOUCH_ID_POS + base] >> 4; + events[i].area = buf[FTS_TOUCH_AREA_POS + base] >> 4; + events[i].p = buf[FTS_TOUCH_PRE_POS + base]; + + if (EVENT_DOWN(events[i].flag) && (data->point_num == 0)) { + FTS_INFO("abnormal touch data from fw"); + return -EIO; + } + } + if (data->touch_point == 0) { + FTS_INFO("no touch point information"); + return -EIO; + } + + return 0; +} + +/***************************************************************************** +* Name: fts_report_event +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_report_event(struct fts_ts_data *data) +{ +#if FTS_MT_PROTOCOL_B_EN + fts_input_report_b(data); +#else + fts_input_report_a(data); +#endif +} + +/***************************************************************************** +* Name: fts_ts_interrupt +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static irqreturn_t fts_ts_interrupt(int irq, void *data) +{ + int ret = 0; + struct fts_ts_data *ts_data = (struct fts_ts_data *)data; + + if (!ts_data) { + FTS_ERROR("[INTR]: Invalid fts_ts_data"); + return IRQ_HANDLED; + } +#if FTS_ESDCHECK_EN + fts_esdcheck_set_intr(1); +#endif + + if (ts_data->dev_pm_suspend) { + ret = wait_for_completion_timeout(&ts_data->dev_pm_suspend_completion, msecs_to_jiffies(700)); + if (!ret) { + FTS_ERROR("system(i2c) can't finished resuming procedure, skip it"); + return IRQ_HANDLED; + } + } + + ret = fts_read_touchdata(ts_data); + if (ret == 0) { + mutex_lock(&ts_data->report_mutex); + fts_report_event(ts_data); + mutex_unlock(&ts_data->report_mutex); + } +#if FTS_ESDCHECK_EN + fts_esdcheck_set_intr(0); +#endif + + return IRQ_HANDLED; +} + +/***************************************************************************** +* Name: fts_irq_registration +* Brief: +* Input: +* Output: +* Return: return 0 if succuss, otherwise return error code +*****************************************************************************/ +static int fts_irq_registration(struct fts_ts_data *ts_data) +{ + int ret = 0; + struct fts_ts_platform_data *pdata = ts_data->pdata; + + ts_data->irq = gpio_to_irq(pdata->irq_gpio); + FTS_INFO("irq in ts_data:%d irq in client:%d", ts_data->irq, ts_data->client->irq); + if (ts_data->irq != ts_data->client->irq) + FTS_ERROR("IRQs are inconsistent, please check <interrupts> & <focaltech,irq-gpio> in DTS"); + + if (0 == pdata->irq_gpio_flags) + pdata->irq_gpio_flags = IRQF_TRIGGER_FALLING; + FTS_INFO("irq flag:%x", pdata->irq_gpio_flags); + ret = + request_threaded_irq(ts_data->irq, NULL, fts_ts_interrupt, pdata->irq_gpio_flags | IRQF_ONESHOT, + ts_data->client->name, ts_data); + + return ret; +} + +#if FTS_GESTURE_EN +static void fts_switch_mode_work(struct work_struct *work) +{ + struct fts_mode_switch *ms = container_of(work, struct fts_mode_switch, switch_mode_work); + unsigned char value = ms->mode; + bool enable = false; + FTS_INFO("%s mode %d", __func__, value); + + if (value >= INPUT_EVENT_WAKUP_MODE_OFF && value <= INPUT_EVENT_WAKUP_MODE_ON) { + enable = !!(value - INPUT_EVENT_WAKUP_MODE_OFF); + fts_gesture_enable(enable); + ms->ts_data->lpwg_mode = enable; + } + + if (ms != NULL) { + kfree(ms); + ms = NULL; + } +} + +static int fts_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) +{ + struct fts_ts_data *ts_data = input_get_drvdata(dev); + struct fts_mode_switch *ms; + + FTS_INFO("set input event value = %d", value); + + if (!ts_data) { + FTS_ERROR("fts_ts_data is NULL"); + return 0; + } + + if (type == EV_SYN && code == SYN_CONFIG) { + if (value >= INPUT_EVENT_START && value <= INPUT_EVENT_END) { + ms = (struct fts_mode_switch *) + kmalloc(sizeof(struct fts_mode_switch), GFP_ATOMIC); + + if (ms != NULL) { + ms->ts_data = ts_data; + ms->mode = (unsigned char)value; + INIT_WORK(&ms->switch_mode_work, fts_switch_mode_work); + schedule_work(&ms->switch_mode_work); + } else { + FTS_ERROR("failed in allocating memory for switching mode"); + return -ENOMEM; + } + } else { + FTS_ERROR("%s Invalid event value\n", __func__); + return -EINVAL; + } + } + + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_input_init +* Brief: input device init +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_input_init(struct fts_ts_data *ts_data) +{ + int ret = 0; + int key_num = 0; + struct fts_ts_platform_data *pdata = ts_data->pdata; + struct input_dev *input_dev; + int point_num; + + FTS_FUNC_ENTER(); + + input_dev = input_allocate_device(); + if (!input_dev) { + FTS_ERROR("Failed to allocate memory for input device"); + return -ENOMEM; + } + + /* Init and register Input device */ + input_dev->name = FTS_DRIVER_NAME; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &ts_data->client->dev; +#if FTS_GESTURE_EN + input_dev->event = fts_input_event; +#endif + input_set_drvdata(input_dev, ts_data); + + __set_bit(EV_SYN, input_dev->evbit); + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + + if (pdata->have_key) { + FTS_INFO("set key capabilities"); + for (key_num = 0; key_num < pdata->key_number; key_num++) + input_set_capability(input_dev, EV_KEY, pdata->keys[key_num]); + } +#if FTS_MT_PROTOCOL_B_EN + input_mt_init_slots(input_dev, pdata->max_touch_number, INPUT_MT_DIRECT); +#else + input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, 0x0f, 0, 0); +#endif + input_set_abs_params(input_dev, ABS_MT_POSITION_X, pdata->x_min, pdata->x_max - 1, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->y_min, pdata->y_max - 1, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 0xFF, 0, 0); +#if FTS_REPORT_PRESSURE_EN + input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 0xFF, 0, 0); +#endif + point_num = pdata->max_touch_number; + ts_data->pnt_buf_size = point_num * FTS_ONE_TCH_LEN + 3; + ts_data->point_buf = (u8 *) kzalloc(ts_data->pnt_buf_size, GFP_KERNEL); + if (!ts_data->point_buf) { + FTS_ERROR("failed to alloc memory for point buf!"); + ret = -ENOMEM; + goto err_point_buf; + } + + ts_data->events = (struct ts_event *)kzalloc(point_num * sizeof(struct ts_event), GFP_KERNEL); + if (!ts_data->events) { + + FTS_ERROR("failed to alloc memory for point events!"); + ret = -ENOMEM; + goto err_event_buf; + } + ret = input_register_device(input_dev); + if (ret) { + FTS_ERROR("Input device registration failed"); + goto err_input_reg; + } + + ts_data->input_dev = input_dev; + + FTS_FUNC_EXIT(); + return 0; + +err_input_reg: + kfree_safe(ts_data->events); + +err_event_buf: + kfree_safe(ts_data->point_buf); + +err_point_buf: + input_set_drvdata(input_dev, NULL); + input_free_device(input_dev); + input_dev = NULL; + + FTS_FUNC_EXIT(); + return ret; +} + +/***************************************************************************** +* Name: fts_gpio_configure +* Brief: Configure IRQ&RESET GPIO +* Input: +* Output: +* Return: return 0 if succuss +*****************************************************************************/ +static int fts_gpio_configure(struct fts_ts_data *data) +{ + int ret = 0; + + FTS_FUNC_ENTER(); + /* request irq gpio */ + if (gpio_is_valid(data->pdata->irq_gpio)) { + ret = gpio_request(data->pdata->irq_gpio, "fts_irq_gpio"); + if (ret) { + FTS_ERROR("[GPIO]irq gpio request failed"); + goto err_irq_gpio_req; + } + + ret = gpio_direction_input(data->pdata->irq_gpio); + if (ret) { + FTS_ERROR("[GPIO]set_direction for irq gpio failed"); + goto err_irq_gpio_dir; + } + } + + /* request reset gpio */ + if (gpio_is_valid(data->pdata->reset_gpio)) { + ret = gpio_request(data->pdata->reset_gpio, "fts_reset_gpio"); + if (ret) { + FTS_ERROR("[GPIO]reset gpio request failed"); + goto err_irq_gpio_dir; + } + + ret = gpio_direction_output(data->pdata->reset_gpio, 0); + if (ret) { + FTS_ERROR("[GPIO]set_direction for reset gpio failed"); + goto err_reset_gpio_dir; + } + + msleep(20); + + ret = gpio_direction_output(data->pdata->reset_gpio, 1); + if (ret) { + FTS_ERROR("[GPIO]set_direction for reset gpio failed"); + goto err_reset_gpio_dir; + } + } + + FTS_FUNC_EXIT(); + return 0; + +err_reset_gpio_dir: + if (gpio_is_valid(data->pdata->reset_gpio)) + gpio_free(data->pdata->reset_gpio); +err_irq_gpio_dir: + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); +err_irq_gpio_req: + FTS_FUNC_EXIT(); + return ret; +} + +/***************************************************************************** +* Name: fts_get_dt_coords +* Brief: +* Input: +* Output: +* Return: return 0 if succuss, otherwise return error code +*****************************************************************************/ +static int fts_get_dt_coords(struct device *dev, char *name, struct fts_ts_platform_data *pdata) +{ + int ret = 0; + u32 coords[FTS_COORDS_ARR_SIZE] = { 0 }; + struct property *prop; + struct device_node *np = dev->of_node; + int coords_size; + + prop = of_find_property(np, name, NULL); + if (!prop) + return -EINVAL; + if (!prop->value) + return -ENODATA; + + coords_size = prop->length / sizeof(u32); + if (coords_size != FTS_COORDS_ARR_SIZE) { + FTS_ERROR("invalid:%s, size:%d", name, coords_size); + return -EINVAL; + } + + ret = of_property_read_u32_array(np, name, coords, coords_size); + if (ret && (ret != -EINVAL)) { + FTS_ERROR("Unable to read %s", name); + return -ENODATA; + } + + if (!strcmp(name, "focaltech,display-coords")) { + pdata->x_min = coords[0]; + pdata->y_min = coords[1]; + pdata->x_max = coords[2]; + pdata->y_max = coords[3]; + } else { + FTS_ERROR("unsupported property %s", name); + return -EINVAL; + } + + FTS_INFO("display x(%d %d) y(%d %d)", pdata->x_min, pdata->x_max, pdata->y_min, pdata->y_max); + return 0; +} + +/***************************************************************************** +* Name: fts_parse_dt +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_parse_dt(struct device *dev, struct fts_ts_platform_data *pdata) +{ + int ret = 0; + struct device_node *np = dev->of_node; + u32 temp_val; + + FTS_FUNC_ENTER(); + + ret = fts_get_dt_coords(dev, "focaltech,display-coords", pdata); + if (ret < 0) + FTS_ERROR("Unable to get display-coords"); + + /* key */ + pdata->have_key = of_property_read_bool(np, "focaltech,have-key"); + if (pdata->have_key) { + ret = of_property_read_u32(np, "focaltech,key-number", &pdata->key_number); + if (ret) + FTS_ERROR("Key number undefined!"); + + ret = of_property_read_u32_array(np, "focaltech,keys", pdata->keys, pdata->key_number); + if (ret) + FTS_ERROR("Keys undefined!"); + else if (pdata->key_number > FTS_MAX_KEYS) + pdata->key_number = FTS_MAX_KEYS; + + ret = of_property_read_u32(np, "focaltech,key-y-coord", &pdata->key_y_coord); + if (ret) + FTS_ERROR("Key Y Coord undefined!"); + + ret = of_property_read_u32_array(np, "focaltech,key-x-coords", pdata->key_x_coords, pdata->key_number); + if (ret) + FTS_ERROR("Key X Coords undefined!"); + + FTS_INFO("VK(%d): (%d, %d, %d), [%d, %d, %d][%d]", + pdata->key_number, pdata->keys[0], pdata->keys[1], pdata->keys[2], pdata->key_x_coords[0], + pdata->key_x_coords[1], pdata->key_x_coords[2], pdata->key_y_coord); + } + /*lcd_reset gpio info*/ + pdata->lcd_reset_gpio = of_get_named_gpio_flags(np, "focaltech,lcd-reset-gpio", 0, &pdata->lcd_reset_gpio_flags); + if (pdata->lcd_reset_gpio < 0) + FTS_ERROR("Unable to get lcd_reset_gpio"); + /* reset, irq gpio info */ + pdata->reset_gpio = of_get_named_gpio_flags(np, "focaltech,reset-gpio", 0, &pdata->reset_gpio_flags); + if (pdata->reset_gpio < 0) + FTS_ERROR("Unable to get reset_gpio"); + + pdata->irq_gpio = of_get_named_gpio_flags(np, "focaltech,irq-gpio", 0, &pdata->irq_gpio_flags); + if (pdata->irq_gpio < 0) + FTS_ERROR("Unable to get irq_gpio"); + + ret = of_property_read_u32(np, "focaltech,max-touch-number", &temp_val); + if (0 == ret) { + if (temp_val < 2) + pdata->max_touch_number = 2; + else if (temp_val > FTS_MAX_POINTS_SUPPORT) + pdata->max_touch_number = FTS_MAX_POINTS_SUPPORT; + else + pdata->max_touch_number = temp_val; + } else { + FTS_ERROR("Unable to get max-touch-number"); + pdata->max_touch_number = FTS_MAX_POINTS_SUPPORT; + } + + FTS_INFO("max touch number:%d, irq gpio:%d, reset gpio:%d", pdata->max_touch_number, pdata->irq_gpio, + pdata->reset_gpio); + + FTS_FUNC_EXIT(); + return 0; +} + +static ssize_t fts_lockdown_info_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct fts_ts_data *ts_data = dev_get_drvdata(dev); + + if (!ts_data) + return -EINVAL; + + return snprintf(buf, PAGE_SIZE, "0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n", + (int)ts_data->lockdown_info[0], (int)ts_data->lockdown_info[1], + (int)ts_data->lockdown_info[2], (int)ts_data->lockdown_info[3], + (int)ts_data->lockdown_info[4], (int)ts_data->lockdown_info[5], (int)ts_data->lockdown_info[6], + (int)ts_data->lockdown_info[7]); +} + +static ssize_t fts_panel_color_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct fts_ts_data *ts_data = dev_get_drvdata(dev); + + if (!ts_data) + return -EINVAL; + + return snprintf(buf, PAGE_SIZE, "%c\n", ts_data->lockdown_info[2]); +} + +static ssize_t fts_panel_vendor_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct fts_ts_data *ts_data = dev_get_drvdata(dev); + + if (!ts_data) + return -EINVAL; + + return snprintf(buf, PAGE_SIZE, "%c\n", ts_data->lockdown_info[0]); +} + +static ssize_t fts_panel_display_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct fts_ts_data *ts_data = dev_get_drvdata(dev); + + if (!ts_data) + return -EINVAL; + + return snprintf(buf, PAGE_SIZE, "%c\n", ts_data->lockdown_info[1]); +} + +static DEVICE_ATTR(panel_vendor, 0644, fts_panel_vendor_show, NULL); +static DEVICE_ATTR(panel_color, 0644, fts_panel_color_show, NULL); +static DEVICE_ATTR(panel_display, 0644, fts_panel_display_show, NULL); +static DEVICE_ATTR(lockdown_info, 0644, fts_lockdown_info_show, NULL); + +static struct attribute *fts_attrs[] = { + &dev_attr_lockdown_info.attr, + &dev_attr_panel_color.attr, + &dev_attr_panel_vendor.attr, + &dev_attr_panel_display.attr, + NULL +}; + +static const struct attribute_group fts_attr_group = { + .attrs = fts_attrs +}; + +#define TP_INFO_MAX_LENGTH 50 +static ssize_t fts_lockdown_info_read(struct file *file, char __user *buf, size_t count, loff_t *pos) +{ + int cnt = 0, ret = 0; + char tmp[TP_INFO_MAX_LENGTH]; + + if (*pos != 0) + return 0; + + cnt = + snprintf(tmp, TP_INFO_MAX_LENGTH, + "0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x\n", + fts_data->lockdown_info[0], fts_data->lockdown_info[1], + fts_data->lockdown_info[2], fts_data->lockdown_info[3], fts_data->lockdown_info[4], + fts_data->lockdown_info[5], fts_data->lockdown_info[6], fts_data->lockdown_info[7]); + ret = copy_to_user(buf, tmp, cnt); + + *pos += cnt; + if (ret != 0) + return 0; + else + return cnt; +} + +static const struct file_operations fts_lockdown_info_ops = { + .read = fts_lockdown_info_read, +}; + +static ssize_t fts_fw_version_read(struct file *file, char __user *buf, size_t count, loff_t *pos) +{ + int cnt = 0, ret = 0; + u8 fw_ver_in_tp = 0; + char tmp[TP_INFO_MAX_LENGTH]; + if (*pos != 0) + return 0; + ret = fts_i2c_read_reg(fts_data->client, FTS_REG_FW_VER, &fw_ver_in_tp); + fts_data->fw_ver_in_tp = (int)fw_ver_in_tp; + cnt = snprintf(tmp, TP_INFO_MAX_LENGTH, "%x\n", fts_data->fw_ver_in_tp); + ret = copy_to_user(buf, tmp, cnt); + FTS_INFO("get fw version in tp:%x", fts_data->fw_ver_in_tp); + *pos += cnt; + if (ret != 0) + return 0; + else + return cnt; +} + +static const struct file_operations fts_fw_version_ops = { + .read = fts_fw_version_read, +}; + +static void tpdbg_suspend(struct fts_ts_data *ts_data, bool enable) +{ + if (enable) + fts_ts_suspend(&ts_data->client->dev); + else + fts_ts_resume(&ts_data->client->dev); +} + +static int tpdbg_open(struct inode *inode, struct file *file) +{ + file->private_data = inode->i_private; + + return 0; +} + +static ssize_t tpdbg_read(struct file *file, char __user *buf, size_t size, loff_t *ppos) +{ + + const char *str = "cmd support as below:\n \ + \necho \"irq-disable\" or \"irq-enable\" to ctrl irq\n \ + \necho \"tp-suspend-en\" or \"tp-suspend-off\" to ctrl panel in or off suspend status\n \ + \necho \"tp-sd-en\" or \"tp-sd-off\" to ctrl panel in or off sleep status\n"; + + loff_t pos = *ppos; + int len = strlen(str); + + if (pos < 0) + return -EINVAL; + if (pos >= len) + return 0; + + if (copy_to_user(buf, str, len)) + return -EFAULT; + + *ppos = pos + len; + + return len; +} + +static ssize_t tpdbg_write(struct file *file, const char __user *buf, size_t size, loff_t +*ppos) +{ + struct fts_ts_data *ts_data = file->private_data; + char *cmd = kzalloc(size + 1, GFP_KERNEL); + int ret = size; + + if (!cmd) + return -ENOMEM; + + if (copy_from_user(cmd, buf, size)) { + ret = -EFAULT; + goto out; + } + + cmd[size] = '\0'; + + if (!strncmp(cmd, "irq-disable", 11)) + fts_irq_disable(); + else if (!strncmp(cmd, "irq-enable", 10)) + fts_irq_enable(); + else if (!strncmp(cmd, "tp-suspend-en", 13)) + tpdbg_suspend(ts_data, true); + else if (!strncmp(cmd, "tp-suspend-off", 14)) + tpdbg_suspend(ts_data, false); + else if (!strncmp(cmd, "tp-sd-en", 8)) + tpdbg_suspend(ts_data, true); + else if (!strncmp(cmd, "tp-sd-off", 9)) { + tpdbg_suspend(ts_data, false); + } +out: + kfree(cmd); + + return ret; +} + +static int tpdbg_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + + return 0; +} + +static const struct file_operations tpdbg_operations = { + .owner = THIS_MODULE, + .open = tpdbg_open, + .read = tpdbg_read, + .write = tpdbg_write, + .release = tpdbg_release, +}; + +static int grip_area_open(struct inode *inode, struct file *file) +{ + file->private_data = inode->i_private; + return 0; +} + +static ssize_t grip_area_read(struct file *file, char __user *buf, size_t size, loff_t *ppos) +{ + struct fts_ts_data *ts_data = file->private_data; + u8 reg_value; + int ret; + char tmp[5]; + int cnt; + if (*ppos!=0) + return 0; + ret = fts_i2c_read_reg(ts_data->client, FTS_REG_DYNAMIC_EGDE_RESTRAIN, ®_value); + cnt = snprintf(tmp, 5, "%d\n", reg_value); + if (cnt <= 0) { + FTS_ERROR("Copy data error"); + return cnt; + } + if (copy_to_user(buf, tmp, cnt)) + return -EFAULT; + + *ppos = *ppos + cnt; + + return cnt; +} + + +static ssize_t grip_area_write(struct file *file, const char __user *buf, size_t size, +loff_t *ppos) +{ + struct fts_ts_data *ts_data = file->private_data; + char *cmd = kzalloc(size + 1, GFP_KERNEL); + int ret = -EIO; + int mode; + u8 command; + + if (!ts_data) { + FTS_ERROR("ts data NULL\n"); + return ret; + } + if (!cmd) + return ret; + + if (copy_from_user(cmd, buf, size)) + goto out; + + FTS_INFO("Receive command from init\n"); + cmd[size] = '\0'; + if (ts_data->suspended) { + FTS_INFO("Panel in suspend,no need to set grip_area\n"); + ret = 0; + goto out; + } + sscanf(cmd, "%u", &mode); + FTS_INFO("%s current mode : %d\n", __func__, mode); + + if (mode == 90 || mode == 270) + command = 1; + else + command = 0; + ret = fts_i2c_write_reg(ts_data->client, FTS_REG_DYNAMIC_EGDE_RESTRAIN, command); + if (ret < 0) + FTS_ERROR("%s failed to write command to 0x8C reg\n", __func__); + else + ret = size; +out: + kfree(cmd); + + return ret; +} + + +static int grip_area_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + return 0; +} + +static const struct file_operations grip_area_operations = { + .owner = THIS_MODULE, + .open = grip_area_open, + .read = grip_area_read, + .write = grip_area_write, + .release = grip_area_release, +}; + +/************************************************************************ +*pull down and up lcd reset gpio when lpwg mode on +*************************************************************************/ +static void mdss_lcd_reset(struct fts_ts_data *fts_data) +{ + if (gpio_is_valid(fts_data->pdata->lcd_reset_gpio)) { + gpio_direction_output(fts_data->pdata->lcd_reset_gpio, 0); + msleep(1); + gpio_direction_output(fts_data->pdata->lcd_reset_gpio, 1); + msleep(15); + } else { + FTS_INFO("lcd reset gpio is invalid!"); + } + return; +} + +#ifdef CONFIG_FB +/***************************************************************************** +* Name: fb_notifier_callback +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fb_notifier_callback(struct notifier_block *self, unsigned long event, void *data) +{ + struct fb_event *evdata = data; + int *blank; + struct fts_ts_data *fts_data = container_of(self, struct fts_ts_data, fb_notif); + + if (evdata && evdata->data && mdss_panel_is_prim(evdata->info) + && fts_data && fts_data->client) { + blank = evdata->data; + + flush_workqueue(fts_data->event_wq); + + FTS_INFO("repsonse notifier, enter touch suspend"); + if (event == FB_EARLY_EVENT_BLANK) { + if (*blank == FB_BLANK_POWERDOWN) { + if (fts_data->lpwg_mode) { + mdss_panel_reset_skip_enable(true); + gesture_enabled_when_resume = true; + gesture_disabled_when_resume = false; + } + } else if (*blank == FB_BLANK_UNBLANK) { + if ((fts_data->lpwg_mode || !gesture_disabled_when_resume) + && gesture_enabled_when_resume) { + FTS_INFO("do lcd reset"); + mdss_lcd_reset(fts_data); + } + } + } else if (event == FB_EVENT_BLANK) { + if (*blank == FB_BLANK_UNBLANK) { + if ((fts_data->lpwg_mode || !gesture_disabled_when_resume) + && gesture_enabled_when_resume) { + FTS_INFO("Enter gesture wakeup"); + mdss_panel_reset_skip_enable(false); + } + queue_work(fts_data->event_wq, &fts_data->resume_work); + gesture_enabled_when_resume = false; + gesture_disabled_when_resume = true; + } else if (*blank == FB_BLANK_POWERDOWN) { + queue_work(fts_data->event_wq, &fts_data->suspend_work); + } + } + } + + return 0; +} +#elif defined(CONFIG_HAS_EARLYSUSPEND) +/***************************************************************************** +* Name: fts_ts_early_suspend +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_ts_early_suspend(struct early_suspend *handler) +{ + struct fts_ts_data *data = container_of(handler, + struct fts_ts_data, + early_suspend); + + fts_ts_suspend(&data->client->dev); +} + +/***************************************************************************** +* Name: fts_ts_late_resume +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_ts_late_resume(struct early_suspend *handler) +{ + struct fts_ts_data *data = container_of(handler, + struct fts_ts_data, + early_suspend); + + fts_ts_resume(&data->client->dev); +} +#endif + +/***************************************************************************** +* Name: fts_ts_probe +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + int ret = 0; + struct fts_ts_platform_data *pdata; + struct fts_ts_data *ts_data; + struct dentry *tp_debugfs; + struct dentry *grip_debugfs; + + FTS_FUNC_ENTER(); + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + FTS_ERROR("I2C not supported"); + return -ENODEV; + } + + if (client->dev.of_node) { + pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + FTS_ERROR("Failed to allocate memory for platform data"); + return -ENOMEM; + } + ret = fts_parse_dt(&client->dev, pdata); + if (ret) + FTS_ERROR("[DTS]DT parsing failed"); + } else { + pdata = client->dev.platform_data; + } + + if (!pdata) { + FTS_ERROR("no ts platform data found"); + return -EINVAL; + } + + ts_data = devm_kzalloc(&client->dev, sizeof(*ts_data), GFP_KERNEL); + if (!ts_data) { + FTS_ERROR("Failed to allocate memory for fts_data"); + return -ENOMEM; + } + + fts_data = ts_data; + ts_data->client = client; + ts_data->pdata = pdata; + i2c_set_clientdata(client, ts_data); + + ts_data->ts_workqueue = create_singlethread_workqueue("fts_wq"); + if (NULL == ts_data->ts_workqueue) { + FTS_ERROR("failed to create fts workqueue"); + } + + spin_lock_init(&ts_data->irq_lock); + mutex_init(&ts_data->report_mutex); +#if (!FTS_CHIP_IDC) + fts_reset_proc(200); +#endif + + ret = fts_get_ic_information(ts_data); + if (ret) { + FTS_ERROR("not focal IC, unregister driver"); + goto err_irq_req; + } + ret = fts_input_init(ts_data); + if (ret) { + FTS_ERROR("fts input initialize fail"); + goto err_input_init; + } +#if FTS_POWER_SOURCE_CUST_EN + ret = fts_power_source_init(ts_data); + if (ret) { + FTS_ERROR("fail to get vdd/vcc_i2c regulator"); + goto err_power_init; + } + + ts_data->power_disabled = true; + ret = fts_power_source_ctrl(ts_data, ENABLE); + if (ret) { + FTS_ERROR("fail to enable vdd/vcc_i2c regulator"); + goto err_power_ctrl; + } +#if FTS_PINCTRL_EN + ret = fts_pinctrl_init(ts_data); + if (0 == ret) { + fts_pinctrl_select_normal(ts_data); + } +#endif +#endif + ret = fts_gpio_configure(ts_data); + if (ret) { + FTS_ERROR("[GPIO]Failed to configure the gpios"); + goto err_gpio_config; + } + ret = sysfs_create_group(&client->dev.kobj, &fts_attr_group); + if (ret) { + FTS_ERROR("fail to export sysfs entires\n"); + goto err_irq_req; + } + + ts_data->tp_lockdown_info_proc = proc_create("tp_lockdown_info", 0, NULL, &fts_lockdown_info_ops); + ts_data->tp_fw_version_proc = proc_create("tp_fw_version", 0, NULL, &fts_fw_version_ops); + + gesture_enabled_when_resume = false; + + ts_data->debugfs = debugfs_create_dir("tp_debug", NULL); + if (!ts_data->debugfs) { + FTS_ERROR("create tp_debug fail"); + goto err_sysfs_create_group; + } + grip_debugfs = debugfs_create_file("grip_area", 0660, ts_data->debugfs, ts_data, &grip_area_operations); + if (!grip_debugfs) { + FTS_ERROR("create debugfs fail"); + goto err_sysfs_create_group; + } + tp_debugfs = debugfs_create_file("switch_state", 0660, ts_data->debugfs, ts_data, &tpdbg_operations); + if (!tp_debugfs) { + FTS_ERROR("create debugfs fail"); + goto err_grip_area_debugfs; + } + + ts_data->dbclick_count = 0; +#if FTS_APK_NODE_EN + ret = fts_create_apk_debug_channel(ts_data); + if (ret) { + FTS_ERROR("create apk debug node fail"); + goto err_debugfs_create; + } +#endif + +#if FTS_SYSFS_NODE_EN + ret = fts_create_sysfs(client); + if (ret) { + FTS_ERROR("create sysfs node fail"); + goto err_debugfs_create; + } +#endif + +#if FTS_POINT_REPORT_CHECK_EN + ret = fts_point_report_check_init(ts_data); + if (ret) { + FTS_ERROR("init point report check fail"); + goto err_debugfs_create; + } +#endif + + ret = fts_ex_mode_init(client); + if (ret) { + FTS_ERROR("init glove/cover/charger fail"); + goto err_debugfs_create; + } +#if FTS_GESTURE_EN + ret = fts_gesture_init(ts_data); + if (ret) { + FTS_ERROR("init gesture fail"); + goto err_debugfs_create; + } +#endif + +#if FTS_TEST_EN + ret = fts_test_init(client); + if (ret) { + FTS_ERROR("init production test fail"); + goto err_debugfs_create; + } +#endif + +#if FTS_ESDCHECK_EN + ret = fts_esdcheck_init(ts_data); + if (ret) { + FTS_ERROR("init esd check fail"); + goto err_debugfs_create; + } +#endif + + ts_data->event_wq = + alloc_workqueue("fts-event-queue", + WQ_UNBOUND | WQ_HIGHPRI | WQ_CPU_INTENSIVE, 1); + if (!ts_data->event_wq) { + FTS_ERROR("ERROR: Cannot create work thread\n"); + goto err_debugfs_create; + } + INIT_WORK(&ts_data->resume_work, fts_resume_work); + INIT_WORK(&ts_data->suspend_work, fts_suspend_work); + + ret = fts_irq_registration(ts_data); + if (ret) { + FTS_ERROR("request irq failed"); + goto err_event_wq; + } +#if FTS_AUTO_UPGRADE_EN + ret = fts_fwupg_init(ts_data); + if (ret) { + FTS_ERROR("init fw upgrade fail"); + } +#endif + + device_init_wakeup(&client->dev, 1); + ts_data->dev_pm_suspend = false; + init_completion(&ts_data->dev_pm_suspend_completion); + +#ifdef CONFIG_FB + ts_data->fb_notif.notifier_call = fb_notifier_callback; + ret = fb_register_client(&ts_data->fb_notif); + if (ret) { + FTS_ERROR("[FB]Unable to register fb_notifier: %d", ret); + } +#elif defined(CONFIG_HAS_EARLYSUSPEND) + ts_data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + FTS_SUSPEND_LEVEL; + ts_data->early_suspend.suspend = fts_ts_early_suspend; + ts_data->early_suspend.resume = fts_ts_late_resume; + register_early_suspend(&ts_data->early_suspend); +#endif + FTS_FUNC_EXIT(); + return 0; + +err_event_wq: + if (ts_data->event_wq) + destroy_workqueue(ts_data->event_wq); +err_debugfs_create: + if (tp_debugfs) + debugfs_remove(tp_debugfs); +err_grip_area_debugfs: + if (grip_debugfs) + debugfs_remove(grip_debugfs); +err_sysfs_create_group: + sysfs_remove_group(&client->dev.kobj, &fts_attr_group); + if (gpio_is_valid(pdata->reset_gpio)) + gpio_free(pdata->reset_gpio); + if (gpio_is_valid(pdata->irq_gpio)) + gpio_free(pdata->irq_gpio); +err_gpio_config: + +#if FTS_PINCTRL_EN + fts_pinctrl_select_release(ts_data); +#if FTS_POWER_SOURCE_CUST_EN + fts_power_source_ctrl(ts_data, DISABLE); +err_power_ctrl: + fts_power_source_release(ts_data); +err_power_init: +#endif +#endif + kfree_safe(ts_data->point_buf); + kfree_safe(ts_data->events); + input_unregister_device(ts_data->input_dev); +err_input_init: +err_irq_req: + if (ts_data->ts_workqueue) + destroy_workqueue(ts_data->ts_workqueue); + devm_kfree(&client->dev, ts_data); + + FTS_FUNC_EXIT(); + return ret; +} + +/***************************************************************************** +* Name: fts_ts_remove +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_ts_remove(struct i2c_client *client) +{ + struct fts_ts_data *ts_data = i2c_get_clientdata(client); + + FTS_FUNC_ENTER(); + + sysfs_remove_group(&client->dev.kobj, &fts_attr_group); + +#if FTS_POINT_REPORT_CHECK_EN + fts_point_report_check_exit(ts_data); +#endif + +#if FTS_APK_NODE_EN + fts_release_apk_debug_channel(ts_data); +#endif + +#if FTS_SYSFS_NODE_EN + fts_remove_sysfs(client); +#endif + destroy_workqueue(ts_data->event_wq); + + fts_ex_mode_exit(client); + +#if FTS_AUTO_UPGRADE_EN + fts_fwupg_exit(ts_data); +#endif + +#if FTS_TEST_EN + fts_test_exit(client); +#endif + +#if FTS_ESDCHECK_EN + fts_esdcheck_exit(ts_data); +#endif + +#ifdef CONFIG_FB + if (fb_unregister_client(&ts_data->fb_notif)) + FTS_ERROR("Error occurred while unregistering fb_notifier."); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + unregister_early_suspend(&ts_data->early_suspend); +#endif + + free_irq(client->irq, ts_data); + input_unregister_device(ts_data->input_dev); + + if (gpio_is_valid(ts_data->pdata->reset_gpio)) + gpio_free(ts_data->pdata->reset_gpio); + + if (gpio_is_valid(ts_data->pdata->irq_gpio)) + gpio_free(ts_data->pdata->irq_gpio); + + if (ts_data->ts_workqueue) + destroy_workqueue(ts_data->ts_workqueue); + + +#if FTS_PINCTRL_EN + fts_pinctrl_select_release(ts_data); +#endif +#if FTS_POWER_SOURCE_CUST_EN + fts_power_source_ctrl(ts_data, DISABLE); + fts_power_source_release(ts_data); +#endif + + kfree_safe(ts_data->point_buf); + kfree_safe(ts_data->events); + + devm_kfree(&client->dev, ts_data); + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_ts_suspend +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_ts_suspend(struct device *dev) +{ +#if FTS_POWER_SOURCE_CUST_EN + int ret = 0; +#endif + struct fts_ts_data *ts_data = dev_get_drvdata(dev); + + FTS_FUNC_ENTER(); + if (ts_data->suspended) { + FTS_INFO("Already in suspend state"); + return 0; + } + + if (ts_data->fw_loading) { + FTS_INFO("fw upgrade in process, can't suspend"); + return 0; + } +#if FTS_ESDCHECK_EN + fts_esdcheck_suspend(); +#endif + + fts_irq_disable_sync(); + +#if FTS_GESTURE_EN + if (fts_gesture_suspend(ts_data->client) == 0) { + fts_irq_enable(); + goto exit; + } else { + FTS_ERROR("Set tp dbclick gesture mode failed!"); + FTS_INFO("Set tp state suspended true"); + } +#endif + if (!ts_data->lpwg_mode) { +#if FTS_POWER_SOURCE_CUST_EN + ret = fts_power_source_ctrl(ts_data, DISABLE); + if (ret < 0) { + FTS_ERROR("power off fail, ret=%d", ret); + } +#if FTS_PINCTRL_EN + fts_pinctrl_select_suspend(ts_data); +#endif +#else + /* TP enter sleep mode */ + ret = fts_i2c_write_reg(ts_data->client, FTS_REG_POWER_MODE, FTS_REG_POWER_MODE_SLEEP_VALUE); + if (ret < 0) + FTS_ERROR("set TP to sleep mode fail, ret=%d", ret); +#endif + } +exit: + fts_release_all_finger(); + ts_data->suspended = true; + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_ts_resume +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_ts_resume(struct device *dev) +{ + struct fts_ts_data *ts_data = dev_get_drvdata(dev); + + FTS_FUNC_ENTER(); + if (!ts_data->suspended) { + FTS_DEBUG("Already in awake state"); + return 0; + } + + fts_release_all_finger(); + +#if FTS_POWER_SOURCE_CUST_EN + fts_power_source_ctrl(ts_data, ENABLE); +#if FTS_PINCTRL_EN + fts_pinctrl_select_normal(ts_data); + +#endif +#endif + + fts_tp_state_recovery(ts_data->client); + +#if FTS_ESDCHECK_EN + fts_esdcheck_resume(); +#endif + +#if FTS_GESTURE_EN + if ((fts_gesture_resume(ts_data->client) == 0 || !gesture_disabled_when_resume) + && gesture_enabled_when_resume) { + FTS_INFO("gesture_enabled_when_resume, do gesture resume"); + ts_data->suspended = false; + return 0; + } else { + FTS_ERROR("gesture resume process failed!"); + FTS_INFO("Set tp state suspended false!"); + } +#endif + + ts_data->suspended = false; + fts_irq_enable(); + + FTS_FUNC_EXIT(); + return 0; +} + +static int fts_pm_suspend(struct device *dev) +{ + struct fts_ts_data *ts_data = dev_get_drvdata(dev); + int ret = 0; + + ts_data->dev_pm_suspend = true; + + if (ts_data->lpwg_mode) { + ret = enable_irq_wake(ts_data->irq); + if (ret) { + FTS_INFO("enable_irq_wake(irq:%d) failed", ts_data->irq); + } + } + + reinit_completion(&ts_data->dev_pm_suspend_completion); + + return ret; +} + +static int fts_pm_resume(struct device *dev) +{ + struct fts_ts_data *ts_data = dev_get_drvdata(dev); + int ret = 0; + + ts_data->dev_pm_suspend = false; + + if (ts_data->lpwg_mode) { + ret = disable_irq_wake(ts_data->irq); + if (ret) { + FTS_INFO("disable_irq_wake(irq:%d) failed", ts_data->irq); + } + } + + complete(&ts_data->dev_pm_suspend_completion); + + return 0; +} + +static const struct dev_pm_ops fts_dev_pm_ops = { + .suspend = fts_pm_suspend, + .resume = fts_pm_resume, +}; + +static void fts_resume_work(struct work_struct *work) +{ + struct fts_ts_data *ts; + ts = container_of(work, struct fts_ts_data, resume_work); + fts_ts_resume(&ts->client->dev); +} + +static void fts_suspend_work(struct work_struct *work) +{ + struct fts_ts_data *ts; + ts = container_of(work, struct fts_ts_data, suspend_work); + fts_ts_suspend(&ts->client->dev); +} + + +/***************************************************************************** +* I2C Driver +*****************************************************************************/ +static const struct i2c_device_id fts_ts_id[] = { + {FTS_DRIVER_NAME, 0}, + {}, +}; + +MODULE_DEVICE_TABLE(i2c, fts_ts_id); + +static struct of_device_id fts_match_table[] = { + {.compatible = "focaltech,fts",}, + {}, +}; + +static struct i2c_driver fts_ts_driver = { + .probe = fts_ts_probe, + .remove = fts_ts_remove, + .driver = { + .name = FTS_DRIVER_NAME, + .owner = THIS_MODULE, +#ifdef CONFIG_PM + .pm = &fts_dev_pm_ops, +#endif + .of_match_table = fts_match_table, + }, + .id_table = fts_ts_id, +}; + +/***************************************************************************** +* Name: fts_ts_init +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int __init fts_ts_init(void) +{ + int ret = 0; + + FTS_FUNC_ENTER(); + ret = i2c_add_driver(&fts_ts_driver); + if (ret != 0) { + FTS_ERROR("Focaltech touch screen driver init failed!"); + } + FTS_FUNC_EXIT(); + return ret; +} + +/***************************************************************************** +* Name: fts_ts_exit +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void __exit fts_ts_exit(void) +{ + i2c_del_driver(&fts_ts_driver); +} + +module_init(fts_ts_init); +module_exit(fts_ts_exit); + +MODULE_AUTHOR("FocalTech Driver Team"); +MODULE_DESCRIPTION("FocalTech Touchscreen Driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_core.h b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_core.h new file mode 100644 index 000000000000..0118521cfc0f --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_core.h @@ -0,0 +1,283 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2020 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +/***************************************************************************** +* +* File Name: focaltech_core.h + +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +#ifndef __LINUX_FOCALTECH_CORE_H__ +#define __LINUX_FOCALTECH_CORE_H__ +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include <linux/i2c.h> +#include <linux/input.h> +#include <linux/input/mt.h> +#include <linux/slab.h> +#include <linux/interrupt.h> +#include <linux/delay.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/gpio.h> +#include <linux/of_gpio.h> +#include <linux/regulator/consumer.h> +#include <linux/firmware.h> +#include <linux/debugfs.h> +#include <linux/mutex.h> +#include <linux/wait.h> +#include <linux/time.h> +#include <linux/workqueue.h> +#include <linux/fs.h> +#include <linux/proc_fs.h> +#include <asm/uaccess.h> +#include <linux/version.h> +#include <linux/types.h> +#include <linux/sched.h> +#include <linux/kthread.h> +#include <linux/init.h> +#include <linux/cdev.h> +#include <linux/device.h> +#include <linux/mount.h> +#include <linux/netdevice.h> +#include <linux/unistd.h> +#include <linux/ioctl.h> +#include <linux/vmalloc.h> +#include "focaltech_common.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FTS_MAX_POINTS_SUPPORT 10 /* constant value, can't be changed */ +#define FTS_MAX_KEYS 4 +#define FTS_KEY_WIDTH 50 +#define FTS_ONE_TCH_LEN 6 + +#define FTS_MAX_ID 0x0A +#define FTS_TOUCH_X_H_POS 3 +#define FTS_TOUCH_X_L_POS 4 +#define FTS_TOUCH_Y_H_POS 5 +#define FTS_TOUCH_Y_L_POS 6 +#define FTS_TOUCH_PRE_POS 7 +#define FTS_TOUCH_AREA_POS 8 +#define FTS_TOUCH_POINT_NUM 2 +#define FTS_TOUCH_EVENT_POS 3 +#define FTS_TOUCH_ID_POS 5 +#define FTS_COORDS_ARR_SIZE 4 + +#define FTS_TOUCH_DOWN 0 +#define FTS_TOUCH_UP 1 +#define FTS_TOUCH_CONTACT 2 +#define EVENT_DOWN(flag) ((FTS_TOUCH_DOWN == flag) || (FTS_TOUCH_CONTACT == flag)) +#define EVENT_UP(flag) (FTS_TOUCH_UP == flag) +#define EVENT_NO_DOWN(data) (!data->point_num) +#define KEY_EN(data) (data->pdata->have_key) +#define TOUCH_IS_KEY(y, key_y) (y == key_y) +#define TOUCH_IN_RANGE(val, key_val, half) ((val > (key_val - half)) && (val < (key_val + half))) +#define TOUCH_IN_KEY(x, key_x) TOUCH_IN_RANGE(x, key_x, FTS_KEY_WIDTH) + +#define FTS_LOCKDOWN_INFO_SIZE 8 +#define LOCKDOWN_INFO_ADDR 0x1FA0 +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +struct fts_ts_platform_data { + u32 irq_gpio; + u32 irq_gpio_flags; + u32 reset_gpio; + u32 reset_gpio_flags; + u32 lcd_reset_gpio; + u32 lcd_reset_gpio_flags; + bool have_key; + u32 key_number; + u32 keys[FTS_MAX_KEYS]; + u32 key_y_coord; + u32 key_x_coords[FTS_MAX_KEYS]; + u32 x_max; + u32 y_max; + u32 x_min; + u32 y_min; + u32 max_touch_number; +}; + +struct ts_event { + int x; /*x coordinate */ + int y; /*y coordinate */ + int p; /* pressure */ + int flag; /* touch event flag: 0 -- down; 1-- up; 2 -- contact */ + int id; /*touch ID */ + int area; +}; + +struct fts_ts_data { + struct i2c_client *client; + struct input_dev *input_dev; + struct fts_ts_platform_data *pdata; + struct ts_ic_info ic_info; + struct workqueue_struct *ts_workqueue; + struct work_struct fwupg_work; + struct delayed_work esdcheck_work; + struct delayed_work prc_work; + struct regulator *vsp; + struct regulator *vsn; + struct regulator *vddio; + struct regulator *i2c; + spinlock_t irq_lock; + struct mutex report_mutex; + int irq; + int dbclick_count; + bool suspended; + bool fw_loading; + bool irq_disabled; +#if FTS_POWER_SOURCE_CUST_EN + bool power_disabled; +#endif + /* multi-touch */ + struct ts_event *events; + u8 *point_buf; + int pnt_buf_size; + int touchs; + bool key_down; + int touch_point; + int point_num; + int fw_ver_in_host; + int fw_ver_in_tp; + short chipid; + struct proc_dir_entry *proc; + u8 proc_opmode; + u8 lockdown_info[FTS_LOCKDOWN_INFO_SIZE]; + bool dev_pm_suspend; + bool lpwg_mode; + struct work_struct suspend_work; + struct work_struct resume_work; + struct workqueue_struct *event_wq; + struct completion dev_pm_suspend_completion; +#if FTS_PINCTRL_EN + struct pinctrl *pinctrl; + struct pinctrl_state *pins_active; + struct pinctrl_state *pins_suspend; + struct pinctrl_state *pins_release; +#endif +#ifdef CONFIG_FB + struct notifier_block fb_notif; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif + struct dentry *debugfs; + struct proc_dir_entry *tp_selftest_proc; + struct proc_dir_entry *tp_data_dump_proc; + struct proc_dir_entry *tp_fw_version_proc; + struct proc_dir_entry *tp_lockdown_info_proc; + +}; + +struct fts_mode_switch { + struct fts_ts_data *ts_data; + unsigned char mode; + struct work_struct switch_mode_work; +}; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +extern struct fts_ts_data *fts_data; + +/* i2c communication*/ +int fts_i2c_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue); +int fts_i2c_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue); +int fts_i2c_read(struct i2c_client *client, char *writebuf, int writelen, char *readbuf, int readlen); +int fts_i2c_write(struct i2c_client *client, char *writebuf, int writelen); +void fts_i2c_hid2std(struct i2c_client *client); +int fts_i2c_init(void); +int fts_i2c_exit(void); + +/* Gesture functions */ +#if FTS_GESTURE_EN +int fts_gesture_init(struct fts_ts_data *ts_data); +int fts_gesture_exit(struct i2c_client *client); +void fts_gesture_recovery(struct i2c_client *client); +int fts_gesture_readdata(struct fts_ts_data *ts_data); +int fts_gesture_suspend(struct i2c_client *i2c_client); +int fts_gesture_resume(struct i2c_client *client); +#endif + +/* Apk and functions */ +#if FTS_APK_NODE_EN +int fts_create_apk_debug_channel(struct fts_ts_data *); +void fts_release_apk_debug_channel(struct fts_ts_data *); +#endif + +/* ADB functions */ +#if FTS_SYSFS_NODE_EN +int fts_create_sysfs(struct i2c_client *client); +int fts_remove_sysfs(struct i2c_client *client); +#endif + +/* ESD */ +#if FTS_ESDCHECK_EN +int fts_esdcheck_init(struct fts_ts_data *ts_data); +int fts_esdcheck_exit(struct fts_ts_data *ts_data); +int fts_esdcheck_switch(bool enable); +int fts_esdcheck_proc_busy(bool proc_debug); +int fts_esdcheck_set_intr(bool intr); +int fts_esdcheck_suspend(void); +int fts_esdcheck_resume(void); +#endif + +/* Production test */ +#if FTS_TEST_EN +int fts_test_init(struct i2c_client *client); +int fts_test_exit(struct i2c_client *client); +#endif + +/* Point Report Check*/ +#if FTS_POINT_REPORT_CHECK_EN +int fts_point_report_check_init(struct fts_ts_data *ts_data); +int fts_point_report_check_exit(struct fts_ts_data *ts_data); +void fts_prc_queue_work(struct fts_ts_data *ts_data); +#endif + +/* FW upgrade */ +int fts_upgrade_bin(struct i2c_client *client, char *fw_name, bool force); +int fts_fwupg_init(struct fts_ts_data *ts_data); +int fts_fwupg_exit(struct fts_ts_data *ts_data); + +/* Other */ +int fts_reset_proc(int hdelayms); +int fts_wait_tp_to_valid(struct i2c_client *client); +void fts_tp_state_recovery(struct i2c_client *client); +int fts_ex_mode_init(struct i2c_client *client); +int fts_ex_mode_exit(struct i2c_client *client); +int fts_ex_mode_recovery(struct i2c_client *client); + +void fts_irq_disable(void); +void fts_irq_enable(void); + +int fts_flash_read(struct i2c_client *client, u32 addr, u8 *buf, u32 len); +int fts_flash_read_buf(struct i2c_client *client, u32 saddr, u8 *buf, u32 len); +void fts_gesture_enable(bool enable); + +#endif /* __LINUX_FOCALTECH_CORE_H__ */ diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_esdcheck.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_esdcheck.c new file mode 100644 index 000000000000..41053c2ca404 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_esdcheck.c @@ -0,0 +1,554 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2020 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_esdcheck.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-03 +* +* Abstract: ESD check function +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By luougojin 2016-08-03 +* v1.1: By luougojin 2017-02-15 +* 1. Add LCD_ESD_PATCH to control idc_esdcheck_lcderror +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +#if FTS_ESDCHECK_EN +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define ESDCHECK_WAIT_TIME 1000 /* ms */ +#define LCD_ESD_PATCH 0 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +struct fts_esdcheck_st { + u8 mode:1; /* 1- need check esd 0- no esd check */ + u8 suspend:1; + u8 proc_debug:1; /* apk or adb is accessing I2C */ + u8 intr:1; /* 1- Interrupt trigger */ + u8 unused:4; + u8 flow_work_hold_cnt; /* Flow Work Cnt(reg0x91) keep a same value for x times. >=5 times is ESD, need reset */ + u8 flow_work_cnt_last; /* Save Flow Work Cnt(reg0x91) value */ + u32 hardware_reset_cnt; + u32 i2c_nack_cnt; + u32 i2c_dataerror_cnt; +}; + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct fts_esdcheck_st fts_esdcheck_data; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/***************************************************************************** +* functions body +*****************************************************************************/ +#if LCD_ESD_PATCH +/***************************************************************************** +* Name: lcd_esdcheck +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +int lcd_need_reset; +static int tp_need_recovery; /* LCD reset cause Tp reset */ +int idc_esdcheck_lcderror(struct fts_ts_data *ts_data) +{ + int ret = 0; + u8 val = 0; + struct i2c_client *client = ts_data->client; + + FTS_DEBUG("[ESD]Check LCD ESD"); + if ((tp_need_recovery == 1) && (lcd_need_reset == 0)) { + tp_need_recovery = 0; + /* LCD reset, need recover TP state */ + fts_tp_state_recovery(client); + } + + ret = fts_i2c_read_reg(client, FTS_REG_ESD_SATURATE, &val); + if (ret < 0) { + FTS_ERROR("[ESD]: Read ESD_SATURATE(0xED) failed ret=%d!", ret); + return -EIO; + } + + if (val == 0xAA) { + /* + * 1. Set flag lcd_need_reset = 1; + * 2. LCD driver need reset(recovery) LCD and set lcd_need_reset to 0 + * 3. recover TP state + */ + FTS_INFO("LCD ESD, Execute LCD reset!"); + lcd_need_reset = 1; + tp_need_recovery = 1; + } + + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_esdcheck_tp_reset +* Brief: esd check algorithm +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_esdcheck_tp_reset(struct fts_ts_data *ts_data) +{ + FTS_FUNC_ENTER(); + + fts_esdcheck_data.flow_work_hold_cnt = 0; + fts_esdcheck_data.hardware_reset_cnt++; + + fts_reset_proc(200); + fts_tp_state_recovery(ts_data->client); + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: get_chip_id +* Brief: Read Chip Id 3 times +* Input: +* Output: +* Return: 1 - Read Chip Id 3 times failed +* 0 - Read Chip Id pass +*****************************************************************************/ +static bool get_chip_id(struct fts_ts_data *ts_data) +{ + int ret = 0; + int i = 0; + u8 reg_value = 0; + u8 reg_addr = 0; + struct i2c_client *client = ts_data->client; + u8 chip_id = ts_data->ic_info.ids.chip_idh; + + for (i = 0; i < 3; i++) { + reg_addr = FTS_REG_CHIP_ID; + ret = fts_i2c_read(client, ®_addr, 1, ®_value, 1); + if (ret < 0) { + FTS_ERROR("[ESD]: Read Reg 0xA3 failed ret = %d!!", ret); + fts_esdcheck_data.i2c_nack_cnt++; + } else { + if (reg_value == chip_id) { + break; + } else { + fts_esdcheck_data.i2c_dataerror_cnt++; + } + } + msleep(10); + } + + /* if can't get correct data in 3 times, then need hardware reset */ + if (i >= 3) { + FTS_ERROR("[ESD]: Read Chip id 3 times failed, need execute TP reset!!"); + return 1; + } + + return 0; +} + +/***************************************************************************** +* Name: get_flow_cnt +* Brief: Read flow cnt(0x91) +* Input: +* Output: +* Return: 1 - Reg 0x91(flow cnt) abnormal: hold a value for 5 times +* 0 - Reg 0x91(flow cnt) normal +*****************************************************************************/ +static bool get_flow_cnt(struct fts_ts_data *ts_data) +{ + int ret = 0; + u8 reg_value = 0; + u8 reg_addr = 0; + struct i2c_client *client = ts_data->client; + + reg_addr = FTS_REG_FLOW_WORK_CNT; + ret = fts_i2c_read(client, ®_addr, 1, ®_value, 1); + if (ret < 0) { + FTS_ERROR("[ESD]: Read Reg 0x91 failed ret = %d!!", ret); + fts_esdcheck_data.i2c_nack_cnt++; + } else { + if (reg_value == fts_esdcheck_data.flow_work_cnt_last) { + fts_esdcheck_data.flow_work_hold_cnt++; + } else { + fts_esdcheck_data.flow_work_hold_cnt = 0; + } + + fts_esdcheck_data.flow_work_cnt_last = reg_value; + } + + /* if read flow work cnt 5 times and the value are all the same, then need hardware_reset */ + if (fts_esdcheck_data.flow_work_hold_cnt >= 5) { + FTS_DEBUG("[ESD]: Flow Work Cnt(reg0x91) keep a value for 5 times, need execute TP reset!!"); + return 1; + } + + return 0; +} + +/***************************************************************************** +* Name: esdcheck_algorithm +* Brief: esd check algorithm +* Input: +* Output: +* Return: +*****************************************************************************/ +static int esdcheck_algorithm(struct fts_ts_data *ts_data) +{ + int ret = 0; + u8 reg_value = 0; + u8 reg_addr = 0; + bool hardware_reset = 0; + struct i2c_client *client = ts_data->client; + + /* 1. esdcheck is interrupt, then return */ + if (fts_esdcheck_data.intr == 1) { + FTS_DEBUG("[ESD]: In interrupt state, not check esd, return immediately!!"); + return 0; + } + + /* 2. check power state, if suspend, no need check esd */ + if (fts_esdcheck_data.suspend == 1) { + FTS_DEBUG("[ESD]: In suspend, not check esd, return immediately!!"); + /* because in suspend state, adb can be used, when upgrade FW, will active ESD check(active = 1) + * But in suspend, then will don't queue_delayed_work, when resume, don't check ESD again + */ + return 0; + } + + /* 3. check fts_esdcheck_data.proc_debug state, if 1-proc busy, no need check esd */ + if (fts_esdcheck_data.proc_debug == 1) { + FTS_INFO("[ESD]: In apk or adb command mode, not check esd, return immediately!!"); + return 0; + } + + /* 4. In factory mode, can't check esd */ + reg_addr = FTS_REG_WORKMODE; + ret = fts_i2c_read(client, ®_addr, 1, ®_value, 1); + if (ret < 0) { + fts_esdcheck_data.i2c_nack_cnt++; + } else if ((reg_value & 0x70) != FTS_REG_WORKMODE_WORK_VALUE) { + FTS_DEBUG("[ESD]: not in work mode, no check esd, return immediately!!"); + return 0; + } + + /* 5. IDC esd check lcd default:close */ +#if LCD_ESD_PATCH + idc_esdcheck_lcderror(ts_data); +#endif + + /* 6. Get Chip ID */ + hardware_reset = get_chip_id(ts_data); + + /* 7. get Flow work cnt: 0x91 If no change for 5 times, then ESD and reset */ + if (!hardware_reset) { + hardware_reset = get_flow_cnt(ts_data); + } + + /* 8. If need hardware reset, then handle it here */ + if (hardware_reset == 1) { + fts_esdcheck_tp_reset(ts_data); + } + + FTS_DEBUG("[ESD]: NoACK=%d, Error Data=%d, Hardware Reset=%d", fts_esdcheck_data.i2c_nack_cnt, + fts_esdcheck_data.i2c_dataerror_cnt, fts_esdcheck_data.hardware_reset_cnt); + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_func +* Brief: fts_esdcheck_func +* Input: +* Output: +* Return: +*****************************************************************************/ +static void esdcheck_func(struct work_struct *work) +{ + u8 val = 0; + struct fts_ts_data *ts_data = container_of(work, + struct fts_ts_data, esdcheck_work.work); + + FTS_FUNC_ENTER(); + if (ENABLE == fts_esdcheck_data.mode) { + if (ts_data->ic_info.is_incell) { + fts_i2c_read_reg(ts_data->client, FTS_REG_ESDCHECK_DISABLE, &val); + if (0xA5 == val) { + fts_esdcheck_data.mode = DISABLE; + return; + } + } + esdcheck_algorithm(ts_data); + queue_delayed_work(ts_data->ts_workqueue, &ts_data->esdcheck_work, + msecs_to_jiffies(ESDCHECK_WAIT_TIME)); + } + FTS_FUNC_EXIT(); +} + +/***************************************************************************** +* Name: fts_esdcheck_set_intr +* Brief: interrupt flag (main used in interrupt tp report) +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_set_intr(bool intr) +{ + /* interrupt don't add debug message */ + fts_esdcheck_data.intr = intr; + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_get_status(void) +* Brief: get current status +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_get_status(void) +{ + /* interrupt don't add debug message */ + return fts_esdcheck_data.mode; +} + +/***************************************************************************** +* Name: fts_esdcheck_proc_busy +* Brief: When APK or ADB command access TP via driver, then need set proc_debug, +* then will not check ESD. +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_proc_busy(bool proc_debug) +{ + fts_esdcheck_data.proc_debug = proc_debug; + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_switch +* Brief: FTS esd check function switch. +* Input: enable: 1 - Enable esd check +* 0 - Disable esd check +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_switch(bool enable) +{ + struct fts_ts_data *ts_data = fts_data; + FTS_FUNC_ENTER(); + if (fts_esdcheck_data.mode == ENABLE) { + if (enable) { + FTS_DEBUG("[ESD]: ESD check start!!"); + fts_esdcheck_data.flow_work_hold_cnt = 0; + fts_esdcheck_data.flow_work_cnt_last = 0; + queue_delayed_work(ts_data->ts_workqueue, &ts_data->esdcheck_work, + msecs_to_jiffies(ESDCHECK_WAIT_TIME)); + } else { + FTS_DEBUG("[ESD]: ESD check stop!!"); + cancel_delayed_work(&ts_data->esdcheck_work); + } + } else { + FTS_DEBUG("[ESD]: ESD should disable!!"); + cancel_delayed_work(&ts_data->esdcheck_work); + } + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_suspend +* Brief: Run when tp enter into suspend +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_suspend(void) +{ + FTS_FUNC_ENTER(); + fts_esdcheck_switch(DISABLE); + fts_esdcheck_data.suspend = 1; + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_resume +* Brief: Run when tp resume +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_resume(void) +{ + FTS_FUNC_ENTER(); + fts_esdcheck_switch(ENABLE); + fts_esdcheck_data.suspend = 0; + FTS_FUNC_EXIT(); + return 0; +} + +/************************************************************************ +* Name: fts_esdcheck_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_esdcheck_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct input_dev *input_dev = fts_data->input_dev; + + mutex_lock(&input_dev->mutex); + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_DEBUG("enable esdcheck"); + fts_esdcheck_data.mode = ENABLE; + fts_esdcheck_switch(ENABLE); + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_DEBUG("disable esdcheck"); + fts_esdcheck_data.mode = DISABLE; + fts_esdcheck_switch(DISABLE); + } + mutex_unlock(&input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_esdcheck_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_esdcheck_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + struct input_dev *input_dev = fts_data->input_dev; + + mutex_lock(&input_dev->mutex); + count = snprintf(buf, PAGE_SIZE, "Esd check: %s\n", fts_esdcheck_get_status() ? "On" : "Off"); + mutex_unlock(&input_dev->mutex); + + return count; +} + +/* sysfs esd node + * read example: cat fts_esd_mode ---read esd mode + * write example:echo 01 > fts_esd_mode ---make esdcheck enable + * + */ +static DEVICE_ATTR(fts_esd_mode, S_IRUGO | S_IWUSR, fts_esdcheck_show, fts_esdcheck_store); + +static struct attribute *fts_esd_mode_attrs[] = { + + &dev_attr_fts_esd_mode.attr, + NULL, +}; + +static struct attribute_group fts_esd_group = { + .attrs = fts_esd_mode_attrs, +}; + +/***************************************************************************** +* Name: fts_create_gesture_sysfs +* Brief: +* Input: +* Output: +* Return: 0-success or others-error +*****************************************************************************/ +int fts_create_esd_sysfs(struct i2c_client *client) +{ + int ret = 0; + + ret = sysfs_create_group(&client->dev.kobj, &fts_esd_group); + if (ret != 0) { + FTS_ERROR("fts_create_esd_sysfs(sysfs) create failed!"); + sysfs_remove_group(&client->dev.kobj, &fts_esd_group); + return ret; + } + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_init +* Brief: Init and create a queue work to check esd +* Input: +* Output: +* Return: < 0: Fail to create esd check queue +*****************************************************************************/ +int fts_esdcheck_init(struct fts_ts_data *ts_data) +{ + FTS_FUNC_ENTER(); + + if (ts_data->ts_workqueue) { + INIT_DELAYED_WORK(&ts_data->esdcheck_work, esdcheck_func); + } else { + FTS_ERROR("fts workqueue is NULL, can't run esd check function"); + return -EINVAL; + } + + memset((u8 *)&fts_esdcheck_data, 0, sizeof(struct fts_esdcheck_st)); + + fts_esdcheck_data.mode = ENABLE; + fts_esdcheck_switch(ENABLE); + fts_create_esd_sysfs(ts_data->client); + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_exit +* Brief: When FTS TP driver is removed, then call this function to destory work queue +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_exit(struct fts_ts_data *ts_data) +{ + FTS_FUNC_ENTER(); + + FTS_FUNC_EXIT(); + return 0; +} +#endif /* FTS_ESDCHECK_EN */ diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_ex_fun.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_ex_fun.c new file mode 100644 index 000000000000..9f32a876cc75 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_ex_fun.c @@ -0,0 +1,1040 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2020 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: Focaltech_ex_fun.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +/*create apk debug channel*/ +#define PROC_UPGRADE 0 +#define PROC_READ_REGISTER 1 +#define PROC_WRITE_REGISTER 2 +#define PROC_AUTOCLB 4 +#define PROC_UPGRADE_INFO 5 +#define PROC_WRITE_DATA 6 +#define PROC_READ_DATA 7 +#define PROC_SET_TEST_FLAG 8 +#define PROC_SET_SLAVE_ADDR 10 +#define PROC_HW_RESET 11 +#define PROC_NAME "ftxxxx-debug" +#define PROC_WRITE_BUF_SIZE 256 +#define PROC_READ_BUF_SIZE 256 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ +enum { + RWREG_OP_READ = 0, + RWREG_OP_WRITE = 1, +}; +static struct rwreg_operation_t { + int type; /* 0: read, 1: write */ + int reg; /* register */ + int len; /* read/write length */ + int val; /* length = 1; read: return value, write: op return */ + int res; /* 0: success, otherwise: fail */ + char *opbuf; /* length >= 1, read return value, write: op return */ +} rw_op; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) +/************************************************************************ +* Name: fts_debug_write +* Brief:interface of write proc +* Input: file point, data buf, data len, no use +* Output: no +* Return: data len +***********************************************************************/ +static ssize_t fts_debug_write(struct file *filp, const char __user *buff, size_t count, loff_t *ppos) +{ + u8 writebuf[PROC_WRITE_BUF_SIZE] = { 0 }; + int buflen = count; + int writelen = 0; + int ret = 0; + char tmp[25]; + struct fts_ts_data *ts_data = fts_data; + struct i2c_client *client = ts_data->client; + + if ((count == 0) || (count > PROC_WRITE_BUF_SIZE)) { + FTS_ERROR("apk proc wirte count(%d) fail", (int)count); + return -EINVAL; + } + + if (copy_from_user(&writebuf, buff, count)) { + FTS_ERROR("[APK]: copy from user error!!"); + return -EFAULT; + } + + ts_data->proc_opmode = writebuf[0]; + + switch (ts_data->proc_opmode) { + case PROC_SET_TEST_FLAG: + FTS_INFO("[APK]: PROC_SET_TEST_FLAG = %x!!", writebuf[1]); +#if FTS_ESDCHECK_EN + if (writebuf[1] == 0) { + fts_esdcheck_switch(ENABLE); + } else { + fts_esdcheck_switch(DISABLE); + } +#endif + break; + case PROC_READ_REGISTER: + writelen = 1; + ret = fts_i2c_write(client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = fts_i2c_write(client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + break; + case PROC_SET_SLAVE_ADDR: +#if (FTS_CHIP_TYPE == _FT8201) + FTS_INFO("Original i2c addr 0x%x", client->addr << 1); + if (writebuf[1] != client->addr) { + client->addr = writebuf[1]; + FTS_INFO("Change i2c addr 0x%x to 0x%x", client->addr << 1, writebuf[1] << 1); + } +#endif + break; + + case PROC_HW_RESET: + snprintf(tmp, PAGE_SIZE, "%s", writebuf + 1); + tmp[buflen - 1] = '\0'; + if (strncmp(tmp, "focal_driver", 12) == 0) { + FTS_INFO("APK execute HW Reset"); + fts_reset_proc(1); + } + break; + + case PROC_READ_DATA: + case PROC_WRITE_DATA: + writelen = buflen - 1; + if (writelen > 0) { + ret = fts_i2c_write(client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + } + break; + default: + break; + } + + if (ret < 0) { + return ret; + } else { + return count; + } +} + +/************************************************************************ +* Name: fts_debug_read +* Brief:interface of read proc +* Input: point to the data, no use, no use, read len, no use, no use +* Output: page point to data +* Return: read char number +***********************************************************************/ +static ssize_t fts_debug_read(struct file *filp, char __user *buff, size_t count, loff_t *ppos) +{ + int ret = 0; + int num_read_chars = 0; + int readlen = 0; + u8 buf[PROC_READ_BUF_SIZE] = { 0 }; + struct fts_ts_data *ts_data = fts_data; + struct i2c_client *client = ts_data->client; + + if ((count == 0) || (count > PROC_READ_BUF_SIZE)) { + FTS_ERROR("apk proc read count(%d) fail", (int)count); + return -EINVAL; + } +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + + switch (ts_data->proc_opmode) { + case PROC_READ_REGISTER: + readlen = 1; + ret = fts_i2c_read(client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + num_read_chars = 1; + break; + case PROC_READ_DATA: + readlen = count; + ret = fts_i2c_read(client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + + num_read_chars = readlen; + break; + case PROC_WRITE_DATA: + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + + if (copy_to_user(buff, buf, num_read_chars)) { + FTS_ERROR("[APK]: copy to user error!!"); + return -EFAULT; + } + + return num_read_chars; +} + +static const struct file_operations fts_proc_fops = { + .owner = THIS_MODULE, + .read = fts_debug_read, + .write = fts_debug_write, +}; +#else +/* interface of write proc */ +/************************************************************************ +* Name: fts_debug_write +* Brief:interface of write proc +* Input: file point, data buf, data len, no use +* Output: no +* Return: data len +***********************************************************************/ +static int fts_debug_write(struct file *filp, const char __user *buff, unsigned long len, void *data) +{ + int ret = 0; + u8 writebuf[PROC_WRITE_BUF_SIZE] = { 0 }; + int buflen = len; + int writelen = 0; + char tmp[25]; + struct fts_ts_data *ts_data = fts_data; + struct i2c_client *client = ts_data->client; + + if ((count == 0) || (count > PROC_WRITE_BUF_SIZE)) { + FTS_ERROR("apk proc wirte count(%d) fail", (int)count); + return -EINVAL; + } + + if (copy_from_user(&writebuf, buff, buflen)) { + FTS_ERROR("[APK]: copy from user error!!"); + return -EFAULT; + } + + ts_data->proc_opmode = writebuf[0]; + + switch (ts_data->proc_opmode) { + case PROC_SET_TEST_FLAG: + FTS_DEBUG("[APK]: PROC_SET_TEST_FLAG = %x!!", writebuf[1]); +#if FTS_ESDCHECK_EN + if (writebuf[1] == 0) { + fts_esdcheck_switch(ENABLE); + } else { + fts_esdcheck_switch(DISABLE); + } +#endif + break; + case PROC_READ_REGISTER: + writelen = 1; + ret = fts_i2c_write(client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!n"); + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = fts_i2c_write(client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + break; + case PROC_SET_SLAVE_ADDR: +#if (FTS_CHIP_TYPE == _FT8201) + ret = client->addr; + FTS_DEBUG("Original i2c addr 0x%x ", ret << 1); + if (writebuf[1] != client->addr) { + client->addr = writebuf[1]; + FTS_DEBUG("Change i2c addr 0x%x to 0x%x", ret << 1, writebuf[1] << 1); + } +#endif + break; + + case PROC_HW_RESET: + snprintf(tmp, PAGE_SIZE, "%s", writebuf + 1); + tmp[buflen - 1] = '\0'; + if (strncmp(tmp, "focal_driver", 12) == 0) { + FTS_INFO("Begin HW Reset"); + fts_reset_proc(1); + } + break; + + case PROC_READ_DATA: + case PROC_WRITE_DATA: + writelen = len - 1; + if (writelen > 0) { + ret = fts_i2c_write(client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + } + break; + default: + break; + } + + if (ret < 0) { + return ret; + } else { + return len; + } +} + +/* interface of read proc */ +/************************************************************************ +* Name: fts_debug_read +* Brief:interface of read proc +* Input: point to the data, no use, no use, read len, no use, no use +* Output: page point to data +* Return: read char number +***********************************************************************/ +static int fts_debug_read(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + int ret = 0; + u8 buf[PROC_READ_BUF_SIZE] = { 0 }; + int num_read_chars = 0; + int readlen = 0; + struct fts_ts_data *ts_data = fts_data; + struct i2c_client *client = ts_data->client; + + if ((count == 0) || (count > PROC_READ_BUF_SIZE)) { + FTS_ERROR("apk proc read count(%d) fail", (int)count); + return -EINVAL; + } +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + switch (ts_data->proc_opmode) { + case PROC_READ_REGISTER: + readlen = 1; + ret = fts_i2c_read(client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + num_read_chars = 1; + break; + case PROC_READ_DATA: + readlen = count; + ret = fts_i2c_read(client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + + num_read_chars = readlen; + break; + case PROC_WRITE_DATA: + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + + memcpy(page, buf, num_read_chars); + return num_read_chars; +} +#endif + +/************************************************************************ +* Name: fts_create_apk_debug_channel +* Brief: create apk debug channel +* Input: i2c info +* Output: +* Return: return 0 if success +***********************************************************************/ +int fts_create_apk_debug_channel(struct fts_ts_data *ts_data) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + ts_data->proc = proc_create(PROC_NAME, 0644, NULL, &fts_proc_fops); +#else + ts_data->proc = create_proc_entry(PROC_NAME, 0666, NULL); +#endif + if (NULL == ts_data->proc) { + FTS_ERROR("create proc entry fail"); + return -ENOMEM; + } else { + FTS_INFO("Create proc entry success!"); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)) + ts_data->proc->write_proc = fts_debug_write; + ts_data->proc->read_proc = fts_debug_read; +#endif + } + + return 0; +} + +/************************************************************************ +* Name: fts_release_apk_debug_channel +* Brief: release apk debug channel +* Input: +* Output: +* Return: +***********************************************************************/ +void fts_release_apk_debug_channel(struct fts_ts_data *ts_data) +{ + + if (ts_data->proc) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + proc_remove(ts_data->proc); +#else + remove_proc_entry(PROC_NAME, NULL); +#endif + } +} + +/************************************************************************ + * sysfs interface + ***********************************************************************/ + +/* + * fts_hw_reset interface + */ +static ssize_t fts_hw_reset_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + return -EPERM; +} + +static ssize_t fts_hw_reset_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct input_dev *input_dev = fts_data->input_dev; + ssize_t count = 0; + + mutex_lock(&input_dev->mutex); + fts_reset_proc(1); + count = snprintf(buf, PAGE_SIZE, "hw reset executed\n"); + mutex_unlock(&input_dev->mutex); + + return count; +} + +/* + * fts_irq interface + */ +static ssize_t fts_irq_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct input_dev *input_dev = fts_data->input_dev; + + mutex_lock(&input_dev->mutex); + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_INFO("[EX-FUN]enable irq"); + fts_irq_enable(); + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_INFO("[EX-FUN]disable irq"); + fts_irq_disable(); + } + mutex_unlock(&input_dev->mutex); + return count; +} + +static ssize_t fts_irq_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return -EPERM; +} + +/* + * fts_tpfwver interface + */ +static ssize_t fts_tpfwver_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct fts_ts_data *ts_data = fts_data; + struct input_dev *input_dev = ts_data->input_dev; + struct i2c_client *client = ts_data->client; + ssize_t num_read_chars = 0; + u8 fwver = 0; + + mutex_lock(&input_dev->mutex); + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + if (fts_i2c_read_reg(client, FTS_REG_FW_VER, &fwver) < 0) { + num_read_chars = snprintf(buf, PAGE_SIZE, "I2c transfer error!\n"); + } +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + if ((fwver == 0xFF) || (fwver == 0x00)) + num_read_chars = snprintf(buf, PAGE_SIZE, "get tp fw version fail!\n"); + else + num_read_chars = snprintf(buf, PAGE_SIZE, "%02x\n", fwver); + + mutex_unlock(&input_dev->mutex); + return num_read_chars; +} + +static ssize_t fts_tpfwver_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + return -EPERM; +} + +/************************************************************************ +* Name: fts_tprwreg_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_tprwreg_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + int i; + struct input_dev *input_dev = fts_data->input_dev; + + mutex_lock(&input_dev->mutex); + + if (rw_op.len < 0) { + count = snprintf(buf, PAGE_SIZE, "Invalid cmd line\n"); + } else if (rw_op.len == 1) { + if (RWREG_OP_READ == rw_op.type) { + if (rw_op.res == 0) { + count = snprintf(buf, PAGE_SIZE, "Read %02X: %02X\n", rw_op.reg, rw_op.val); + } else { + count = snprintf(buf, PAGE_SIZE, "Read %02X failed, ret: %d\n", rw_op.reg, rw_op.res); + } + } else { + if (rw_op.res == 0) { + count = snprintf(buf, PAGE_SIZE, "Write %02X, %02X success\n", rw_op.reg, rw_op.val); + } else { + count = snprintf(buf, PAGE_SIZE, "Write %02X failed, ret: %d\n", rw_op.reg, rw_op.res); + } + } + } else { + if (RWREG_OP_READ == rw_op.type) { + count = snprintf(buf, PAGE_SIZE, "Read Reg: [%02X]-[%02X]\n", rw_op.reg, rw_op.reg + rw_op.len); + count += snprintf(buf + count, PAGE_SIZE, "Result: "); + if (rw_op.res) { + count += snprintf(buf + count, PAGE_SIZE, "failed, ret: %d\n", rw_op.res); + } else { + if (rw_op.opbuf) { + for (i = 0; i < rw_op.len; i++) { + count += snprintf(buf + count, PAGE_SIZE, "%02X ", rw_op.opbuf[i]); + } + count += snprintf(buf + count, PAGE_SIZE, "\n"); + } + } + } else { + ; + count = + snprintf(buf, PAGE_SIZE, "Write Reg: [%02X]-[%02X]\n", rw_op.reg, + rw_op.reg + rw_op.len - 1); + count += snprintf(buf + count, PAGE_SIZE, "Write Data: "); + if (rw_op.opbuf) { + for (i = 1; i < rw_op.len; i++) { + count += snprintf(buf + count, PAGE_SIZE, "%02X ", rw_op.opbuf[i]); + } + count += snprintf(buf + count, PAGE_SIZE, "\n"); + } + if (rw_op.res) { + count += snprintf(buf + count, PAGE_SIZE, "Result: failed, ret: %d\n", rw_op.res); + } else { + count += snprintf(buf + count, PAGE_SIZE, "Result: success\n"); + } + } + /*if (rw_op.opbuf) { + kfree(rw_op.opbuf); + rw_op.opbuf = NULL; + } */ + } + mutex_unlock(&input_dev->mutex); + + return count; +} + +static int shex_to_int(const char *hex_buf, int size) +{ + int i; + int base = 1; + int value = 0; + char single; + + for (i = size - 1; i >= 0; i--) { + single = hex_buf[i]; + + if ((single >= '0') && (single <= '9')) { + value += (single - '0') * base; + } else if ((single >= 'a') && (single <= 'z')) { + value += (single - 'a' + 10) * base; + } else if ((single >= 'A') && (single <= 'Z')) { + value += (single - 'A' + 10) * base; + } else { + return -EINVAL; + } + + base *= 16; + } + + return value; +} + +static u8 shex_to_u8(const char *hex_buf, int size) +{ + return (u8) shex_to_int(hex_buf, size); +} + +/* + * Format buf: + * [0]: '0' write, '1' read(reserved) + * [1-2]: addr, hex + * [3-4]: length, hex + * [5-6]...[n-(n+1)]: data, hex + */ +static int fts_parse_buf(const char *buf, size_t cmd_len) +{ + int length; + int i; + char *tmpbuf; + + rw_op.reg = shex_to_u8(buf + 1, 2); + length = shex_to_int(buf + 3, 2); + + if (buf[0] == '1') { + rw_op.len = length; + rw_op.type = RWREG_OP_READ; + FTS_DEBUG("read %02X, %d bytes", rw_op.reg, rw_op.len); + } else { + if (cmd_len < (length * 2 + 5)) { + pr_err("data invalided!\n"); + return -EINVAL; + } + FTS_DEBUG("write %02X, %d bytes", rw_op.reg, length); + + /* first byte is the register addr */ + rw_op.type = RWREG_OP_WRITE; + rw_op.len = length + 1; + } + + if (rw_op.len > 0) { + tmpbuf = (char *)kzalloc(rw_op.len, GFP_KERNEL); + if (!tmpbuf) { + FTS_ERROR("allocate memory failed!\n"); + return -ENOMEM; + } + + if (RWREG_OP_WRITE == rw_op.type) { + tmpbuf[0] = rw_op.reg & 0xFF; + FTS_DEBUG("write buffer: "); + for (i = 1; i < rw_op.len; i++) { + tmpbuf[i] = shex_to_u8(buf + 5 + i * 2 - 2, 2); + FTS_DEBUG("buf[%d]: %02X", i, tmpbuf[i] & 0xFF); + } + } + rw_op.opbuf = tmpbuf; + } + + return rw_op.len; +} + +/************************************************************************ +* Name: fts_tprwreg_store +* Brief: read/write register +* Input: device, device attribute, char buf, char count +* Output: print register value +* Return: char count +***********************************************************************/ +static ssize_t fts_tprwreg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct input_dev *input_dev = fts_data->input_dev; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + ssize_t cmd_length = 0; + + mutex_lock(&input_dev->mutex); + cmd_length = count - 1; + + if (rw_op.opbuf) { + kfree(rw_op.opbuf); + rw_op.opbuf = NULL; + } + + FTS_DEBUG("cmd len: %d, buf: %s", (int)cmd_length, buf); + /* compatible old ops */ + if (2 == cmd_length) { + rw_op.type = RWREG_OP_READ; + rw_op.len = 1; + + rw_op.reg = shex_to_int(buf, 2); + } else if (4 == cmd_length) { + rw_op.type = RWREG_OP_WRITE; + rw_op.len = 1; + rw_op.reg = shex_to_int(buf, 2); + rw_op.val = shex_to_int(buf + 2, 2); + + } else if (cmd_length < 5) { + FTS_ERROR("Invalid cmd buffer"); + mutex_unlock(&input_dev->mutex); + return -EINVAL; + } else { + rw_op.len = fts_parse_buf(buf, cmd_length); + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + if (rw_op.len < 0) { + FTS_ERROR("cmd buffer error!"); + + } else { + if (RWREG_OP_READ == rw_op.type) { + if (rw_op.len == 1) { + u8 reg, val; + reg = rw_op.reg & 0xFF; + rw_op.res = fts_i2c_read_reg(client, reg, &val); + rw_op.val = val; + } else { + char reg; + reg = rw_op.reg & 0xFF; + + rw_op.res = fts_i2c_read(client, ®, 1, rw_op.opbuf, rw_op.len); + } + + if (rw_op.res < 0) { + FTS_ERROR("Could not read 0x%02x", rw_op.reg); + } else { + FTS_INFO("read 0x%02x, %d bytes successful", rw_op.reg, rw_op.len); + rw_op.res = 0; + } + + } else { + if (rw_op.len == 1) { + u8 reg, val; + reg = rw_op.reg & 0xFF; + val = rw_op.val & 0xFF; + rw_op.res = fts_i2c_write_reg(client, reg, val); + } else { + rw_op.res = fts_i2c_write(client, rw_op.opbuf, rw_op.len); + } + if (rw_op.res < 0) { + FTS_ERROR("Could not write 0x%02x", rw_op.reg); + + } else { + FTS_INFO("Write 0x%02x, %d bytes successful", rw_op.val, rw_op.len); + rw_op.res = 0; + } + } + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + mutex_unlock(&input_dev->mutex); + + return count; +} + +/* + * fts_upgrade_bin interface + */ +#if 0 +static ssize_t fts_fwupgradebin_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return -EPERM; +} + +static ssize_t fts_fwupgradebin_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + char fwname[FILE_NAME_LENGTH]; + struct fts_ts_data *ts_data = fts_data; + struct input_dev *input_dev = ts_data->input_dev; + struct i2c_client *client = ts_data->client; + if ((count <= 1) || (count >= FILE_NAME_LENGTH - 32)) { + FTS_ERROR("fw bin name's length(%d) fail", (int)count); + return -EINVAL; + } + memset(fwname, 0, sizeof(fwname)); + snprintf(fwname, PAGE_SIZE, "%s", buf); + fwname[count - 1] = '\0'; + + FTS_INFO("upgrade with bin file through sysfs node"); + mutex_lock(&input_dev->mutex); + ts_data->fw_loading = 1; + fts_irq_disable(); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); +#endif + fts_upgrade_bin(client, fwname, 0); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); +#endif + fts_irq_enable(); + ts_data->fw_loading = 0; + mutex_unlock(&input_dev->mutex); + + return count; +} +#endif +/* + * fts_force_upgrade interface + */ +static ssize_t fts_fwforceupg_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return -EPERM; +} + +static ssize_t fts_fwforceupg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + char fwname[FILE_NAME_LENGTH]; + struct fts_ts_data *ts_data = fts_data; + struct input_dev *input_dev = ts_data->input_dev; +#if 0 + struct i2c_client *client = ts_data->client; +#endif + if ((count <= 1) || (count >= FILE_NAME_LENGTH - 32)) { + FTS_ERROR("fw bin name's length(%d) fail", (int)count); + return -EINVAL; + } + memset(fwname, 0, sizeof(fwname)); + snprintf(fwname, PAGE_SIZE, "%s", buf); + fwname[count - 1] = '\0'; + + FTS_INFO("force upgrade through sysfs node"); + mutex_lock(&input_dev->mutex); + ts_data->fw_loading = 1; + fts_irq_disable(); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); +#endif +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); +#endif + fts_irq_enable(); + ts_data->fw_loading = 0; + mutex_unlock(&input_dev->mutex); + + return count; +} + +/* + * fts_driver_version interface + */ +static ssize_t fts_driverversion_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + struct input_dev *input_dev = fts_data->input_dev; + + mutex_lock(&input_dev->mutex); + count = snprintf(buf, PAGE_SIZE, FTS_DRIVER_VERSION "\n"); + mutex_unlock(&input_dev->mutex); + + return count; +} + +static ssize_t fts_driverversion_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + return -EPERM; +} + +/* + * fts_dump_reg interface + */ +static ssize_t fts_dumpreg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + return -EPERM; +} + +static ssize_t fts_dumpreg_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count = 0; + u8 val = 0; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + struct input_dev *input_dev = fts_data->input_dev; + + mutex_lock(&input_dev->mutex); +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + fts_i2c_read_reg(client, FTS_REG_POWER_MODE, &val); + count += snprintf(buf + count, PAGE_SIZE, "Power Mode:0x%02x\n", val); + + fts_i2c_read_reg(client, FTS_REG_FW_VER, &val); + count += snprintf(buf + count, PAGE_SIZE, "FW Ver:0x%02x\n", val); + + fts_i2c_read_reg(client, FTS_REG_LIC_VER, &val); + count += snprintf(buf + count, PAGE_SIZE, "LCD Initcode Ver:0x%02x\n", val); + + fts_i2c_read_reg(client, FTS_REG_IDE_PARA_VER_ID, &val); + count += snprintf(buf + count, PAGE_SIZE, "Param Ver:0x%02x\n", val); + + fts_i2c_read_reg(client, FTS_REG_IDE_PARA_STATUS, &val); + count += snprintf(buf + count, PAGE_SIZE, "Param status:0x%02x\n", val); + + fts_i2c_read_reg(client, FTS_REG_VENDOR_ID, &val); + count += snprintf(buf + count, PAGE_SIZE, "Vendor ID:0x%02x\n", val); + + fts_i2c_read_reg(client, FTS_REG_LCD_BUSY_NUM, &val); + count += snprintf(buf + count, PAGE_SIZE, "LCD Busy Number:0x%02x\n", val); + + fts_i2c_read_reg(client, FTS_REG_GESTURE_EN, &val); + count += snprintf(buf + count, PAGE_SIZE, "Gesture Mode:0x%02x\n", val); + + fts_i2c_read_reg(client, FTS_REG_CHARGER_MODE_EN, &val); + count += snprintf(buf + count, PAGE_SIZE, "charge stat:0x%02x\n", val); + + fts_i2c_read_reg(client, FTS_REG_INT_CNT, &val); + count += snprintf(buf + count, PAGE_SIZE, "INT count:0x%02x\n", val); + + fts_i2c_read_reg(client, FTS_REG_FLOW_WORK_CNT, &val); + count += snprintf(buf + count, PAGE_SIZE, "ESD count:0x%02x\n", val); +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + + mutex_unlock(&input_dev->mutex); + return count; +} + +/* get the fw version example:cat fw_version */ +static DEVICE_ATTR(fts_fw_version, S_IRUGO | S_IWUSR, fts_tpfwver_show, fts_tpfwver_store); + +/* read and write register(s) +* All data type is **HEX** +* Single Byte: +* read: echo 88 > rw_reg ---read register 0x88 +* write: echo 8807 > rw_reg ---write 0x07 into register 0x88 +* Multi-bytes: +* [0:rw-flag][1-2: reg addr, hex][3-4: length, hex][5-6...n-n+1: write data, hex] +* rw-flag: 0, write; 1, read +* read: echo 10005 > rw_reg ---read reg 0x00-0x05 +* write: echo 000050102030405 > rw_reg ---write reg 0x00-0x05 as 01,02,03,04,05 +* Get result: +* cat rw_reg +*/ +static DEVICE_ATTR(fts_rw_reg, S_IRUGO | S_IWUSR, fts_tprwreg_show, fts_tprwreg_store); +/* upgrade from fw bin file example:echo "*.bin" > fts_upgrade_bin */ +#if 0 +static DEVICE_ATTR(fts_upgrade_bin, S_IRUGO | S_IWUSR, fts_fwupgradebin_show, fts_fwupgradebin_store); +#endif +static DEVICE_ATTR(fts_force_upgrade, S_IRUGO | S_IWUSR, fts_fwforceupg_show, fts_fwforceupg_store); +static DEVICE_ATTR(fts_driver_version, S_IRUGO | S_IWUSR, fts_driverversion_show, fts_driverversion_store); +static DEVICE_ATTR(fts_dump_reg, S_IRUGO | S_IWUSR, fts_dumpreg_show, fts_dumpreg_store); +static DEVICE_ATTR(fts_hw_reset, S_IRUGO | S_IWUSR, fts_hw_reset_show, fts_hw_reset_store); +static DEVICE_ATTR(fts_irq, S_IRUGO | S_IWUSR, fts_irq_show, fts_irq_store); + +/* add your attr in here*/ +static struct attribute *fts_attributes[] = { + + &dev_attr_fts_fw_version.attr, + &dev_attr_fts_rw_reg.attr, + &dev_attr_fts_dump_reg.attr, +#if 0 + &dev_attr_fts_upgrade_bin.attr, +#endif + &dev_attr_fts_force_upgrade.attr, + &dev_attr_fts_driver_version.attr, + &dev_attr_fts_hw_reset.attr, + &dev_attr_fts_irq.attr, + NULL +}; + +static struct attribute_group fts_attribute_group = { + .attrs = fts_attributes +}; + +/************************************************************************ +* Name: fts_create_sysfs +* Brief: create sysfs interface +* Input: +* Output: +* Return: return 0 if success +***********************************************************************/ +int fts_create_sysfs(struct i2c_client *client) +{ + int ret = 0; + + ret = sysfs_create_group(&client->dev.kobj, &fts_attribute_group); + if (ret) { + FTS_ERROR("[EX]: sysfs_create_group() failed!!"); + sysfs_remove_group(&client->dev.kobj, &fts_attribute_group); + return -ENOMEM; + } else { + FTS_INFO("[EX]: sysfs_create_group() succeeded!!"); + } + + return ret; +} + +/************************************************************************ +* Name: fts_remove_sysfs +* Brief: remove sysfs interface +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_remove_sysfs(struct i2c_client *client) +{ + sysfs_remove_group(&client->dev.kobj, &fts_attribute_group); + return 0; +} diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_ex_mode.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_ex_mode.c new file mode 100644 index 000000000000..a34a97725973 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_ex_mode.c @@ -0,0 +1,381 @@ +/* + * + * FocalTech ftxxxx TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2020 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_ex_mode.c +* +* Author: Liu WeiGuang +* +* Created: 2016-08-31 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* 2.Private constant and macro definitions using #define +*****************************************************************************/ + +/***************************************************************************** +* 3.Private enumerations, structures and unions using typedef +*****************************************************************************/ +struct fts_mode_flag { + int fts_glove_mode_flag; + int fts_cover_mode_flag; + int fts_charger_mode_flag; +}; + +struct fts_mode_flag g_fts_mode_flag; + +/***************************************************************************** +* 4.Static variables +*****************************************************************************/ + +/***************************************************************************** +* 5.Global variable or extern global variabls/functions +*****************************************************************************/ +int fts_enter_glove_mode(struct i2c_client *client, int mode); +int fts_enter_cover_mode(struct i2c_client *client, int mode); +int fts_enter_charger_mode(struct i2c_client *client, int mode); + +/***************************************************************************** +* 6.Static function prototypes +*******************************************************************************/ + +#if FTS_GLOVE_EN +static ssize_t fts_touch_glove_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + u8 val; + struct input_dev *input_dev = fts_data->input_dev; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + mutex_lock(&input_dev->mutex); + fts_i2c_read_reg(client, FTS_REG_GLOVE_MODE_EN, &val); + count = snprintf(buf, PAGE_SIZE, "Glove Mode: %s\n", g_fts_mode_flag.fts_glove_mode_flag ? "On" : "Off"); + count += snprintf(buf + count, PAGE_SIZE, "Glove Reg(0xC0) = %d\n", val); + mutex_unlock(&input_dev->mutex); + + return count; +} + +static ssize_t fts_touch_glove_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + struct fts_ts_data *ts_data = fts_data; + struct i2c_client *client; + + client = ts_data->client; + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!g_fts_mode_flag.fts_glove_mode_flag) { + FTS_INFO("[Mode]enter glove mode"); + ret = fts_enter_glove_mode(client, true); + if (ret >= 0) { + g_fts_mode_flag.fts_glove_mode_flag = true; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (g_fts_mode_flag.fts_glove_mode_flag) { + FTS_INFO("[Mode]exit glove mode"); + ret = fts_enter_glove_mode(client, false); + if (ret >= 0) { + g_fts_mode_flag.fts_glove_mode_flag = false; + } + } + } + FTS_INFO("[Mode]glove mode status: %d", g_fts_mode_flag.fts_glove_mode_flag); + return count; +} + +/************************************************************************ +* Name: fts_enter_glove_mode +* Brief: change glove mode +* Input: glove mode +* Output: no +* Return: success >=0, otherwise failed +***********************************************************************/ +int fts_enter_glove_mode(struct i2c_client *client, int mode) +{ + int ret = 0; + static u8 buf_addr[2] = { 0 }; + static u8 buf_value[2] = { 0 }; + buf_addr[0] = FTS_REG_GLOVE_MODE_EN; /* glove control */ + + if (mode) + buf_value[0] = 0x01; + else + buf_value[0] = 0x00; + + ret = fts_i2c_write_reg(client, buf_addr[0], buf_value[0]); + if (ret < 0) { + FTS_ERROR("[Mode]fts_enter_glove_mode write value fail"); + } + + return ret; + +} + +/* read and write glove mode +* read example: cat fts_touch_glove_mode---read glove mode +* write example:echo 01 > fts_touch_glove_mode ---write glove mode to 01 +* +*/ +static DEVICE_ATTR(fts_glove_mode, S_IRUGO | S_IWUSR, fts_touch_glove_show, fts_touch_glove_store); + +#endif + +#if FTS_COVER_EN +static ssize_t fts_touch_cover_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + u8 val; + struct input_dev *input_dev = fts_data->input_dev; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + mutex_lock(&input_dev->mutex); + fts_i2c_read_reg(client, FTS_REG_COVER_MODE_EN, &val); + count = snprintf(buf, PAGE_SIZE, "Cover Mode: %s\n", g_fts_mode_flag.fts_cover_mode_flag ? "On" : "Off"); + count += snprintf(buf + count, PAGE_SIZE, "Cover Reg(0xC1) = %d\n", val); + mutex_unlock(&input_dev->mutex); + + return count; +} + +static ssize_t fts_touch_cover_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + struct fts_ts_data *ts_data = fts_data; + struct i2c_client *client; + + client = ts_data->client; + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!g_fts_mode_flag.fts_cover_mode_flag) { + FTS_INFO("[Mode]enter cover mode"); + ret = fts_enter_cover_mode(client, true); + if (ret >= 0) { + g_fts_mode_flag.fts_cover_mode_flag = true; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (g_fts_mode_flag.fts_cover_mode_flag) { + FTS_INFO("[Mode]exit cover mode"); + ret = fts_enter_cover_mode(client, false); + if (ret >= 0) { + g_fts_mode_flag.fts_cover_mode_flag = false; + } + } + } + FTS_INFO("[Mode]cover mode status: %d", g_fts_mode_flag.fts_cover_mode_flag); + return count; +} + +/************************************************************************ +* Name: fts_enter_cover_mode +* Brief: change cover mode +* Input: cover mode +* Output: no +* Return: success >=0, otherwise failed +***********************************************************************/ +int fts_enter_cover_mode(struct i2c_client *client, int mode) +{ + int ret = 0; + static u8 buf_addr[2] = { 0 }; + static u8 buf_value[2] = { 0 }; + buf_addr[0] = FTS_REG_COVER_MODE_EN; /* cover control */ + + if (mode) + buf_value[0] = 0x01; + else + buf_value[0] = 0x00; + + ret = fts_i2c_write_reg(client, buf_addr[0], buf_value[0]); + if (ret < 0) { + FTS_ERROR("[Mode] fts_enter_cover_mode write value fail \n"); + } + + return ret; + +} + +/* read and write cover mode +* read example: cat fts_touch_cover_mode---read cover mode +* write example:echo 01 > fts_touch_cover_mode ---write cover mode to 01 +* +*/ +static DEVICE_ATTR(fts_cover_mode, S_IRUGO | S_IWUSR, fts_touch_cover_show, fts_touch_cover_store); + +#endif + +#if FTS_CHARGER_EN +static ssize_t fts_touch_charger_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + u8 val; + struct input_dev *input_dev = fts_data->input_dev; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + mutex_lock(&input_dev->mutex); + fts_i2c_read_reg(client, FTS_REG_CHARGER_MODE_EN, &val); + count = snprintf(buf, PAGE_SIZE, "Charge Mode: %s\n", g_fts_mode_flag.fts_charger_mode_flag ? "On" : "Off"); + count += snprintf(buf + count, PAGE_SIZE, "Charge Reg(0x8B) = %d\n", val); + mutex_unlock(&input_dev->mutex); + + return count; +} + +static ssize_t fts_touch_charger_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + struct fts_ts_data *ts_data = fts_data; + struct i2c_client *client; + + client = ts_data->client; + + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!g_fts_mode_flag.fts_charger_mode_flag) { + FTS_INFO("[Mode]enter charger mode"); + ret = fts_enter_charger_mode(client, true); + if (ret >= 0) { + g_fts_mode_flag.fts_charger_mode_flag = true; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (g_fts_mode_flag.fts_charger_mode_flag) { + FTS_INFO("[Mode]exit charger mode"); + ret = fts_enter_charger_mode(client, false); + if (ret >= 0) { + g_fts_mode_flag.fts_charger_mode_flag = false; + } + } + } + FTS_INFO("[Mode]charger mode status: %d", g_fts_mode_flag.fts_charger_mode_flag); + return count; +} + +/************************************************************************ +* Name: fts_enter_charger_mode +* Brief: change charger mode +* Input: charger mode +* Output: no +* Return: success >=0, otherwise failed +***********************************************************************/ +int fts_enter_charger_mode(struct i2c_client *client, int mode) +{ + int ret = 0; + static u8 buf_addr[2] = { 0 }; + static u8 buf_value[2] = { 0 }; + buf_addr[0] = FTS_REG_CHARGER_MODE_EN; /* charger control */ + + if (mode) + buf_value[0] = 0x01; + else + buf_value[0] = 0x00; + + ret = fts_i2c_write_reg(client, buf_addr[0], buf_value[0]); + if (ret < 0) { + FTS_DEBUG("[Mode]fts_enter_charger_mode write value fail"); + } + + return ret; + +} + +/* read and write charger mode +* read example: cat fts_touch_charger_mode---read charger mode +* write example:echo 01 > fts_touch_charger_mode ---write charger mode to 01 +* +*/ +static DEVICE_ATTR(fts_charger_mode, S_IRUGO | S_IWUSR, fts_touch_charger_show, fts_touch_charger_store); + +#endif + +static struct attribute *fts_touch_mode_attrs[] = { +#if FTS_GLOVE_EN + &dev_attr_fts_glove_mode.attr, +#endif + +#if FTS_COVER_EN + &dev_attr_fts_cover_mode.attr, +#endif + +#if FTS_CHARGER_EN + &dev_attr_fts_charger_mode.attr, +#endif + + NULL, +}; + +static struct attribute_group fts_touch_mode_group = { + .attrs = fts_touch_mode_attrs, +}; + +int fts_ex_mode_init(struct i2c_client *client) +{ + int err = 0; + + g_fts_mode_flag.fts_glove_mode_flag = false; + g_fts_mode_flag.fts_cover_mode_flag = false; + g_fts_mode_flag.fts_charger_mode_flag = false; + + err = sysfs_create_group(&client->dev.kobj, &fts_touch_mode_group); + if (0 != err) { + FTS_ERROR("[Mode]create sysfs failed."); + sysfs_remove_group(&client->dev.kobj, &fts_touch_mode_group); + return -EIO; + } else { + FTS_DEBUG("[Mode]create sysfs succeeded"); + } + + return err; + +} + +int fts_ex_mode_exit(struct i2c_client *client) +{ + sysfs_remove_group(&client->dev.kobj, &fts_touch_mode_group); + return 0; +} + +int fts_ex_mode_recovery(struct i2c_client *client) +{ + int ret = 0; +#if FTS_GLOVE_EN + if (g_fts_mode_flag.fts_glove_mode_flag) + ret = fts_enter_glove_mode(client, true); +#endif + +#if FTS_COVER_EN + if (g_fts_mode_flag.fts_cover_mode_flag) + ret = fts_enter_cover_mode(client, true); +#endif + +#if FTS_CHARGER_EN + if (g_fts_mode_flag.fts_charger_mode_flag) + ret = fts_enter_charger_mode(client, true); +#endif + + return ret; +} diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash.c new file mode 100644 index 000000000000..0e7859d344a5 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash.c @@ -0,0 +1,1783 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2020 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_flash.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" +#include "focaltech_flash.h" +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +/* Upgrade FW/PRAMBOOT/LCD CFG */ + +#if FTS_AUTO_UPGRADE_EN +u8 fw_file[] = { + +#include FTS_UPGRADE_FW_FILE +}; +u8 fw_file2[] = { +#include FTS_UPGRADE_FW2_FILE +}; + +u8 fw_file3[] = { +#include FTS_UPGRADE_FW3_FILE +}; + +struct upgrade_fw fw_list[] = { + {FTS_VENDOR_ID, fw_file, sizeof(fw_file)} + , + {FTS_VENDOR_ID2, fw_file2, sizeof(fw_file2)} + , + {FTS_VENDOR_ID3, fw_file3, sizeof(fw_file3)} + , +}; +struct upgrade_func *upgrade_func_list[] = { + &upgrade_func_ft8719, +}; +#endif +struct fts_upgrade *fwupgrade; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static u16 fts_pram_ecc_calc_host(u8 *pbuf, u16 length) +{ + u16 ecc = 0; + u16 i = 0; + u16 j = 0; + + for (i = 0; i < length; i += 2) { + ecc ^= ((pbuf[i] << 8) | (pbuf[i + 1])); + for (j = 0; j < 16; j++) { + if (ecc & 0x01) + ecc = (u16) ((ecc >> 1) ^ AL2_FCS_COEF); + else + ecc >>= 1; + } + } + + return ecc; +} + +/************************************************************************ + * fts_pram_ecc_cal - Calculate and get pramboot ecc + * + * return pramboot ecc of tp if success, otherwise return error code + ***********************************************************************/ +static int fts_pram_ecc_cal_algo(struct i2c_client *client, u32 start_addr, u32 ecc_length) +{ + int ret = 0; + int i = 0; + int ecc = 0; + u8 val[2] = { 0 }; + u8 cmd[FTS_ROMBOOT_CMD_ECC_NEW_LEN] = { 0 }; + + FTS_INFO("read out pramboot checksum"); + cmd[0] = FTS_ROMBOOT_CMD_ECC; + cmd[1] = BYTE_OFF_16(start_addr); + cmd[2] = BYTE_OFF_8(start_addr); + cmd[3] = BYTE_OFF_0(start_addr); + cmd[4] = BYTE_OFF_16(ecc_length); + cmd[5] = BYTE_OFF_8(ecc_length); + cmd[6] = BYTE_OFF_0(ecc_length); + ret = fts_i2c_write(client, cmd, FTS_ROMBOOT_CMD_ECC_NEW_LEN); + if (ret < 0) { + FTS_ERROR("write pramboot ecc cal cmd fail"); + return ret; + } + + cmd[0] = FTS_ROMBOOT_CMD_ECC_FINISH; + for (i = 0; i < 100; i++) { + msleep(1); + ret = fts_i2c_read(client, cmd, 1, val, 1); + if (ret < 0) { + FTS_ERROR("ecc_finish read cmd fail"); + return ret; + } + if (0 == val[0]) + break; + } + if (i >= 100) { + FTS_ERROR("wait ecc finish fail"); + return -EIO; + } + + cmd[0] = FTS_CMD_READ_ECC; + ret = fts_i2c_read(client, cmd, 1, val, 2); + if (ret < 0) { + FTS_ERROR("read pramboot ecc fail"); + return ret; + } + + ecc = ((u16) (val[0] << 8) + val[1]) & 0x0000FFFF; + return ecc; +} + +static int fts_pram_ecc_cal_xor(struct i2c_client *client) +{ + int ret = 0; + u8 reg_val = 0; + + FTS_INFO("read out pramboot checksum"); + + ret = fts_i2c_read_reg(client, FTS_ROMBOOT_CMD_ECC, ®_val); + if (ret < 0) { + FTS_ERROR("read pramboot ecc fail"); + return ret; + } + + return (int)reg_val; +} + +static int fts_pram_ecc_cal(struct i2c_client *client, u32 saddr, u32 len) +{ + if ((NULL == fwupgrade) && (NULL == fwupgrade->func)) { + FTS_ERROR("fwupgrade/func is null"); + return -EINVAL; + } + + if (fwupgrade->func->newmode) { + return fts_pram_ecc_cal_algo(client, saddr, len); + } else { + return fts_pram_ecc_cal_xor(client); + } +} + +/************************************************************************ + * fts_pram_write_buf - write pramboot data and calculate ecc + * + * return pramboot ecc of host if success, otherwise return error code + ***********************************************************************/ +static int fts_pram_write_buf(struct i2c_client *client, u8 *buf, u32 len) +{ + int ret = 0; + u32 i = 0; + u32 j = 0; + u32 offset = 0; + u32 remainder = 0; + u32 packet_number; + u32 packet_len = 0; + u8 packet_buf[FTS_FLASH_PACKET_LENGTH + FTS_CMD_WRITE_LEN] = { 0 }; + u8 ecc_tmp = 0; + int ecc_in_host = 0; + + FTS_INFO("write pramboot to pram"); + if ((NULL == fwupgrade) && (NULL == fwupgrade->func)) { + FTS_ERROR("fwupgrade/func is null"); + return -EINVAL; + } + + if (NULL == buf) { + FTS_ERROR("pramboot buf is null"); + return -EINVAL; + } + + FTS_INFO("pramboot len=%d", len); + if ((len < PRAMBOOT_MIN_SIZE) || (len > PRAMBOOT_MAX_SIZE)) { + FTS_ERROR("pramboot length(%d) fail", len); + return -EINVAL; + } + + packet_number = len / FTS_FLASH_PACKET_LENGTH; + remainder = len % FTS_FLASH_PACKET_LENGTH; + if (remainder > 0) + packet_number++; + packet_len = FTS_FLASH_PACKET_LENGTH; + + packet_buf[0] = FTS_ROMBOOT_CMD_WRITE; + for (i = 0; i < packet_number; i++) { + offset = i * FTS_FLASH_PACKET_LENGTH; + packet_buf[1] = BYTE_OFF_16(offset); + packet_buf[2] = BYTE_OFF_8(offset); + packet_buf[3] = BYTE_OFF_0(offset); + + /* last packet */ + if ((i == (packet_number - 1)) && remainder) + packet_len = remainder; + + packet_buf[4] = BYTE_OFF_8(packet_len); + packet_buf[5] = BYTE_OFF_0(packet_len); + + for (j = 0; j < packet_len; j++) { + packet_buf[FTS_CMD_WRITE_LEN + j] = buf[offset + j]; + if (!fwupgrade->func->newmode) { + ecc_tmp ^= packet_buf[FTS_CMD_WRITE_LEN + j]; + } + } + + ret = fts_i2c_write(client, packet_buf, packet_len + FTS_CMD_WRITE_LEN); + if (ret < 0) { + FTS_ERROR("pramboot write data(%d) fail", i); + return ret; + } + } + + if (fwupgrade->func->newmode) { + ecc_in_host = (int)fts_pram_ecc_calc_host(buf, len); + } else { + ecc_in_host = (int)ecc_tmp; + } + + return ecc_in_host; +} + +/************************************************************************ + * fts_pram_start - remap to start pramboot + * + * return 0 if success, otherwise return error code + ***********************************************************************/ +static int fts_pram_start(struct i2c_client *client) +{ + u8 cmd = FTS_ROMBOOT_CMD_START_APP; + int ret = 0; + + FTS_INFO("remap to start pramboot"); + + ret = fts_i2c_write(client, &cmd, 1); + if (ret < 0) { + FTS_ERROR("write start pram cmd fail"); + return ret; + } + msleep(FTS_DELAY_PRAMBOOT_START); + + return 0; +} + +/************************************************************************ + * fts_pram_write_remap - write pramboot to pram and start pramboot + * + * return 0 if success, otherwise return error code +***********************************************************************/ +static int fts_pram_write_remap(struct i2c_client *client) +{ + int ret = 0; + int ecc_in_host = 0; + int ecc_in_tp = 0; + u8 *pb_buf = NULL; + u32 pb_len = 0; + struct fts_upgrade *upg = fwupgrade; + + FTS_INFO("write pram and remap"); + + if (!upg || !upg->func || !upg->func->pramboot) { + FTS_ERROR("upgrade/pramboot is null"); + return -EINVAL; + } + + if (upg->func->pb_length < FTS_MIN_LEN) { + FTS_ERROR("pramboot length(%x) fail", upg->func->pb_length); + return -EINVAL; + } + + pb_buf = upg->func->pramboot; + pb_len = upg->func->pb_length; + + /* write pramboot to pram */ + ecc_in_host = fts_pram_write_buf(client, pb_buf, pb_len); + if (ecc_in_host < 0) { + FTS_ERROR("write pramboot fail"); + return ecc_in_host; + } + + /* read out checksum */ + ecc_in_tp = fts_pram_ecc_cal(client, 0, pb_len); + if (ecc_in_tp < 0) { + FTS_ERROR("read pramboot ecc fail"); + return ecc_in_tp; + } + + FTS_INFO("pram ecc in tp:%x, host:%x", ecc_in_tp, ecc_in_host); + /* pramboot checksum != fw checksum, upgrade fail */ + if (ecc_in_host != ecc_in_tp) { + FTS_ERROR("pramboot ecc check fail"); + return -EIO; + } + + /*start pram */ + ret = fts_pram_start(client); + if (ret < 0) { + FTS_ERROR("pram start fail"); + return ret; + } + + return 0; +} + +/************************************************************************ + * fts_pram_init - initialize pramboot + * + * return 0 if success, otherwise return error code +***********************************************************************/ +static int fts_pram_init(struct i2c_client *client) +{ + int ret = 0; + u8 reg_val = 0; + u8 wbuf[3] = { 0 }; + + FTS_INFO("pramboot initialization"); + + /* read flash ID */ + wbuf[0] = FTS_CMD_FLASH_TYPE; + ret = fts_i2c_read(client, wbuf, 1, ®_val, 1); + if (ret < 0) { + FTS_ERROR("read flash type fail"); + return ret; + } + + /* set flash clk */ + wbuf[0] = FTS_CMD_FLASH_TYPE; + wbuf[1] = reg_val; + wbuf[2] = 0x00; + ret = fts_i2c_write(client, wbuf, 3); + if (ret < 0) { + FTS_ERROR("write flash type fail"); + return ret; + } + + return 0; +} + +/************************************************************************ +* Name: fts_pram_write_init +* Brief: wirte pramboot to pram and initialize +* Input: +* Output: +* Return: return 0 if success, otherwise return error code +***********************************************************************/ +int fts_pram_write_init(struct i2c_client *client) +{ + int ret = 0; + bool state = 0; + enum FW_STATUS status = FTS_RUN_IN_ERROR; + struct fts_upgrade *upg = fwupgrade; + + FTS_INFO("**********pram write and init**********"); + if ((NULL == upg) || (NULL == upg->func)) { + FTS_ERROR("upgrade/func is null"); + return -EINVAL; + } + + if (!upg->func->pramboot_supported) { + FTS_ERROR("ic not support pram"); + return -EINVAL; + } + + FTS_DEBUG("check whether tp is in romboot or not "); + /* need reset to romboot when non-romboot state */ + ret = fts_fwupg_get_boot_state(client, &status); + if (status != FTS_RUN_IN_ROM) { + if (FTS_RUN_IN_PRAM == status) { + FTS_INFO("tp is in pramboot, need send reset cmd before upgrade"); + ret = fts_pram_init(client); + if (ret < 0) { + FTS_ERROR("pramboot(before) init fail"); + return ret; + } + } + + FTS_INFO("tp isn't in romboot, need send reset to romboot"); + ret = fts_fwupg_reset_to_romboot(client); + if (ret < 0) { + FTS_ERROR("reset to romboot fail"); + return ret; + } + } + + /* check the length of the pramboot */ + ret = fts_pram_write_remap(client); + if (ret < 0) { + FTS_ERROR("pram write fail, ret=%d", ret); + return ret; + } + + FTS_DEBUG("after write pramboot, confirm run in pramboot"); + state = fts_fwupg_check_state(client, FTS_RUN_IN_PRAM); + if (!state) { + FTS_ERROR("not in pramboot"); + return -EIO; + } + + ret = fts_pram_init(client); + if (ret < 0) { + FTS_ERROR("pramboot init fail"); + return ret; + } + + return 0; +} + +/************************************************************************ +* Name: fts_fwupg_check_fw_valid +* Brief: check fw in tp is valid or not +* Input: +* Output: +* Return: return true if fw is valid, otherwise return false +***********************************************************************/ +bool fts_fwupg_check_fw_valid(struct i2c_client *client) +{ + int ret = 0; + + ret = fts_wait_tp_to_valid(client); + if (ret < 0) { + FTS_INFO("tp fw invaild"); + return false; + } + + FTS_INFO("tp fw vaild"); + return true; +} + +/************************************************************************ +* Name: fts_fwupg_get_boot_state +* Brief: read boot id(rom/pram/bootloader), confirm boot environment +* Input: +* Output: +* Return: return 0 if success, otherwise return error code +***********************************************************************/ +int fts_fwupg_get_boot_state(struct i2c_client *client, enum FW_STATUS *fw_sts) +{ + int ret = 0; + u8 cmd[4] = { 0 }; + u32 cmd_len = 0; + u8 val[2] = { 0 }; + struct ft_chip_t ids = fts_data->ic_info.ids; + struct fts_upgrade *upg = fwupgrade; + + FTS_INFO("**********read boot id**********"); + if ((NULL == fw_sts) || (NULL == upg) || (NULL == upg->func)) { + FTS_ERROR("upgrade/func/fw_sts is null"); + return -EINVAL; + } + + if (upg->func->hid_supported) + fts_i2c_hid2std(client); + + cmd[0] = FTS_CMD_START1; + cmd[1] = FTS_CMD_START2; + ret = fts_i2c_write(client, cmd, 2); + if (ret < 0) { + FTS_ERROR("write 55 aa cmd fail"); + return ret; + } + + msleep(FTS_CMD_START_DELAY); + cmd[0] = FTS_CMD_READ_ID; + cmd[1] = cmd[2] = cmd[3] = 0x00; + if (fts_data->ic_info.is_incell) + cmd_len = FTS_CMD_READ_ID_LEN_INCELL; + else + cmd_len = FTS_CMD_READ_ID_LEN; + ret = fts_i2c_read(client, cmd, cmd_len, val, 2); + if (ret < 0) { + FTS_ERROR("write 90 cmd fail"); + return ret; + } + + FTS_INFO("read boot id:0x%02x%02x", val[0], val[1]); + if ((val[0] == ids.rom_idh) && (val[1] == ids.rom_idl)) { + FTS_INFO("tp run in romboot"); + *fw_sts = FTS_RUN_IN_ROM; + } else if ((val[0] == ids.pb_idh) && (val[1] == ids.pb_idl)) { + FTS_INFO("tp run in pramboot"); + *fw_sts = FTS_RUN_IN_PRAM; + } else if ((val[0] == ids.bl_idh) && (val[1] == ids.bl_idl)) { + FTS_INFO("tp run in bootloader"); + *fw_sts = FTS_RUN_IN_BOOTLOADER; + } + + return 0; +} + +/************************************************************************ +* Name: fts_fwupg_check_state +* Brief: confirm tp run in romboot/pramboot/bootloader +* Input: +* Output: +* Return: return true if state is match, otherwise return false +***********************************************************************/ +bool fts_fwupg_check_state(struct i2c_client *client, enum FW_STATUS rstate) +{ + int ret = 0; + int i = 0; + enum FW_STATUS cstate = FTS_RUN_IN_ERROR; + + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + ret = fts_fwupg_get_boot_state(client, &cstate); + /* FTS_DEBUG("fw state=%d, retries=%d", cstate, i); */ + if (cstate == rstate) + return true; + msleep(FTS_DELAY_READ_ID); + } + + return false; +} + +/************************************************************************ +* Name: fts_fwupg_reset_in_boot +* Brief: RST CMD(07), reset to romboot(bootloader) in boot environment +* Input: +* Output: +* Return: return 0 if success, otherwise return error code +***********************************************************************/ +int fts_fwupg_reset_in_boot(struct i2c_client *client) +{ + int ret = 0; + u8 cmd = FTS_CMD_RESET; + + FTS_INFO("reset in boot environment"); + ret = fts_i2c_write(client, &cmd, 1); + if (ret < 0) { + FTS_ERROR("pram/rom/bootloader reset cmd write fail"); + return ret; + } + + msleep(FTS_DELAY_UPGRADE_RESET); + return 0; +} + +/************************************************************************ +* Name: fts_fwupg_reset_to_boot +* Brief: reset to boot environment +* Input: +* Output: +* Return: return 0 if success, otherwise return error code +***********************************************************************/ +int fts_fwupg_reset_to_boot(struct i2c_client *client) +{ + int ret = 0; + + FTS_INFO("send 0xAA and 0x55 to FW, reset to boot environment"); + + ret = fts_i2c_write_reg(client, FTS_REG_UPGRADE, FTS_UPGRADE_AA); + if (ret < 0) { + FTS_ERROR("write FC=0xAA fail"); + return ret; + } + msleep(FTS_DELAY_FC_AA); + + ret = fts_i2c_write_reg(client, FTS_REG_UPGRADE, FTS_UPGRADE_55); + if (ret < 0) { + FTS_ERROR("write FC=0x55 fail"); + return ret; + } + + msleep(FTS_DELAY_UPGRADE_RESET); + return 0; +} + +/************************************************************************ +* Name: fts_fwupg_reset_to_romboot +* Brief: reset to romboot, to load pramboot +* Input: +* Output: +* Return: return 0 if success, otherwise return error code +***********************************************************************/ +int fts_fwupg_reset_to_romboot(struct i2c_client *client) +{ + int ret = 0; + int i = 0; + u8 cmd = FTS_CMD_RESET; + enum FW_STATUS state = FTS_RUN_IN_ERROR; + + ret = fts_i2c_write(client, &cmd, 1); + if (ret < 0) { + FTS_ERROR("pram/rom/bootloader reset cmd write fail"); + return ret; + } + mdelay(10); + + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + ret = fts_fwupg_get_boot_state(client, &state); + if (FTS_RUN_IN_ROM == state) + break; + mdelay(5); + } + if (i >= FTS_UPGRADE_LOOP) { + FTS_ERROR("reset to romboot fail"); + return -EIO; + } + + return 0; +} + +/************************************************************************ +* Name: fts_fwupg_enter_into_boot +* Brief: enter into boot environment, ready for upgrade +* Input: +* Output: +* Return: return 0 if success, otherwise return error code +***********************************************************************/ +int fts_fwupg_enter_into_boot(struct i2c_client *client) +{ + int ret = 0; + bool fwvalid = false; + bool state = false; + struct fts_upgrade *upg = fwupgrade; + + FTS_INFO("***********enter into pramboot/bootloader***********"); + if ((NULL == upg) || (NULL == upg->func)) { + FTS_ERROR("upgrade/func is null"); + return -EINVAL; + } + + fwvalid = fts_fwupg_check_fw_valid(client); + if (fwvalid) { + ret = fts_fwupg_reset_to_boot(client); + if (ret < 0) { + FTS_ERROR("enter into romboot/bootloader fail"); + return ret; + } + } + + if (upg->func->pramboot_supported) { + FTS_INFO("pram supported, write pramboot and init"); + /* pramboot */ + ret = fts_pram_write_init(client); + if (ret < 0) { + FTS_ERROR("pram write_init fail"); + return ret; + } + } else { + FTS_DEBUG("pram not supported, confirm in bootloader"); + /* bootloader */ + state = fts_fwupg_check_state(client, FTS_RUN_IN_BOOTLOADER); + if (!state) { + FTS_ERROR("fw not in bootloader, fail"); + return -EIO; + } + } + + return 0; +} + +/************************************************************************ + * Name: fts_fwupg_check_flash_status + * Brief: read status from tp + * Input: flash_status: correct value from tp + * retries: read retry times + * retries_delay: retry delay + * Output: + * Return: return true if flash status check pass, otherwise return false +***********************************************************************/ +static bool fts_fwupg_check_flash_status(struct i2c_client *client, u16 flash_status, int retries, int retries_delay) +{ + int ret = 0; + int i = 0; + u8 cmd = 0; + u8 val[FTS_CMD_FLASH_STATUS_LEN] = { 0 }; + u16 read_status = 0; + + for (i = 0; i < retries; i++) { + cmd = FTS_CMD_FLASH_STATUS; + ret = fts_i2c_read(client, &cmd, 1, val, FTS_CMD_FLASH_STATUS_LEN); + read_status = (((u16) val[0]) << 8) + val[1]; + if (flash_status == read_status) { + /* FTS_DEBUG("[UPGRADE]flash status ok"); */ + return true; + } + /* FTS_DEBUG("flash status fail,ok:%04x read:%04x, retries:%d", flash_status, read_status, i); */ + msleep(retries_delay); + } + + return false; +} + +/************************************************************************ + * Name: fts_fwupg_erase + * Brief: erase flash area + * Input: delay - delay after erase + * Output: + * Return: return 0 if success, otherwise return error code + ***********************************************************************/ +int fts_fwupg_erase(struct i2c_client *client, u32 delay) +{ + int ret = 0; + u8 cmd = 0; + bool flag = false; + + FTS_INFO("**********erase now**********"); + + /*send to erase flash */ + cmd = FTS_CMD_ERASE_APP; + ret = fts_i2c_write(client, &cmd, 1); + if (ret < 0) { + FTS_ERROR("erase cmd fail"); + return ret; + } + msleep(delay); + + /* read status 0xF0AA: success */ + flag = + fts_fwupg_check_flash_status(client, FTS_CMD_FLASH_STATUS_ERASE_OK, FTS_RETRIES_REASE, + FTS_RETRIES_DELAY_REASE); + if (!flag) { + FTS_ERROR("ecc flash status check fail"); + return -EIO; + } + + return 0; +} + +/************************************************************************ + * Name: fts_fwupg_ecc_cal + * Brief: calculate and get ecc from tp + * Input: saddr - start address need calculate ecc + * len - length need calculate ecc + * Output: + * Return: return data ecc of tp if success, otherwise return error code + ***********************************************************************/ +int fts_fwupg_ecc_cal(struct i2c_client *client, u32 saddr, u32 len) +{ + int ret = 0; + u32 i = 0; + u8 wbuf[FTS_CMD_ECC_CAL_LEN] = { 0 }; + u8 val[FTS_CMD_FLASH_STATUS_LEN] = { 0 }; + u32 packet_num = 0; + u32 packet_len = 0; + u32 remainder = 0; + u32 addr = 0; + u32 offset = 0; + + FTS_INFO("**********read out checksum**********"); + + /* check sum init */ + wbuf[0] = FTS_CMD_ECC_INIT; + ret = fts_i2c_write(client, wbuf, 1); + if (ret < 0) { + FTS_ERROR("ecc init cmd write fail"); + return ret; + } + + packet_num = len / FTS_MAX_LEN_ECC_CALC; + remainder = len % FTS_MAX_LEN_ECC_CALC; + if (remainder) + packet_num++; + packet_len = FTS_MAX_LEN_ECC_CALC; + FTS_INFO("ecc calc num:%d, remainder:%d", packet_num, remainder); + + /* send commond to start checksum */ + wbuf[0] = FTS_CMD_ECC_CAL; + for (i = 0; i < packet_num; i++) { + offset = FTS_MAX_LEN_ECC_CALC * i; + addr = saddr + offset; + wbuf[1] = BYTE_OFF_16(addr); + wbuf[2] = BYTE_OFF_8(addr); + wbuf[3] = BYTE_OFF_0(addr); + + if ((i == (packet_num - 1)) && remainder) + packet_len = remainder; + wbuf[4] = BYTE_OFF_8(packet_len); + wbuf[5] = BYTE_OFF_0(packet_len); + + FTS_DEBUG("ecc calc startaddr:0x%04x, len:%d", addr, packet_len); + ret = fts_i2c_write(client, wbuf, FTS_CMD_ECC_CAL_LEN); + if (ret < 0) { + FTS_ERROR("ecc calc cmd write fail"); + return ret; + } + + msleep(packet_len / 256); + + /* read status if check sum is finished */ + ret = + fts_fwupg_check_flash_status(client, FTS_CMD_FLASH_STATUS_ECC_OK, FTS_RETRIES_ECC_CAL, + FTS_RETRIES_DELAY_ECC_CAL); + if (ret < 0) { + FTS_ERROR("ecc flash status read fail"); + return ret; + } + } + + /* read out check sum */ + wbuf[0] = FTS_CMD_ECC_READ; + ret = fts_i2c_read(client, wbuf, 1, val, 1); + if (ret < 0) { + FTS_ERROR("ecc read cmd write fail"); + return ret; + } + + return val[0]; +} + +/************************************************************************ + * Name: fts_flash_write_buf + * Brief: write buf data to flash address + * Input: saddr - start address data write to flash + * buf - data buffer + * len - data length + * delay - delay after write + * Output: + * Return: return data ecc of host if success, otherwise return error code + ***********************************************************************/ +int fts_flash_write_buf(struct i2c_client *client, u32 saddr, u8 *buf, u32 len, u32 delay) +{ + int ret = 0; + u32 i = 0; + u32 j = 0; + u32 packet_number = 0; + u32 packet_len = 0; + u32 addr = 0; + u32 offset = 0; + u32 remainder = 0; + u8 packet_buf[FTS_FLASH_PACKET_LENGTH + FTS_CMD_WRITE_LEN] = { 0 }; + u8 ecc_in_host = 0; + u8 cmd = 0; + u8 val[FTS_CMD_FLASH_STATUS_LEN] = { 0 }; + u16 read_status = 0; + u16 wr_ok = 0; + + FTS_INFO("**********write data to flash**********"); + + if ((NULL == buf) || (0 == len)) { + FTS_ERROR("buf is NULL or len is 0"); + return -EINVAL; + } + + FTS_INFO("data buf start addr=0x%x, len=0x%x", saddr, len); + packet_number = len / FTS_FLASH_PACKET_LENGTH; + remainder = len % FTS_FLASH_PACKET_LENGTH; + if (remainder > 0) + packet_number++; + packet_len = FTS_FLASH_PACKET_LENGTH; + FTS_INFO("write data, num:%d remainder:%d", packet_number, remainder); + + packet_buf[0] = FTS_CMD_WRITE; + for (i = 0; i < packet_number; i++) { + offset = i * FTS_FLASH_PACKET_LENGTH; + addr = saddr + offset; + packet_buf[1] = BYTE_OFF_16(addr); + packet_buf[2] = BYTE_OFF_8(addr); + packet_buf[3] = BYTE_OFF_0(addr); + + /* last packet */ + if ((i == (packet_number - 1)) && remainder) + packet_len = remainder; + + packet_buf[4] = BYTE_OFF_8(packet_len); + packet_buf[5] = BYTE_OFF_0(packet_len); + + for (j = 0; j < packet_len; j++) { + packet_buf[FTS_CMD_WRITE_LEN + j] = buf[offset + j]; + ecc_in_host ^= packet_buf[FTS_CMD_WRITE_LEN + j]; + } + + ret = fts_i2c_write(client, packet_buf, packet_len + FTS_CMD_WRITE_LEN); + if (ret < 0) { + FTS_ERROR("app write fail"); + return ret; + } + mdelay(delay); + + /* read status */ + wr_ok = FTS_CMD_FLASH_STATUS_WRITE_OK + addr / packet_len; + for (j = 0; j < FTS_RETRIES_WRITE; j++) { + cmd = FTS_CMD_FLASH_STATUS; + ret = fts_i2c_read(client, &cmd, 1, val, FTS_CMD_FLASH_STATUS_LEN); + read_status = (((u16) val[0]) << 8) + val[1]; + /* FTS_INFO("%x %x", wr_ok, read_status); */ + if (wr_ok == read_status) { + break; + } + mdelay(FTS_RETRIES_DELAY_WRITE); + } + } + + return (int)ecc_in_host; +} + +/************************************************************************ + * Name: fts_flash_read_buf + * Brief: read data from flash + * Input: saddr - start address data write to flash + * buf - buffer to store data read from flash + * len - read length + * Output: + * Return: return 0 if success, otherwise return error code + * + * Warning: can't call this function directly, need call in boot environment + ***********************************************************************/ +int fts_flash_read_buf(struct i2c_client *client, u32 saddr, u8 *buf, u32 len) +{ + int ret = 0; + u32 i = 0; + u32 packet_number = 0; + u32 packet_len = 0; + u32 addr = 0; + u32 offset = 0; + u32 remainder = 0; + u8 wbuf[FTS_CMD_READ_LEN]; + + if ((NULL == buf) || (0 == len)) { + FTS_ERROR("buf is NULL or len is 0"); + return -EINVAL; + } + + packet_number = len / FTS_FLASH_PACKET_LENGTH; + remainder = len % FTS_FLASH_PACKET_LENGTH; + if (remainder > 0) { + packet_number++; + } + packet_len = FTS_FLASH_PACKET_LENGTH; + FTS_INFO("read packet_number:%d, remainder:%d", packet_number, remainder); + + wbuf[0] = FTS_CMD_READ; + for (i = 0; i < packet_number; i++) { + offset = i * FTS_FLASH_PACKET_LENGTH; + addr = saddr + offset; + wbuf[1] = BYTE_OFF_16(addr); + wbuf[2] = BYTE_OFF_8(addr); + wbuf[3] = BYTE_OFF_0(addr); + + /* last packet */ + if ((i == (packet_number - 1)) && remainder) + packet_len = remainder; + + ret = fts_i2c_write(client, wbuf, FTS_CMD_READ_LEN); + if (ret < 0) { + FTS_ERROR("pram/bootloader write 03 command fail"); + return ret; + } + + msleep(FTS_CMD_READ_DELAY); /* must wait, otherwise read wrong data */ + ret = fts_i2c_read(client, NULL, 0, buf + offset, packet_len); + if (ret < 0) { + FTS_ERROR("pram/bootloader read 03 command fail"); + return ret; + } + } + + return 0; +} + +/************************************************************************ + * Name: fts_flash_read + * Brief: + * Input: addr - address of flash + * len - length of read + * Output: buf - data read from flash + * Return: return 0 if success, otherwise return error code + ***********************************************************************/ +int fts_flash_read(struct i2c_client *client, u32 addr, u8 *buf, u32 len) +{ + int ret = 0; + + FTS_INFO("***********read flash***********"); + + if ((NULL == buf) || (0 == len)) { + FTS_ERROR("buf is NULL or len is 0"); + return -EINVAL; + } + + ret = fts_fwupg_enter_into_boot(client); + if (ret < 0) { + FTS_ERROR("enter into pramboot/bootloader fail"); + goto read_flash_err; + } + + ret = fts_flash_read_buf(client, addr, buf, len); + if (ret < 0) { + FTS_ERROR("read flash fail"); + goto read_flash_err; + } + +read_flash_err: + /* reset to normal boot */ + ret = fts_fwupg_reset_in_boot(client); + if (ret < 0) { + FTS_ERROR("reset to normal boot fail"); + } + return ret; +} + +/************************************************************************ + * Name: fts_read_file + * Brief: read file + * Input: file name + * Output: + * Return: return file len if succuss, otherwise return error code + ***********************************************************************/ + + +/************************************************************************ +* Name: fts_upgrade_bin +* Brief: +* Input: +* Output: +* Return: return 0 if success, otherwise return error code +***********************************************************************/ + + +#if FTS_AUTO_LIC_UPGRADE_EN +static int fts_lic_get_vid_in_tp(struct i2c_client *client, u16 *vid) +{ + int ret = 0; + u8 val[2] = { 0 }; + + if (NULL == vid) { + FTS_ERROR("vid is NULL"); + return -EINVAL; + } + + ret = fts_i2c_read_reg(client, FTS_REG_VENDOR_ID, &val[0]); + if (fts_data->ic_info.is_incell) + ret = fts_i2c_read_reg(client, FTS_REG_MODULE_ID, &val[1]); + if (ret < 0) { + FTS_ERROR("read vid from tp fail"); + return ret; + } + + *vid = *(u16 *) val; + return 0; +} + +static int fts_lic_get_vid_in_host(u16 *vid) +{ + u8 val[2] = { 0 }; + u8 *licbuf = NULL; + u32 conf_saddr = 0; + struct fts_upgrade *upg = fwupgrade; + + if (!upg || !upg->func || !upg->lic || !vid) { + FTS_ERROR("upgrade/func/get_hlic_ver/lic/vid is null"); + return -EINVAL; + } + + if (upg->lic_length < FTS_MAX_LEN_SECTOR) { + FTS_ERROR("lic length(%x) fail", upg->lic_length); + return -EINVAL; + } + + licbuf = upg->lic; + conf_saddr = upg->func->fwcfgoff; + val[0] = licbuf[conf_saddr + FTS_CONIFG_VENDORID_OFF]; + if (fts_data->ic_info.is_incell) + val[1] = licbuf[conf_saddr + FTS_CONIFG_MODULEID_OFF]; + + *vid = *(u16 *) val; + return 0; +} + +static int fts_lic_get_ver_in_tp(struct i2c_client *client, u8 *ver) +{ + int ret = 0; + + if (NULL == ver) { + FTS_ERROR("ver is NULL"); + return -EINVAL; + } + + ret = fts_i2c_read_reg(client, FTS_REG_LIC_VER, ver); + if (ret < 0) { + FTS_ERROR("read lcd initcode ver from tp fail"); + return ret; + } + + return 0; +} + +static int fts_lic_get_ver_in_host(u8 *ver) +{ + int ret = 0; + struct fts_upgrade *upg = fwupgrade; + + if (!upg || !upg->func || !upg->func->get_hlic_ver || !upg->lic) { + FTS_ERROR("upgrade/func/get_hlic_ver/lic is null"); + return -EINVAL; + } + + ret = upg->func->get_hlic_ver(upg->lic); + if (ret < 0) { + FTS_ERROR("get host lcd initial code version fail"); + return ret; + } + + *ver = (u8) ret; + return ret; +} + +/* check if lcd init code need upgrade +* true-need false-no need +*/ +static bool fts_lic_need_upgrade(struct i2c_client *client) +{ + int ret = 0; + u8 initcode_ver_in_tp = 0; + u8 initcode_ver_in_host = 0; + u16 vid_in_tp = 0; + u16 vid_in_host = 0; + bool fwvalid = false; + + fwvalid = fts_fwupg_check_fw_valid(client); + if (!fwvalid) { + FTS_INFO("fw is invalid, no upgrade lcd init code"); + return false; + } + + ret = fts_lic_get_vid_in_host(&vid_in_host); + if (ret < 0) { + FTS_ERROR("vendor id in host invalid"); + return false; + } + + ret = fts_lic_get_vid_in_tp(client, &vid_in_tp); + if (ret < 0) { + FTS_ERROR("vendor id in tp invalid"); + return false; + } + + FTS_DEBUG("vid in tp:%x, host:%x", vid_in_tp, vid_in_host); + if (vid_in_tp != vid_in_host) { + FTS_INFO("vendor id in tp&host are different, no upgrade lic"); + return false; + } + + ret = fts_lic_get_ver_in_host(&initcode_ver_in_host); + if (ret < 0) { + FTS_ERROR("init code in host invalid"); + return false; + } + + ret = fts_lic_get_ver_in_tp(client, &initcode_ver_in_tp); + if (ret < 0) { + FTS_ERROR("read reg0xE4 fail"); + return false; + } + + FTS_DEBUG("lcd initial code version in tp:%x, host:%x", initcode_ver_in_tp, initcode_ver_in_host); + if (0xA5 == initcode_ver_in_tp) { + FTS_INFO("lcd init code ver is 0xA5, don't upgade init code"); + return false; + } else if (0xFF == initcode_ver_in_tp) { + FTS_DEBUG("lcd init code in tp is invalid, need upgrade init code"); + return true; + } else if (initcode_ver_in_tp < initcode_ver_in_host) + return true; + else + return false; +} + +int fts_lic_upgrade(struct i2c_client *client, struct fts_upgrade *upg) +{ + int ret = 0; + bool hlic_upgrade = false; + int upgrade_count = 0; + u8 ver = 0; + + FTS_INFO("lcd initial code auto upgrade function"); + if ((!upg) || (!upg->func) || (!upg->func->lic_upgrade)) { + FTS_ERROR("lcd upgrade function is null"); + return -EINVAL; + } + + hlic_upgrade = fts_lic_need_upgrade(client); + FTS_INFO("lcd init code upgrade flag:%d", hlic_upgrade); + if (hlic_upgrade) { + FTS_INFO("lcd initial code need upgrade, upgrade begin..."); + do { + FTS_INFO("lcd initial code upgrade times:%d", upgrade_count); + upgrade_count++; + + ret = upg->func->lic_upgrade(client, upg->lic, upg->lic_length); + if (ret < 0) { + fts_fwupg_reset_in_boot(client); + } else { + fts_lic_get_ver_in_tp(client, &ver); + FTS_INFO("success upgrade to lcd initcode ver:%02x", ver); + break; + } + } while (upgrade_count < 2); + } else { + FTS_INFO("lcd initial code don't need upgrade"); + } + + return ret; +} +#endif /* FTS_AUTO_LIC_UPGRADE_EN */ + +static int fts_param_get_ver_in_tp(struct i2c_client *client, u8 *ver) +{ + int ret = 0; + + if (NULL == ver) { + FTS_ERROR("ver is NULL"); + return -EINVAL; + } + + ret = fts_i2c_read_reg(client, FTS_REG_IDE_PARA_VER_ID, ver); + if (ret < 0) { + FTS_ERROR("read fw param ver from tp fail"); + return ret; + } + + if ((0x00 == *ver) || (0xFF == *ver)) { + FTS_INFO("param version in tp invalid"); + return -EIO; + } + + return 0; +} + +static int fts_param_get_ver_in_host(u8 *ver) +{ + struct fts_upgrade *upg = fwupgrade; + + if ((!upg) || (!upg->func) || (!upg->fw) || (!ver)) { + FTS_ERROR("fts_data/upgrade/func/fw/ver is NULL"); + return -EINVAL; + } + + if (upg->fw_length < upg->func->paramcfgveroff) { + FTS_ERROR("fw len(%x) < paramcfg ver offset(%x)", upg->fw_length, upg->func->paramcfgveroff); + return -EINVAL; + } + + FTS_INFO("fw paramcfg version offset:%x", upg->func->paramcfgveroff); + *ver = upg->fw[upg->func->paramcfgveroff]; + + if ((0x00 == *ver) || (0xFF == *ver)) { + FTS_INFO("param version in host invalid"); + return -EIO; + } + + return 0; +} + +/************************************************************************ + * fts_param_need_upgrade - check fw paramcfg need upgrade or not + * + * Return: return true if paramcfg need upgrade + ***********************************************************************/ +static bool fts_param_need_upgrade(struct i2c_client *client) +{ + int ret = 0; + u8 val = 0; + u8 ver_in_host = 0; + u8 ver_in_tp = 0; + bool fwvalid = false; + + fwvalid = fts_fwupg_check_fw_valid(client); + if (!fwvalid) { + FTS_INFO("fw is invalid, no upgrade paramcfg"); + return false; + } + + ret = fts_param_get_ver_in_host(&ver_in_host); + if (ret < 0) { + FTS_ERROR("param version in host invalid"); + return false; + } + + ret = fts_i2c_read_reg(client, FTS_REG_IDE_PARA_STATUS, &val); + if (ret < 0) { + FTS_ERROR("read IDE PARAM STATUS in tp fail"); + return false; + } + + if ((val & 0x80) != 0x80) { + FTS_INFO("no IDE VER in tp"); + return false; + } else if ((val & 0x7F) != 0x00) { + FTS_INFO("IDE VER, param invalid, need upgrade param"); + return true; + } + + ret = fts_param_get_ver_in_tp(client, &ver_in_tp); + if (ret < 0) { + FTS_ERROR("get IDE param ver in tp fail"); + return false; + } + + FTS_INFO("fw paramcfg version in tp:%x, host:%x", ver_in_tp, ver_in_host); + if (ver_in_tp < ver_in_host) { + return true; + } + + return false; +} + +/************************************************************************ + * fts_fwupg_get_ver_in_tp - read fw ver from tp register + * + * return 0 if success, otherwise return error code + ***********************************************************************/ +static int fts_fwupg_get_ver_in_tp(struct i2c_client *client, u8 *ver) +{ + int ret = 0; + + if (NULL == ver) { + FTS_ERROR("ver is NULL"); + return -EINVAL; + } + + ret = fts_i2c_read_reg(client, FTS_REG_FW_VER, ver); + if (ret < 0) { + FTS_ERROR("read fw ver from tp fail"); + return ret; + } + + return 0; +} + +/************************************************************************ + * fts_fwupg_get_ver_in_host - read fw ver in host fw image + * + * return 0 if success, otherwise return error code + ***********************************************************************/ +static int fts_fwupg_get_ver_in_host(u8 *ver) +{ + struct fts_upgrade *upg = fwupgrade; + + if ((!upg) || (!upg->func) || (!upg->fw) || (!ver)) { + FTS_ERROR("fts_data/upgrade/func/fw/ver is NULL"); + return -EINVAL; + } + + if (upg->fw_length < upg->func->fwveroff) { + FTS_ERROR("fw len(%x) < fw ver offset(%x)", upg->fw_length, upg->func->fwveroff); + return -EINVAL; + } + + FTS_INFO("fw version offset:%x", upg->func->fwveroff); + *ver = upg->fw[upg->func->fwveroff]; + return 0; +} + +/************************************************************************ + * fts_fwupg_need_upgrade - check fw need upgrade or not + * + * Return: return true if fw need upgrade + ***********************************************************************/ +static bool fts_fwupg_need_upgrade(struct i2c_client *client) +{ + int ret = 0; + bool fwvalid = false; + u8 fw_ver_in_host = 0; + u8 fw_ver_in_tp = 0; + struct fts_ts_data *ts_data = NULL; + + ts_data = i2c_get_clientdata(client); + if (!ts_data) { + FTS_ERROR("can't get ts data"); + return false; + } + + fwvalid = fts_fwupg_check_fw_valid(client); + if (fwvalid) { + ret = fts_fwupg_get_ver_in_host(&fw_ver_in_host); + if (ret < 0) { + FTS_ERROR("get fw ver in host fail"); + return false; + } + + ret = fts_fwupg_get_ver_in_tp(client, &fw_ver_in_tp); + if (ret < 0) { + FTS_ERROR("get fw ver in tp fail"); + return false; + } + + ts_data->fw_ver_in_tp = fw_ver_in_tp; + ts_data->fw_ver_in_host = fw_ver_in_host; + + FTS_INFO("fw version in tp:%x, host:%x", fw_ver_in_tp, fw_ver_in_host); + if (fw_ver_in_tp != fw_ver_in_host) { + return true; + } + } else { + FTS_INFO("fw invalid, need upgrade fw"); + return true; + } + + return false; +} + +/************************************************************************ + * Name: fts_fw_upgrade + * Brief: fw upgrade main entry + * Input: + * Output: + * Return: return 0 if success, otherwise return error code + ***********************************************************************/ +int fts_fwupg_upgrade(struct i2c_client *client, struct fts_upgrade *upg) +{ + int ret = 0; + bool upgrade_flag = false; + int upgrade_count = 0; + u8 ver = 0; + + FTS_INFO("fw auto upgrade function"); + if ((NULL == upg) || (NULL == upg->func)) { + FTS_ERROR("upg/upg->func is null"); + return -EINVAL; + } + + upgrade_flag = fts_fwupg_need_upgrade(client); + FTS_INFO("fw upgrade flag:%d", upgrade_flag); + do { + upgrade_count++; + if (upgrade_flag) { + FTS_INFO("upgrade fw app(times:%d)", upgrade_count); + if (upg->func->upgrade) { + ret = upg->func->upgrade(client, upg->fw, upg->fw_length); + if (ret < 0) { + fts_fwupg_reset_in_boot(client); + } else { + fts_fwupg_get_ver_in_tp(client, &ver); + FTS_INFO("success upgrade to fw version %02x", ver); + break; + } + } else { + FTS_ERROR("upgrade func/upgrade is null, return immediately"); + ret = -ENODATA; + break; + } + } else { + FTS_INFO("fw don't need upgrade"); + if (upg->func->param_upgrade) { + if (fts_param_need_upgrade(client)) { + FTS_INFO("upgrade param area(times:%d)", upgrade_count); + ret = upg->func->param_upgrade(client, upg->fw, upg->fw_length); + if (ret < 0) { + fts_fwupg_reset_in_boot(client); + } else { + fts_param_get_ver_in_tp(client, &ver); + FTS_INFO("success upgrade to fw param version %02x", ver); + break; + } + } else { + FTS_INFO("param don't need upgrade"); + break; + } + } else { + break; + } + } + } while (upgrade_count < 2); + + return ret; +} + +#if FTS_AUTO_UPGRADE_EN +/************************************************************************ + * fts_fwupg_auto_upgrade - upgrade main entry + ***********************************************************************/ +void fts_fwupg_auto_upgrade(struct fts_ts_data *ts_data) +{ + int ret = 0; + struct i2c_client *client = ts_data->client; + struct fts_upgrade *upg = fwupgrade; + + FTS_INFO("********************FTS enter upgrade********************"); + + ret = fts_fwupg_upgrade(client, upg); + if (ret < 0) + FTS_ERROR("**********tp fw(app/param) upgrade failed**********"); + else + FTS_INFO("**********tp fw(app/param) no upgrade/upgrade success**********"); + +#if FTS_AUTO_LIC_UPGRADE_EN + ret = fts_lic_upgrade(client, upg); + if (ret < 0) + FTS_ERROR("**********lcd init code upgrade failed**********"); + else + FTS_INFO("**********lcd init code no upgrade/upgrade success**********"); +#endif + + FTS_INFO("********************FTS exit upgrade********************"); +} + +/* + * fts_fwupg_work - fw upgrade work function, handle upgrade + * @vid - u16 consit of module id and panel id + * + * return 0 if success, otherwise return error code + */ +int fts_fwupg_get_vendorid(struct fts_ts_data *ts_data, u16 *vid) +{ + int ret = 0; + bool fwvalid = false; + u8 vendor_id = 0; + u8 module_id = 0; + u32 fwcfg_addr = 0; + u8 cfgbuf[FTS_HEADER_LEN] = { 0 }; + struct i2c_client *client = ts_data->client; + struct fts_upgrade *upg = fwupgrade; + + FTS_INFO("read vendor id from tp"); + if ((!upg) || (!upg->func) || (!vid)) { + FTS_ERROR("upgrade/func/vid is null"); + return -EINVAL; + } + + fwvalid = fts_fwupg_check_fw_valid(client); + if (fwvalid) { + ret = fts_i2c_read_reg(client, FTS_REG_VENDOR_ID, &vendor_id); + if (ts_data->ic_info.is_incell) + ret = fts_i2c_read_reg(client, FTS_REG_MODULE_ID, &module_id); + } else { + fwcfg_addr = upg->func->fwcfgoff; + ret = fts_flash_read(client, fwcfg_addr, cfgbuf, FTS_HEADER_LEN); + vendor_id = cfgbuf[FTS_CONIFG_VENDORID_OFF]; + if (ts_data->ic_info.is_incell) { + if ((cfgbuf[FTS_CONIFG_MODULEID_OFF] + cfgbuf[FTS_CONIFG_MODULEID_OFF + 1]) == 0xFF) + module_id = cfgbuf[FTS_CONIFG_MODULEID_OFF]; + } + } + + if (ret < 0) { + FTS_ERROR("fail to get vendor id from tp"); + return ret; + } + + *vid = ((u16) module_id << 8) + vendor_id; + return 0; +} + +/* + * fts_fwupg_get_fw_file - get upgrade fw file in host driver + * + * return 0 if success, otherwise return error code + * + * call it to get upgrade file which include in host driver + * warning: + * 1. if more fw files, please modify FTS_GET_VENDOR_ID_NUM& + * FTS_VENDOR_ID + * 2. For incell ICs, vendor id = module id << 8 + panel id + * For others, vendor id = 0x0000 + panel id + * 3. get fw file from reques_firmware(), this function unactive + */ +#if FTS_AUTO_UPGRADE_EN +static int fts_fwupg_get_fw_file(struct fts_ts_data *ts_data) +{ + struct upgrade_fw *fw = &fw_list[0]; + struct fts_upgrade *upg = fwupgrade; + +#if (FTS_GET_VENDOR_ID_NUM > 1) + int ret = 0; + int i = 0; + u16 vendor_id = 0; + + /* support multi vendor, must read correct vendor id */ + ret = fts_fwupg_get_vendorid(ts_data, &vendor_id); + if (ret < 0) { + FTS_ERROR("get vendor id failed"); + return ret; + } + FTS_INFO("success to read vendor id:%04x", vendor_id); + for (i = 0; i < FTS_GET_VENDOR_ID_NUM; i++) { + fw = &fw_list[i]; + if (vendor_id == fw->vendor_id) { + FTS_INFO("vendor id match, get fw file successfully"); + break; + } + } + if (i >= FTS_GET_VENDOR_ID_NUM) { + FTS_ERROR("no vendor id match, don't get file"); + return -ENODATA; + } + +#endif + if (upg) { + upg->fw = fw->fw_file; + upg->fw_length = fw->fw_len; + upg->lic = fw->fw_file; + upg->lic_length = fw->fw_len; + + FTS_INFO("upgrade fw file len:%x", upg->fw_length); + if ((upg->fw_length < FTS_MIN_LEN) + || (upg->fw_length > FTS_MAX_LEN_FILE)) { + FTS_ERROR("fw file len(%x) fail", upg->fw_length); + return -ENODATA; + } + } + return 0; +} +#endif +/* + * fts_fwupg_init_ic_detail - for ic detail initialaztion + */ +static void fts_fwupg_init_ic_detail(void) +{ + struct fts_upgrade *upg = fwupgrade; + + if (upg && upg->func && upg->func->init) { + upg->func->init(); + } +} + +/* + * fts_fwupg_work - fw upgrade work function + * 1. get fw image/file + * 2. call upgrade main function(fts_fwupg_auto_upgrade) + */ +#if FTS_AUTO_UPGRADE_EN +static void fts_fwupg_work(struct work_struct *work) +{ + int ret = 0; + struct fts_ts_data *ts_data = container_of(work, + struct fts_ts_data, fwupg_work); + + FTS_INFO("fw upgrade work function"); + ts_data->fw_loading = 1; + fts_irq_disable(); + #if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); + #endif + + FTS_INFO("get upgrade fw file"); + ret = fts_fwupg_get_fw_file(ts_data); + fts_fwupg_init_ic_detail(); + if (ret < 0) { + FTS_ERROR("get file fail, can't upgrade"); + } else { + /* run auto upgrade */ + fts_fwupg_auto_upgrade(ts_data); + } + + #if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); + #endif + fts_irq_enable(); + ts_data->fw_loading = 0; +} +#endif +static int fts_get_lockdown_info(struct fts_ts_data *ts_data) +{ + int i, ret; + + memset(ts_data->lockdown_info, 0x00, FTS_LOCKDOWN_INFO_SIZE); + + ret = fts_flash_read(ts_data->client, LOCKDOWN_INFO_ADDR, ts_data->lockdown_info, FTS_LOCKDOWN_INFO_SIZE); + if (ret < 0) { + FTS_ERROR("fail to get lockdown info"); + return ret; + } + + for (i = 0; i < FTS_LOCKDOWN_INFO_SIZE; i++) + FTS_INFO("Lockdown info = %02x", ts_data->lockdown_info[i]); + + FTS_TS_INFO("Lockdown:0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n", + (int)ts_data->lockdown_info[0], (int)ts_data->lockdown_info[1], + (int)ts_data->lockdown_info[2], (int)ts_data->lockdown_info[3], + (int)ts_data->lockdown_info[4], (int)ts_data->lockdown_info[5], + (int)ts_data->lockdown_info[6], (int)ts_data->lockdown_info[7]); + return ret; +} + +/***************************************************************************** + * Name: fts_fwupg_init + * Brief: upgrade function initialization + * Input: + * Output: + * Return: return 0 if success, otherwise return error code + *****************************************************************************/ +int fts_fwupg_init(struct fts_ts_data *ts_data) +{ + int i = 0; + int j = 0; + int ret; +#if FTS_AUTO_UPGRADE_EN + int ic_stype = ts_data->ic_info.ids.type; + struct upgrade_func *func = upgrade_func_list[0]; + int func_count = sizeof(upgrade_func_list) / sizeof(upgrade_func_list[0]); + FTS_INFO("fw upgrade init function"); + + if (NULL == ts_data->ts_workqueue) { + FTS_ERROR("fts workqueue is NULL, can't run upgrade function"); + return -EINVAL; + } + + if (0 == func_count) { + FTS_ERROR("no upgrade function in tp driver"); + return -ENODATA; + } + fwupgrade = (struct fts_upgrade *)kzalloc(sizeof(*fwupgrade), GFP_KERNEL); + if (NULL == fwupgrade) { + FTS_ERROR("malloc memory for upgrade fail"); + return -ENOMEM; + } + + if (1 == func_count) { + fwupgrade->func = func; + } else { + for (i = 0; i < func_count; i++) { + func = upgrade_func_list[i]; + for (j = 0; j < FTX_MAX_COMPATIBLE_TYPE; j++) { + if (0 == func->ctype[j]) + break; + else if (func->ctype[j] == ic_stype) { + FTS_INFO("match upgrade function,type:%x", (int)func->ctype[j]); + fwupgrade->func = func; + } + } + } + } + + if (NULL == fwupgrade->func) { + FTS_ERROR("no upgrade functin match, can't upgrade"); + return -ENODATA; + } +#endif + ret = fts_get_lockdown_info(ts_data); + if (ret) { + FTS_ERROR("fail get lockdown info"); + } +#if FTS_AUTO_UPGRADE_EN + INIT_WORK(&ts_data->fwupg_work, fts_fwupg_work); + queue_work(ts_data->ts_workqueue, &ts_data->fwupg_work); +#endif + return 0; +} + +/***************************************************************************** + * Name: fts_fwupg_exit + * Brief: + * Input: + * Output: + * Return: + *****************************************************************************/ +int fts_fwupg_exit(struct fts_ts_data *ts_data) +{ + FTS_FUNC_ENTER(); + if (fwupgrade) { + kfree(fwupgrade); + } + FTS_FUNC_EXIT(); + + return 0; +} + +#endif /* #if FTS_AUTO_UPGRADE_EN */ diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash.h b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash.h new file mode 100644 index 000000000000..bcb5de462394 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash.h @@ -0,0 +1,171 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R)£¬All Rights Reserved. +* +* File Name: focaltech_flash.h +* +* Author: fupeipei +* +* Created: 2016-08-07 +* +* Abstract: +* +************************************************************************/ +#ifndef __LINUX_FOCALTECH_FLASH_H__ +#define __LINUX_FOCALTECH_FLASH_H__ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FTS_CMD_RESET 0x07 +#define FTS_ROMBOOT_CMD_WRITE 0xAE +#define FTS_ROMBOOT_CMD_START_APP 0x08 +#define FTS_DELAY_PRAMBOOT_START 10 +#define FTS_ROMBOOT_CMD_ECC 0xCC + +#define FTS_CMD_READ 0x03 +#define FTS_CMD_READ_DELAY 1 +#define FTS_CMD_READ_LEN 4 +#define FTS_CMD_FLASH_TYPE 0x05 +#define FTS_CMD_FLASH_MODE 0x09 +#define FLASH_MODE_WRITE_FLASH_VALUE 0x0A +#define FLASH_MODE_UPGRADE_VALUE 0x0B +#define FLASH_MODE_LIC_VALUE 0x0C +#define FLASH_MODE_PARAM_VALUE 0x0D +#define FTS_CMD_ERASE_APP 0x61 +#define FTS_REASE_APP_DELAY 1350 +#define FTS_ERASE_SECTOR_DELAY 60 +#define FTS_RETRIES_REASE 50 +#define FTS_RETRIES_DELAY_REASE 200 +#define FTS_CMD_FLASH_STATUS 0x6A +#define FTS_CMD_FLASH_STATUS_LEN 2 +#define FTS_CMD_FLASH_STATUS_NOP 0x0000 +#define FTS_CMD_FLASH_STATUS_ECC_OK 0xF055 +#define FTS_CMD_FLASH_STATUS_ERASE_OK 0xF0AA +#define FTS_CMD_FLASH_STATUS_WRITE_OK 0x1000 +#define FTS_CMD_ECC_INIT 0x64 +#define FTS_CMD_ECC_CAL 0x65 +#define FTS_CMD_ECC_CAL_LEN 6 +#define FTS_RETRIES_ECC_CAL 10 +#define FTS_RETRIES_DELAY_ECC_CAL 50 +#define FTS_CMD_ECC_READ 0x66 +#define FTS_CMD_DATA_LEN 0xB0 +#define FTS_CMD_DATA_LEN_LEN 4 +#define FTS_CMD_WRITE 0xBF +#define FTS_RETRIES_WRITE 100 +#define FTS_RETRIES_DELAY_WRITE 1 +#define FTS_CMD_WRITE_LEN 6 +#define FTS_DELAY_READ_ID 20 +#define FTS_DELAY_UPGRADE_RESET 80 +#define PRAMBOOT_MIN_SIZE 0x120 +#define PRAMBOOT_MAX_SIZE (64*1024) +#define FTS_FLASH_PACKET_LENGTH 32 /* max=128 */ +#define FTS_MAX_LEN_ECC_CALC 0xFFFE /* must be even */ +#define FTS_MIN_LEN 0x120 +#define FTS_MAX_LEN_FILE (128 * 1024) +#define FTS_MAX_LEN_APP (64 * 1024) +#define FTS_MAX_LEN_SECTOR (4 * 1024) +#define FTS_CONIFG_VENDORID_OFF 0x04 +#define FTS_CONIFG_MODULEID_OFF 0x1E +#define FTS_CONIFG_PROJECTID_OFF 0x20 +#define FTS_APPINFO_OFF 0x100 +#define FTS_APPINFO_APPLEN_OFF 0x00 +#define FTS_APPINFO_APPLEN2_OFF 0x12 +#define FTS_REG_UPGRADE 0xFC +#define FTS_UPGRADE_AA 0xAA +#define FTS_UPGRADE_55 0x55 +#define FTS_DELAY_FC_AA 10 +#define FTS_UPGRADE_LOOP 30 +#define FTS_HEADER_LEN 32 +#define FTS_FW_BIN_FILEPATH "/sdcard/" + +#define FTS_ROMBOOT_CMD_ECC_NEW_LEN 7 +#define FTS_ROMBOOT_CMD_ECC_FINISH 0xCE +#define FTS_CMD_READ_ECC 0xCD +#define FTX_MAX_COMPATIBLE_TYPE 4 +#define AL2_FCS_COEF ((1 << 15) + (1 << 10) + (1 << 3)) + +#define FTS_I2C_NAME "FTS_ts" + +#define FTS_TS_INFO(fmt, args...) pr_err("[%s] %s %d: " fmt, FTS_I2C_NAME, __func__, __LINE__, ##args) + +enum FW_STATUS { + FTS_RUN_IN_ERROR, + FTS_RUN_IN_APP, + FTS_RUN_IN_ROM, + FTS_RUN_IN_PRAM, + FTS_RUN_IN_BOOTLOADER, +}; + +enum FW_FLASH_MODE { + FLASH_MODE_APP, + FLASH_MODE_LIC, + FLASH_MODE_PARAM, + FLASH_MODE_ALL, +}; + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +/* IC info */ +struct upgrade_func { + u64 ctype[FTX_MAX_COMPATIBLE_TYPE]; + int newmode; + u32 fwveroff; + u32 fwcfgoff; + u32 appoff; + u32 licoff; + u32 paramcfgoff; + u32 paramcfgveroff; + u32 paramcfg2off; + bool hid_supported; + bool pramboot_supported; + u8 *pramboot; + u32 pb_length; + int (*init) (void); + int (*upgrade) (struct i2c_client *, u8 *, u32); + int (*get_hlic_ver) (u8 *); + int (*lic_upgrade) (struct i2c_client *, u8 *, u32); + int (*param_upgrade) (struct i2c_client *, u8 *, u32); + int (*force_upgrade) (struct i2c_client *, u8 *, u32); +}; + +struct fts_upgrade { + u8 *fw; + u32 fw_length; + u8 *lic; + u32 lic_length; + struct upgrade_func *func; +}; + +struct upgrade_fw { + u16 vendor_id; + u8 *fw_file; + u32 fw_len; +}; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +extern struct fts_upgrade *fwupgrade; +extern struct upgrade_func upgrade_func_ft8719; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +bool fts_fwupg_check_fw_valid(struct i2c_client *client); +int fts_fwupg_get_boot_state(struct i2c_client *client, enum FW_STATUS *fw_sts); +bool fts_fwupg_check_state(struct i2c_client *client, enum FW_STATUS rstate); +int fts_fwupg_reset_in_boot(struct i2c_client *client); +int fts_fwupg_reset_to_boot(struct i2c_client *client); +int fts_fwupg_reset_to_romboot(struct i2c_client *client); +int fts_fwupg_enter_into_boot(struct i2c_client *client); +int fts_fwupg_erase(struct i2c_client *client, u32 delay); +int fts_fwupg_ecc_cal(struct i2c_client *client, u32 saddr, u32 len); +int fts_flash_write_buf(struct i2c_client *client, u32 saddr, u8 *buf, u32 len, u32 delay); +int fts_fwupg_upgrade(struct i2c_client *client, struct fts_upgrade *upg); +#endif diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash/Makefile b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash/Makefile new file mode 100644 index 000000000000..8a16f313bc7b --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash/Makefile @@ -0,0 +1,7 @@ +# +# Makefile for the focaltech touchscreen drivers. +# + +# Each configuration option enables a list of files. + +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_upgrade_ft8719.o diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash/focaltech_upgrade_ft8719.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash/focaltech_upgrade_ft8719.c new file mode 100644 index 000000000000..6c790fc6619f --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash/focaltech_upgrade_ft8719.c @@ -0,0 +1,172 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2020 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_upgrade_ft8719.c +* +* Author: Focaltech Driver Team +* +* Created: 2017-11-22 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_core.h" +#include "../focaltech_flash.h" + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +u8 pb_file_ft8719[] = { +#include "../include/pramboot/FT8719_Pramboot_V0.5_20171221.i" +}; + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ + +/************************************************************************ + * fts_ft8719_upgrade_mode - + * Return: return 0 if success, otherwise return error code + ***********************************************************************/ +static int fts_ft8719_upgrade_mode(struct i2c_client *client, enum FW_FLASH_MODE mode, u8 *buf, u32 len) +{ + int ret = 0; + u32 start_addr = 0; + u8 cmd[4] = { 0 }; + u32 delay = 0; + int ecc_in_host = 0; + int ecc_in_tp = 0; + + if ((NULL == buf) || (len < FTS_MIN_LEN)) { + FTS_ERROR("buffer/len(%x) is invalid", len); + return -EINVAL; + } + + /* enter into upgrade environment */ + ret = fts_fwupg_enter_into_boot(client); + if (ret < 0) { + FTS_ERROR("enter into pramboot/bootloader fail,ret=%d", ret); + goto fw_reset; + } + + cmd[0] = FTS_CMD_FLASH_MODE; + cmd[1] = FLASH_MODE_UPGRADE_VALUE; + start_addr = upgrade_func_ft8719.appoff; + FTS_INFO("flash mode:0x%02x, start addr=0x%04x", cmd[1], start_addr); + ret = fts_i2c_write(client, cmd, 2); + if (ret < 0) { + FTS_ERROR("upgrade mode(09) cmd write fail"); + goto fw_reset; + } + + delay = FTS_ERASE_SECTOR_DELAY * (len / FTS_MAX_LEN_SECTOR); + ret = fts_fwupg_erase(client, delay); + if (ret < 0) { + FTS_ERROR("erase cmd write fail"); + goto fw_reset; + } + + /* write app */ + ecc_in_host = fts_flash_write_buf(client, start_addr, buf, len, 1); + if (ecc_in_host < 0) { + FTS_ERROR("lcd initial code write fail"); + goto fw_reset; + } + + /* ecc */ + ecc_in_tp = fts_fwupg_ecc_cal(client, start_addr, len); + if (ecc_in_tp < 0) { + FTS_ERROR("ecc read fail"); + goto fw_reset; + } + + FTS_INFO("ecc in tp:%x, host:%x", ecc_in_tp, ecc_in_host); + if (ecc_in_tp != ecc_in_host) { + FTS_ERROR("ecc check fail"); + goto fw_reset; + } + + FTS_INFO("upgrade success, reset to normal boot"); + ret = fts_fwupg_reset_in_boot(client); + if (ret < 0) { + FTS_ERROR("reset to normal boot fail"); + } + + msleep(400); + return 0; + +fw_reset: + return -EIO; +} +/************************************************************************ +* Name: fts_ft8719_upgrade +* Brief: +* Input: +* Output: +* Return: return 0 if success, otherwise return error code +***********************************************************************/ +static int fts_ft8719_upgrade(struct i2c_client *client, u8 *buf, u32 len) +{ + int ret = 0; + u8 *tmpbuf = NULL; + u32 app_len = 0; + + FTS_INFO("fw app upgrade..."); + if (NULL == buf) { + FTS_ERROR("fw buf is null"); + return -EINVAL; + } + + if ((len < FTS_MIN_LEN) || (len > FTS_MAX_LEN_FILE)) { + FTS_ERROR("fw buffer len(%x) fail", len); + return -EINVAL; + } + + app_len = len; + tmpbuf = buf; + ret = fts_ft8719_upgrade_mode(client, FLASH_MODE_APP, tmpbuf, app_len); + if (ret < 0) { + FTS_INFO("fw upgrade fail,reset to normal boot"); + if (fts_fwupg_reset_in_boot(client) < 0) { + FTS_ERROR("reset to normal boot fail"); + } + return ret; + } + + return 0; +} +struct upgrade_func upgrade_func_ft8719 = { + .ctype = {0x0D}, + .newmode = true, + .fwveroff = 0x010E, + .fwcfgoff = 0x1F80, + .appoff = 0x2000, + .pramboot_supported = true, + .pramboot = pb_file_ft8719, + .pb_length = sizeof(pb_file_ft8719), + .hid_supported = false, + .upgrade = fts_ft8719_upgrade +}; diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_gesture.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_gesture.c new file mode 100644 index 000000000000..f6429d4e5251 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_gesture.c @@ -0,0 +1,606 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2020 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_gestrue.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" +#if FTS_GESTURE_EN +/****************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define KEY_GESTURE_U KEY_WAKEUP +#define KEY_GESTURE_UP KEY_UP +#define KEY_GESTURE_DOWN KEY_DOWN +#define KEY_GESTURE_LEFT KEY_LEFT +#define KEY_GESTURE_RIGHT KEY_RIGHT +#define KEY_GESTURE_O KEY_O +#define KEY_GESTURE_E KEY_E +#define KEY_GESTURE_M KEY_M +#define KEY_GESTURE_L KEY_L +#define KEY_GESTURE_W KEY_W +#define KEY_GESTURE_S KEY_S +#define KEY_GESTURE_V KEY_V +#define KEY_GESTURE_C KEY_C +#define KEY_GESTURE_Z KEY_Z + +#define GESTURE_LEFT 0x20 +#define GESTURE_RIGHT 0x21 +#define GESTURE_UP 0x22 +#define GESTURE_DOWN 0x23 +#define GESTURE_DOUBLECLICK 0x24 +#define GESTURE_O 0x30 +#define GESTURE_W 0x31 +#define GESTURE_M 0x32 +#define GESTURE_E 0x33 +#define GESTURE_L 0x44 +#define GESTURE_S 0x46 +#define GESTURE_V 0x54 +#define GESTURE_Z 0x41 +#define GESTURE_C 0x34 +#define FTS_GESTRUE_POINTS 255 +#define FTS_GESTRUE_POINTS_HEADER 8 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +/* +* header - byte0:gesture id +* byte1:pointnum +* byte2~7:reserved +* coordinate_x - All gesture point x coordinate +* coordinate_y - All gesture point y coordinate +* mode - 1:enable gesture function(default) +* - 0:disable +* active - 1:enter into gesture(suspend) +* 0:gesture disable or resume +*/ +struct fts_gesture_st { + u8 header[FTS_GESTRUE_POINTS_HEADER]; + u16 coordinate_x[FTS_GESTRUE_POINTS]; + u16 coordinate_y[FTS_GESTRUE_POINTS]; + u8 mode; /*host driver enable gesture flag */ + u8 active; /*gesture actutally work */ +}; + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct fts_gesture_st fts_gesture_data; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static ssize_t fts_gesture_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t fts_gesture_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); +static ssize_t fts_gesture_buf_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t fts_gesture_buf_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); + +/* sysfs gesture node + * read example: cat fts_gesture_mode ---read gesture mode + * write example:echo 01 > fts_gesture_mode ---write gesture mode to 01 + * + */ +static DEVICE_ATTR(fts_gesture_mode, S_IRUGO | S_IWUSR, fts_gesture_show, fts_gesture_store); +/* + * read example: cat fts_gesture_buf ---read gesture buf + */ +static DEVICE_ATTR(fts_gesture_buf, S_IRUGO | S_IWUSR, fts_gesture_buf_show, fts_gesture_buf_store); +static struct attribute *fts_gesture_mode_attrs[] = { + &dev_attr_fts_gesture_mode.attr, + &dev_attr_fts_gesture_buf.attr, + NULL, +}; + +static struct attribute_group fts_gesture_group = { + .attrs = fts_gesture_mode_attrs, +}; + +/************************************************************************ +* Name: fts_gesture_show +* Brief: +* Input: device, device attribute, char buf +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + u8 val; + struct input_dev *input_dev = fts_data->input_dev; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + mutex_lock(&input_dev->mutex); + fts_i2c_read_reg(client, FTS_REG_GESTURE_EN, &val); + count = snprintf(buf, PAGE_SIZE, "Gesture Mode: %s\n", fts_gesture_data.mode ? "On" : "Off"); + count += snprintf(buf + count, PAGE_SIZE, "Reg(0xD0) = %d\n", val); + mutex_unlock(&input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_gesture_store +* Brief: +* Input: device, device attribute, char buf, char count +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct input_dev *input_dev = fts_data->input_dev; + mutex_lock(&input_dev->mutex); + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_INFO("[GESTURE]enable gesture"); + fts_gesture_data.mode = ENABLE; + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_INFO("[GESTURE]disable gesture"); + fts_gesture_data.mode = DISABLE; + } + mutex_unlock(&input_dev->mutex); + + return count; +} + +void fts_gesture_enable(bool enable) +{ + struct input_dev *input_dev = fts_data->input_dev; + + mutex_lock(&input_dev->mutex); + + if (enable) { + FTS_INFO("[GESTURE]enable gesture"); + fts_gesture_data.mode = ENABLE; + } else { + FTS_INFO("[GESTURE]disable gesture"); + fts_gesture_data.mode = DISABLE; + } + + mutex_unlock(&input_dev->mutex); +} + +/************************************************************************ +* Name: fts_gesture_buf_show +* Brief: +* Input: device, device attribute, char buf +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_buf_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + int i = 0; + struct input_dev *input_dev = fts_data->input_dev; + + mutex_lock(&input_dev->mutex); + count = snprintf(buf, PAGE_SIZE, "Gesture ID: 0x%x\n", fts_gesture_data.header[0]); + count += snprintf(buf + count, PAGE_SIZE, "Gesture PointNum: %d\n", fts_gesture_data.header[1]); + count += snprintf(buf + count, PAGE_SIZE, "Gesture Point Buf:\n"); + for (i = 0; i < fts_gesture_data.header[1]; i++) { + count += + snprintf(buf + count, PAGE_SIZE, "%3d(%4d,%4d) ", i, fts_gesture_data.coordinate_x[i], + fts_gesture_data.coordinate_y[i]); + if ((i + 1) % 4 == 0) + count += snprintf(buf + count, PAGE_SIZE, "\n"); + } + count += snprintf(buf + count, PAGE_SIZE, "\n"); + mutex_unlock(&input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_gesture_buf_store +* Brief: +* Input: device, device attribute, char buf, char count +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_buf_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +/***************************************************************************** +* Name: fts_create_gesture_sysfs +* Brief: +* Input: +* Output: +* Return: 0-success or others-error +*****************************************************************************/ +int fts_create_gesture_sysfs(struct i2c_client *client) +{ + int ret = 0; + + ret = sysfs_create_group(&client->dev.kobj, &fts_gesture_group); + if (ret != 0) { + FTS_ERROR("[GESTURE]fts_gesture_mode_group(sysfs) create failed!"); + sysfs_remove_group(&client->dev.kobj, &fts_gesture_group); + return ret; + } + return 0; +} + +/***************************************************************************** +* Name: fts_gesture_report +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_gesture_report(struct input_dev *input_dev, int gesture_id) +{ + int gesture; + + FTS_FUNC_ENTER(); + FTS_INFO("fts gesture_id==0x%x ", gesture_id); + switch (gesture_id) { + case GESTURE_LEFT: + gesture = KEY_GESTURE_LEFT; + break; + case GESTURE_RIGHT: + gesture = KEY_GESTURE_RIGHT; + break; + case GESTURE_UP: + gesture = KEY_GESTURE_UP; + break; + case GESTURE_DOWN: + gesture = KEY_GESTURE_DOWN; + break; + case GESTURE_DOUBLECLICK: + gesture = KEY_GESTURE_U; + break; + case GESTURE_O: + gesture = KEY_GESTURE_O; + break; + case GESTURE_W: + gesture = KEY_GESTURE_W; + break; + case GESTURE_M: + gesture = KEY_GESTURE_M; + break; + case GESTURE_E: + gesture = KEY_GESTURE_E; + break; + case GESTURE_L: + gesture = KEY_GESTURE_L; + break; + case GESTURE_S: + gesture = KEY_GESTURE_S; + break; + case GESTURE_V: + gesture = KEY_GESTURE_V; + break; + case GESTURE_Z: + gesture = KEY_GESTURE_Z; + break; + case GESTURE_C: + gesture = KEY_GESTURE_C; + break; + default: + gesture = -1; + break; + } + /* report event key */ + if (gesture != -1) { + FTS_DEBUG("Gesture Code=%d", gesture); + input_report_key(input_dev, gesture, 1); + input_sync(input_dev); + input_report_key(input_dev, gesture, 0); + input_sync(input_dev); + } + + FTS_FUNC_EXIT(); +} + +/************************************************************************ +* Name: fts_gesture_read_buffer +* Brief: read data from TP register +* Input: +* Output: +* Return: fail <0 +***********************************************************************/ +static int fts_gesture_read_buffer(struct i2c_client *client, u8 *buf, int read_bytes) +{ + int remain_bytes; + int ret; + int i; + + if (read_bytes <= I2C_BUFFER_LENGTH_MAXINUM) { + ret = fts_i2c_read(client, buf, 1, buf, read_bytes); + } else { + ret = fts_i2c_read(client, buf, 1, buf, I2C_BUFFER_LENGTH_MAXINUM); + remain_bytes = read_bytes - I2C_BUFFER_LENGTH_MAXINUM; + for (i = 1; remain_bytes > 0; i++) { + if (remain_bytes <= I2C_BUFFER_LENGTH_MAXINUM) + ret = fts_i2c_read(client, buf, 0, buf + I2C_BUFFER_LENGTH_MAXINUM * i, remain_bytes); + else + ret = + fts_i2c_read(client, buf, 0, buf + I2C_BUFFER_LENGTH_MAXINUM * i, + I2C_BUFFER_LENGTH_MAXINUM); + remain_bytes -= I2C_BUFFER_LENGTH_MAXINUM; + } + } + + return ret; +} + +/************************************************************************ +* Name: fts_gesture_readdata +* Brief: read data from TP register +* Input: +* Output: +* Return: return 0 if succuss, otherwise reture error code +***********************************************************************/ +int fts_gesture_readdata(struct fts_ts_data *ts_data) +{ + u8 buf[FTS_GESTRUE_POINTS * 4] = { 0 }; + int ret = 0; + int i = 0; + int gestrue_id = 0; + int read_bytes = 0; + u8 pointnum; + u8 state; + struct i2c_client *client = ts_data->client; + struct input_dev *input_dev = ts_data->input_dev; + + if (!ts_data->suspended) { + return -EINVAL; + } + + ret = fts_i2c_read_reg(client, FTS_REG_GESTURE_EN, &state); + if ((ret < 0) || (state != ENABLE)) { + FTS_DEBUG("gesture not enable, don't process gesture"); + return -EIO; + } + + /* init variable before read gesture point */ + memset(fts_gesture_data.header, 0, FTS_GESTRUE_POINTS_HEADER); + memset(fts_gesture_data.coordinate_x, 0, FTS_GESTRUE_POINTS * sizeof(u16)); + memset(fts_gesture_data.coordinate_y, 0, FTS_GESTRUE_POINTS * sizeof(u16)); + + buf[0] = FTS_REG_GESTURE_OUTPUT_ADDRESS; + ret = fts_i2c_read(client, buf, 1, buf, FTS_GESTRUE_POINTS_HEADER); + if (ret < 0) { + FTS_ERROR("[GESTURE]Read gesture header data failed!!"); + FTS_FUNC_EXIT(); + return ret; + } + + memcpy(fts_gesture_data.header, buf, FTS_GESTRUE_POINTS_HEADER); + gestrue_id = buf[0]; + pointnum = buf[1]; + read_bytes = ((int)pointnum) * 4 + 2; + buf[0] = FTS_REG_GESTURE_OUTPUT_ADDRESS; + FTS_DEBUG("[GESTURE]PointNum=%d", pointnum); + ret = fts_gesture_read_buffer(client, buf, read_bytes); + if (ret < 0) { + FTS_ERROR("[GESTURE]Read gesture touch data failed!!"); + FTS_FUNC_EXIT(); + return ret; + } + + fts_gesture_report(input_dev, gestrue_id); + if (gestrue_id == GESTURE_DOUBLECLICK) { + ts_data->dbclick_count++; + } + for (i = 0; i < pointnum; i++) { + fts_gesture_data.coordinate_x[i] = + (((s16) buf[0 + (4 * i + 2)]) & 0x0F) << 8 | (((s16) buf[1 + (4 * i + 2)]) & 0xFF); + fts_gesture_data.coordinate_y[i] = + (((s16) buf[2 + (4 * i + 2)]) & 0x0F) << 8 | (((s16) buf[3 + (4 * i + 2)]) & 0xFF); + } + + return 0; +} + +/***************************************************************************** +* Name: fts_gesture_recovery +* Brief: recovery gesture state when reset or power on +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_gesture_recovery(struct i2c_client *client) +{ + if ((ENABLE == fts_gesture_data.mode) && (ENABLE == fts_gesture_data.active)) { + FTS_INFO("enter fts_gesture_recovery"); + fts_i2c_write_reg(client, 0xD1, 0xff); + fts_i2c_write_reg(client, 0xD2, 0xff); + fts_i2c_write_reg(client, 0xD5, 0xff); + fts_i2c_write_reg(client, 0xD6, 0xff); + fts_i2c_write_reg(client, 0xD7, 0xff); + fts_i2c_write_reg(client, 0xD8, 0xff); + fts_i2c_write_reg(client, FTS_REG_GESTURE_EN, ENABLE); + } +} + +/***************************************************************************** +* Name: fts_gesture_suspend +* Brief: +* Input: +* Output: +* Return: return 0 if succuss, otherwise return error code +*****************************************************************************/ +int fts_gesture_suspend(struct i2c_client *client) +{ + int i; + u8 state; + + FTS_INFO("gesture suspend..."); + /* gesture not enable, return immediately */ + if (fts_gesture_data.mode == DISABLE) { + FTS_INFO("gesture is disabled"); + return -EINVAL; + } + + for (i = 0; i < 5; i++) { + fts_i2c_write_reg(client, 0xd1, 0xff); + fts_i2c_write_reg(client, 0xd2, 0xff); + fts_i2c_write_reg(client, 0xd5, 0xff); + fts_i2c_write_reg(client, 0xd6, 0xff); + fts_i2c_write_reg(client, 0xd7, 0xff); + fts_i2c_write_reg(client, 0xd8, 0xff); + fts_i2c_write_reg(client, FTS_REG_GESTURE_EN, ENABLE); + msleep(1); + fts_i2c_read_reg(client, FTS_REG_GESTURE_EN, &state); + if (state == ENABLE) + break; + } + + if (i >= 5) { + FTS_ERROR("[GESTURE]Enter into gesture(suspend) failed!\n"); + fts_gesture_data.active = DISABLE; + return -EIO; + } + + fts_gesture_data.active = ENABLE; + FTS_INFO("[GESTURE]Enter into gesture(suspend) successfully!"); + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_gesture_resume +* Brief: +* Input: +* Output: +* Return: return 0 if succuss, otherwise return error code +*****************************************************************************/ +int fts_gesture_resume(struct i2c_client *client) +{ + int i; + u8 state; + + FTS_INFO("gesture resume..."); + /* gesture not enable, return immediately */ + if (fts_gesture_data.mode == DISABLE) { + FTS_DEBUG("gesture is disabled"); + return -EINVAL; + } + + if (fts_gesture_data.active == DISABLE) { + FTS_DEBUG("gesture in suspend is failed, no running fts_gesture_resume"); + return -EINVAL; + } + + fts_gesture_data.active = DISABLE; + for (i = 0; i < 5; i++) { + fts_i2c_write_reg(client, FTS_REG_GESTURE_EN, DISABLE); + msleep(1); + fts_i2c_read_reg(client, FTS_REG_GESTURE_EN, &state); + if (state == DISABLE) + break; + } + + if (i >= 5) { + FTS_ERROR("[GESTURE]Clear gesture(resume) failed!\n"); + return -EIO; + } + + FTS_INFO("[GESTURE]resume from gesture successfully!"); + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_gesture_init +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_gesture_init(struct fts_ts_data *ts_data) +{ + struct i2c_client *client = ts_data->client; + struct input_dev *input_dev = ts_data->input_dev; + + FTS_FUNC_ENTER(); + input_set_capability(input_dev, EV_KEY, KEY_POWER); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_U); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_UP); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_DOWN); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_LEFT); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_RIGHT); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_O); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_E); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_M); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_L); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_W); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_S); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_V); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_Z); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_C); + + __set_bit(KEY_GESTURE_RIGHT, input_dev->keybit); + __set_bit(KEY_GESTURE_LEFT, input_dev->keybit); + __set_bit(KEY_GESTURE_UP, input_dev->keybit); + __set_bit(KEY_GESTURE_DOWN, input_dev->keybit); + __set_bit(KEY_GESTURE_U, input_dev->keybit); + __set_bit(KEY_GESTURE_O, input_dev->keybit); + __set_bit(KEY_GESTURE_E, input_dev->keybit); + __set_bit(KEY_GESTURE_M, input_dev->keybit); + __set_bit(KEY_GESTURE_W, input_dev->keybit); + __set_bit(KEY_GESTURE_L, input_dev->keybit); + __set_bit(KEY_GESTURE_S, input_dev->keybit); + __set_bit(KEY_GESTURE_V, input_dev->keybit); + __set_bit(KEY_GESTURE_C, input_dev->keybit); + __set_bit(KEY_GESTURE_Z, input_dev->keybit); + + fts_create_gesture_sysfs(client); + fts_gesture_data.mode = DISABLE; + fts_gesture_data.active = DISABLE; + + FTS_FUNC_EXIT(); + return 0; +} + +/************************************************************************ +* Name: fts_gesture_exit +* Brief: call when driver removed +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_gesture_exit(struct i2c_client *client) +{ + FTS_FUNC_ENTER(); + sysfs_remove_group(&client->dev.kobj, &fts_gesture_group); + FTS_FUNC_EXIT(); + return 0; +} +#endif diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_i2c.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_i2c.c new file mode 100644 index 000000000000..3a187750f8a0 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_i2c.c @@ -0,0 +1,242 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2020 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/************************************************************************ +* +* File Name: focaltech_i2c.c +* +* Author: fupeipei +* +* Created: 2016-08-04 +* +* Abstract: i2c communication with TP +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By fupeipei 2016-08-04 +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define I2C_RETRY_NUMBER 3 +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static DEFINE_MUTEX(i2c_rw_access); + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/***************************************************************************** +* functions body +*****************************************************************************/ + +/************************************************************************ +* Name: fts_i2c_read +* Brief: i2c read +* Input: i2c info, write buf, write len, read buf, read len +* Output: get data in the 3rd buf +* Return: fail <0 +***********************************************************************/ +int fts_i2c_read(struct i2c_client *client, char *writebuf, int writelen, char *readbuf, int readlen) +{ + int ret = 0; + int i = 0; + + mutex_lock(&i2c_rw_access); + + if (readlen > 0) { + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + for (i = 0; i < I2C_RETRY_NUMBER; i++) { + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret < 0) { + FTS_ERROR("[IIC]: i2c_transfer(write) error, ret=%d!!", ret); + } else + break; + } + } else { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + for (i = 0; i < I2C_RETRY_NUMBER; i++) { + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) { + FTS_ERROR("[IIC]: i2c_transfer(read) error, ret=%d!!", ret); + } else + break; + } + } + } + + mutex_unlock(&i2c_rw_access); + return ret; +} + +/************************************************************************ +* Name: fts_i2c_write +* Brief: i2c write +* Input: i2c info, write buf, write len +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_i2c_write(struct i2c_client *client, char *writebuf, int writelen) +{ + int ret = 0; + int i = 0; + + mutex_lock(&i2c_rw_access); + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + for (i = 0; i < I2C_RETRY_NUMBER; i++) { + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) { + FTS_ERROR("%s: i2c_transfer(write) error, ret=%d", __func__, ret); + } else + break; + } + } + mutex_unlock(&i2c_rw_access); + + return ret; +} + +/************************************************************************ +* Name: fts_i2c_write_reg +* Brief: write register +* Input: i2c info, reg address, reg value +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_i2c_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue) +{ + u8 buf[2] = { 0 }; + + buf[0] = regaddr; + buf[1] = regvalue; + return fts_i2c_write(client, buf, sizeof(buf)); +} + +/************************************************************************ +* Name: fts_i2c_read_reg +* Brief: read register +* Input: i2c info, reg address, reg value +* Output: get reg value +* Return: fail <0 +***********************************************************************/ +int fts_i2c_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue) +{ + return fts_i2c_read(client, ®addr, 1, regvalue, 1); +} + +/************************************************************************ +* HID to standard I2C +***********************************************************************/ +void fts_i2c_hid2std(struct i2c_client *client) +{ + int ret = 0; + u8 buf[3] = { 0xeb, 0xaa, 0x09 }; + + ret = fts_i2c_write(client, buf, 3); + if (ret < 0) + FTS_ERROR("hid2std cmd write fail"); + else { + msleep(10); + buf[0] = buf[1] = buf[2] = 0; + ret = fts_i2c_read(client, NULL, 0, buf, 3); + if (ret < 0) + FTS_ERROR("hid2std cmd read fail"); + else if ((0xeb == buf[0]) && (0xaa == buf[1]) && (0x08 == buf[2])) { + FTS_DEBUG("hidi2c change to stdi2c successful"); + } else { + FTS_ERROR("hidi2c change to stdi2c fail"); + } + } +} + +/************************************************************************ +* Name: fts_i2c_init +* Brief: fts i2c init +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_i2c_init(void) +{ + FTS_FUNC_ENTER(); + + FTS_FUNC_EXIT(); + return 0; +} + +/************************************************************************ +* Name: fts_i2c_exit +* Brief: fts i2c exit +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_i2c_exit(void) +{ + FTS_FUNC_ENTER(); + + FTS_FUNC_EXIT(); + return 0; +} diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_point_report_check.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_point_report_check.c new file mode 100644 index 000000000000..4eaa3ea93624 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_point_report_check.c @@ -0,0 +1,135 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2020 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_point_report_check.c +* +* Author: WangTao +* +* Created: 2016-11-16 +* +* Abstract: point report check function +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By WangTao 2016-11-16 +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +#if FTS_POINT_REPORT_CHECK_EN +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define POINT_REPORT_CHECK_WAIT_TIME 200 /* unit:ms */ + +/***************************************************************************** +* functions body +*****************************************************************************/ +/***************************************************************************** +* Name: fts_prc_func +* Brief: fts point report check work func, report whole up of points +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_prc_func(struct work_struct *work) +{ + struct fts_ts_data *ts_data = container_of(work, + struct fts_ts_data, prc_work.work); + struct input_dev *input_dev = ts_data->input_dev; + +#if FTS_MT_PROTOCOL_B_EN + u32 finger_count = 0; +#endif + + FTS_FUNC_ENTER(); + mutex_lock(&ts_data->report_mutex); + +#if FTS_MT_PROTOCOL_B_EN + for (finger_count = 0; finger_count < ts_data->pdata->max_touch_number; finger_count++) { + input_mt_slot(input_dev, finger_count); + input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, false); + } +#else + input_mt_sync(input_dev); +#endif + input_report_key(input_dev, BTN_TOUCH, 0); + input_sync(input_dev); + + mutex_unlock(&ts_data->report_mutex); + + FTS_FUNC_EXIT(); +} + +/***************************************************************************** +* Name: fts_prc_queue_work +* Brief: fts point report check queue work, call it when interrupt comes +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_prc_queue_work(struct fts_ts_data *ts_data) +{ + cancel_delayed_work(&ts_data->prc_work); + queue_delayed_work(ts_data->ts_workqueue, &ts_data->prc_work, msecs_to_jiffies(POINT_REPORT_CHECK_WAIT_TIME)); +} + +/***************************************************************************** +* Name: fts_point_report_check_init +* Brief: +* Input: +* Output: +* Return: < 0: Fail to create esd check queue +*****************************************************************************/ +int fts_point_report_check_init(struct fts_ts_data *ts_data) +{ + FTS_FUNC_ENTER(); + + if (ts_data->ts_workqueue) { + INIT_DELAYED_WORK(&ts_data->prc_work, fts_prc_func); + } else { + FTS_ERROR("fts workqueue is NULL, can't run point report check function"); + return -EINVAL; + } + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_point_report_check_exit +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_point_report_check_exit(struct fts_ts_data *ts_data) +{ + FTS_FUNC_ENTER(); + + FTS_FUNC_EXIT(); + return 0; +} +#endif /* FTS_POINT_REPORT_CHECK_EN */ diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/Makefile b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/Makefile new file mode 100644 index 000000000000..53a8ea9ba7a8 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/Makefile @@ -0,0 +1,12 @@ +#drivers/input/touchscreen/focaltech_touch/focaltech_test +# +#Makefile for test module +# + + + +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_ini.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_detail_threshold.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += supported_ic/ + diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test.c new file mode 100644 index 000000000000..1eb2ade05135 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test.c @@ -0,0 +1,1526 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2020 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/************************************************************************ +* +* File Name: focaltech_test.c +* +* Author: Software Department, FocalTech +* +* Created: 2016-08-01 +* +* Modify: +* +* Abstract: create char device and proc node for the comm between APK and TP +* +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_test.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +struct fts_test_data test_data; + +struct test_funcs *test_funcs_list[] = { + &test_func_ft8719, +}; + +static int fts_test_result = SELFTEST_INVALID; + +struct test_ic_type ic_types[] = { + {"FT5X22", 6, IC_FT5X46, 0}, + {"FT5X46", 6, IC_FT5X46, 0}, + {"FT5X46i", 7, IC_FT5X46I, 0}, + {"FT5526", 6, IC_FT5526, 0}, + {"FT3X17", 6, IC_FT3X17, 0}, + {"FT5436", 6, IC_FT5436, 0}, + {"FT3X27", 6, IC_FT3X27, 0}, + {"FT5526i", 7, IC_FT5526I, 0}, + {"FT5416", 6, IC_FT5416, 0}, + {"FT5426", 6, IC_FT5426, 0}, + {"FT5435", 6, IC_FT5435, 0}, + {"FT7681", 6, IC_FT7681, 0}, + {"FT7661", 6, IC_FT7661, 0}, + {"FT7511", 6, IC_FT7511, 0}, + {"FT7421", 6, IC_FT7421, 0}, + {"FT7311", 6, IC_FT7311, 0}, + + {"FT6X36", 6, IC_FT6X36, 0}, + {"FT3X07", 6, IC_FT3X07, 0}, + {"FT6416", 6, IC_FT6416, 0}, + {"FT6336G/U", 9, IC_FT6426, 0}, + {"FT6236U", 7, IC_FT6236U, 0}, + {"FT6436U", 7, IC_FT6436U, 0}, + {"FT3267", 6, IC_FT3267, 0}, + {"FT3367", 6, IC_FT3367, 0}, + {"FT7401", 6, IC_FT7401, 0}, + {"FT3407U", 7, IC_FT3407U, 0}, + + {"FT5822", 6, IC_FT5822, 0}, + {"FT5626", 6, IC_FT5626, 0}, + {"FT5726", 6, IC_FT5726, 0}, + {"FT5826B", 7, IC_FT5826B, 0}, + {"FT3617", 6, IC_FT3617, 0}, + {"FT3717", 6, IC_FT3717, 0}, + {"FT7811", 6, IC_FT7811, 0}, + {"FT5826S", 7, IC_FT5826S, 0}, + {"FT3517U", 7, IC_FT3517U, 0}, + + {"FT8606", 6, IC_FT8606, 0}, + + {"FT8716U", 7, IC_FT8716U, 0}, + {"FT8716F", 7, IC_FT8716F, 0}, + {"FT8716", 6, IC_FT8716, 0}, + {"FT8613", 6, IC_FT8613, 0}, + + {"FT3C47U", 7, IC_FT3C47U, 0}, + + {"FT8607U", 7, IC_FT8607U, 0}, + {"FT8607", 6, IC_FT8607, 0}, + + {"FT8736", 6, IC_FT8736, 0}, + + {"FT3D47", 6, IC_FT3D47, 0}, + + {"FTE716", 6, IC_FTE716, 0}, + + {"FT8201", 6, IC_FT8201, 0}, + + {"FT8006M", 7, IC_FT8006M, 0}, + + {"FT8006U", 7, IC_FT8006U, 0}, + + {"FT8719", 6, IC_FT8719, 0x8719}, + +}; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/***************************************************************************** +* functions body +*****************************************************************************/ +void sys_delay(int ms) +{ + msleep(ms); +} + +int focal_abs(int value) +{ + if (value < 0) + value = 0 - value; + + return value; +} + +void *fts_malloc(size_t size) +{ + return kzalloc(size, GFP_ATOMIC); +} + +void fts_free_proc(void *p) +{ + return kfree(p); +} + +/******************************************************************** + * test i2c read/write interface + *******************************************************************/ +int fts_test_i2c_read(u8 *writebuf, int writelen, u8 *readbuf, int readlen) +{ + int ret = 0; +#if 1 + if (NULL == fts_data) { + FTS_TEST_ERROR("fts_data is null, no test"); + return -EINVAL; + } + ret = fts_i2c_read(fts_data->client, writebuf, writelen, readbuf, readlen); +#else + ret = fts_i2c_read(writebuf, writelen, readbuf, readlen); +#endif + + if (ret < 0) + return ret; + else + return 0; +} + +int fts_test_i2c_write(u8 *writebuf, int writelen) +{ + int ret = 0; +#if 1 + if (NULL == fts_data) { + FTS_TEST_ERROR("fts_data is null, no test"); + return -EINVAL; + } + ret = fts_i2c_write(fts_data->client, writebuf, writelen); +#else + ret = fts_i2c_write(writebuf, writelen); +#endif + + if (ret < 0) + return ret; + else + return 0; +} + +int read_reg(u8 addr, u8 *val) +{ + return fts_test_i2c_read(&addr, 1, val, 1); +} + +int write_reg(u8 addr, u8 val) +{ + int ret; + u8 cmd[2] = { 0 }; + + cmd[0] = addr; + cmd[1] = val; + ret = fts_test_i2c_write(cmd, 2); + + return ret; +} + +/******************************************************************** + * test global function enter work/factory mode + *******************************************************************/ +int enter_work_mode(void) +{ + int ret = 0; + u8 mode = 0; + int i = 0; + int j = 0; + + FTS_TEST_FUNC_ENTER(); + + ret = read_reg(DEVIDE_MODE_ADDR, &mode); + if ((0 == ret) && (((mode >> 4) & 0x07) == 0x00)) + return 0; + + for (i = 0; i < ENTER_WORK_FACTORY_RETRIES; i++) { + ret = write_reg(DEVIDE_MODE_ADDR, 0x00); + if (0 == ret) { + for (j = 0; j < 20; j++) { + ret = read_reg(DEVIDE_MODE_ADDR, &mode); + if ((0 == ret) && (((mode >> 4) & 0x07) == 0x00)) + return 0; + else + sys_delay(FACTORY_TEST_DELAY); + } + } + + sys_delay(50); + } + + if (i >= ENTER_WORK_FACTORY_RETRIES) { + FTS_TEST_ERROR("Enter work mode fail"); + return -EIO; + } + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +int enter_factory_mode(void) +{ + int ret = 0; + u8 mode = 0; + int i = 0; + int j = 0; + + ret = read_reg(DEVIDE_MODE_ADDR, &mode); + if ((0 == ret) && (((mode >> 4) & 0x07) == 0x04)) + return 0; + + for (i = 0; i < ENTER_WORK_FACTORY_RETRIES; i++) { + ret = write_reg(DEVIDE_MODE_ADDR, 0x40); + if (0 == ret) { + for (j = 0; j < 20; j++) { + ret = read_reg(DEVIDE_MODE_ADDR, &mode); + if ((0 == ret) && (((mode >> 4) & 0x07) == 0x04)) { + sys_delay(200); + return 0; + } else + sys_delay(FACTORY_TEST_DELAY); + } + } + + sys_delay(50); + } + + if (i >= ENTER_WORK_FACTORY_RETRIES) { + FTS_TEST_ERROR("Enter factory mode fail"); + return -EIO; + } + + return 0; +} + +/************************************************************************ +* Name: fts_i2c_read_write +* Brief: Write/Read Data by IIC +* Input: writebuf, writelen, readlen +* Output: readbuf +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char fts_i2c_read_write(unsigned char *writebuf, int writelen, unsigned char *readbuf, int readlen) +{ + int ret; + + if (readlen > 0) { + ret = fts_test_i2c_read(writebuf, writelen, readbuf, readlen); + } else { + ret = fts_test_i2c_write(writebuf, writelen); + } + + if (ret >= 0) + return ERROR_CODE_OK; + else + return ERROR_CODE_COMM_ERROR; +} + +/* + * read_mass_data - read rawdata/short test data + * addr - register addr which read data from + * byte_num - read data length, unit:byte + * buf - save data + * + * return 0 if read data succuss, otherwise return error code + */ +int read_mass_data(u8 addr, int byte_num, int *buf) +{ + int ret = 0; + int i = 0; + u8 reg_addr = 0; + u8 *data = NULL; + int read_num = 0; + int packet_num = 0; + int packet_remainder = 0; + int offset = 0; + + data = (u8 *) fts_malloc(byte_num * sizeof(u8)); + if (NULL == data) { + FTS_TEST_SAVE_INFO("rawdata buffer malloc fail\n"); + return -ENOMEM; + } + + /* read rawdata buffer */ + FTS_TEST_INFO("mass data len:%d", byte_num); + packet_num = byte_num / BYTES_PER_TIME; + packet_remainder = byte_num % BYTES_PER_TIME; + if (packet_remainder) + packet_num++; + + if (byte_num < BYTES_PER_TIME) { + read_num = byte_num; + } else { + read_num = BYTES_PER_TIME; + } + FTS_TEST_INFO("packet num:%d, remainder:%d", packet_num, packet_remainder); + + reg_addr = addr; + ret = fts_test_i2c_read(®_addr, 1, data, read_num); + if (ret) { + FTS_TEST_SAVE_INFO("read rawdata fail\n"); + goto READ_MASSDATA_ERR; + } + + for (i = 1; i < packet_num; i++) { + offset = read_num * i; + if ((i == (packet_num - 1)) && packet_remainder) { + read_num = packet_remainder; + } + + ret = fts_test_i2c_read(NULL, 0, data + offset, read_num); + if (ret) { + FTS_TEST_SAVE_INFO("read much rawdata fail\n"); + goto READ_MASSDATA_ERR; + } + } + + for (i = 0; i < byte_num; i = i + 2) { + buf[i >> 1] = (int)(((int)(data[i]) << 8) + data[i + 1]); + } + +READ_MASSDATA_ERR: + if (data) { + fts_free(data); + } + + return ret; +} + +/* + * chip_clb_incell - auto clb + */ +int chip_clb_incell(void) +{ + int ret = 0; + u8 val = 0; + int times = 0; + + /* start clb */ + ret = write_reg(FACTORY_REG_CLB, 0x04); + if (ret) { + FTS_TEST_SAVE_INFO("write start clb fail\n"); + return ret; + } + + sys_delay(120); + while (times++ < FACTORY_TEST_RETRY) { + ret = read_reg(FACTORY_REG_CLB, &val); + if ((0 == ret) && (0x02 == val)) { + /* clb ok */ + break; + } else + FTS_TEST_DBG("reg%x=%x,retry:%d", FACTORY_REG_CLB, val, times); + + sys_delay(FACTORY_TEST_DELAY); + } + + if (times >= FACTORY_TEST_RETRY) { + FTS_TEST_SAVE_INFO("chip clb timeout\n"); + return -EIO; + } + + return 0; +} + +/* + * start_scan_incell - start to scan a frame for incell ic + */ +int start_scan_incell(void) +{ + int ret = 0; + u8 val = 0x00; + int times = 0; + + ret = read_reg(DEVIDE_MODE_ADDR, &val); + if (ret) { + FTS_TEST_SAVE_INFO("read device mode fail\n"); + return ret; + } + + /* Top bit position 1, start scan */ + val |= 0x80; + ret = write_reg(DEVIDE_MODE_ADDR, val); + if (ret) { + FTS_TEST_SAVE_INFO("write device mode fail\n"); + return ret; + } + + while (times++ < FACTORY_TEST_RETRY) { + /* Wait for the scan to complete */ + sys_delay(FACTORY_TEST_DELAY); + + ret = read_reg(DEVIDE_MODE_ADDR, &val); + if ((0 == ret) && (0 == (val >> 7))) { + break; + } else + FTS_TEST_DBG("reg%x=%x,retry:%d", DEVIDE_MODE_ADDR, val, times); + } + + if (times >= FACTORY_TEST_RETRY) { + FTS_TEST_SAVE_INFO("start scan timeout\n"); + return -EIO; + } + + return 0; +} + +/* + * wait_state_update - wait fw status update + */ +int wait_state_update(void) +{ + int ret = 0; + int times = 0; + u8 state = 0xFF; + + while (times++ < FACTORY_TEST_RETRY) { + sys_delay(100); + /* Wait register status update */ + state = 0xFF; + ret = read_reg(FACTORY_REG_PARAM_UPDATE_STATE, &state); + if ((0 == ret) && (0x00 == state)) + break; + else + FTS_TEST_DBG("reg%x=%x,retry:%d", FACTORY_REG_PARAM_UPDATE_STATE, state, times); + } + + if (times >= FACTORY_TEST_RETRY) { + FTS_TEST_SAVE_INFO("Wait State Update fail\n"); + return -EIO; + } + + return 0; +} + +/* + * get_rawdata_incell - read rawdata/diff for incell ic + */ +int get_rawdata_incell(int *data) +{ + int ret = 0; + u8 tx_num = 0; + u8 rx_num = 0; + u8 key_num = 0; + int va_num = 0; + + FTS_TEST_FUNC_ENTER(); + /* enter into factory mode */ + ret = enter_factory_mode(); + if (ret) { + FTS_TEST_SAVE_INFO("Failed to Enter Factory Mode\n"); + return ret; + } + + /* get tx/rx num */ + tx_num = test_data.screen_param.tx_num; + rx_num = test_data.screen_param.rx_num; + va_num = tx_num * rx_num; + key_num = test_data.screen_param.key_num_total; + + /* start to scan a frame */ + ret = start_scan_incell(); + if (ret) { + FTS_TEST_SAVE_INFO("Failed to Scan ...\n"); + return ret; + } + + /* Read RawData for va Area */ + ret = write_reg(FACTORY_REG_LINE_ADDR, 0xAD); + if (ret) { + FTS_TEST_SAVE_INFO("wirte AD to reg01 fail\n"); + return ret; + } + ret = read_mass_data(FACTORY_REG_RAWDATA_ADDR, va_num * 2, data); + if (ret) { + FTS_TEST_SAVE_INFO("Failed to Get RawData of channel.\n"); + return ret; + } + + /* Read RawData for key Area */ + ret = write_reg(FACTORY_REG_LINE_ADDR, 0xAE); + if (ret) { + FTS_TEST_SAVE_INFO("wirte AE to reg01 fail\n"); + return ret; + } + ret = read_mass_data(FACTORY_REG_RAWDATA_ADDR, key_num * 2, data + va_num); + if (ret) { + FTS_TEST_SAVE_INFO("Failed to Get RawData of keys.\n"); + return ret; + } + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +/* + * get_cb_incell - get cb data for incell IC + */ +int get_cb_incell(u16 saddr, int byte_num, int *cb_buf) +{ + int ret = 0; + int i = 0; + u8 cb_addr = 0; + u8 addr_h = 0; + u8 addr_l = 0; + int read_num = 0; + int packet_num = 0; + int packet_remainder = 0; + int offset = 0; + int addr = 0; + u8 *data = NULL; + + data = (u8 *) fts_malloc(byte_num * sizeof(u8)); + if (NULL == data) { + FTS_TEST_SAVE_INFO("cb buffer malloc fail\n"); + return -ENOMEM; + } + + packet_num = byte_num / BYTES_PER_TIME; + packet_remainder = byte_num % BYTES_PER_TIME; + if (packet_remainder) + packet_num++; + read_num = BYTES_PER_TIME; + + FTS_TEST_INFO("cb packet:%d,remainder:%d", packet_num, packet_remainder); + cb_addr = FACTORY_REG_CB_ADDR; + for (i = 0; i < packet_num; i++) { + offset = read_num * i; + addr = saddr + offset; + addr_h = (addr >> 8) & 0xFF; + addr_l = addr & 0xFF; + if ((i == (packet_num - 1)) && packet_remainder) { + read_num = packet_remainder; + } + + ret = write_reg(FACTORY_REG_CB_ADDR_H, addr_h); + if (ret) { + FTS_TEST_SAVE_INFO("write cb addr high fail\n"); + goto TEST_CB_ERR; + } + ret = write_reg(FACTORY_REG_CB_ADDR_L, addr_l); + if (ret) { + FTS_TEST_SAVE_INFO("write cb addr low fail\n"); + goto TEST_CB_ERR; + } + + ret = fts_test_i2c_read(&cb_addr, 1, data + offset, read_num); + if (ret) { + FTS_TEST_SAVE_INFO("read cb fail\n"); + goto TEST_CB_ERR; + } + } + + for (i = 0; i < byte_num; i++) { + cb_buf[i] = data[i]; + } + +TEST_CB_ERR: + fts_free(data); + return ret; +} + +/* + * weakshort_get_adc_data_incell - get short(adc) data for incell IC + */ +int weakshort_get_adc_data_incell(u8 retval, u8 ch_num, int byte_num, int *adc_buf) +{ + int ret = 0; + int times = 0; + u8 short_state = 0; + + FTS_TEST_FUNC_ENTER(); + + /* Start ADC sample */ + ret = write_reg(FACTORY_REG_SHORT_TEST_EN, 0x01); + if (ret) { + FTS_TEST_SAVE_INFO("start short test fail\n"); + goto ADC_ERROR; + } + sys_delay(ch_num * FACTORY_TEST_DELAY); + + for (times = 0; times < FACTORY_TEST_RETRY; times++) { + ret = read_reg(FACTORY_REG_SHORT_TEST_STATE, &short_state); + if ((0 == ret) && (retval == short_state)) + break; + else + FTS_TEST_DBG("reg%x=%x,retry:%d", FACTORY_REG_SHORT_TEST_STATE, short_state, times); + + sys_delay(FACTORY_TEST_RETRY_DELAY); + } + if (times >= FACTORY_TEST_RETRY) { + FTS_TEST_SAVE_INFO("short test timeout, ADC data not OK\n"); + ret = -EIO; + goto ADC_ERROR; + } + + ret = read_mass_data(FACTORY_REG_SHORT_ADDR, byte_num, adc_buf); + if (ret) { + FTS_TEST_SAVE_INFO("get short(adc) data fail\n"); + } + +ADC_ERROR: + FTS_TEST_FUNC_EXIT(); + return ret; +} + +/* + * show_data_incell - show and save test data to testresult.txt + */ +void show_data_incell(int *data, bool include_key) +{ + int row = 0; + int col = 0; + int tx_num = test_data.screen_param.tx_num; + int rx_num = test_data.screen_param.rx_num; + int key_num = test_data.screen_param.key_num_total; + + FTS_TEST_SAVE_INFO("\nVA Channels: "); + for (row = 0; row < tx_num; row++) { + FTS_TEST_SAVE_INFO("\nCh_%02d: ", row + 1); + for (col = 0; col < rx_num; col++) { + FTS_TEST_SAVE_INFO("%5d, ", data[row * rx_num + col]); + } + } + + if (include_key) { + FTS_TEST_SAVE_INFO("\nKeys: "); + for (col = 0; col < key_num; col++) { + FTS_TEST_SAVE_INFO("%5d, ", data[rx_num * tx_num + col]); + } + FTS_TEST_SAVE_INFO("\n"); + } +} + +/* + * compare_data_incell - check data in range or not + * + * return true if check pass, or return false + */ +bool compare_data_incell(int *data, int min, int max, int vk_min, int vk_max, bool include_key) +{ + int row = 0; + int col = 0; + int value = 0; + bool tmp_result = true; + int tx_num = test_data.screen_param.tx_num; + int rx_num = test_data.screen_param.rx_num; + int key_num = test_data.screen_param.key_num_total; + + /* VA area */ + for (row = 0; row < tx_num; row++) { + for (col = 0; col < rx_num; col++) { + if (0 == test_data.incell_detail_thr.invalid_node[row * rx_num + col]) + continue; /* Invalid Node */ + value = data[row * rx_num + col]; + if (value < min || value > max) { + tmp_result = false; + FTS_TEST_SAVE_INFO("test failure.Node=(%d, %d),Get_value=%d,Set_Range=(%d, %d)\n", + row + 1, col + 1, value, min, max); + } + } + } + /* Key area */ + if (include_key) { + if (test_data.screen_param.key_flag) { + key_num = test_data.screen_param.key_num; + } + row = test_data.screen_param.tx_num; + for (col = 0; col < key_num; col++) { + if (0 == test_data.incell_detail_thr.invalid_node[tx_num * rx_num + col]) + continue; /* Invalid Node */ + value = data[rx_num * tx_num + col]; + if (value < vk_min || value > vk_max) { + tmp_result = false; + FTS_TEST_SAVE_INFO("test failure.Node=(%d, %d),Get_value=%d,Set_Range=(%d, %d)\n", + row + 1, col + 1, value, vk_min, vk_max); + } + } + } + + return tmp_result; +} + +/************************************************************************ +* Name: compare_detailthreshold_data_incell +* Brief: compare_detailthreshold_data_incell +* Input: none +* Output: none +* Return: none. +***********************************************************************/ +bool compare_detailthreshold_data_incell(int *data, int *data_min, int *data_max, bool include_key) +{ + int row, col; + int value; + bool tmp_result = true; + int tmp_min, tmp_max; + int rx_num = test_data.screen_param.rx_num; + int tx_num = test_data.screen_param.tx_num; + int key_num = test_data.screen_param.key_num_total; + /* VA */ + for (row = 0; row < tx_num; row++) { + for (col = 0; col < rx_num; col++) { + if (test_data.incell_detail_thr.invalid_node[row * rx_num + col] == 0) + continue; /* Invalid Node */ + tmp_min = data_min[row * rx_num + col]; + tmp_max = data_max[row * rx_num + col]; + value = data[row * rx_num + col]; + if (value < tmp_min || value > tmp_max) { + tmp_result = false; + FTS_TEST_SAVE_INFO + (" \n test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d)", row + 1, + col + 1, value, tmp_min, tmp_max); + } + } + } + /* Key */ + if (include_key) { + if (test_data.screen_param.key_flag) { + key_num = test_data.screen_param.key_num; + } + row = test_data.screen_param.tx_num; + for (col = 0; col < key_num; col++) { + if (test_data.incell_detail_thr.invalid_node[rx_num * tx_num + col] == 0) + continue; /* Invalid Node */ + tmp_min = data_min[rx_num * tx_num + col]; + tmp_max = data_max[rx_num * tx_num + col]; + value = data[rx_num * tx_num + col]; + if (value < tmp_min || value > tmp_max) { + tmp_result = false; + FTS_TEST_SAVE_INFO + (" \n test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d)", row + 1, + col + 1, value, tmp_min, tmp_max); + } + } + } + + return tmp_result; +} + +/* + * save_testdata_incell - save data to testdata.csv + */ +void save_testdata_incell(int *data, char *test_num, int index, u8 row, u8 col, u8 item_count) +{ + int len = 0; + int i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + /* Save Msg */ + len = + snprintf(test_data.tmp_buffer, BUFF_LEN_TMP_BUFFER, "%s, %d, %d, %d, %d, %d, ", test_num, + test_data.test_item_code, row, col, test_data.start_line, item_count); + + memcpy(test_data.msg_area_line2 + test_data.len_msg_area_line2, test_data.tmp_buffer, len); + test_data.len_msg_area_line2 += len; + + test_data.start_line += row; + test_data.test_data_count++; + + /* Save Data */ + for (i = 0 + index; (i < row + index) && (i < TX_NUM_MAX); i++) { + for (j = 0; (j < col) && (j < RX_NUM_MAX); j++) { + if (j == (col - 1)) { + /* The Last Data of the row, add "\n" */ + len = + snprintf(test_data.tmp_buffer, BUFF_LEN_TMP_BUFFER, "%d, \n", + data[col * (i + index) + j]); + } else { + len = + snprintf(test_data.tmp_buffer, BUFF_LEN_TMP_BUFFER, "%d, ", + data[col * (i + index) + j]); + } + + memcpy(test_data.store_data_area + test_data.len_store_data_area, test_data.tmp_buffer, len); + test_data.len_store_data_area += len; + } + } + + FTS_TEST_FUNC_EXIT(); +} + +/* + * fts_ic_table_get_ic_code_from_ic_name - get ic code from ic name + */ +u32 fts_ic_table_get_ic_code_from_ic_name(char *ic_name) +{ + int i = 0; + int type_size = 0; + + type_size = sizeof(ic_types) / sizeof(ic_types[0]); + for (i = 0; i < type_size; i++) { + if (0 == strncmp(ic_name, ic_types[i].ic_name, ic_types[i].len)) + return ic_types[i].ic_type; + } + + FTS_TEST_ERROR("no IC type match"); + return 0; +} + +/* + * init_test_funcs - get test function based on ic_type + */ +int init_test_funcs(u32 ic_type) +{ + int i = 0; + struct test_funcs *funcs = test_funcs_list[0]; + int funcs_len = sizeof(test_funcs_list) / sizeof(test_funcs_list[0]); + u32 ic_series = 0; + + ic_series = TEST_ICSERIES(ic_type); + FTS_TEST_INFO("ic_type:%x, test functions len:%x", ic_type, funcs_len); + for (i = 0; i < funcs_len; i++) { + funcs = test_funcs_list[i]; + if (ic_series == funcs->ic_series) { + test_data.func = funcs; + break; + } + } + + if (i >= funcs_len) { + FTS_TEST_ERROR("no ic serial function match"); + return -ENODATA; + } + + return 0; +} + +/************************************************************************ +* Name: fts_set_testitem +* Brief: set test item code and name +* Input: null +* Output: null +* Return: +**********************************************************************/ +void fts_set_testitem(u8 itemcode) +{ + test_data.test_item[test_data.test_num].itemcode = itemcode; + test_data.test_item[test_data.test_num].testnum = test_data.test_num; + test_data.test_item[test_data.test_num].testresult = RESULT_NULL; + test_data.test_num++; +} + + +void init_storeparam_testdata(void) +{ + test_data.testresult_len = 0; + + test_data.len_store_msg_area = 0; + test_data.len_msg_area_line2 = 0; + test_data.len_store_data_area = 0; + /* The Start Line of Data Area is 11 */ + test_data.start_line = 11; + test_data.test_data_count = 0; +} + +int allocate_init_testdata_memory(void) +{ + test_data.testresult = fts_malloc(BUFF_LEN_TESTRESULT_BUFFER); + if (NULL == test_data.testresult) + goto ERR; + + test_data.store_all_data = fts_malloc(FTS_TEST_STORE_DATA_SIZE); + if (NULL == test_data.store_all_data) + goto ERR; + + test_data.store_msg_area = fts_malloc(BUFF_LEN_STORE_MSG_AREA); + if (NULL == test_data.store_msg_area) + goto ERR; + + test_data.msg_area_line2 = fts_malloc(BUFF_LEN_MSG_AREA_LINE2); + if (NULL == test_data.msg_area_line2) + goto ERR; + + test_data.store_data_area = fts_malloc(BUFF_LEN_STORE_DATA_AREA); + if (NULL == test_data.store_data_area) + goto ERR; + + test_data.tmp_buffer = fts_malloc(BUFF_LEN_TMP_BUFFER); + if (NULL == test_data.tmp_buffer) + goto ERR; + + init_storeparam_testdata(); + return 0; +ERR: + FTS_TEST_ERROR("fts_malloc memory failed in function."); + return -ENOMEM; +} + +/************************************************************************ +* Name: free_testdata_memory +* Brief: Release pointer memory +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void free_testdata_memory(void) +{ + /* free buff */ + if (NULL != test_data.testresult) + fts_free(test_data.testresult); + + if (NULL != test_data.store_all_data) + fts_free(test_data.store_all_data); + + if (NULL != test_data.store_msg_area) + fts_free(test_data.store_msg_area); + + if (NULL != test_data.msg_area_line2) + fts_free(test_data.msg_area_line2); + + if (NULL != test_data.store_data_area) + fts_free(test_data.store_data_area); + + if (NULL != test_data.tmp_buffer) + fts_free(test_data.tmp_buffer); + +} + +int get_tx_rx_num(u8 tx_rx_reg, u8 *ch_num, u8 ch_num_max) +{ + int ret = 0; + int i = 0; + + for (i = 0; i < 3; i++) { + ret = read_reg(tx_rx_reg, ch_num); + if ((ret < 0) || (*ch_num > ch_num_max)) { + sys_delay(50); + } else + break; + } + + if (i >= 3) { + FTS_TEST_ERROR("get channel num fail"); + return -EIO; + } + + return 0; +} + +static int get_channel_num(void) +{ + int ret = 0; + u8 tx_num = 0; + u8 rx_num = 0; + + FTS_TEST_FUNC_ENTER(); + + ret = enter_factory_mode(); + if (ret < 0) { + FTS_TEST_ERROR("enter factory mode fail, can't get tx/rx num"); + return ret; + } + + test_data.screen_param.used_max_tx_num = TX_NUM_MAX; + test_data.screen_param.used_max_rx_num = RX_NUM_MAX; + test_data.screen_param.key_num_total = KEY_NUM_MAX; + ret = get_tx_rx_num(FACTORY_REG_CHX_NUM, &tx_num, TX_NUM_MAX); + if (ret < 0) { + FTS_TEST_ERROR("get tx_num fail"); + return ret; + } + + ret = get_tx_rx_num(FACTORY_REG_CHY_NUM, &rx_num, RX_NUM_MAX); + if (ret < 0) { + FTS_TEST_ERROR("get rx_num fail"); + return ret; + } + + test_data.screen_param.tx_num = (int)tx_num; + test_data.screen_param.rx_num = (int)rx_num; + test_data.screen_param.used_max_tx_num = tx_num + KEY_NUM_MAX; + test_data.screen_param.used_max_rx_num = rx_num + KEY_NUM_MAX; + + FTS_TEST_INFO("TxNum=%d, RxNum=%d, MaxTxNum=%d, MaxRxNum=%d", + test_data.screen_param.tx_num, test_data.screen_param.rx_num, + test_data.screen_param.used_max_tx_num, test_data.screen_param.used_max_rx_num); + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +static int fts_test_init_basicinfo(void) +{ + int ret = 0; + u8 val = 0; + + FTS_TEST_SAVE_INFO("FTS TESTCODE VERSION:%s\n", IC_TEST_VERSION); + + ret = read_reg(REG_FW_VERSION, &val); + FTS_TEST_SAVE_INFO("FW version:0x%02x\n", val); + + ret = read_reg(REG_VA_TOUCH_THR, &val); + test_data.va_touch_thr = val; + ret = read_reg(REG_VKEY_TOUCH_THR, &val); + test_data.key_touch_thr = val; + + /* enter into factory mode and read tx/rx num */ + ret = get_channel_num(); + FTS_TEST_SAVE_INFO("tx_num:%d, rx_num:%d\n", test_data.screen_param.tx_num, test_data.screen_param.rx_num); + + return ret; +} + +static int fts_test_main_init(void) +{ + int ret = 0; + int len = 0; + + FTS_TEST_FUNC_ENTER(); + /* allocate memory for test data:csv&txt */ + ret = allocate_init_testdata_memory(); + if (ret < 0) { + FTS_TEST_ERROR("allocate memory for test data fail"); + return ret; + } + + /* get basic information: tx/rx num */ + ret = fts_test_init_basicinfo(); + if (ret < 0) { + FTS_TEST_ERROR("test init basicinfo fail"); + return ret; + } + + /* Allocate memory for detail threshold structure */ + ret = malloc_struct_DetailThreshold(); + if (ret < 0) { + FTS_TEST_ERROR("Failed to malloc memory for detaithreshold"); + return ret; + } + + /*Allocate test data buffer */ + len = (test_data.screen_param.tx_num + 1) * test_data.screen_param.rx_num; + test_data.buffer = (int *)fts_malloc(len * sizeof(int)); + if (NULL == test_data.buffer) { + FTS_TEST_ERROR("test_data.buffer malloc fail"); + return -ENOMEM; + } + memset(test_data.buffer, 0, len * sizeof(int)); + + FTS_TEST_FUNC_EXIT(); + return ret; +} + +/* + * fts_test_get_testparams - get test parameter from ini + */ + +static int fts_test_main_exit(void) +{ + FTS_TEST_FUNC_ENTER(); + /* free memory */ + free_struct_DetailThreshold(); + free_testdata_memory(); + + /*free test data buffer */ + if (test_data.buffer) + fts_free(test_data.buffer); + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + +/************************************************************************ +* Name: fts_test_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_test_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return -EPERM; +} + +/************************************************************************ +* Name: fts_test_store +* Brief: upgrade from app.bin +* Input: device, device attribute, char buf, char count +* Output: no +* Return: char count +***********************************************************************/ +static ssize_t fts_test_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + char fwname[128] = { 0 }; + struct fts_ts_data *ts_data = fts_data; + struct input_dev *input_dev; + + FTS_TEST_FUNC_ENTER(); + + input_dev = ts_data->input_dev; + memset(fwname, 0, sizeof(fwname)); + snprintf(fwname, 128, "%s", buf); + fwname[count - 1] = '\0'; + FTS_TEST_DBG("fwname:%s.", fwname); + + mutex_lock(&input_dev->mutex); + disable_irq(ts_data->irq); + +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + fts_esdcheck_switch(DISABLE); +#endif + + +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + fts_esdcheck_switch(ENABLE); +#endif + + enable_irq(ts_data->irq); + mutex_unlock(&input_dev->mutex); + + FTS_TEST_FUNC_EXIT(); + return count; +} + +/* test from test.ini +* example:echo "***.ini" > fts_test +*/ +static DEVICE_ATTR(fts_test, S_IRUGO | S_IWUSR, fts_test_show, fts_test_store); + +/* add your attr in here*/ +static struct attribute *fts_test_attributes[] = { + &dev_attr_fts_test.attr, + NULL +}; + +static struct attribute_group fts_test_attribute_group = { + .attrs = fts_test_attributes +}; + +static int fts_i2c_test(void) +{ + int ret = 0; + u8 chip_id[2] = { 0 }; + int cnt = 0; + + do { + ret = fts_i2c_read_reg(fts_data->client, FTS_REG_CHIP_ID, &chip_id[0]); + ret = fts_i2c_read_reg(fts_data->client, FTS_REG_CHIP_ID2, &chip_id[1]); + if ((ret < 0) || (0x0 == chip_id[0]) || (0x0 == chip_id[1])) { + cnt++; + ret = SELFTEST_FAIL; + msleep(100); + } else { + ret = SELFTEST_PASS; + break; + } + } while (cnt < 10); + + return SELFTEST_PASS; +} + +static int fts_tp_selftest_open(struct inode *inode, struct file *file) +{ + return 0; +} + +static ssize_t fts_tp_selftest_read(struct file *file, char __user *buf, size_t count, loff_t *pos) +{ + char tmp[5]; + int cnt; + + if (*pos != 0) + return 0; + + cnt = snprintf(tmp, sizeof(fts_test_result), "%d\n", fts_test_result); + if (copy_to_user(buf, tmp, strlen(tmp))) + return -EFAULT; + *pos += cnt; + return cnt; +} + +static int get_ic_types_by_chipid(short chipid) +{ + int i = 0; + int type_size = 0; + + type_size = sizeof(ic_types) / sizeof(ic_types[0]); + for (i = 0; i < type_size; i++) { + if (chipid == ic_types[i].chipid) + return ic_types[i].ic_type; + } + + return 0; +} + +ssize_t fts_tp_selftest_write(struct file *file, const char __user *buf, size_t count, loff_t *pos) +{ + char tmp[6]; + int retval; + int id; + + fts_test_result = SELFTEST_INVALID; + + if (!fts_data->client || count > sizeof(tmp)) { + retval = -SELFTEST_INVALID; + fts_test_result = SELFTEST_INVALID; + goto out; + } + + if (copy_from_user(tmp, buf, count)) { + retval = -EFAULT; + fts_test_result = SELFTEST_INVALID; + goto out; + } + + /* test initialize */ + retval = fts_test_main_init(); + if (retval < 0) { + FTS_TEST_ERROR("fts_test_main_init() error."); + goto test_err; + } + + id = get_ic_types_by_chipid(fts_data->chipid); + if (id == 0) { + retval = -EFAULT; + fts_test_result = SELFTEST_INVALID; + goto out; + } + + retval = init_test_funcs(id); + if (retval < 0) { + retval = -EFAULT; + fts_test_result = SELFTEST_INVALID; + goto out; + } + + if (!test_data.func) { + FTS_TEST_ERROR("[focal] %s - ERROR: can't find test data func", __func__); + retval = -SELFTEST_INVALID; + fts_test_result = SELFTEST_INVALID; + goto out; + } + + disable_irq(fts_data->irq); + if (!strncmp(tmp, "short", 5)) { + if (test_data.func->open_test) + fts_test_result = test_data.func->short_test(); + } else if (!strncmp(tmp, "open", 4)) { + if (test_data.func->short_test) + fts_test_result = test_data.func->open_test(); + } else if (!strncmp(tmp, "i2c", 3)) + fts_test_result = fts_i2c_test(); + retval = fts_test_result; + + enter_work_mode(); + enable_irq(fts_data->irq); +out: + if (retval >= 0) + retval = count; + fts_test_main_exit(); +test_err: + return retval; +} + +int fts_tp_selftest_release(struct inode *inode, struct file *file) +{ + return 0; +} + +static const struct file_operations tp_selftest_ops = { + .open = fts_tp_selftest_open, + .read = fts_tp_selftest_read, + .write = fts_tp_selftest_write, + .release = fts_tp_selftest_release, +}; + +static int32_t c_show(struct seq_file *m, void *v) +{ + int ret = 0; + int i = 0, j = 0, len = 0; + int *rawdata = NULL; + u8 old_mode = 0; + u8 tx_num = 0; + u8 rx_num = 0; + + FTS_TEST_FUNC_ENTER(); + + rawdata = (int *)vmalloc(PAGE_SIZE * 4); + if (!rawdata) { + ret = -EFAULT; + goto out; + } + + /* 0xEE = 1, disable cb */ + ret = write_reg(FACTORY_REG_AUTO_CAL_FLAG, 0x01); + if (ret) { + FTS_TEST_ERROR("write data auto cal fail"); + ret = -EFAULT; + goto out; + } + + ret = enter_factory_mode(); + if (ret < 0) { + FTS_TEST_ERROR("enter factory mode fail"); + ret = -EFAULT; + goto out; + } + + ret = read_reg(FACTORY_REG_CHX_NUM, &tx_num); + ret = read_reg(FACTORY_REG_CHY_NUM, &rx_num); + + /* switch to differ mode */ + ret = read_reg(FACTORY_REG_DATA_SELECT, &old_mode); + +/*********************GET RAWDATA*********************/ + ret = write_reg(FACTORY_REG_DATA_SELECT, 0x00); + if (ret) { + FTS_TEST_ERROR("write data select fail"); + ret = -EFAULT; + goto out; + } + + /* start to scan a frame */ + ret = start_scan_incell(); + if (ret) { + FTS_TEST_SAVE_INFO("Failed to Scan ...\n"); + return ret; + } + + ret = write_reg(FACTORY_REG_LINE_ADDR, 0xAD); + if (ret) { + FTS_TEST_ERROR("write REG LINE fail"); + ret = -EFAULT; + goto out; + } + + ret = read_mass_data(FACTORY_REG_RAWDATA_ADDR, tx_num * rx_num * 2, rawdata); + if (ret) { + FTS_TEST_SAVE_INFO("Failed to Get RawData of channel.\n"); + ret = -EFAULT; + goto out; + } + + seq_printf(m, "\nRAW DATA\n"); + len = 0; + for (i = 0; (i < tx_num) && (i < TX_NUM_MAX); i++) { + for (j = 0; (j < rx_num) && (j < RX_NUM_MAX); j++) { + if (j == (rx_num - 1)) { + seq_printf(m, "%5d, \n", rawdata[rx_num * i + j]); + } else { + seq_printf(m, "%5d, ", rawdata[rx_num * i + j]); + } + } + } + seq_printf(m, "\nDIFF DATA\n"); + +/*********************GET DIFFDATA*********************/ + ret = write_reg(FACTORY_REG_DATA_SELECT, 0x01); + if (ret) { + FTS_TEST_ERROR("write data select fail"); + ret = -EFAULT; + goto out; + } + + /* start to scan a frame */ + ret = start_scan_incell(); + if (ret) { + FTS_TEST_SAVE_INFO("Failed to Scan ...\n"); + return ret; + } + + ret = write_reg(FACTORY_REG_LINE_ADDR, 0xAD); + if (ret) { + FTS_TEST_ERROR("write REG LINE fail"); + ret = -EFAULT; + goto out; + } + + ret = read_mass_data(FACTORY_REG_RAWDATA_ADDR, tx_num * rx_num * 2, rawdata); + if (ret) { + FTS_TEST_SAVE_INFO("Failed to Get RawData of channel.\n"); + ret = -EFAULT; + goto out; + } + + for (i = 0; (i < tx_num) && (i < TX_NUM_MAX); i++) { + for (j = 0; (j < rx_num) && (j < RX_NUM_MAX); j++) { + if (j == (rx_num - 1)) { + seq_printf(m, "%5d, \n", (short)rawdata[rx_num * i + j]); + } else { + seq_printf(m, "%5d, ", (short)rawdata[rx_num * i + j]); + } + } + } + seq_printf(m, "\n\n"); + +out: + if (old_mode) + write_reg(FACTORY_REG_DATA_SELECT, old_mode); + ret = enter_work_mode(); + enable_irq(fts_data->irq); + + if (rawdata) { + vfree(rawdata); + rawdata = NULL; + } + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +static void *c_start(struct seq_file *m, loff_t *pos) +{ + return *pos < 1 ? (void *)1 : NULL; +} + +static void *c_next(struct seq_file *m, void *v, loff_t *pos) +{ + ++*pos; + return NULL; +} + +static void c_stop(struct seq_file *m, void *v) +{ + return; +} + +const struct seq_operations fts_datadump_seq_ops = { + .start = c_start, + .next = c_next, + .stop = c_stop, + .show = c_show +}; + +static int32_t fts_tp_data_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &fts_datadump_seq_ops); +} + +static const struct file_operations fts_datadump_fops = { + .owner = THIS_MODULE, + .open = fts_tp_data_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +int fts_test_init(struct i2c_client *client) +{ + int ret = 0; + + FTS_TEST_FUNC_ENTER(); + + ret = sysfs_create_group(&client->dev.kobj, &fts_test_attribute_group); + if (0 != ret) { + FTS_TEST_ERROR("[focal] %s() - ERROR: sysfs_create_group() failed.", __func__); + sysfs_remove_group(&client->dev.kobj, &fts_test_attribute_group); + } else { + FTS_TEST_DBG("[focal] %s() - sysfs_create_group() succeeded.", __func__); + } + fts_data->tp_selftest_proc = proc_create("tp_selftest", 0644, NULL, &tp_selftest_ops); + if (!fts_data->tp_selftest_proc) + FTS_TEST_ERROR("[focal] %s() - ERROR: tp_selftest proc create failed.", __func__); + + fts_data->tp_data_dump_proc = proc_create("tp_data_dump", 0444, NULL, &fts_datadump_fops); + FTS_TEST_ERROR("create file node of tp_data_dump"); + if (!fts_data->tp_data_dump_proc) + FTS_TEST_ERROR("[focal] %s() - ERROR: tp_data_dump proc create failed.", __func__); + + FTS_TEST_FUNC_EXIT(); + + return ret; +} + +int fts_test_exit(struct i2c_client *client) +{ + FTS_TEST_FUNC_ENTER(); + + sysfs_remove_group(&client->dev.kobj, &fts_test_attribute_group); + if (fts_data->tp_selftest_proc) + remove_proc_entry("tp_selftest", NULL); + if (fts_data->tp_data_dump_proc) + remove_proc_entry("tp_data_dump", NULL); + + FTS_TEST_FUNC_EXIT(); + return 0; +} diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test.h b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test.h new file mode 100644 index 000000000000..4374dee27574 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test.h @@ -0,0 +1,425 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2020 XiaoMi, Inc. +* +* File Name: focaltech_test.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ +#ifndef _TEST_LIB_H +#define _TEST_LIB_H + +/***************************************************************************** +* Included header files +*****************************************************************************/ + +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/slab.h> +#include <linux/debugfs.h> +#include <asm/uaccess.h> +#include <linux/i2c.h> +#include <linux/delay.h> +#include <linux/string.h> +#include <asm/unistd.h> +#include <linux/vmalloc.h> + +#include "../focaltech_core.h" +#include "focaltech_test_detail_threshold.h" +#include "focaltech_test_ini.h" + +/***************************************************************************** +* Macro definitions using #define +*****************************************************************************/ +#define IC_TEST_VERSION "V2.0.0 20170811" +#define FTS_INI_FILE_PATH "/mnt/sdcard/" +#define FTS_TESTDATA_FILE_NAME "testdata.csv" +#define FTS_TESTRESULT_FILE_NAME "testresult.txt" +#define false 0 +#define true 1 +#define MAX_IC_NAME_LEN 20 +#define TEST_ICSERIES_LEN 8 +#define TEST_ICSERIES(x) ((x) >> TEST_ICSERIES_LEN) + +/* +#define FTS_CHIP_TEST_TYPE IC_FT8006M +#define FLAG_TEST_IDC_BIT 15 +#define FLAG_BIT(x) (0x01 << (x)) +#define FTS_CHIP_IDC ((FTS_CHIP_TEST_TYPE & FLAG_BIT(FLAG_TEST_IDC_BIT)) == FLAG_BIT(FLAG_TEST_IDC_BIT)) +*/ + +#define TEST_OPEN_MAX_VALUE 255 +#define MAX_TEST_ITEM 20 +#define BYTES_PER_TIME 128 +#define FTS_TEST_STORE_DATA_SIZE (80*1024) +/*buff length*/ +#define BUFF_LEN_STORE_MSG_AREA (1024*10) +#define BUFF_LEN_MSG_AREA_LINE2 (1024*4) +#define BUFF_LEN_STORE_DATA_AREA (1024*80) +#define BUFF_LEN_TMP_BUFFER (1024*16) +#define BUFF_LEN_TESTRESULT_BUFFER (1024*80*5) + +/*----------------------------------------------------------- +Error Code for Comm +-----------------------------------------------------------*/ +#define ERROR_CODE_OK 0x00 +#define ERROR_CODE_INVALID_COMMAND 0x02 +#define ERROR_CODE_INVALID_PARAM 0x03 +#define ERROR_CODE_WAIT_RESPONSE_TIMEOUT 0x07 +#define ERROR_CODE_COMM_ERROR 0x0c +#define ERROR_CODE_ALLOCATE_BUFFER_ERROR 0x0d + +/*----------------------------------------------------------- +Test Status +-----------------------------------------------------------*/ +#define RESULT_NULL 0 +#define RESULT_PASS 1 +#define RESULT_NG 2 + +#define SELFTEST_INVALID 0 +#define SELFTEST_PASS 2 +#define SELFTEST_FAIL 1 + +/* + * factory test registers + */ +#define ENTER_WORK_FACTORY_RETRIES 5 +#define KEY_NUM_MAX 6 + +#define START_SCAN_RETRIES_INCELL 20 +#define START_SCAN_RETRIES_DELAY_INCELL 16 +#define FACTORY_TEST_RETRY 50 +#define FACTORY_TEST_DELAY 18 +#define FACTORY_TEST_RETRY_DELAY 100 + +#define DEVIDE_MODE_ADDR 0x00 +#define REG_FW_VERSION 0xA6 +#define REG_VA_TOUCH_THR 0x80 +#define REG_VKEY_TOUCH_THR 0x82 + +#define FACTORY_REG_LINE_ADDR 0x01 +#define FACTORY_REG_CHX_NUM 0x02 +#define FACTORY_REG_CHY_NUM 0x03 +#define FACTORY_REG_CLB 0x04 + +#define FACTORY_REG_DATA_SELECT 0x06 +#define FACTORY_REG_RAWBUF_SELECT 0x09 +#define FACTORY_REG_KEY_CBWIDTH 0x0B +#define FACTORY_REG_PARAM_UPDATE_STATE 0x0E +#define FACTORY_REG_SHORT_TEST_EN 0x0F +#define FACTORY_REG_SHORT_TEST_STATE 0x10 +#define FACTORY_REG_LCD_NOISE_START 0x11 +#define FACTORY_REG_LCD_NOISE_FRAME 0x12 +#define FACTORY_REG_LCD_NOISE_NUMBER 0x13 +#define FACTORY_REG_CB_ADDR_H 0x18 +#define FACTORY_REG_CB_ADDR_L 0x19 + +#define FACTORY_REG_LEFT_KEY 0x1E +#define FACTORY_REG_RIGHT_KEY 0x1F +#define FACTORY_REG_GIP_DRIVER_MODE 0x20 +#define FACTORY_REG_SOURCE_DRIVER_MODE 0x21 +#define FACTORY_REG_K1 0x31 +#define FACTORY_REG_K2 0x32 +#define FACTORY_REG_RAWDATA_ADDR 0x6A +#define FACTORY_REG_CB_ADDR 0x6E +#define FACTORY_REG_SHORT_ADDR 0x89 +#define FACTORY_REG_RAWDATA_TEST_EN 0x9E +#define FACTORY_REG_CB_TEST_EN 0x9F +#define FACTORY_REG_OPEN_TEST_EN 0xA0 +#define FACTORY_REG_AUTO_CAL_FLAG 0xEE + +#define TEST_RETVAL_00 0x00 +#define TEST_RETVAL_AA 0xAA + +/***************************************************************************** +* enumerations, structures and unions +*****************************************************************************/ +struct test_funcs { + u32 ic_series; + void (*init_testitem) (char *); + void (*init_basicthreshold) (char *); + void (*init_detailthreshold) (char *); + void (*set_testitem_sequence) (void); + bool(*start_test) (void); + int (*open_test) (void); + int (*short_test) (void); +}; + +struct test_ic_type { + char ic_name[MAX_IC_NAME_LEN]; + u8 len; + u32 ic_type; + short chipid; +}; + +/* + * selected_ic - ic type need test + * normalize - auto normalize or overall normalize + * tx_num - tx number + * rx_num - rx number + * channels_num - for ft6x36 + * key_num - actually key number used + * key_num_total - equal max key number + * used_max_tx_num - tx_num <= used_max_tx_num + * used_max_rx_num - rx_num <= used_max_rx_num + * left_key1/2/3 - left key flag + * right_key1/2/3 - right key flag + */ +struct screen_setting { + int selected_ic; + int normalize; + int tx_num; + int rx_num; + u8 channels_num; + u8 key_num; + u8 key_num_total; + u8 key_flag; + int used_max_tx_num; + int used_max_rx_num; + + bool left_key1; + bool left_key2; + bool left_key3; + bool left_key4; + bool right_key1; + bool right_key2; + bool right_key3; +}; + +/* + * itemtype - + * testnum - Test number + * testresult - Test result, NG\PASS\TESTING + * itemcode - Test item code + */ +struct test_item { + u8 itemtype; + u8 testnum; + u8 testresult; + u8 itemcode; +}; + +/* + * test_num - test item numbers + * testresult - test result write to testresult.txt + * testresult_len - length of testresult + * va_touch_thr - touch threshold in va + * key_touch_thr - touch threshold in key + * buffer - save detail data temporary + * ini_ic_name - ic name of ini file + * ini_keyword_num - keyword line number of ini file + * ini_data - save ini data as struct _ini_data + * func - test main function + * test_item - save whole test item + * screen_param - test basic parameter: tx/rx/key num... + */ +struct fts_test_data { + int test_num; + char *store_all_data; + char *tmp_buffer; + char *store_msg_area; + int len_store_msg_area; + char *msg_area_line2; + int len_msg_area_line2; + char *store_data_area; + int len_store_data_area; + u8 test_item_code; + int start_line; + int test_data_count; + char *testresult; + int testresult_len; + u8 va_touch_thr; + u8 key_touch_thr; + int *buffer; + char ini_ic_name[20]; + int ini_keyword_num; + struct _ini_data *ini_data; + struct test_funcs *func; + struct test_item test_item[MAX_TEST_ITEM]; + struct screen_setting screen_param; + struct detailthreshold_mcap mcap_detail_thr; + struct detailthreshold_scap scap_detail_thr; + struct detailthreshold_incell incell_detail_thr; +}; + +/*----------------------------------------------------------- + * IC corresponding code, each of the IC code is 16 bit, high 8 + * bit on behalf of the same series, low 8 bit on behalf of the specific IC + *-----------------------------------------------------------*/ +enum ic_type { + IC_FT5X36 = 0x0000, + IC_FT5X36i = 0x0001, + IC_FT3X16 = 0x0002, + IC_FT3X26 = 0x0003, + + IC_FT5X46 = 0x0100, + IC_FT5X46I = 0x0101, + IC_FT5526 = 0x0102, + IC_FT3X17 = 0x0103, + IC_FT5436 = 0x0104, + IC_FT3X27 = 0x0105, + IC_FT5526I = 0x0106, + IC_FT5416 = 0x0107, + IC_FT5426 = 0x0108, + IC_FT5435 = 0x0109, + IC_FT7681 = 0x010A, + IC_FT7661 = 0x010B, + IC_FT7511 = 0x010C, + IC_FT7421 = 0x010D, + IC_FT7311 = 0x010E, + + IC_FT6X06 = 0x0200, + IC_FT3X06 = 0x0201, + + IC_FT6X36 = 0x0300, + IC_FT3X07 = 0x0301, + IC_FT6416 = 0x0302, + IC_FT6426 = 0x0303, + IC_FT7401 = 0x0304, + IC_FT3407U = 0x0305, + IC_FT6236U = 0x0306, + IC_FT6436U = 0x0307, + IC_FT3267 = 0x0308, + IC_FT3367 = 0x0309, + + IC_FT5X16 = 0x0400, + IC_FT5X12 = 0x0401, + + IC_FT5506 = 0x0500, + IC_FT5606 = 0x0501, + IC_FT5816 = 0x0502, + + IC_FT5822 = 0x0600, + IC_FT5626 = 0x0601, + IC_FT5726 = 0x0602, + IC_FT5826B = 0x0603, + IC_FT3617 = 0x0604, + IC_FT3717 = 0x0605, + IC_FT7811 = 0x0606, + IC_FT5826S = 0x0607, + IC_FT3517U = 0x0608, + + IC_FT5306 = 0x0700, + IC_FT5406 = 0x0701, + + IC_FT3C47U = 0x0800, + + IC_FT3D47 = 0x0900, + + IC_FT5442 = 0x0A00, + + IC_FT3428U = 0x0B00, + + IC_FT8606 = 0x8000, + + IC_FT8716 = 0x8100, + IC_FT8716U = 0x8101, + IC_FT8613 = 0x8102, + IC_FT8716F = 0x8103, + + IC_FT8607 = 0x8200, + IC_FT8607U = 0x8201, + + IC_FT8707 = 0x8300, + + IC_FT8736 = 0x8400, + + IC_FTE716 = 0x8500, + + IC_FT8006M = 0x8600, + + IC_FTE736 = 0x8700, + + IC_FT8006U = 0x8800, + + IC_FT8201 = 0x8900, + + IC_FT8719 = 0x8A00, +}; + +enum normalize_type { + OVERALL_NORMALIZE = 0, + AUTO_NORMALIZE = 1, +}; + +enum NodeType { + NODE_INVALID_TYPE = 0, + NODE_VALID_TYPE = 1, + NODE_KEY_TYPE = 2, + NODE_AST_TYPE = 3, +}; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +extern struct test_funcs test_func_ft8719; +extern struct test_funcs *test_funcs_list[]; +extern struct test_ic_type ic_types[]; +extern struct fts_test_data test_data; + +int init_test_funcs(u32 ic_type); +u32 fts_ic_table_get_ic_code_from_ic_name(char *strIcName); +void sys_delay(int ms); +int focal_abs(int value); +unsigned char fts_i2c_read_write(unsigned char *writebuf, int writelen, + unsigned char *readbuf, int readlen); +int fts_test_i2c_read(u8 *writebuf, int writelen, u8 *readbuf, int readlen); +int fts_test_i2c_write(u8 *writebuf, int writelen); +int read_reg(u8 addr, u8 *val); +int write_reg(u8 addr, u8 val); +int enter_work_mode(void); +int enter_factory_mode(void); +int read_mass_data(u8 addr, int byte_num, int *buf); +int chip_clb_incell(void); +int start_scan_incell(void); +int wait_state_update(void); +int get_rawdata_incell(int *data); +int get_cb_incell(u16 saddr, int byte_num, int *cb_buf); +int weakshort_get_adc_data_incell(u8 retval, u8 ch_num, int byte_num, + int *adc_buf); +void show_data_incell(int *data, bool include_key); +bool compare_data_incell(int *data, int min, int max, int vk_min, int vk_max, + bool include_key); +bool compare_detailthreshold_data_incell(int *data, int *data_min, + int *data_max, bool include_key); +void save_testdata_incell(int *data, char *test_num, int index, u8 row, u8 col, + u8 item_count); +void fts_set_testitem(unsigned char ucitemcode); +void *fts_malloc(size_t size); +void fts_free_proc(void *p); + +#define fts_free(p) do {\ + if (p) {\ + fts_free_proc(p);\ + p = NULL;\ + } } while (0) + +#define FOCAL_TEST_DEBUG_EN 1 +#if (FOCAL_TEST_DEBUG_EN) +#define FTS_TEST_DBG(fmt, args...) do {printk("[FTS] [TEST]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) +#define FTS_TEST_FUNC_ENTER() printk("[FTS][TEST]%s: Enter(%d)\n", __func__, __LINE__) +#define FTS_TEST_FUNC_EXIT() printk("[FTS][TEST]%s: Exit(%d)\n", __func__, __LINE__) +#else +#define FTS_TEST_DBG(fmt, args...) do {} while (0) +#define FTS_TEST_FUNC_ENTER() +#define FTS_TEST_FUNC_EXIT() +#endif + +#define FTS_TEST_INFO(fmt, args...) do { printk(KERN_ERR "[FTS][TEST][Info]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) +#define FTS_TEST_ERROR(fmt, args...) do { printk(KERN_ERR "[FTS][TEST][Error]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) + +#define FTS_TEST_SAVE_INFO(fmt, args...) do { \ + if (test_data.testresult) { \ + test_data.testresult_len += snprintf( \ + test_data.testresult + test_data.testresult_len, \ + BUFF_LEN_TESTRESULT_BUFFER, \ + fmt, ##args);\ + }; \ +} while (0) + +#endif diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_detail_threshold.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_detail_threshold.c new file mode 100644 index 000000000000..d6bcc94243c1 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_detail_threshold.c @@ -0,0 +1,1903 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* +* File Name: focaltech_test_detail_threshold.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Detail Threshold for all IC +* +************************************************************************/ + +#include "focaltech_test.h" + +int malloc_struct_DetailThreshold(void) +{ + FTS_TEST_FUNC_ENTER(); + + /*malloc mcap detailthreshold */ + test_data.mcap_detail_thr.invalid_node = + (unsigned char (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * + sizeof(unsigned char)); + if (NULL == test_data.mcap_detail_thr.invalid_node) + goto ERR; + test_data.mcap_detail_thr.invalid_node_sc = + (unsigned char (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * + sizeof(unsigned char)); + if (NULL == test_data.mcap_detail_thr.invalid_node_sc) + goto ERR; + test_data.mcap_detail_thr.rawdata_test_min = + (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.mcap_detail_thr.rawdata_test_min) + goto ERR; + test_data.mcap_detail_thr.rawdata_test_max = + (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.mcap_detail_thr.rawdata_test_max) + goto ERR; + test_data.mcap_detail_thr.rawdata_test_low_min = + (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.mcap_detail_thr.rawdata_test_low_min) + goto ERR; + test_data.mcap_detail_thr.rawdata_test_low_max = + (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.mcap_detail_thr.rawdata_test_low_max) + goto ERR; + test_data.mcap_detail_thr.rawdata_test_high_min = + (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.mcap_detail_thr.rawdata_test_high_min) + goto ERR; + test_data.mcap_detail_thr.rawdata_test_high_max = + (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.mcap_detail_thr.rawdata_test_high_max) + goto ERR; + test_data.mcap_detail_thr.rx_linearity_test_max = + (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.mcap_detail_thr.rx_linearity_test_max) + goto ERR; + test_data.mcap_detail_thr.tx_linearity_test_max = + (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.mcap_detail_thr.tx_linearity_test_max) + goto ERR; + test_data.mcap_detail_thr.scap_rawdata_on_max = + (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.mcap_detail_thr.scap_rawdata_on_max) + goto ERR; + test_data.mcap_detail_thr.scap_rawdata_on_min = + (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.mcap_detail_thr.scap_rawdata_on_min) + goto ERR; + test_data.mcap_detail_thr.scap_rawdata_off_max = + (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.mcap_detail_thr.scap_rawdata_off_max) + goto ERR; + test_data.mcap_detail_thr.scap_rawdata_off_min = + (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.mcap_detail_thr.scap_rawdata_off_min) + goto ERR; + test_data.mcap_detail_thr.scap_cb_test_on_max = + (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(short)); + if (NULL == test_data.mcap_detail_thr.scap_cb_test_on_max) + goto ERR; + test_data.mcap_detail_thr.scap_cb_test_on_min = + (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(short)); + if (NULL == test_data.mcap_detail_thr.scap_cb_test_on_min) + goto ERR; + test_data.mcap_detail_thr.scap_cb_test_off_max = + (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(short)); + if (NULL == test_data.mcap_detail_thr.scap_cb_test_off_max) + goto ERR; + test_data.mcap_detail_thr.scap_cb_test_off_min = + (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(short)); + if (NULL == test_data.mcap_detail_thr.scap_cb_test_off_min) + goto ERR; + test_data.mcap_detail_thr.noise_test_coefficient = + (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.mcap_detail_thr.noise_test_coefficient) + goto ERR; + test_data.mcap_detail_thr.panel_differ_test_max = + (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.mcap_detail_thr.panel_differ_test_max) + goto ERR; + test_data.mcap_detail_thr.panel_differ_test_min = + (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.mcap_detail_thr.panel_differ_test_min) + goto ERR; + + /*malloc incell detailthreshold */ + test_data.incell_detail_thr.invalid_node = + fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.incell_detail_thr.invalid_node) + goto ERR; + test_data.incell_detail_thr.rawdata_test_min = + fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.incell_detail_thr.rawdata_test_min) + goto ERR; + test_data.incell_detail_thr.rawdata_test_max = + fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.incell_detail_thr.rawdata_test_max) + goto ERR; + test_data.incell_detail_thr.rawdata_test_b_frame_min = + fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.incell_detail_thr.rawdata_test_min) + goto ERR; + test_data.incell_detail_thr.rawdata_test_b_frame_max = + fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.incell_detail_thr.rawdata_test_max) + goto ERR; + test_data.incell_detail_thr.cb_test_min = + fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.incell_detail_thr.cb_test_min) + goto ERR; + test_data.incell_detail_thr.cb_test_max = + fts_malloc(NUM_MAX * sizeof(int)); + if (NULL == test_data.incell_detail_thr.cb_test_max) + goto ERR; + + FTS_TEST_FUNC_EXIT(); + + return 0; + +ERR: + FTS_TEST_ERROR("fts_malloc memory failed in function."); + return -ENOMEM; +} + +void free_struct_DetailThreshold(void) +{ + + /*free mcap detailthreshold */ + if (NULL != test_data.mcap_detail_thr.invalid_node) { + fts_free(test_data.mcap_detail_thr.invalid_node); + test_data.mcap_detail_thr.invalid_node = NULL; + } + if (NULL != test_data.mcap_detail_thr.invalid_node_sc) { + fts_free(test_data.mcap_detail_thr.invalid_node_sc); + test_data.mcap_detail_thr.invalid_node_sc = NULL; + } + if (NULL != test_data.mcap_detail_thr.rawdata_test_min) { + fts_free(test_data.mcap_detail_thr.rawdata_test_min); + } + if (NULL != test_data.mcap_detail_thr.rawdata_test_max) { + fts_free(test_data.mcap_detail_thr.rawdata_test_max); + } + if (NULL != test_data.mcap_detail_thr.rawdata_test_low_min) { + fts_free(test_data.mcap_detail_thr.rawdata_test_low_min); + } + if (NULL != test_data.mcap_detail_thr.rawdata_test_low_max) { + fts_free(test_data.mcap_detail_thr.rawdata_test_low_max); + } + if (NULL != test_data.mcap_detail_thr.rawdata_test_high_min) { + fts_free(test_data.mcap_detail_thr.rawdata_test_high_min); + } + if (NULL != test_data.mcap_detail_thr.rawdata_test_high_max) { + fts_free(test_data.mcap_detail_thr.rawdata_test_high_max); + } + if (NULL != test_data.mcap_detail_thr.rx_linearity_test_max) { + fts_free(test_data.mcap_detail_thr.rx_linearity_test_max); + } + if (NULL != test_data.mcap_detail_thr.tx_linearity_test_max) { + fts_free(test_data.mcap_detail_thr.tx_linearity_test_max); + } + if (NULL != test_data.mcap_detail_thr.scap_rawdata_on_max) { + fts_free(test_data.mcap_detail_thr.scap_rawdata_on_max); + } + if (NULL != test_data.mcap_detail_thr.scap_rawdata_on_min) { + fts_free(test_data.mcap_detail_thr.scap_rawdata_on_min); + } + if (NULL != test_data.mcap_detail_thr.scap_rawdata_off_max) { + fts_free(test_data.mcap_detail_thr.scap_rawdata_off_max); + } + if (NULL != test_data.mcap_detail_thr.scap_rawdata_off_min) { + fts_free(test_data.mcap_detail_thr.scap_rawdata_off_min); + } + if (NULL != test_data.mcap_detail_thr.scap_cb_test_on_max) { + fts_free(test_data.mcap_detail_thr.scap_cb_test_on_max); + } + if (NULL != test_data.mcap_detail_thr.scap_cb_test_on_min) { + fts_free(test_data.mcap_detail_thr.scap_cb_test_on_min); + } + if (NULL != test_data.mcap_detail_thr.scap_cb_test_off_max) { + fts_free(test_data.mcap_detail_thr.scap_cb_test_off_max); + } + if (NULL != test_data.mcap_detail_thr.scap_cb_test_off_min) { + fts_free(test_data.mcap_detail_thr.scap_cb_test_off_min); + } + if (NULL != test_data.mcap_detail_thr.noise_test_coefficient) { + fts_free(test_data.mcap_detail_thr.noise_test_coefficient); + test_data.mcap_detail_thr.noise_test_coefficient = NULL; + } + if (NULL != test_data.mcap_detail_thr.panel_differ_test_max) { + fts_free(test_data.mcap_detail_thr.panel_differ_test_max); + test_data.mcap_detail_thr.panel_differ_test_max = NULL; + } + if (NULL != test_data.mcap_detail_thr.panel_differ_test_min) { + fts_free(test_data.mcap_detail_thr.panel_differ_test_min); + test_data.mcap_detail_thr.panel_differ_test_min = NULL; + } + + /*free incell detailthreshold */ + if (NULL != test_data.incell_detail_thr.invalid_node) { + fts_free(test_data.incell_detail_thr.invalid_node); + test_data.incell_detail_thr.invalid_node = NULL; + } + if (NULL != test_data.incell_detail_thr.rawdata_test_min) { + fts_free(test_data.incell_detail_thr.rawdata_test_min); + test_data.incell_detail_thr.rawdata_test_min = NULL; + } + if (NULL != test_data.incell_detail_thr.rawdata_test_max) { + fts_free(test_data.incell_detail_thr.rawdata_test_max); + test_data.incell_detail_thr.rawdata_test_max = NULL; + } + if (NULL != test_data.incell_detail_thr.rawdata_test_b_frame_min) { + fts_free(test_data.incell_detail_thr.rawdata_test_b_frame_min); + test_data.incell_detail_thr.rawdata_test_b_frame_min = NULL; + } + if (NULL != test_data.incell_detail_thr.rawdata_test_b_frame_max) { + fts_free(test_data.incell_detail_thr.rawdata_test_b_frame_max); + test_data.incell_detail_thr.rawdata_test_b_frame_max = NULL; + } + if (NULL != test_data.incell_detail_thr.cb_test_min) { + fts_free(test_data.incell_detail_thr.cb_test_min); + test_data.incell_detail_thr.cb_test_min = NULL; + } + if (NULL != test_data.incell_detail_thr.cb_test_max) { + fts_free(test_data.incell_detail_thr.cb_test_max); + test_data.incell_detail_thr.cb_test_max = NULL; + } +} + +void OnInit_InvalidNode(char *strIniFile) +{ + + char str[MAX_PATH] = { 0 }, strTemp[MAX_PATH] = { + 0}; + int i = 0, j = 0; + FTS_TEST_FUNC_ENTER(); + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + snprintf(strTemp, MAX_PATH, "InvalidNode[%d][%d]", (i + 1), + (j + 1)); + + GetPrivateProfileString("INVALID_NODE", strTemp, "1", + str, strIniFile); + if (fts_atoi(str) == 0) { + test_data.mcap_detail_thr.invalid_node[i][j] = + 0; + test_data.incell_detail_thr.invalid_node[i * + test_data. + screen_param. + rx_num + + j] = + 0; + FTS_TEST_DBG("node (%d, %d)", (i + 1), (j + 1)); + + } else if (fts_atoi(str) == 2) { + test_data.mcap_detail_thr.invalid_node[i][j] = + 2; + test_data.incell_detail_thr.invalid_node[i * + test_data. + screen_param. + rx_num + + j] = + 2; + } else { + test_data.mcap_detail_thr.invalid_node[i][j] = + 1; + test_data.incell_detail_thr.invalid_node[i * + test_data. + screen_param. + rx_num + + j] = + 1; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + snprintf(strTemp, MAX_PATH, "InvalidNodeS[%d][%d]", (i + 1), + (j + 1)); + GetPrivateProfileString("INVALID_NODES", strTemp, "1", + str, strIniFile); + if (fts_atoi(str) == 0) { + test_data.mcap_detail_thr. + invalid_node_sc[i][j] = 0; + } else if (fts_atoi(str) == 2) { + test_data.mcap_detail_thr. + invalid_node_sc[i][j] = 2; + } else + test_data.mcap_detail_thr. + invalid_node_sc[i][j] = 1; + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_RawDataTest(char *strIniFile) +{ + char str[128]; + char strTemp[MAX_PATH]; + char strValue[MAX_PATH]; + int MaxValue, MinValue, B_MaxValue, B_MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + if ((TEST_ICSERIES(test_data.screen_param.selected_ic) == + TEST_ICSERIES(IC_FT8716)) + || (TEST_ICSERIES(test_data.screen_param.selected_ic) == + TEST_ICSERIES(IC_FT8736)) + || (TEST_ICSERIES(test_data.screen_param.selected_ic) == + TEST_ICSERIES(IC_FTE716))) { + return; + } + + /*RawData Test */ + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "10000", + str, strIniFile); + MaxValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_BFrame_Max", + "5000", str, strIniFile); + B_MaxValue = fts_atoi(str); + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + test_data.mcap_detail_thr.rawdata_test_max[i][j] = + MaxValue; + test_data.incell_detail_thr.rawdata_test_max[i * + test_data. + screen_param. + rx_num + + j] = + MaxValue; + test_data.incell_detail_thr.rawdata_test_b_frame_max[i * + test_data. + screen_param. + rx_num + + + j] + = B_MaxValue; + } + } + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + snprintf(str, 128, "RawData_Max_Tx%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "111", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + rawdata_test_max[i][k] = + (short)(fts_atoi(str_tmp)); + test_data.incell_detail_thr.rawdata_test_max[i * + test_data. + screen_param. + rx_num + + + k] + = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "7000", + str, strIniFile); + MinValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_BFrame_Min", + "11000", str, strIniFile); + B_MinValue = fts_atoi(str); + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + test_data.mcap_detail_thr.rawdata_test_min[i][j] = + MinValue; + test_data.incell_detail_thr.rawdata_test_min[i * + test_data. + screen_param. + rx_num + + j] = + MinValue; + test_data.incell_detail_thr.rawdata_test_b_frame_min[i * + test_data. + screen_param. + rx_num + + + j] + = B_MinValue; + } + } + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + snprintf(str, 128, "RawData_Min_Tx%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + rawdata_test_min[i][k] = + (short)(fts_atoi(str_tmp)); + test_data.incell_detail_thr.rawdata_test_min[i * + test_data. + screen_param. + rx_num + + + k] + = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + /*RawData Test Low */ + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Max", + "15000", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + test_data.mcap_detail_thr.rawdata_test_low_max[i][j] = + MaxValue; + } + } + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + snprintf(str, 128, "RawData_Max_Low_Tx%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + rawdata_test_low_max[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Min", + "3000", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + test_data.mcap_detail_thr.rawdata_test_low_min[i][j] = + MinValue; + } + } + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + snprintf(str, 128, "RawData_Min_Low_Tx%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + rawdata_test_low_min[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + /*RawData Test High */ + GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Max", + "15000", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + test_data.mcap_detail_thr.rawdata_test_high_max[i][j] = + MaxValue; + } + } + GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Min", + "3000", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + test_data.mcap_detail_thr.rawdata_test_high_min[i][j] = + MinValue; + } + } + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + snprintf(str, 128, "RawData_Max_High_Tx%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + rawdata_test_high_max[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + snprintf(str, 128, "RawData_Min_High_Tx%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + rawdata_test_high_min[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_SCapRawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + /*SCapRawDataTest_OFF */ + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Min", + "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Max", + "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + /*Max */ + for (i = 0; i < 2; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr.scap_rawdata_off_max[i][j] = + MaxValue; + } + } + for (i = 0; i < 2; i++) { + snprintf(str, 128, "ScapRawData_OFF_Max_%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + scap_rawdata_off_max[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + /*Min */ + for (i = 0; i < 2; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr.scap_rawdata_off_min[i][j] = + MinValue; + } + } + for (i = 0; i < 2; i++) { + snprintf(str, 128, "ScapRawData_OFF_Min_%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + scap_rawdata_off_min[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + /*ON*/ GetPrivateProfileString("Basic_Threshold", + "SCapRawDataTest_ON_Min", "150", str, + strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Max", + "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + /*Max */ + for (i = 0; i < 2; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr.scap_rawdata_on_max[i][j] = + MaxValue; + } + } + for (i = 0; i < 2; i++) { + snprintf(str, 128, "ScapRawData_ON_Max_%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + scap_rawdata_on_max[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + /*Min */ + for (i = 0; i < 2; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr.scap_rawdata_on_min[i][j] = + MinValue; + } + } + for (i = 0; i < 2; i++) { + snprintf(str, 128, "ScapRawData_ON_Min_%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + scap_rawdata_on_min[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_SCapCbTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + /*SCapCbTest_ON */ + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Min", "0", + str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Max", "240", + str, strIniFile); + MaxValue = fts_atoi(str); + + /*Max */ + for (i = 0; i < 2; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr.scap_cb_test_on_max[i][j] = + MaxValue; + } + } + for (i = 0; i < 2; i++) { + snprintf(str, 128, "ScapCB_ON_Max_%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + scap_cb_test_on_max[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + /*Min */ + for (i = 0; i < 2; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr.scap_cb_test_on_min[i][j] = + MinValue; + } + } + for (i = 0; i < 2; i++) { + snprintf(str, 128, "ScapCB_ON_Min_%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + scap_cb_test_on_min[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + /*SCapCbTest_OFF */ + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Min", "0", + str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Max", "240", + str, strIniFile); + MaxValue = fts_atoi(str); + /*Max */ + for (i = 0; i < 2; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr.scap_cb_test_off_max[i][j] = + MaxValue; + } + } + for (i = 0; i < 2; i++) { + snprintf(str, 128, "ScapCB_OFF_Max_%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + scap_cb_test_off_max[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + /*Min */ + for (i = 0; i < 2; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr.scap_cb_test_off_min[i][j] = + MinValue; + } + } + for (i = 0; i < 2; i++) { + snprintf(str, 128, "ScapCB_OFF_Min_%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + scap_cb_test_off_min[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_PanelDifferTest(char *strIniFile) +{ + + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + int index = 0; + int k = 0, i = 0, j = 0; + char str_tmp[128]; + + FTS_TEST_FUNC_ENTER(); + GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Max", + "1000", str, strIniFile); + MaxValue = fts_atoi(str); + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + test_data.mcap_detail_thr.panel_differ_test_max[i][j] = + MaxValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + snprintf(str, 128, "Panel_Differ_Max_Tx%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + panel_differ_test_max[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Min", "150", + str, strIniFile); + MinValue = fts_atoi(str); + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + test_data.mcap_detail_thr.panel_differ_test_min[i][j] = + MinValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + snprintf(str, 128, "Panel_Differ_Min_Tx%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + panel_differ_test_min[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); + +} + +void OnInit_DThreshold_RxLinearityTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + GetPrivateProfileString("Basic_Threshold", "RxLinearityTest_Max", "50", + str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < test_data.screen_param.used_max_tx_num; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr.rx_linearity_test_max[i][j] = + MaxValue; + } + } + + for (i = 0; i < test_data.screen_param.used_max_tx_num; i++) { + snprintf(str, 128, "Rx_Linearity_Max_Tx%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "111", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + rx_linearity_test_max[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_TxLinearityTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + GetPrivateProfileString("Basic_Threshold", "TxLinearityTest_Max", "50", + str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < test_data.screen_param.used_max_tx_num; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr.tx_linearity_test_max[i][j] = + MaxValue; + } + } + + for (i = 0; i < test_data.screen_param.used_max_tx_num; i++) { + snprintf(str, 128, "Tx_Linearity_Max_Tx%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "111", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + tx_linearity_test_max[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_ForceTouch_SCapRawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + GetPrivateProfileString("Basic_Threshold", + "ForceTouch_SCapRawDataTest_OFF_Min", "150", + str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", + "ForceTouch_SCapRawDataTest_OFF_Max", "1000", + str, strIniFile); + MaxValue = fts_atoi(str); + for (i = 0; i < 1; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr. + ForceTouch_SCapRawDataTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + snprintf(str, 128, "ForceTouch_ScapRawData_OFF_Max_%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + ForceTouch_SCapRawDataTest_OFF_Max[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + for (i = 0; i < 1; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr. + ForceTouch_SCapRawDataTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + snprintf(str, 128, "ForceTouch_ScapRawData_OFF_Min_%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + ForceTouch_SCapRawDataTest_OFF_Min[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + GetPrivateProfileString("Basic_Threshold", + "ForceTouch_SCapRawDataTest_ON_Min", "150", str, + strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", + "ForceTouch_SCapRawDataTest_ON_Max", "1000", + str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < 1; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr. + ForceTouch_SCapRawDataTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + snprintf(str, 128, "ForceTouch_ScapRawData_ON_Max_%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + ForceTouch_SCapRawDataTest_ON_Max[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + for (i = 0; i < 1; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr. + ForceTouch_SCapRawDataTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + snprintf(str, 128, "ForceTouch_ScapRawData_ON_Min_%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + ForceTouch_SCapRawDataTest_ON_Min[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_ForceTouch_SCapCbTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + GetPrivateProfileString("Basic_Threshold", + "ForceTouch_SCapCbTest_ON_Min", "0", str, + strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", + "ForceTouch_SCapCbTest_ON_Max", "240", str, + strIniFile); + MaxValue = fts_atoi(str); + for (i = 0; i < 1; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr. + ForceTouch_SCapCbTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + snprintf(str, 128, "ForceTouch_ScapCB_ON_Max_%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + ForceTouch_SCapCbTest_ON_Max[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + for (i = 0; i < 1; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr. + ForceTouch_SCapCbTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + snprintf(str, 128, "ForceTouch_ScapCB_ON_Min_%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + FTS_TEST_DBG("%s\r", strTemp); + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + ForceTouch_SCapCbTest_ON_Min[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + GetPrivateProfileString("Basic_Threshold", + "ForceTouch_SCapCbTest_OFF_Min", "0", str, + strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", + "ForceTouch_SCapCbTest_OFF_Max", "240", str, + strIniFile); + MaxValue = fts_atoi(str); + for (i = 0; i < 1; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr. + ForceTouch_SCapCbTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + snprintf(str, 128, "ForceTouch_ScapCB_OFF_Max_%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + ForceTouch_SCapCbTest_OFF_Max[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + for (i = 0; i < 1; i++) { + for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) { + test_data.mcap_detail_thr. + ForceTouch_SCapCbTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + snprintf(str, 128, "ForceTouch_ScapCB_OFF_Min_%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.mcap_detail_thr. + ForceTouch_SCapCbTest_OFF_Min[i][k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_CBTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue, MaxValue_Vkey, MinValue_Vkey; + int ChannelNumTest_ChannelXNum, ChannelNumTest_ChannelYNum; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + if ((TEST_ICSERIES(test_data.screen_param.selected_ic) == + TEST_ICSERIES(IC_FT8606))) { + return; + } + + GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, + strIniFile); + MaxValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "CBTest_Max_Vkey", "100", + str, strIniFile); + MaxValue_Vkey = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", + "15", str, strIniFile); + ChannelNumTest_ChannelXNum = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", + "24", str, strIniFile); + ChannelNumTest_ChannelYNum = fts_atoi(str); + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + test_data.incell_detail_thr.cb_test_max[i * + test_data. + screen_param. + rx_num + j] = + MaxValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + test_data.incell_detail_thr.cb_test_max[i * + test_data. + screen_param. + rx_num + + j] = + MaxValue_Vkey; + } + } + } + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + snprintf(str, 128, "CB_Max_Tx%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.incell_detail_thr.cb_test_max[i * + test_data. + screen_param. + rx_num + + k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, + strIniFile); + MinValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "CBTest_Min_Vkey", "3", str, + strIniFile); + MinValue_Vkey = fts_atoi(str); + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + test_data.incell_detail_thr.cb_test_min[i * + test_data. + screen_param. + rx_num + j] = + MinValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + test_data.incell_detail_thr.cb_test_min[i * + test_data. + screen_param. + rx_num + + j] = + MinValue_Vkey; + } + } + } + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + snprintf(str, 128, "CB_Min_Tx%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.incell_detail_thr.cb_test_min[i * + test_data. + screen_param. + rx_num + + k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_AllButtonCBTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + if ((TEST_ICSERIES(test_data.screen_param.selected_ic) == + TEST_ICSERIES(IC_FT8606))) { + return; + } + + GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, + strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + test_data.incell_detail_thr.cb_test_max[i * + test_data. + screen_param. + rx_num + j] = + MaxValue; + } + } + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + snprintf(str, 128, "CB_Max_Tx%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.incell_detail_thr.cb_test_max[i * + test_data. + screen_param. + rx_num + + k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, + strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + test_data.incell_detail_thr.cb_test_min[i * + test_data. + screen_param. + rx_num + j] = + MinValue; + } + } + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + snprintf(str, 128, "CB_Min_Tx%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.incell_detail_thr.cb_test_min[i * + test_data. + screen_param. + rx_num + + k] = + (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnThreshold_VkAndVaRawDataSeparateTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue, MaxValue_Vkey, MinValue_Vkey; + int ChannelNumTest_ChannelXNum, ChannelNumTest_ChannelYNum; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + if ((TEST_ICSERIES(test_data.screen_param.selected_ic) != + TEST_ICSERIES(IC_FT8716)) + && (TEST_ICSERIES(test_data.screen_param.selected_ic) != + TEST_ICSERIES(IC_FT8736)) + && (TEST_ICSERIES(test_data.screen_param.selected_ic) != + TEST_ICSERIES(IC_FTE716))) { + return; + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "11000", + str, strIniFile); + MaxValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max_VKey", + "11000", str, strIniFile); + MaxValue_Vkey = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", + "15", str, strIniFile); + ChannelNumTest_ChannelXNum = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", + "24", str, strIniFile); + ChannelNumTest_ChannelYNum = fts_atoi(str); + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + test_data.incell_detail_thr.rawdata_test_max[i * + test_data. + screen_param. + rx_num + + j] = + MaxValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + test_data.incell_detail_thr.rawdata_test_max[i * + test_data. + screen_param. + rx_num + + + j] + = MaxValue_Vkey; + } + } + } + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + snprintf(str, 128, "RawData_Max_Tx%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.incell_detail_thr.rawdata_test_max[i * + test_data. + screen_param. + rx_num + + + k] + = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "5000", + str, strIniFile); + MinValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min_VKey", + "5000", str, strIniFile); + MinValue_Vkey = fts_atoi(str); + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + test_data.incell_detail_thr.rawdata_test_min[i * + test_data. + screen_param. + rx_num + + j] = + MinValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < test_data.screen_param.rx_num; j++) { + test_data.incell_detail_thr.rawdata_test_min[i * + test_data. + screen_param. + rx_num + + + j] + = MinValue_Vkey; + } + } + } + + for (i = 0; i < test_data.screen_param.tx_num + 1; i++) { + snprintf(str, 128, "RawData_Min_Tx%d", (i + 1)); + dividerPos = + GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, + strIniFile); + snprintf(strValue, MAX_PATH, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + test_data.incell_detail_thr.rawdata_test_min[i * + test_data. + screen_param. + rx_num + + + k] + = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + FTS_TEST_FUNC_EXIT(); +} diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_detail_threshold.h b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_detail_threshold.h new file mode 100644 index 000000000000..55dd16d24c69 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_detail_threshold.h @@ -0,0 +1,108 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* +* File Name: focaltech_test_detail_threshold.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Detail Threshold for all IC +* +************************************************************************/ + +#ifndef _DETAIL_THRESHOLD_H +#define _DETAIL_THRESHOLD_H + +#define TX_NUM_MAX 60 +#define RX_NUM_MAX 60 +#define NUM_MAX ((TX_NUM_MAX)*(RX_NUM_MAX)) +#define MAX_PATH 256 +#define BUFFER_LENGTH 512 +#define MAX_TEST_ITEM 20 +#define MAX_GRAPH_ITEM 20 +#define MAX_CHANNEL_NUM 144 + +#define FORCETOUCH_ROW 1 + +struct detailthreshold_incell { + int *invalid_node; + int *rawdata_test_min; + int *rawdata_test_max; + int *rawdata_test_b_frame_min; + int *rawdata_test_b_frame_max; + int *cb_test_min; + int *cb_test_max; +}; +struct detailthreshold_mcap { + unsigned char (*invalid_node)[RX_NUM_MAX]; + unsigned char (*invalid_node_sc)[RX_NUM_MAX]; + int (*rawdata_test_min)[RX_NUM_MAX]; + int (*rawdata_test_max)[RX_NUM_MAX]; + int (*rawdata_test_low_min)[RX_NUM_MAX]; + int (*rawdata_test_low_max)[RX_NUM_MAX]; + int (*rawdata_test_high_min)[RX_NUM_MAX]; + int (*rawdata_test_high_max)[RX_NUM_MAX]; + int (*rx_linearity_test_max)[RX_NUM_MAX]; + int (*tx_linearity_test_max)[RX_NUM_MAX]; + int (*panel_differ_test_max)[RX_NUM_MAX]; + int (*panel_differ_test_min)[RX_NUM_MAX]; + int (*scap_rawdata_on_max)[RX_NUM_MAX]; + int (*scap_rawdata_on_min)[RX_NUM_MAX]; + int (*scap_rawdata_off_max)[RX_NUM_MAX]; + int (*scap_rawdata_off_min)[RX_NUM_MAX]; + short (*scap_cb_test_on_max)[RX_NUM_MAX]; + short (*scap_cb_test_on_min)[RX_NUM_MAX]; + short (*scap_cb_test_off_max)[RX_NUM_MAX]; + short (*scap_cb_test_off_min)[RX_NUM_MAX]; + int (*noise_test_coefficient)[RX_NUM_MAX]; + + int ForceTouch_SCapRawDataTest_ON_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_ON_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_OFF_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_OFF_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_ON_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_ON_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_OFF_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_OFF_Min[FORCETOUCH_ROW][RX_NUM_MAX]; +}; + +struct detailthreshold_scap { + int TempData[MAX_CHANNEL_NUM]; + int rawdata_test_max[MAX_CHANNEL_NUM]; + int rawdata_test_min[MAX_CHANNEL_NUM]; + int CiTest_Max[MAX_CHANNEL_NUM]; + int CiTest_Min[MAX_CHANNEL_NUM]; + int DeltaCiTest_Base[MAX_CHANNEL_NUM]; + int DeltaCiTest_AnotherBase1[MAX_CHANNEL_NUM]; + int DeltaCiTest_AnotherBase2[MAX_CHANNEL_NUM]; + int CiDeviationTest_Base[MAX_CHANNEL_NUM]; + + int NoiseTest_Max[MAX_CHANNEL_NUM]; + int DeltaCxTest_Sort[MAX_CHANNEL_NUM]; + int DeltaCxTest_Area[MAX_CHANNEL_NUM]; + + int cb_test_max[MAX_CHANNEL_NUM]; + int cb_test_min[MAX_CHANNEL_NUM]; + int DeltaCbTest_Base[MAX_CHANNEL_NUM]; + int DifferTest_Base[MAX_CHANNEL_NUM]; + int CBDeviationTest_Base[MAX_CHANNEL_NUM]; + int K1DifferTest_Base[MAX_CHANNEL_NUM]; +}; + +void OnInit_InvalidNode(char *strIniFile); +void OnInit_DThreshold_RawDataTest(char *strIniFile); +void OnInit_DThreshold_SCapRawDataTest(char *strIniFile); +void OnInit_DThreshold_SCapCbTest(char *strIniFile); +void OnInit_DThreshold_ForceTouch_SCapRawDataTest(char *strIniFile); +void OnInit_DThreshold_ForceTouch_SCapCbTest(char *strIniFile); +void OnInit_DThreshold_RxLinearityTest(char *strIniFile); +void OnInit_DThreshold_TxLinearityTest(char *strIniFile); +void OnInit_DThreshold_PanelDifferTest(char *strIniFile); +void OnInit_DThreshold_CBTest(char *strIniFile); +void OnInit_DThreshold_AllButtonCBTest(char *strIniFile); +void OnThreshold_VkAndVaRawDataSeparateTest(char *strIniFile); +void OnGetTestItemParam(char *strItemName, char *strIniFile, int iDefautValue); +int malloc_struct_DetailThreshold(void); +void free_struct_DetailThreshold(void); +#endif diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_ini.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_ini.c new file mode 100644 index 000000000000..dd46a5093566 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_ini.c @@ -0,0 +1,431 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* +* File Name: focaltech_test_ini.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: parsing function of INI file +* +************************************************************************/ +#include "focaltech_test.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +/* '[' ']':Section Symbol-Can be defined according to the special need to change */ +const char CFG_SSL = '['; +const char CFG_SSR = ']'; +const char CFG_NIS = ':'; /* Separator between name and index */ +const char CFG_NTS = '#'; /* annotator */ +const char CFG_EQS = '='; /* The equal sign */ +#define ERROR_RETURN_VALUE -1 +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +/* Works only for digits and letters, but small and fast */ +#define TOLOWER(x) ((x) | 0x20) +int fts_strncmp(const char *cs, const char *ct, size_t count) +{ + u8 c1 = 0, c2 = 0; + + while (count) { + c1 = TOLOWER(*cs++); + c2 = TOLOWER(*ct++); + if (c1 != c2) + return c1 < c2 ? -1 : 1; + if (!c1) + break; + count--; + } + + return 0; +} + +/************************************************************* +Function: Get the value of key +Input: char * filedata; char * section; char * key +Output: char * value¡¡key +Return: 0 SUCCESS +-1 can not find section +-2 can not find key +-10 File open failed +-12 File read failed +-14 File format error +-22 Out of buffer size +Note: +*************************************************************/ +int ini_get_key(char *filedata, char *section, char *key, char *value) +{ + int i = 0; + int ret = -2; + for (i = 0; i < test_data.ini_keyword_num; i++) { + if (fts_strncmp(section, test_data.ini_data[i].section_name, test_data.ini_data[i].section_name_len) != + 0) + continue; + if (strlen(key) == test_data.ini_data[i].key_name_len) { + if (fts_strncmp(key, test_data.ini_data[i].key_name, test_data.ini_data[i].key_name_len) == 0) { + memcpy(value, test_data.ini_data[i].key_value, test_data.ini_data[i].key_value_len); + ret = 0; + break; + } + } + } + + return ret; +} + +/************************************************************* +Function: Remove empty character on the right side of the string +Input: char * buf --String pointer +Output: +Return: String pointer +Note: +*************************************************************/ +char *ini_str_trim_r(char *buf) +{ + int len, i; + char tmp[512]; + + memset(tmp, 0, sizeof(tmp)); + len = strlen(buf); + + memset(tmp, 0x00, len); + for (i = 0; i < len; i++) { + if (buf[i] != ' ') + break; + } + if (i < len) { + strlcpy(tmp, (buf + i), sizeof(tmp)); + } + strlcpy(buf, tmp, sizeof(buf)); + return buf; +} + +/************************************************************* +Function: Remove empty character on the left side of the string +Input: char * buf --String pointer +Output: +Return: String pointer +Note: +*************************************************************/ +char *ini_str_trim_l(char *buf) +{ + int len, i; + char tmp[512]; + + memset(tmp, 0, sizeof(tmp)); + len = strlen(buf); + + memset(tmp, 0x00, len); + + for (i = 0; i < len; i++) { + if (buf[len - i - 1] != ' ') + break; + } + if (i < len) { + strlcpy(tmp, buf, sizeof(tmp)); + } + strlcpy(buf, tmp, sizeof(buf)); + return buf; +} + +/************************************************************* +Function: Read a line from file +Input: FILE *fp; int maxlen-- Maximum length of buffer +Output: char *buffer -- A string +Return: >0 Actual read length +-1 End of file +-2 Error reading file +Note: +*************************************************************/ +static int ini_file_get_line(char *filedata, char *buffer, int maxlen) +{ + int i = 0; + int j = 0; + int iRetNum = -1; + char ch1 = '\0'; + + for (i = 0, j = 0; i < maxlen; j++) { + ch1 = filedata[j]; + iRetNum = j + 1; + if (ch1 == '\n' || ch1 == '\r') { + ch1 = filedata[j + 1]; + if (ch1 == '\n' || ch1 == '\r') { + iRetNum++; + } + + break; + } else if (ch1 == 0x00) { + iRetNum = -1; + break; + } else { + buffer[i++] = ch1; + } + } + buffer[i] = '\0'; + + return iRetNum; +} + +int isspace(int x) +{ + if (x == ' ' || x == '\t' || x == '\n' || x == '\f' || x == '\b' || x == '\r') + return 1; + else + return 0; +} + +int isdigit(int x) +{ + if (x <= '9' && x >= '0') + return 1; + else + return 0; +} + +static long fts_atol(char *nptr) +{ + int c; /* current char */ + long total; /* current total */ + int sign; /* if ''-'', then negative, otherwise positive */ + /* skip whitespace */ + while (isspace((int)(unsigned char)*nptr)) + ++nptr; + c = (int)(unsigned char)*nptr++; + sign = c; /* save sign indication */ + if (c == '-' || c == '+') + c = (int)(unsigned char)*nptr++; /* skip sign */ + total = 0; + while (isdigit(c)) { + total = 10 * total + (c - '0'); /* accumulate digit */ + c = (int)(unsigned char)*nptr++; /* get next char */ + } + if (sign == '-') + return -total; + else + return total; /* return result, negated if necessary */ +} + +int fts_atoi(char *nptr) +{ + return (int)fts_atol(nptr); +} + +int init_key_data(void) +{ + int i = 0; + + FTS_TEST_FUNC_ENTER(); + + test_data.ini_keyword_num = 0; + + for (i = 0; i < MAX_KEYWORD_NUM; i++) { + memset(test_data.ini_data[i].section_name, 0, MAX_KEYWORD_NAME_LEN); + memset(test_data.ini_data[i].key_name, 0, MAX_KEYWORD_NAME_LEN); + memset(test_data.ini_data[i].key_value, 0, MAX_KEYWORD_VALUE_LEN); + test_data.ini_data[i].section_name_len = 0; + test_data.ini_data[i].key_name_len = 0; + test_data.ini_data[i].key_value_len = 0; + } + + FTS_TEST_FUNC_EXIT(); + return 1; +} + +int print_key_data(void) +{ + int i = 0; + + FTS_TEST_DBG("test_data.ini_keyword_num = %d", test_data.ini_keyword_num); + for (i = 0; i < MAX_KEYWORD_NUM; i++) { + + FTS_TEST_DBG("section_name_%d:%s, key_name_%d:%s\n,key_value_%d:%s", i, + test_data.ini_data[i].section_name, i, test_data.ini_data[i].key_name, i, + test_data.ini_data[i].key_value); + } + + return 0; +} + +/************************************************************* +Function: Read all the parameters and values to the structure. +Return: Returns the number of key. If you go wrong, return a negative number. +-10 File open failed +-12 File read failed + -14 File format error +Note: +*************************************************************/ +int ini_get_key_data(char *filedata) +{ + char buf1[MAX_CFG_BUF + 1] = { 0 }; + int n = 0; + int ret = 0; + int dataoff = 0; + int iEqualSign = 0; + int i = 0; + char tmsection_name[MAX_CFG_BUF + 1] = { 0 }; + + FTS_TEST_FUNC_ENTER(); + ret = init_key_data(); + if (ret < 0) { + FTS_TEST_ERROR("init key data failed"); + return ERROR_RETURN_VALUE; + } + test_data.ini_keyword_num = 0; + while (1) { /*find section */ + ret = CFG_ERR_READ_FILE; + n = ini_file_get_line(filedata + dataoff, buf1, MAX_CFG_BUF); + if (n < -1) + goto cfg_scts_end; + if (n < 0) + break; /* file end */ + if (n >= MAX_CFG_BUF) { + FTS_TEST_ERROR("Error Length:%d\n", n); + goto cfg_scts_end; + } + dataoff += n; + n = strlen(ini_str_trim_l(ini_str_trim_r(buf1))); + if (n == 0 || buf1[0] == CFG_NTS) + continue; /* A blank line or a comment line */ + ret = CFG_ERR_FILE_FORMAT; + if (n > 2 && ((buf1[0] == CFG_SSL && buf1[n - 1] != CFG_SSR))) { + FTS_TEST_ERROR("Bad Section:%s\n", buf1); + goto cfg_scts_end; + } + + if (buf1[0] == CFG_SSL) { + test_data.ini_data[test_data.ini_keyword_num].section_name_len = n - 2; + if (MAX_KEYWORD_NAME_LEN < test_data.ini_data[test_data.ini_keyword_num].section_name_len) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEYWORD_NAME_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + buf1[n - 1] = 0x00; + strlcpy((char *)tmsection_name, buf1 + 1, sizeof(tmsection_name)); + + continue; + } + strlcpy(test_data.ini_data[test_data.ini_keyword_num].section_name, tmsection_name, + sizeof(test_data.ini_data[test_data.ini_keyword_num].section_name)); + test_data.ini_data[test_data.ini_keyword_num].section_name_len = strlen(tmsection_name); + + iEqualSign = 0; + for (i = 0; i < n; i++) { + if (buf1[i] == CFG_EQS) { + iEqualSign = i; + break; + } + } + if (0 == iEqualSign) + continue; + /* before equal sign is assigned to the key name */ + test_data.ini_data[test_data.ini_keyword_num].key_name_len = iEqualSign; + if (MAX_KEYWORD_NAME_LEN < test_data.ini_data[test_data.ini_keyword_num].key_name_len) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEYWORD_NAME_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + memcpy(test_data.ini_data[test_data.ini_keyword_num].key_name, buf1, + test_data.ini_data[test_data.ini_keyword_num].key_name_len); + + /* After equal sign is assigned to the key value */ + test_data.ini_data[test_data.ini_keyword_num].key_value_len = n - iEqualSign - 1; + if (MAX_KEYWORD_VALUE_LEN < test_data.ini_data[test_data.ini_keyword_num].key_value_len) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEYWORD_VALUE_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + memcpy(test_data.ini_data[test_data.ini_keyword_num].key_value, buf1 + iEqualSign + 1, + test_data.ini_data[test_data.ini_keyword_num].key_value_len); + + ret = test_data.ini_keyword_num; + test_data.ini_keyword_num++; /*Parameter number accumulation */ + if (MAX_KEYWORD_NUM < test_data.ini_keyword_num) { + ret = CFG_ERR_TOO_MANY_KEY_NUM; + FTS_TEST_ERROR("MAX_KEYWORD_NUM: CFG_ERR_TOO_MANY_KEY_NUM\n"); + goto cfg_scts_end; + } + } + + FTS_TEST_FUNC_EXIT(); + + return 0; + +cfg_scts_end: + + FTS_TEST_FUNC_EXIT(); + return ret; +} + +int GetPrivateProfileString(char *section, char *ItemName, char *defaultvalue, char *returnValue, char *IniFile) +{ + char value[512] = { 0 }; + int len = 0; + + if (NULL == returnValue) { + FTS_TEST_DBG("return Value==NULL"); + return 0; + } + if (ini_get_key(IniFile, section, ItemName, value) < 0) { + if (NULL != defaultvalue) + memcpy(value, defaultvalue, strlen(defaultvalue)); + snprintf(returnValue, strlen(returnValue), "%s", value); + return 0; + } else { + len = snprintf(returnValue, strlen(returnValue), "%s", value); + } + + return len; +} + + +int init_interface(char *ini) +{ + char str[MAX_KEYWORD_VALUE_LEN] = { 0 }; + u32 ic_type = 0xFF; + + FTS_TEST_FUNC_ENTER(); + + /* IC type */ + GetPrivateProfileString("Interface", "IC_Type", "FT5X36", str, ini); + ic_type = fts_ic_table_get_ic_code_from_ic_name(str); + if (0 == ic_type) { + FTS_TEST_ERROR("get ic code fail"); + return -EINVAL; + } + test_data.screen_param.selected_ic = ic_type; + /*Get IC Name */ + snprintf(test_data.ini_ic_name, sizeof(test_data.ini_ic_name), "%s", str); + FTS_TEST_INFO("IC Name:%s IC Code:0x%02x. ", test_data.ini_ic_name, test_data.screen_param.selected_ic); + + /* Normalize Type */ + GetPrivateProfileString("Interface", "Normalize_Type", 0, str, ini); + test_data.screen_param.normalize = fts_atoi(str); + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +/************************************************************************ +* Name: set_param_data +* Brief: load Config. Set IC series, init test items, init basic threshold, int detailThreshold, and set order of test items +* Input: TestParamData, from ini file. +* Output: none +* Return: 0. No sense, just according to the old format. +***********************************************************************/ + +/* + * fts_test_get_testparam_from_ini - get test parameters from ini + * + * read, parse the configuration file, initialize the test variable + * + * return 0 if succuss, else errro code + */ + diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_ini.h b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_ini.h new file mode 100644 index 000000000000..18c774d42af2 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_ini.h @@ -0,0 +1,56 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* +* File Name: focaltech_test_ini.h +* +* Author: Host Driver Team +* +* Created: 2016-08-01 +* +* Abstract: parsing function of INI file +* +************************************************************************/ +#ifndef _INI_H +#define _INI_H +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define MAX_KEYWORD_NUM 500 +#define MAX_KEYWORD_NAME_LEN 50 +#define MAX_KEYWORD_VALUE_LEN 512 +#define MAX_CFG_BUF 480 + +#define SUCCESS 0 + +#define CFG_ERR_OPEN_FILE -10 +#define CFG_ERR_CREATE_FILE -11 +#define CFG_ERR_READ_FILE -12 +#define CFG_ERR_WRITE_FILE -13 +#define CFG_ERR_FILE_FORMAT -14 +#define CFG_ERR_TOO_MANY_KEY_NUM -15 +#define CFG_ERR_OUT_OF_LEN -16 + +/***************************************************************************** +* enumerations, structures and unions +*****************************************************************************/ +struct _ini_data { + char section_name[MAX_KEYWORD_NAME_LEN]; + char key_name[MAX_KEYWORD_NAME_LEN]; + char key_value[MAX_KEYWORD_VALUE_LEN]; + int section_name_len; + int key_name_len; + int key_value_len; +}; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +int fts_atoi(char *nptr); +char *ini_str_trim_r(char *buf); +char *ini_str_trim_l(char *buf); +int GetPrivateProfileString(char *section, char *ItemName, char *defaultvalue, char *returnValue, char *IniFile); +int fts_test_get_testparam_from_ini(char *config_name); +int fts_test_get_ini_size(char *config_name); +int fts_test_read_ini_data(char *config_name, char *config_buf); + +#endif /* _INI_H */ diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/supported_ic/Makefile b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/supported_ic/Makefile new file mode 100644 index 000000000000..e164798e7b65 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/supported_ic/Makefile @@ -0,0 +1,6 @@ +#drivers/input/touchscreen/focaltech_ts/focaltech_test +# +# Makefile for test module +# +# Linux driver folder +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_ft8719.o
\ No newline at end of file diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/supported_ic/focaltech_test_ft8719.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/supported_ic/focaltech_test_ft8719.c new file mode 100644 index 000000000000..7bde6ca65f5e --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/supported_ic/focaltech_test_ft8719.c @@ -0,0 +1,968 @@ +/************************************************************************ +* Copyright (C) 2012-2018, Focaltech Systems (R), All Rights Reserved. +* Copyright (C) 2020 XiaoMi, Inc. +* +* File Name: Focaltech_test_ft8719.c +* +* Author: Focaltech Driver Team +* +* Created: 2017-12-01 +* +* Abstract: test item for FT8719 +* +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "../focaltech_test.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FACTORY_REG_VGH02 0x20 +#define FACTORY_REG_VGL02 0x21 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +struct ft8719_test_item { + bool rawdata_test; + bool cb_test; + bool short_test; + bool lcd_noise_test; + bool open_test; +}; + +struct ft8719_basic_threshold { + int rawdata_test_min; + int rawdata_test_max; + bool cb_test_va_check; + int cb_test_min; + int cb_test_max; + bool cb_test_vk_check; + int cb_test_min_vk; + int cb_test_max_vk; + int short_res_min; + int lcd_noise_test_frame; + int lcd_noise_test_max; + int lcd_noise_coefficient; + int lcd_noise_coefficient_key; + int open_test_cb_min; + bool open_test_k1_check; + int open_test_k1; + bool open_test_k2_check; + int open_test_k2; +}; + +enum test_item_ft8719 { + CODE_FT8719_ENTER_FACTORY_MODE = 0, + CODE_FT8719_RAWDATA_TEST = 7, + CODE_FT8719_CB_TEST = 12, + CODE_FT8719_SHORT_CIRCUIT_TEST = 14, + CODE_FT8719_LCD_NOISE_TEST = 15, + CODE_FT8719_OPEN_TEST = 24, +}; + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +struct ft8719_basic_threshold ft8719_basic_thr; +struct ft8719_test_item ft8719_item; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static int ft8719_get_key_num(void) +{ + int ret = 0; + int i = 0; + u8 keyval = 0; + + test_data.screen_param.key_num = 0; + for (i = 0; i < 3; i++) { + ret = read_reg(FACTORY_REG_LEFT_KEY, &keyval); + if (0 == ret) { + if (((keyval >> 0) & 0x01)) { + test_data.screen_param.left_key1 = true; + ++test_data.screen_param.key_num; + } + if (((keyval >> 1) & 0x01)) { + test_data.screen_param.left_key2 = true; + ++test_data.screen_param.key_num; + } + if (((keyval >> 2) & 0x01)) { + test_data.screen_param.left_key3 = true; + ++test_data.screen_param.key_num; + } + if (((keyval >> 3) & 0x01)) { + test_data.screen_param.left_key4 = true; + ++test_data.screen_param.key_num; + } + break; + } else { + sys_delay(150); + continue; + } + } + + if (i >= 3) { + FTS_TEST_SAVE_INFO("can't get left key num"); + return ret; + } + return 0; +} + +/************************************************************************ + * Name: ft8719_enter_factory_mode + * Brief: Check whether TP can enter Factory Mode, and do some thing + * Input: none + * Output: none + * Return: return 0 if success, otherwise return error code + ***********************************************************************/ +static int ft8719_enter_factory_mode(void) +{ + int ret = 0; + + ret = enter_factory_mode(); + if (ret < 0) { + FTS_TEST_SAVE_INFO("enter factory mode fail, can't get tx/rx num"); + return ret; + } + ret = ft8719_get_key_num(); + if (ret < 0) { + FTS_TEST_SAVE_INFO("get key num fail"); + return ret; + } + + return ret; +} + +/************************************************************************ + * Name: ft8719_short_test + * Brief: Get short circuit test mode data, judge whether + * there is a short circuit + * Input: test_result + * Output: test_result, PASS or FAIL + * Return: return 0 if success, otherwise return error code + ***********************************************************************/ +static int ft8719_short_test(bool *test_result) +{ + int ret = 0; + bool temp_result = false; + int res_min = 0; + int byte_num = 0; + int tx_num = 0; + int rx_num = 0; + int key_num = 0; + int ch_num = 0; + int row = 0; + int col = 0; + int tmp_adc = 0; + int min = 0; + int max = 0; + int *adcdata = NULL; + + FTS_TEST_SAVE_INFO("==============================Test Item: -------- Short Circuit Test"); + + tx_num = test_data.screen_param.tx_num; + rx_num = test_data.screen_param.rx_num; + key_num = test_data.screen_param.key_num_total; + memset(test_data.buffer, 0, ((tx_num + 1) * rx_num) * sizeof(int)); + adcdata = test_data.buffer; + + ret = enter_factory_mode(); + if (ret) { + FTS_TEST_SAVE_INFO("Failed to Enter factory mode,ret=%d\n", ret); + goto TEST_END; + } + + byte_num = (tx_num * rx_num + key_num) * 2; + ch_num = rx_num; + ret = weakshort_get_adc_data_incell(TEST_RETVAL_AA, ch_num, byte_num, adcdata); + if (ret) { + FTS_TEST_SAVE_INFO("Failed to get AdcData,ret=%d\n", ret); + goto TEST_END; + } + + /* calculate resistor */ + for (row = 0; row < tx_num + 1; ++row) { + for (col = 0; col < rx_num; ++col) { + tmp_adc = adcdata[row * rx_num + col]; + if (tmp_adc < 50) { + adcdata[row * rx_num + col] = -1; + continue; + } else if (tmp_adc < 200) { + tmp_adc = 200; + } + adcdata[row * rx_num + col] = 252000 / (tmp_adc - 120) - 60; + } + } + + show_data_incell(adcdata, true); + + /* analyze data */ + res_min = ft8719_basic_thr.short_res_min; + min = res_min; + max = 100000000; + FTS_TEST_SAVE_INFO("Short Circuit test, Set_Range=(%d, %d)\n", min, max); + temp_result = compare_data_incell(adcdata, min, max, min, max, true); + + save_testdata_incell(adcdata, "Short Circuit Test", 0, tx_num + 1, rx_num, 1); + +TEST_END: + if (temp_result) { + FTS_TEST_SAVE_INFO("\n==========Short Circuit Test is OK!\r\n"); + *test_result = true; + } else { + FTS_TEST_SAVE_INFO("\n==========Short Circuit Test is NG!\r\n"); + *test_result = false; + } + + return ret; +} + +/************************************************************************ + * Name: ft8719_open_test + * Brief: Check if channel is open + * Input: test_result + * Output: test_result, PASS or FAIL + * Return: return 0 if success, otherwise return error code + ***********************************************************************/ +static int ft8719_open_test(bool *test_result) +{ + int ret = 0; + bool tmp_result = false; + int min = 0; + int max = 0; + u8 reg_vgh = 0; + u8 reg_vgl = 0; + u8 k1 = 0; + u8 k2 = 0; + int tx_num = 0; + int rx_num = 0; + int cb_byte_num = 0; + int *opendata = NULL; + + FTS_TEST_SAVE_INFO("\n\n==============================Test Item: -------- Open Test"); + + tx_num = test_data.screen_param.tx_num; + rx_num = test_data.screen_param.rx_num; + memset(test_data.buffer, 0, ((tx_num + 1) * rx_num) * sizeof(int)); + opendata = test_data.buffer; + + ret = enter_factory_mode(); + if (ret) { + FTS_TEST_SAVE_INFO("\r\nEnter Factory fail"); + goto TEST_ERR_FACTORY; + } + + /* open test enable */ + ret = write_reg(FACTORY_REG_OPEN_TEST_EN, 0x01); + if (ret) { + FTS_TEST_SAVE_INFO("\r\nopen test enable fail"); + goto TEST_ERR_FACTORY; + } + + /* backup defaul value */ + ret = read_reg(FACTORY_REG_VGH02, ®_vgh); + if (ret) { + FTS_TEST_SAVE_INFO("\r\nread reg 0x20 fail"); + goto TEST_ERR_FACTORY; + } + ret = read_reg(FACTORY_REG_VGL02, ®_vgl); + if (ret) { + FTS_TEST_SAVE_INFO("\r\nread reg 0x21 fail"); + goto TEST_ERR_FACTORY; + } + if (ft8719_basic_thr.open_test_k1_check) { + ret = read_reg(FACTORY_REG_K1, &k1); + if (ret) { + FTS_TEST_SAVE_INFO("\r\nread k1 fail"); + goto TEST_ERR_FACTORY; + } + } + if (ft8719_basic_thr.open_test_k2_check) { + ret = read_reg(FACTORY_REG_K2, &k2); + if (ret) { + FTS_TEST_SAVE_INFO("\r\nread k2 fail"); + goto TEST_ERR_FACTORY; + } + } + + /* set open test environment */ + ret = write_reg(FACTORY_REG_VGH02, 0x01); + if (ret) { + FTS_TEST_SAVE_INFO("\r\nwrite reg 0x20 fail"); + goto TEST_ERR; + } + + ret = write_reg(FACTORY_REG_VGL02, 0x01); + if (ret) { + FTS_TEST_SAVE_INFO("\r\nwrite reg 0x21 fail"); + goto TEST_ERR; + } + + if (ft8719_basic_thr.open_test_k1_check) { + ret = write_reg(FACTORY_REG_K1, ft8719_basic_thr.open_test_k1); + if (ret) { + FTS_TEST_SAVE_INFO("\r\nwrite reg k1 fail"); + goto TEST_ERR; + } + } + + if (ft8719_basic_thr.open_test_k2_check) { + ret = write_reg(FACTORY_REG_K2, ft8719_basic_thr.open_test_k2); + if (ret) { + FTS_TEST_SAVE_INFO("\r\nwrite reg k2 fail"); + goto TEST_ERR; + } + } + + /* wait fw state update before clb */ + wait_state_update(); + /* auto clb */ + ret = chip_clb_incell(); + if (ret) { + FTS_TEST_SAVE_INFO("\r\nauto clb fail"); + goto TEST_ERR; + } + + /* get cb data */ + cb_byte_num = tx_num * rx_num; + ret = get_cb_incell(0, cb_byte_num, opendata); + if (ret) { + FTS_TEST_SAVE_INFO("\r\nget CB fail"); + goto TEST_ERR; + } + + /* show open data to testresult.txt */ + show_data_incell(opendata, false); + + /* compare data */ + min = ft8719_basic_thr.open_test_cb_min; + max = TEST_OPEN_MAX_VALUE; + FTS_TEST_SAVE_INFO("\nOpen test, Set_Range=(%d, %d)\n", min, max); + tmp_result = compare_data_incell(opendata, min, max, 0, 0, false); + + /* save data to testdata.csv */ + save_testdata_incell(opendata, "Open Test", 0, tx_num, rx_num, 1); + +TEST_ERR: + /* restore reg */ + ret = write_reg(FACTORY_REG_VGH02, reg_vgh); + if (ret) { + tmp_result = false; + FTS_TEST_SAVE_INFO("\r\nrestore 0x20 reg fail"); + } + ret = write_reg(FACTORY_REG_VGL02, reg_vgl); + if (ret) { + tmp_result = false; + FTS_TEST_SAVE_INFO("\r\nrestore 0x21 reg fail"); + } + if (ft8719_basic_thr.open_test_k1_check) { + ret = write_reg(FACTORY_REG_K1, k1); + if (ret) { + tmp_result = false; + FTS_TEST_SAVE_INFO("\r\nrestore reg k1 fail"); + } + } + if (ft8719_basic_thr.open_test_k2_check) { + ret = write_reg(FACTORY_REG_K2, k2); + if (ret) { + tmp_result = false; + FTS_TEST_SAVE_INFO("\r\nrestore reg k2 fail"); + } + } + /* wait fw state update before clb */ + wait_state_update(); + /* auto clb */ + ret = chip_clb_incell(); + if (ret) { + tmp_result = false; + FTS_TEST_SAVE_INFO("\r\nauto clb fail"); + } + +TEST_ERR_FACTORY: + /* open test disable */ + ret = write_reg(FACTORY_REG_OPEN_TEST_EN, 0x0); + if (ret) { + FTS_TEST_SAVE_INFO("\r\nopen test disable fail"); + } + if (tmp_result) { + *test_result = true; + FTS_TEST_SAVE_INFO("\n==========Open Test is OK!\r\n"); + } else { + *test_result = false; + FTS_TEST_SAVE_INFO("\n==========Open Test is NG!\r\n"); + } + + return ret; +} + +/************************************************************************ + * Name: ft8719_cb_test + * Brief: TestItem: Cb Test. Check if Cb is within the range. + * Input: none + * Output: test_result, PASS or FAIL + * Return: return 0 if success, otherwise return error code + ***********************************************************************/ +static int ft8719_cb_test(bool *test_result) +{ + int ret = 0; + bool tmp_result = false; + int tx_num = 0; + int rx_num = 0; + int key_num = 0; + int cb_byte_num = 0; + bool include_key = false; + int *cbdata = NULL; + + FTS_TEST_SAVE_INFO("\n\n==============================Test Item: -------- CB Test"); + + tx_num = test_data.screen_param.tx_num; + rx_num = test_data.screen_param.rx_num; + key_num = test_data.screen_param.key_num_total; + memset(test_data.buffer, 0, ((tx_num + 1) * rx_num) * sizeof(int)); + cbdata = test_data.buffer; + + ret = enter_factory_mode(); + if (ret) { + FTS_TEST_SAVE_INFO(" Failed to Enter factory mode. Error Code: %d", ret); + goto TEST_ERR; + } + + /* cb test enable */ + ret = write_reg(FACTORY_REG_CB_TEST_EN, 0x01); + if (ret) { + FTS_TEST_SAVE_INFO("\r\ncb test enable fail"); + goto TEST_ERR; + } + + /* auto clb */ + ret = chip_clb_incell(); + if (ret) { + FTS_TEST_SAVE_INFO("\r\n//========= auto clb Failed !"); + goto TEST_ERR; + } + + cb_byte_num = tx_num * rx_num + key_num; + ret = get_cb_incell(0, cb_byte_num, cbdata); + if (ret) { + FTS_TEST_SAVE_INFO("Failed to get CB value...\n"); + goto TEST_ERR; + } + + /* Show CbData to testresult.txt */ + include_key = ft8719_basic_thr.cb_test_vk_check; + show_data_incell(cbdata, include_key); + + /* To Determine Cb if in Range or not */ + tmp_result = compare_detailthreshold_data_incell(cbdata, + test_data.incell_detail_thr.cb_test_min, + test_data.incell_detail_thr.cb_test_max, include_key); + + /* Save Test Data to testdata.csv */ + save_testdata_incell(cbdata, "CB Test", 0, tx_num + 1, rx_num, 1); + +TEST_ERR: + /* cb test disable */ + ret = write_reg(FACTORY_REG_CB_TEST_EN, 0x0); + if (ret) { + FTS_TEST_SAVE_INFO("\r\ncb test disable fail"); + } + if (tmp_result) { + *test_result = true; + FTS_TEST_SAVE_INFO("\n==========CB Test is OK!\r\n"); + } else { + *test_result = false; + FTS_TEST_SAVE_INFO("\n==========CB Test is NG!\r\n"); + } + + return ret; +} + +/************************************************************************ +* Name: ft8719_rawdata_test +* Brief: TestItem: RawDataTest. Check if MCAP RawData is within the range. +* Input: test_result +* Output: test_result, PASS or FAIL +* Return: return 0 if success, otherwise return error code +***********************************************************************/ +static int ft8719_rawdata_test(bool *test_result) +{ + int ret = 0; + bool tmp_result = false; + int tx_num = 0; + int rx_num = 0; + int key_num = 0; + int i = 0; + int *rawdata = NULL; + + FTS_TEST_SAVE_INFO("\n\n==============================Test Item: -------- Raw Data Test"); + tx_num = test_data.screen_param.tx_num; + rx_num = test_data.screen_param.rx_num; + key_num = test_data.screen_param.key_num_total; + memset(test_data.buffer, 0, ((tx_num + 1) * rx_num) * sizeof(int)); + rawdata = test_data.buffer; + + ret = enter_factory_mode(); + if (ret) { + FTS_TEST_SAVE_INFO("Failed to Enter factory mode,ret=%d", ret); + goto TEST_FAC_ERR; + } + + /* rawdata test enable */ + ret = write_reg(FACTORY_REG_RAWDATA_TEST_EN, 0x01); + if (ret) { + FTS_TEST_SAVE_INFO("\r\nrawdata test enable fail"); + goto TEST_FAC_ERR; + } + + /*********************GET RAWDATA*********************/ + for (i = 0; i < 3; i++) { + /* Lost 3 Frames, In order to obtain stable data */ + ret = get_rawdata_incell(rawdata); + } + if (ret) { + FTS_TEST_SAVE_INFO("Failed to get Raw Data!! Error Code: %d", ret); + return ret; + } + /* Show RawData to testresult.txt */ + show_data_incell(rawdata, true); + + /* To Determine RawData if in Range or not */ + tmp_result = compare_detailthreshold_data_incell(rawdata, + test_data.incell_detail_thr.rawdata_test_min, + test_data.incell_detail_thr.rawdata_test_max, true); + + /* Save Test Data to testdata.csv */ + save_testdata_incell(rawdata, "RawData Test", 0, tx_num + 1, rx_num, 1); + +TEST_FAC_ERR: + /* rawdata test enable */ + ret = write_reg(FACTORY_REG_RAWDATA_TEST_EN, 0x0); + if (ret) { + FTS_TEST_SAVE_INFO("\r\nrawdata test disable fail"); + } + if (tmp_result) { + *test_result = true; + FTS_TEST_SAVE_INFO("\n==========RawData Test is OK!\n"); + } else { + *test_result = false; + FTS_TEST_SAVE_INFO("\n==========RawData Test is NG!\n"); + } + return ret; +} + +/************************************************************************ + * Name: ft8719_lcdnoise_test + * Brief: TestItem: LCD NoiseTest. Check if Noise is within the range. + * Input: test_result + * Output: test_result, PASS or FAIL + * Return: return 0 if success, otherwise return error code + ***********************************************************************/ +static int ft8719_lcdnoise_test(bool *test_result) +{ + int ret = 0; + bool result_flag = false; + u8 old_mode = 0; + int row = 0; + int col = 0; + int value_min = 0; + int value_max = 0; + int vk_value_max = 0; + int retry = 0; + u8 status = 0xFF; + u8 noise_value_va = 0xFF; + u8 noise_value_vk = 0xFF; + int tx_num = 0; + int rx_num = 0; + int key_num = 0; + int frame_num = 0; + int lcdnoise_bytenum = 0; + int *lcdnoise = NULL; + + FTS_TEST_SAVE_INFO("\n\n==============================Test Item: -------- LCD Noise Test"); + + tx_num = test_data.screen_param.tx_num; + rx_num = test_data.screen_param.rx_num; + key_num = test_data.screen_param.key_num_total; + memset(test_data.buffer, 0, ((tx_num + 1) * rx_num) * sizeof(int)); + lcdnoise = test_data.buffer; + + ret = enter_factory_mode(); + if (ret) { + FTS_TEST_SAVE_INFO("Failed to Enter factory mode, ret:%d", ret); + goto TEST_END; + } + + /* switch to differ mode */ + ret = read_reg(FACTORY_REG_DATA_SELECT, &old_mode); + ret = write_reg(FACTORY_REG_DATA_SELECT, 0x01); + if (ret) { + FTS_TEST_SAVE_INFO("write data select fail"); + goto TEST_END; + } + sys_delay(FACTORY_TEST_DELAY); + + /* RawData Address Register Offset cleared */ + ret = write_reg(FACTORY_REG_LINE_ADDR, 0xAD); + if (ret) { + FTS_TEST_SAVE_INFO("write line addr register fail"); + goto TEST_END; + } + + /* set scan number */ + frame_num = ft8719_basic_thr.lcd_noise_test_frame; + FTS_TEST_DBG(" lcd_noise_test_frame:%d\n", frame_num); + ret = write_reg(FACTORY_REG_LCD_NOISE_FRAME, frame_num / 4); + if (ret) { + FTS_TEST_SAVE_INFO("write lcd noise frame fail"); + goto TEST_END; + } + + /* start test */ + ret = write_reg(FACTORY_REG_LCD_NOISE_START, 0x01); + if (ret) { + FTS_TEST_SAVE_INFO("write lcd noise start fail"); + goto TEST_END; + } + + /* check status */ + sys_delay(frame_num * FACTORY_TEST_DELAY / 2); + for (retry = 0; retry < FACTORY_TEST_RETRY; retry++) { + status = 0xFF; + ret = read_reg(FACTORY_REG_LCD_NOISE_START, &status); + if ((0 == ret) && (TEST_RETVAL_AA == status)) { + break; + } else { + FTS_TEST_DBG("reg%x=%x,retry:%d\n", FACTORY_REG_LCD_NOISE_START, status, retry); + } + sys_delay(FACTORY_TEST_RETRY_DELAY); + } + if (retry >= FACTORY_TEST_RETRY) { + FTS_TEST_SAVE_INFO("Scan Noise Time Out!"); + goto TEST_END; + } + + lcdnoise_bytenum = tx_num * rx_num * 2 + key_num * 2; + ret = read_mass_data(FACTORY_REG_RAWDATA_ADDR, lcdnoise_bytenum, lcdnoise); + if (ret) { + FTS_TEST_SAVE_INFO("Failed to Read Data.\n"); + goto TEST_END; + } + + for (row = 0; row < tx_num + 1; ++row) { + for (col = 0; col < rx_num; ++col) { + lcdnoise[row * rx_num + col] = focal_abs(lcdnoise[row * rx_num + col]); + } + } + + /* show and save data of lcd_noise to testresult.txt */ + show_data_incell(lcdnoise, true); + + /* analyze lcd noise data */ + noise_value_va = test_data.va_touch_thr; + noise_value_vk = test_data.key_touch_thr; + value_min = 0; + value_max = ft8719_basic_thr.lcd_noise_coefficient * noise_value_va * 32 / 100; + vk_value_max = ft8719_basic_thr.lcd_noise_coefficient_key * noise_value_vk * 32 / 100; + FTS_TEST_SAVE_INFO("VA_Set_Range=(%d, %d). VK_Set_Range=(%d, %d)\n", + value_min, value_max, value_min, vk_value_max); + result_flag = compare_data_incell(lcdnoise, value_min, value_max, value_min, vk_value_max, true); + + /* Save Test Data to csv */ + save_testdata_incell(lcdnoise, "LCD Noise Test", 0, tx_num + 1, rx_num, 1); + +TEST_END: + write_reg(FACTORY_REG_DATA_SELECT, old_mode); + write_reg(FACTORY_REG_LCD_NOISE_START, 0x00); + sys_delay(FACTORY_TEST_DELAY); + if (result_flag) { + FTS_TEST_SAVE_INFO("\n==========LCD Noise Test is OK!\r\n"); + *test_result = true; + } else { + FTS_TEST_SAVE_INFO("\n==========LCD Noise Test is NG!\r\n"); + *test_result = false; + } + + return ret; +} + +static bool start_test_ft8719(void) +{ + int ret = 0; + bool test_result = true; + bool temp_result = true; + int item_count = 0; + u8 item_code = 0; + + FTS_TEST_FUNC_ENTER(); + + if (0 == test_data.test_num) { + FTS_TEST_SAVE_INFO("test item == 0\n"); + return false; + } + + for (item_count = 0; item_count < test_data.test_num; item_count++) { + item_code = test_data.test_item[item_count].itemcode; + test_data.test_item_code = item_code; + + /* FT8719_ENTER_FACTORY_MODE */ + if (CODE_FT8719_ENTER_FACTORY_MODE == item_code) { + ret = ft8719_enter_factory_mode(); + if ((ret != 0) || (!temp_result)) { + test_result = false; + test_data.test_item[item_count].testresult = RESULT_NG; + break; /* if this item FAIL, no longer test. */ + } else + test_data.test_item[item_count].testresult = RESULT_PASS; + } + + /* FT8719_SHORT_TEST */ + if (CODE_FT8719_SHORT_CIRCUIT_TEST == item_code) { + ret = ft8719_short_test(&temp_result); + if ((ret != 0) || (!temp_result)) { + test_result = false; + test_data.test_item[item_count].testresult = RESULT_NG; + } else + test_data.test_item[item_count].testresult = RESULT_PASS; + } + + /* FT8719_Open_TEST */ + if (CODE_FT8719_OPEN_TEST == item_code) { + ret = ft8719_open_test(&temp_result); + if ((ret != 0) || (!temp_result)) { + test_result = false; + test_data.test_item[item_count].testresult = RESULT_NG; + } else + test_data.test_item[item_count].testresult = RESULT_PASS; + } + + /* FT8719_CB_TEST */ + if (CODE_FT8719_CB_TEST == item_code) { + ret = ft8719_cb_test(&temp_result); + if ((ret != 0) || (!temp_result)) { + test_result = false; + test_data.test_item[item_count].testresult = RESULT_NG; + } else + test_data.test_item[item_count].testresult = RESULT_PASS; + } + + /* FT8719_RAWDATA_TEST */ + if (CODE_FT8719_RAWDATA_TEST == item_code) { + ret = ft8719_rawdata_test(&temp_result); + if ((ret != 0) || (!temp_result)) { + test_result = false; + test_data.test_item[item_count].testresult = RESULT_NG; + } else + test_data.test_item[item_count].testresult = RESULT_PASS; + } + + /* FT8719_LCD_NOISE_TEST */ + if (CODE_FT8719_LCD_NOISE_TEST == item_code) { + ret = ft8719_lcdnoise_test(&temp_result); + if ((ret != 0) || (!temp_result)) { + test_result = false; + test_data.test_item[item_count].testresult = RESULT_NG; + } else + test_data.test_item[item_count].testresult = RESULT_PASS; + } + } + + return test_result; +} + +static int ft8719_open_selftest(void) +{ + int ret = SELFTEST_INVALID; + bool temp_result = true; + + FTS_TEST_FUNC_ENTER(); + + ret = ft8719_enter_factory_mode(); + if (ret != 0) { + ret = SELFTEST_INVALID; + goto end; + } + ret = ft8719_open_test(&temp_result); + if ((ret != 0) || (!temp_result)) { + ret = SELFTEST_FAIL; + } else + ret = SELFTEST_PASS; + + FTS_TEST_FUNC_EXIT(); +end: + return ret; +} + +static int ft8719_short_selftest(void) +{ + int ret = SELFTEST_INVALID; + bool temp_result = true; + + FTS_TEST_FUNC_ENTER(); + + ret = ft8719_enter_factory_mode(); + if ((ret != 0)) { + ret = SELFTEST_INVALID; + goto end; + } + ret = ft8719_short_test(&temp_result); + if ((ret != 0) || (!temp_result)) { + ret = SELFTEST_FAIL; + } else + ret = SELFTEST_PASS; + + FTS_TEST_FUNC_EXIT(); + +end: + return ret; +} + +static void init_basicthreshold_ft8719(char *ini) +{ + char str[MAX_KEYWORD_VALUE_LEN] = { 0 }; + + FTS_TEST_FUNC_ENTER(); + + /* RawData Test */ + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "5000", str, ini); + ft8719_basic_thr.rawdata_test_min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "11000", str, ini); + ft8719_basic_thr.rawdata_test_max = fts_atoi(str); + + /* CB Test */ + GetPrivateProfileString("Basic_Threshold", "CBTest_VA_Check", "1", str, ini); + ft8719_basic_thr.cb_test_va_check = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, ini); + ft8719_basic_thr.cb_test_min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "60", str, ini); + ft8719_basic_thr.cb_test_max = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_VKey_Check", "1", str, ini); + ft8719_basic_thr.cb_test_vk_check = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_Min_Vkey", "3", str, ini); + ft8719_basic_thr.cb_test_min_vk = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_Max_Vkey", "100", str, ini); + ft8719_basic_thr.cb_test_max_vk = fts_atoi(str); + + /* Short Circuit Test */ + GetPrivateProfileString("Basic_Threshold", "ShortCircuit_ResMin", "200", str, ini); + ft8719_basic_thr.short_res_min = fts_atoi(str); + + /* LCD Noise Test */ + GetPrivateProfileString("Basic_Threshold", "LCD_NoiseTest_Frame", "50", str, ini); + ft8719_basic_thr.lcd_noise_test_frame = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "LCD_NoiseTest_Max", "30", str, ini); + ft8719_basic_thr.lcd_noise_test_max = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "LCD_NoiseTest_Coefficient", "50", str, ini); + ft8719_basic_thr.lcd_noise_coefficient = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "LCD_NoiseTest_Coefficient_Key", "50", str, ini); + ft8719_basic_thr.lcd_noise_coefficient_key = fts_atoi(str); + + /* Open Test */ + GetPrivateProfileString("Basic_Threshold", "OpenTest_CBMin", "64", str, ini); + ft8719_basic_thr.open_test_cb_min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "OpenTest_Check_K1", "0", str, ini); + ft8719_basic_thr.open_test_k1_check = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "OpenTest_K1Threshold", "0", str, ini); + ft8719_basic_thr.open_test_k1 = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "OpenTest_Check_K2", "0", str, ini); + ft8719_basic_thr.open_test_k2_check = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "OpenTest_K2Threshold", "0", str, ini); + ft8719_basic_thr.open_test_k2 = fts_atoi(str); + + FTS_TEST_FUNC_EXIT(); +} + +static void init_testitem_ft8719(char *ini) +{ + char str[MAX_KEYWORD_VALUE_LEN] = { 0 }; + + FTS_TEST_FUNC_ENTER(); + + /* RawData Test */ + GetPrivateProfileString("TestItem", "RAWDATA_TEST", "1", str, ini); + ft8719_item.rawdata_test = fts_atoi(str); + + /* CB_TEST */ + GetPrivateProfileString("TestItem", "CB_TEST", "1", str, ini); + ft8719_item.cb_test = fts_atoi(str); + + /* SHORT_CIRCUIT_TEST */ + GetPrivateProfileString("TestItem", "SHORT_CIRCUIT_TEST", "0", str, ini); + ft8719_item.short_test = fts_atoi(str); + + /* LCD_NOISE_TEST */ + GetPrivateProfileString("TestItem", "LCD_NOISE_TEST", "0", str, ini); + ft8719_item.lcd_noise_test = fts_atoi(str); + + /* OPEN_TEST */ + GetPrivateProfileString("TestItem", "OPEN_TEST", "0", str, ini); + ft8719_item.open_test = fts_atoi(str); + + FTS_TEST_FUNC_EXIT(); +} + +static void init_detailthreshold_ft8719(char *ini) +{ + FTS_TEST_FUNC_ENTER(); + + OnInit_InvalidNode(ini); + OnInit_DThreshold_RawDataTest(ini); + OnInit_DThreshold_CBTest(ini); + + FTS_TEST_FUNC_EXIT(); +} + +static void set_testitem_sequence_ft8719(void) +{ + FTS_TEST_FUNC_ENTER(); + + test_data.test_num = 0; + /* Enter Factory Mode */ + fts_set_testitem(CODE_FT8719_ENTER_FACTORY_MODE); + + /* Short Test */ + if (ft8719_item.short_test == 1) { + fts_set_testitem(CODE_FT8719_SHORT_CIRCUIT_TEST); + } + + /* Open Test */ + if (ft8719_item.open_test == 1) { + fts_set_testitem(CODE_FT8719_OPEN_TEST); + } + + /* CB_TEST */ + if (ft8719_item.cb_test == 1) { + fts_set_testitem(CODE_FT8719_CB_TEST); + } + + /* RawData Test */ + if (ft8719_item.rawdata_test == 1) { + fts_set_testitem(CODE_FT8719_RAWDATA_TEST); + } + + /* LCD_NOISE_TEST */ + if (ft8719_item.lcd_noise_test == 1) { + fts_set_testitem(CODE_FT8719_LCD_NOISE_TEST); + } + + FTS_TEST_FUNC_EXIT(); +} + +struct test_funcs test_func_ft8719 = { + .ic_series = TEST_ICSERIES(IC_FT8719), + .init_testitem = init_testitem_ft8719, + .init_basicthreshold = init_basicthreshold_ft8719, + .init_detailthreshold = init_detailthreshold_ft8719, + .set_testitem_sequence = set_testitem_sequence_ft8719, + .start_test = start_test_ft8719, + .open_test = ft8719_open_selftest, + .short_test = ft8719_short_selftest, +}; diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/include/.gitignore b/drivers/input/touchscreen/focal_ft8719_d2t/include/.gitignore new file mode 100644 index 000000000000..232d23dd9b84 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/include/.gitignore @@ -0,0 +1 @@ +!*.i diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_ft8719_d2t.i b/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_ft8719_d2t.i new file mode 100644 index 000000000000..842b6d6c91cb --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_ft8719_d2t.i @@ -0,0 +1,6304 @@ +0x2, 0x2, 0x89, 0x2, 0xc3, 0xf7, 0xeb, 0xaa, 0x8, 0x0, 0x0, 0x2, 0xc3, 0xc4, + 0xd3, 0x22, 0xb2, 0x86, 0x22, 0x2, 0xc4, 0x64, 0x7d, 0x23, 0x2, 0x1a, 0x89, + 0x2, 0xc3, 0xc9, 0x2, 0x42, 0xcd, 0x22, 0x22, 0x2, 0x1d, 0x81, 0x2, 0x42, + 0xcd, 0x22, 0x22, 0x2, 0x67, 0xb3, 0x7d, 0x43, 0x7f, 0x10, 0x80, 0x7, 0x1b, + 0x44, 0x7a, 0xb, 0xb0, 0xb, 0x14, 0x4d, 0x44, 0x78, 0xf5, 0x22, 0xc2, 0x1a, + 0x22, 0x2, 0x67, 0xfb, 0xa2, 0x93, 0xe4, 0x33, 0x22, 0x2, 0x1e, 0x8, 0x0, + 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x0, 0x2, 0x60, 0x17, 0xff, 0xff, 0x2, 0xc6, + 0xd2, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x7c, 0xb7, 0x22, 0xff, + 0xff, 0x2, 0xc9, 0x8f, 0xca, 0xf8, 0x7f, 0x20, 0x80, 0xa, 0x7e, 0x1b, 0xf0, + 0x7a, 0x2b, 0xf0, 0xb, 0x34, 0xb, 0x54, 0x69, 0xff, 0xff, 0xfc, 0x7d, 0xef, + 0x1b, 0xe4, 0x79, 0xef, 0xff, 0xfc, 0x4d, 0xff, 0x78, 0xe6, 0x7f, 0x10, + 0xda, 0xf8, 0x22, 0xff, 0x0, 0x1, 0x2, 0x0, 0xff, 0x1, 0x2, 0x0, 0x1, 0xff, + 0x2, 0x0, 0x1, 0x2, 0xff, 0x7d, 0x23, 0xbe, 0x24, 0x0, 0x0, 0x48, 0x3, 0x7d, + 0x32, 0x22, 0x6d, 0x33, 0x9d, 0x32, 0x22, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, + 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, + 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, + 0xb, 0xb8, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, + 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, + 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, + 0x48, 0x7e, 0x37, 0x81, 0xed, 0x22, 0xdb, 0xf8, 0x24, 0x7, 0xd2, 0xd5, 0x2d, + 0x2a, 0x2b, 0xdb, 0xd4, 0x24, 0xe0, 0x1f, 0x13, 0xec, 0xff, 0xff, 0xff, + 0xff, 0xb, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1f, 0xff, 0xff, 0xf0, 0x6, + 0xc2, 0xd5, 0x7c, 0xb4, 0x30, 0xe7, 0x8, 0xb2, 0xd5, 0x6e, 0x24, 0xff, 0xff, + 0xb, 0x24, 0x7c, 0xb6, 0x30, 0xe7, 0x12, 0xb2, 0xd5, 0x6e, 0x34, 0xff, 0xff, + 0xb, 0x34, 0x8d, 0x32, 0x6e, 0x24, 0xff, 0xff, 0xb, 0x24, 0x80, 0x2, 0x8d, + 0x32, 0x30, 0xd5, 0x6, 0x6e, 0x34, 0xff, 0xff, 0xb, 0x34, 0x22, 0x7d, 0x51, + 0xad, 0x3, 0x7d, 0x2, 0x7d, 0x21, 0xad, 0x5, 0x2d, 0x12, 0xad, 0x35, 0x2d, + 0x21, 0x22, 0x7d, 0x2, 0xad, 0x31, 0xad, 0x10, 0x2d, 0x21, 0x22, 0x6d, 0x0, + 0x74, 0x10, 0x4d, 0x0, 0x78, 0xb, 0x4d, 0x22, 0x78, 0x27, 0x8d, 0x31, 0x7d, + 0x12, 0x6d, 0x22, 0x22, 0x7d, 0x43, 0x7d, 0x32, 0x6d, 0x22, 0x2f, 0x11, + 0x2d, 0x44, 0x50, 0x2, 0xa5, 0xf, 0xbf, 0x10, 0x40, 0x4, 0x9f, 0x10, 0xb, + 0x90, 0x14, 0x78, 0xed, 0x7f, 0x1, 0x6d, 0x22, 0x7d, 0x34, 0x22, 0x7d, 0x41, + 0x7d, 0x13, 0x8d, 0x24, 0x7d, 0x2, 0x2f, 0x0, 0x40, 0x4, 0xbd, 0x4, 0x40, + 0x4, 0x9d, 0x4, 0xb, 0x14, 0x14, 0x78, 0xf1, 0x7d, 0x23, 0x7d, 0x31, 0x7d, + 0x10, 0x6d, 0x0, 0x22, 0xc2, 0xd5, 0x7c, 0xb0, 0x30, 0xe7, 0x8, 0xb2, 0xd5, + 0x9f, 0x22, 0x9f, 0x20, 0x7f, 0x2, 0x7c, 0xb4, 0x30, 0xe7, 0x13, 0xb2, 0xd5, + 0x9f, 0x22, 0x9f, 0x21, 0x7f, 0x12, 0x12, 0x1, 0x6e, 0x9f, 0x22, 0x9f, 0x20, + 0x7f, 0x2, 0x80, 0x3, 0x12, 0x1, 0x6e, 0x30, 0xd5, 0x6, 0x9f, 0x22, 0x9f, + 0x21, 0x7f, 0x12, 0x22, 0x6c, 0xaa, 0x4d, 0x11, 0x68, 0x1a, 0x1e, 0x54, + 0x68, 0xe, 0xb, 0x38, 0x20, 0x1b, 0x18, 0x20, 0xb, 0x35, 0xb, 0x15, 0x1b, + 0x54, 0x78, 0xf2, 0x50, 0x6, 0x7e, 0x39, 0x40, 0x7a, 0x19, 0x40, 0x22, 0x6c, + 0xaa, 0xbe, 0x8, 0x0, 0x0, 0x68, 0x20, 0x1e, 0x54, 0xb, 0x54, 0x50, 0x16, + 0x7e, 0x1b, 0x80, 0x7a, 0xb, 0x80, 0xb, 0x1c, 0xb, 0xc, 0x80, 0xa, 0xb, + 0x1a, 0x40, 0x1b, 0xa, 0x40, 0xb, 0x1d, 0xb, 0xd, 0x1b, 0x54, 0x78, 0xf2, + 0x22, 0x6c, 0xaa, 0x4d, 0x11, 0x68, 0x1e, 0x1e, 0x54, 0x50, 0xc, 0x7e, 0x1b, + 0x0, 0x7a, 0x19, 0x0, 0x68, 0x12, 0xb, 0x1c, 0xb, 0x14, 0xb, 0x1a, 0x0, + 0x1b, 0x18, 0x0, 0xb, 0x1d, 0xb, 0x15, 0x1b, 0x54, 0x78, 0xf2, 0x22, 0x6c, + 0xaa, 0xbe, 0x8, 0x0, 0x0, 0x68, 0x1e, 0x1e, 0x54, 0x50, 0xc, 0x7e, 0x39, + 0x40, 0x7a, 0xb, 0x40, 0x68, 0x12, 0xb, 0x34, 0xb, 0xc, 0xb, 0x38, 0x20, + 0x1b, 0xa, 0x20, 0xb, 0x35, 0xb, 0xd, 0x1b, 0x54, 0x78, 0xf2, 0x22, 0x75, + 0x84, 0x1, 0x7e, 0x44, 0x9f, 0xff, 0xe4, 0x7a, 0x49, 0xb0, 0x1b, 0x44, 0x78, + 0xf9, 0x7e, 0xf8, 0x9b, 0xb1, 0x75, 0x14, 0x0, 0x75, 0x15, 0x0, 0xc2, 0x1c, + 0xc2, 0x1d, 0xc2, 0x1e, 0x75, 0xd, 0x0, 0x75, 0xe, 0x0, 0xc2, 0x2f, 0xc2, + 0x1f, 0xc2, 0x20, 0xc2, 0x21, 0xc2, 0x22, 0xc2, 0x23, 0xc2, 0x24, 0x75, + 0x18, 0x0, 0xc2, 0x25, 0xc2, 0x26, 0xc2, 0x30, 0xc2, 0x31, 0xd2, 0x32, 0xc2, + 0x27, 0xc2, 0x28, 0xc2, 0x14, 0xc2, 0x15, 0xc2, 0x16, 0xd2, 0x17, 0xc2, + 0x29, 0xc2, 0x2a, 0x75, 0x19, 0x6, 0xc2, 0xb, 0xc2, 0xc, 0xc2, 0xd, 0xc2, + 0xe, 0xc2, 0xf, 0xc2, 0x10, 0xd2, 0x11, 0xc2, 0x12, 0xc2, 0x13, 0xc2, 0x34, + 0xc2, 0x2b, 0xc2, 0x2c, 0xc2, 0x35, 0xc2, 0x36, 0xd2, 0x2d, 0xc2, 0x2e, + 0x7e, 0x4, 0x0, 0xff, 0x7e, 0x14, 0x5, 0xd4, 0xb, 0xa, 0x40, 0x5d, 0x44, + 0x68, 0x1a, 0x69, 0x20, 0x0, 0x2, 0xb, 0xe, 0xb, 0x44, 0x80, 0xa, 0x7e, 0xb, + 0xb0, 0x7a, 0x29, 0xb0, 0xb, 0x24, 0xb, 0xc, 0x1b, 0x44, 0x78, 0xf2, 0x80, + 0xdf, 0x2, 0x7, 0xfe, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, + 0x3, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x6, 0x0, 0x7, 0x0, 0x6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0x0, 0xa, 0x0, 0xc, 0x0, 0xc, 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0x0, 0xf, 0x0, 0x12, 0x0, 0x13, + 0x0, 0x12, 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x92, 0x0, 0x15, 0x0, 0x19, 0x0, 0x1b, 0x0, 0x1b, 0x0, 0x19, 0x0, 0x15, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe7, 0x0, 0x1c, 0x0, + 0x21, 0x0, 0x24, 0x0, 0x25, 0x0, 0x24, 0x0, 0x21, 0x0, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x58, 0x0, 0x24, 0x0, 0x2a, 0x0, 0x2e, 0x0, 0x30, + 0x0, 0x30, 0x0, 0x2e, 0x0, 0x2a, 0x0, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xe9, 0x0, 0x2d, 0x0, 0x34, 0x0, 0x39, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3c, 0x0, + 0x39, 0x0, 0x34, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9e, 0x0, 0x37, 0x0, + 0x3f, 0x0, 0x45, 0x0, 0x49, 0x0, 0x4b, 0x0, 0x4b, 0x0, 0x49, 0x0, 0x45, 0x0, + 0x3f, 0x0, 0x37, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0x0, 0x42, 0x0, 0x4b, 0x0, 0x52, 0x0, 0x57, + 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5a, 0x0, 0x57, 0x0, 0x52, 0x0, 0x4b, 0x0, 0x42, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x84, 0x0, 0x4e, 0x0, 0x58, 0x0, 0x60, 0x0, 0x66, 0x0, 0x6a, 0x0, 0x6c, 0x0, + 0x6c, 0x0, 0x6a, 0x0, 0x66, 0x0, 0x60, 0x0, 0x58, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbd, 0x0, 0x5b, 0x0, + 0x66, 0x0, 0x6f, 0x0, 0x76, 0x0, 0x7b, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x7e, 0x0, + 0x7b, 0x0, 0x76, 0x0, 0x6f, 0x0, 0x66, 0x0, 0x5b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x2a, 0x0, 0x69, 0x0, 0x75, 0x0, 0x7f, 0x0, + 0x87, 0x0, 0x8d, 0x0, 0x91, 0x0, 0x93, 0x0, 0x93, 0x0, 0x91, 0x0, 0x8d, 0x0, + 0x87, 0x0, 0x7f, 0x0, 0x75, 0x0, 0x69, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xcf, 0x0, 0x78, 0x0, 0x85, 0x0, 0x90, 0x0, 0x99, 0x0, 0xa0, 0x0, + 0xa5, 0x0, 0xa8, 0x0, 0xa9, 0x0, 0xa8, 0x0, 0xa5, 0x0, 0xa0, 0x0, 0x99, 0x0, + 0x90, 0x0, 0x85, 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb0, 0x0, + 0x88, 0x0, 0x96, 0x0, 0xa2, 0x0, 0xac, 0x0, 0xb4, 0x0, 0xba, 0x0, 0xbe, 0x0, + 0xc0, 0x0, 0xc0, 0x0, 0xbe, 0x0, 0xba, 0x0, 0xb4, 0x0, 0xac, 0x0, 0xa2, 0x0, + 0x96, 0x0, 0x88, 0x0, 0x0, 0x0, 0x0, 0xc, 0xd1, 0x0, 0x99, 0x0, 0xa8, 0x0, + 0xb5, 0x0, 0xc0, 0x0, 0xc9, 0x0, 0xd0, 0x0, 0xd5, 0x0, 0xd8, 0x0, 0xd9, 0x0, + 0xd8, 0x0, 0xd5, 0x0, 0xd0, 0x0, 0xc9, 0x0, 0xc0, 0x0, 0xb5, 0x0, 0xa8, 0x0, + 0x99, 0x0, 0x0, 0xf, 0x36, 0x0, 0xab, 0x0, 0xbb, 0x0, 0xc9, 0x0, 0xd5, 0x0, + 0xdf, 0x0, 0xe7, 0x0, 0xed, 0x0, 0xf1, 0x0, 0xf3, 0x0, 0xf3, 0x0, 0xf1, 0x0, + 0xed, 0x0, 0xe7, 0x0, 0xdf, 0x0, 0xd5, 0x0, 0xc9, 0x0, 0xbb, 0x0, 0xab, 0x0, + 0x1, 0x37, 0xd2, 0x3, 0x0, 0x1, 0x37, 0xd4, 0x0, 0x0, 0x1, 0x37, 0xde, 0xc, + 0x0, 0x1, 0x37, 0xe2, 0x3, 0x0, 0x1, 0x37, 0xe6, 0x0, 0x0, 0x2, 0x38, 0x72, + 0x44, 0x40, 0x0, 0x1, 0x38, 0x7b, 0x0, 0x0, 0x1, 0x38, 0x82, 0x0, 0x0, 0x1, + 0x38, 0x83, 0x0, 0x0, 0x2, 0x38, 0x9a, 0x0, 0x0, 0x0, 0x1, 0x38, 0x9c, 0x1, + 0x0, 0x1, 0x38, 0x9d, 0x0, 0x0, 0x1, 0x39, 0xfb, 0x1, 0x0, 0x1, 0x9b, 0x1f, + 0x0, 0x0, 0x2, 0x9b, 0x20, 0x0, 0x0, 0x0, 0x1, 0x59, 0x39, 0xff, 0x0, 0x2, + 0x59, 0xab, 0x0, 0x0, 0x0, 0x14, 0x9b, 0x43, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x0, + 0x14, 0x9b, 0x63, 0x3, 0x3, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, 0x3, + 0x3, 0x0, 0x0, 0x0, 0x1, 0x3, 0x1, 0x1, 0x1, 0x0, 0x1, 0x39, 0xfd, 0x0, 0x0, + 0x3c, 0x59, 0xad, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, 0xe9, 0x0, 0x0, 0x1, 0x59, 0xed, 0x11, + 0x0, 0x1, 0x2, 0x4a, 0x0, 0x0, 0x1, 0x2f, 0xb9, 0xff, 0x0, 0x1, 0x31, 0x5, + 0x0, 0x0, 0x2, 0x31, 0x6, 0x0, 0x0, 0x0, 0x4, 0x31, 0x8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x36, 0xa2, 0x0, 0x0, 0x2, 0x36, 0xf3, 0x0, 0x0, 0x0, 0x1, 0x39, + 0xe2, 0x1, 0x0, 0x1, 0x39, 0xdc, 0x0, 0x0, 0x6, 0x3, 0xeb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x3, 0xf1, 0x64, 0x0, 0x1, 0x39, 0x3a, 0xff, 0x0, + 0x1, 0x39, 0x3b, 0xff, 0x0, 0x1, 0x39, 0x3f, 0x64, 0x0, 0x1, 0x39, 0x40, + 0x0, 0x0, 0x1, 0x39, 0xe3, 0x0, 0x0, 0x4, 0x39, 0xe4, 0x0, 0x0, 0xc6, 0x0, + 0x0, 0x1, 0x9b, 0x7d, 0x0, 0x0, 0x2, 0x9b, 0x80, 0x0, 0x21, 0x0, 0x1, 0x9b, + 0x84, 0x1, 0x0, 0x1, 0x9b, 0x87, 0x4, 0x0, 0x1, 0x9b, 0xa8, 0x1, 0x0, 0x1, + 0x9b, 0xab, 0x0, 0x0, 0x2, 0x9b, 0xac, 0x0, 0x20, 0x0, 0x1, 0x9b, 0xae, 0x0, + 0x0, 0x1, 0x9b, 0xaf, 0x0, 0x0, 0x1, 0x9b, 0xb1, 0x0, 0x0, 0x1, 0x3, 0xd4, + 0xff, 0x0, 0x2, 0x3, 0xd8, 0x0, 0x0, 0x0, 0x1, 0x3, 0xdb, 0x0, 0x0, 0x1, + 0x39, 0xff, 0x0, 0x0, 0x4, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39, + 0xf8, 0x1, 0x0, 0x1, 0x3, 0xc9, 0x0, 0x0, 0x2, 0x96, 0x5a, 0x96, 0x60, 0x0, + 0x1, 0x9a, 0x20, 0x2, 0x0, 0x2, 0x9a, 0x21, 0x0, 0x0, 0x0, 0x1, 0x9a, 0x4b, + 0x0, 0x0, 0x2, 0x39, 0xf9, 0xc3, 0x0, 0x0, 0x4, 0x39, 0xe8, 0x0, 0x0, 0xc5, + 0x0, 0x0, 0x4, 0x8f, 0x18, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x4, 0x8f, 0x1c, 0x0, + 0x0, 0xa0, 0x0, 0x0, 0x4, 0x91, 0xfa, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x4, 0x39, + 0xed, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x4, 0x39, 0xf1, 0x0, 0x0, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x12, 0xcc, + 0x74, 0xe4, 0x7a, 0xb3, 0x9a, 0xbc, 0x7a, 0xb3, 0x9b, 0x1f, 0x2, 0x32, 0x20, + 0x12, 0x46, 0xf6, 0x12, 0x5f, 0xb3, 0x12, 0x4e, 0x37, 0x12, 0x3b, 0x89, + 0x12, 0x72, 0x42, 0x12, 0x7, 0xef, 0x12, 0x8, 0x2c, 0x12, 0x5b, 0x60, 0x7e, + 0xb3, 0x59, 0x62, 0x24, 0xfd, 0x68, 0x9, 0xb, 0xb1, 0x78, 0xf4, 0x12, 0xa, + 0x1c, 0x80, 0xef, 0x12, 0xb, 0x9, 0x80, 0xea, 0xca, 0x79, 0x7e, 0xb3, 0x38, + 0x7b, 0xbe, 0xb0, 0x1, 0x78, 0x2, 0x21, 0x8c, 0x7e, 0x1f, 0x39, 0xed, 0x69, + 0xa1, 0x0, 0x6, 0x5e, 0xa4, 0x8, 0x0, 0x68, 0x2, 0x21, 0x51, 0x6c, 0xee, + 0x12, 0x9, 0xf4, 0x7e, 0x34, 0xf4, 0xb1, 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x24, + 0x0, 0x6, 0x12, 0x9, 0x8f, 0x7d, 0xb3, 0xbe, 0xb4, 0x0, 0x6, 0x78, 0x4, 0xb, + 0xe0, 0x80, 0x7, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0xde, 0xbe, 0xb4, 0x0, + 0x6, 0x78, 0x10, 0x6c, 0xff, 0x12, 0xa, 0x3, 0x19, 0x7a, 0x38, 0x84, 0xb, + 0xf0, 0xbe, 0xf0, 0x6, 0x78, 0xf2, 0x12, 0x9, 0xf4, 0x7e, 0x34, 0xf3, 0x12, + 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x24, 0x0, 0x9, 0x12, 0x9, 0x8f, 0x7d, 0xb3, + 0xbe, 0xb4, 0x0, 0x9, 0x78, 0x4, 0xb, 0xe0, 0x80, 0x7, 0xb, 0xf0, 0xbe, + 0xf0, 0x3, 0x40, 0xde, 0xbe, 0xb4, 0x0, 0x9, 0x78, 0x10, 0x6c, 0xff, 0x12, + 0xa, 0x3, 0x19, 0x7a, 0x37, 0xe7, 0xb, 0xf0, 0xbe, 0xf0, 0x9, 0x78, 0xf2, + 0x12, 0x9, 0xf4, 0x7e, 0x34, 0xd2, 0x2, 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x24, + 0x0, 0x2, 0x12, 0x9, 0x8f, 0x7d, 0xb3, 0xbe, 0xb4, 0x0, 0x2, 0x78, 0x4, 0xb, + 0xe0, 0x80, 0x7, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0xde, 0xbe, 0xb4, 0x0, + 0x2, 0x78, 0x10, 0x6c, 0xff, 0x12, 0xa, 0x3, 0x19, 0x7a, 0x38, 0x8c, 0xb, + 0xf0, 0xbe, 0xf0, 0x2, 0x78, 0xf2, 0x12, 0x9, 0xf4, 0x7e, 0x34, 0xf3, 0x90, + 0x12, 0xa, 0xa, 0x78, 0x4, 0xb, 0xe0, 0x80, 0x7, 0xb, 0xf0, 0xbe, 0xf0, 0x3, + 0x40, 0xec, 0xbe, 0xb4, 0x0, 0x1, 0x78, 0x8, 0x7e, 0x73, 0x91, 0xfe, 0x7a, + 0x73, 0x37, 0xe6, 0x12, 0x9, 0xf4, 0x7e, 0x34, 0xf3, 0xb3, 0x12, 0xa, 0xa, + 0x78, 0x4, 0xb, 0xe0, 0x80, 0x7, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0xec, + 0xbe, 0xb4, 0x0, 0x1, 0x78, 0x8, 0x7e, 0x73, 0x91, 0xfe, 0x7a, 0x73, 0x37, + 0xd4, 0xbe, 0xe0, 0x5, 0x78, 0x6, 0x74, 0x1, 0x7a, 0xb3, 0x38, 0x7b, 0x7e, + 0xb3, 0x38, 0x7b, 0xb4, 0x1, 0x34, 0x7e, 0x73, 0x38, 0x8c, 0x7a, 0x73, 0x59, + 0x5e, 0x7e, 0x73, 0x38, 0x8d, 0x7a, 0x73, 0x59, 0x5a, 0x7e, 0xb3, 0x59, + 0x5e, 0xb4, 0x86, 0x9, 0x7e, 0xb3, 0x59, 0x5a, 0xbe, 0xb0, 0x15, 0x68, 0xc, + 0x74, 0x87, 0x7a, 0xb3, 0x59, 0x5e, 0x74, 0x19, 0x7a, 0xb3, 0x59, 0x5a, + 0x7e, 0x73, 0x37, 0xe6, 0x7a, 0x73, 0x59, 0x6c, 0xda, 0x79, 0x22, 0x12, + 0xd8, 0xd, 0x80, 0x49, 0x6d, 0x33, 0x7e, 0x2f, 0x39, 0xe8, 0x79, 0x32, 0x0, + 0xa, 0x12, 0xd7, 0xb9, 0x12, 0xdb, 0xa0, 0x7a, 0xb3, 0x39, 0xec, 0x80, 0xa, + 0x12, 0xd8, 0xaa, 0x68, 0x5, 0x12, 0xc6, 0x50, 0x80, 0x5, 0x12, 0xd8, 0x4e, + 0x68, 0xf1, 0x12, 0xd9, 0xc0, 0x7e, 0x6f, 0x39, 0xe8, 0x69, 0x36, 0x0, 0x4, + 0x5e, 0x34, 0x0, 0x2, 0x78, 0xf2, 0x7e, 0xb3, 0x39, 0xec, 0x70, 0x11, 0x69, + 0x36, 0x0, 0xa, 0x6c, 0x66, 0x7a, 0x7b, 0x70, 0xb, 0xf4, 0x1b, 0x14, 0x4d, + 0x11, 0x78, 0xb3, 0x2, 0x9, 0xe4, 0x6d, 0x33, 0x7e, 0x2f, 0x39, 0xe8, 0x1b, + 0x2a, 0x30, 0xc2, 0xcc, 0x7d, 0x32, 0x9d, 0x31, 0x22, 0x7e, 0x8, 0x91, 0xfe, + 0x7e, 0x34, 0x0, 0x9, 0xe4, 0x12, 0x0, 0x2e, 0x6c, 0xff, 0x22, 0xa, 0xaf, + 0x9, 0x7a, 0x91, 0xfe, 0x22, 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x24, 0x0, 0x1, + 0x12, 0x9, 0x8f, 0x7d, 0xb3, 0xbe, 0xb4, 0x0, 0x1, 0x22, 0x30, 0x25, 0xc, + 0x7e, 0xb3, 0x59, 0xa9, 0xb4, 0x1, 0x5, 0x12, 0x40, 0x46, 0x80, 0x3, 0x12, + 0x32, 0x63, 0xc2, 0x25, 0xd2, 0x86, 0x12, 0x8, 0x2c, 0x7e, 0xb3, 0x3, 0xfd, + 0xb4, 0x1, 0x78, 0x12, 0x60, 0x5, 0x12, 0x59, 0xdc, 0xe4, 0x12, 0x68, 0x8e, + 0x12, 0xcb, 0x3a, 0x12, 0x70, 0x41, 0x12, 0x30, 0x5f, 0x12, 0xdb, 0xb0, + 0x12, 0x56, 0x1b, 0x12, 0x7f, 0x85, 0x12, 0xa, 0xed, 0x40, 0xd8, 0x12, 0xb0, + 0xe, 0x7e, 0xb3, 0x59, 0x5f, 0xb4, 0x1, 0x2, 0xd2, 0x86, 0x7e, 0xb3, 0x82, + 0x4, 0x70, 0x6, 0x12, 0x4e, 0x97, 0x12, 0xce, 0xf6, 0x12, 0x78, 0x84, 0x12, + 0xab, 0xd4, 0x12, 0xa, 0xed, 0x40, 0xb5, 0x74, 0x1, 0x12, 0xa, 0xc8, 0x12, + 0x65, 0x56, 0x12, 0x7f, 0x33, 0x12, 0x7f, 0xd6, 0x74, 0x2, 0x12, 0xa, 0xc8, + 0x12, 0x3c, 0x79, 0x74, 0x3, 0x12, 0xa, 0xc8, 0x12, 0x99, 0xd1, 0x74, 0x4, + 0x12, 0xa, 0xc8, 0x12, 0xd0, 0x7c, 0x12, 0x6c, 0xb3, 0x12, 0x59, 0xb4, 0x12, + 0x53, 0xfb, 0x12, 0x5f, 0xe0, 0x80, 0x81, 0xd2, 0x4, 0x12, 0xb, 0xc5, 0x12, + 0x57, 0x6e, 0x2, 0xa, 0xbf, 0x7e, 0x73, 0x59, 0x62, 0x7a, 0x73, 0x3, 0xfd, + 0x22, 0x24, 0xfd, 0x68, 0xa, 0xb, 0xb1, 0x78, 0x1c, 0xe4, 0x7a, 0xb3, 0x69, + 0x73, 0x22, 0x12, 0x9e, 0x81, 0x12, 0xa8, 0x1a, 0x12, 0xa8, 0xa0, 0x7a, + 0xb3, 0x69, 0x75, 0x12, 0x90, 0x6f, 0x12, 0x8d, 0xbd, 0x2, 0x9c, 0x6, 0x22, + 0x7e, 0xb3, 0x2e, 0x74, 0x70, 0x14, 0x7e, 0xb3, 0x59, 0x60, 0xbe, 0xb0, 0x3, + 0x68, 0xb, 0x12, 0xaa, 0x76, 0x12, 0xa, 0xbf, 0x12, 0x4f, 0x86, 0xd3, 0x22, + 0xc3, 0x22, 0x12, 0x40, 0x8, 0x7e, 0xb3, 0x3, 0xfd, 0xb4, 0x3, 0x2, 0x80, + 0x2, 0x61, 0xb3, 0x74, 0x4, 0x12, 0x68, 0x8e, 0x12, 0x32, 0xe0, 0x12, 0x30, + 0x5f, 0x12, 0x32, 0x99, 0x7e, 0xb3, 0x9a, 0xbc, 0x20, 0xe7, 0x7, 0x7e, 0xb3, + 0x9a, 0xcd, 0xb4, 0x1, 0x78, 0x12, 0x25, 0xee, 0x68, 0x5, 0xc2, 0x4, 0x12, + 0xb, 0xc5, 0x12, 0x30, 0xa3, 0x30, 0xe, 0xa, 0xc2, 0xe, 0xd2, 0x0, 0x12, + 0x32, 0xa8, 0x12, 0x32, 0xc0, 0x12, 0x25, 0xee, 0x68, 0x5, 0x12, 0x56, 0xf8, + 0x80, 0x9, 0x12, 0x56, 0x1b, 0x12, 0xda, 0xfe, 0x12, 0x57, 0x18, 0x7e, 0xb3, + 0x8d, 0x91, 0xb4, 0x1, 0x2f, 0x12, 0xb0, 0xe, 0x12, 0xce, 0xf6, 0x12, 0xab, + 0xd4, 0x12, 0x65, 0x56, 0x7e, 0xb3, 0x9a, 0xc2, 0x70, 0x1d, 0x7e, 0xb3, + 0x9b, 0x18, 0x70, 0x17, 0x7e, 0x1f, 0x2d, 0x2a, 0x7a, 0x1d, 0x27, 0x7e, + 0x1f, 0x2d, 0x2e, 0x7f, 0x1, 0xe4, 0x12, 0xac, 0x8c, 0x12, 0xda, 0xfe, 0x12, + 0x77, 0x13, 0x12, 0x57, 0xb6, 0x12, 0x25, 0xee, 0x68, 0xd, 0x12, 0x27, 0xfb, + 0x7e, 0xb3, 0x9a, 0xbc, 0x54, 0x7f, 0x7a, 0xb3, 0x9a, 0xbc, 0x12, 0x28, + 0x53, 0x12, 0x40, 0x4d, 0x61, 0xc, 0xd2, 0x25, 0xd2, 0x4, 0x12, 0xb, 0xc5, + 0x12, 0x0, 0x21, 0x2, 0xa, 0xbf, 0x12, 0x32, 0xc0, 0xd2, 0x4, 0x12, 0x53, + 0xac, 0x80, 0x11, 0x12, 0xdb, 0xb7, 0x40, 0x3, 0x12, 0x53, 0xf1, 0x30, 0xb, + 0x3, 0x12, 0x53, 0xf1, 0x12, 0x30, 0xee, 0x12, 0xdb, 0xa8, 0x68, 0xea, 0x30, + 0x4, 0x3, 0x2, 0x4f, 0x63, 0x22, 0xca, 0x3b, 0x12, 0xda, 0x5d, 0x12, 0xdb, + 0x7, 0x12, 0x70, 0xf5, 0x12, 0x37, 0x5c, 0x7e, 0x34, 0xf3, 0xb3, 0x12, 0xc6, + 0xe, 0xf5, 0x14, 0xbe, 0xb0, 0x1, 0x50, 0xf, 0x7e, 0x34, 0xc5, 0xac, 0x12, + 0xc6, 0xe, 0xf5, 0x15, 0x7e, 0x34, 0xc5, 0xac, 0x80, 0xd, 0x7e, 0x34, 0xf4, + 0xa2, 0x12, 0xc6, 0xe, 0xf5, 0x15, 0x7e, 0x34, 0xf4, 0xa2, 0x7e, 0xb3, 0x9b, + 0x7, 0x12, 0x31, 0x2b, 0xe5, 0x15, 0x7a, 0xb3, 0x9b, 0x6, 0x12, 0x61, 0x99, + 0x9, 0x75, 0x9b, 0x27, 0x7e, 0xf0, 0xee, 0xac, 0xf7, 0x2e, 0x74, 0x1, 0x0, + 0x12, 0xd8, 0x8e, 0x12, 0xd, 0x20, 0x7d, 0x63, 0x7a, 0x65, 0x27, 0x7e, 0x8, + 0x0, 0x27, 0x74, 0x3, 0x6c, 0x77, 0x12, 0x48, 0xfe, 0x12, 0xd8, 0x93, 0x7e, + 0x25, 0x27, 0x12, 0xd, 0x10, 0x12, 0xd8, 0x93, 0x12, 0xd, 0x20, 0x7a, 0x35, + 0x27, 0x12, 0xda, 0x17, 0x12, 0x32, 0x20, 0x12, 0x30, 0x5f, 0xd2, 0x4, 0x12, + 0xb, 0xc5, 0x12, 0x37, 0x5b, 0xe5, 0x14, 0xbe, 0xb0, 0x1, 0x50, 0x6, 0x7e, + 0x34, 0xc5, 0xac, 0x80, 0x4, 0x7e, 0x34, 0xf4, 0xa2, 0x7e, 0xb3, 0x9b, 0x8, + 0x12, 0x31, 0x2b, 0x12, 0xda, 0x17, 0x12, 0xb, 0xc0, 0x12, 0xd9, 0xcd, 0x7a, + 0x1f, 0x2d, 0x2a, 0x7e, 0xf, 0x2d, 0x26, 0x7e, 0xa3, 0x9b, 0xaf, 0x74, 0x3, + 0xa4, 0x9, 0xb5, 0x9b, 0x59, 0x12, 0x27, 0x7f, 0x12, 0xcd, 0x61, 0x6d, 0x33, + 0x80, 0x22, 0x7d, 0x13, 0x3e, 0x14, 0x7e, 0x2f, 0x2d, 0x2e, 0x2d, 0x51, 0xb, + 0x2a, 0x0, 0xbe, 0x4, 0x0, 0x0, 0x8, 0x5, 0xb, 0x2a, 0x20, 0x80, 0x4, 0x6d, + 0x22, 0x9d, 0x20, 0x59, 0x21, 0x3a, 0x0, 0xb, 0x34, 0x7e, 0x27, 0x8d, 0x94, + 0xbd, 0x23, 0x38, 0xd6, 0x12, 0xd8, 0x8e, 0x7d, 0x26, 0x12, 0xd, 0x10, 0x12, + 0xd8, 0x93, 0x12, 0xd, 0x20, 0x7a, 0x35, 0x27, 0xe5, 0x14, 0xbe, 0xb0, 0x1, + 0x50, 0x6, 0x7e, 0x34, 0xc5, 0xac, 0x80, 0x4, 0x7e, 0x34, 0xf4, 0xa2, 0xe5, + 0x15, 0x12, 0x31, 0x2b, 0x12, 0x37, 0xfc, 0x74, 0xaa, 0x7a, 0xb3, 0x9b, 0x5, + 0xda, 0x3b, 0x22, 0x7d, 0x2, 0x7d, 0x53, 0x7d, 0x20, 0x12, 0x12, 0x86, 0x7d, + 0x35, 0x7d, 0x20, 0x2, 0x12, 0x79, 0x12, 0xda, 0x93, 0xb, 0x1a, 0x30, 0x22, + 0xca, 0x3b, 0x30, 0x0, 0x3, 0x2, 0x11, 0x24, 0x74, 0x3, 0x12, 0x14, 0xcb, + 0x7e, 0x34, 0x91, 0xfe, 0x7e, 0x24, 0x15, 0x15, 0x7e, 0x74, 0x0, 0xb9, 0x1b, + 0x38, 0x20, 0xb, 0x35, 0x1b, 0x74, 0x78, 0xf7, 0x12, 0xdb, 0x97, 0x7e, 0x24, + 0x0, 0xb9, 0x12, 0x17, 0x8f, 0x12, 0xdb, 0x97, 0x12, 0x17, 0x2a, 0x7e, 0xb3, + 0x9b, 0xaf, 0xb4, 0x1, 0x3f, 0x7e, 0xf, 0x39, 0xed, 0x69, 0x30, 0x0, 0x1c, + 0x7a, 0x37, 0x37, 0xd8, 0x69, 0x30, 0x0, 0x1a, 0x7a, 0x37, 0x37, 0xdc, 0x69, + 0x30, 0x0, 0x12, 0x7a, 0x37, 0x38, 0x76, 0x69, 0x30, 0x0, 0x14, 0x7a, 0x37, + 0x38, 0x80, 0x7e, 0x34, 0x0, 0x3f, 0x79, 0x30, 0x0, 0x1a, 0x6d, 0x33, 0x12, + 0xc9, 0x34, 0x7e, 0x34, 0x0, 0x20, 0x12, 0xc9, 0x51, 0x7e, 0x34, 0x0, 0x1, + 0x12, 0xc9, 0x46, 0xe4, 0x7a, 0xb3, 0x37, 0xe1, 0x74, 0x3, 0x7a, 0xb3, 0x37, + 0xe2, 0x7a, 0xb3, 0x37, 0xd2, 0x7e, 0x93, 0x9b, 0xaf, 0x4c, 0x99, 0x78, + 0x1d, 0xe5, 0xc2, 0x7a, 0xb3, 0x37, 0xe0, 0x12, 0xd9, 0x3, 0x43, 0xc3, 0x20, + 0x12, 0x26, 0x94, 0x43, 0xc3, 0xc0, 0x12, 0x26, 0x94, 0x43, 0xc2, 0x40, + 0x12, 0x26, 0x94, 0x80, 0x8, 0xbe, 0x90, 0x1, 0x78, 0x3, 0x12, 0xd9, 0x3, + 0x7e, 0xb3, 0x9b, 0xaf, 0xb4, 0x1, 0x6, 0xa9, 0xd0, 0x9e, 0xa9, 0xd4, 0x9e, + 0x7e, 0xb3, 0x69, 0xec, 0x60, 0xb, 0x6d, 0x33, 0x12, 0xc9, 0x2b, 0x12, 0xc9, + 0x67, 0x12, 0xc9, 0x3d, 0x12, 0x50, 0x24, 0x74, 0x3, 0x12, 0x14, 0xcb, 0x7e, + 0x34, 0x0, 0x1f, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x76, 0x12, 0xdb, 0x8e, + 0x4e, 0x50, 0x1, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x25, 0x12, 0xd, 0x20, + 0x7a, 0x37, 0x3f, 0x2e, 0x12, 0xdb, 0x85, 0x5e, 0x24, 0x0, 0x9f, 0x4e, 0x40, + 0x76, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x27, 0x12, 0xd, 0x20, 0x7a, 0x37, + 0x3f, 0x32, 0x12, 0xdb, 0x7c, 0x5e, 0x24, 0xf6, 0x4f, 0x4e, 0x24, 0x60, 0xf, + 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x1, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, + 0x36, 0x12, 0xdb, 0x73, 0x5e, 0x24, 0xc0, 0x0, 0x4e, 0x50, 0xc2, 0x12, 0xd, + 0x10, 0x7e, 0x34, 0x0, 0x2a, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x38, 0x12, + 0xdb, 0x6a, 0x5e, 0x50, 0xf, 0x4e, 0x50, 0x20, 0x12, 0xd, 0x10, 0x7e, 0xf, + 0x39, 0xed, 0x69, 0x30, 0x0, 0x4c, 0x7a, 0x37, 0x38, 0x7e, 0x7e, 0x53, 0x37, + 0xd2, 0xa, 0x55, 0x7d, 0x25, 0x12, 0x16, 0xf8, 0x2d, 0x25, 0x6c, 0x77, 0x4d, + 0x32, 0x79, 0x30, 0x0, 0x4c, 0x7e, 0xb3, 0x69, 0xec, 0x7e, 0x34, 0x0, 0x20, + 0x60, 0x2f, 0x12, 0xd, 0x20, 0x7d, 0x3, 0x5e, 0x4, 0x0, 0x2, 0x7e, 0x34, + 0x0, 0x20, 0x12, 0x14, 0xc4, 0x7d, 0x13, 0x5e, 0x14, 0x0, 0x2, 0x7e, 0x34, + 0x0, 0x20, 0x12, 0xd8, 0x9a, 0x12, 0xdb, 0xee, 0x4d, 0x21, 0x12, 0x15, 0xe, + 0x12, 0xd9, 0x14, 0x12, 0xdb, 0xee, 0x4d, 0x20, 0x80, 0x15, 0x12, 0xd8, + 0x9a, 0x5e, 0x40, 0x7d, 0x4e, 0x40, 0x58, 0x12, 0x15, 0xe, 0x12, 0xd9, 0x14, + 0x5e, 0x40, 0x7d, 0x4e, 0x40, 0x58, 0x12, 0x12, 0x79, 0x7e, 0x34, 0x0, 0x28, + 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x34, 0x12, 0xdb, 0x61, 0x5e, 0x24, 0xf7, + 0xef, 0x4e, 0x40, 0x8, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x1b, 0x12, 0xd, + 0x20, 0x7a, 0x37, 0x3f, 0x44, 0x12, 0xdb, 0x58, 0x5e, 0x40, 0xdf, 0x12, + 0xdb, 0xe6, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x48, 0x7e, 0x34, 0x0, 0x17, + 0x7e, 0xb3, 0x37, 0xd3, 0x54, 0x3f, 0xa, 0x2b, 0x12, 0xd, 0x10, 0x7e, 0x34, + 0x0, 0x26, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x30, 0x12, 0xdb, 0x4f, 0x5e, + 0x24, 0xf1, 0xdf, 0x12, 0xd, 0x10, 0x6d, 0x33, 0x12, 0xd, 0x20, 0x7a, 0x37, + 0x3f, 0x4a, 0x6d, 0x33, 0x7e, 0x27, 0x3f, 0x4a, 0x5e, 0x24, 0x7f, 0xfd, + 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x21, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, + 0x4c, 0x12, 0xdb, 0x46, 0x5e, 0x40, 0xef, 0x12, 0x12, 0x86, 0x7e, 0x34, 0x0, + 0x21, 0x12, 0x14, 0xc4, 0x7a, 0x37, 0x3f, 0x4e, 0x12, 0xdb, 0x3d, 0x5e, + 0x40, 0xef, 0x12, 0x12, 0x79, 0x7e, 0x34, 0x0, 0x14, 0x12, 0xd, 0x20, 0x7a, + 0x37, 0x3f, 0x46, 0x12, 0xdb, 0x34, 0x5e, 0x24, 0xfc, 0x0, 0x12, 0xdb, 0xde, + 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x5c, 0x7e, 0x34, 0x0, 0x2, 0x7e, 0x53, + 0x37, 0xd5, 0xa, 0x55, 0x12, 0x49, 0x61, 0x7e, 0x27, 0x3f, 0x5c, 0x5e, 0x24, + 0x8, 0x0, 0x4d, 0x25, 0x4e, 0x50, 0x2e, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, + 0x16, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x52, 0x12, 0xdb, 0x2b, 0x5e, 0x24, + 0xf8, 0x0, 0x4e, 0x50, 0xc4, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x18, 0x12, + 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x58, 0x12, 0xdb, 0x22, 0x5e, 0x24, 0xfc, 0x0, + 0x4e, 0x50, 0xda, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x19, 0x12, 0xd, 0x20, + 0x7a, 0x37, 0x3f, 0x5a, 0x12, 0xdb, 0x19, 0x5e, 0x24, 0xfc, 0x0, 0x4e, 0x24, + 0x1, 0x90, 0x12, 0xdb, 0xd6, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x56, 0x7e, + 0x34, 0x0, 0x1a, 0x6d, 0x22, 0x12, 0xd, 0x10, 0x6d, 0x77, 0x7d, 0x67, 0x2e, + 0x64, 0x0, 0x6, 0x12, 0xd9, 0x24, 0x59, 0x32, 0x3f, 0x3a, 0x7d, 0x27, 0x3e, + 0x24, 0x49, 0x32, 0x3f, 0x3a, 0x59, 0x32, 0x3f, 0x20, 0xb, 0x74, 0xbe, 0x74, + 0x0, 0x5, 0x78, 0xdf, 0x7e, 0xb3, 0x9b, 0xaf, 0x7e, 0x8, 0x3f, 0x26, 0x70, + 0x7, 0x12, 0xda, 0x6e, 0x74, 0x1, 0x80, 0x5, 0x12, 0xda, 0x6e, 0x74, 0x2, + 0x7e, 0x70, 0x1, 0x12, 0x48, 0xfe, 0x7e, 0x8, 0x3f, 0x28, 0x74, 0x1, 0x12, + 0x48, 0xc7, 0x7e, 0x8, 0x3f, 0x28, 0x74, 0x1, 0x12, 0x48, 0xef, 0x7e, 0x73, + 0x38, 0x78, 0xa, 0x37, 0x7a, 0x37, 0x3f, 0x20, 0x7e, 0x34, 0x0, 0x6, 0x7e, + 0x27, 0x3f, 0x20, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x9, 0x7e, 0x27, 0x3f, + 0x26, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0xa, 0x7e, 0x27, 0x3f, 0x28, 0x12, + 0xd, 0x10, 0x6d, 0x77, 0x7d, 0x67, 0x2e, 0x64, 0x0, 0xb, 0x12, 0xd9, 0x24, + 0x59, 0x32, 0x3f, 0x5e, 0x12, 0xda, 0x64, 0x59, 0x32, 0x3f, 0x64, 0x12, + 0x12, 0x92, 0x78, 0xe7, 0x7e, 0x34, 0x0, 0xb, 0x7e, 0x24, 0x11, 0x11, 0x12, + 0xd, 0x10, 0x7e, 0x34, 0x0, 0xc, 0x7e, 0x24, 0x0, 0x1, 0x12, 0xd, 0x10, + 0x7e, 0x34, 0x1, 0xfb, 0x12, 0xd, 0x20, 0x7d, 0x73, 0x7e, 0x34, 0x0, 0xd, + 0x7d, 0x27, 0x12, 0xd, 0x10, 0x6d, 0x77, 0x7d, 0x67, 0x2e, 0x64, 0x0, 0x39, + 0x12, 0xd9, 0x24, 0x59, 0x32, 0x3f, 0x6a, 0x12, 0xda, 0x64, 0x59, 0x32, + 0x3f, 0x70, 0x12, 0x12, 0x92, 0x78, 0xe7, 0x7e, 0x34, 0x0, 0x39, 0x12, 0x17, + 0xe6, 0x7e, 0x34, 0x0, 0x3a, 0x12, 0x17, 0xe6, 0x7e, 0x34, 0x0, 0x3b, 0x7e, + 0x24, 0x50, 0x5, 0x12, 0x12, 0x86, 0x7e, 0x34, 0x0, 0x39, 0x7e, 0x24, 0x12, + 0x34, 0x12, 0x12, 0x79, 0x7e, 0x34, 0x0, 0x3a, 0x7e, 0x24, 0x23, 0x45, 0x12, + 0x12, 0x79, 0x7e, 0x34, 0x0, 0x3b, 0x7e, 0x24, 0x10, 0x5, 0x12, 0x12, 0x79, + 0x41, 0x72, 0x7e, 0xa3, 0x9b, 0xaf, 0x4c, 0xaa, 0x78, 0x24, 0x7e, 0xb3, + 0x37, 0xe0, 0xf5, 0xc2, 0x7e, 0x73, 0x37, 0xe3, 0x7c, 0xb7, 0x54, 0xc0, + 0x4c, 0xb7, 0xf5, 0xc3, 0x7c, 0xb7, 0x54, 0x20, 0x4c, 0xb7, 0xf5, 0xc3, + 0x7c, 0xb7, 0x54, 0x7, 0x4c, 0xb7, 0xf5, 0xc3, 0x80, 0xb, 0xbe, 0xa0, 0x1, + 0x78, 0x6, 0x7e, 0xb3, 0x37, 0xe3, 0xf5, 0xc3, 0x12, 0xc9, 0x5a, 0x12, 0xdb, + 0x8e, 0x12, 0xd, 0x10, 0x12, 0xdb, 0x85, 0x12, 0xd, 0x10, 0x12, 0xdb, 0x7c, + 0x12, 0xd, 0x10, 0x12, 0xdb, 0x73, 0x12, 0xd, 0x10, 0x12, 0xdb, 0x6a, 0x12, + 0xd, 0x10, 0x12, 0xc9, 0x5a, 0x12, 0xd8, 0xa1, 0x12, 0x15, 0xe, 0x7e, 0x27, + 0x3f, 0x2c, 0x12, 0x12, 0x79, 0x12, 0xdb, 0x61, 0x12, 0xd, 0x10, 0x12, 0xdb, + 0x58, 0x12, 0xdb, 0xe6, 0x7e, 0x27, 0x3f, 0x48, 0x12, 0xd, 0x10, 0x12, 0xdb, + 0x4f, 0x12, 0xd, 0x10, 0x6d, 0x33, 0x7e, 0x27, 0x3f, 0x4a, 0x12, 0xd, 0x10, + 0x12, 0xdb, 0x46, 0x12, 0x12, 0x86, 0x12, 0xdb, 0x3d, 0x12, 0x12, 0x79, + 0x12, 0xdb, 0x34, 0x12, 0xdb, 0xde, 0x7e, 0x27, 0x3f, 0x5c, 0x12, 0xd, 0x10, + 0x7e, 0x34, 0x0, 0x10, 0x7e, 0x27, 0x3f, 0x50, 0x12, 0xd, 0x10, 0x12, 0xdb, + 0x2b, 0x12, 0xdb, 0xd6, 0x7e, 0x27, 0x3f, 0x56, 0x12, 0xd, 0x10, 0x12, 0xdb, + 0x22, 0x12, 0xd, 0x10, 0x12, 0xdb, 0x19, 0x12, 0xd, 0x10, 0x7e, 0xb3, 0x69, + 0xec, 0x60, 0x8, 0x12, 0xc9, 0x23, 0x6d, 0x33, 0x12, 0xc9, 0x3d, 0x7e, 0xb3, + 0x9b, 0xaf, 0xb4, 0x1, 0x1c, 0x7e, 0x37, 0x37, 0xd8, 0x12, 0xc9, 0x34, 0x7e, + 0x37, 0x37, 0xdc, 0x12, 0xc9, 0x79, 0x7e, 0x37, 0x38, 0x76, 0x12, 0xc9, + 0x51, 0x7e, 0x37, 0x38, 0x80, 0x12, 0xc9, 0x46, 0x6d, 0x77, 0x7d, 0x67, + 0x2e, 0x64, 0x0, 0x6, 0x12, 0x12, 0x9f, 0x49, 0x22, 0x3f, 0x3a, 0x12, 0xd, + 0x10, 0xb, 0x74, 0xbe, 0x74, 0x0, 0x5, 0x78, 0xe8, 0x6d, 0x77, 0x12, 0x12, + 0x99, 0x49, 0x22, 0x3f, 0x5e, 0x12, 0x12, 0x86, 0x12, 0x12, 0x99, 0x49, + 0x22, 0x3f, 0x64, 0x12, 0x12, 0x8f, 0x78, 0xea, 0x6d, 0x77, 0x7d, 0x67, + 0x2e, 0x64, 0x0, 0x39, 0x12, 0x12, 0x9f, 0x49, 0x22, 0x3f, 0x6a, 0x12, 0x12, + 0x86, 0x12, 0x12, 0x9f, 0x49, 0x22, 0x3f, 0x70, 0x12, 0x12, 0x8f, 0x78, + 0xe4, 0x12, 0x72, 0x64, 0x12, 0x17, 0x40, 0xda, 0x3b, 0x22, 0x7e, 0x27, + 0x8d, 0xf6, 0x7d, 0x12, 0x12, 0xda, 0x8a, 0x1b, 0x1a, 0x10, 0x22, 0x49, + 0x25, 0x8e, 0x2c, 0x7d, 0x12, 0x12, 0xda, 0x93, 0x1b, 0x1a, 0x10, 0x22, + 0x12, 0x12, 0x79, 0xb, 0x74, 0xbe, 0x74, 0x0, 0x3, 0x22, 0x7d, 0x67, 0x2e, + 0x64, 0x0, 0xb, 0x7d, 0x36, 0x7d, 0x27, 0x3e, 0x24, 0x22, 0xca, 0xf8, 0x6c, + 0xff, 0x74, 0xee, 0xac, 0xbf, 0x12, 0x75, 0xca, 0x12, 0xda, 0xf5, 0xa, 0xe7, + 0x3e, 0xe4, 0x3e, 0xe4, 0x3e, 0xe4, 0xb, 0xe6, 0x9, 0x75, 0x9b, 0x24, 0xa, + 0xd7, 0x3e, 0xd4, 0x3e, 0xd4, 0x3e, 0xd4, 0xb, 0xd6, 0x7e, 0xc4, 0x0, 0x2c, + 0x7a, 0xc5, 0x2f, 0x12, 0xd9, 0xe7, 0x7d, 0x3e, 0x7d, 0x2d, 0x12, 0xd6, + 0xca, 0x7d, 0x3e, 0x7d, 0x2d, 0x12, 0x1a, 0xea, 0x7d, 0x3e, 0x7d, 0x2d, + 0x74, 0x2a, 0x12, 0xd6, 0x6d, 0x12, 0xd9, 0x79, 0x12, 0x12, 0x86, 0x12, + 0xd9, 0x6a, 0x12, 0x75, 0x33, 0xac, 0xbf, 0x12, 0x75, 0xd1, 0x12, 0xd9, + 0x79, 0x12, 0x12, 0x79, 0x12, 0xd9, 0x6a, 0x12, 0x12, 0x79, 0x12, 0x75, + 0x36, 0xac, 0xbf, 0x49, 0x25, 0x8e, 0x5a, 0x12, 0x12, 0x79, 0xb, 0xf0, 0xbe, + 0xf0, 0x4, 0x40, 0x8d, 0xda, 0xf8, 0x22, 0xca, 0x3b, 0x7e, 0xf3, 0x9b, 0xa8, + 0x7e, 0x30, 0x8, 0xac, 0x3f, 0x9, 0xc1, 0x9b, 0x23, 0x9, 0xd1, 0x9b, 0x24, + 0x7e, 0x4, 0x0, 0x8, 0xca, 0x9, 0x2e, 0x14, 0x9b, 0x23, 0x6d, 0x0, 0x7e, + 0x18, 0x9a, 0xed, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x74, 0x8, 0xac, 0xbf, 0x9, + 0xe5, 0x9b, 0x27, 0x74, 0xee, 0xac, 0xbe, 0x7d, 0xa5, 0x2e, 0xa4, 0x1, 0x0, + 0x74, 0x3, 0x12, 0x14, 0xcb, 0x12, 0x14, 0xbd, 0x5e, 0x34, 0x1, 0x0, 0x68, + 0xd, 0x5e, 0xb4, 0xfe, 0xff, 0x7a, 0xb7, 0x38, 0x79, 0x7c, 0xbf, 0x12, 0x18, + 0x7, 0x12, 0x14, 0xbd, 0x5e, 0x34, 0x0, 0x1, 0x68, 0x35, 0x5e, 0xb4, 0xff, + 0xfe, 0x7a, 0xb7, 0x38, 0x79, 0x7e, 0xb3, 0x9a, 0xed, 0x12, 0x0, 0xe, 0x50, + 0x18, 0x7e, 0xb3, 0x9a, 0xed, 0x12, 0xb8, 0xff, 0x50, 0xf, 0x7e, 0xb3, 0x9a, + 0xed, 0x12, 0x1b, 0x53, 0x12, 0x3a, 0x3d, 0x12, 0x12, 0xa6, 0x80, 0xc, 0x74, + 0x8, 0xac, 0xbf, 0x19, 0xc5, 0x9b, 0x23, 0x7a, 0xc3, 0x9a, 0xed, 0x12, 0x14, + 0xbd, 0x5e, 0x34, 0x0, 0x2, 0x68, 0x2c, 0x5e, 0xb4, 0xff, 0xfd, 0x7a, 0xb7, + 0x38, 0x79, 0x7e, 0xb3, 0x9a, 0xee, 0x12, 0x20, 0x6, 0x50, 0xf, 0x7e, 0xb3, + 0x9a, 0xee, 0x12, 0x1b, 0x95, 0x12, 0x3a, 0x3d, 0x12, 0x12, 0xa6, 0x80, 0xc, + 0x74, 0x8, 0xac, 0xbf, 0x19, 0xd5, 0x9b, 0x24, 0x7a, 0xd3, 0x9a, 0xee, 0x12, + 0x14, 0xbd, 0x5e, 0x34, 0x0, 0x4, 0x68, 0x4e, 0x5e, 0xb4, 0xff, 0xfb, 0x7a, + 0xb7, 0x38, 0x79, 0x4e, 0xb4, 0x2, 0x0, 0x7a, 0xb7, 0x38, 0x79, 0x7c, 0xbf, + 0x12, 0x38, 0x7, 0x7e, 0x30, 0x3c, 0xac, 0x3e, 0x12, 0x1a, 0xbb, 0x12, 0xd6, + 0xfc, 0x7e, 0x30, 0x3c, 0xac, 0x3e, 0x12, 0xda, 0x45, 0x74, 0x8, 0xac, 0xbf, + 0x12, 0xd6, 0x48, 0x74, 0x8, 0xac, 0xbf, 0x12, 0x34, 0x60, 0x7d, 0x3a, 0x2e, + 0x34, 0x0, 0x6, 0x74, 0x3c, 0xac, 0xbe, 0x12, 0xdb, 0xcf, 0x7d, 0x3a, 0xb, + 0x35, 0x74, 0x3c, 0xac, 0xbe, 0x12, 0x12, 0x82, 0x12, 0x14, 0xb6, 0x5e, + 0x24, 0x0, 0x10, 0x68, 0x12, 0x5e, 0x70, 0xef, 0x7a, 0x37, 0x38, 0x79, 0x7e, + 0xb3, 0x9a, 0xef, 0x7e, 0x73, 0x9a, 0xf0, 0x12, 0x74, 0xd5, 0x12, 0x14, + 0xb6, 0x5e, 0x24, 0x0, 0x40, 0x68, 0x11, 0x5e, 0x70, 0xbf, 0x7a, 0x37, 0x38, + 0x79, 0x7c, 0xbf, 0xa, 0xf, 0x12, 0x36, 0xca, 0x12, 0x5d, 0x6c, 0x12, 0x14, + 0xb6, 0x5e, 0x24, 0x0, 0x80, 0x68, 0xa, 0x5e, 0x70, 0x7f, 0x7a, 0x37, 0x38, + 0x79, 0x12, 0x17, 0x40, 0x12, 0x14, 0xb6, 0x5e, 0x24, 0x4, 0x0, 0x68, 0xe, + 0x5e, 0x60, 0xfb, 0x7a, 0x37, 0x38, 0x79, 0x7e, 0xb3, 0x9a, 0xc6, 0x12, + 0xb6, 0xda, 0x12, 0x14, 0xb6, 0x5e, 0x24, 0x20, 0x0, 0x68, 0xc, 0x5e, 0x60, + 0xdf, 0x7a, 0x37, 0x38, 0x79, 0x7c, 0xbf, 0x12, 0x47, 0xd5, 0xda, 0x3b, + 0x22, 0x7e, 0x37, 0x38, 0x79, 0x7d, 0x23, 0x22, 0x7e, 0xb7, 0x38, 0x79, + 0x7d, 0x3b, 0x22, 0x12, 0xda, 0x8a, 0xb, 0x1a, 0x30, 0x22, 0x7c, 0xab, 0x7e, + 0x8, 0x8d, 0xb6, 0x7c, 0xba, 0x12, 0xd6, 0x85, 0x7e, 0x8, 0x8d, 0xf6, 0x12, + 0xd6, 0x85, 0x12, 0x15, 0x6, 0x7e, 0x27, 0x8d, 0xf6, 0x2, 0x12, 0x79, 0xa2, + 0x6, 0x92, 0x9, 0x12, 0xc4, 0xf6, 0x12, 0xda, 0xb7, 0x12, 0x75, 0xb9, 0x12, + 0xda, 0xae, 0x12, 0x75, 0xb9, 0x12, 0x15, 0x6, 0x12, 0x12, 0x75, 0x12, 0x17, + 0xfe, 0x2, 0x12, 0x86, 0x7e, 0x34, 0x0, 0x20, 0x7e, 0x27, 0x8d, 0xb6, 0x12, + 0x12, 0x86, 0x7e, 0x34, 0x0, 0x20, 0x22, 0xa2, 0x8, 0x92, 0x9, 0x12, 0xc4, + 0xf6, 0xa2, 0x8, 0x92, 0x9, 0x12, 0xda, 0xb7, 0x12, 0x75, 0x86, 0xa2, 0x8, + 0x92, 0x9, 0x12, 0xda, 0xae, 0x12, 0x75, 0x86, 0x12, 0x15, 0x6, 0x12, 0x12, + 0x75, 0x12, 0x17, 0xfe, 0x2, 0x12, 0x86, 0x7c, 0xab, 0xd2, 0x5, 0x12, 0xca, + 0xe4, 0x1b, 0xa0, 0x68, 0x46, 0x1b, 0xa0, 0x68, 0x62, 0x1b, 0xa0, 0x78, 0x2, + 0xc1, 0x5, 0x1b, 0xa0, 0x68, 0x76, 0xb, 0xa2, 0x68, 0x2, 0xc1, 0x24, 0xd2, + 0x8, 0x12, 0x15, 0x16, 0x7e, 0x34, 0x9a, 0x4c, 0x12, 0x16, 0x94, 0xd2, 0x2e, + 0xd2, 0x2d, 0x7e, 0xf, 0x39, 0xed, 0x2e, 0x14, 0x0, 0x10, 0xb, 0xa, 0x30, + 0x4e, 0x70, 0x10, 0x1b, 0xa, 0x30, 0x12, 0x49, 0xc6, 0x12, 0x1c, 0xb5, 0x4e, + 0x70, 0x10, 0x1b, 0xa, 0x30, 0x12, 0xc5, 0x45, 0x80, 0x72, 0xd2, 0x6, 0x12, + 0x14, 0xe7, 0x12, 0xd9, 0x88, 0x12, 0x16, 0x29, 0x12, 0xd9, 0x88, 0x12, + 0x16, 0xb8, 0x12, 0x16, 0xa0, 0x12, 0xda, 0x78, 0xb4, 0x1, 0x4, 0x74, 0x1, + 0x80, 0x6d, 0x80, 0x52, 0x12, 0x1f, 0xd9, 0x78, 0x7, 0xd2, 0x8, 0x12, 0x15, + 0x16, 0x80, 0x5, 0xd2, 0x6, 0x12, 0x14, 0xe7, 0x7e, 0x34, 0x9a, 0x62, 0x12, + 0x16, 0x94, 0xd2, 0x2e, 0xd2, 0x2d, 0x80, 0x34, 0x7e, 0x34, 0x0, 0xb, 0xca, + 0x39, 0x7e, 0x63, 0x9b, 0xaf, 0xac, 0x67, 0x2e, 0x34, 0x9a, 0x4c, 0x6d, + 0x22, 0x7e, 0x8, 0x94, 0xd6, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x7e, 0x34, 0x0, + 0x1, 0x7a, 0x37, 0x94, 0xd6, 0x7e, 0x34, 0x94, 0xd6, 0x12, 0x16, 0x94, 0x12, + 0xda, 0x78, 0xb4, 0x1, 0x4, 0x74, 0x4, 0x80, 0x19, 0x12, 0x1f, 0xf6, 0x80, + 0x21, 0x7e, 0x34, 0x9a, 0x6d, 0x12, 0x16, 0x94, 0x7e, 0xb3, 0x9b, 0x7f, + 0xb4, 0x1, 0xc, 0xd2, 0x2e, 0xd2, 0x2d, 0x74, 0x3, 0x7a, 0xb3, 0x9b, 0x82, + 0x80, 0x7, 0x12, 0xc4, 0x48, 0x80, 0x2, 0xc2, 0x5, 0xa2, 0x5, 0x22, 0x12, + 0xc9, 0x4f, 0x12, 0xc6, 0xc2, 0xb, 0xa, 0x30, 0x5e, 0x60, 0x7f, 0x1b, 0xa, + 0x30, 0xe5, 0x47, 0x54, 0x1f, 0xa, 0x2b, 0x12, 0x16, 0xa7, 0xe5, 0x48, 0x12, + 0x16, 0xf2, 0x12, 0x16, 0xa7, 0xe5, 0x49, 0x54, 0x3, 0x12, 0x16, 0xf4, 0x3e, + 0x24, 0x12, 0x16, 0xa7, 0x7e, 0x35, 0x45, 0xbe, 0x34, 0x0, 0x2, 0x78, 0x35, + 0x12, 0xc6, 0xc2, 0xb, 0xa, 0x30, 0x4e, 0x60, 0x80, 0x1b, 0xa, 0x30, 0xe5, + 0x4a, 0x54, 0x1f, 0x7c, 0x4b, 0x6c, 0x55, 0x12, 0x16, 0xa7, 0xe5, 0x4b, + 0x54, 0x1, 0xa, 0x5b, 0xc4, 0x23, 0x54, 0xe0, 0x7c, 0xab, 0xe4, 0x12, 0xda, + 0x81, 0x12, 0x48, 0xbe, 0xe5, 0x4c, 0x12, 0x4f, 0xdf, 0x12, 0xda, 0x81, + 0x12, 0x48, 0xbe, 0x22, 0x7e, 0x14, 0x0, 0x45, 0x74, 0xb, 0x12, 0x1, 0xf3, + 0x12, 0x16, 0x29, 0x74, 0x1, 0x7a, 0xb3, 0x9a, 0x7b, 0x22, 0x7e, 0xf, 0x39, + 0xed, 0x2e, 0x14, 0x0, 0x12, 0xb, 0xa, 0x30, 0x4d, 0x32, 0x1b, 0xa, 0x30, + 0x22, 0x12, 0xd7, 0x3b, 0x5e, 0x70, 0xf8, 0x12, 0xd7, 0x38, 0x4e, 0x70, 0x3, + 0x1b, 0xa, 0x30, 0x6d, 0x33, 0x12, 0xc9, 0x70, 0xe5, 0x4d, 0x54, 0x1f, 0xa, + 0x2b, 0x12, 0x17, 0xf5, 0x12, 0x16, 0xaf, 0xe5, 0x4e, 0x12, 0x16, 0xf2, + 0x12, 0x17, 0xf5, 0x12, 0x16, 0xaf, 0xe5, 0x4f, 0x54, 0x3, 0x12, 0x16, 0xf4, + 0x3e, 0x24, 0x12, 0x17, 0xf5, 0x2, 0x16, 0xaf, 0x54, 0x1, 0xa, 0x2b, 0x3e, + 0x24, 0x3e, 0x24, 0x3e, 0x24, 0x3e, 0x24, 0x3e, 0x24, 0x22, 0x12, 0xc7, + 0x23, 0x7e, 0xb3, 0x69, 0xec, 0x60, 0x6, 0x7e, 0x34, 0x9d, 0x2, 0x80, 0x4, + 0x7e, 0x34, 0x9d, 0x0, 0x12, 0xd7, 0x8b, 0xb4, 0x1, 0xa, 0x12, 0x1f, 0xd9, + 0x68, 0x5, 0xd2, 0x6, 0x12, 0x14, 0xe7, 0x12, 0xd7, 0x59, 0x2, 0x17, 0x2a, + 0x7d, 0x53, 0x3e, 0x54, 0x2e, 0x54, 0xb0, 0x0, 0x6d, 0x44, 0x6d, 0x33, 0x80, + 0x3, 0x12, 0xd7, 0xda, 0xbd, 0x32, 0x40, 0xf9, 0x22, 0x12, 0x50, 0x6f, 0xe4, + 0x12, 0x5f, 0xbe, 0x12, 0x50, 0x66, 0x60, 0x29, 0x6d, 0x22, 0x12, 0x17, + 0xed, 0x7e, 0x8, 0x82, 0x51, 0x7d, 0x2b, 0x12, 0x17, 0xed, 0x7d, 0x1b, 0x3e, + 0x14, 0x2e, 0x14, 0x82, 0x51, 0x6d, 0x0, 0x7d, 0x2a, 0x12, 0x17, 0x8f, 0x7d, + 0x3a, 0x12, 0x50, 0x5d, 0x7e, 0x24, 0x0, 0x4, 0x2, 0x17, 0x8f, 0x12, 0x50, + 0x78, 0x7e, 0x8, 0x82, 0x51, 0x12, 0x50, 0x84, 0x2e, 0x14, 0x82, 0x51, 0x12, + 0x50, 0x54, 0x6d, 0x22, 0x2, 0x17, 0x2a, 0x7e, 0x24, 0x0, 0x17, 0x7d, 0x53, + 0x3e, 0x54, 0x2e, 0x54, 0xa0, 0x0, 0x6d, 0x44, 0x6d, 0x33, 0x80, 0x3, 0x12, + 0xd7, 0xda, 0xbd, 0x32, 0x40, 0xf9, 0x22, 0x12, 0xc7, 0x23, 0x7e, 0x34, + 0x28, 0x1, 0x7a, 0x37, 0x8d, 0xc2, 0x7e, 0x34, 0x9, 0x70, 0x7a, 0x37, 0x8d, + 0xc4, 0x7e, 0x34, 0x8, 0x0, 0x7a, 0x37, 0x8d, 0xc6, 0x7e, 0xb3, 0x69, 0xec, + 0x60, 0x6, 0x7e, 0x34, 0x9d, 0x2, 0x80, 0x4, 0x7e, 0x34, 0x9d, 0x0, 0x12, + 0xd7, 0x8b, 0xb4, 0x1, 0xa, 0x12, 0x1f, 0xd9, 0x68, 0x5, 0xd2, 0x6, 0x12, + 0x14, 0xe7, 0x12, 0xd7, 0x59, 0x2, 0x17, 0x2a, 0x7e, 0x24, 0x43, 0x21, 0x2, + 0x12, 0x86, 0x12, 0x17, 0x2a, 0x7e, 0x34, 0x1, 0x0, 0x22, 0x7e, 0xf, 0x39, + 0xed, 0x2e, 0x14, 0x0, 0x24, 0x22, 0x7e, 0x34, 0x0, 0x27, 0x7e, 0x27, 0x8d, + 0xc4, 0x22, 0xca, 0x79, 0x7c, 0xeb, 0x12, 0xda, 0xc0, 0x7e, 0x73, 0x9a, + 0xf3, 0x19, 0x75, 0x9b, 0x29, 0x7e, 0x34, 0x0, 0x5, 0xca, 0x39, 0x7e, 0x30, + 0x5, 0xac, 0x3e, 0x2e, 0x14, 0x9b, 0x43, 0x6d, 0x0, 0x7e, 0x18, 0x9a, 0xfc, + 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x12, 0x1c, 0xb, 0x74, 0x8, 0xac, 0xbe, 0x9, + 0xb5, 0x9b, 0x29, 0x12, 0x1a, 0xa5, 0x12, 0xd9, 0xa3, 0x7d, 0x3b, 0x2e, + 0x34, 0x0, 0xb, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x8e, 0x3e, 0x6d, + 0x0, 0x7e, 0x24, 0x0, 0x3, 0x12, 0xd8, 0x5b, 0x12, 0x17, 0x2a, 0xda, 0x79, + 0x22, 0x12, 0x49, 0x1e, 0x79, 0x50, 0x0, 0x4, 0x22, 0xca, 0x3b, 0x7c, 0xeb, + 0xbe, 0xe0, 0x4, 0x40, 0x2, 0x41, 0x86, 0x12, 0xda, 0xc0, 0xbe, 0xf0, 0x4, + 0x40, 0x2, 0x41, 0x86, 0x9, 0x75, 0x9b, 0x23, 0xa, 0x47, 0x3e, 0x44, 0x3e, + 0x44, 0x3e, 0x44, 0xb, 0x46, 0x7a, 0x45, 0x27, 0x9, 0x75, 0x9b, 0x24, 0xa, + 0x67, 0x3e, 0x64, 0x3e, 0x64, 0x3e, 0x64, 0xb, 0x66, 0x7e, 0x50, 0x3c, 0xac, + 0x5f, 0x2e, 0x24, 0x8e, 0x28, 0xb, 0x28, 0x30, 0x4e, 0x70, 0x1, 0x1b, 0x28, + 0x30, 0x74, 0x8, 0xac, 0xbe, 0x9, 0x75, 0x9b, 0x2a, 0x2e, 0x70, 0xff, 0x92, + 0x1, 0x12, 0x1a, 0xce, 0x12, 0xd6, 0xeb, 0x7e, 0x90, 0x8, 0xac, 0x9e, 0x9, + 0xb4, 0x9b, 0x26, 0xf5, 0x29, 0x7e, 0x70, 0x3c, 0xac, 0x7f, 0x7d, 0x13, + 0x12, 0x1a, 0xc7, 0x2e, 0x34, 0x8e, 0x5a, 0x6d, 0x22, 0x9, 0xb4, 0x9b, 0x25, + 0x12, 0x75, 0x3f, 0x12, 0x1a, 0xc2, 0x7e, 0x35, 0x27, 0x12, 0x1a, 0x99, + 0x12, 0x1a, 0xb6, 0x7d, 0x36, 0x12, 0x1a, 0x9f, 0x7e, 0x30, 0x3c, 0xac, + 0x3f, 0x12, 0xda, 0x45, 0x74, 0x8, 0xac, 0xbe, 0x12, 0xd6, 0x48, 0x12, 0x1a, + 0xb6, 0x74, 0x3, 0xac, 0xbe, 0x12, 0xd7, 0x0, 0x12, 0x1b, 0x47, 0x6d, 0x33, + 0x12, 0x0, 0x16, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x12, 0x48, 0xa8, 0x7e, 0x70, + 0x5, 0xac, 0x7e, 0x9, 0xb3, 0x9b, 0x63, 0x9, 0x73, 0x9b, 0x64, 0x12, 0x48, + 0xfe, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x12, 0x48, 0xa8, 0x74, 0x5, 0xac, 0xbe, + 0x9, 0xb5, 0x9b, 0x65, 0x12, 0x48, 0xaf, 0x12, 0x1a, 0xda, 0x9, 0xb5, 0x9b, + 0x66, 0x12, 0x48, 0xc7, 0x12, 0x1a, 0xda, 0x9, 0xb5, 0x9b, 0x67, 0x12, 0x48, + 0xef, 0x12, 0x1b, 0x26, 0x12, 0x0, 0x16, 0xc2, 0x1, 0x12, 0x1a, 0xf0, 0x12, + 0xd6, 0x9d, 0x12, 0x1c, 0xb, 0x74, 0x8, 0xac, 0xbe, 0x9, 0xb5, 0x9b, 0x29, + 0x12, 0x1a, 0xa5, 0x7e, 0x50, 0x3c, 0xac, 0x5f, 0x2e, 0x24, 0x8e, 0x3c, 0xb, + 0x28, 0x30, 0x7e, 0x34, 0x0, 0x2, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, + 0x44, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x46, 0x6d, 0x33, 0x74, + 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x48, 0x7e, 0x34, 0x22, 0x5, 0x74, 0x3c, + 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x4a, 0x7e, 0x34, 0x0, 0x6, 0x74, 0x3c, 0xac, + 0xbf, 0x59, 0x35, 0x8e, 0x4c, 0x7e, 0x34, 0x0, 0x12, 0x74, 0x3c, 0xac, 0xbf, + 0x59, 0x35, 0x8e, 0x4e, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x50, + 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x52, 0x7e, 0x34, 0x8, 0x8, 0x74, + 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x54, 0x6d, 0x33, 0x74, 0x3c, 0xac, + 0xbf, 0x59, 0x35, 0x8e, 0x5c, 0x7e, 0x34, 0x0, 0x1, 0x74, 0x3c, 0xac, 0xbf, + 0x59, 0x35, 0x8e, 0x56, 0x7e, 0x34, 0xc, 0x1c, 0x74, 0x3c, 0xac, 0xbf, 0x59, + 0x35, 0x8e, 0x58, 0x7e, 0x50, 0x3c, 0xac, 0x5f, 0x2e, 0x24, 0x8e, 0x5a, 0xb, + 0x28, 0x30, 0x4e, 0x34, 0x41, 0x96, 0x1b, 0x28, 0x30, 0x7e, 0x34, 0x1f, 0x0, + 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x5e, 0xbe, 0xe0, 0x3, 0x78, 0x19, + 0x7e, 0x34, 0x3, 0x51, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x38, 0x7e, + 0x34, 0x4, 0x4, 0x12, 0x1a, 0xad, 0x7e, 0x34, 0x4, 0x29, 0x80, 0x7, 0x7e, + 0x34, 0xa, 0x19, 0x12, 0x1a, 0xad, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, + 0x62, 0x7e, 0x34, 0x0, 0x2c, 0x7a, 0x35, 0x2f, 0x12, 0xd9, 0xe7, 0x7e, 0x35, + 0x27, 0x7d, 0x26, 0x12, 0xd6, 0xca, 0x7e, 0x35, 0x27, 0x7d, 0x26, 0x12, + 0x1a, 0xea, 0x7e, 0x35, 0x27, 0x7d, 0x26, 0x74, 0x2a, 0x12, 0xd6, 0x6d, + 0x74, 0x3, 0x12, 0x14, 0xcb, 0x12, 0xd9, 0xa3, 0x7d, 0x3b, 0x12, 0x1a, 0xce, + 0x7e, 0x24, 0x0, 0x1e, 0x12, 0xd8, 0x5b, 0x7e, 0x24, 0x0, 0x3, 0x12, 0x17, + 0x2a, 0xda, 0x3b, 0x22, 0xb, 0xa, 0x30, 0x5e, 0x34, 0xfc, 0x0, 0x1b, 0xa, + 0x30, 0x4d, 0x32, 0x1b, 0xa, 0x30, 0x22, 0x12, 0xd6, 0xc0, 0x2, 0x1a, 0x90, + 0x12, 0xd6, 0xc0, 0x2, 0x1a, 0x90, 0x12, 0x49, 0x1e, 0x79, 0x50, 0x0, 0x4, + 0x22, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x60, 0x22, 0x7e, 0x30, + 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x8e, 0x2c, 0x6d, 0x0, 0x22, 0x7e, 0x30, 0x3c, + 0xac, 0x3f, 0x2e, 0x14, 0x8e, 0x2a, 0x6d, 0x0, 0x22, 0x7e, 0x30, 0x3c, 0xac, + 0x3f, 0x2e, 0x14, 0x8e, 0x28, 0x6d, 0x0, 0x22, 0x7e, 0x30, 0x3c, 0xac, 0x3f, + 0x2e, 0x14, 0x8e, 0x3c, 0x6d, 0x0, 0x74, 0x5, 0xac, 0xbe, 0x22, 0x12, 0x1a, + 0xfc, 0x75, 0x2f, 0x2c, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x8e, + 0x5a, 0x6d, 0x0, 0x22, 0x7d, 0x52, 0x7d, 0x43, 0x7e, 0x1d, 0x2f, 0xb, 0x1a, + 0x30, 0x5e, 0x60, 0x7, 0x7e, 0x25, 0x33, 0x2d, 0x23, 0x7d, 0x35, 0x2d, 0x34, + 0xbe, 0x34, 0x0, 0xe0, 0x28, 0x8, 0x9e, 0x34, 0x0, 0xe0, 0x3e, 0x34, 0x2d, + 0x23, 0x2, 0x1a, 0x89, 0x12, 0x12, 0x86, 0x7e, 0x70, 0x3c, 0xac, 0x7f, 0x7d, + 0x13, 0x2e, 0x14, 0x8e, 0x36, 0x6d, 0x0, 0x7a, 0xd, 0x2f, 0x7d, 0x13, 0x2e, + 0x14, 0x8e, 0x2a, 0x6d, 0x0, 0x2e, 0x34, 0x8e, 0x2c, 0x6d, 0x22, 0x12, 0x1b, + 0xd7, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x8e, 0x36, 0x6d, 0x0, 0x22, + 0xca, 0xf8, 0x7c, 0xab, 0x6c, 0xff, 0x7e, 0x70, 0x8, 0xac, 0x7f, 0x19, 0xa3, + 0x9b, 0x23, 0xb, 0xf0, 0xbe, 0xf0, 0x4, 0x78, 0xf0, 0x6c, 0xff, 0x74, 0x8, + 0xac, 0xbf, 0x9, 0xa5, 0x9b, 0x23, 0x12, 0xd8, 0xbc, 0x12, 0x1a, 0xc2, 0x7d, + 0x3f, 0x12, 0x1a, 0x99, 0x7d, 0x3e, 0xb, 0x34, 0x74, 0x3c, 0xac, 0xbf, 0x49, + 0x25, 0x8e, 0x2a, 0x12, 0x1b, 0x23, 0x12, 0xd7, 0xf3, 0x40, 0xd9, 0xda, + 0xf8, 0x22, 0xca, 0xf8, 0x7c, 0xab, 0x6c, 0xff, 0x7e, 0x70, 0x8, 0xac, 0x7f, + 0x19, 0xa3, 0x9b, 0x24, 0xb, 0xf0, 0xbe, 0xf0, 0x4, 0x78, 0xf0, 0x6c, 0xff, + 0x74, 0x8, 0xac, 0xbf, 0x9, 0xa5, 0x9b, 0x24, 0x12, 0xd8, 0xbc, 0x12, 0x1a, + 0xb6, 0x7d, 0x3f, 0x12, 0x1a, 0x9f, 0x7d, 0x3e, 0xb, 0x35, 0x74, 0x3c, 0xac, + 0xbf, 0x49, 0x25, 0x8e, 0x2c, 0x12, 0x1b, 0x23, 0x12, 0xd7, 0xf3, 0x40, + 0xd9, 0xda, 0xf8, 0x22, 0x7f, 0x21, 0xb, 0xa, 0x20, 0x5e, 0x40, 0x7, 0xb, + 0x2a, 0x10, 0x5e, 0x20, 0x7, 0x7e, 0x2d, 0x2f, 0xb, 0x2a, 0x30, 0x5e, 0x60, + 0x3, 0x2d, 0x12, 0x2d, 0x13, 0x7e, 0x4, 0x0, 0xc9, 0x7e, 0x24, 0x0, 0xa7, + 0xbe, 0x14, 0x0, 0xb8, 0x68, 0x8, 0xbd, 0x1, 0x68, 0x4, 0xbd, 0x21, 0x78, + 0x2, 0xb, 0x34, 0x22, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x8e, 0x3e, + 0x6d, 0x0, 0x7e, 0x70, 0x5, 0xac, 0x7e, 0x2e, 0x34, 0x9b, 0x43, 0x6d, 0x22, + 0x74, 0x8, 0xac, 0xbe, 0x9, 0xb5, 0x9b, 0x29, 0x12, 0x18, 0x5f, 0x7e, 0x30, + 0x6, 0xac, 0x3f, 0x2e, 0x14, 0x8d, 0x9a, 0x6d, 0x0, 0x7e, 0x70, 0x5, 0xac, + 0x7e, 0x2e, 0x34, 0x9b, 0x43, 0x22, 0x12, 0x1f, 0xd9, 0x78, 0x7, 0xe4, 0x7a, + 0xb3, 0x9b, 0xa8, 0x80, 0x12, 0x7e, 0xb3, 0x9b, 0xa8, 0xb4, 0x2, 0x8, 0x74, + 0x2, 0x7a, 0xb3, 0x9b, 0xa8, 0x80, 0x3, 0x12, 0x1c, 0xa1, 0x7a, 0xb3, 0x9b, + 0xaf, 0x74, 0x2, 0x12, 0x18, 0x67, 0x7e, 0xb3, 0x9b, 0xa8, 0x24, 0x0, 0x68, + 0xe, 0x24, 0xfd, 0x68, 0x7, 0xb, 0xb1, 0x78, 0xc, 0x2, 0x3f, 0xdc, 0x2, + 0x1c, 0xa1, 0xe4, 0x12, 0x18, 0x67, 0x80, 0x0, 0x2, 0x1c, 0x87, 0x12, 0xcc, + 0x7f, 0x78, 0x6, 0xe4, 0x7a, 0xb3, 0x9b, 0xaf, 0x22, 0x12, 0x1c, 0xb9, 0x12, + 0xc7, 0xd, 0x12, 0xd7, 0x15, 0x12, 0x3f, 0xf9, 0x2, 0xc5, 0x49, 0x74, 0x1, + 0x7a, 0xb3, 0x9b, 0xa8, 0x22, 0x2e, 0x14, 0x0, 0xe, 0xb, 0xa, 0x30, 0x5e, + 0x60, 0xfd, 0x1b, 0xa, 0x30, 0x7e, 0xf, 0x39, 0xed, 0x2e, 0x14, 0x0, 0xe, + 0xb, 0xa, 0x30, 0x22, 0x12, 0x1f, 0xd9, 0x68, 0x27, 0xd2, 0x30, 0x7e, 0xb3, + 0x9b, 0x7f, 0xb4, 0x1, 0x5, 0x12, 0x3f, 0xdc, 0x80, 0x3, 0x12, 0x1c, 0x87, + 0x12, 0x1c, 0xb5, 0x4e, 0x60, 0x2, 0x12, 0x1c, 0xb2, 0x12, 0x1f, 0xff, 0x12, + 0x1f, 0xca, 0xe4, 0x7a, 0xb3, 0x3, 0xda, 0x80, 0x36, 0x30, 0x30, 0x5, 0x12, + 0x17, 0xa5, 0xc2, 0x30, 0x12, 0x0, 0x40, 0x12, 0xcc, 0x8c, 0xe4, 0x12, 0x1f, + 0xcc, 0x7e, 0xf, 0x39, 0xed, 0x2e, 0x14, 0x0, 0xa, 0x12, 0xd8, 0x44, 0x7a, + 0xb3, 0x9b, 0x7e, 0x7a, 0xb3, 0x59, 0x60, 0x7a, 0xb3, 0x3, 0xda, 0x7e, 0xf, + 0x39, 0xed, 0x12, 0x1c, 0xa8, 0x12, 0x1f, 0xef, 0x12, 0x3f, 0xb2, 0x12, + 0x3a, 0xdf, 0x12, 0x37, 0xa0, 0x2, 0x1d, 0x2c, 0x74, 0x1, 0x12, 0x32, 0x2b, + 0x6c, 0xaa, 0x7e, 0x63, 0x9b, 0xa8, 0x7e, 0x70, 0x8, 0xac, 0x67, 0x9, 0xb3, + 0x9b, 0x23, 0xa, 0x4b, 0x7e, 0x50, 0x2, 0xac, 0x5a, 0x49, 0x32, 0x76, 0x60, + 0xbd, 0x43, 0x78, 0x4, 0x7a, 0xa3, 0x39, 0x45, 0x7e, 0x50, 0x1e, 0xac, 0x5a, + 0x19, 0x72, 0x39, 0x49, 0xb, 0xa0, 0xbe, 0xa0, 0x3, 0x78, 0xd0, 0x7e, 0x73, + 0x39, 0x45, 0xbe, 0x70, 0x3, 0x40, 0x5, 0xe4, 0x7a, 0xb3, 0x39, 0x45, 0x7e, + 0xb3, 0x39, 0x45, 0x12, 0xb7, 0x3d, 0x7e, 0x73, 0x39, 0x45, 0x7a, 0x73, + 0x39, 0xdb, 0x22, 0xca, 0xb8, 0xca, 0x1b, 0xca, 0xb, 0x12, 0x1d, 0xff, 0x5e, + 0x34, 0x80, 0x0, 0x68, 0x1c, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x80, 0x0, 0x68, + 0x13, 0x12, 0x1c, 0xb9, 0x6e, 0x70, 0x40, 0x1b, 0xa, 0x30, 0x7e, 0x34, 0x80, + 0x0, 0x12, 0x1f, 0xc1, 0x12, 0x1f, 0xe6, 0x12, 0x1d, 0xff, 0x5e, 0x34, 0x0, + 0x2, 0x68, 0x19, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0x2, 0x68, 0x10, 0x12, + 0x1c, 0xa8, 0x12, 0x1f, 0xef, 0x7e, 0x34, 0x0, 0x2, 0x12, 0x1f, 0xc1, 0x12, + 0x1f, 0xe6, 0x12, 0x1d, 0xff, 0x5e, 0x34, 0x0, 0x1, 0x68, 0x1f, 0xb, 0xa, + 0x30, 0x5e, 0x34, 0x0, 0x1, 0x68, 0x16, 0x12, 0x1c, 0xb9, 0x4e, 0x60, 0x2, + 0x12, 0x1c, 0xb2, 0x12, 0x1f, 0xff, 0x7e, 0x34, 0x0, 0x1, 0x12, 0x1f, 0xc1, + 0x12, 0xc4, 0x3a, 0xc2, 0xc1, 0xda, 0xb, 0xda, 0x1b, 0xda, 0xb8, 0x32, 0x7e, + 0xf, 0x39, 0xed, 0x69, 0x30, 0x0, 0x4, 0x22, 0xca, 0x7b, 0xca, 0x6b, 0xca, + 0x5b, 0xca, 0x4b, 0xca, 0x2b, 0xca, 0x1b, 0xca, 0xb, 0x12, 0x1d, 0xff, 0x5e, + 0x34, 0x0, 0x40, 0x68, 0x52, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0x40, 0x68, + 0x49, 0x7e, 0x34, 0x0, 0x40, 0x79, 0x30, 0x0, 0x2, 0x30, 0x1d, 0x5, 0x12, + 0x1f, 0xf6, 0xc2, 0x1d, 0x7e, 0xb3, 0x9b, 0x82, 0xbe, 0xb0, 0x1, 0x68, 0x3, + 0xb4, 0x4, 0x13, 0x12, 0x1f, 0xf6, 0x30, 0xd, 0x8, 0x7e, 0x73, 0x9b, 0x7b, + 0x7a, 0x73, 0x9b, 0x79, 0xe4, 0x7a, 0xb3, 0x9b, 0x82, 0x7e, 0x1f, 0x39, + 0xed, 0x69, 0x31, 0x0, 0xa, 0x5e, 0x34, 0xf, 0xc0, 0x12, 0x4e, 0x2c, 0x1e, + 0x34, 0x7a, 0x73, 0x9b, 0x7e, 0xe4, 0x7a, 0xb3, 0x3, 0xd4, 0x12, 0x1d, 0xff, + 0x5e, 0x34, 0x0, 0x8, 0x68, 0x11, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0x8, + 0x68, 0x8, 0x7e, 0x34, 0x0, 0x8, 0x79, 0x30, 0x0, 0x2, 0x12, 0x1d, 0xff, + 0x5e, 0x34, 0x0, 0x10, 0x68, 0x17, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0x10, + 0x68, 0xe, 0x7e, 0x34, 0x0, 0x10, 0x79, 0x30, 0x0, 0x2, 0x74, 0x2, 0x7a, + 0xb3, 0x3, 0xd4, 0x12, 0x1d, 0xff, 0x5e, 0x34, 0x0, 0x20, 0x68, 0x17, 0xb, + 0xa, 0x30, 0x5e, 0x34, 0x0, 0x20, 0x68, 0xe, 0x7e, 0x34, 0x0, 0x20, 0x79, + 0x30, 0x0, 0x2, 0x74, 0x1, 0x7a, 0xb3, 0x3, 0xd4, 0x12, 0x1d, 0xff, 0x5e, + 0x34, 0x40, 0x0, 0x68, 0x2e, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x40, 0x0, 0x68, + 0x25, 0x7e, 0x34, 0x40, 0x0, 0x79, 0x30, 0x0, 0x2, 0xd2, 0xc, 0x7e, 0xb3, + 0x9b, 0x7a, 0xbe, 0xb0, 0xc8, 0x50, 0x5, 0x4, 0x7a, 0xb3, 0x9b, 0x7a, 0x7e, + 0xb3, 0x9b, 0x7a, 0xb4, 0x1, 0x3, 0x12, 0x32, 0x20, 0x12, 0x53, 0xf1, 0x12, + 0x1d, 0xff, 0x5e, 0x34, 0x20, 0x0, 0x68, 0x16, 0xb, 0xa, 0x30, 0x5e, 0x34, + 0x20, 0x0, 0x68, 0xd, 0x7e, 0x34, 0x20, 0x0, 0x79, 0x30, 0x0, 0x2, 0xd2, + 0xc, 0x12, 0x53, 0xf1, 0x12, 0x1d, 0xff, 0x5e, 0x34, 0x10, 0x0, 0x68, 0x66, + 0xb, 0xa, 0x30, 0x7d, 0x23, 0x5e, 0x24, 0x10, 0x0, 0x68, 0x5b, 0x5e, 0x34, + 0x8, 0x0, 0x2e, 0x34, 0xff, 0xff, 0x92, 0xf, 0x69, 0x30, 0x0, 0x6, 0x7d, + 0x23, 0x5e, 0x24, 0x0, 0x1, 0x68, 0xc, 0x5e, 0x34, 0x4, 0x0, 0x2e, 0x34, + 0xff, 0xff, 0x72, 0xf, 0x92, 0xf, 0x7e, 0x34, 0x8, 0x0, 0x79, 0x30, 0x0, + 0x2, 0x7e, 0xb3, 0x38, 0x83, 0xb4, 0x1, 0xf, 0x74, 0x2, 0x7a, 0xb3, 0x38, + 0x83, 0x7e, 0x34, 0x10, 0x0, 0x12, 0x1f, 0xc1, 0x80, 0x3d, 0xc2, 0x2e, 0x12, + 0xca, 0x81, 0x12, 0x49, 0xe4, 0x7e, 0xb3, 0x3, 0xfd, 0xbe, 0xb0, 0x3, 0x68, + 0xa, 0x12, 0x1f, 0xd9, 0x78, 0x5, 0xc2, 0x8, 0x12, 0x15, 0x16, 0x12, 0x1d, + 0xff, 0x5e, 0x34, 0x0, 0x4, 0x68, 0x19, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, + 0x4, 0x68, 0x10, 0x7e, 0x34, 0x0, 0x4, 0x79, 0x30, 0x0, 0x2, 0x7e, 0xb3, + 0x59, 0x60, 0x70, 0x2, 0xd2, 0x12, 0xda, 0xb, 0xda, 0x1b, 0xda, 0x2b, 0xda, + 0x4b, 0xda, 0x5b, 0xda, 0x6b, 0xda, 0x7b, 0x32, 0x7e, 0xf, 0x39, 0xed, 0x79, + 0x30, 0x0, 0x2, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x9b, 0xaf, 0x7a, 0xb3, 0x9b, + 0xa8, 0x22, 0xd2, 0xb, 0xd2, 0xe, 0x7e, 0x1f, 0x39, 0xed, 0x69, 0x31, 0x0, + 0x6, 0x5e, 0x34, 0x0, 0x1, 0x22, 0x12, 0x1f, 0xd5, 0x78, 0x3, 0x2, 0xc4, + 0x1e, 0x22, 0x4e, 0x70, 0x2, 0x1b, 0xa, 0x30, 0x22, 0x12, 0xc6, 0xc2, 0xb, + 0xa, 0x30, 0x2, 0x1f, 0xef, 0x5e, 0x70, 0xfd, 0x1b, 0xa, 0x30, 0x22, 0x7c, + 0x7b, 0x74, 0x8, 0xac, 0x7b, 0xb, 0x36, 0xbe, 0x34, 0x0, 0x6, 0x50, 0x2, + 0xc3, 0x22, 0xd3, 0x22, 0x7c, 0x2b, 0xa5, 0xba, 0x0, 0x3, 0x2, 0x61, 0x79, + 0xa5, 0xba, 0x5f, 0x5, 0x7e, 0xb3, 0x9b, 0x1b, 0x22, 0xbe, 0x20, 0x5c, 0x38, + 0x7, 0xa, 0x32, 0x9, 0xb3, 0x9a, 0xbc, 0x22, 0xbe, 0x20, 0x6a, 0x68, 0x4, + 0xa5, 0xba, 0x6b, 0x1d, 0x7e, 0x37, 0x37, 0xda, 0x7d, 0x23, 0xb, 0x24, 0x7a, + 0x27, 0x37, 0xda, 0x2e, 0x37, 0x38, 0x92, 0x7e, 0x39, 0x30, 0xa5, 0xba, + 0x6b, 0x3, 0x75, 0xf, 0x6a, 0x7c, 0xb3, 0x22, 0xbe, 0x20, 0x6e, 0x68, 0x4, + 0xa5, 0xba, 0x6f, 0x2d, 0x7e, 0x7, 0x8d, 0x94, 0xbe, 0x7, 0x37, 0xd6, 0x7e, + 0x37, 0x37, 0xd6, 0x28, 0x8, 0x12, 0x21, 0xa8, 0x5e, 0x30, 0x3f, 0x80, 0x3, + 0x12, 0x21, 0xa8, 0x7e, 0x7, 0x37, 0xd6, 0xb, 0x4, 0x7a, 0x7, 0x37, 0xd6, + 0xa5, 0xba, 0x6f, 0x3, 0x75, 0xf, 0x6e, 0x7c, 0xb3, 0x22, 0xbe, 0x20, 0x6c, + 0x68, 0x4, 0xa5, 0xba, 0x6d, 0x1d, 0x7e, 0x37, 0x38, 0x8e, 0x7d, 0x23, 0xb, + 0x24, 0x7a, 0x27, 0x38, 0x8e, 0x2e, 0x37, 0x38, 0x74, 0x7e, 0x39, 0x30, + 0xa5, 0xba, 0x6d, 0x3, 0x75, 0xf, 0x6c, 0x7c, 0xb3, 0x22, 0xbe, 0x20, 0x89, + 0x68, 0x4, 0xa5, 0xba, 0x8a, 0x1d, 0x7e, 0x37, 0x38, 0x98, 0x7d, 0x23, 0xb, + 0x24, 0x7a, 0x27, 0x38, 0x98, 0x2e, 0x37, 0x38, 0x94, 0x7e, 0x39, 0x30, + 0xa5, 0xba, 0x8a, 0x3, 0x75, 0xf, 0x89, 0x7c, 0xb3, 0x22, 0xa5, 0xba, 0x10, + 0x7, 0x7e, 0x33, 0x9a, 0xcc, 0x7c, 0xb3, 0x22, 0xbe, 0x20, 0x70, 0x40, 0xa, + 0xbe, 0x20, 0x7f, 0x38, 0x5, 0x7c, 0xb2, 0x2, 0x50, 0x92, 0xbe, 0x20, 0x81, + 0x68, 0x4, 0xa5, 0xba, 0x82, 0x19, 0x7e, 0xb3, 0x9a, 0xd3, 0xa, 0x3b, 0x9, + 0x33, 0x37, 0xf2, 0x4, 0x7a, 0xb3, 0x9a, 0xd3, 0xa5, 0xba, 0x82, 0x3, 0x75, + 0xf, 0x81, 0x7c, 0xb3, 0x22, 0xa5, 0xba, 0x83, 0x5, 0x7e, 0xb3, 0x37, 0xde, + 0x22, 0xa5, 0xba, 0x86, 0x5, 0x7e, 0xb3, 0x37, 0xe2, 0x22, 0xa5, 0xba, 0x87, + 0x5, 0x7e, 0xb3, 0x37, 0xd2, 0x22, 0xa5, 0xba, 0x88, 0x3, 0xe5, 0xc4, 0x22, + 0xbe, 0x20, 0x92, 0x68, 0x4, 0xa5, 0xba, 0x93, 0x13, 0x7e, 0xb3, 0x37, 0xdf, + 0xa, 0x3b, 0x9, 0x33, 0x38, 0x84, 0xa5, 0xba, 0x93, 0x3, 0x75, 0xf, 0x92, + 0x80, 0x1a, 0xbe, 0x20, 0x94, 0x68, 0x4, 0xa5, 0xba, 0x95, 0x19, 0x7e, 0xb3, + 0x37, 0xdf, 0xa, 0x3b, 0x9, 0x33, 0x37, 0xe7, 0xa5, 0xba, 0x95, 0x3, 0x75, + 0xf, 0x94, 0x4, 0x7a, 0xb3, 0x37, 0xdf, 0x7c, 0xb3, 0x22, 0xa5, 0xba, 0xed, + 0x5, 0x7e, 0xb3, 0x38, 0x82, 0x22, 0xa5, 0xba, 0xee, 0x5, 0x7e, 0xb3, 0x38, + 0x7c, 0x22, 0xa5, 0xba, 0xef, 0x5, 0x7e, 0xb3, 0x38, 0x7d, 0x22, 0xa5, 0xba, + 0xfe, 0xd, 0x7e, 0x23, 0x9b, 0xa8, 0x74, 0x8, 0xac, 0xb2, 0x9, 0xb5, 0x9b, + 0x23, 0x22, 0xe4, 0x22, 0x2e, 0x37, 0x38, 0x8a, 0x7e, 0x39, 0x30, 0x22, + 0x7c, 0x7b, 0x6c, 0xaa, 0x12, 0x25, 0xf6, 0x78, 0x9, 0x7c, 0xb7, 0x12, 0x60, + 0x7c, 0x7c, 0xab, 0x80, 0xa, 0xb4, 0x4, 0x7, 0x7c, 0xb7, 0x12, 0x20, 0x18, + 0x7c, 0xab, 0x7c, 0xba, 0x22, 0x30, 0x90, 0x19, 0xc2, 0x90, 0xe5, 0x8, 0x70, + 0x9, 0x75, 0x8, 0x1, 0xe5, 0x91, 0xf5, 0xf, 0x80, 0x11, 0x7e, 0x71, 0x91, + 0xe5, 0xf, 0x12, 0x21, 0xfa, 0x5, 0xf, 0x30, 0x91, 0xb, 0xc2, 0x91, 0x5, + 0xf, 0xe5, 0xf, 0x12, 0x21, 0xb0, 0xf5, 0x91, 0x22, 0x7c, 0x6b, 0x12, 0x25, + 0xf6, 0x78, 0x5, 0x7c, 0xb6, 0x2, 0x25, 0xfe, 0xb4, 0x4, 0x5, 0x7c, 0xb6, + 0x2, 0x22, 0xf, 0x22, 0x7c, 0x6b, 0xa5, 0xbe, 0x0, 0x7, 0x7c, 0xb7, 0x12, + 0x68, 0x27, 0xa1, 0xc5, 0xa5, 0xbe, 0xf, 0xd, 0x7a, 0x73, 0x9a, 0xcb, 0x74, + 0x1, 0x7a, 0xb3, 0x9a, 0xcc, 0xd2, 0x1e, 0x22, 0xa5, 0xbe, 0x49, 0x19, 0xa5, + 0xbf, 0x1, 0x7, 0x7a, 0x73, 0x9b, 0x5, 0xd2, 0x1e, 0x22, 0xa5, 0xbf, 0x0, + 0x2, 0x80, 0x2, 0xa1, 0xc5, 0x7a, 0x73, 0x9b, 0x5, 0xa1, 0xc5, 0xa5, 0xbe, + 0x4a, 0x6, 0x7a, 0x73, 0x9b, 0x6, 0xa1, 0xc5, 0xa5, 0xbe, 0x4b, 0x6, 0x7a, + 0x73, 0x9b, 0x7, 0xa1, 0xc5, 0xa5, 0xbe, 0x4c, 0x6, 0x7a, 0x73, 0x9b, 0x8, + 0xa1, 0xc5, 0xa5, 0xbe, 0x11, 0x29, 0xa5, 0xbf, 0x1, 0x15, 0x12, 0x25, 0xee, + 0x78, 0x2, 0xa1, 0xe4, 0x74, 0x1, 0x7a, 0xb3, 0x9a, 0xcd, 0xe4, 0x7a, 0xb3, + 0x9a, 0xcf, 0x2, 0xda, 0x29, 0xa5, 0xbf, 0x0, 0x2, 0x80, 0x2, 0xa1, 0xe4, + 0xe4, 0x7a, 0xb3, 0x9a, 0xcd, 0x2, 0xdb, 0x10, 0xa5, 0xbe, 0x12, 0xf, 0xa, + 0x27, 0x3e, 0x24, 0x3e, 0x24, 0x7a, 0x27, 0x38, 0x96, 0x7a, 0x73, 0x9a, + 0xce, 0x22, 0xa5, 0xbe, 0x13, 0xd, 0x7c, 0x67, 0x6c, 0x77, 0x2e, 0x37, 0x38, + 0x96, 0x7a, 0x37, 0x38, 0x96, 0x22, 0xa5, 0xbe, 0x1, 0x1b, 0x7e, 0xf, 0x2d, + 0x2e, 0x7d, 0x21, 0x7a, 0x27, 0x38, 0x92, 0x6d, 0x22, 0x7a, 0x27, 0x37, + 0xda, 0x7a, 0x73, 0x9a, 0xbd, 0x7c, 0xb7, 0x12, 0x53, 0x4, 0xa1, 0xc5, 0xbe, + 0x60, 0x5c, 0x28, 0x2, 0x81, 0xb9, 0xa5, 0xbe, 0x30, 0x11, 0x7e, 0x53, 0x9a, + 0xec, 0xbc, 0x57, 0x78, 0x2, 0xa1, 0xe4, 0xbe, 0x70, 0x4, 0x40, 0x2, 0xa1, + 0xe4, 0xbe, 0x60, 0x20, 0x40, 0xc, 0xbe, 0x60, 0x24, 0x38, 0x7, 0xbe, 0x70, + 0x3, 0x28, 0x2, 0xa1, 0xe4, 0x7c, 0xb6, 0x24, 0xf9, 0x78, 0x2, 0xa1, 0xe4, + 0x24, 0xfb, 0x78, 0x2, 0xa1, 0xe4, 0x14, 0x78, 0x2, 0xa1, 0xe4, 0x14, 0x78, + 0x2, 0xa1, 0xe4, 0x24, 0xe3, 0x78, 0x2, 0xa1, 0xe4, 0x14, 0x78, 0x2, 0xa1, + 0xe4, 0x80, 0x0, 0xa, 0x26, 0x19, 0x72, 0x9a, 0xbc, 0x7c, 0xb6, 0x1b, 0xb2, + 0xbe, 0xb0, 0x45, 0x40, 0x2, 0x81, 0x8f, 0x7e, 0xa0, 0x3, 0xa4, 0x90, 0x23, + 0x43, 0x73, 0x2, 0x24, 0x12, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x12, 0x2, 0x24, + 0x8f, 0x2, 0x24, 0x16, 0x2, 0x24, 0x12, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, + 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, + 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, + 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, + 0x2, 0x24, 0x55, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x62, 0x2, 0x24, 0x8f, 0x2, + 0x24, 0x75, 0x2, 0x24, 0x12, 0x2, 0x24, 0x12, 0x2, 0x24, 0x1b, 0x2, 0x24, + 0x1b, 0x2, 0x24, 0x1b, 0x2, 0x24, 0x1b, 0x2, 0x24, 0x1b, 0x2, 0x24, 0x8f, + 0x2, 0x24, 0x84, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, + 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, + 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x12, 0x2, 0x24, 0x2d, 0x2, 0x24, 0x36, + 0x2, 0x24, 0x48, 0x2, 0x24, 0x48, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x3f, 0x2, + 0x24, 0x24, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, + 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, + 0x2, 0x24, 0x24, 0x2, 0x24, 0x24, 0x2, 0x24, 0x24, 0x2, 0x24, 0x24, 0x2, + 0x24, 0x24, 0x2, 0x24, 0x24, 0x2, 0x24, 0x24, 0x2, 0x24, 0x24, 0x2, 0x24, + 0x24, 0xd2, 0x1e, 0x80, 0x79, 0x12, 0x0, 0x10, 0x80, 0x74, 0x7e, 0x27, 0x38, + 0x79, 0x4e, 0x40, 0x20, 0x80, 0x2b, 0x7e, 0x27, 0x38, 0x79, 0x4e, 0x40, 0x1, + 0x80, 0x22, 0x7e, 0x27, 0x38, 0x79, 0x4e, 0x50, 0x1, 0x80, 0x19, 0x7e, 0x27, + 0x38, 0x79, 0x4e, 0x50, 0x2, 0x80, 0x10, 0x7e, 0x27, 0x38, 0x79, 0x4e, 0x50, + 0x4, 0x80, 0x7, 0x7e, 0x27, 0x38, 0x79, 0x4e, 0x50, 0x10, 0x7a, 0x27, 0x38, + 0x79, 0x80, 0x3a, 0x7e, 0x53, 0x9a, 0xd4, 0x12, 0x25, 0xe5, 0x7a, 0x27, + 0x37, 0xd6, 0x80, 0x2d, 0x7e, 0x53, 0x9a, 0xd6, 0x12, 0x25, 0xe5, 0x3e, + 0x24, 0x7a, 0x27, 0x38, 0x8e, 0x7a, 0x27, 0x37, 0xf0, 0x80, 0x1a, 0x7e, + 0x53, 0x9a, 0xd8, 0x12, 0x25, 0xe5, 0x3e, 0x24, 0x7a, 0x27, 0x37, 0xda, + 0x80, 0xb, 0x7e, 0x53, 0x9a, 0xe1, 0x12, 0x25, 0xe5, 0x7a, 0x53, 0x9b, 0x7c, + 0xbe, 0x60, 0x3b, 0x40, 0x10, 0xbe, 0x60, 0x3e, 0x38, 0xb, 0x7e, 0x27, 0x38, + 0x79, 0x4e, 0x40, 0x2, 0x7a, 0x27, 0x38, 0x79, 0xa5, 0xbe, 0xa, 0x2, 0x80, + 0x2, 0xa1, 0xc5, 0x7e, 0x37, 0x38, 0x79, 0x4e, 0x60, 0x4, 0x7a, 0x37, 0x38, + 0x79, 0xa1, 0xc5, 0xbe, 0x60, 0x6c, 0x68, 0x4, 0xa5, 0xbe, 0x6d, 0x2b, 0x7e, + 0x27, 0x38, 0x79, 0x4e, 0x50, 0x80, 0x7a, 0x27, 0x38, 0x79, 0x7e, 0x27, + 0x37, 0xf0, 0x7d, 0x12, 0xb, 0x14, 0x7a, 0x17, 0x37, 0xf0, 0x2e, 0x27, 0x38, + 0x74, 0x7a, 0x29, 0x70, 0xa5, 0xbe, 0x6d, 0x2, 0x80, 0x2, 0xa1, 0xc5, 0x75, + 0xf, 0x6c, 0xa1, 0xc5, 0xbe, 0x60, 0x6e, 0x68, 0x4, 0xa5, 0xbe, 0x6f, 0x56, + 0x7e, 0x27, 0x38, 0x79, 0x4e, 0x50, 0x40, 0x7a, 0x27, 0x38, 0x79, 0x7e, + 0x43, 0x9a, 0xd4, 0x6c, 0x55, 0x7e, 0xb3, 0x9a, 0xd5, 0xa, 0x1b, 0x2d, 0x12, + 0x4, 0x7a, 0xb3, 0x9a, 0xd5, 0x70, 0x9, 0x7e, 0xb3, 0x9a, 0xd4, 0x4, 0x7a, + 0xb3, 0x9a, 0xd4, 0x7e, 0x27, 0x8d, 0x94, 0xbd, 0x21, 0x28, 0xf, 0x7c, 0xb7, + 0x54, 0x3f, 0x7e, 0x27, 0x38, 0x8a, 0x2d, 0x21, 0x7a, 0x29, 0xb0, 0x80, 0x9, + 0x7e, 0x27, 0x38, 0x8a, 0x2d, 0x21, 0x7a, 0x29, 0x70, 0xa5, 0xbe, 0x6f, 0x2, + 0x80, 0x2, 0xa1, 0xc5, 0x75, 0xf, 0x6e, 0x80, 0x79, 0xbe, 0x60, 0x70, 0x40, + 0xc, 0xbe, 0x60, 0x7f, 0x38, 0x7, 0x7c, 0xb6, 0x12, 0x51, 0x24, 0x80, 0x68, + 0xa5, 0xbe, 0x83, 0x6, 0x7a, 0x73, 0x37, 0xde, 0x80, 0x5e, 0xa5, 0xbe, 0x86, + 0xf, 0x7c, 0xb7, 0x54, 0x7, 0x7a, 0xb3, 0x37, 0xe2, 0x53, 0xc3, 0xf8, 0x42, + 0xc3, 0x80, 0x4b, 0xa5, 0xbe, 0x87, 0x1a, 0x7c, 0xb7, 0x54, 0x7, 0x7a, 0xb3, + 0x37, 0xd2, 0xa, 0x2b, 0x7d, 0x32, 0x12, 0x70, 0x95, 0x2e, 0x34, 0x7f, 0x0, + 0x2d, 0x32, 0x12, 0xc9, 0x5e, 0x80, 0x2d, 0xa5, 0xbe, 0x88, 0x5, 0x7a, 0x71, + 0xc4, 0x80, 0x24, 0xa5, 0xbe, 0xed, 0x20, 0x7a, 0x73, 0x38, 0x82, 0xa5, + 0xbf, 0x4, 0x5, 0x12, 0xda, 0x5d, 0x80, 0x13, 0xa5, 0xbf, 0x2, 0x8, 0x6d, + 0x33, 0x7a, 0x37, 0x37, 0xd6, 0x80, 0x7, 0xa5, 0xbf, 0x3, 0x3, 0x12, 0xda, + 0x56, 0x30, 0x1e, 0xa, 0x7e, 0xb3, 0x9a, 0xca, 0x44, 0x1, 0x7a, 0xb3, 0x9a, + 0xca, 0x7e, 0x37, 0x38, 0x79, 0x4d, 0x33, 0x68, 0xa, 0x7e, 0xb3, 0x9a, 0xca, + 0x44, 0x2, 0x7a, 0xb3, 0x9a, 0xca, 0x22, 0x7c, 0x25, 0x6c, 0x33, 0xa, 0x27, + 0x2d, 0x21, 0x22, 0x7e, 0xb3, 0x9a, 0xcd, 0xbe, 0xb0, 0x1, 0x22, 0x7e, 0xb3, + 0x9a, 0xbc, 0xc4, 0x54, 0x7, 0x22, 0x7c, 0xa7, 0x7c, 0x3b, 0xa5, 0xbb, 0x0, + 0x7, 0x7c, 0xba, 0x12, 0x68, 0x27, 0x80, 0x25, 0xbe, 0x30, 0xeb, 0x68, 0x4, + 0xa5, 0xbb, 0xec, 0x9, 0x7c, 0xb3, 0x7c, 0x7a, 0x12, 0x68, 0x52, 0x80, 0x13, + 0xbe, 0x30, 0x80, 0x40, 0xe, 0xbe, 0x30, 0xef, 0x38, 0x9, 0x7c, 0xb3, 0x24, + 0x80, 0x7c, 0x7a, 0x12, 0x6f, 0xf8, 0xa5, 0xbb, 0xfc, 0x5, 0x7c, 0xba, 0x2, + 0x26, 0x4e, 0xa5, 0xbb, 0xfd, 0x8, 0xbe, 0xa0, 0x5a, 0x78, 0x9, 0xd2, 0x2f, + 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xfb, 0x22, 0x24, 0xab, 0x68, 0x10, 0x24, + 0xef, 0x68, 0x1c, 0x24, 0xde, 0x68, 0x26, 0x24, 0xde, 0x78, 0x2f, 0x74, 0x5, + 0x80, 0x2d, 0x7e, 0xb3, 0x39, 0xfb, 0xb4, 0x5, 0x2a, 0x12, 0x26, 0x94, 0x12, + 0x42, 0xf7, 0x2, 0x0, 0x1e, 0x7e, 0xb3, 0x39, 0xfb, 0xb4, 0x5, 0x1a, 0x12, + 0x26, 0x94, 0x75, 0xe9, 0xff, 0x22, 0x7e, 0xb3, 0x39, 0xfb, 0xb4, 0x5, 0xc, + 0x12, 0x26, 0x94, 0x2, 0x0, 0x26, 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xfb, 0x22, + 0x7e, 0x34, 0x0, 0x1, 0x7d, 0x3, 0x80, 0x14, 0x7e, 0xa0, 0x4, 0x80, 0x7, + 0x7e, 0x34, 0x0, 0xfa, 0x12, 0xc5, 0x49, 0x7c, 0x7a, 0x1b, 0xa0, 0xa5, 0xbf, + 0x0, 0xf1, 0x7d, 0x10, 0x1b, 0x4, 0x4d, 0x11, 0x78, 0xe4, 0x22, 0xca, 0x3b, + 0xf5, 0x37, 0x7f, 0x31, 0x7a, 0xd, 0x2f, 0x12, 0x32, 0xc0, 0x7e, 0xb3, 0x9b, + 0x5, 0xb4, 0x1, 0x1e, 0xd2, 0x4, 0x12, 0xb, 0xc5, 0x12, 0x26, 0x94, 0x12, + 0xd9, 0x3d, 0x12, 0x27, 0x36, 0x12, 0x27, 0x29, 0x12, 0xd9, 0x2e, 0x12, + 0x27, 0x6f, 0x7f, 0x3, 0x12, 0x27, 0x75, 0x80, 0x32, 0x75, 0x38, 0x0, 0x80, + 0x1f, 0x30, 0xb, 0x3, 0x12, 0x53, 0xf1, 0x12, 0x55, 0xc5, 0xe5, 0x38, 0x70, + 0xa, 0x12, 0xd9, 0x3d, 0x12, 0x27, 0x6f, 0x5, 0x38, 0x80, 0x8, 0x12, 0x27, + 0x29, 0x7f, 0x3, 0x12, 0x27, 0x75, 0x12, 0xdb, 0xa8, 0x68, 0xdc, 0x12, 0x4f, + 0x63, 0x12, 0xd9, 0x2e, 0x12, 0x27, 0x36, 0x7e, 0xd, 0x33, 0x7e, 0xb3, 0x9b, + 0x38, 0x12, 0x27, 0x7f, 0xda, 0x3b, 0x22, 0x7e, 0x18, 0x13, 0x60, 0x7a, + 0x1d, 0x3d, 0x7f, 0x3, 0x7e, 0x18, 0x13, 0x60, 0x7f, 0x61, 0x7f, 0x70, 0x12, + 0x77, 0xa5, 0x12, 0xaf, 0xac, 0x7d, 0x3f, 0x7a, 0x37, 0x92, 0x6, 0x7e, 0x34, + 0x0, 0x20, 0x12, 0xaf, 0x99, 0x2, 0x27, 0x50, 0xa9, 0xd6, 0xcb, 0xc2, 0x37, + 0x12, 0x2b, 0x51, 0x12, 0x2c, 0x18, 0x12, 0xaf, 0x8a, 0x12, 0x29, 0x5f, 0x2, + 0x27, 0x64, 0x69, 0x30, 0x0, 0xa, 0x12, 0x28, 0x76, 0xa9, 0xc6, 0xcb, 0x22, + 0x12, 0x27, 0x36, 0x7e, 0xd, 0x2f, 0x7e, 0xa1, 0x37, 0x74, 0x8, 0xa4, 0x9, + 0xb5, 0x9b, 0x28, 0x7c, 0x9b, 0x7f, 0x60, 0xa, 0xf9, 0x7c, 0xb9, 0x12, 0x38, + 0x5b, 0x7c, 0xab, 0x7e, 0xb3, 0x39, 0xff, 0x60, 0x9, 0x7c, 0xb9, 0x12, 0xcc, + 0x9c, 0x7c, 0xab, 0x80, 0x7, 0x7c, 0xb9, 0x12, 0x3a, 0x26, 0x7d, 0xf3, 0xa, + 0x5a, 0x2e, 0x54, 0x0, 0xb, 0x7e, 0x18, 0x0, 0x1, 0x60, 0x5, 0x2f, 0x11, + 0x14, 0x78, 0xfb, 0x2f, 0x11, 0x2f, 0x11, 0x7d, 0x1f, 0x12, 0x1, 0x6c, 0xbe, + 0xf4, 0x0, 0x4, 0x68, 0x38, 0x7e, 0x33, 0x82, 0xc, 0x7a, 0x33, 0x91, 0xfe, + 0x7e, 0x33, 0x82, 0xd, 0x7a, 0x33, 0x91, 0xff, 0x74, 0xb, 0x7a, 0xb3, 0x92, + 0x0, 0x7d, 0xed, 0x7a, 0xe7, 0x92, 0x2, 0x7a, 0xe7, 0x92, 0x6, 0xbe, 0xf4, + 0x0, 0x2, 0x38, 0xb, 0xe4, 0x7a, 0xb3, 0x92, 0x0, 0x7e, 0x34, 0x0, 0x4, + 0x8d, 0x3f, 0x7e, 0x8, 0x91, 0xfe, 0x2, 0x2c, 0x27, 0x22, 0x7e, 0xb3, 0x38, + 0x82, 0xb4, 0x1, 0xa, 0x12, 0x28, 0x67, 0x7e, 0x37, 0x38, 0x92, 0x12, 0x28, + 0xd, 0x22, 0xe4, 0x12, 0x28, 0x1c, 0xa, 0x26, 0x7a, 0x53, 0x38, 0x7c, 0x7a, + 0x73, 0x38, 0x7d, 0x22, 0xa9, 0xd6, 0xcb, 0x7e, 0x17, 0x39, 0xf9, 0x59, + 0x31, 0x0, 0x4, 0x7e, 0x37, 0x39, 0xf9, 0x59, 0x23, 0x0, 0xc, 0x12, 0x29, + 0x5f, 0x7e, 0x34, 0x0, 0x90, 0x12, 0x28, 0x6e, 0x49, 0x33, 0x0, 0x2c, 0xa9, + 0xc6, 0xcb, 0x22, 0x7e, 0xb3, 0x38, 0x82, 0xb4, 0x4, 0xa, 0x12, 0x28, 0x67, + 0x7e, 0x34, 0x3a, 0x0, 0x12, 0x28, 0xd, 0x22, 0x7e, 0xb3, 0x38, 0x82, 0xb4, + 0x2, 0xc, 0x12, 0x28, 0x67, 0x7e, 0x37, 0x38, 0x8a, 0x1e, 0x24, 0x12, 0x28, + 0xd, 0x22, 0x7e, 0x27, 0x8d, 0x94, 0xb, 0x26, 0x22, 0x12, 0x28, 0x76, 0x7e, + 0x37, 0x39, 0xf9, 0x22, 0x7d, 0x3, 0x7e, 0xa1, 0xcd, 0x75, 0xcd, 0x0, 0xc2, + 0xaf, 0x80, 0x2, 0xd2, 0xaf, 0x7e, 0xb3, 0x9b, 0x1e, 0x20, 0xe2, 0xf7, 0x7d, + 0x20, 0x4e, 0x50, 0x1, 0x12, 0x29, 0x3, 0x4d, 0x12, 0x1b, 0x38, 0x10, 0x6c, + 0x99, 0x0, 0xb, 0x90, 0xbe, 0x90, 0x8, 0x78, 0xf8, 0xd2, 0xaf, 0x80, 0x42, + 0x7e, 0x17, 0x39, 0xf9, 0xb, 0x18, 0x10, 0x5e, 0x14, 0x0, 0x8, 0xbe, 0x14, + 0x0, 0x8, 0x78, 0x31, 0xc2, 0xaf, 0x80, 0x2, 0xd2, 0xaf, 0x7e, 0xb3, 0x9b, + 0x1e, 0x20, 0xe2, 0xf7, 0xbe, 0x4, 0x0, 0xd0, 0x78, 0x7, 0x7e, 0x34, 0x0, + 0x2, 0x12, 0xc5, 0x49, 0x12, 0x29, 0x3, 0x4e, 0x30, 0x4, 0x1b, 0x38, 0x10, + 0xd2, 0x37, 0x6c, 0x99, 0x0, 0xb, 0x90, 0xbe, 0x90, 0x8, 0x78, 0xf8, 0xd2, + 0xaf, 0x12, 0x2c, 0x82, 0x5e, 0x34, 0x80, 0x0, 0x68, 0xb5, 0xb, 0x28, 0x30, + 0x4e, 0x60, 0x40, 0x1b, 0x28, 0x30, 0x6d, 0x22, 0x12, 0x29, 0x63, 0x7a, + 0xa1, 0xcd, 0x22, 0x7e, 0x37, 0x39, 0xf9, 0xb, 0x38, 0x10, 0x22, 0x7f, 0x20, + 0xa9, 0xd6, 0xcb, 0x69, 0x12, 0x0, 0x4, 0x7e, 0x7, 0x39, 0xf9, 0x59, 0x10, + 0x0, 0x4, 0x69, 0x12, 0x0, 0x8, 0x7e, 0x7, 0x39, 0xf9, 0x59, 0x10, 0x0, 0x8, + 0x7e, 0x2b, 0x30, 0x7c, 0x3, 0x6c, 0x11, 0x29, 0x32, 0x0, 0x1, 0xa, 0x13, + 0x2d, 0x10, 0x7e, 0x7, 0x39, 0xf9, 0x59, 0x10, 0x0, 0xc, 0x12, 0x2d, 0x24, + 0x12, 0x2b, 0xfa, 0x6d, 0x22, 0x12, 0x29, 0x63, 0x7e, 0x34, 0x80, 0x40, + 0x12, 0x28, 0x6e, 0x49, 0x33, 0x0, 0x3a, 0xa9, 0xc6, 0xcb, 0x22, 0x29, 0xb0, + 0x0, 0x3, 0x54, 0x7, 0x7c, 0x4b, 0x6c, 0x55, 0x7e, 0x37, 0x39, 0xf9, 0x1b, + 0x38, 0x20, 0x22, 0x7f, 0x71, 0x12, 0xaf, 0x91, 0x12, 0x2b, 0x2e, 0x69, + 0x30, 0x0, 0x8, 0x12, 0x2d, 0x2d, 0x12, 0x30, 0x1e, 0x29, 0x70, 0x0, 0x1, + 0x7c, 0x47, 0x6c, 0x55, 0x7e, 0xb, 0x70, 0x12, 0x2b, 0x80, 0x29, 0x70, 0x0, + 0x2, 0xa, 0x37, 0x1b, 0x34, 0x12, 0x2c, 0x72, 0x69, 0x30, 0x0, 0xa, 0x12, + 0x2c, 0x1e, 0x69, 0x30, 0x0, 0xc, 0x12, 0x2b, 0xfa, 0x69, 0x30, 0x0, 0xe, + 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x12, 0x69, 0x30, 0x0, 0x10, 0x7e, + 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x30, 0x29, 0x70, 0x0, 0x3, 0x7c, 0x47, + 0x12, 0x29, 0x61, 0x7e, 0x34, 0x0, 0xa0, 0x12, 0x28, 0x6e, 0x49, 0x23, 0x0, + 0x1a, 0x7a, 0x7b, 0x50, 0x49, 0x23, 0x0, 0x1c, 0x39, 0x57, 0x0, 0x1, 0x49, + 0x23, 0x0, 0x16, 0x79, 0x27, 0x0, 0x2, 0x49, 0x23, 0x0, 0x18, 0x79, 0x27, + 0x0, 0x4, 0x49, 0x23, 0x0, 0x22, 0x79, 0x27, 0x0, 0x6, 0x49, 0x23, 0x0, + 0x24, 0x79, 0x27, 0x0, 0x8, 0x49, 0x23, 0x0, 0x1e, 0x79, 0x27, 0x0, 0xa, + 0x49, 0x33, 0x0, 0x20, 0x79, 0x37, 0x0, 0xc, 0xa9, 0xc6, 0xcb, 0x22, 0xca, + 0xf8, 0x7f, 0x70, 0x7e, 0x7b, 0xf0, 0x29, 0x77, 0x0, 0x1, 0xbc, 0x7f, 0x28, + 0x2, 0x7c, 0xf7, 0x69, 0x17, 0x0, 0x6, 0x6d, 0x0, 0x7e, 0x34, 0x0, 0xf2, + 0x74, 0xff, 0x12, 0x0, 0x2e, 0x7f, 0x7, 0x12, 0x2b, 0xe, 0xa9, 0xd6, 0xcb, + 0x6c, 0xaa, 0x80, 0x2d, 0x6c, 0x77, 0x80, 0x1f, 0x7e, 0x10, 0xb, 0xac, 0x1a, + 0xa, 0x17, 0x2d, 0x1, 0x3e, 0x4, 0x69, 0x17, 0x0, 0x6, 0x2d, 0x10, 0x6d, + 0x0, 0xb, 0xa, 0x20, 0x6e, 0x24, 0xff, 0xff, 0x1b, 0xa, 0x20, 0xb, 0x70, + 0x29, 0x67, 0x0, 0x1, 0xbc, 0x67, 0x38, 0xd9, 0xb, 0xa0, 0x7e, 0x7b, 0x60, + 0xbc, 0x6a, 0x38, 0xcc, 0x69, 0x37, 0x0, 0x6, 0x12, 0x2b, 0x2e, 0x7c, 0x4f, + 0x6c, 0x55, 0xa, 0x3f, 0x12, 0x2b, 0x82, 0x6d, 0x22, 0x12, 0x29, 0x63, 0x12, + 0xda, 0x34, 0x12, 0xda, 0xa5, 0x1b, 0xa, 0x30, 0xd2, 0xac, 0x7e, 0x34, 0x0, + 0xd0, 0x12, 0x28, 0x76, 0x12, 0xd8, 0x3e, 0x6c, 0xaa, 0xbe, 0xa0, 0x4, 0x50, + 0x15, 0x7e, 0x70, 0x4, 0xac, 0x7a, 0x12, 0x2b, 0x7, 0x49, 0x44, 0x0, 0x26, + 0x60, 0x34, 0x1e, 0x44, 0x14, 0x78, 0xfb, 0x80, 0x2d, 0xbe, 0xa0, 0x8, 0x50, + 0x14, 0xa, 0x3a, 0x1b, 0x36, 0x12, 0x2b, 0x3, 0x49, 0x44, 0x0, 0x28, 0x60, + 0x1b, 0x1e, 0x44, 0x14, 0x78, 0xfb, 0x80, 0x14, 0xa, 0x3a, 0x9e, 0x34, 0x0, + 0x8, 0x12, 0x2b, 0x3, 0x49, 0x44, 0x0, 0x2a, 0x60, 0x5, 0x1e, 0x44, 0x14, + 0x78, 0xfb, 0x5e, 0x44, 0x0, 0xf, 0x7e, 0x50, 0x2, 0xac, 0x5a, 0x69, 0x37, + 0x0, 0x6, 0x2d, 0x32, 0x6d, 0x22, 0x1b, 0x1a, 0x40, 0xb, 0xa0, 0xbe, 0xa0, + 0xb, 0x40, 0x9e, 0xa9, 0xc6, 0xcb, 0xda, 0xf8, 0x22, 0x3e, 0x34, 0x3e, 0x34, + 0x7c, 0xb7, 0x7e, 0x47, 0x39, 0xf9, 0x22, 0xa9, 0xd6, 0xcb, 0x69, 0x30, 0x0, + 0x2, 0x12, 0x2b, 0x2e, 0x69, 0x30, 0x0, 0x4, 0x12, 0x2d, 0x2d, 0x12, 0x2b, + 0x6d, 0x6d, 0x22, 0x12, 0x29, 0x63, 0x7e, 0x34, 0x0, 0x60, 0x2, 0x27, 0x68, + 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x4, 0x22, 0x12, 0x2b, 0x4e, 0x69, + 0x30, 0x0, 0xc, 0x12, 0x2c, 0x1e, 0x69, 0x30, 0x0, 0xe, 0x12, 0x2b, 0xfa, + 0x12, 0x29, 0x59, 0x2, 0x27, 0x64, 0xa9, 0xd6, 0xcb, 0x69, 0x30, 0x0, 0x4, + 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x4, 0x69, 0x30, 0x0, 0x6, 0x7e, + 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x6, 0x69, 0x30, 0x0, 0x8, 0x7e, 0x27, + 0x39, 0xf9, 0x59, 0x32, 0x0, 0x8, 0x7e, 0xb, 0x70, 0x7c, 0x47, 0x6c, 0x55, + 0x29, 0x70, 0x0, 0x1, 0xa, 0x37, 0x2d, 0x32, 0x7e, 0x27, 0x39, 0xf9, 0x59, + 0x32, 0x0, 0xc, 0x22, 0x12, 0x2b, 0x4e, 0x12, 0x2c, 0xc, 0x12, 0x2c, 0x7b, + 0xa2, 0x4, 0xe4, 0x33, 0x12, 0x2c, 0x3, 0x4d, 0x35, 0x1b, 0x28, 0x30, 0x12, + 0x29, 0x59, 0x2, 0x27, 0x64, 0x7f, 0x71, 0x12, 0x2f, 0xff, 0x12, 0xd9, 0x95, + 0x12, 0x2b, 0x82, 0x7c, 0x4b, 0x6c, 0x55, 0xe5, 0x27, 0xa, 0x3b, 0x4d, 0x32, + 0x12, 0x2b, 0xfa, 0x29, 0x77, 0x0, 0x2, 0x12, 0x70, 0x93, 0x7e, 0x7b, 0x40, + 0x6c, 0x55, 0x4d, 0x23, 0x29, 0x77, 0x0, 0x4, 0x7c, 0x64, 0x4c, 0x75, 0x12, + 0x2c, 0x1e, 0x29, 0x77, 0x0, 0x1, 0x7c, 0x47, 0x29, 0x77, 0x0, 0x3, 0x7c, + 0x64, 0x12, 0x2c, 0x72, 0x12, 0x2c, 0xc, 0x12, 0x2c, 0x7b, 0x6d, 0x22, 0x12, + 0x29, 0x63, 0x7e, 0x34, 0x0, 0x30, 0x2, 0x27, 0x68, 0x7e, 0x27, 0x39, 0xf9, + 0x59, 0x32, 0x0, 0x10, 0x22, 0xa, 0x5b, 0x3, 0x3, 0x54, 0xc0, 0x7c, 0xab, + 0xe4, 0x7e, 0x27, 0x39, 0xf9, 0x2e, 0x24, 0x0, 0x38, 0xb, 0x28, 0x30, 0x22, + 0x29, 0x70, 0x0, 0x2, 0xa, 0x37, 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, + 0xe, 0x22, 0xa9, 0xd6, 0xcb, 0x69, 0x20, 0x0, 0x4, 0x7e, 0x57, 0x39, 0xf9, + 0x59, 0x25, 0x0, 0x4, 0x69, 0x20, 0x0, 0x8, 0x7e, 0x57, 0x39, 0xf9, 0x59, + 0x25, 0x0, 0x8, 0x7e, 0xb, 0x50, 0xa, 0x55, 0x7c, 0xab, 0xe4, 0x29, 0x50, + 0x0, 0x1, 0xa, 0x25, 0x2d, 0x25, 0x7e, 0x57, 0x39, 0xf9, 0x59, 0x25, 0x0, + 0xc, 0x29, 0x50, 0x0, 0x2, 0xa, 0x25, 0x12, 0x2d, 0x24, 0x12, 0x2c, 0x72, + 0x6d, 0x22, 0x12, 0x29, 0x63, 0x7e, 0x34, 0x0, 0x40, 0x2, 0x27, 0x68, 0x7e, + 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0xa, 0x22, 0x5e, 0x60, 0xbf, 0x1b, 0x28, + 0x30, 0x22, 0x7e, 0x27, 0x39, 0xf9, 0x49, 0x32, 0x0, 0x38, 0x22, 0x7e, 0xa1, + 0xcd, 0x12, 0x2d, 0x1c, 0x7d, 0x43, 0x5e, 0x44, 0x80, 0x0, 0x75, 0xcd, 0x0, + 0x5e, 0x60, 0x7f, 0x1b, 0x28, 0x30, 0xc2, 0xaf, 0x80, 0x2, 0xd2, 0xaf, 0x7e, + 0xb3, 0x9b, 0x1e, 0x20, 0xe2, 0xf7, 0x12, 0x2c, 0xc, 0x4e, 0x70, 0x1, 0x1b, + 0x28, 0x30, 0x6c, 0x33, 0x0, 0xb, 0x30, 0xa5, 0xbb, 0x8, 0xf9, 0xd2, 0xaf, + 0x80, 0x33, 0x12, 0x2c, 0x82, 0x7d, 0x3, 0x5e, 0x4, 0x0, 0x20, 0xbe, 0x4, + 0x0, 0x20, 0x78, 0x24, 0xc2, 0xaf, 0x80, 0x2, 0xd2, 0xaf, 0x7e, 0xb3, 0x9b, + 0x1e, 0x20, 0xe2, 0xf7, 0x2e, 0x24, 0x0, 0x38, 0x4e, 0x70, 0x2, 0x1b, 0x28, + 0x30, 0xd2, 0x37, 0x6c, 0x33, 0x0, 0xb, 0x30, 0xa5, 0xbb, 0x8, 0xf9, 0xd2, + 0xaf, 0x12, 0x2c, 0x82, 0x7d, 0x3, 0x5e, 0x4, 0x0, 0x80, 0x68, 0xc2, 0x2e, + 0x24, 0x0, 0x38, 0x4e, 0x70, 0x4, 0x1b, 0x28, 0x30, 0x4d, 0x44, 0x68, 0x9, + 0x12, 0x2d, 0x1c, 0x4e, 0x60, 0x80, 0x1b, 0x28, 0x30, 0x7a, 0xa1, 0xcd, + 0x22, 0x7e, 0x27, 0x39, 0xf9, 0xb, 0x28, 0x30, 0x22, 0x7e, 0x17, 0x39, 0xf9, + 0x59, 0x21, 0x0, 0xe, 0x22, 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x6, + 0x69, 0x30, 0x0, 0x6, 0x22, 0x7e, 0x17, 0x76, 0x4c, 0x7d, 0xf1, 0x7d, 0xe2, + 0x7d, 0xd3, 0x12, 0x77, 0xa5, 0x12, 0xaf, 0xb0, 0x7e, 0x8, 0x91, 0xfe, 0x7d, + 0x3e, 0x7d, 0x2f, 0x2, 0x29, 0xb, 0xca, 0x79, 0xc2, 0x3, 0x7e, 0xb7, 0x67, + 0x68, 0x7e, 0xe3, 0x67, 0x62, 0x7e, 0xa3, 0x76, 0x4f, 0xbc, 0xae, 0x7e, + 0xb3, 0x76, 0x4e, 0x28, 0x5, 0xa4, 0x7d, 0xc5, 0x80, 0x4, 0xac, 0xbe, 0x7d, + 0xc5, 0x7e, 0x1f, 0x2d, 0x2e, 0x7e, 0x27, 0x76, 0x4a, 0x12, 0x2d, 0x3a, + 0x7a, 0x37, 0x3, 0xf2, 0x7e, 0x1f, 0x2d, 0x2e, 0x7e, 0x24, 0x0, 0x64, 0x12, + 0x2d, 0x3a, 0x7a, 0x37, 0x3, 0xf7, 0x6c, 0xff, 0x6c, 0x11, 0x80, 0x1b, 0x7c, + 0xb1, 0x12, 0x2e, 0x26, 0x7d, 0x43, 0x7d, 0x54, 0x3e, 0x54, 0xbd, 0x5b, + 0x48, 0x8, 0x7e, 0x57, 0x76, 0x53, 0xbd, 0x54, 0x8, 0x2, 0xb, 0xf0, 0xb, + 0x10, 0x7e, 0x3, 0x67, 0x62, 0xbc, 0x1, 0x38, 0xdd, 0x7e, 0xd7, 0x3, 0xf2, + 0xbd, 0xdc, 0x28, 0x2f, 0x7e, 0xd7, 0x76, 0x55, 0xbd, 0xdb, 0x58, 0x5, 0xbe, + 0xe0, 0x1, 0x38, 0xc, 0x74, 0x2, 0xac, 0xbf, 0xa, 0x4e, 0x1b, 0x44, 0xbd, + 0x54, 0x48, 0x4, 0x74, 0x1, 0x80, 0x1, 0xe4, 0x12, 0x2e, 0x19, 0x38, 0x6, + 0x7e, 0xb3, 0x3, 0xf6, 0x60, 0x12, 0x7e, 0xd7, 0x76, 0x51, 0x80, 0x8, 0xe4, + 0x12, 0x2e, 0x19, 0x28, 0x6, 0x1b, 0xd4, 0x7a, 0xd7, 0x3, 0xf4, 0x12, 0x2e, + 0x1d, 0x28, 0x2, 0xd2, 0x3, 0x7e, 0xd7, 0x76, 0x57, 0xbd, 0xdb, 0x58, 0x5, + 0xe4, 0x7a, 0xb3, 0x67, 0x62, 0xa2, 0x3, 0xda, 0x79, 0x22, 0x7a, 0xb3, 0x3, + 0xf6, 0x7e, 0xd7, 0x3, 0xf4, 0xbe, 0xd4, 0x0, 0x0, 0x22, 0x7c, 0xab, 0x7e, + 0x70, 0x2, 0xac, 0x7a, 0x9, 0xb3, 0x65, 0x60, 0x9, 0x73, 0x65, 0x61, 0x2, + 0x2e, 0x40, 0x7e, 0xb3, 0x92, 0x2, 0x7e, 0x73, 0x92, 0x3, 0x12, 0x59, 0x91, + 0x7d, 0x13, 0x3e, 0x14, 0x7e, 0x1f, 0x2d, 0x2e, 0x2d, 0x31, 0xb, 0x1a, 0x30, + 0x22, 0xca, 0x3b, 0x7c, 0xc6, 0x7c, 0x97, 0x6d, 0xbb, 0x7d, 0xab, 0x4c, + 0x55, 0x68, 0x7, 0x6c, 0xff, 0x7e, 0xe0, 0x1, 0x80, 0x10, 0x7e, 0x83, 0x82, + 0xe, 0xa, 0xf8, 0x7d, 0x7f, 0x1b, 0x74, 0x1b, 0xf5, 0x7d, 0x3f, 0x7c, 0xe7, + 0x7e, 0xe4, 0x0, 0x64, 0x7c, 0xd9, 0x7c, 0x9, 0x7c, 0x8d, 0x80, 0xc, 0x12, + 0xda, 0x4c, 0x8, 0xc, 0x7c, 0x8, 0x12, 0x2f, 0xda, 0x1b, 0x80, 0xbe, 0x80, + 0x0, 0x58, 0xef, 0x7c, 0xd9, 0x7c, 0x19, 0x1a, 0x1d, 0xb, 0x14, 0x7c, 0x83, + 0x80, 0xc, 0x12, 0xda, 0x4c, 0x8, 0xf, 0x7c, 0x18, 0x12, 0x2f, 0xda, 0xb, + 0x80, 0x7e, 0x73, 0x82, 0xf, 0xbc, 0x78, 0x18, 0xec, 0x7c, 0xb9, 0x7c, 0x70, + 0x7c, 0x61, 0x6c, 0x55, 0x7e, 0x43, 0x82, 0xf, 0xa, 0xf4, 0x1b, 0xf4, 0x7d, + 0x1f, 0x7c, 0x43, 0x12, 0xbd, 0xba, 0x7c, 0xdb, 0xbd, 0xba, 0x50, 0x12, + 0x7d, 0x3a, 0x6d, 0x22, 0x74, 0x4, 0x2f, 0x11, 0x14, 0x78, 0xfb, 0x7d, 0x1b, + 0x12, 0x2f, 0xf7, 0x80, 0x2, 0x9f, 0x66, 0x4d, 0xaa, 0x78, 0x4, 0x9f, 0x66, + 0x80, 0x10, 0x4d, 0xbb, 0x78, 0x2, 0x80, 0x6, 0xbe, 0x68, 0x0, 0xff, 0x28, + 0x4, 0x7e, 0x68, 0x0, 0xff, 0x7d, 0x3d, 0x74, 0x15, 0xac, 0xbc, 0x19, 0x75, + 0x37, 0x2, 0x19, 0xd5, 0x37, 0x3, 0xda, 0x3b, 0x22, 0xca, 0x3b, 0x7c, 0xc6, + 0x7c, 0x1b, 0x6d, 0xee, 0x7d, 0xbe, 0x4c, 0x55, 0x68, 0x18, 0x6c, 0xff, + 0x7e, 0xe0, 0x1, 0x7e, 0xb3, 0x59, 0x47, 0xb4, 0x1, 0x6, 0x7e, 0xf4, 0x3, + 0xe8, 0x80, 0x1a, 0x7e, 0xf4, 0x3, 0x20, 0x80, 0x14, 0x7e, 0x3, 0x82, 0xf, + 0xa, 0xa0, 0x7d, 0x7a, 0x1b, 0x74, 0x1b, 0xa5, 0x7d, 0x3a, 0x7c, 0xe7, 0x7e, + 0xf4, 0x0, 0x64, 0x7c, 0x81, 0x7c, 0x1, 0x7c, 0x98, 0x80, 0xc, 0x12, 0x2f, + 0xed, 0x8, 0xc, 0x7c, 0x9, 0x12, 0x2f, 0xc9, 0x1b, 0x90, 0xbe, 0x90, 0x0, + 0x58, 0xef, 0x7c, 0x81, 0x1a, 0x48, 0xb, 0x44, 0x80, 0xc, 0x12, 0x2f, 0xed, + 0x8, 0xf, 0x7c, 0x19, 0x12, 0x2f, 0xc9, 0xb, 0x90, 0x7e, 0x83, 0x82, 0xe, + 0xbc, 0x89, 0x18, 0xec, 0xa, 0x30, 0xa, 0xa1, 0x9d, 0xa3, 0xb, 0xa4, 0x7d, + 0x3a, 0x7c, 0xd7, 0xbd, 0xeb, 0x50, 0x12, 0x7d, 0x3b, 0x6d, 0x22, 0x74, 0x4, + 0x2f, 0x11, 0x14, 0x78, 0xfb, 0x7d, 0x1e, 0x12, 0x2f, 0xf7, 0x80, 0x2, 0x9f, + 0x66, 0x4d, 0xbb, 0x78, 0x4, 0x9f, 0x66, 0x80, 0x10, 0x4d, 0xee, 0x78, 0x2, + 0x80, 0x6, 0xbe, 0x68, 0x0, 0xff, 0x28, 0x4, 0x7e, 0x68, 0x0, 0xff, 0x7d, + 0x3d, 0x74, 0x15, 0xac, 0xbc, 0x19, 0x75, 0x37, 0x4, 0x19, 0xd5, 0x37, 0x5, + 0xda, 0x3b, 0x22, 0x7c, 0xb9, 0x7c, 0x7f, 0x12, 0x2e, 0x40, 0x2d, 0xb3, + 0x7c, 0x7e, 0x12, 0x2e, 0x40, 0x2d, 0xe3, 0x22, 0x7c, 0xbf, 0x7c, 0x78, + 0x12, 0x2e, 0x40, 0x2d, 0xa3, 0x7c, 0xbe, 0x7c, 0x78, 0x12, 0x2e, 0x40, + 0x2d, 0xb3, 0x22, 0x7c, 0xb9, 0x7c, 0x7f, 0x12, 0x2e, 0x40, 0xbd, 0x3f, + 0x22, 0xb, 0x14, 0x12, 0x1, 0x6c, 0x7f, 0x61, 0x22, 0xa9, 0xd6, 0xcb, 0x69, + 0x30, 0x0, 0x4, 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x4, 0x69, 0x30, + 0x0, 0x6, 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x6, 0x69, 0x30, 0x0, + 0x8, 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x8, 0x22, 0x7e, 0xa3, 0x9a, + 0xc0, 0xbe, 0xa0, 0x5, 0x78, 0xd, 0x74, 0x1, 0x7a, 0xb3, 0x9a, 0xc0, 0x74, + 0x2, 0x7a, 0xb3, 0x9a, 0xc0, 0x22, 0xbe, 0xa0, 0x4, 0x78, 0x1c, 0x74, 0x1, + 0x7a, 0xb3, 0x9a, 0xc0, 0x12, 0x37, 0xe2, 0x12, 0x32, 0x1d, 0x12, 0x30, + 0x5f, 0x74, 0x2, 0x7a, 0xb3, 0x9a, 0xc0, 0x7e, 0x34, 0x0, 0xc8, 0x2, 0x26, + 0x98, 0x22, 0x12, 0x30, 0xa3, 0x7e, 0xb3, 0x8d, 0x92, 0x60, 0xd, 0x80, 0x6, + 0x12, 0x32, 0x99, 0x12, 0x30, 0xa3, 0x12, 0x5c, 0xcb, 0x50, 0xf5, 0x7e, + 0xb3, 0x8d, 0x93, 0x60, 0xd, 0x80, 0x6, 0x12, 0x32, 0x99, 0x12, 0x30, 0xa3, + 0x12, 0x33, 0x43, 0x50, 0xf5, 0x2, 0x30, 0x8b, 0x30, 0x14, 0x14, 0x7e, 0x34, + 0x0, 0x8, 0xca, 0x39, 0x7e, 0x63, 0x9b, 0xa8, 0x12, 0xd9, 0xda, 0x12, 0x0, + 0x6e, 0x1b, 0xfd, 0xc2, 0x14, 0x22, 0x12, 0x30, 0xee, 0xc2, 0x4, 0x12, 0x30, + 0xca, 0xc2, 0xc, 0x30, 0xb, 0x15, 0xd2, 0x4, 0x12, 0xb, 0xc5, 0xc2, 0xb, + 0x12, 0x1c, 0xc1, 0x12, 0x31, 0x6f, 0x12, 0x36, 0xb7, 0x74, 0x1, 0x12, 0x32, + 0x1d, 0xd2, 0x4, 0x2, 0x30, 0xca, 0xa2, 0xac, 0x92, 0x5, 0x12, 0xda, 0x34, + 0x30, 0x4, 0xa, 0xb, 0x16, 0xb, 0xa, 0x30, 0x4e, 0x70, 0x3, 0x80, 0x8, 0xb, + 0x16, 0xb, 0xa, 0x30, 0x5e, 0x70, 0xfc, 0x1b, 0xa, 0x30, 0xa2, 0x5, 0x92, + 0xac, 0x22, 0x30, 0x2f, 0x39, 0x12, 0x47, 0xa8, 0x78, 0x34, 0xc2, 0x2f, + 0x7e, 0x34, 0x28, 0x0, 0x12, 0x31, 0x64, 0x7e, 0x34, 0x10, 0x0, 0x12, 0x31, + 0x64, 0x7e, 0x34, 0xf7, 0x0, 0x74, 0x5a, 0x12, 0x31, 0x2b, 0x7e, 0x34, 0xf7, + 0x1, 0x74, 0xa5, 0x12, 0x31, 0x2b, 0x7e, 0x34, 0xf7, 0x2, 0x74, 0x95, 0x12, + 0x31, 0x2b, 0x7e, 0x34, 0xf7, 0x3, 0x74, 0x27, 0x2, 0x31, 0x2b, 0x22, 0x12, + 0xc6, 0x76, 0xa, 0x3b, 0x7e, 0xf, 0x39, 0xe8, 0x79, 0x30, 0x0, 0x8, 0x12, + 0xc6, 0x8c, 0xe4, 0x7a, 0xb3, 0x39, 0xec, 0x80, 0xa, 0x12, 0xc6, 0x64, 0x68, + 0x5, 0x12, 0xc6, 0x50, 0x80, 0x5, 0x12, 0xc6, 0x57, 0x68, 0xf1, 0x12, 0xc6, + 0x43, 0x12, 0xc6, 0x1, 0x78, 0xfb, 0x2, 0x31, 0x5c, 0x6d, 0x33, 0x1b, 0xa, + 0x30, 0xc2, 0xcc, 0x22, 0xe4, 0x12, 0x31, 0x2b, 0x7e, 0x34, 0x0, 0x46, 0x2, + 0x26, 0x98, 0x12, 0xdb, 0x10, 0x7e, 0x63, 0x9b, 0xa8, 0xa, 0x6, 0x12, 0x37, + 0xe9, 0x2e, 0x24, 0x5a, 0x0, 0x7a, 0x27, 0x38, 0x8a, 0x6d, 0x22, 0x7a, 0x27, + 0x37, 0xd6, 0x7e, 0x24, 0x82, 0x51, 0x7a, 0x27, 0x38, 0x74, 0x7e, 0x24, 0x0, + 0x8, 0xca, 0x29, 0x7e, 0x70, 0x8, 0x12, 0xd9, 0xda, 0x12, 0x0, 0x6e, 0x1b, + 0xfd, 0x7e, 0x34, 0x0, 0x5, 0xca, 0x39, 0x7e, 0x63, 0x9b, 0xa8, 0xac, 0x67, + 0x2e, 0x34, 0x9b, 0x43, 0x6d, 0x22, 0x7e, 0x8, 0x9a, 0xfc, 0x12, 0x0, 0x6e, + 0x1b, 0xfd, 0x7e, 0xb3, 0x9b, 0xa8, 0x12, 0x48, 0xda, 0x12, 0x32, 0x15, 0x9, + 0x75, 0x9b, 0x63, 0x7a, 0x73, 0x9a, 0xdc, 0x12, 0x32, 0x15, 0x9, 0x75, 0x9b, + 0x64, 0x7a, 0x73, 0x9a, 0xdd, 0x12, 0x32, 0x15, 0x9, 0x75, 0x9b, 0x65, 0x7a, + 0x73, 0x9a, 0xde, 0x12, 0x32, 0x15, 0x9, 0x75, 0x9b, 0x66, 0x7a, 0x73, 0x9a, + 0xdf, 0x12, 0x32, 0x15, 0x9, 0x75, 0x9b, 0x67, 0x7a, 0x73, 0x9a, 0xe0, 0x7e, + 0x73, 0x9b, 0xa8, 0x7a, 0x73, 0x9a, 0xec, 0x12, 0x40, 0x7b, 0xe4, 0x2, 0x32, + 0xa, 0x7a, 0xb3, 0x9b, 0x7, 0x74, 0x3f, 0x7a, 0xb3, 0x9b, 0x8, 0x22, 0x7e, + 0xa3, 0x9b, 0xa8, 0x74, 0x5, 0xa4, 0x22, 0x12, 0x32, 0x2b, 0x74, 0xf, 0x7a, + 0xb3, 0x8d, 0x92, 0x7a, 0xb3, 0x8d, 0x93, 0x22, 0x7c, 0xab, 0xe4, 0x7a, + 0xb3, 0x39, 0x46, 0x7a, 0xb3, 0x39, 0x47, 0x6c, 0x77, 0x6d, 0x22, 0x7e, + 0x90, 0x1e, 0xac, 0x97, 0x59, 0x24, 0x39, 0x4b, 0x59, 0x24, 0x39, 0x4d, + 0xe4, 0x19, 0xb4, 0x39, 0x4a, 0xb, 0x70, 0xa5, 0xbf, 0x3, 0xe6, 0xe4, 0x7a, + 0xb3, 0x39, 0xa3, 0x7a, 0xb3, 0x39, 0x48, 0x4c, 0xaa, 0x68, 0x3, 0x12, 0x32, + 0x20, 0x22, 0xe4, 0x7a, 0xb3, 0x59, 0x60, 0x12, 0x1c, 0xa1, 0x7a, 0xb3, + 0x8d, 0x91, 0x12, 0x1c, 0xc1, 0x12, 0x31, 0x6f, 0x12, 0x37, 0xdb, 0x12, + 0xb9, 0x8f, 0x74, 0x1, 0x12, 0x32, 0x2b, 0x12, 0xa9, 0x83, 0x12, 0x32, 0x20, + 0xd2, 0x26, 0x7e, 0x18, 0x76, 0xab, 0x7a, 0x1f, 0x3, 0xdc, 0x7e, 0x18, 0x7c, + 0x4b, 0x7a, 0x1f, 0x3, 0xe0, 0x22, 0x7e, 0x34, 0x9, 0xc4, 0x6d, 0x22, 0x7a, + 0x27, 0x3, 0xf9, 0x7a, 0x37, 0x3, 0xfb, 0x22, 0x12, 0xda, 0x56, 0xd2, 0x4, + 0x12, 0xb, 0xc5, 0x12, 0x1c, 0x41, 0x12, 0x37, 0xa0, 0x12, 0x31, 0x6f, 0xa2, + 0x0, 0xe4, 0x33, 0x2, 0x32, 0x2b, 0xe4, 0x7a, 0xb3, 0x9a, 0x7b, 0x12, 0xc9, + 0xa8, 0x12, 0xc9, 0xb4, 0xc2, 0x4, 0x12, 0x30, 0xca, 0x12, 0xcb, 0xe9, 0x40, + 0x6, 0x74, 0x3, 0x7a, 0xb3, 0x9a, 0x7b, 0xd2, 0x4, 0x2, 0x30, 0xca, 0x30, + 0x1e, 0x42, 0xc2, 0x1e, 0x12, 0x30, 0x27, 0xd2, 0x4, 0x12, 0xb, 0xc5, 0x7e, + 0x73, 0x9a, 0xec, 0xbe, 0x73, 0x9b, 0xa8, 0x68, 0x9, 0x7a, 0x73, 0x9b, 0xa8, + 0xd2, 0x0, 0x12, 0x32, 0xa8, 0x7e, 0xb3, 0x9a, 0xca, 0x54, 0xfe, 0x7a, 0xb3, + 0x9a, 0xca, 0x7e, 0xb3, 0x9b, 0x5, 0xb4, 0x1, 0x3, 0x12, 0xb, 0xe7, 0x7e, + 0xb3, 0x9a, 0xcb, 0x60, 0x8, 0x12, 0x51, 0x42, 0xe4, 0x7a, 0xb3, 0x38, 0x83, + 0x12, 0x32, 0xc0, 0x7e, 0x37, 0x38, 0x79, 0x4d, 0x33, 0x68, 0x15, 0xd2, 0x4, + 0x12, 0xb, 0xc5, 0x12, 0x13, 0x20, 0x7e, 0xb3, 0x9a, 0xca, 0x54, 0xfd, 0x7a, + 0xb3, 0x9a, 0xca, 0x2, 0x32, 0xc0, 0x22, 0xca, 0xf8, 0xc2, 0x0, 0x7e, 0xf3, + 0x9b, 0xa8, 0x20, 0xb, 0x3, 0x30, 0xc, 0x3, 0xc3, 0x81, 0x56, 0x7e, 0x24, + 0x0, 0x1, 0x7c, 0xbf, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x12, 0x4f, + 0x4e, 0x78, 0x2, 0x81, 0x55, 0x7c, 0xbf, 0x12, 0x75, 0xd8, 0x50, 0x2, 0xd2, + 0x0, 0xd2, 0x4, 0x12, 0xb, 0xc5, 0x30, 0x0, 0x1f, 0x7e, 0x73, 0x8d, 0x93, + 0xa, 0x37, 0x5e, 0x34, 0x0, 0x4, 0x68, 0x13, 0x7e, 0x73, 0x8d, 0x92, 0xa, + 0x37, 0x5e, 0x34, 0x0, 0x4, 0x78, 0x7, 0xd2, 0x2b, 0x12, 0xca, 0xdd, 0x80, + 0x2, 0xc2, 0x2b, 0xa2, 0x0, 0x92, 0x1, 0x7c, 0xbf, 0x12, 0x34, 0x8c, 0x40, + 0xb, 0x30, 0x2b, 0x5, 0x12, 0x37, 0x42, 0xc2, 0x2b, 0xc3, 0x81, 0x56, 0x30, + 0x2b, 0x3, 0x12, 0x34, 0x59, 0x7c, 0xbf, 0x7e, 0x73, 0x39, 0xdb, 0x12, 0x35, + 0x19, 0xe4, 0x7c, 0x7f, 0x12, 0x57, 0x18, 0x30, 0x2b, 0xf, 0x7e, 0x18, 0x27, + 0xe0, 0x7a, 0x1d, 0x33, 0x12, 0xd9, 0x4c, 0x12, 0x26, 0xb9, 0x80, 0x6, 0x12, + 0xd9, 0x4c, 0x12, 0xce, 0x8e, 0x30, 0x2b, 0x6, 0x12, 0x37, 0x42, 0x12, 0x34, + 0x59, 0x12, 0x35, 0x13, 0x20, 0xb, 0x3, 0x30, 0xc, 0x5, 0xc2, 0x2b, 0xc3, + 0x80, 0x62, 0x12, 0x32, 0xc0, 0x7c, 0xbf, 0x12, 0x75, 0xe4, 0xe4, 0x12, + 0x32, 0x2b, 0x12, 0x5d, 0x65, 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x6e, + 0x70, 0xff, 0x5e, 0x73, 0x8d, 0x93, 0x7a, 0x73, 0x8d, 0x93, 0x12, 0x36, + 0xb7, 0x30, 0x2b, 0x34, 0xc2, 0x2b, 0x7e, 0x34, 0x27, 0xe0, 0x7e, 0x24, 0xb, + 0xb8, 0x7e, 0x14, 0x23, 0x28, 0x12, 0x2d, 0x3e, 0xbe, 0x34, 0x2, 0x58, 0x50, + 0xc, 0x7e, 0xb3, 0x8d, 0x92, 0x44, 0x4, 0x7a, 0xb3, 0x8d, 0x92, 0x80, 0xa, + 0x7e, 0xb3, 0x8d, 0x93, 0x54, 0xfb, 0x7a, 0xb3, 0x8d, 0x93, 0x7e, 0x8, 0x18, + 0x80, 0x12, 0x70, 0xf9, 0x12, 0xcb, 0x3a, 0xd3, 0x80, 0x1, 0xd3, 0xda, 0xf8, + 0x22, 0x7e, 0xa3, 0x9b, 0xa8, 0x74, 0x8, 0xa4, 0x9, 0xb5, 0x9b, 0x28, 0xca, + 0xf8, 0x7c, 0xfb, 0x74, 0x3, 0x12, 0x14, 0xcb, 0x7e, 0x34, 0x4, 0xc0, 0xca, + 0x39, 0x12, 0x37, 0x88, 0xda, 0x39, 0x12, 0x17, 0x8f, 0x7e, 0x34, 0x4, 0xc0, + 0xca, 0x39, 0x12, 0x37, 0x88, 0xda, 0x39, 0x12, 0x17, 0x2a, 0xda, 0xf8, + 0x22, 0xca, 0x79, 0x7c, 0xfb, 0xc2, 0x2, 0x7c, 0xbf, 0x12, 0xad, 0x40, 0x6c, + 0xee, 0xbe, 0xf0, 0x2, 0x74, 0x1e, 0x78, 0x5, 0x12, 0x37, 0x71, 0x80, 0xa, + 0xac, 0xbe, 0x49, 0x35, 0x39, 0x5d, 0x49, 0x25, 0x39, 0x5b, 0x7a, 0x1d, + 0x2b, 0x74, 0x1e, 0xac, 0xbe, 0x9, 0xb5, 0x39, 0x56, 0x60, 0x37, 0xd2, 0x4, + 0x12, 0xb, 0xc5, 0x30, 0x2b, 0x3, 0x12, 0x34, 0x59, 0x7c, 0xbf, 0x7c, 0x7e, + 0x12, 0x35, 0x19, 0xd2, 0x2, 0x30, 0x2b, 0x13, 0x74, 0x1e, 0x12, 0x37, 0x71, + 0x7a, 0x1d, 0x33, 0x12, 0x37, 0x49, 0x12, 0x37, 0x66, 0x12, 0x26, 0xb9, + 0x80, 0xd, 0x12, 0x37, 0x49, 0x74, 0x1e, 0xac, 0xbe, 0x12, 0x37, 0x66, 0x12, + 0xce, 0x8e, 0x20, 0xb, 0x3, 0x30, 0xc, 0xf, 0x30, 0x2b, 0x3, 0x12, 0x34, + 0x59, 0x30, 0x2, 0x3, 0x12, 0x35, 0x13, 0xc3, 0x80, 0x8, 0xb, 0xe0, 0xbe, + 0xe0, 0x3, 0x40, 0x8a, 0xd3, 0xda, 0x79, 0x22, 0x7c, 0xbf, 0x7e, 0x73, 0x39, + 0x45, 0xd2, 0x16, 0x74, 0x1e, 0xac, 0xb7, 0x9, 0xb5, 0x39, 0x49, 0x12, 0x1b, + 0x53, 0x2, 0x12, 0xa6, 0xca, 0x3b, 0x7c, 0xdb, 0x7e, 0x34, 0x3, 0xe8, 0x7a, + 0x35, 0x30, 0x7e, 0x34, 0x3e, 0x80, 0x7a, 0x35, 0x32, 0x7e, 0x37, 0x8d, + 0x94, 0xb, 0x36, 0x7a, 0x35, 0x2c, 0x12, 0x37, 0x5b, 0x7e, 0x90, 0x3, 0xac, + 0x9d, 0x9, 0xa4, 0x9b, 0x59, 0xa, 0xda, 0x6d, 0xcc, 0x7e, 0x14, 0x5, 0xdc, + 0x7f, 0x16, 0x12, 0x1, 0x63, 0x7f, 0x1, 0x9, 0x74, 0x9b, 0x57, 0x7c, 0xb7, + 0x60, 0xc, 0x1e, 0x14, 0x1e, 0x4, 0x50, 0x3, 0x4e, 0x20, 0x80, 0x14, 0x78, + 0xf4, 0x7d, 0x21, 0x7a, 0x25, 0x2e, 0x7e, 0xf4, 0x0, 0x4, 0x7c, 0xb7, 0x60, + 0x5, 0x3e, 0xf4, 0x14, 0x78, 0xfb, 0xa, 0xea, 0xbd, 0xef, 0x68, 0x16, 0x7e, + 0x14, 0x3e, 0x80, 0x12, 0x37, 0xf2, 0x7d, 0xe3, 0x7a, 0xe5, 0x32, 0x7e, + 0x14, 0x3, 0xe8, 0x12, 0x37, 0xf2, 0x7a, 0x35, 0x30, 0x12, 0x36, 0xc8, 0x7e, + 0x34, 0x2, 0xd8, 0xe4, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x34, + 0x2, 0xd8, 0x74, 0xff, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x13, 0x60, 0x12, 0x70, + 0xf9, 0x7e, 0xc0, 0x5, 0x12, 0x32, 0x99, 0xbe, 0xc0, 0x7, 0x58, 0x13, 0x7e, + 0x34, 0x0, 0x1, 0x7c, 0xbc, 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x7c, + 0xb7, 0xf5, 0x2b, 0x80, 0x3, 0x75, 0x2b, 0xc0, 0xbe, 0xc0, 0x6, 0x58, 0x24, + 0x6d, 0x77, 0x80, 0x18, 0xa, 0x2d, 0x7e, 0x34, 0x2, 0xd8, 0xad, 0x32, 0x2d, + 0x37, 0x2e, 0x34, 0x5a, 0x0, 0x7e, 0x39, 0xb0, 0x45, 0x2b, 0x7a, 0x39, 0xb0, + 0xb, 0x74, 0x7e, 0x37, 0x8d, 0x94, 0xbd, 0x37, 0x38, 0xe0, 0x12, 0x36, 0xc6, + 0x12, 0x5d, 0x6c, 0x12, 0xb, 0xc0, 0x7e, 0x18, 0x13, 0x60, 0x7a, 0x1d, 0x34, + 0x7e, 0x35, 0x30, 0x7a, 0x35, 0x3a, 0x7e, 0x35, 0x32, 0x7a, 0x35, 0x3c, + 0x7c, 0xbc, 0x7e, 0x35, 0x2e, 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x51, 0x2b, 0x7c, + 0x4d, 0x12, 0xcc, 0xaa, 0x20, 0xb, 0x77, 0x30, 0xc, 0x2, 0x80, 0x72, 0x1b, + 0xc0, 0xbe, 0xc0, 0x0, 0x48, 0x2, 0xa1, 0xc3, 0x7e, 0xb3, 0x9a, 0xdc, 0xb4, + 0x2, 0x9, 0x7e, 0xb3, 0x9a, 0xdd, 0xbe, 0xb0, 0x2, 0x68, 0x34, 0x6d, 0x77, + 0x80, 0x28, 0x7d, 0x27, 0x3e, 0x24, 0x49, 0x32, 0x13, 0x60, 0xbe, 0x35, + 0x30, 0x28, 0x19, 0xbe, 0x35, 0x32, 0x50, 0x14, 0x9, 0x77, 0x91, 0xfe, 0xbe, + 0x70, 0xff, 0x68, 0xb, 0xa, 0xd, 0x12, 0x37, 0xe9, 0x2d, 0x27, 0x19, 0x72, + 0x5a, 0x0, 0xb, 0x74, 0x7e, 0x37, 0x8d, 0x94, 0xbd, 0x37, 0x38, 0xd0, 0x12, + 0x36, 0xc6, 0x12, 0x5d, 0x6c, 0x7c, 0xbd, 0x12, 0x75, 0xd8, 0x50, 0x15, + 0x7e, 0x8, 0x62, 0x88, 0x7e, 0x35, 0x2c, 0x74, 0xc, 0x12, 0x0, 0x2e, 0x74, + 0x3, 0x7e, 0x8, 0x62, 0x88, 0x12, 0x5d, 0x6c, 0x12, 0x36, 0xb7, 0x12, 0x37, + 0xfc, 0xda, 0x3b, 0x22, 0xe4, 0x7a, 0xb3, 0x9b, 0xb0, 0x2, 0x36, 0xbf, 0x6d, + 0x33, 0x7a, 0x37, 0x3, 0xd6, 0x22, 0x7c, 0xbd, 0xa, 0xd, 0x7e, 0x14, 0x2, + 0xd8, 0xad, 0x10, 0x2e, 0x14, 0x5a, 0x0, 0x6d, 0x0, 0x22, 0x7c, 0x9b, 0x6c, + 0x88, 0x4c, 0x99, 0x7e, 0x70, 0x3c, 0x68, 0xe, 0x12, 0x37, 0x51, 0x4e, 0xa0, + 0x80, 0x12, 0x37, 0x7c, 0x12, 0x38, 0x5b, 0x80, 0xc, 0x12, 0x37, 0x51, 0x5e, + 0xa0, 0x7f, 0x12, 0x37, 0x7c, 0x12, 0xcc, 0x9c, 0x7c, 0xab, 0x7e, 0x70, 0x3, + 0xac, 0x78, 0x19, 0xa3, 0x9b, 0x57, 0x7e, 0x30, 0x3c, 0xac, 0x38, 0x12, + 0x1a, 0xbb, 0x74, 0x3, 0xac, 0xb8, 0x12, 0xd7, 0x0, 0x74, 0x3, 0x12, 0x14, + 0xcb, 0x74, 0xee, 0xac, 0xb8, 0x12, 0x75, 0xca, 0x7d, 0x3f, 0x74, 0x3c, + 0xac, 0xb8, 0x49, 0x25, 0x8e, 0x28, 0x12, 0x12, 0x86, 0x7d, 0x3f, 0xb, 0x35, + 0x74, 0x3c, 0xac, 0xb8, 0x12, 0x12, 0x82, 0xb, 0x80, 0xbe, 0x80, 0x4, 0x40, + 0x9a, 0x22, 0x74, 0x3, 0x7a, 0xb3, 0x9a, 0x61, 0x22, 0xa2, 0x1, 0x92, 0x3, + 0x7e, 0xd, 0x2b, 0x22, 0xac, 0x78, 0x2e, 0x34, 0x8e, 0x28, 0xb, 0x38, 0x50, + 0x22, 0xe4, 0x12, 0x36, 0xd7, 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xff, 0x22, 0x49, + 0x35, 0x39, 0x61, 0x49, 0x25, 0x39, 0x5f, 0x7c, 0xbf, 0x22, 0xac, 0xbe, + 0x49, 0x35, 0x39, 0x65, 0x49, 0x25, 0x39, 0x63, 0x22, 0x1b, 0x38, 0x50, + 0x74, 0x8, 0xac, 0xb8, 0x9, 0xb5, 0x9b, 0x28, 0x22, 0xa, 0x3f, 0x6d, 0x22, + 0x7e, 0x14, 0x0, 0x26, 0x12, 0x1, 0x63, 0x7f, 0x1, 0x2e, 0x4, 0x0, 0xff, + 0x2e, 0x8, 0x3, 0x4, 0xa, 0x2f, 0x22, 0x7e, 0xb3, 0x9b, 0xaf, 0xca, 0xf8, + 0x7c, 0xfb, 0x12, 0xc9, 0x94, 0x12, 0x34, 0x59, 0x1b, 0xf0, 0x68, 0x11, + 0x1b, 0xf0, 0x68, 0x15, 0x1b, 0xf1, 0x68, 0x16, 0xb, 0xf2, 0x78, 0x17, 0x12, + 0xc9, 0xd0, 0x80, 0x12, 0x12, 0xca, 0x5, 0x12, 0xca, 0x55, 0x80, 0xa, 0x12, + 0xc9, 0xe9, 0x80, 0x5, 0x74, 0x1, 0x12, 0xca, 0x6a, 0x12, 0xcc, 0x10, 0xda, + 0xf8, 0x22, 0x7e, 0x34, 0xd, 0xac, 0x2, 0x32, 0x9d, 0x7e, 0x37, 0x75, 0x92, + 0x2, 0x32, 0x9d, 0x7e, 0x14, 0x2, 0xd8, 0xad, 0x10, 0x7d, 0x21, 0x22, 0x7f, + 0x16, 0x12, 0x1, 0x63, 0x7d, 0x1f, 0x2, 0x1, 0x6c, 0x74, 0x1, 0x12, 0x36, + 0xd7, 0xe4, 0x7a, 0xb3, 0x39, 0xff, 0x22, 0xca, 0xf8, 0x7c, 0xfb, 0x12, + 0x3a, 0x3d, 0x7e, 0xa3, 0x9a, 0xf2, 0x7e, 0x70, 0x8, 0xac, 0x7f, 0x19, 0xa3, + 0x9b, 0x28, 0x7c, 0xbf, 0x12, 0x38, 0x23, 0xda, 0xf8, 0x22, 0x7c, 0x9b, + 0x7e, 0x50, 0x8, 0xac, 0x59, 0x9, 0xa2, 0x9b, 0x28, 0x7e, 0x70, 0x3, 0xac, + 0x79, 0x19, 0xa3, 0x9b, 0x59, 0x7c, 0xba, 0x12, 0x38, 0x50, 0x19, 0xa3, + 0x9b, 0x57, 0x74, 0x8, 0xac, 0xb9, 0x9, 0xb5, 0x9b, 0x28, 0x12, 0x38, 0x50, + 0x19, 0xa3, 0x9b, 0x58, 0x22, 0x12, 0x38, 0x5b, 0x7c, 0xab, 0x7e, 0x70, 0x3, + 0xac, 0x79, 0x22, 0x6c, 0xaa, 0xa, 0x3b, 0x12, 0x3a, 0x26, 0x80, 0x4, 0x1e, + 0x34, 0xb, 0xa0, 0xbe, 0x34, 0x0, 0x4, 0x38, 0xf6, 0x7c, 0xba, 0x22, 0xca, + 0x3b, 0x7c, 0x97, 0x12, 0x38, 0x53, 0x9, 0xb3, 0x9b, 0x58, 0xf5, 0x29, 0x7e, + 0x70, 0x8, 0xac, 0x79, 0x9, 0xb3, 0x9b, 0x28, 0xa, 0x1b, 0x12, 0x3a, 0x26, + 0x7d, 0x13, 0x6d, 0x33, 0x7e, 0xb3, 0x9b, 0x41, 0xf5, 0x28, 0x7c, 0xb9, + 0x12, 0x75, 0xd8, 0x92, 0x1, 0x20, 0x1, 0xa, 0x6d, 0x22, 0x7a, 0x27, 0x39, + 0xc1, 0x7a, 0x27, 0x39, 0xc3, 0x20, 0x1, 0x2, 0x21, 0xd4, 0x4c, 0xaa, 0x68, + 0x2, 0x21, 0xd4, 0x7e, 0xa3, 0x82, 0xf, 0x7e, 0xb3, 0x82, 0xe, 0xf5, 0x27, + 0x7e, 0x51, 0x28, 0x7e, 0x68, 0x18, 0x80, 0x7c, 0xe5, 0xbe, 0xe0, 0x4, 0x28, + 0x3, 0x7e, 0xe0, 0x4, 0x7e, 0x40, 0x1, 0x80, 0x2a, 0x12, 0x39, 0xed, 0x6c, + 0xff, 0x80, 0x16, 0x12, 0x3a, 0x4, 0x50, 0x2, 0x80, 0x3, 0x12, 0x39, 0xe5, + 0xbd, 0xbe, 0x28, 0x2, 0x80, 0x3, 0x12, 0x39, 0xf6, 0x12, 0x39, 0xde, 0xbc, + 0xef, 0x38, 0xe6, 0x12, 0x39, 0xd7, 0x50, 0x2, 0x7d, 0x3f, 0xb, 0x40, 0xbc, + 0xa4, 0x38, 0xd2, 0xe5, 0x28, 0xa, 0xdb, 0x7e, 0x43, 0x82, 0xa, 0xa, 0xc4, + 0x12, 0x3a, 0x14, 0x80, 0x2a, 0x12, 0x39, 0xed, 0x6c, 0xff, 0x80, 0x16, + 0x12, 0x3a, 0x4, 0x50, 0x2, 0x80, 0x3, 0x12, 0x39, 0xe5, 0xbd, 0xbe, 0x28, + 0x2, 0x80, 0x3, 0x12, 0x39, 0xf6, 0x12, 0x39, 0xde, 0xbc, 0x5f, 0x38, 0xe6, + 0x12, 0x39, 0xd7, 0x50, 0x2, 0x7d, 0x3f, 0xb, 0x40, 0xbc, 0xa4, 0x38, 0xd2, + 0xa, 0xde, 0xe5, 0x27, 0xa, 0xcb, 0x12, 0x3a, 0x14, 0x80, 0x2a, 0x12, 0x39, + 0xed, 0x6c, 0xff, 0x80, 0x16, 0x12, 0x3a, 0x4, 0x50, 0x2, 0x80, 0x3, 0x12, + 0x39, 0xe5, 0xbd, 0xbe, 0x28, 0x2, 0x80, 0x3, 0x12, 0x39, 0xf6, 0x12, 0x39, + 0xde, 0xbc, 0xef, 0x38, 0xe6, 0x12, 0x39, 0xd7, 0x50, 0x2, 0x7d, 0x3f, 0xb, + 0x40, 0xbc, 0xa4, 0x38, 0xd2, 0x7e, 0xd3, 0x82, 0xa, 0xac, 0xda, 0x7d, 0xd6, + 0x12, 0x3a, 0x1a, 0x80, 0x2a, 0x12, 0x39, 0xed, 0x6c, 0xff, 0x80, 0x16, + 0x12, 0x3a, 0x4, 0x50, 0x2, 0x80, 0x3, 0x12, 0x39, 0xe5, 0xbd, 0xbe, 0x28, + 0x2, 0x80, 0x3, 0x12, 0x39, 0xf6, 0x12, 0x39, 0xde, 0xbc, 0x5f, 0x38, 0xe6, + 0x12, 0x39, 0xd7, 0x50, 0x2, 0x7d, 0x3f, 0xb, 0x40, 0xbc, 0xa4, 0x38, 0xd2, + 0x7e, 0x27, 0x39, 0xc1, 0x7a, 0x27, 0x39, 0xc3, 0x6d, 0x22, 0xe5, 0x29, + 0x60, 0x5, 0x2f, 0x11, 0x14, 0x78, 0xfb, 0x2f, 0x11, 0x2f, 0x11, 0x12, 0x1, + 0x6c, 0x7d, 0xe3, 0x7a, 0xe7, 0x39, 0xc1, 0xda, 0x3b, 0x22, 0x7d, 0xf4, + 0x9d, 0xfe, 0xbd, 0x3f, 0x22, 0xa, 0xba, 0x2d, 0xb, 0xb, 0xf0, 0x22, 0x2d, + 0x9d, 0x7d, 0x8c, 0xb, 0x4a, 0x40, 0x22, 0x6d, 0x44, 0x7d, 0x4, 0x7e, 0xe4, + 0x7f, 0xff, 0x22, 0xa, 0xe4, 0x2d, 0xe0, 0x3e, 0xe4, 0x7f, 0x56, 0x2d, 0xbe, + 0xb, 0x5a, 0xe0, 0x22, 0xa, 0x94, 0x2d, 0x90, 0x3e, 0x94, 0x7f, 0x56, 0x2d, + 0xb9, 0xb, 0x5a, 0xb0, 0xbd, 0xb4, 0x22, 0x9d, 0xcd, 0xa, 0xda, 0xad, 0xdc, + 0x3e, 0xd4, 0x2e, 0xd4, 0x18, 0x80, 0x6d, 0xcc, 0x7e, 0x40, 0x1, 0x22, 0xa, + 0x3b, 0x6d, 0x22, 0x7e, 0x14, 0x0, 0x26, 0x12, 0x1, 0x63, 0x2e, 0x24, 0x0, + 0xff, 0x2e, 0x18, 0x3, 0x2, 0xb, 0x1a, 0x30, 0x22, 0x7e, 0x63, 0x9a, 0xed, + 0x7e, 0x70, 0x8, 0xac, 0x67, 0xb, 0x36, 0x7e, 0x43, 0x9a, 0xee, 0x7e, 0x50, + 0x8, 0xac, 0x45, 0xb, 0x26, 0x7e, 0xb3, 0x9b, 0xaf, 0x60, 0x28, 0x12, 0xc7, + 0x14, 0x7d, 0x53, 0x3e, 0x54, 0x7e, 0x44, 0x0, 0xa, 0x8d, 0x54, 0x1b, 0x54, + 0x7c, 0xab, 0x7e, 0xb3, 0x9a, 0xf2, 0xbc, 0xba, 0x28, 0xf, 0x7a, 0xa3, 0x9a, + 0xf2, 0x7e, 0x37, 0x38, 0x79, 0x4e, 0x70, 0x4, 0x7a, 0x37, 0x38, 0x79, 0x22, + 0x7e, 0x34, 0x0, 0x8, 0xca, 0x39, 0x7e, 0x18, 0x75, 0x6b, 0x7e, 0x8, 0x9b, + 0x23, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x7e, 0x34, 0x0, 0x8, 0xca, 0x39, 0x7e, + 0x18, 0x75, 0x73, 0x7e, 0x8, 0x9b, 0x2b, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x7e, + 0x34, 0x0, 0x8, 0xca, 0x39, 0x7e, 0x18, 0x75, 0x7b, 0x7e, 0x8, 0x9b, 0x33, + 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x7e, 0x34, 0x0, 0x8, 0xca, 0x39, 0x7e, 0x18, + 0x75, 0x83, 0x7e, 0x8, 0x9b, 0x3b, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x6c, 0x88, + 0x7c, 0xb8, 0x12, 0x38, 0x23, 0xb, 0x80, 0xbe, 0x80, 0x4, 0x40, 0xf4, 0x2, + 0x3a, 0xdf, 0x7e, 0x8, 0x9a, 0x4c, 0x7e, 0x34, 0x0, 0x2c, 0xe4, 0x12, 0x0, + 0x2e, 0x7e, 0x34, 0x0, 0x1, 0x7a, 0x37, 0x9a, 0x4c, 0x7a, 0xb3, 0x9a, 0x4e, + 0x7a, 0xb3, 0x9a, 0x4f, 0x7a, 0xb3, 0x9a, 0x50, 0x7a, 0x37, 0x9a, 0x62, + 0x74, 0x1, 0x7a, 0xb3, 0x9a, 0x64, 0xe4, 0x7a, 0xb3, 0x9a, 0x65, 0x74, 0x2, + 0x7a, 0xb3, 0x9a, 0x66, 0x7a, 0x37, 0x9a, 0x6d, 0x74, 0xb, 0x7a, 0xb3, 0x9a, + 0x6f, 0xe4, 0x7a, 0xb3, 0x9a, 0x70, 0x74, 0x3, 0x7a, 0xb3, 0x9a, 0x71, 0x7e, + 0xb3, 0x9b, 0x7f, 0x7e, 0x34, 0x0, 0x2, 0x7a, 0x37, 0x9a, 0x57, 0xb4, 0x1, + 0x30, 0x74, 0x1, 0x7a, 0xb3, 0x9a, 0x59, 0x7a, 0xb3, 0x9a, 0x5a, 0x7a, 0xb3, + 0x9a, 0x5b, 0x74, 0x6, 0x7a, 0xb3, 0x9a, 0x5c, 0x74, 0x1, 0x7a, 0xb3, 0x9a, + 0x5d, 0x7a, 0xb3, 0x9a, 0x5e, 0x74, 0xb, 0x7a, 0xb3, 0x9a, 0x5f, 0xe4, 0x7a, + 0xb3, 0x9a, 0x60, 0x74, 0x3, 0x7a, 0xb3, 0x9a, 0x61, 0x22, 0x74, 0x1, 0x7a, + 0xb3, 0x9a, 0x59, 0xe4, 0x7a, 0xb3, 0x9a, 0x5a, 0x74, 0x1, 0x7a, 0xb3, 0x9a, + 0x5b, 0x7a, 0xb3, 0x9a, 0x5c, 0xe4, 0x7a, 0xb3, 0x9a, 0x5d, 0x74, 0x1, 0x7a, + 0xb3, 0x9a, 0x5e, 0x22, 0x12, 0x40, 0x84, 0x12, 0x71, 0x1, 0x12, 0x70, 0xc3, + 0x12, 0x3a, 0x82, 0x12, 0x71, 0x6d, 0x12, 0x71, 0x9f, 0x12, 0x71, 0x4f, + 0x12, 0x3b, 0xaa, 0x12, 0xb5, 0x5c, 0x12, 0x3f, 0xa0, 0x2, 0x1d, 0x2c, 0x12, + 0x3b, 0xda, 0x7e, 0x8, 0x67, 0x93, 0x74, 0xff, 0x12, 0x3b, 0xd7, 0x7e, 0x8, + 0x68, 0x97, 0x12, 0x3b, 0xd7, 0x7e, 0x8, 0x68, 0x15, 0x12, 0x0, 0x2e, 0x7e, + 0x8, 0x69, 0x19, 0x12, 0x3b, 0xe4, 0x7e, 0x8, 0x69, 0x69, 0x7e, 0x34, 0x0, + 0xd, 0xe4, 0x2, 0x0, 0x2e, 0x12, 0x0, 0x2e, 0x7e, 0x63, 0x75, 0x8c, 0x7e, + 0x70, 0xd, 0xac, 0x67, 0x22, 0xca, 0xf8, 0x6c, 0xaa, 0x80, 0x40, 0x7e, 0xf0, + 0x3, 0x7e, 0x90, 0x8, 0xac, 0x9a, 0x7f, 0x10, 0x2d, 0x34, 0x7a, 0x1b, 0xf0, + 0x74, 0x3, 0x7f, 0x10, 0x2d, 0x34, 0x39, 0xb1, 0x0, 0x1, 0x7e, 0x34, 0x7f, + 0xff, 0x7f, 0x70, 0x2d, 0xf4, 0x79, 0x37, 0x0, 0x2, 0x7f, 0x70, 0x2d, 0xf4, + 0x79, 0x37, 0x0, 0x4, 0xe4, 0x7f, 0x10, 0x2d, 0x34, 0x39, 0xb1, 0x0, 0x6, + 0x7f, 0x10, 0x2d, 0x34, 0x39, 0xb1, 0x0, 0x7, 0xb, 0xa0, 0x12, 0x3c, 0x72, + 0x38, 0xbb, 0x12, 0xda, 0xec, 0x74, 0x2, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x1, + 0xa, 0x12, 0x8c, 0x28, 0x7e, 0x8, 0x1, 0x28, 0x12, 0x3c, 0x6b, 0x7e, 0x8, + 0x1, 0x32, 0x12, 0x3c, 0x6b, 0x7e, 0x8, 0x1, 0x14, 0x12, 0x3c, 0x6b, 0x7e, + 0x8, 0x1, 0x1e, 0x12, 0x3c, 0x6b, 0x7e, 0x8, 0x1, 0x3c, 0x12, 0x3c, 0x6b, + 0x7e, 0x8, 0x1, 0x46, 0x12, 0x8c, 0x30, 0xda, 0xf8, 0x22, 0x7e, 0x34, 0x0, + 0xa, 0x2, 0x0, 0x2e, 0x7e, 0xb3, 0x75, 0x8c, 0xbc, 0xba, 0x22, 0xca, 0x69, + 0xca, 0xf8, 0x7e, 0x48, 0x69, 0x19, 0x6c, 0xaa, 0x80, 0x1a, 0x12, 0x9e, 0xb, + 0x19, 0x62, 0x67, 0x97, 0x74, 0xff, 0xa, 0x4a, 0x19, 0xb4, 0x92, 0x12, 0xe4, + 0x19, 0xb4, 0x91, 0xfe, 0x19, 0xb4, 0x92, 0x8, 0xb, 0xa0, 0x12, 0x3f, 0x50, + 0x38, 0xe1, 0x7e, 0x63, 0x69, 0x69, 0xa5, 0xbe, 0x0, 0x2e, 0x7e, 0xb3, 0x2, + 0x4a, 0x70, 0x2, 0xe1, 0x35, 0x6c, 0xaa, 0x80, 0x1b, 0x7e, 0x24, 0x7f, 0xff, + 0x7e, 0x30, 0x8, 0xac, 0x3a, 0x7f, 0x74, 0x2d, 0xf1, 0x79, 0x27, 0x0, 0x2, + 0x2d, 0x19, 0x7d, 0x8, 0x79, 0x20, 0x0, 0x4, 0xb, 0xa0, 0x12, 0x3c, 0x72, + 0x38, 0xe0, 0xe1, 0x35, 0x7e, 0xb3, 0x2, 0x4a, 0x70, 0x33, 0xbe, 0x60, 0x0, + 0x28, 0x2e, 0x6c, 0xaa, 0x80, 0x20, 0x12, 0x3f, 0x83, 0xac, 0x3a, 0x12, + 0x3f, 0x90, 0xac, 0x5a, 0x12, 0x3f, 0x66, 0x74, 0x1, 0xa, 0x4a, 0x19, 0xb4, + 0x91, 0xfe, 0x7e, 0x50, 0xd, 0xac, 0x5a, 0x19, 0xa2, 0x67, 0x97, 0xb, 0xa0, + 0x7e, 0x63, 0x69, 0x69, 0xbc, 0x6a, 0x38, 0xd8, 0xe1, 0x35, 0x6c, 0xaa, + 0x80, 0x19, 0x7e, 0x44, 0x7f, 0xff, 0x12, 0x3f, 0x5e, 0x59, 0x42, 0x2d, + 0x32, 0x59, 0x42, 0x2d, 0x34, 0x59, 0x42, 0x2d, 0x5a, 0x59, 0x42, 0x2d, + 0x5c, 0xb, 0xa0, 0x12, 0x3f, 0x50, 0x38, 0xe2, 0x7e, 0x63, 0x2, 0x4a, 0xbe, + 0x63, 0x69, 0x69, 0x28, 0xa, 0xbe, 0x60, 0x2, 0x40, 0x5, 0x7e, 0x70, 0x1, + 0x80, 0x2, 0x6c, 0x77, 0x6c, 0xaa, 0xa1, 0xfe, 0x6c, 0xff, 0xa1, 0xf5, 0x7e, + 0x50, 0x8, 0xac, 0x5f, 0x7f, 0x64, 0x2d, 0xd2, 0x69, 0x6, 0x0, 0x2, 0xbe, + 0x4, 0x7f, 0xff, 0x78, 0x2, 0xa1, 0xf3, 0xa, 0x1f, 0x9, 0xb1, 0x92, 0x8, + 0x60, 0x2, 0xa1, 0xf3, 0xa5, 0xbf, 0x1, 0x60, 0x7e, 0x50, 0x2, 0xac, 0x5f, + 0x49, 0x42, 0x2, 0x5f, 0xbe, 0x44, 0x7f, 0xff, 0x68, 0x51, 0x49, 0xe2, 0x2, + 0x5f, 0x69, 0xf6, 0x0, 0x2, 0x7d, 0x4f, 0x9d, 0x4e, 0x2d, 0x4f, 0x49, 0xe2, + 0x2, 0x4b, 0x69, 0xf6, 0x0, 0x4, 0x7d, 0x2f, 0x9d, 0x2e, 0x2d, 0x2f, 0xbe, + 0x44, 0x0, 0x0, 0x58, 0x2, 0x6d, 0x44, 0xbe, 0x24, 0x0, 0x0, 0x58, 0x2, + 0x6d, 0x22, 0x7e, 0xf7, 0x76, 0x1b, 0x1b, 0xf4, 0xbd, 0xf4, 0x50, 0x2, 0x7d, + 0x4f, 0x7e, 0xf7, 0x76, 0x29, 0x1b, 0xf4, 0xbd, 0xf2, 0x50, 0x2, 0x7d, 0x2f, + 0x12, 0x3f, 0x79, 0x59, 0x4f, 0x2d, 0x32, 0x59, 0x2f, 0x2d, 0x34, 0x80, 0xf, + 0x12, 0x3f, 0x79, 0x59, 0xf, 0x2d, 0x32, 0x69, 0x6, 0x0, 0x4, 0x59, 0xf, + 0x2d, 0x34, 0xa, 0xa, 0x19, 0xf0, 0x92, 0x12, 0x74, 0x1, 0x19, 0xb1, 0x92, + 0x8, 0x80, 0x9, 0xb, 0xf0, 0x12, 0x3f, 0x57, 0x28, 0x2, 0xa1, 0x53, 0xb, + 0xa0, 0x7e, 0x63, 0x2, 0x4a, 0xbc, 0x6a, 0x28, 0x2, 0xa1, 0x4f, 0x6c, 0xaa, + 0x80, 0x1a, 0x12, 0x3f, 0x6f, 0x69, 0x30, 0x0, 0x2, 0x7e, 0x50, 0x2, 0xac, + 0x5a, 0x59, 0x32, 0x2, 0x5f, 0x69, 0x30, 0x0, 0x4, 0x59, 0x32, 0x2, 0x4b, + 0xb, 0xa0, 0x7e, 0x73, 0x75, 0x8c, 0xbc, 0x7a, 0x38, 0xde, 0x6c, 0xaa, 0x80, + 0x2b, 0xa, 0x2a, 0x9, 0xb2, 0x92, 0x12, 0xb4, 0xff, 0x20, 0x6c, 0xff, 0x80, + 0x18, 0xa, 0x4f, 0x9, 0xb4, 0x92, 0x8, 0x70, 0xe, 0xa, 0x2a, 0x19, 0xf2, + 0x92, 0x12, 0x74, 0x1, 0x19, 0xb4, 0x92, 0x8, 0x80, 0x6, 0xb, 0xf0, 0xbc, + 0x7f, 0x38, 0xe4, 0xb, 0xa0, 0xbc, 0x7a, 0x38, 0xd1, 0x6c, 0xaa, 0x80, 0x1a, + 0x7e, 0x70, 0xd, 0xac, 0x7a, 0x49, 0x43, 0x67, 0x93, 0x12, 0x3f, 0x5e, 0x59, + 0x42, 0x2d, 0x5a, 0x49, 0x33, 0x67, 0x95, 0x59, 0x32, 0x2d, 0x5c, 0xb, 0xa0, + 0x7e, 0xb3, 0x69, 0x69, 0xbc, 0xba, 0x38, 0xde, 0x7e, 0x34, 0x2d, 0x32, + 0x7a, 0x37, 0x92, 0x1e, 0x7e, 0x34, 0x2d, 0x5a, 0x7a, 0x37, 0x92, 0x20, + 0x7e, 0x34, 0x2d, 0x82, 0x7a, 0x37, 0x92, 0x22, 0x7e, 0x73, 0x2, 0x4a, 0x7a, + 0x73, 0x92, 0x1c, 0x7e, 0x73, 0x69, 0x69, 0x7a, 0x73, 0x92, 0x1d, 0x7e, 0x8, + 0x92, 0x1c, 0x12, 0x2a, 0xf, 0x6c, 0xaa, 0x80, 0x4a, 0x7e, 0x70, 0xff, 0x6c, + 0xff, 0x80, 0x19, 0x7e, 0x50, 0x2, 0xac, 0x5f, 0x49, 0x12, 0x2d, 0x82, 0xa, + 0x2a, 0xbd, 0x21, 0x78, 0x8, 0xa, 0x3f, 0x9, 0x73, 0x92, 0x12, 0x80, 0x7, + 0xb, 0xf0, 0x12, 0x3f, 0x57, 0x38, 0xe2, 0xbe, 0x70, 0xff, 0x68, 0x1e, 0x7e, + 0x50, 0xd, 0xac, 0x5a, 0x19, 0x72, 0x67, 0x97, 0x74, 0x1, 0xa, 0x47, 0x19, + 0xb4, 0x91, 0xfe, 0x12, 0x3f, 0x83, 0xac, 0x37, 0x12, 0x3f, 0x90, 0xac, + 0x57, 0x12, 0x3f, 0x66, 0xb, 0xa0, 0x7e, 0x63, 0x69, 0x69, 0xbc, 0x6a, 0x38, + 0xae, 0x6c, 0xaa, 0x80, 0x20, 0xa, 0x3a, 0x9, 0xb3, 0x91, 0xfe, 0xbe, 0xb0, + 0x1, 0x68, 0x13, 0x7e, 0x44, 0x7f, 0xff, 0x12, 0x3f, 0x6f, 0x79, 0x40, 0x0, + 0x2, 0x2d, 0x39, 0x7d, 0x28, 0x79, 0x41, 0x0, 0x4, 0xb, 0xa0, 0x12, 0x3c, + 0x72, 0x38, 0xdb, 0x7f, 0x4, 0x7e, 0x18, 0x91, 0xfe, 0x12, 0x88, 0x29, 0x7a, + 0xb3, 0x2, 0x4a, 0x7f, 0x4, 0x7e, 0x18, 0x91, 0xfe, 0x12, 0x89, 0x58, 0xda, + 0xf8, 0xda, 0x69, 0x22, 0x7e, 0x63, 0x75, 0x8c, 0xbc, 0x6a, 0x22, 0x7e, + 0x63, 0x75, 0x8c, 0xbc, 0x6f, 0x22, 0x7e, 0x50, 0x2, 0xac, 0x5a, 0x3e, 0x24, + 0x22, 0x7f, 0x4, 0x2d, 0x12, 0x79, 0x40, 0x0, 0x4, 0x22, 0x7e, 0x70, 0x8, + 0xac, 0x7a, 0x7f, 0x4, 0x2d, 0x13, 0x22, 0x7e, 0xd0, 0x2, 0xac, 0xda, 0x7d, + 0xf6, 0x3e, 0xf4, 0x22, 0x7e, 0x90, 0xd, 0xac, 0x9a, 0x49, 0x24, 0x67, 0x93, + 0x7e, 0x30, 0x8, 0x22, 0x2d, 0x19, 0x7d, 0x8, 0x79, 0x20, 0x0, 0x2, 0x49, + 0x44, 0x67, 0x95, 0x7e, 0x50, 0x8, 0x22, 0x12, 0x1f, 0xd9, 0x68, 0x6, 0x12, + 0x3f, 0xdc, 0x2, 0x1f, 0xca, 0xe4, 0x12, 0x1f, 0xcc, 0x2, 0x3f, 0xb2, 0x12, + 0x1c, 0xb5, 0x5e, 0x60, 0x7f, 0x12, 0xd7, 0x27, 0x5e, 0x70, 0xf, 0x1b, 0xa, + 0x30, 0xc2, 0x1, 0x12, 0x3f, 0xcb, 0xd2, 0x8, 0x2, 0x15, 0x16, 0xa2, 0x1, + 0x92, 0x2, 0x7e, 0x8, 0x8d, 0xc4, 0x12, 0xd6, 0x5b, 0x12, 0x17, 0xfe, 0x2, + 0x12, 0x86, 0x12, 0xcc, 0x7f, 0x78, 0x6, 0xe4, 0x7a, 0xb3, 0x9b, 0xaf, 0x22, + 0x12, 0x1c, 0xb9, 0x5e, 0x70, 0xfb, 0x1b, 0xa, 0x30, 0x12, 0xc6, 0xb3, 0x12, + 0x3f, 0xf9, 0x2, 0xc5, 0x49, 0xd2, 0x1, 0x12, 0x3f, 0xcb, 0xd2, 0x6, 0x12, + 0x14, 0xe7, 0x7e, 0x34, 0x0, 0xa, 0x22, 0xe4, 0x7a, 0xb3, 0x59, 0x60, 0x6d, + 0x33, 0x7a, 0x37, 0x38, 0x8e, 0x7a, 0xb3, 0x37, 0xdf, 0x7e, 0xb3, 0x9b, + 0x18, 0x70, 0x5, 0x12, 0x40, 0x46, 0x80, 0x3, 0x12, 0x40, 0x72, 0xc2, 0x0, + 0x12, 0x32, 0xa8, 0x7e, 0x34, 0x5, 0x20, 0xca, 0x39, 0x7e, 0x1f, 0x2d, 0x2a, + 0x7e, 0xf, 0x2d, 0x2e, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x12, 0x32, 0xc0, 0x12, + 0xb9, 0x8f, 0x2, 0x8, 0x2c, 0x74, 0x1, 0x7a, 0xb3, 0x8d, 0x91, 0x22, 0x12, + 0x40, 0x7b, 0x7e, 0x73, 0x9b, 0x7e, 0x7a, 0x73, 0x9a, 0xc3, 0x7e, 0xb3, + 0x9b, 0x18, 0x70, 0x5, 0x12, 0x40, 0x46, 0x80, 0x3, 0x12, 0x40, 0x72, 0xe4, + 0x7a, 0xb3, 0x69, 0x6a, 0x7a, 0xb3, 0x69, 0x69, 0x2, 0xa, 0xbf, 0x7e, 0x73, + 0x9a, 0xc2, 0x7a, 0x73, 0x8d, 0x91, 0x22, 0x7e, 0x73, 0x9b, 0xaf, 0x7a, + 0x73, 0x9a, 0xc8, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x9b, 0x1b, 0xe4, 0x7a, 0xb3, + 0x9a, 0xbc, 0x7e, 0x73, 0x69, 0xe6, 0x7a, 0x73, 0x9a, 0xbe, 0x7e, 0x73, + 0x69, 0xe7, 0x7a, 0x73, 0x9a, 0xbf, 0x7e, 0x73, 0x75, 0x8c, 0x7a, 0x73, + 0x9a, 0xc1, 0x7a, 0xb3, 0x9a, 0xc2, 0x12, 0x40, 0x7b, 0x7a, 0xb3, 0x9a, + 0xca, 0x7a, 0xb3, 0x9a, 0xd0, 0x7e, 0x73, 0x69, 0xea, 0x7a, 0x73, 0x9a, + 0xda, 0x7e, 0x73, 0x69, 0xeb, 0x7a, 0x73, 0x9a, 0xdb, 0x7e, 0x73, 0x9b, + 0x68, 0x7a, 0x73, 0x9a, 0xdc, 0x7e, 0x73, 0x9b, 0x69, 0x7a, 0x73, 0x9a, + 0xdd, 0x7e, 0x73, 0x9b, 0x6a, 0x7a, 0x73, 0x9a, 0xde, 0x7e, 0x73, 0x9b, + 0x6b, 0x7a, 0x73, 0x9a, 0xdf, 0x7e, 0x73, 0x9b, 0x6c, 0x7a, 0x73, 0x9a, + 0xe0, 0x74, 0x1, 0x7a, 0xb3, 0x9a, 0xec, 0x7e, 0x37, 0x76, 0x6c, 0x7a, 0x37, + 0x9a, 0xf9, 0x7e, 0x34, 0x0, 0x5, 0xca, 0x39, 0x7e, 0x18, 0x9b, 0x48, 0x7e, + 0x8, 0x9a, 0xfc, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x74, 0x2, 0x7a, 0xb3, 0x9a, + 0xc5, 0xe4, 0x7a, 0xb3, 0x9a, 0xcd, 0x74, 0x64, 0x7a, 0xb3, 0x9a, 0xce, + 0xe4, 0x7a, 0xb3, 0x9b, 0x5, 0x12, 0x32, 0xa, 0x2, 0x41, 0x2b, 0x7e, 0x34, + 0x0, 0x80, 0x12, 0x42, 0xef, 0x7e, 0x8, 0x37, 0xf2, 0x2, 0x41, 0x3d, 0x7e, + 0x8, 0x0, 0x27, 0x7f, 0x70, 0x12, 0x42, 0x6f, 0x7f, 0x7, 0x7e, 0x35, 0x2b, + 0x12, 0xc3, 0x29, 0xc2, 0x0, 0x12, 0x42, 0xbb, 0xd3, 0x22, 0xca, 0x79, 0x6c, + 0xff, 0x7e, 0x34, 0x0, 0x2, 0x12, 0x42, 0xef, 0x12, 0x41, 0x39, 0x12, 0x42, + 0x60, 0x68, 0x4, 0x74, 0x70, 0x80, 0x2, 0xe5, 0x27, 0x7a, 0xb3, 0x67, 0x75, + 0x7e, 0x58, 0x69, 0x76, 0x12, 0x32, 0x99, 0x7e, 0x34, 0x18, 0x75, 0x7a, + 0x35, 0x2b, 0x7e, 0x34, 0x20, 0x0, 0x7e, 0x24, 0x0, 0x1, 0x7e, 0x8, 0x69, + 0x76, 0x12, 0x41, 0x3d, 0x7e, 0x37, 0x69, 0x7a, 0x2e, 0x37, 0x69, 0x78, + 0xbe, 0x34, 0xff, 0xff, 0x68, 0x3, 0x4e, 0xf0, 0x1, 0x7e, 0x73, 0x69, 0x77, + 0xa, 0x27, 0x7e, 0xa3, 0x69, 0x76, 0xa, 0x3a, 0x12, 0x42, 0x68, 0x68, 0x3, + 0x4e, 0xf0, 0x2, 0x7e, 0xc7, 0x69, 0x78, 0x2e, 0xb4, 0x0, 0x6, 0x6c, 0xee, + 0x6d, 0xdd, 0x80, 0xb, 0x7f, 0x15, 0x2d, 0x3d, 0x7e, 0x1b, 0xb0, 0x6c, 0xeb, + 0xb, 0xd4, 0xbd, 0xcd, 0x38, 0xf1, 0xbc, 0xae, 0x68, 0x3, 0x4e, 0xf0, 0x4, + 0x7e, 0x34, 0x0, 0x4, 0x7a, 0x35, 0x2b, 0x7e, 0x34, 0x40, 0x0, 0x7e, 0x24, + 0x0, 0x1, 0x12, 0x41, 0x39, 0xe5, 0x2a, 0xa, 0x2b, 0xe5, 0x29, 0x12, 0x42, + 0x66, 0x78, 0xc, 0xe5, 0x29, 0xbe, 0xb0, 0xff, 0x68, 0x5, 0xe5, 0x2a, 0xb4, + 0xff, 0x3, 0x4e, 0xf0, 0x10, 0x12, 0x42, 0x60, 0x68, 0x3, 0x4e, 0xf0, 0x20, + 0x7e, 0xa1, 0x29, 0x74, 0x44, 0xa4, 0x7d, 0xc5, 0xe5, 0x29, 0x7a, 0xb3, 0x3, + 0xf1, 0x7e, 0x58, 0x4, 0x0, 0x7a, 0xc5, 0x2b, 0x7e, 0x34, 0x40, 0x4, 0x7e, + 0x24, 0x0, 0x1, 0x7f, 0x5, 0x12, 0x41, 0x3d, 0x6c, 0xee, 0x6d, 0xdd, 0x80, + 0xb, 0x7f, 0x15, 0x2d, 0x3d, 0x7e, 0x1b, 0x70, 0x6c, 0xe7, 0xb, 0xd4, 0xbd, + 0xcd, 0x38, 0xf1, 0x7f, 0x5, 0x7d, 0x3c, 0xe4, 0x12, 0x0, 0x2e, 0xbe, 0xe1, + 0x27, 0x68, 0x3, 0x4e, 0xf0, 0x40, 0x7a, 0xf3, 0x67, 0x74, 0x4c, 0xff, 0x68, + 0x6, 0x12, 0x42, 0xf7, 0x12, 0x0, 0x1e, 0xda, 0x79, 0x22, 0xe5, 0x28, 0xa, + 0x2b, 0xe5, 0x27, 0xa, 0x3b, 0x2d, 0x32, 0xbe, 0x34, 0x0, 0xff, 0x22, 0x7d, + 0x52, 0xf5, 0x2f, 0x7c, 0xb6, 0x7c, 0xa5, 0xa, 0x44, 0xf5, 0x2e, 0x7f, 0x21, + 0xf5, 0x2d, 0xd2, 0x0, 0x12, 0x42, 0xbb, 0x74, 0xb, 0x12, 0x42, 0x9c, 0xe5, + 0x2f, 0x12, 0x42, 0x9c, 0xe5, 0x2e, 0x12, 0x42, 0x9c, 0xe5, 0x2d, 0x12, + 0x42, 0x9c, 0xe4, 0x2, 0x42, 0x9c, 0x12, 0x42, 0xe7, 0x4e, 0x70, 0x3, 0x1b, + 0xa, 0x30, 0x12, 0xd7, 0x47, 0xa, 0x3b, 0x12, 0xda, 0xc9, 0x7e, 0x1f, 0x39, + 0xe4, 0x69, 0x31, 0x0, 0xe, 0x4d, 0x33, 0x78, 0xf4, 0xd3, 0x22, 0x12, 0x42, + 0xe7, 0x30, 0x0, 0x5, 0x5e, 0x70, 0xef, 0x80, 0x3, 0x4e, 0x70, 0x10, 0x1b, + 0xa, 0x30, 0x22, 0x75, 0xe7, 0x6b, 0xe4, 0x7e, 0x34, 0x1, 0x4, 0x7e, 0x24, + 0x0, 0xfe, 0x7a, 0x1b, 0xb0, 0x7e, 0x34, 0x1, 0x5, 0x7a, 0x1b, 0xb0, 0x75, + 0xe9, 0xff, 0x22, 0x7e, 0xf, 0x39, 0xe4, 0xb, 0xa, 0x30, 0x22, 0x7a, 0x35, + 0x2b, 0x7e, 0x18, 0x1f, 0x80, 0x22, 0x7e, 0x14, 0xf7, 0xf0, 0x7e, 0x4, 0x0, + 0xff, 0x7e, 0x34, 0x47, 0x52, 0x7e, 0x24, 0x55, 0x50, 0x12, 0x43, 0x44, + 0x7e, 0x34, 0x45, 0x20, 0x7e, 0x24, 0x41, 0x44, 0x79, 0x30, 0x0, 0x6, 0x79, + 0x20, 0x0, 0x4, 0x7e, 0x34, 0x99, 0x33, 0x7e, 0x24, 0x66, 0xcc, 0x79, 0x30, + 0x0, 0xa, 0x79, 0x20, 0x0, 0x8, 0x7e, 0x34, 0x41, 0x47, 0x7e, 0x24, 0x46, + 0x4c, 0x79, 0x30, 0x0, 0xe, 0x79, 0x20, 0x0, 0xc, 0x22, 0x69, 0x30, 0x0, + 0x2, 0xb, 0xa, 0x20, 0x2f, 0x12, 0x79, 0x30, 0x0, 0x2, 0x1b, 0xa, 0x20, + 0x22, 0xca, 0x79, 0x7c, 0xf7, 0x7c, 0xeb, 0x7e, 0xb3, 0x82, 0xd, 0xac, 0xbe, + 0xa, 0xaf, 0x2d, 0xa5, 0x7d, 0xba, 0x3e, 0xb4, 0x49, 0xbb, 0x4, 0x0, 0x7e, + 0x73, 0x81, 0xec, 0xa, 0x37, 0x9d, 0xb3, 0xbe, 0xb4, 0x0, 0x0, 0x18, 0x2, + 0x81, 0x5a, 0x7e, 0x1d, 0x10, 0x69, 0x11, 0x0, 0xf, 0xbd, 0x1b, 0x18, 0xb, + 0x2e, 0x34, 0x0, 0xa, 0x7e, 0x1b, 0xb0, 0x4, 0x7a, 0x1b, 0xb0, 0xe4, 0x7e, + 0x1d, 0x10, 0x7e, 0x1b, 0xa0, 0xa, 0x3a, 0xa, 0x2e, 0x9d, 0x23, 0xbe, 0x24, + 0x0, 0x0, 0x8, 0x8, 0xa, 0x1a, 0xa, 0x3e, 0x9d, 0x31, 0x80, 0x4, 0x6d, 0x33, + 0x9d, 0x32, 0x7e, 0xd, 0x10, 0x29, 0x60, 0x0, 0x1, 0xa, 0x26, 0xa, 0x4f, + 0x9d, 0x42, 0xbe, 0x44, 0x0, 0x0, 0x8, 0xa, 0xa, 0x16, 0xa, 0x2f, 0x9d, + 0x21, 0x7c, 0xa5, 0x80, 0x6, 0x6d, 0x22, 0x9d, 0x24, 0x7c, 0xa5, 0xbe, 0x70, + 0x1, 0x38, 0x5, 0xbe, 0xa0, 0x1, 0x28, 0x3d, 0x7e, 0x1d, 0x10, 0x29, 0x71, + 0x0, 0x4, 0xbe, 0x70, 0x3, 0x40, 0x10, 0x7e, 0x1d, 0x10, 0x29, 0x71, 0x0, + 0x5, 0xbe, 0x70, 0x3, 0x40, 0x4, 0xd2, 0x1, 0x80, 0x2, 0xc2, 0x1, 0x7c, + 0xbe, 0x7c, 0x7f, 0x7e, 0xd, 0x10, 0x29, 0x60, 0x0, 0x2, 0x12, 0xcd, 0xeb, + 0xbe, 0xb0, 0x2, 0x68, 0x3, 0xb4, 0x3, 0x4, 0xe, 0xb4, 0x80, 0x5, 0xb4, 0x1, + 0x2, 0x6d, 0xbb, 0x7d, 0x5b, 0x1a, 0x4a, 0x1a, 0x48, 0x7e, 0xd, 0x10, 0x2e, + 0x14, 0x0, 0x13, 0x12, 0x43, 0x3b, 0x30, 0x26, 0x18, 0x7d, 0xda, 0x3e, 0xd4, + 0x7e, 0x1f, 0x3, 0xdc, 0x2d, 0x3d, 0xb, 0x1a, 0xc0, 0x7e, 0x1f, 0x3, 0xe0, + 0x2d, 0x3d, 0xb, 0x1a, 0xd0, 0x80, 0x4, 0xa, 0xce, 0xa, 0xdf, 0x7d, 0x1c, + 0x12, 0x46, 0xdb, 0x2e, 0x14, 0x0, 0x17, 0x12, 0x43, 0x3b, 0x7d, 0x1d, 0x12, + 0x46, 0xdb, 0x2e, 0x14, 0x0, 0x1b, 0x12, 0x43, 0x3b, 0xda, 0x79, 0x22, 0xca, + 0xd8, 0xca, 0x79, 0x7c, 0xf7, 0x7c, 0xeb, 0x7e, 0x73, 0x82, 0xd, 0xa, 0x27, + 0x12, 0x46, 0x78, 0x7f, 0x21, 0x2d, 0x51, 0x7e, 0x2b, 0xb0, 0x60, 0x2, 0xa1, + 0x95, 0x74, 0x1, 0x12, 0x46, 0xb0, 0x7c, 0x7f, 0x12, 0x43, 0x4c, 0x12, 0x46, + 0xee, 0xa, 0x57, 0x1a, 0x4e, 0x1b, 0x44, 0xbd, 0x45, 0x48, 0x30, 0x12, 0x46, + 0xd0, 0x12, 0x46, 0xa3, 0x7e, 0x2b, 0xb0, 0x70, 0x25, 0x12, 0x46, 0x8c, 0x8, + 0xa, 0x7c, 0xbe, 0x14, 0x7c, 0x7f, 0x12, 0x44, 0x5d, 0x80, 0x16, 0x74, 0x2, + 0x1a, 0x2e, 0x1b, 0x24, 0xa, 0x3d, 0x12, 0x46, 0x7a, 0x12, 0x46, 0xb0, 0x14, + 0x12, 0x46, 0xc0, 0x14, 0x12, 0x45, 0x9a, 0x7e, 0xd, 0x10, 0x29, 0x70, 0x0, + 0x8, 0xa, 0x37, 0x1a, 0x5f, 0x7d, 0x45, 0x1b, 0x44, 0xbd, 0x43, 0x48, 0x38, + 0x12, 0x46, 0x99, 0x1b, 0x54, 0x7e, 0x2b, 0xb0, 0x70, 0x2e, 0x3e, 0x34, + 0x49, 0x23, 0x3, 0xfe, 0x12, 0x46, 0x92, 0x8, 0xb, 0x7c, 0x7f, 0x1b, 0x70, + 0x7c, 0xbe, 0x12, 0x44, 0x5d, 0x80, 0x18, 0x12, 0x46, 0x74, 0x2d, 0x31, + 0x1b, 0x34, 0x7a, 0x1b, 0xb0, 0x7c, 0xbe, 0x7c, 0x7f, 0x1b, 0x70, 0x12, + 0x46, 0xb8, 0x1b, 0x70, 0x12, 0x45, 0x9c, 0x7e, 0xd, 0x10, 0x29, 0x70, 0x0, + 0x7, 0xa, 0x57, 0x1a, 0x4e, 0xb, 0x44, 0xbd, 0x45, 0x58, 0x30, 0x12, 0x46, + 0xd0, 0x12, 0x46, 0xa3, 0x7e, 0x2b, 0xb0, 0x70, 0x25, 0x12, 0x46, 0x8c, 0x8, + 0xa, 0x7c, 0xbe, 0x4, 0x7c, 0x7f, 0x12, 0x44, 0x5d, 0x80, 0x16, 0x74, 0x2, + 0x1a, 0x2e, 0xb, 0x24, 0xa, 0x3d, 0x12, 0x46, 0x7a, 0x12, 0x46, 0xb0, 0x4, + 0x12, 0x46, 0xc0, 0x4, 0x12, 0x45, 0x9a, 0x7e, 0xd, 0x10, 0x29, 0x70, 0x0, + 0x9, 0xa, 0x37, 0x1a, 0x5f, 0x7d, 0x45, 0xb, 0x44, 0xbd, 0x43, 0x58, 0x36, + 0x12, 0x46, 0x99, 0x29, 0xb2, 0x0, 0x1, 0x70, 0x2d, 0x3e, 0x34, 0x49, 0x23, + 0x4, 0x2, 0x12, 0x46, 0x92, 0x8, 0xb, 0x7c, 0x7f, 0xb, 0x70, 0x7c, 0xbe, + 0x12, 0x44, 0x5d, 0x80, 0x17, 0x12, 0x46, 0x74, 0x2d, 0x31, 0x39, 0xb1, 0x0, + 0x1, 0x7c, 0xbe, 0x7c, 0x7f, 0xb, 0x70, 0x12, 0x46, 0xb8, 0xb, 0x70, 0x12, + 0x45, 0x9c, 0xda, 0x79, 0xda, 0xd8, 0x22, 0x7c, 0x7f, 0x7c, 0x6e, 0x7c, + 0x5f, 0xca, 0x3b, 0x7c, 0xf5, 0x7c, 0xe6, 0x7c, 0xd7, 0x7c, 0xcb, 0x7e, + 0x14, 0x7, 0xe7, 0x7e, 0x4, 0x0, 0xff, 0x12, 0x46, 0xc8, 0x7a, 0x1d, 0x32, + 0x7e, 0x14, 0x7, 0xeb, 0x7e, 0x4, 0x0, 0xff, 0x12, 0x46, 0xc8, 0x7a, 0x1d, + 0x36, 0x75, 0x3a, 0x0, 0x75, 0x3b, 0x0, 0x7e, 0x11, 0x3a, 0x3e, 0x10, 0x2e, + 0x11, 0x3b, 0x7c, 0x1, 0x2e, 0x0, 0x32, 0xa5, 0xe6, 0x1a, 0x4b, 0x1a, 0x5c, + 0x2d, 0x54, 0xf5, 0x3c, 0x2e, 0x10, 0x36, 0xa5, 0xe7, 0x1a, 0x4b, 0x1a, + 0x5d, 0x2d, 0x54, 0xf5, 0x3d, 0xbe, 0xe1, 0x3c, 0x78, 0x5, 0xbe, 0xf1, 0x3d, + 0x68, 0x61, 0x12, 0x46, 0xee, 0xbe, 0x71, 0x3c, 0x18, 0x59, 0x29, 0x70, 0x0, + 0x7, 0xbe, 0x71, 0x3c, 0x8, 0x50, 0x29, 0x70, 0x0, 0x8, 0xbe, 0x71, 0x3d, + 0x18, 0x47, 0x29, 0x70, 0x0, 0x9, 0xbe, 0x71, 0x3d, 0x8, 0x3e, 0x7e, 0x73, + 0x82, 0xd, 0xa, 0x27, 0xe5, 0x3c, 0x1a, 0x3b, 0xad, 0x32, 0xe5, 0x3d, 0x1a, + 0x9b, 0x2d, 0x93, 0x69, 0x30, 0x0, 0xd, 0x69, 0x20, 0x0, 0xb, 0x2d, 0x39, + 0x7e, 0x1b, 0xb0, 0x70, 0x1d, 0x7d, 0x89, 0x3e, 0x84, 0x49, 0x58, 0x4, 0x0, + 0x69, 0x80, 0x0, 0x11, 0xbd, 0x58, 0x18, 0xd, 0x74, 0x2, 0x7a, 0x1b, 0xb0, + 0xe5, 0x3c, 0x7e, 0x71, 0x3d, 0x12, 0x43, 0x4c, 0x5, 0x3b, 0xe5, 0x3b, 0xb4, + 0x2, 0x2, 0x80, 0x2, 0xa1, 0xcc, 0x5, 0x3a, 0xe5, 0x3a, 0xbe, 0xb0, 0x2, + 0x50, 0x2, 0xa1, 0xc9, 0xda, 0x3b, 0x22, 0x74, 0x2, 0xa, 0x2d, 0x1a, 0x3e, + 0xad, 0x32, 0x1a, 0x1f, 0x2d, 0x13, 0x7e, 0x7d, 0x10, 0x69, 0x37, 0x0, 0xd, + 0x69, 0x27, 0x0, 0xb, 0x22, 0x3e, 0x34, 0x49, 0x23, 0x4, 0x0, 0x69, 0x30, + 0x0, 0x11, 0xbd, 0x23, 0x22, 0x7e, 0xd3, 0x82, 0xd, 0xa, 0x2d, 0x1a, 0x3e, + 0xad, 0x32, 0x2d, 0x35, 0x69, 0x50, 0x0, 0xd, 0x69, 0x40, 0x0, 0xb, 0x2d, + 0x53, 0x22, 0x2d, 0x31, 0x7a, 0x1b, 0xb0, 0x7c, 0xbe, 0x22, 0x12, 0x43, + 0x4c, 0x7c, 0xbe, 0x7c, 0x7f, 0x22, 0x7c, 0x7f, 0x12, 0x43, 0x4c, 0x7c, + 0xbe, 0x22, 0x69, 0x30, 0x0, 0x2, 0xb, 0xa, 0x20, 0x22, 0x7e, 0xd3, 0x82, + 0xd, 0xa, 0x5d, 0xad, 0x54, 0x1a, 0x3f, 0x22, 0x1a, 0x2, 0x1a, 0x0, 0x7d, + 0x3b, 0x1a, 0x26, 0x1a, 0x24, 0x12, 0x1, 0x52, 0x7f, 0x21, 0x7e, 0xd, 0x10, + 0x22, 0x7e, 0xd, 0x10, 0x29, 0x70, 0x0, 0x6, 0x22, 0xe4, 0x12, 0x47, 0xb5, + 0x12, 0xc9, 0x82, 0x12, 0xc3, 0xae, 0x12, 0x47, 0x8e, 0x12, 0xc5, 0xd4, + 0x12, 0x32, 0x99, 0x12, 0xc6, 0xcb, 0x12, 0xc4, 0xcd, 0x12, 0xc5, 0xcf, + 0x12, 0xc4, 0xd2, 0x12, 0xc4, 0xd9, 0x12, 0xc5, 0x64, 0x12, 0xc5, 0x6e, + 0x12, 0xc5, 0x7e, 0x12, 0x47, 0x73, 0x12, 0x47, 0x99, 0x12, 0xc3, 0x7f, + 0x12, 0x41, 0x51, 0x12, 0x68, 0x96, 0x12, 0xc5, 0x90, 0x12, 0x51, 0xf9, + 0x12, 0xc8, 0x3e, 0xd2, 0xaf, 0x12, 0x47, 0x6a, 0x7e, 0x24, 0x43, 0x31, + 0x12, 0xd5, 0xf8, 0x12, 0x47, 0x6a, 0x7e, 0x24, 0x41, 0x21, 0x12, 0xd6, + 0x2c, 0x2, 0x47, 0x52, 0xa9, 0x27, 0xc1, 0x13, 0x12, 0x47, 0xa8, 0x78, 0xe, + 0x7e, 0x34, 0xf3, 0x1e, 0x12, 0xc6, 0xe, 0x7e, 0x34, 0xf4, 0xc1, 0x2, 0x31, + 0x2b, 0x22, 0x7e, 0xb3, 0x69, 0xe6, 0x7e, 0x73, 0x69, 0xe7, 0x22, 0x12, + 0xd7, 0x55, 0xe4, 0x7e, 0x34, 0x1, 0xf4, 0x2, 0x47, 0x7e, 0x7c, 0xab, 0x74, + 0x2, 0xa4, 0x7e, 0xf, 0x39, 0xf1, 0x2d, 0x15, 0x79, 0x30, 0x0, 0x10, 0x22, + 0xc2, 0x8d, 0xc2, 0x8f, 0x12, 0x68, 0xe7, 0xa9, 0xc0, 0x93, 0x22, 0x12, + 0x47, 0xa8, 0x78, 0x9, 0x7e, 0x34, 0xb4, 0x80, 0x74, 0xa, 0x2, 0x31, 0x2b, + 0x22, 0x7e, 0x1f, 0x39, 0xed, 0x69, 0x31, 0x0, 0x6, 0x5e, 0x34, 0x8, 0x0, + 0x22, 0xd2, 0xcf, 0xa9, 0xc7, 0xcb, 0xbe, 0xb0, 0x8, 0x50, 0x2, 0xf5, 0xcc, + 0x75, 0xe6, 0x0, 0xc2, 0x0, 0x2, 0x47, 0xc9, 0xa9, 0xd5, 0xc3, 0x12, 0xc5, + 0x45, 0xa2, 0x0, 0xa9, 0x97, 0xc1, 0x22, 0x12, 0xda, 0x1e, 0x7e, 0x70, 0x5, + 0xac, 0x78, 0x9, 0x53, 0x9b, 0x63, 0xbe, 0x53, 0x9a, 0xdc, 0x68, 0x8, 0x7e, + 0x53, 0x9a, 0xdc, 0x19, 0x53, 0x9b, 0x63, 0x9, 0x53, 0x9b, 0x64, 0xbe, 0x53, + 0x9a, 0xdd, 0x68, 0x8, 0x7e, 0x53, 0x9a, 0xdd, 0x19, 0x53, 0x9b, 0x64, 0x9, + 0x53, 0x9b, 0x65, 0xbe, 0x53, 0x9a, 0xde, 0x68, 0x8, 0x7e, 0x53, 0x9a, 0xde, + 0x19, 0x53, 0x9b, 0x65, 0x9, 0x53, 0x9b, 0x66, 0xbe, 0x53, 0x9a, 0xdf, 0x68, + 0x8, 0x7e, 0x53, 0x9a, 0xdf, 0x19, 0x53, 0x9b, 0x66, 0x9, 0x53, 0x9b, 0x67, + 0xbe, 0x53, 0x9a, 0xe0, 0x68, 0x8, 0x7e, 0x53, 0x9a, 0xe0, 0x19, 0x53, 0x9b, + 0x67, 0x12, 0x48, 0xa3, 0x12, 0x48, 0x44, 0x7e, 0x24, 0x0, 0x2, 0x2, 0x17, + 0x8f, 0x9, 0xb3, 0x9b, 0x63, 0x9, 0x73, 0x9b, 0x64, 0x12, 0x48, 0xfe, 0x7e, + 0x30, 0x3c, 0xac, 0x39, 0x2e, 0x14, 0x8e, 0x3a, 0x6d, 0x0, 0x74, 0x5, 0xac, + 0xb8, 0x9, 0xb5, 0x9b, 0x65, 0x12, 0x48, 0xaf, 0x7e, 0x30, 0x3c, 0xac, 0x39, + 0x2e, 0x14, 0x8e, 0x3c, 0x6d, 0x0, 0x74, 0x5, 0xac, 0xb8, 0x9, 0xb5, 0x9b, + 0x66, 0x12, 0x48, 0xc7, 0x7e, 0x30, 0x3c, 0xac, 0x39, 0x2e, 0x14, 0x8e, + 0x3c, 0x6d, 0x0, 0x74, 0x5, 0xac, 0xb8, 0x9, 0xb5, 0x9b, 0x67, 0x12, 0x48, + 0xef, 0x74, 0x3, 0x12, 0x14, 0xcb, 0x7e, 0x70, 0xee, 0xac, 0x79, 0x2e, 0x34, + 0x1, 0x0, 0x2e, 0x34, 0x0, 0x9, 0x7e, 0x30, 0x3c, 0xac, 0x39, 0x2e, 0x14, + 0x8e, 0x3a, 0x6d, 0x0, 0x22, 0xb, 0xa, 0x30, 0x5e, 0x60, 0x3f, 0x1b, 0xa, + 0x30, 0x12, 0x4f, 0xdf, 0x2, 0x48, 0xbe, 0xb, 0xa, 0x30, 0x4d, 0x35, 0x1b, + 0xa, 0x30, 0x22, 0xb, 0xa, 0x30, 0x5e, 0x60, 0xcf, 0x1b, 0xa, 0x30, 0x54, + 0x3, 0xa, 0x5b, 0x12, 0x49, 0x61, 0x2, 0x48, 0xbe, 0x12, 0xda, 0x1e, 0x12, + 0x48, 0xa3, 0x7e, 0x70, 0x5, 0xac, 0x78, 0x12, 0x48, 0x44, 0x7e, 0x24, 0x0, + 0x2, 0x2, 0x17, 0x8f, 0xb, 0xa, 0x30, 0x5e, 0x60, 0xf3, 0x1b, 0xa, 0x30, + 0x12, 0x4f, 0xeb, 0x2, 0x16, 0xaf, 0xb, 0xa, 0x20, 0x5e, 0x40, 0xc3, 0x1b, + 0xa, 0x20, 0x54, 0x3, 0xa, 0x5b, 0x12, 0x49, 0x61, 0xb, 0xa, 0x20, 0x4d, + 0x25, 0x1b, 0xa, 0x20, 0x7c, 0xb7, 0x12, 0x4f, 0xeb, 0x2, 0x16, 0xaf, 0x7c, + 0x9b, 0x29, 0x81, 0x0, 0x2, 0xa, 0xe8, 0x7d, 0x5e, 0x7c, 0xab, 0xe4, 0x7d, + 0xe5, 0x29, 0x81, 0x0, 0x3, 0xa, 0x58, 0xc4, 0x54, 0xf0, 0x7c, 0xab, 0xe4, + 0x2d, 0xe5, 0x29, 0x81, 0x0, 0x1, 0xa, 0xf8, 0x3e, 0xf4, 0x3e, 0xf4, 0x3e, + 0xf4, 0x3e, 0xf4, 0x2d, 0xfe, 0x7e, 0x1b, 0x80, 0xa, 0x58, 0x2d, 0x5f, 0x1b, + 0xa, 0x50, 0x29, 0x81, 0x0, 0x4, 0xa, 0x38, 0x79, 0x30, 0x0, 0x2, 0xa, 0x59, + 0xc4, 0x54, 0xf0, 0x7c, 0xab, 0xe4, 0x22, 0x7c, 0x34, 0x7c, 0x25, 0x7c, + 0xa6, 0x7c, 0x17, 0x7c, 0xb, 0x12, 0x4f, 0xd5, 0x5e, 0x80, 0x3, 0x7c, 0xba, + 0x12, 0x4f, 0xdf, 0x4d, 0x45, 0x7c, 0xb0, 0x54, 0x3, 0xa, 0x5b, 0x12, 0x49, + 0x61, 0x4d, 0x45, 0x7c, 0xb1, 0x54, 0x3, 0x7c, 0xb, 0x6c, 0x11, 0x3e, 0x4, + 0x3e, 0x4, 0x4d, 0x40, 0x1b, 0x1a, 0x40, 0x7e, 0x34, 0xa0, 0x14, 0xb, 0x1a, + 0x40, 0x5e, 0x80, 0xc3, 0x7c, 0xb2, 0x54, 0x3, 0xa, 0x5b, 0x12, 0x49, 0x61, + 0x2, 0x49, 0xb1, 0x4d, 0x45, 0x7c, 0xb3, 0x54, 0x3, 0xa, 0x5b, 0x7c, 0xab, + 0xe4, 0x3e, 0x54, 0x3e, 0x54, 0x4d, 0x45, 0x1b, 0x1a, 0x40, 0x22, 0x7e, + 0xb3, 0x9b, 0xa8, 0x7e, 0x70, 0x2, 0x7e, 0x60, 0x2, 0x7c, 0x36, 0x7c, 0xb7, + 0x12, 0x4f, 0xd5, 0x5e, 0x80, 0xc3, 0x54, 0x3, 0xa, 0x5b, 0x12, 0x49, 0x61, + 0x2, 0x49, 0xb1, 0x7e, 0xb3, 0x9a, 0x7b, 0xb4, 0x1, 0x2, 0x80, 0x2, 0x41, + 0x82, 0x7e, 0x73, 0x9a, 0x78, 0xbe, 0x73, 0x9a, 0x7a, 0x28, 0x6c, 0x7e, + 0x63, 0x9a, 0x7a, 0x7e, 0x70, 0x9, 0xac, 0x67, 0x49, 0x53, 0x9a, 0x86, 0x7c, + 0xab, 0x7e, 0x43, 0x9a, 0x83, 0x7e, 0x50, 0x2, 0xac, 0x45, 0x2d, 0x32, 0x49, + 0x33, 0x9a, 0x88, 0x7a, 0x35, 0x16, 0x4d, 0x33, 0x68, 0x47, 0xd2, 0x34, + 0x1b, 0xa0, 0x68, 0x10, 0x1b, 0xa0, 0x68, 0xc, 0x1b, 0xa0, 0x68, 0x1a, 0x1b, + 0xa0, 0x68, 0x4, 0xb, 0xa2, 0x78, 0x31, 0xe4, 0x12, 0x4a, 0x83, 0x30, 0xf, + 0x4, 0x74, 0x2, 0x80, 0x2, 0x74, 0x1, 0x12, 0x4f, 0x59, 0x80, 0x1f, 0x74, + 0x1, 0x12, 0x4a, 0x83, 0x30, 0xf, 0x4, 0x74, 0x2, 0x80, 0x2, 0x74, 0x1, + 0x12, 0x4f, 0x59, 0x74, 0x3, 0x7e, 0x70, 0x3, 0x6c, 0x66, 0x6c, 0x55, 0x6c, + 0x44, 0x12, 0x49, 0x68, 0x12, 0xcc, 0x7, 0x38, 0x18, 0x74, 0x2, 0x7a, 0xb3, + 0x9a, 0x7b, 0x7e, 0xb3, 0x9b, 0xaf, 0x70, 0xc, 0x12, 0x49, 0xc6, 0x12, 0x1c, + 0xb5, 0x5e, 0x70, 0xef, 0x1b, 0xa, 0x30, 0x22, 0xca, 0x3b, 0x7c, 0xcb, 0x7e, + 0x35, 0x16, 0x6d, 0x22, 0x7f, 0x41, 0x7e, 0xd3, 0x9a, 0x83, 0x4c, 0xcc, + 0x68, 0x4, 0x7e, 0x48, 0x18, 0x80, 0x20, 0x34, 0x2, 0x61, 0xd4, 0xa9, 0xd7, + 0xea, 0x7e, 0x77, 0x8d, 0x94, 0x7e, 0xa4, 0x0, 0x9, 0x7e, 0xb3, 0x69, 0xec, + 0x60, 0x3d, 0x4c, 0xcc, 0x78, 0xc, 0x6d, 0xbb, 0x7d, 0x1b, 0x12, 0x4b, 0xe8, + 0x12, 0x4b, 0xd7, 0x78, 0xf6, 0x6d, 0xbb, 0x80, 0x21, 0x12, 0x4f, 0xcc, + 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7e, 0x73, 0x82, 0x11, 0x12, 0x4f, + 0x52, 0x68, 0x5, 0x12, 0x4c, 0x17, 0x80, 0x7, 0x6d, 0x11, 0x12, 0x4c, 0x26, + 0xb, 0xa4, 0xb, 0xb4, 0xbe, 0xb4, 0x0, 0x0, 0x40, 0xd9, 0x80, 0x3c, 0x4c, + 0xcc, 0x78, 0x12, 0x6d, 0xbb, 0x7d, 0x1b, 0x12, 0x4b, 0xe8, 0x2d, 0x21, + 0x59, 0x32, 0x8e, 0x0, 0x12, 0x4b, 0xdd, 0x78, 0xf0, 0x6d, 0xbb, 0x12, 0x4f, + 0xcc, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7e, 0x73, 0x82, 0x10, 0x12, + 0x4f, 0x52, 0x68, 0x5, 0x12, 0x4c, 0x17, 0x80, 0x7, 0x6d, 0x11, 0x12, 0x4c, + 0x26, 0xb, 0xa4, 0x12, 0x4c, 0x34, 0x78, 0xdc, 0x7f, 0x4, 0x2e, 0x14, 0x0, + 0x0, 0x7d, 0x5a, 0x3e, 0x54, 0x7e, 0x1f, 0x8f, 0x18, 0x2d, 0x35, 0x12, 0xaf, + 0x13, 0x7e, 0x37, 0x8d, 0x94, 0x2d, 0xa3, 0x7e, 0xb3, 0x69, 0xec, 0x60, + 0x45, 0x6d, 0x33, 0x7d, 0xb3, 0x12, 0x4f, 0x45, 0x60, 0x5, 0x3e, 0x14, 0x14, + 0x78, 0xfb, 0x7e, 0x53, 0x82, 0x10, 0x6c, 0x44, 0x5c, 0x53, 0x4d, 0x22, + 0x68, 0x5, 0x12, 0x4b, 0xfa, 0x80, 0x7, 0x6d, 0x22, 0x12, 0x4c, 0x9, 0xb, + 0xa4, 0x12, 0x4c, 0x34, 0x78, 0xd9, 0x4c, 0xcc, 0x78, 0x58, 0x7d, 0xb3, + 0x12, 0x4b, 0xe4, 0x7d, 0x1b, 0x3e, 0x14, 0x2d, 0x21, 0x59, 0x32, 0x8e, 0x0, + 0x12, 0x4b, 0xdd, 0x78, 0xee, 0x80, 0x42, 0x6d, 0x33, 0x7d, 0xb3, 0x80, + 0x24, 0x12, 0x4f, 0x45, 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x7e, 0x53, + 0x82, 0x11, 0x6c, 0x44, 0x5c, 0x53, 0x4d, 0x22, 0x68, 0x5, 0x12, 0x4b, 0xfa, + 0x80, 0x7, 0x6d, 0x22, 0x12, 0x4c, 0x9, 0xb, 0xa4, 0xb, 0xb4, 0xbe, 0xb4, + 0x0, 0x0, 0x40, 0xd6, 0x4c, 0xcc, 0x78, 0xe, 0x7d, 0xb3, 0x12, 0x4b, 0xe4, + 0x7d, 0x1b, 0x3e, 0x14, 0x12, 0x4b, 0xd7, 0x78, 0xf4, 0xa9, 0xc7, 0xea, + 0xc2, 0x34, 0xda, 0x3b, 0x22, 0x2d, 0x21, 0x59, 0x32, 0x8e, 0xa, 0xb, 0xb4, + 0xbe, 0xb4, 0x0, 0x5, 0x22, 0x7d, 0x1b, 0x2d, 0x1a, 0x3e, 0x14, 0x7e, 0x1f, + 0x8f, 0x18, 0x2d, 0x31, 0x69, 0x31, 0x0, 0x6, 0x7e, 0x50, 0x14, 0xac, 0x5d, + 0x22, 0x7d, 0x2a, 0xb, 0xa4, 0x3e, 0x24, 0x7e, 0xf, 0x8f, 0x18, 0x2d, 0x12, + 0xb, 0xa, 0x20, 0x7d, 0x17, 0xb, 0x74, 0x3e, 0x14, 0x2d, 0x19, 0x7d, 0x8, + 0x1b, 0xa, 0x20, 0x22, 0x7d, 0x1a, 0xb, 0xa4, 0x3e, 0x14, 0x7e, 0x1f, 0x8f, + 0x18, 0x2d, 0x31, 0xb, 0x1a, 0x10, 0x7d, 0x7, 0xb, 0x74, 0x3e, 0x4, 0x7f, + 0x14, 0x2d, 0x30, 0x1b, 0x1a, 0x10, 0x22, 0xb, 0xb4, 0xbe, 0xb4, 0x0, 0x4, + 0x22, 0xca, 0x79, 0x7e, 0x97, 0x82, 0x35, 0x7a, 0x97, 0x92, 0x0, 0x7e, 0xf3, + 0x82, 0xd, 0x6d, 0xaa, 0x74, 0x4, 0xac, 0xbf, 0x7a, 0x57, 0x92, 0x2, 0x7d, + 0x85, 0x2e, 0x87, 0x92, 0x0, 0x7a, 0x87, 0x92, 0x4, 0x7e, 0x1f, 0x39, 0xed, + 0x69, 0x81, 0x0, 0x18, 0x7a, 0x87, 0x91, 0xfe, 0x7e, 0xe3, 0x82, 0xa, 0x12, + 0xda, 0x17, 0x6d, 0x88, 0xa1, 0x9b, 0x7e, 0x8, 0x92, 0x6, 0x12, 0x74, 0xb3, + 0x12, 0x61, 0x91, 0x6d, 0xbb, 0xa, 0x3f, 0xad, 0x3b, 0x2d, 0x3a, 0x12, 0x4e, + 0x2, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3f, 0x12, 0x4e, 0x2e, + 0x12, 0x4e, 0x13, 0xbe, 0xb4, 0x0, 0x4, 0x78, 0xe2, 0x6d, 0xbb, 0xa, 0x3f, + 0xad, 0x3b, 0x2e, 0x37, 0x92, 0x2, 0x12, 0x4e, 0x2, 0x60, 0x5, 0x3e, 0x24, + 0x14, 0x78, 0xfb, 0x7d, 0x3f, 0x12, 0x4e, 0x2e, 0x12, 0x4e, 0x13, 0xbe, + 0xb4, 0x0, 0x5, 0x78, 0xe0, 0x6d, 0xbb, 0xa, 0x3f, 0xad, 0x3b, 0x2d, 0x39, + 0x12, 0x4e, 0x2, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3f, 0x12, + 0x4e, 0x2e, 0x3e, 0x34, 0x2e, 0x34, 0x92, 0x34, 0x12, 0x4e, 0x19, 0xbe, + 0xb4, 0x0, 0x4, 0x78, 0xdc, 0x6d, 0xbb, 0xa, 0x3f, 0xad, 0x3b, 0x2e, 0x37, + 0x92, 0x4, 0x12, 0x4e, 0x2, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, + 0x3f, 0x12, 0x4e, 0x2e, 0x3e, 0x34, 0x2e, 0x34, 0x92, 0x34, 0x12, 0x4e, + 0x19, 0xbe, 0xb4, 0x0, 0x5, 0x78, 0xda, 0x12, 0xd8, 0xe0, 0x7e, 0x8, 0x92, + 0x6, 0x12, 0x17, 0x8b, 0x12, 0xd8, 0xe0, 0x7e, 0x8, 0x92, 0x34, 0x12, 0x17, + 0x2a, 0x12, 0x53, 0xca, 0x30, 0xf, 0xf, 0x7e, 0x8, 0x3a, 0x0, 0x7e, 0x34, + 0x5, 0x20, 0x74, 0xff, 0x12, 0x0, 0x2e, 0x80, 0x6c, 0xa9, 0xd7, 0xea, 0x6d, + 0xbb, 0xa, 0x3f, 0xad, 0x3b, 0x7d, 0x23, 0x2d, 0x2a, 0x12, 0xd8, 0x27, 0x2d, + 0xa, 0x12, 0xd8, 0xce, 0x2d, 0x29, 0x3e, 0x24, 0x59, 0x32, 0x3a, 0x0, 0x12, + 0x4c, 0x34, 0x78, 0xe3, 0x6d, 0xbb, 0xa, 0x3f, 0xad, 0x3b, 0x7d, 0x23, 0x2e, + 0x27, 0x92, 0x2, 0x12, 0xd8, 0x27, 0x2e, 0x7, 0x92, 0x2, 0x12, 0xd8, 0xce, + 0x2e, 0x27, 0x92, 0x4, 0x3e, 0x24, 0x59, 0x32, 0x3a, 0x0, 0x12, 0x4b, 0xdd, + 0x78, 0xdd, 0xa9, 0xc7, 0xea, 0xb, 0xa4, 0x7e, 0x37, 0x92, 0x2, 0xb, 0x34, + 0x7a, 0x37, 0x92, 0x2, 0xb, 0x94, 0x7e, 0x37, 0x92, 0x4, 0xb, 0x34, 0x7a, + 0x37, 0x92, 0x4, 0xb, 0x84, 0xa, 0x3f, 0xbd, 0x38, 0x28, 0x2, 0x81, 0x74, + 0x7e, 0xb3, 0x69, 0xec, 0x60, 0x56, 0x6d, 0x88, 0x7d, 0xa8, 0xa, 0x2e, 0x1b, + 0x24, 0xa, 0x3f, 0xad, 0x32, 0x7d, 0x93, 0x2e, 0x97, 0x92, 0x0, 0x80, 0x3c, + 0x6d, 0xbb, 0x80, 0x2c, 0xa, 0x5f, 0xad, 0x5b, 0x7d, 0x15, 0x2d, 0x1a, 0x3e, + 0x14, 0x49, 0x31, 0x3a, 0x0, 0x7d, 0x29, 0x9d, 0x25, 0x3e, 0x24, 0x49, 0x22, + 0x3a, 0x0, 0x59, 0x21, 0x3a, 0x0, 0xa, 0x5f, 0xad, 0x5b, 0x7d, 0x19, 0x9d, + 0x15, 0x3e, 0x14, 0x59, 0x31, 0x3a, 0x0, 0xb, 0xb4, 0xa, 0x1e, 0xbd, 0x1b, + 0x38, 0xce, 0xb, 0xa4, 0xb, 0x94, 0xb, 0x84, 0xa, 0x3f, 0xbd, 0x38, 0x38, + 0xbe, 0xda, 0x79, 0x22, 0x3e, 0x34, 0x49, 0xf3, 0x6f, 0xcb, 0x7d, 0x5f, + 0x5e, 0x54, 0x0, 0xf, 0x7e, 0x24, 0x0, 0x1, 0x22, 0x3e, 0x34, 0x2e, 0x34, + 0x92, 0x6, 0xb, 0x38, 0xe0, 0x4d, 0xe2, 0x1b, 0x38, 0xe0, 0xb, 0xb4, 0x22, + 0x7a, 0x37, 0x81, 0xfb, 0x7e, 0x37, 0x81, 0xed, 0x1e, 0x34, 0x1e, 0x34, + 0x1e, 0x34, 0x1e, 0x34, 0x1e, 0x34, 0x22, 0x7e, 0x37, 0x75, 0x96, 0x12, + 0x4e, 0x2c, 0x7a, 0x73, 0x59, 0x3b, 0x7e, 0x37, 0x75, 0x98, 0x12, 0x4f, + 0x23, 0x7a, 0x73, 0x59, 0x3c, 0x7e, 0x37, 0x75, 0x9e, 0x12, 0x4e, 0x2c, + 0x7a, 0x73, 0x59, 0x3d, 0x7e, 0x37, 0x75, 0xa0, 0x12, 0x4f, 0x23, 0x7a, + 0x73, 0x59, 0x3e, 0xe4, 0x7a, 0xb3, 0x59, 0x3f, 0x7e, 0x37, 0x75, 0xa8, + 0x12, 0x4e, 0x2c, 0x7a, 0x73, 0x59, 0x40, 0x7e, 0x34, 0x0, 0x6a, 0xca, 0x39, + 0x7e, 0x18, 0x75, 0xac, 0x7e, 0x8, 0x59, 0x41, 0x12, 0x0, 0x6e, 0x1b, 0xfd, + 0x7e, 0x73, 0x67, 0x74, 0x7a, 0x73, 0x59, 0x48, 0x7e, 0x73, 0x67, 0x74, + 0x7a, 0x73, 0x59, 0x49, 0x22, 0x7e, 0xb3, 0x59, 0x8b, 0x60, 0xa, 0x12, 0x4f, + 0x2e, 0xe4, 0x7a, 0xb3, 0x39, 0xfe, 0x80, 0x20, 0x12, 0xbe, 0x95, 0x12, + 0x72, 0x17, 0x7e, 0xb3, 0x82, 0x9, 0x70, 0x14, 0x7e, 0xb3, 0x39, 0xfe, 0x70, + 0xe, 0x7e, 0xb3, 0x69, 0x6a, 0x70, 0x8, 0x7e, 0x37, 0x75, 0xaa, 0x7a, 0x37, + 0x81, 0xed, 0x7e, 0xb3, 0x59, 0x46, 0x60, 0x41, 0x7e, 0x27, 0x81, 0xed, + 0x7e, 0x34, 0x0, 0xa, 0xad, 0x32, 0x12, 0x4e, 0x30, 0x7a, 0x37, 0x81, 0xed, + 0x7e, 0x17, 0x81, 0xef, 0x7e, 0x24, 0x0, 0xa, 0xad, 0x12, 0x7d, 0x31, 0x12, + 0x4f, 0x27, 0x7a, 0x37, 0x81, 0xef, 0x7e, 0x37, 0x81, 0xf9, 0xad, 0x32, + 0x12, 0x4f, 0x27, 0x7a, 0x37, 0x81, 0xf9, 0x6d, 0x33, 0x9e, 0x37, 0x81, + 0xf9, 0x12, 0x4e, 0x24, 0x12, 0x4f, 0x1b, 0x7a, 0x73, 0x59, 0x3c, 0x7e, + 0xb3, 0x59, 0x3f, 0xbe, 0xb0, 0xaa, 0x68, 0x3, 0x12, 0x72, 0x31, 0x22, 0x7a, + 0x73, 0x59, 0x3b, 0x7e, 0x37, 0x81, 0xef, 0xe, 0x34, 0xe, 0x34, 0xe, 0x34, + 0xe, 0x34, 0xe, 0x34, 0x22, 0x12, 0x72, 0xe, 0x12, 0x72, 0x5, 0x12, 0x71, + 0xfc, 0x12, 0x72, 0x22, 0x12, 0x4e, 0x24, 0x12, 0x4f, 0x1b, 0x7a, 0x73, + 0x59, 0x3c, 0x22, 0x7d, 0x2b, 0x7c, 0xb5, 0x7e, 0x14, 0x0, 0x1, 0x22, 0x7e, + 0x73, 0x8d, 0x93, 0x6c, 0x66, 0x5c, 0x75, 0x4d, 0x33, 0x22, 0x7e, 0xa3, + 0x9a, 0x83, 0xa, 0x3a, 0x19, 0xb3, 0x9a, 0x7c, 0xa2, 0xac, 0x92, 0xa, 0x7e, + 0xf, 0x39, 0xed, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x10, 0x0, 0x68, 0x8, 0x7e, + 0x34, 0x10, 0x0, 0x79, 0x30, 0x0, 0x2, 0xc2, 0xac, 0x12, 0xd8, 0x3e, 0xa2, + 0xa, 0x92, 0xac, 0x22, 0x30, 0x1a, 0x42, 0x30, 0x1b, 0x11, 0x12, 0xd9, 0xf3, + 0x68, 0x9, 0x12, 0x57, 0x4d, 0x7e, 0xb3, 0x3, 0xd4, 0x70, 0xfa, 0x12, 0x32, + 0xc0, 0x7e, 0xb3, 0x9b, 0xaf, 0xb4, 0x2, 0x27, 0x7e, 0xb3, 0x9b, 0xa8, 0x7e, + 0x24, 0x0, 0x1, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7e, 0x73, 0x8d, + 0x92, 0x12, 0x4f, 0x52, 0x78, 0x5, 0x12, 0x4f, 0x4e, 0x68, 0x7, 0x74, 0x1, + 0x7a, 0xb3, 0x9a, 0x7c, 0x22, 0x2, 0x32, 0xc0, 0x22, 0x7d, 0x3b, 0x7c, 0xb7, + 0x7e, 0x24, 0x0, 0x1, 0x22, 0x7e, 0x34, 0xa0, 0x12, 0x6d, 0x22, 0xb, 0x1a, + 0x40, 0x22, 0x54, 0x3, 0xa, 0x5b, 0x3, 0x3, 0x54, 0xc0, 0x7c, 0xab, 0xe4, + 0x22, 0x54, 0x3, 0xa, 0x3b, 0x7d, 0x23, 0x7c, 0x45, 0x6c, 0x55, 0x3e, 0x24, + 0x3e, 0x24, 0x22, 0x7e, 0xb3, 0x9b, 0xaf, 0x70, 0xe, 0x74, 0x14, 0x7a, 0xb3, + 0x38, 0x78, 0x74, 0x13, 0x7a, 0xb3, 0x37, 0xd3, 0x80, 0x10, 0x7e, 0x73, + 0x37, 0xde, 0x7a, 0x73, 0x38, 0x78, 0xa, 0x37, 0x1b, 0x34, 0x7a, 0x73, 0x37, + 0xd3, 0xe4, 0x7a, 0xb3, 0x37, 0xd5, 0x22, 0x7e, 0xb3, 0x69, 0xec, 0x60, 0xa, + 0x7e, 0xa7, 0x82, 0x37, 0x7e, 0xb7, 0x82, 0x35, 0x80, 0x3, 0x12, 0x50, 0x6f, + 0xe4, 0x12, 0x14, 0xcb, 0x12, 0x50, 0x66, 0x12, 0x50, 0x78, 0x7e, 0x8, 0x6f, + 0xcb, 0x12, 0x50, 0x84, 0x2e, 0x14, 0x6f, 0xcb, 0x12, 0x50, 0x54, 0x6d, + 0x22, 0x2, 0x17, 0x2a, 0x6d, 0x0, 0x7d, 0x2b, 0x12, 0x17, 0x2a, 0x7d, 0x3b, + 0x2e, 0x34, 0x1, 0x0, 0x7e, 0x8, 0x82, 0x41, 0x22, 0x7e, 0x34, 0x1, 0x0, + 0x7e, 0x8, 0x82, 0x41, 0x22, 0x7e, 0xa7, 0x82, 0x35, 0x7e, 0xb7, 0x82, 0x37, + 0x22, 0x7e, 0x24, 0x0, 0x4, 0x12, 0x17, 0x8f, 0x7e, 0x34, 0x1, 0x4, 0x22, + 0x7d, 0x2a, 0x12, 0x17, 0x8f, 0x7e, 0x34, 0x1, 0x0, 0x7d, 0x1a, 0x3e, 0x14, + 0x22, 0x7c, 0x7b, 0x7e, 0xa0, 0xff, 0x7c, 0xb7, 0x24, 0x8c, 0x68, 0x24, + 0x24, 0xfb, 0x68, 0x30, 0x14, 0x68, 0x4c, 0x14, 0x68, 0x3a, 0x14, 0x68, + 0x4b, 0x14, 0x68, 0x48, 0x24, 0x7, 0x78, 0x70, 0x7e, 0x1f, 0x39, 0xed, 0x69, + 0x51, 0x0, 0xe, 0x5e, 0x54, 0x0, 0x4, 0x7c, 0xab, 0x80, 0x60, 0x7e, 0x1f, + 0x39, 0xed, 0x69, 0x51, 0x0, 0x6, 0x5e, 0x54, 0x0, 0x1, 0x7c, 0xab, 0x80, + 0x50, 0x7e, 0x1f, 0x39, 0xed, 0x69, 0x31, 0x0, 0x6, 0x5e, 0x34, 0x4, 0x0, + 0xa, 0x56, 0x80, 0x7, 0x12, 0x47, 0xa8, 0xa, 0x56, 0x1e, 0x54, 0x1e, 0x54, + 0x1e, 0x54, 0x7c, 0xab, 0x80, 0x31, 0x7e, 0xa1, 0xef, 0x80, 0x2c, 0x7e, + 0x63, 0x9b, 0x7c, 0x7c, 0xb6, 0x4, 0x7a, 0xb3, 0x9b, 0x7c, 0xa, 0x26, 0x9, + 0xa2, 0x9b, 0x88, 0x7e, 0xb3, 0x9a, 0xe2, 0x4, 0x7a, 0xb3, 0x9a, 0xe2, 0x70, + 0x9, 0x7e, 0xb3, 0x9a, 0xe1, 0x4, 0x7a, 0xb3, 0x9a, 0xe1, 0xa5, 0xbf, 0x7d, + 0x3, 0x75, 0xf, 0x7c, 0x7c, 0xba, 0x22, 0x24, 0x8a, 0x78, 0x19, 0x7e, 0xf, + 0x39, 0xed, 0xa5, 0xbf, 0x0, 0x8, 0x12, 0x1c, 0xb9, 0x5e, 0x70, 0xfb, 0x80, + 0x6, 0x12, 0x1c, 0xb9, 0x4e, 0x70, 0x4, 0x1b, 0xa, 0x30, 0x22, 0xca, 0x79, + 0x7e, 0x73, 0x82, 0xd, 0x7e, 0xf3, 0x82, 0xc, 0xac, 0xf7, 0xd2, 0x4, 0x12, + 0xb, 0xc5, 0x12, 0x70, 0xf5, 0x12, 0x4f, 0xfa, 0xc2, 0x0, 0x12, 0xd, 0x27, + 0xd2, 0xac, 0xc2, 0xa8, 0x74, 0x1, 0x7a, 0xb3, 0x38, 0x83, 0x12, 0xda, 0x5d, + 0x12, 0x4c, 0x3b, 0xd2, 0x0, 0x12, 0xd, 0x27, 0x7e, 0xb3, 0x9a, 0xcb, 0xb4, + 0x1, 0x45, 0x20, 0xf, 0x42, 0x6d, 0xff, 0x80, 0x3a, 0x7d, 0xbf, 0x3e, 0xb4, + 0x49, 0xeb, 0x3a, 0x0, 0x7d, 0x3e, 0x1a, 0x26, 0x1a, 0x24, 0x7e, 0x14, 0x0, + 0x46, 0x12, 0x1, 0x63, 0x7e, 0x8, 0x0, 0x44, 0x12, 0x1, 0xbf, 0x7f, 0x61, + 0x9e, 0x68, 0x0, 0x78, 0xbe, 0xe4, 0x0, 0x1e, 0x8, 0xa, 0xbe, 0x68, 0x0, + 0x32, 0x18, 0x4, 0x7e, 0x68, 0x0, 0x32, 0x7d, 0xed, 0x59, 0xeb, 0x3a, 0x0, + 0xb, 0xf4, 0xbd, 0x7f, 0x38, 0xc2, 0x12, 0x51, 0xcf, 0x12, 0x28, 0x41, 0x7e, + 0x34, 0x0, 0xc8, 0x12, 0x26, 0x98, 0xda, 0x79, 0x22, 0x12, 0xdb, 0x7, 0x74, + 0xaa, 0x7a, 0xb3, 0x9a, 0xcc, 0xe4, 0x7a, 0xb3, 0x9a, 0xcb, 0x7a, 0xb3, + 0x38, 0x83, 0xc2, 0x1d, 0x7e, 0xb3, 0x9b, 0xaf, 0xb4, 0x1, 0x3, 0x12, 0x51, + 0xf2, 0xd2, 0xac, 0xd2, 0xa8, 0x22, 0xa9, 0xd0, 0x9e, 0xa9, 0xd7, 0x9e, + 0x22, 0xd2, 0x0, 0x12, 0x52, 0x23, 0xa9, 0xd0, 0xcb, 0x75, 0x9f, 0x0, 0xa9, + 0xd0, 0x9e, 0xa9, 0xd4, 0x9e, 0x7e, 0x37, 0x9b, 0xac, 0xa, 0x56, 0xf5, 0x9d, + 0x7d, 0x53, 0xf5, 0x9c, 0xa9, 0xd3, 0x9e, 0xc2, 0x8a, 0xd2, 0xaa, 0xa9, + 0xc1, 0x9e, 0x2, 0x51, 0xf2, 0xa9, 0xd0, 0xce, 0x30, 0x0, 0x4, 0xa9, 0xd5, + 0xc9, 0x22, 0xa9, 0xc5, 0xc9, 0x22, 0x12, 0x52, 0x54, 0x12, 0xcc, 0x91, + 0x12, 0x1c, 0x87, 0xc2, 0x1, 0x12, 0x3f, 0xcb, 0x12, 0x55, 0xbd, 0x12, 0x52, + 0x23, 0x74, 0x1, 0x6c, 0x77, 0x12, 0x52, 0x7c, 0xd2, 0x0, 0x12, 0x52, 0x23, + 0x2, 0x1c, 0xc1, 0x74, 0x81, 0x7a, 0xb3, 0x9b, 0x7d, 0x22, 0x80, 0xb, 0x12, + 0x52, 0x54, 0x12, 0x53, 0x8b, 0x40, 0x16, 0x20, 0x12, 0x13, 0x12, 0x0, 0x46, + 0x70, 0xf0, 0x12, 0x52, 0x54, 0x12, 0x55, 0xb6, 0x74, 0x2, 0x7e, 0x70, 0x17, + 0x2, 0x52, 0x7c, 0x22, 0x7c, 0x6b, 0x7e, 0xb3, 0x9b, 0x7d, 0xb4, 0x81, 0x45, + 0xa5, 0xbe, 0x0, 0x2, 0x80, 0x39, 0xa5, 0xbe, 0x1, 0x1c, 0xc2, 0xaf, 0xa, + 0x27, 0x5e, 0x24, 0x0, 0x2, 0x68, 0x2, 0xd2, 0x95, 0x7a, 0x71, 0xcd, 0xa9, + 0xd0, 0xce, 0xa9, 0xc6, 0xc9, 0xa9, 0xd1, 0x87, 0xd2, 0xaf, 0x80, 0x19, + 0xa5, 0xbe, 0x2, 0x1b, 0xc2, 0xaf, 0x12, 0x0, 0x46, 0x70, 0xc, 0x7a, 0x71, + 0xcd, 0xa9, 0xd0, 0xce, 0xa9, 0xd6, 0xc9, 0xa9, 0xd1, 0x87, 0xd2, 0xaf, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4, 0x7a, 0xb3, 0x9b, 0x7d, 0x22, 0x12, 0x0, + 0x46, 0x70, 0x2e, 0x12, 0x52, 0x54, 0x7e, 0xb3, 0x9b, 0xab, 0xb4, 0x1, 0xd, + 0x7e, 0x34, 0xf, 0xa0, 0x7a, 0x37, 0x3, 0xd8, 0xe4, 0x7a, 0xb3, 0x9b, 0xab, + 0x7e, 0x37, 0x3, 0xd8, 0x4d, 0x33, 0x78, 0x4, 0x74, 0x1, 0x80, 0x5, 0x12, + 0x55, 0xb6, 0x74, 0x2, 0x7e, 0x70, 0x3, 0x2, 0x52, 0x7c, 0x22, 0x24, 0x52, + 0x68, 0xb, 0x4, 0x78, 0x2a, 0x12, 0xda, 0x56, 0x7a, 0x37, 0x38, 0x90, 0x22, + 0x7e, 0x63, 0x82, 0xc, 0x7e, 0x73, 0x82, 0xd, 0xac, 0x76, 0x3e, 0x34, 0x7a, + 0x37, 0x37, 0xda, 0x1e, 0x34, 0xa, 0x36, 0x7a, 0x73, 0x9a, 0xd8, 0x7e, 0x37, + 0x37, 0xda, 0x1e, 0x34, 0x7a, 0x73, 0x9a, 0xd9, 0x22, 0x12, 0x53, 0xac, + 0x12, 0x53, 0x8e, 0x40, 0x6, 0x12, 0x53, 0x7d, 0x12, 0x0, 0x22, 0x12, 0x55, + 0xbd, 0x12, 0x54, 0x64, 0x80, 0x16, 0x7e, 0xb3, 0x59, 0x8b, 0x60, 0xd, 0x7e, + 0xb3, 0x9b, 0x83, 0x70, 0x7, 0x12, 0x52, 0xd0, 0x80, 0x5, 0x80, 0x0, 0x12, + 0x52, 0x5b, 0x30, 0x12, 0xe7, 0x7e, 0xb3, 0x9b, 0x83, 0xbe, 0xb0, 0x0, 0x28, + 0x5, 0x14, 0x7a, 0xb3, 0x9b, 0x83, 0xd2, 0x0, 0x12, 0x54, 0x64, 0xd2, 0x8, + 0x2, 0x15, 0x16, 0x12, 0x53, 0xac, 0x80, 0x3, 0x12, 0x52, 0x5b, 0x12, 0x53, + 0x8e, 0x50, 0xf8, 0x22, 0x12, 0x53, 0xac, 0x12, 0xdb, 0xb7, 0x40, 0x3, 0x12, + 0x53, 0xf1, 0x30, 0xb, 0x3, 0x12, 0x53, 0xf1, 0x7e, 0xb3, 0x9a, 0x7c, 0x70, + 0x6, 0x7e, 0xb3, 0x9a, 0x7d, 0x60, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0xe4, 0x7a, + 0xb3, 0x9b, 0xb1, 0x22, 0x20, 0x12, 0x6, 0x12, 0x55, 0xce, 0x12, 0x0, 0x22, + 0x12, 0x4f, 0x86, 0x12, 0x53, 0x8b, 0x40, 0x6, 0x12, 0x53, 0x7d, 0x2, 0x0, + 0x22, 0x22, 0x7e, 0xb3, 0x9b, 0xaf, 0x70, 0x2, 0x80, 0xe, 0xb4, 0x1, 0xb, + 0x7e, 0xb3, 0x9b, 0x7f, 0xb4, 0x1, 0x4, 0xd2, 0x1d, 0x80, 0x3, 0x12, 0x1f, + 0xf6, 0x7e, 0xb3, 0x38, 0x83, 0xb4, 0x2, 0xf9, 0x74, 0x1, 0x7a, 0xb3, 0x38, + 0x83, 0x22, 0x30, 0x2e, 0x6, 0x12, 0xc4, 0x2f, 0x2, 0xc4, 0x48, 0x22, 0x12, + 0x54, 0x79, 0x7e, 0xb3, 0x9b, 0xaf, 0x70, 0x5, 0x12, 0x53, 0x36, 0x80, 0x3, + 0x12, 0x53, 0xb2, 0x2, 0x54, 0xf, 0x7e, 0xa0, 0x3b, 0x7e, 0xb3, 0x59, 0x60, + 0xb4, 0x1, 0xf, 0x7e, 0xb3, 0x9b, 0xaf, 0x60, 0x9, 0x7e, 0xb3, 0x3, 0xda, + 0x70, 0x3, 0x12, 0x55, 0x94, 0x7e, 0xb3, 0x59, 0x60, 0xb4, 0x1, 0x34, 0x7e, + 0xb3, 0x9b, 0xaf, 0x60, 0x26, 0x7e, 0x73, 0x3, 0xda, 0xbc, 0x7a, 0x78, 0x3, + 0x12, 0x55, 0x5c, 0x7e, 0xb3, 0x3, 0xda, 0x7a, 0xb3, 0x3, 0xd5, 0x4, 0x7a, + 0xb3, 0x3, 0xda, 0x7e, 0x73, 0x3, 0xda, 0xbe, 0x70, 0x3c, 0x28, 0x5, 0xe4, + 0x7a, 0xb3, 0x3, 0xda, 0x12, 0xb3, 0x48, 0x68, 0x3, 0x2, 0x55, 0x4f, 0x22, + 0xa2, 0x0, 0xa9, 0x95, 0xcb, 0xa2, 0x0, 0xa9, 0x92, 0xcb, 0xa2, 0x0, 0xa9, + 0x92, 0xca, 0xa2, 0x0, 0xa9, 0x91, 0xcb, 0x22, 0x30, 0x21, 0x24, 0xc2, 0x21, + 0x7e, 0x73, 0x59, 0x39, 0x7a, 0x73, 0x59, 0x60, 0x74, 0xff, 0x7a, 0xb3, + 0x59, 0x39, 0x7e, 0xa3, 0x59, 0x60, 0x4c, 0xaa, 0x78, 0x5, 0x12, 0x55, 0x4f, + 0x80, 0x7, 0xbe, 0xa0, 0x1, 0x78, 0x2, 0xd2, 0x19, 0x30, 0x19, 0x3, 0x12, + 0x55, 0x6d, 0x7e, 0x37, 0x9a, 0x21, 0xbe, 0x34, 0x0, 0x78, 0x28, 0x3, 0x12, + 0x55, 0x66, 0x7e, 0xb3, 0x59, 0x60, 0x14, 0x68, 0x58, 0x1b, 0xb1, 0x68, + 0x6f, 0x24, 0x3, 0x68, 0x2, 0xa1, 0x4b, 0x12, 0x55, 0xae, 0x38, 0xa, 0x12, + 0x55, 0xa6, 0x68, 0x5, 0x12, 0x55, 0x9e, 0x28, 0x15, 0x12, 0x36, 0xbf, 0x7e, + 0xb3, 0x59, 0x41, 0x30, 0xe0, 0x71, 0x7e, 0xb3, 0x59, 0x8b, 0x60, 0x6b, + 0x30, 0x10, 0x68, 0x80, 0x27, 0x7e, 0xb3, 0x59, 0x41, 0x30, 0xe0, 0x5f, + 0x7e, 0x37, 0x3, 0xd6, 0x7e, 0x24, 0x3, 0xe8, 0x8d, 0x32, 0x7e, 0x53, 0x59, + 0x42, 0xa, 0x25, 0xbd, 0x32, 0x50, 0xc, 0x7e, 0xb3, 0x59, 0x8b, 0x60, 0x45, + 0xbe, 0x34, 0x0, 0x1, 0x40, 0x3f, 0x2, 0x55, 0x6d, 0x12, 0x55, 0xae, 0x38, + 0x10, 0x7e, 0xb3, 0x59, 0x41, 0x60, 0xa, 0x12, 0x55, 0xa6, 0x68, 0x5, 0x12, + 0x55, 0x9e, 0x28, 0x3, 0x2, 0x55, 0xd7, 0xc2, 0x10, 0x22, 0x12, 0xdb, 0xb0, + 0x12, 0x52, 0x31, 0x12, 0xcc, 0x35, 0x12, 0x55, 0x4f, 0x7e, 0xb3, 0x9b, + 0xaf, 0x70, 0x3, 0x12, 0x32, 0xc0, 0x7e, 0xb3, 0x9b, 0xaf, 0x60, 0x6, 0x2, + 0x55, 0xe6, 0x12, 0x55, 0x66, 0x22, 0xe4, 0x7a, 0xb3, 0x59, 0x60, 0xd2, + 0x12, 0x12, 0x36, 0xbf, 0x2, 0x55, 0x5c, 0x12, 0x1f, 0xd9, 0x68, 0x4, 0xd2, + 0x1b, 0xc2, 0x18, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x59, 0x60, 0x22, 0x7e, 0xb3, + 0x9b, 0xaf, 0xb4, 0x1, 0xc, 0x7e, 0xb3, 0x2e, 0x75, 0x60, 0x6, 0xe4, 0x7a, + 0xb3, 0x59, 0x60, 0x22, 0xc2, 0x19, 0x12, 0x55, 0x66, 0x12, 0x36, 0xbf, + 0xe4, 0x7a, 0xb3, 0x3, 0xda, 0x7a, 0xb3, 0x3, 0xd5, 0x2, 0x55, 0x94, 0x12, + 0x1f, 0xd9, 0x68, 0x4, 0xd2, 0x18, 0xc2, 0x1b, 0x22, 0x7e, 0x73, 0x37, 0xd1, + 0xbe, 0x70, 0x0, 0x22, 0x7e, 0xb3, 0x3, 0xe4, 0xbe, 0xb0, 0x1, 0x22, 0x7e, + 0x73, 0x69, 0x69, 0xbe, 0x70, 0x0, 0x22, 0xa9, 0xd5, 0xea, 0xa9, 0xc5, 0xea, + 0x22, 0xc2, 0x8, 0x12, 0x15, 0x16, 0xc2, 0x0, 0x22, 0x12, 0x53, 0xac, 0x12, + 0x53, 0x8e, 0x50, 0xfb, 0x22, 0x80, 0x3, 0x12, 0x52, 0x5b, 0x30, 0x12, 0xfa, + 0x22, 0x7e, 0xb3, 0x59, 0x8b, 0x60, 0x5, 0x20, 0x10, 0x5, 0x80, 0x0, 0x2, + 0x55, 0x4f, 0x22, 0x30, 0x18, 0x7, 0xd2, 0x1a, 0xc2, 0x18, 0x2, 0x57, 0x86, + 0x30, 0x1b, 0x1b, 0x12, 0xd9, 0xf3, 0x68, 0xe, 0x12, 0x57, 0x4d, 0x80, 0x3, + 0x20, 0xb, 0x6, 0x7e, 0xb3, 0x3, 0xd4, 0x70, 0xf7, 0x30, 0xb, 0xe, 0x12, + 0x30, 0xa3, 0x80, 0x9, 0x30, 0x1a, 0x6, 0x7e, 0xb3, 0x9b, 0xaf, 0x70, 0x3, + 0x2, 0x32, 0xc0, 0x22, 0xca, 0x79, 0xd2, 0x0, 0x12, 0x55, 0xc5, 0x7e, 0xe3, + 0x9a, 0x84, 0xa, 0x3e, 0x9, 0xb3, 0x9a, 0x7c, 0x60, 0x3c, 0xa, 0x3b, 0x1b, + 0x34, 0x7c, 0xa7, 0x7a, 0xa3, 0x9a, 0xe7, 0xb4, 0x1, 0x4, 0x74, 0x1, 0x80, + 0x1, 0xe4, 0x7a, 0xb3, 0x2e, 0x74, 0xe4, 0xa, 0x3e, 0x19, 0xb3, 0x9a, 0x7c, + 0x9, 0xf3, 0x9a, 0x7f, 0x7a, 0xf3, 0x9b, 0x84, 0x7c, 0xbe, 0x7c, 0x7f, 0x12, + 0x57, 0x18, 0x7c, 0xbe, 0x7c, 0x7f, 0x12, 0xb8, 0xaa, 0x7e, 0xb3, 0x9a, + 0x84, 0x4, 0x7a, 0xb3, 0x9a, 0x84, 0x7e, 0xb3, 0x2e, 0x74, 0xbe, 0xb0, 0x1, + 0x68, 0x7, 0x7e, 0xb3, 0x3, 0xfd, 0xb4, 0x3, 0x3b, 0x74, 0x3, 0xac, 0xbf, + 0x9, 0xb5, 0x9b, 0x59, 0x7e, 0xf, 0x2d, 0x26, 0x12, 0x27, 0x7f, 0x7c, 0xbe, + 0x7c, 0x7f, 0x12, 0x78, 0x7, 0x92, 0x0, 0x30, 0x0, 0x20, 0x7a, 0xe3, 0x2e, + 0x75, 0x7a, 0xe3, 0x9a, 0xe8, 0x12, 0xda, 0xf5, 0x7a, 0x73, 0x39, 0xc0, + 0x7a, 0xf3, 0x9b, 0xae, 0x12, 0xcd, 0x61, 0x7c, 0xbe, 0x7c, 0x7f, 0x12, + 0x76, 0xd5, 0x12, 0x77, 0xfc, 0x12, 0x57, 0x44, 0x7e, 0x73, 0x9a, 0x84, 0xa, + 0x37, 0xbd, 0x32, 0x48, 0x18, 0x12, 0x56, 0xee, 0xd2, 0x4, 0x12, 0xb, 0xc5, + 0x12, 0x30, 0xa3, 0x12, 0xb6, 0x33, 0x7e, 0x34, 0x8, 0x0, 0x12, 0x1f, 0xc1, + 0x12, 0x55, 0xe6, 0x7c, 0xbe, 0x7c, 0x7f, 0x12, 0x38, 0x71, 0x7c, 0xbf, + 0x7c, 0x7e, 0x12, 0xb9, 0xac, 0x12, 0xc4, 0xdd, 0xda, 0x79, 0x22, 0x30, + 0x18, 0x6, 0x12, 0x1c, 0xb5, 0x12, 0xc7, 0xd, 0x22, 0xca, 0xf8, 0x6c, 0xff, + 0x12, 0x56, 0x1b, 0xb, 0xf0, 0x12, 0x57, 0x44, 0xa, 0x3f, 0xbd, 0x32, 0x48, + 0xf2, 0x7e, 0xb3, 0x9a, 0xe8, 0x7e, 0x73, 0x9b, 0xa8, 0x12, 0x57, 0x18, + 0xda, 0xf8, 0x22, 0x14, 0x68, 0x21, 0x14, 0x68, 0x25, 0xb, 0xb1, 0x78, 0x1a, + 0x7e, 0x8, 0xe, 0x40, 0x7a, 0xf, 0x2d, 0x26, 0x7e, 0x8, 0x1d, 0xa0, 0x7a, + 0xf, 0x2d, 0x2a, 0xa5, 0xbf, 0x2, 0xd, 0x7e, 0x18, 0x27, 0xe0, 0x80, 0x3, + 0x12, 0xd9, 0xcd, 0x7a, 0x1f, 0x2d, 0x2a, 0x22, 0x7e, 0x73, 0x9a, 0x85, 0xa, + 0x27, 0x1b, 0x24, 0x22, 0x12, 0x1c, 0xa1, 0x7a, 0xb3, 0x9b, 0xaf, 0x7e, + 0xb3, 0x9b, 0x7f, 0xb4, 0x1, 0x5, 0x12, 0x3f, 0xdc, 0x80, 0x7, 0x7e, 0x34, + 0x0, 0x2, 0x12, 0x57, 0xaa, 0x7e, 0xb3, 0x9b, 0xaf, 0x2, 0x37, 0xa4, 0xe4, + 0x7a, 0xb3, 0x59, 0x60, 0x12, 0x0, 0x40, 0x12, 0xcc, 0x8c, 0x12, 0x57, 0x4d, + 0x7e, 0xb3, 0x59, 0x5f, 0xb4, 0x1, 0x2, 0xd2, 0x86, 0x22, 0x7e, 0xb3, 0x9b, + 0x7f, 0xb4, 0x1, 0xf, 0x74, 0x2, 0x7a, 0xb3, 0x9b, 0xa8, 0x7a, 0xb3, 0x9b, + 0xaf, 0x12, 0x1c, 0x87, 0x80, 0x7, 0x7e, 0x34, 0x0, 0x1, 0x12, 0x57, 0xaa, + 0x7e, 0xb3, 0x9b, 0xaf, 0x2, 0x37, 0xa4, 0x7e, 0xa3, 0x9b, 0xaf, 0x74, 0xb, + 0xa4, 0x59, 0x35, 0x9a, 0x4c, 0x22, 0xca, 0x3b, 0x7e, 0xd4, 0x3a, 0x0, 0x7e, + 0xb3, 0x9a, 0xcd, 0xb4, 0x1, 0x2, 0x80, 0x3, 0x2, 0x59, 0x5d, 0x12, 0xda, + 0x29, 0x7e, 0xb3, 0x38, 0x9c, 0x60, 0x12, 0x7e, 0xb3, 0x38, 0x9d, 0xbe, + 0xb0, 0x2, 0x50, 0x4, 0x4, 0x2, 0x59, 0x57, 0xe4, 0x7a, 0xb3, 0x38, 0x9c, + 0x7e, 0xc7, 0x38, 0x9a, 0x4d, 0xcc, 0x78, 0x22, 0x7d, 0x1d, 0x2e, 0x14, 0xa, + 0x40, 0x6d, 0x0, 0x7e, 0x34, 0x5, 0x20, 0x74, 0x88, 0x12, 0x0, 0x2e, 0x7d, + 0x1d, 0x2e, 0x14, 0xf, 0x60, 0x6d, 0x0, 0x7e, 0x34, 0x5, 0x20, 0x74, 0x77, + 0x12, 0x0, 0x2e, 0x7e, 0xc7, 0x38, 0x9a, 0xb, 0xc4, 0x7a, 0xc7, 0x38, 0x9a, + 0x7e, 0xb3, 0x9a, 0xcf, 0x4, 0x7a, 0xb3, 0x9a, 0xcf, 0x7e, 0xd3, 0x82, 0xd, + 0x7e, 0xc3, 0x82, 0xc, 0x6c, 0xee, 0x80, 0x25, 0x6c, 0xff, 0x80, 0x1b, 0x12, + 0x59, 0x8d, 0x7d, 0xf3, 0x7d, 0xcf, 0x12, 0x59, 0x9e, 0x58, 0x4, 0x59, 0xe3, + 0xa, 0x40, 0x12, 0x59, 0x77, 0x8, 0x4, 0x59, 0xec, 0xf, 0x60, 0xb, 0xf0, + 0xbc, 0xdf, 0x38, 0xe1, 0xb, 0xe0, 0xbc, 0xce, 0x38, 0xd7, 0x6d, 0xff, 0x7e, + 0xc7, 0x8d, 0x94, 0x2d, 0xcf, 0x12, 0x59, 0x9e, 0x58, 0x4, 0x59, 0xe3, 0xa, + 0x40, 0x12, 0x59, 0x77, 0x8, 0x4, 0x59, 0xec, 0xf, 0x60, 0xb, 0xf4, 0xbe, + 0xf4, 0x0, 0x4, 0x78, 0xe0, 0x7e, 0xc7, 0x38, 0x96, 0xbe, 0xc7, 0x38, 0x9a, + 0x68, 0x2, 0x21, 0x6b, 0x6c, 0xee, 0x80, 0x57, 0x6c, 0xff, 0x80, 0x4d, 0x12, + 0x59, 0x8d, 0x12, 0x59, 0x80, 0x8, 0x6, 0x49, 0xc3, 0xf, 0x60, 0x80, 0x4, + 0x6d, 0xcc, 0x9d, 0xc2, 0x12, 0x59, 0x6e, 0x8, 0x6, 0x49, 0x3, 0xa, 0x40, + 0x80, 0x4, 0x6d, 0x0, 0x9d, 0x1, 0xbd, 0xc, 0x8, 0x12, 0xbe, 0x14, 0x0, 0x0, + 0x8, 0x6, 0x49, 0xc3, 0xa, 0x40, 0x80, 0x16, 0x6d, 0xcc, 0x9d, 0xc1, 0x80, + 0x10, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x6, 0x49, 0xc3, 0xf, 0x60, 0x80, 0x4, + 0x6d, 0xcc, 0x9d, 0xc2, 0x59, 0xc3, 0xa, 0x40, 0xb, 0xf0, 0xbc, 0xdf, 0x38, + 0xaf, 0xb, 0xe0, 0xbc, 0xce, 0x38, 0xa5, 0x6d, 0xff, 0x7e, 0x37, 0x8d, 0x94, + 0x2d, 0x3f, 0x12, 0x59, 0x80, 0x8, 0x6, 0x49, 0xc3, 0xf, 0x60, 0x80, 0x4, + 0x6d, 0xcc, 0x9d, 0xc2, 0x12, 0x59, 0x6e, 0x8, 0x6, 0x49, 0x3, 0xa, 0x40, + 0x80, 0x4, 0x6d, 0x0, 0x9d, 0x1, 0xbd, 0xc, 0x8, 0x12, 0xbe, 0x14, 0x0, 0x0, + 0x8, 0x6, 0x49, 0xc3, 0xa, 0x40, 0x80, 0x16, 0x6d, 0xcc, 0x9d, 0xc1, 0x80, + 0x10, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x6, 0x49, 0xc3, 0xf, 0x60, 0x80, 0x4, + 0x6d, 0xcc, 0x9d, 0xc2, 0x59, 0xc3, 0xa, 0x40, 0xb, 0xf4, 0xbe, 0xf4, 0x0, + 0x4, 0x78, 0xaa, 0x7d, 0x3d, 0x2e, 0x34, 0xa, 0x40, 0x7a, 0x37, 0x38, 0x92, + 0x74, 0xaa, 0x7a, 0xb3, 0x9a, 0xcd, 0x6d, 0x33, 0x7a, 0x37, 0x38, 0x9a, + 0x74, 0x1, 0x7a, 0xb3, 0x38, 0x9c, 0xe4, 0x7a, 0xb3, 0x38, 0x9d, 0x80, 0xe, + 0x7e, 0x37, 0x38, 0x9a, 0x4d, 0x33, 0x68, 0x6, 0x6d, 0x33, 0x7a, 0x37, 0x38, + 0x9a, 0xda, 0x3b, 0x22, 0x49, 0x13, 0xa, 0x40, 0xbe, 0x14, 0x0, 0x0, 0x22, + 0x2d, 0xcd, 0x49, 0x3c, 0xf, 0x60, 0xbd, 0x3e, 0x22, 0x3e, 0x34, 0x2d, 0x3d, + 0x49, 0x23, 0xf, 0x60, 0xbe, 0x24, 0x0, 0x0, 0x22, 0x7c, 0xbe, 0x7c, 0x7f, + 0x7c, 0xa7, 0x7e, 0x73, 0x82, 0xd, 0xac, 0x7b, 0xa, 0x2a, 0x2d, 0x32, 0x22, + 0x3e, 0xc4, 0x7e, 0x1f, 0x2d, 0x2e, 0x2d, 0x3c, 0xb, 0x1a, 0xe0, 0x7d, 0x3c, + 0x2d, 0x3d, 0x49, 0x23, 0xa, 0x40, 0xbd, 0x2e, 0x22, 0x7e, 0x73, 0x67, 0x77, + 0x7a, 0x73, 0x67, 0x78, 0x7e, 0x73, 0x37, 0xd1, 0xa, 0x27, 0x7e, 0x73, 0x69, + 0x69, 0xa, 0x37, 0x2d, 0x32, 0x7a, 0x73, 0x69, 0x6a, 0xe4, 0x7a, 0xb3, 0x69, + 0x6d, 0x7e, 0x73, 0x9b, 0x7e, 0x7a, 0x73, 0x59, 0x66, 0x22, 0x7e, 0x54, 0x7, + 0xdb, 0x7e, 0x44, 0x0, 0xff, 0x12, 0x5c, 0xb7, 0x30, 0x20, 0x5a, 0xc2, 0x20, + 0x7e, 0x14, 0x0, 0xa5, 0x7e, 0x34, 0xff, 0xb0, 0x12, 0x5a, 0x45, 0x7e, 0x14, + 0xff, 0x5a, 0x7e, 0x34, 0xff, 0xb2, 0x1b, 0x1a, 0x10, 0x7e, 0x14, 0x0, 0xaa, + 0x7e, 0x34, 0xff, 0xb4, 0x1b, 0x1a, 0x10, 0x6d, 0x33, 0x12, 0x5b, 0xce, + 0x12, 0x5c, 0xa5, 0x78, 0xf8, 0x12, 0x5b, 0xdb, 0x7d, 0x13, 0x7e, 0x34, + 0xff, 0xb6, 0x12, 0x5a, 0x45, 0x7e, 0x33, 0x59, 0x7b, 0x7e, 0x34, 0xff, + 0xb8, 0x7a, 0x1b, 0x30, 0x7e, 0x33, 0x59, 0x7c, 0x7e, 0x34, 0xff, 0xba, + 0x7a, 0x1b, 0x30, 0x7e, 0x33, 0x59, 0x46, 0x7e, 0x34, 0xff, 0xbc, 0x7a, + 0x1b, 0x30, 0x22, 0x7e, 0x24, 0x0, 0xfe, 0x1b, 0x1a, 0x10, 0x22, 0x7e, 0x34, + 0x7, 0xb7, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x14, 0x92, 0x16, 0x12, 0x5c, 0x94, + 0x12, 0x5c, 0x9c, 0x1b, 0xa, 0x30, 0x7e, 0x24, 0x0, 0xa5, 0x7e, 0x14, 0xff, + 0xd0, 0x1b, 0xa, 0x20, 0x7e, 0x24, 0xff, 0x5a, 0x7e, 0x14, 0xff, 0xd2, 0x1b, + 0xa, 0x20, 0x7e, 0x24, 0x0, 0xaa, 0x7e, 0x14, 0xff, 0xd4, 0x1b, 0xa, 0x20, + 0x7e, 0x24, 0x0, 0x55, 0x7e, 0x14, 0xff, 0xd6, 0x1b, 0xa, 0x20, 0x7e, 0x24, + 0x0, 0x66, 0x7e, 0x14, 0xff, 0xd8, 0x1b, 0xa, 0x20, 0x7e, 0x24, 0x0, 0x99, + 0x7e, 0x14, 0xff, 0xda, 0x1b, 0xa, 0x20, 0x12, 0x5b, 0xce, 0x12, 0x5c, 0x8c, + 0x59, 0x21, 0x92, 0x16, 0xb, 0x34, 0xbe, 0x34, 0x0, 0x6, 0x40, 0xee, 0x7e, + 0x8, 0x92, 0x16, 0x12, 0x5b, 0x4f, 0x7d, 0x13, 0x7e, 0x34, 0xff, 0xdc, 0x2, + 0x5a, 0x45, 0x7e, 0x34, 0x7, 0xc3, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x14, 0x92, + 0xa, 0x12, 0x5c, 0x94, 0x12, 0x5b, 0xce, 0x12, 0x5c, 0x8c, 0x59, 0x21, 0x92, + 0xa, 0xb, 0x34, 0xbe, 0x34, 0x0, 0x6, 0x78, 0xee, 0x7e, 0x8, 0x92, 0xa, + 0x12, 0x5b, 0x4f, 0x7d, 0x23, 0x7e, 0x14, 0xff, 0xdc, 0x12, 0x5b, 0x56, + 0x78, 0x4a, 0x7e, 0x34, 0xff, 0xd2, 0x12, 0x5b, 0x47, 0x7d, 0x23, 0x6e, + 0x24, 0xff, 0xff, 0x7e, 0x14, 0xff, 0xd0, 0x12, 0x5b, 0x56, 0x78, 0x34, + 0x7e, 0x34, 0xff, 0xd4, 0x12, 0x5b, 0x47, 0xbe, 0x34, 0x0, 0xaa, 0x78, 0x27, + 0x7e, 0x34, 0xff, 0xd6, 0x12, 0x5b, 0x47, 0xbe, 0x34, 0x0, 0x55, 0x78, 0x1a, + 0x7e, 0x34, 0xff, 0xd8, 0x12, 0x5b, 0x47, 0xbe, 0x34, 0x0, 0x66, 0x78, 0xd, + 0x7e, 0x34, 0xff, 0xda, 0x12, 0x5b, 0x47, 0xbe, 0x34, 0x0, 0x99, 0x68, 0x3, + 0x2, 0x5a, 0x4d, 0x22, 0x7e, 0x24, 0x0, 0xfe, 0xb, 0x1a, 0x30, 0x22, 0x7e, + 0x34, 0x0, 0xc, 0x2, 0x5b, 0xe3, 0x7e, 0x4, 0x0, 0xfe, 0xb, 0xa, 0x30, 0xbd, + 0x32, 0x22, 0x7e, 0x54, 0x7, 0xe1, 0x7e, 0x44, 0x0, 0xff, 0x12, 0x5c, 0xb7, + 0x6d, 0x33, 0x12, 0x5b, 0xce, 0x12, 0x5c, 0xa5, 0x78, 0xf8, 0x12, 0x5b, + 0xdb, 0x7d, 0x23, 0x7e, 0x14, 0xff, 0xb6, 0x12, 0x5b, 0x56, 0x78, 0x4a, + 0x7e, 0x34, 0xff, 0xb2, 0x12, 0x5b, 0x47, 0x7d, 0x23, 0x6e, 0x24, 0xff, + 0xff, 0x7e, 0x14, 0xff, 0xb0, 0x12, 0x5b, 0x56, 0x78, 0x34, 0x7e, 0x34, + 0xff, 0xb4, 0x12, 0x5b, 0x47, 0xbe, 0x34, 0x0, 0xaa, 0x78, 0x27, 0x7e, 0x34, + 0xff, 0xb8, 0x7e, 0x24, 0x0, 0xfe, 0x7e, 0x1b, 0x70, 0x7a, 0x73, 0x59, 0x7b, + 0x7e, 0x34, 0xff, 0xba, 0x7e, 0x1b, 0x70, 0x7a, 0x73, 0x59, 0x7c, 0x7e, + 0x34, 0xff, 0xbc, 0x7e, 0x1b, 0x70, 0x7a, 0x73, 0x59, 0x46, 0xd2, 0x1f, + 0x22, 0x7d, 0x13, 0x3e, 0x14, 0x7d, 0x51, 0x6d, 0x44, 0x2e, 0x44, 0x0, 0xfe, + 0x22, 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x34, 0x0, 0x6, 0x7d, 0x23, 0x7e, 0x34, + 0xff, 0xff, 0x6d, 0x55, 0x80, 0x2b, 0x7f, 0x70, 0x2d, 0xf5, 0x7e, 0x7b, + 0x80, 0x6c, 0x99, 0x6d, 0xff, 0x7d, 0xe4, 0x6d, 0xe3, 0x5e, 0xe4, 0x80, 0x0, + 0x68, 0x8, 0x3e, 0x34, 0x6e, 0x34, 0x10, 0x21, 0x80, 0x2, 0x3e, 0x34, 0x3e, + 0x44, 0xb, 0xf4, 0xbe, 0xf4, 0x0, 0x8, 0x78, 0xe2, 0xb, 0x54, 0xbd, 0x25, + 0x38, 0xd1, 0x22, 0x7e, 0x34, 0x7, 0xcf, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x14, + 0x91, 0xfe, 0x74, 0xc, 0x12, 0x2, 0x3d, 0x12, 0x5a, 0xc6, 0x7e, 0xb3, 0x3, + 0xfd, 0xb4, 0x1, 0x53, 0x7e, 0x53, 0x9b, 0xa8, 0xa5, 0xbd, 0x1, 0x4b, 0x6d, + 0x11, 0x7d, 0x31, 0x80, 0x19, 0xa, 0x45, 0x7e, 0x54, 0x2, 0xd8, 0xad, 0x54, + 0x7d, 0x5, 0x2d, 0x1, 0x9, 0x40, 0x5a, 0x0, 0xbe, 0x40, 0x5, 0x50, 0x2, 0xb, + 0x34, 0xb, 0x14, 0x7e, 0x43, 0x82, 0xd, 0x7e, 0xb3, 0x82, 0xc, 0xac, 0xb4, + 0xbd, 0x51, 0x38, 0xd9, 0xbe, 0x34, 0x0, 0x50, 0x28, 0x15, 0x12, 0x5c, 0x9c, + 0xb, 0xa, 0x30, 0xbe, 0x34, 0x0, 0x5, 0x50, 0xc, 0xb, 0x34, 0x1b, 0xa, 0x30, + 0x75, 0xe9, 0xff, 0x22, 0x2, 0x5a, 0x4d, 0x22, 0x2e, 0x28, 0xff, 0xd0, 0xb, + 0x2a, 0x20, 0x22, 0x74, 0xc, 0x12, 0x2, 0x3d, 0x6d, 0x33, 0x22, 0x7e, 0x14, + 0xff, 0xde, 0x7e, 0x4, 0x0, 0xfe, 0x22, 0x2e, 0x28, 0xff, 0xb0, 0xb, 0x2a, + 0x20, 0x59, 0x21, 0x91, 0xfe, 0xb, 0x34, 0xbe, 0x34, 0x0, 0x3, 0x22, 0x69, + 0x32, 0x0, 0x4, 0x69, 0x22, 0x0, 0x2, 0xb, 0x2a, 0x10, 0x7a, 0x1f, 0x92, + 0x0, 0x7a, 0x17, 0x91, 0xfe, 0x22, 0xca, 0xf8, 0x7e, 0xf3, 0x9b, 0xa8, 0x20, + 0xb, 0x3, 0x30, 0xc, 0x3, 0xc3, 0xa1, 0x62, 0xc2, 0x2c, 0x12, 0x5d, 0x65, + 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x7e, 0x53, 0x8d, 0x92, 0x6c, 0x44, + 0x5c, 0x57, 0x4d, 0x22, 0x68, 0x6f, 0x4e, 0x73, 0x8d, 0x93, 0x7a, 0x73, + 0x8d, 0x93, 0xd2, 0x4, 0x12, 0xb, 0xc5, 0x7c, 0xbf, 0x12, 0xb9, 0x59, 0x40, + 0x3, 0xc3, 0x80, 0x59, 0x20, 0xb, 0x6, 0x20, 0xc, 0x3, 0x30, 0x2c, 0x3, + 0xc3, 0x80, 0x4d, 0x12, 0x5c, 0x1d, 0x12, 0x5d, 0x65, 0x60, 0x5, 0x3e, 0x34, + 0x14, 0x78, 0xfb, 0x6e, 0x70, 0xff, 0x5e, 0x73, 0x8d, 0x92, 0x7a, 0x73, + 0x8d, 0x92, 0xbe, 0xf0, 0x1, 0x78, 0x29, 0x7e, 0x34, 0x2, 0xd8, 0xca, 0x39, + 0x7e, 0x18, 0x5c, 0xd8, 0x7e, 0x8, 0x5f, 0xb0, 0x12, 0x0, 0x6e, 0x1b, 0xfd, + 0x74, 0x2, 0x7e, 0x8, 0x5f, 0xb0, 0x12, 0x5d, 0x6c, 0x7e, 0xb3, 0x8d, 0x92, + 0x54, 0xfb, 0x7a, 0xb3, 0x8d, 0x92, 0x12, 0x5f, 0xc6, 0x12, 0xcb, 0x3a, + 0xd3, 0x80, 0x1, 0xd3, 0xda, 0xf8, 0x22, 0x7e, 0x34, 0x0, 0x1, 0x7c, 0xbf, + 0x22, 0xca, 0x3b, 0x7f, 0x60, 0x7c, 0xab, 0x6d, 0xee, 0xbe, 0xa0, 0x4, 0x40, + 0x2, 0xc1, 0x8c, 0x74, 0x8, 0xa4, 0x9, 0xb5, 0x9b, 0x27, 0xf5, 0x36, 0x12, + 0x5f, 0xbc, 0x60, 0xa, 0x7e, 0x67, 0x82, 0x37, 0x7e, 0x37, 0x82, 0x35, 0x80, + 0x8, 0x7e, 0x67, 0x82, 0x35, 0x7e, 0x37, 0x82, 0x37, 0x7a, 0x35, 0x34, 0x7e, + 0xb5, 0x34, 0x2d, 0xb6, 0x7e, 0x8, 0x8f, 0x20, 0x7e, 0x34, 0x1, 0x6d, 0x74, + 0xff, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x90, 0x8d, 0x7e, 0x34, 0x1, 0x6d, 0x12, + 0x0, 0x2e, 0x6d, 0x77, 0x80, 0xf, 0x12, 0x5f, 0xa4, 0x60, 0x5, 0x12, 0x5f, + 0x90, 0x80, 0x3, 0x12, 0x5f, 0x9a, 0xb, 0x74, 0xbd, 0x67, 0x38, 0xed, 0x7d, + 0x76, 0x80, 0xf, 0x12, 0x5f, 0xa4, 0x60, 0x5, 0x12, 0x5f, 0x9a, 0x80, 0x3, + 0x12, 0x5f, 0x90, 0xb, 0x74, 0xbd, 0xb7, 0x38, 0xed, 0x6d, 0x33, 0x7d, 0xf3, + 0x7d, 0xe3, 0x7d, 0x73, 0x7d, 0x27, 0x1e, 0x24, 0x1e, 0x24, 0x7c, 0xaf, + 0x7e, 0x7, 0x8d, 0xe8, 0x7c, 0xba, 0x60, 0x5, 0x1e, 0x4, 0x14, 0x78, 0xfb, + 0x5e, 0x4, 0x0, 0xf, 0x7e, 0x17, 0x8d, 0xec, 0x12, 0x5f, 0x87, 0x78, 0x2, + 0x7d, 0xf2, 0x7e, 0x7, 0x8d, 0xfa, 0x7c, 0xba, 0x60, 0x5, 0x1e, 0x4, 0x14, + 0x78, 0xfb, 0x5e, 0x4, 0x0, 0xf, 0x7e, 0x17, 0x8d, 0xfe, 0x12, 0x5f, 0x87, + 0x78, 0x2, 0x7d, 0xe2, 0xb, 0x76, 0xbe, 0x74, 0x0, 0xf, 0x40, 0xb8, 0x12, + 0x5f, 0xd1, 0x7d, 0x73, 0x7d, 0x37, 0x2d, 0x3f, 0x9, 0x73, 0x8f, 0x20, 0x19, + 0x77, 0x90, 0x44, 0x7d, 0x37, 0x2d, 0x3e, 0x9, 0x73, 0x90, 0x8d, 0x19, 0x77, + 0x91, 0xb1, 0xb, 0x74, 0xbe, 0x74, 0x0, 0x24, 0x78, 0xe0, 0x7e, 0x71, 0x36, + 0x74, 0xee, 0xac, 0x7b, 0x2e, 0x34, 0x1, 0x0, 0x2e, 0x34, 0x0, 0x35, 0x7a, + 0x35, 0x37, 0x7e, 0x8, 0x94, 0xd6, 0x7e, 0x18, 0x8f, 0x20, 0x12, 0x5f, 0x52, + 0x12, 0x17, 0x8f, 0x7e, 0x8, 0x94, 0xd6, 0x7e, 0x18, 0x90, 0x8d, 0x12, 0x5f, + 0x52, 0x12, 0x17, 0x2a, 0xda, 0x3b, 0x22, 0xca, 0x79, 0x7f, 0x71, 0x7e, + 0xa0, 0x25, 0x6c, 0x77, 0x6c, 0x66, 0x6c, 0x55, 0x6c, 0x44, 0xe1, 0x2e, + 0x7c, 0x97, 0xac, 0x9a, 0xa, 0xd4, 0x2d, 0x4d, 0x7e, 0xf0, 0x49, 0xac, 0xf7, + 0x7d, 0xd7, 0xa5, 0xbc, 0x0, 0xb, 0x7e, 0xc4, 0x1, 0x24, 0x12, 0x5f, 0x40, + 0x7d, 0xc7, 0x80, 0x2a, 0xa5, 0xbc, 0x12, 0x12, 0x7e, 0xc4, 0x1, 0x47, 0x12, + 0x5f, 0x40, 0x7d, 0xb7, 0x7e, 0xc4, 0x1, 0x48, 0x12, 0x5f, 0x7b, 0x80, 0x14, + 0xa5, 0xbc, 0x24, 0x15, 0x7e, 0xc4, 0x1, 0x6b, 0x12, 0x5f, 0x40, 0x7d, 0xb7, + 0x7e, 0xc4, 0x1, 0x6c, 0x12, 0x5f, 0x7b, 0x12, 0x5f, 0x6c, 0x80, 0x3f, 0xbe, + 0x40, 0x12, 0x50, 0x1e, 0x7e, 0xb4, 0x1, 0x25, 0x9d, 0xbd, 0xa, 0xc6, 0x2d, + 0xcb, 0x12, 0x5f, 0x42, 0x7d, 0xb7, 0x7e, 0xa4, 0x1, 0x26, 0x9d, 0xad, 0xa, + 0xc6, 0x12, 0x5f, 0x61, 0xb, 0x61, 0x80, 0x1c, 0x7e, 0xb4, 0x1, 0x49, 0x9d, + 0xbd, 0xa, 0xc5, 0x2d, 0xcb, 0x12, 0x5f, 0x42, 0x7d, 0xb7, 0x7e, 0xa4, 0x1, + 0x4a, 0x9d, 0xad, 0xa, 0xc5, 0x12, 0x5f, 0x61, 0xb, 0x51, 0xb, 0x40, 0xbc, + 0xa4, 0x28, 0x2, 0xc1, 0xa0, 0xb, 0x70, 0xbe, 0x70, 0x5, 0x50, 0x2, 0xc1, + 0x98, 0xda, 0x79, 0x22, 0x9d, 0xcd, 0x7f, 0x57, 0x2d, 0xbc, 0x7e, 0x5b, + 0xb0, 0xa, 0xbb, 0x7d, 0x7b, 0x7c, 0xef, 0x6c, 0xff, 0x22, 0x12, 0x5e, 0x8f, + 0x7e, 0x35, 0x37, 0x7e, 0x8, 0x94, 0xd6, 0x7e, 0x24, 0x0, 0xb9, 0x22, 0x2d, + 0xca, 0x7f, 0x47, 0x2d, 0x9c, 0x7e, 0x4b, 0xb0, 0xa, 0xcb, 0x2d, 0xcb, 0x7e, + 0xf0, 0x2, 0xac, 0xf9, 0x7f, 0x50, 0x2d, 0xb7, 0x1b, 0x5a, 0xc0, 0x22, 0x9d, + 0xcd, 0x7f, 0x47, 0x2d, 0x9c, 0x7e, 0x4b, 0xb0, 0xa, 0xcb, 0x22, 0xa, 0x12, + 0x5e, 0x14, 0x0, 0xf, 0xbd, 0x1, 0x22, 0x2d, 0x17, 0x7e, 0xb, 0x70, 0x19, + 0x72, 0x90, 0x8d, 0x22, 0x2d, 0x17, 0x7e, 0xb, 0x70, 0x19, 0x72, 0x8f, 0x20, + 0x22, 0x7d, 0xa7, 0x3e, 0xa4, 0x49, 0x2a, 0x82, 0x51, 0x7e, 0xb3, 0x69, + 0xec, 0x7f, 0x6, 0x22, 0xe5, 0xe9, 0x20, 0xe7, 0x3, 0x2, 0x5a, 0x4d, 0x22, + 0x74, 0x3, 0x12, 0x14, 0xcb, 0x7e, 0xb3, 0x69, 0xec, 0x22, 0x7e, 0xb3, 0x8d, + 0x93, 0x44, 0x4, 0x7a, 0xb3, 0x8d, 0x93, 0x22, 0x7e, 0x14, 0x0, 0x49, 0x7d, + 0x5f, 0xad, 0x51, 0x7d, 0xf5, 0xad, 0x1e, 0x7d, 0xe1, 0x22, 0x12, 0xd5, + 0xf1, 0x12, 0x5f, 0xe9, 0x2, 0xa, 0xbf, 0x7e, 0x8, 0x3, 0xd2, 0x2, 0x5f, + 0xf0, 0xb, 0xa, 0x30, 0xbe, 0x37, 0x9b, 0x77, 0x28, 0x6, 0x9e, 0x37, 0x9b, + 0x77, 0x80, 0x2, 0x6d, 0x33, 0x1b, 0xa, 0x30, 0x22, 0x7e, 0xb3, 0x39, 0xfc, + 0x4, 0x7a, 0xb3, 0x39, 0xfc, 0x7e, 0x73, 0x39, 0xfc, 0x7a, 0x73, 0x59, 0x4c, + 0x22, 0x7e, 0x37, 0x3, 0xf9, 0xb, 0x34, 0x7a, 0x37, 0x3, 0xf9, 0x7e, 0x37, + 0x3, 0xfb, 0xbe, 0x37, 0x3, 0xf9, 0x28, 0x3, 0x2, 0x61, 0x91, 0x22, 0x7e, + 0xa3, 0x9a, 0x4b, 0x7e, 0x70, 0x4, 0xac, 0x7a, 0xb, 0x34, 0xbe, 0x37, 0x9b, + 0x1c, 0x40, 0x39, 0x7e, 0x37, 0x9b, 0x1c, 0xb, 0x34, 0x7a, 0x37, 0x9b, 0x1c, + 0xbe, 0x34, 0x0, 0x1, 0x78, 0x5, 0x7e, 0xb3, 0x59, 0x8e, 0x22, 0xbe, 0x34, + 0x0, 0x2, 0x78, 0x3, 0x7c, 0xba, 0x22, 0xbe, 0x34, 0x0, 0x2, 0x50, 0x9, + 0x7d, 0x23, 0x1b, 0x25, 0x9, 0xb2, 0x3, 0xeb, 0x22, 0x9e, 0x34, 0x0, 0x3, + 0x2e, 0x37, 0x96, 0x5a, 0x7e, 0x39, 0xb0, 0x22, 0x74, 0xff, 0x22, 0x70, 0x3, + 0x2, 0x61, 0x79, 0xbe, 0xb0, 0x3, 0x38, 0x13, 0x30, 0x24, 0x6, 0x7e, 0x18, + 0x3, 0x10, 0x80, 0x4, 0x7e, 0x18, 0x3, 0x6a, 0x7a, 0x1f, 0x3, 0xc4, 0x80, + 0x5, 0xbe, 0xb0, 0x6e, 0x38, 0xe, 0xa, 0x1b, 0x7e, 0x1f, 0x3, 0xc4, 0x2d, + 0x31, 0x1b, 0x34, 0x7e, 0x1b, 0xb0, 0x22, 0xbe, 0xb0, 0xd3, 0x68, 0x3, 0xb4, + 0xd4, 0x10, 0xb4, 0xd3, 0x8, 0x6d, 0x33, 0x7a, 0x37, 0x9b, 0x1c, 0x80, 0x2, + 0x15, 0xf, 0x2, 0x60, 0x2f, 0xb4, 0xf6, 0x7, 0x12, 0x61, 0x3e, 0xb, 0x1a, + 0x50, 0x22, 0xb4, 0xf7, 0x9, 0x12, 0x61, 0x3e, 0xb, 0x1a, 0x30, 0xa, 0x56, + 0x22, 0xbe, 0xb0, 0xf8, 0x68, 0x3, 0xb4, 0xf9, 0x1c, 0xb4, 0xf8, 0x8, 0x6d, + 0x33, 0x7a, 0x37, 0x9b, 0x1c, 0x80, 0x2, 0x15, 0xf, 0x7e, 0x37, 0x9b, 0x1c, + 0x7d, 0x23, 0xb, 0x24, 0x7a, 0x27, 0x9b, 0x1c, 0x2, 0x0, 0x66, 0xbe, 0xb0, + 0xeb, 0x68, 0x3, 0xb4, 0xec, 0x3, 0x2, 0x61, 0x47, 0xb4, 0x80, 0x3, 0x2, + 0x70, 0x9e, 0xbe, 0xb0, 0x80, 0x28, 0xc, 0xbe, 0xb0, 0xef, 0x38, 0x7, 0xa, + 0x3b, 0x9, 0xb3, 0x58, 0xbb, 0x22, 0xb4, 0xfc, 0x5, 0x7e, 0xb3, 0x59, 0x62, + 0x22, 0xb4, 0xfd, 0x5, 0xa2, 0x2f, 0xe4, 0x33, 0x22, 0xb4, 0xfe, 0x8, 0x12, + 0x61, 0x99, 0x9, 0xb5, 0x9b, 0x23, 0x22, 0x74, 0xff, 0x22, 0x7e, 0x34, 0x0, + 0x9, 0x7e, 0x24, 0x0, 0xff, 0x22, 0xb4, 0xeb, 0x5, 0xe4, 0x7a, 0xb3, 0x9b, + 0x22, 0x7e, 0x73, 0x9b, 0x22, 0xa, 0x27, 0x2e, 0x24, 0x0, 0x6, 0x12, 0x61, + 0xa1, 0x7c, 0xab, 0x7c, 0xb7, 0x4, 0x7a, 0xb3, 0x9b, 0x22, 0xb4, 0x3, 0xb, + 0xe4, 0x7a, 0xb3, 0x9b, 0x22, 0x6d, 0x33, 0x7a, 0x37, 0x9b, 0x20, 0x75, 0xf, + 0xeb, 0x7c, 0xba, 0x22, 0x7e, 0x73, 0x9a, 0xbc, 0x7c, 0xa7, 0x5e, 0xa0, 0xf, + 0x7c, 0xb7, 0x23, 0x54, 0x1, 0x3, 0x54, 0x80, 0x4e, 0xb3, 0x9b, 0x1f, 0x4c, + 0xba, 0x22, 0xe5, 0x9a, 0x60, 0x3, 0xa9, 0xd6, 0xdf, 0x22, 0x7e, 0xa3, 0x9b, + 0xa8, 0x74, 0x8, 0xa4, 0x22, 0x7a, 0x51, 0x82, 0x7a, 0x41, 0x83, 0xe4, 0x93, + 0x22, 0x7c, 0x67, 0x7c, 0x7b, 0xc4, 0x23, 0x54, 0x1f, 0x7c, 0xab, 0x7c, + 0xb7, 0x54, 0x7, 0xa, 0x2b, 0x2e, 0x24, 0x0, 0x5e, 0x12, 0x61, 0xa1, 0x7c, + 0x7b, 0x4c, 0x66, 0x68, 0xb, 0xa, 0x2a, 0x12, 0x67, 0xd9, 0x4c, 0xb7, 0x7a, + 0x29, 0xb0, 0x22, 0x7c, 0xb7, 0x64, 0xff, 0xa, 0x2a, 0x2e, 0x24, 0x65, 0xd8, + 0x7e, 0x29, 0x70, 0x5c, 0x7b, 0x7a, 0x29, 0x70, 0x22, 0xca, 0x3b, 0x74, 0x4, + 0x7a, 0xb3, 0x92, 0x8, 0xc2, 0x0, 0x7e, 0xb3, 0x82, 0x4, 0x60, 0x2, 0x81, + 0x75, 0x30, 0x2a, 0x2, 0x81, 0x75, 0x7e, 0xa3, 0x67, 0x62, 0xbe, 0xa0, 0x1, + 0x78, 0x1b, 0x7e, 0xb3, 0x67, 0x78, 0x70, 0x15, 0x7e, 0xb3, 0x65, 0x60, + 0x7a, 0xb3, 0x59, 0xea, 0x7e, 0xb3, 0x65, 0x61, 0x7a, 0xb3, 0x59, 0xeb, + 0xe4, 0x7a, 0xb3, 0x59, 0xec, 0xbe, 0xa0, 0x0, 0x28, 0x63, 0xc2, 0x1, 0x6c, + 0xdd, 0x80, 0x47, 0x7e, 0x70, 0x2, 0xac, 0x7d, 0x9, 0xe3, 0x65, 0x60, 0x9, + 0xf3, 0x65, 0x61, 0x7e, 0xb3, 0x59, 0xea, 0xa, 0x2b, 0x1a, 0xce, 0x12, 0x64, + 0x86, 0x8, 0x4, 0x9d, 0xc2, 0x80, 0x4, 0x6d, 0xcc, 0x9d, 0xc3, 0xbe, 0xc4, + 0x0, 0x2, 0x58, 0x1d, 0x7e, 0xb3, 0x59, 0xeb, 0xa, 0x2b, 0x1a, 0xcf, 0x12, + 0x64, 0x86, 0x8, 0x4, 0x9d, 0xc2, 0x80, 0x4, 0x6d, 0xcc, 0x9d, 0xc3, 0xbe, + 0xc4, 0x0, 0x2, 0x58, 0x2, 0xd2, 0x1, 0xb, 0xd0, 0xbc, 0xad, 0x38, 0xb5, + 0x30, 0x1, 0xc, 0x7e, 0xb3, 0x59, 0xec, 0xbe, 0xb0, 0xc8, 0x50, 0xb, 0x4, + 0x80, 0x4, 0xe4, 0x80, 0x1, 0xe4, 0x7a, 0xb3, 0x59, 0xec, 0xbe, 0xa0, 0x2, + 0x50, 0x2, 0x81, 0x75, 0x7e, 0xb3, 0x69, 0x6a, 0xb4, 0x1, 0x2, 0x80, 0x2, + 0x81, 0x75, 0x6d, 0x0, 0x6c, 0xdd, 0x80, 0x23, 0x74, 0x2, 0xac, 0xbd, 0x9, + 0xe5, 0x65, 0x60, 0x9, 0xf5, 0x65, 0x61, 0x12, 0x64, 0x78, 0x7d, 0x43, 0xbd, + 0x40, 0x8, 0xc, 0x7d, 0x4, 0x7a, 0xe3, 0x67, 0x6a, 0x7a, 0xf3, 0x67, 0x6b, + 0x7c, 0xcd, 0xb, 0xd0, 0x12, 0x64, 0x7f, 0x38, 0xd8, 0x6c, 0xdd, 0x81, 0x68, + 0xbc, 0xcd, 0x78, 0x2, 0x81, 0x66, 0x74, 0x2, 0xac, 0xbd, 0x9, 0x75, 0x65, + 0x60, 0x7a, 0x73, 0x92, 0x2, 0x9, 0x75, 0x65, 0x61, 0x7a, 0x73, 0x92, 0x3, + 0x7e, 0x73, 0x67, 0x6a, 0x7a, 0x73, 0x92, 0x4, 0x7e, 0x63, 0x67, 0x6b, 0x7a, + 0x63, 0x92, 0x5, 0xbe, 0x73, 0x92, 0x2, 0x28, 0x6, 0x7e, 0x73, 0x92, 0x2, + 0x80, 0x4, 0x7e, 0x73, 0x92, 0x4, 0x7a, 0x73, 0x91, 0xfe, 0x7e, 0x73, 0x92, + 0x4, 0xbe, 0x73, 0x92, 0x2, 0x50, 0x6, 0x7e, 0x73, 0x92, 0x2, 0x80, 0x4, + 0x7e, 0x73, 0x92, 0x4, 0x7a, 0x73, 0x92, 0x0, 0x7e, 0x73, 0x92, 0x5, 0xbe, + 0x73, 0x92, 0x3, 0x28, 0x6, 0x7e, 0x63, 0x92, 0x3, 0x80, 0x4, 0x7e, 0x63, + 0x92, 0x5, 0x7a, 0x63, 0x91, 0xff, 0xbe, 0x73, 0x92, 0x3, 0x50, 0x6, 0x7e, + 0x73, 0x92, 0x3, 0x80, 0x4, 0x7e, 0x73, 0x92, 0x5, 0x7a, 0x73, 0x92, 0x1, + 0x7e, 0x63, 0x91, 0xfe, 0x1a, 0x56, 0x7e, 0x63, 0x92, 0x0, 0x1a, 0x16, 0x9d, + 0x15, 0xb, 0x14, 0x7c, 0x63, 0x7a, 0x63, 0x92, 0x6, 0x7e, 0x63, 0x91, 0xff, + 0x1a, 0x26, 0x1a, 0x37, 0x9d, 0x32, 0xb, 0x34, 0x7a, 0x73, 0x92, 0x7, 0x12, + 0x2e, 0x38, 0x7d, 0xd3, 0x7e, 0x73, 0x92, 0x7, 0xbe, 0x73, 0x92, 0x6, 0x50, + 0x5b, 0x7e, 0xb3, 0x91, 0xff, 0xbe, 0xb0, 0x0, 0x8, 0x5, 0x14, 0x7a, 0xb3, + 0x91, 0xff, 0x12, 0x67, 0xf2, 0x7e, 0xb3, 0x92, 0x1, 0x1a, 0x1b, 0xbd, 0x1c, + 0x58, 0x5, 0x4, 0x7a, 0xb3, 0x92, 0x1, 0x7e, 0xe3, 0x92, 0x0, 0x12, 0x2e, + 0x38, 0x7d, 0x3, 0x80, 0x26, 0x1b, 0xe0, 0x6d, 0x44, 0x7e, 0xf3, 0x92, 0x1, + 0x80, 0xe, 0x12, 0x64, 0x78, 0xbd, 0x34, 0x8, 0x5, 0x12, 0x64, 0x78, 0x7d, + 0x43, 0x1b, 0xf0, 0x7e, 0x73, 0x91, 0xff, 0xbc, 0x7f, 0x8, 0xea, 0xbd, 0x40, + 0x58, 0x2, 0x7d, 0x4, 0x7e, 0x73, 0x91, 0xfe, 0xbc, 0x7e, 0x48, 0xd2, 0x80, + 0x5e, 0x7e, 0xb3, 0x91, 0xfe, 0xbe, 0xb0, 0x0, 0x8, 0x5, 0x14, 0x7a, 0xb3, + 0x91, 0xfe, 0x7e, 0x73, 0x82, 0xe, 0xa, 0xc7, 0x1b, 0xc4, 0x7e, 0xb3, 0x92, + 0x0, 0x1a, 0x1b, 0xbd, 0x1c, 0x58, 0x5, 0x4, 0x7a, 0xb3, 0x92, 0x0, 0x7e, + 0xf3, 0x92, 0x1, 0x12, 0x2e, 0x38, 0x7d, 0x3, 0x80, 0x26, 0x1b, 0xf0, 0x6d, + 0x44, 0x7e, 0xe3, 0x92, 0x0, 0x80, 0xe, 0x12, 0x64, 0x78, 0xbd, 0x34, 0x8, + 0x5, 0x12, 0x64, 0x78, 0x7d, 0x43, 0x1b, 0xe0, 0x7e, 0x73, 0x91, 0xfe, 0xbc, + 0x7e, 0x8, 0xea, 0xbd, 0x40, 0x58, 0x2, 0x7d, 0x4, 0x7e, 0x73, 0x91, 0xff, + 0xbc, 0x7f, 0x48, 0xd2, 0x7e, 0x73, 0x92, 0x8, 0xa, 0x37, 0xad, 0x3d, 0x7e, + 0x24, 0x0, 0xa, 0x12, 0x1, 0x20, 0xbd, 0x30, 0x58, 0x12, 0x7e, 0x73, 0x59, + 0xec, 0xbe, 0x70, 0x28, 0x50, 0x9, 0x7c, 0xbd, 0x6c, 0x77, 0x12, 0x61, 0xaa, + 0xd2, 0x0, 0xb, 0xd0, 0x12, 0x64, 0x7f, 0x28, 0x2, 0x41, 0xd1, 0x30, 0x0, + 0x3, 0x12, 0x64, 0x8f, 0xda, 0x3b, 0x22, 0x7c, 0xbe, 0x7c, 0x7f, 0x2, 0x2e, + 0x40, 0x7e, 0x73, 0x67, 0x62, 0xbc, 0x7d, 0x22, 0x7d, 0x3c, 0x9d, 0x32, + 0xbe, 0x34, 0x0, 0x0, 0x22, 0xca, 0x79, 0x6c, 0xff, 0x6c, 0xee, 0x80, 0x31, + 0x7c, 0xbe, 0x12, 0x67, 0x50, 0x60, 0x28, 0x7e, 0x34, 0x0, 0x2, 0xca, 0x39, + 0xac, 0x7e, 0x2e, 0x34, 0x65, 0x60, 0x6d, 0x22, 0x7e, 0x30, 0x2, 0xac, 0x3f, + 0x2e, 0x14, 0x65, 0x60, 0x6d, 0x0, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x7c, 0xbf, + 0x7e, 0x70, 0x1, 0x12, 0x61, 0xaa, 0xb, 0xf0, 0xb, 0xe0, 0x12, 0x67, 0xd2, + 0x38, 0xca, 0x7a, 0xf3, 0x67, 0x62, 0xda, 0x79, 0x22, 0xca, 0xf8, 0x12, + 0x67, 0xcb, 0x7e, 0xb3, 0x67, 0x62, 0x70, 0x5, 0x12, 0x67, 0x99, 0x80, 0x65, + 0x7e, 0xb3, 0x59, 0x8b, 0x70, 0x5f, 0x7e, 0xb3, 0x59, 0x7d, 0xbe, 0xb0, 0x1, + 0x68, 0x56, 0x12, 0xb3, 0x5a, 0x92, 0x1, 0x20, 0x2a, 0x2, 0xc2, 0x0, 0x30, + 0x0, 0x9, 0x12, 0x67, 0x45, 0x7a, 0xb3, 0x3, 0xe5, 0x80, 0xa, 0x30, 0x1, + 0xd, 0x12, 0x67, 0x45, 0x7a, 0xb3, 0x3, 0xe6, 0x74, 0x1, 0x7a, 0xb3, 0x3, + 0xe4, 0x7e, 0xb3, 0x3, 0xe5, 0x60, 0x10, 0x6c, 0xff, 0x80, 0x3, 0x12, 0x65, + 0x4c, 0x12, 0x67, 0x3e, 0x38, 0xf8, 0xd2, 0x2, 0x80, 0x14, 0x7e, 0xb3, 0x3, + 0xe6, 0x60, 0xe, 0x6c, 0xff, 0x80, 0x3, 0x12, 0x65, 0x4c, 0x12, 0x67, 0x3e, + 0x38, 0xf8, 0xd2, 0x2, 0x30, 0x2, 0x3, 0x12, 0x64, 0x8f, 0xda, 0xf8, 0x22, + 0x7c, 0xbf, 0x6c, 0x77, 0x12, 0x61, 0xaa, 0xb, 0xf0, 0x22, 0x12, 0x64, 0xd4, + 0x12, 0x85, 0x49, 0x12, 0x64, 0x8f, 0x12, 0x61, 0xe5, 0x2, 0x65, 0x65, 0xca, + 0x3b, 0x7e, 0xd3, 0x67, 0x62, 0xa, 0x3d, 0x3e, 0x34, 0xca, 0x39, 0x7e, 0x18, + 0x65, 0x60, 0x7e, 0x8, 0x91, 0xfe, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x6c, 0x11, + 0x75, 0x27, 0x0, 0x6c, 0xcc, 0xc1, 0x42, 0x7e, 0x44, 0x3, 0xff, 0x7e, 0xe0, + 0xff, 0x6c, 0xff, 0x80, 0x5f, 0x7c, 0xbf, 0x12, 0x67, 0x50, 0x60, 0x56, + 0x12, 0x67, 0x71, 0xbe, 0x0, 0xff, 0x68, 0x4e, 0x9, 0x5, 0x91, 0xff, 0xa, + 0x10, 0x7e, 0x70, 0x2, 0xac, 0x7c, 0x9, 0x3, 0x59, 0xae, 0xa, 0x30, 0x7d, + 0x23, 0x9d, 0x21, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x4, 0x9d, 0x31, 0x80, 0x4, + 0x6d, 0x33, 0x9d, 0x32, 0x12, 0x67, 0x71, 0xa, 0xf0, 0x74, 0x2, 0xac, 0xbc, + 0x9, 0x5, 0x59, 0xad, 0xa, 0x10, 0x7d, 0x21, 0x9d, 0x2f, 0xbe, 0x24, 0x0, + 0x0, 0x8, 0x4, 0x9d, 0x1f, 0x80, 0x4, 0x6d, 0x11, 0x9d, 0x12, 0x2d, 0x13, + 0xbd, 0x41, 0x28, 0x4, 0x7d, 0x41, 0x7c, 0xef, 0xb, 0xf0, 0xbc, 0xdf, 0x38, + 0x9d, 0xbe, 0xe0, 0xff, 0x68, 0x46, 0x7e, 0x70, 0x2, 0xac, 0x7e, 0x9, 0xb3, + 0x91, 0xfe, 0x9, 0x73, 0x91, 0xff, 0x12, 0x2e, 0x40, 0x7d, 0x23, 0x74, 0x2, + 0xac, 0xbe, 0x9, 0xb5, 0x91, 0xfe, 0x12, 0x0, 0xfb, 0xbd, 0x23, 0x48, 0x25, + 0x7e, 0x70, 0x2, 0xac, 0x7e, 0x9, 0x3, 0x91, 0xfe, 0x7e, 0xa1, 0x27, 0x74, + 0x2, 0xa4, 0x19, 0x5, 0x92, 0x3a, 0x9, 0x3, 0x91, 0xff, 0x19, 0x5, 0x92, + 0x3b, 0x74, 0xff, 0x19, 0xb3, 0x91, 0xfe, 0xb, 0x10, 0x5, 0x27, 0xb, 0xc0, + 0x7e, 0x3, 0x59, 0xe9, 0xbc, 0xc, 0x28, 0x2, 0xa1, 0x87, 0x7c, 0xc1, 0x80, + 0x6b, 0x6d, 0x0, 0x7e, 0xe0, 0xff, 0x6c, 0xff, 0x80, 0x39, 0x7c, 0xbf, 0x12, + 0x67, 0x50, 0x60, 0x30, 0x7e, 0x30, 0x2, 0xac, 0x3f, 0x9, 0xb1, 0x91, 0xfe, + 0xbe, 0xb0, 0xff, 0x68, 0x22, 0x9, 0x71, 0x91, 0xff, 0x12, 0x2e, 0x40, 0x7d, + 0x43, 0xbd, 0x4, 0x58, 0x15, 0x7e, 0x70, 0x2, 0xac, 0x7f, 0x9, 0xb3, 0x91, + 0xfe, 0xf5, 0x28, 0x9, 0xb3, 0x91, 0xff, 0xf5, 0x29, 0x7d, 0x4, 0x7c, 0xef, + 0xb, 0xf0, 0xbc, 0xdf, 0x38, 0xc3, 0xbe, 0xe0, 0xff, 0x68, 0x1e, 0x7e, 0xa1, + 0x28, 0x12, 0x67, 0xe1, 0x19, 0xa1, 0x92, 0x3a, 0xe5, 0x29, 0x19, 0xb1, + 0x92, 0x3b, 0x7e, 0xa0, 0xff, 0x7e, 0x30, 0x2, 0xac, 0x3e, 0x19, 0xa1, 0x91, + 0xfe, 0x5, 0x27, 0xb, 0xc0, 0x7e, 0x73, 0x75, 0x8c, 0xbc, 0x7c, 0x38, 0x8d, + 0x7e, 0xa3, 0x75, 0x8d, 0x74, 0x2, 0xa4, 0xca, 0x59, 0x7e, 0x18, 0x92, 0x3a, + 0x7e, 0x8, 0x91, 0xfe, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x7e, 0xd1, 0x27, 0x12, + 0x67, 0x7a, 0x7e, 0x8, 0x59, 0xad, 0x74, 0xff, 0x12, 0x0, 0x2e, 0xbe, 0xd0, + 0x0, 0x28, 0x38, 0xa, 0x3d, 0x3e, 0x34, 0xca, 0x39, 0x7e, 0x18, 0x91, 0xfe, + 0x7e, 0x8, 0x65, 0x60, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0xa, 0x3d, 0x3e, 0x34, + 0xca, 0x39, 0x7e, 0x18, 0x91, 0xfe, 0x7e, 0x8, 0x59, 0xad, 0x12, 0x0, 0x6e, + 0x1b, 0xfd, 0x6c, 0xcc, 0x80, 0xa, 0x7c, 0xbc, 0x7e, 0x70, 0x1, 0x12, 0x61, + 0xaa, 0xb, 0xc0, 0xbc, 0xdc, 0x38, 0xf2, 0x7a, 0xd3, 0x59, 0xe9, 0x7a, 0xd3, + 0x67, 0x62, 0x7e, 0x73, 0x75, 0x8c, 0xbe, 0x73, 0x67, 0x62, 0x50, 0x4, 0x7a, + 0x73, 0x67, 0x62, 0xda, 0x3b, 0x22, 0x7e, 0x73, 0x67, 0x62, 0xbc, 0x7f, + 0x22, 0x7e, 0x37, 0x76, 0x5e, 0x7a, 0x37, 0x3, 0xe9, 0x74, 0x1, 0x22, 0x7c, + 0x7b, 0xc4, 0x23, 0x54, 0x1f, 0xa, 0x2b, 0x9, 0xa2, 0x65, 0xd8, 0x7c, 0xb7, + 0x54, 0x7, 0xa, 0x3b, 0x2e, 0x34, 0x0, 0x5e, 0x7a, 0x71, 0x82, 0x7a, 0x61, + 0x83, 0xe4, 0x93, 0x5c, 0xba, 0x22, 0x74, 0x2, 0xac, 0xbf, 0x9, 0x5, 0x91, + 0xfe, 0x22, 0x7e, 0x63, 0x75, 0x8c, 0x7e, 0x70, 0x2, 0xac, 0x67, 0x22, 0x12, + 0x67, 0x7a, 0x7e, 0x8, 0x30, 0xf1, 0xe4, 0x12, 0x0, 0x2e, 0x12, 0x67, 0x7a, + 0x7e, 0x8, 0x2e, 0x7a, 0x2, 0x0, 0x2e, 0x7e, 0x37, 0x3, 0xe9, 0xbe, 0x34, + 0x0, 0x0, 0x28, 0x7, 0x1b, 0x34, 0x7a, 0x37, 0x3, 0xe9, 0x22, 0xe4, 0x12, + 0x67, 0xe9, 0x7a, 0xb3, 0x3, 0xe4, 0x22, 0xca, 0x59, 0xca, 0x1b, 0xca, 0xb, + 0xc0, 0x83, 0xc0, 0x82, 0x12, 0x21, 0xcf, 0xd0, 0x82, 0xd0, 0x83, 0xda, 0xb, + 0xda, 0x1b, 0xda, 0x59, 0x32, 0xc2, 0x0, 0xc2, 0x1, 0xc2, 0x2, 0x22, 0x7e, + 0x73, 0x67, 0x62, 0xbc, 0x7e, 0x22, 0x2e, 0x24, 0x65, 0xd8, 0x7e, 0x29, + 0xb0, 0x22, 0x7e, 0x31, 0x27, 0x74, 0x2, 0xac, 0x3b, 0x22, 0x7a, 0xb3, 0x3, + 0xe5, 0x7a, 0xb3, 0x3, 0xe6, 0x22, 0x7e, 0x73, 0x82, 0xf, 0xa, 0xc7, 0x1b, + 0xc4, 0x22, 0xca, 0xb8, 0xca, 0x78, 0xa9, 0xc0, 0x93, 0xa9, 0xd3, 0xa7, + 0x12, 0x68, 0x1e, 0x75, 0x8, 0x0, 0x7e, 0x73, 0x37, 0xdf, 0xbe, 0x70, 0x6, + 0x40, 0x5, 0xe4, 0x7a, 0xb3, 0x37, 0xdf, 0xda, 0x78, 0xda, 0xb8, 0x32, 0x75, + 0x8, 0x0, 0xc2, 0x95, 0xa9, 0xc2, 0x93, 0x22, 0x7a, 0xb3, 0x9a, 0xbc, 0xc4, + 0x54, 0x7, 0xbe, 0xb0, 0x4, 0x68, 0x3, 0xb4, 0x2, 0x4, 0x74, 0x3, 0x80, 0x7, + 0x60, 0x3, 0xb4, 0x1, 0x7, 0x74, 0x1, 0x7a, 0xb3, 0x59, 0x62, 0x22, 0x74, + 0x1, 0x7a, 0xb3, 0x59, 0x62, 0xe4, 0x7a, 0xb3, 0x9a, 0xbc, 0x22, 0xbe, 0xb0, + 0xeb, 0x68, 0x3, 0xb4, 0xec, 0x33, 0x7e, 0x27, 0x9b, 0x20, 0x4d, 0x22, 0x78, + 0xe, 0xa5, 0xbf, 0xaa, 0xa, 0x7e, 0x24, 0x0, 0x1, 0x7a, 0x27, 0x9b, 0x20, + 0x15, 0xf, 0x7e, 0x27, 0x9b, 0x20, 0xbe, 0x24, 0x0, 0x1, 0x78, 0x10, 0xa5, + 0xbf, 0x9, 0x6, 0x7e, 0x34, 0x0, 0x2, 0x80, 0x2, 0x6d, 0x33, 0x7a, 0x37, + 0x9b, 0x20, 0x75, 0xf, 0xea, 0x22, 0xc4, 0x54, 0xf0, 0x7a, 0xb3, 0x9b, 0x1f, + 0x22, 0xe4, 0x7a, 0xb3, 0x9a, 0xbc, 0x7e, 0xb3, 0x9b, 0x1e, 0x54, 0xfb, + 0x7a, 0xb3, 0x9b, 0x1e, 0x7e, 0x8, 0x3, 0x10, 0x12, 0x68, 0xef, 0x7e, 0x8, + 0x3, 0x6a, 0x7e, 0x34, 0x0, 0x3e, 0x12, 0x0, 0x2e, 0x7e, 0x18, 0x3, 0x10, + 0x7a, 0x1f, 0x3, 0xc4, 0x75, 0x8, 0x0, 0x75, 0xf, 0x0, 0x7e, 0xb3, 0x9a, + 0xbc, 0xf5, 0x91, 0x2, 0x68, 0xce, 0x12, 0x68, 0xe7, 0x7e, 0xb3, 0x67, 0x75, + 0x54, 0xfe, 0xf5, 0x92, 0xd2, 0xe8, 0xc2, 0xc0, 0xa9, 0xd4, 0x95, 0xd2, + 0xad, 0xd2, 0x97, 0xd2, 0x94, 0x22, 0x75, 0x91, 0x0, 0xc2, 0x90, 0xc2, 0x91, + 0x22, 0x7e, 0x34, 0x0, 0x3e, 0x74, 0xff, 0x2, 0x0, 0x2e, 0xca, 0x3b, 0x7c, + 0xdb, 0x75, 0x27, 0x0, 0x6c, 0xcc, 0x75, 0x28, 0x0, 0x75, 0x29, 0x0, 0x6c, + 0xee, 0x75, 0x2c, 0x3, 0x7e, 0x18, 0x69, 0x19, 0x7a, 0x1f, 0x92, 0x2, 0x75, + 0x2d, 0x0, 0x7e, 0x18, 0x3, 0x10, 0x7a, 0x1f, 0x92, 0x6, 0x7e, 0xb3, 0x69, + 0x72, 0x70, 0xe, 0x7e, 0xb3, 0x69, 0x6e, 0x70, 0x8, 0x7e, 0xb3, 0x69, 0x6f, + 0x70, 0x2, 0x61, 0x56, 0x30, 0x24, 0xa, 0x7e, 0x8, 0x3, 0x6a, 0x7a, 0xf, + 0x92, 0x6, 0x80, 0x4, 0x7a, 0x1f, 0x92, 0x6, 0x7e, 0xf, 0x92, 0x6, 0x12, + 0x68, 0xef, 0x7e, 0xf, 0x92, 0x6, 0x2e, 0x14, 0x0, 0x3e, 0x7e, 0x34, 0x0, + 0x1c, 0x12, 0x9, 0xfc, 0x41, 0x95, 0x74, 0xd, 0xac, 0xbf, 0x49, 0x35, 0x68, + 0x15, 0x7a, 0x37, 0x91, 0xfe, 0x74, 0xd, 0xac, 0xbf, 0x49, 0x35, 0x68, 0x17, + 0x12, 0x6b, 0xaa, 0xf5, 0x2a, 0x7e, 0x73, 0x75, 0x8c, 0xbe, 0x71, 0x2a, + 0x38, 0x2, 0x41, 0x93, 0x7e, 0xa1, 0x2a, 0x5e, 0xa0, 0xf, 0x74, 0x8, 0xa4, + 0x7e, 0x1f, 0x92, 0x2, 0x2d, 0x35, 0x7e, 0x1b, 0xb0, 0xf5, 0x2c, 0x7e, 0x18, + 0x91, 0xfe, 0x7a, 0x1d, 0x2e, 0x7e, 0x18, 0x92, 0x0, 0x7a, 0x1d, 0x32, 0xe5, + 0x2a, 0x7e, 0x8, 0x0, 0x2c, 0x7e, 0x37, 0x91, 0xfe, 0x7e, 0x27, 0x92, 0x0, + 0x12, 0x6c, 0xda, 0xe5, 0x2c, 0xbe, 0xb0, 0x3, 0x78, 0x2, 0x41, 0x93, 0xe5, + 0x2c, 0xb4, 0x1, 0x3a, 0x75, 0x2b, 0x0, 0x80, 0x2c, 0x7e, 0x71, 0x2b, 0x74, + 0xd, 0xac, 0x7b, 0x9, 0xb3, 0x2, 0x78, 0x54, 0xf, 0xbe, 0xb1, 0x2a, 0x78, + 0x18, 0x49, 0x33, 0x2, 0x74, 0x7a, 0x37, 0x91, 0xfe, 0x7e, 0xa1, 0x2b, 0x74, + 0xd, 0xa4, 0x49, 0x35, 0x2, 0x76, 0x7a, 0x37, 0x92, 0x0, 0x80, 0xb, 0x5, + 0x2b, 0x7e, 0x73, 0x75, 0x8c, 0xbe, 0x71, 0x2b, 0x38, 0xcb, 0x85, 0x27, + 0x2e, 0x7e, 0x8, 0x0, 0x28, 0x7e, 0x18, 0x0, 0x29, 0x7c, 0xbf, 0x12, 0x6b, + 0xb7, 0x30, 0x23, 0x8, 0xc2, 0x23, 0x75, 0x28, 0x28, 0x75, 0x29, 0xa, 0x7e, + 0x37, 0x91, 0xfe, 0x5e, 0x60, 0xf, 0x7a, 0x37, 0x91, 0xfe, 0x7e, 0x37, 0x92, + 0x0, 0x5e, 0x60, 0xf, 0x7a, 0x37, 0x92, 0x0, 0x74, 0xd, 0xac, 0xbf, 0x9, + 0x75, 0x68, 0x19, 0xa, 0x57, 0x12, 0x49, 0x61, 0x7d, 0x35, 0x2e, 0x37, 0x92, + 0x0, 0x12, 0x6b, 0xaa, 0xbe, 0xb0, 0xff, 0x68, 0x18, 0xe5, 0x2c, 0xbe, 0xb0, + 0x1, 0x68, 0x2, 0x5, 0x27, 0xb, 0xe0, 0xe5, 0x2c, 0x12, 0x4f, 0xe1, 0x7d, + 0x35, 0x2e, 0x37, 0x91, 0xfe, 0x80, 0x8, 0x7e, 0x37, 0x91, 0xfe, 0x2e, 0x34, + 0xc0, 0x0, 0x7a, 0x37, 0x91, 0xfe, 0x12, 0x6b, 0x8a, 0x79, 0x30, 0x0, 0x2, + 0x7e, 0x37, 0x92, 0x0, 0x12, 0x6b, 0x8a, 0x79, 0x30, 0x0, 0x4, 0x7e, 0xa1, + 0x28, 0x12, 0x6b, 0x9e, 0x39, 0xa1, 0x0, 0x6, 0x7e, 0xa1, 0x29, 0x12, 0x6b, + 0x9e, 0x39, 0xa1, 0x0, 0x7, 0xb, 0xc0, 0xb, 0xf0, 0x7e, 0x73, 0x81, 0xeb, + 0xbc, 0x7f, 0x28, 0x2, 0x21, 0x5c, 0x7e, 0xb3, 0x59, 0x8b, 0xb4, 0x1, 0x52, + 0x74, 0x1, 0x12, 0x6b, 0x95, 0x7e, 0x73, 0x59, 0x8e, 0x7e, 0xf, 0x92, 0x6, + 0x39, 0x70, 0x0, 0x40, 0x7e, 0xb3, 0x69, 0x6f, 0xb4, 0x1, 0x3e, 0x7e, 0x73, + 0x9a, 0x4b, 0x7e, 0xf, 0x92, 0x6, 0x39, 0x70, 0x0, 0x41, 0x6c, 0xff, 0x80, + 0x20, 0x74, 0x4, 0xac, 0xbf, 0x49, 0x35, 0x96, 0x60, 0x12, 0x6b, 0x8e, 0x79, + 0x30, 0x0, 0x42, 0x74, 0x4, 0xac, 0xbf, 0x49, 0x35, 0x96, 0x62, 0x12, 0x6b, + 0x8e, 0x79, 0x30, 0x0, 0x44, 0xb, 0xf0, 0x7e, 0x73, 0x9a, 0x4b, 0xbc, 0x7f, + 0x38, 0xd8, 0x80, 0x4, 0xe4, 0x12, 0x6b, 0x95, 0xe5, 0x27, 0x7e, 0x1f, 0x92, + 0x6, 0x39, 0xb1, 0x0, 0x1, 0x7e, 0x33, 0x69, 0x6b, 0x7e, 0x1f, 0x92, 0x6, + 0x7a, 0x1b, 0x30, 0x7e, 0xb3, 0x59, 0x8b, 0xb4, 0x1, 0x1c, 0x7e, 0xb3, 0x69, + 0x6f, 0xb4, 0x1, 0x28, 0x74, 0x64, 0x7a, 0xb3, 0x9b, 0x83, 0xc2, 0x95, 0x75, + 0x2d, 0x1, 0x4c, 0xdd, 0x68, 0x16, 0xb2, 0x24, 0xc2, 0x86, 0x80, 0x10, 0xbe, + 0xe0, 0x0, 0x28, 0xe, 0x75, 0x2d, 0x1, 0x4c, 0xdd, 0x68, 0x4, 0xb2, 0x24, + 0xc2, 0x86, 0x12, 0x6c, 0xc8, 0xe4, 0x7a, 0xb3, 0x69, 0x72, 0x7a, 0xb3, + 0x69, 0x6e, 0x7a, 0xb3, 0x69, 0x6f, 0x80, 0x6, 0x4c, 0xdd, 0x68, 0x2, 0xd2, + 0x86, 0x6c, 0xff, 0x80, 0xe, 0x12, 0x6c, 0xb8, 0x2e, 0x34, 0x68, 0x15, 0x2e, + 0x14, 0x2, 0x74, 0x12, 0x6c, 0xc0, 0x12, 0x3f, 0x57, 0x38, 0xed, 0x4c, 0xee, + 0x78, 0xe, 0x7e, 0x70, 0xd, 0xac, 0x67, 0x7e, 0x8, 0x2, 0x74, 0x74, 0xff, + 0x12, 0x0, 0x2e, 0xe5, 0x2d, 0xda, 0x3b, 0x22, 0x74, 0x6, 0xac, 0xbc, 0x7e, + 0xf, 0x92, 0x6, 0x2d, 0x15, 0x22, 0x7e, 0x1f, 0x92, 0x6, 0x39, 0xb1, 0x0, + 0x3e, 0x22, 0x7e, 0x30, 0x6, 0xac, 0x3c, 0x7e, 0x1f, 0x92, 0x6, 0x2d, 0x31, + 0x22, 0x7a, 0x37, 0x92, 0x0, 0x74, 0xd, 0xac, 0xbf, 0x9, 0xb5, 0x68, 0x19, + 0x22, 0xca, 0x79, 0x7c, 0xfb, 0x7f, 0x51, 0x7f, 0x40, 0x74, 0xd, 0xac, 0xbf, + 0x9, 0xb5, 0x68, 0x1a, 0xf5, 0x2f, 0x74, 0xd, 0xac, 0xbf, 0x9, 0xb5, 0x68, + 0x1b, 0x1e, 0xb0, 0xbe, 0xb0, 0xf, 0x28, 0x2, 0x74, 0xf, 0xc4, 0x54, 0xf0, + 0xf5, 0x30, 0x74, 0xd, 0xac, 0xbf, 0x9, 0xe5, 0x68, 0x19, 0x7e, 0x73, 0x81, + 0xeb, 0xbc, 0x7e, 0x28, 0x58, 0x7e, 0xb3, 0x69, 0x70, 0x70, 0x28, 0x75, + 0x31, 0xf, 0x7e, 0x8, 0x0, 0x2f, 0xa, 0x3e, 0x2e, 0x34, 0x2, 0xfb, 0x6d, + 0x22, 0x74, 0x1, 0x12, 0x6c, 0x6c, 0x75, 0x31, 0x20, 0x7e, 0x8, 0x0, 0x30, + 0xa, 0x3e, 0x2e, 0x34, 0x3, 0x6, 0x74, 0x10, 0x12, 0x6c, 0x6c, 0x80, 0xe, + 0xa, 0x3e, 0x9, 0xb3, 0x2, 0xfb, 0xf5, 0x2f, 0x9, 0xb3, 0x3, 0x6, 0xf5, + 0x30, 0x74, 0x8, 0xac, 0xbe, 0x9, 0xb5, 0x69, 0x19, 0xb4, 0x1, 0x11, 0xe4, + 0xa, 0x3e, 0x19, 0xb3, 0x2, 0xfb, 0x19, 0xb3, 0x3, 0x6, 0x75, 0x2f, 0x0, + 0x75, 0x30, 0x0, 0x7e, 0xb3, 0x81, 0xff, 0xb4, 0xff, 0x11, 0x85, 0x2e, 0x2f, + 0x75, 0x2f, 0x0, 0x12, 0x6b, 0xae, 0xbe, 0xb0, 0xff, 0x68, 0x3, 0x75, 0x2f, + 0x1, 0xe5, 0x2f, 0x7a, 0x4b, 0xb0, 0xe5, 0x30, 0x7a, 0x5b, 0xb0, 0xda, 0x79, + 0x22, 0x7c, 0x9b, 0x7e, 0x1b, 0xa0, 0x4c, 0xaa, 0x78, 0x7, 0x7e, 0xb, 0xb0, + 0x7a, 0x1b, 0xb0, 0x22, 0xa, 0xda, 0x7e, 0xb, 0x80, 0xa, 0xe8, 0x7d, 0xfe, + 0x9d, 0xfd, 0xbe, 0xf4, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xed, 0x80, 0x4, 0x6d, + 0xee, 0x9d, 0xef, 0xe5, 0x31, 0xa, 0xfb, 0xbd, 0xef, 0x8, 0xf, 0xbc, 0x8a, + 0x7c, 0xba, 0x28, 0x4, 0x2c, 0xb9, 0x80, 0x2, 0x9c, 0xb9, 0x7a, 0x1b, 0xb0, + 0x7e, 0x1b, 0x70, 0x7a, 0xb, 0x70, 0x22, 0x74, 0x1, 0x2, 0x68, 0xf8, 0x7e, + 0x30, 0xd, 0xac, 0x3f, 0x7d, 0x31, 0x22, 0x74, 0xd, 0x12, 0x1, 0xf3, 0xb, + 0xf0, 0x22, 0x7e, 0xb3, 0x3, 0xc8, 0x4, 0x7a, 0xb3, 0x3, 0xc8, 0x7e, 0x73, + 0x3, 0xc8, 0x7a, 0x73, 0x59, 0x4a, 0x22, 0x7d, 0xf2, 0x7d, 0xe3, 0x7f, 0x60, + 0x7c, 0xab, 0x7e, 0xb3, 0x9b, 0xa8, 0x60, 0x6, 0x7e, 0xb3, 0x9b, 0xaf, 0x70, + 0x3, 0xc2, 0x22, 0x22, 0x7e, 0xb7, 0x76, 0x1b, 0x1b, 0xb4, 0x20, 0x22, 0x2, + 0xc1, 0xf7, 0x7e, 0x73, 0x69, 0x69, 0xbe, 0x70, 0x1, 0x28, 0x17, 0x7e, 0x63, + 0x2, 0x73, 0xbc, 0x6a, 0x68, 0x2, 0xe1, 0x82, 0x7e, 0x6b, 0xb0, 0xb4, 0x2, + 0x4, 0xe4, 0x7a, 0x6b, 0xb0, 0xc2, 0x22, 0x22, 0xa5, 0xbf, 0x0, 0x71, 0x7e, + 0xb3, 0x2, 0x73, 0xbc, 0xba, 0x68, 0x2, 0xe1, 0x82, 0x7e, 0x6b, 0xb0, 0xb4, + 0x1, 0x5e, 0xe4, 0x7a, 0x6b, 0xb0, 0x7e, 0x7, 0x2, 0xf6, 0x7e, 0x1d, 0x2e, + 0x1b, 0x1a, 0x0, 0x7e, 0x7, 0x2, 0xf8, 0x7e, 0x1d, 0x32, 0x1b, 0x1a, 0x0, + 0xd2, 0x23, 0x6c, 0x77, 0x7e, 0x10, 0x8, 0xac, 0x1a, 0x19, 0x70, 0x69, 0x19, + 0x7e, 0x10, 0x8, 0xac, 0x1a, 0x19, 0x70, 0x69, 0x1a, 0x7e, 0xb3, 0x2, 0x4a, + 0x4, 0x7a, 0xb3, 0x2, 0x4a, 0xe4, 0x7a, 0xb3, 0x69, 0x6e, 0x12, 0x6f, 0xe3, + 0x7e, 0x7, 0x2, 0xf6, 0x7e, 0x70, 0x8, 0xac, 0x7a, 0x59, 0x3, 0x69, 0x1b, + 0x7e, 0x7, 0x2, 0xf8, 0x7e, 0x70, 0x8, 0xac, 0x7a, 0x59, 0x3, 0x69, 0x1d, + 0x7c, 0xba, 0x12, 0x6f, 0xed, 0xc2, 0x22, 0x22, 0x7e, 0xb3, 0x2, 0x73, 0xbc, + 0xba, 0x68, 0x2, 0xe1, 0x82, 0x7e, 0x6b, 0xb0, 0xb4, 0x2, 0x22, 0xe4, 0x7a, + 0x6b, 0xb0, 0x5, 0x18, 0x7d, 0x3f, 0x9e, 0x37, 0x2, 0xf8, 0x12, 0x0, 0xa3, + 0xbe, 0x34, 0x0, 0x2, 0x18, 0xd, 0xe5, 0x18, 0xbe, 0xb0, 0x4, 0x50, 0x6, + 0x74, 0x3, 0x7a, 0x6b, 0xb0, 0x22, 0x7d, 0xde, 0x9e, 0xd7, 0x2, 0xf6, 0x7d, + 0xd, 0x7d, 0x3f, 0x9e, 0x37, 0x2, 0xf8, 0x7e, 0xc4, 0x0, 0x5, 0xad, 0x3c, + 0xbe, 0x4, 0x0, 0x14, 0x8, 0x6, 0x7e, 0x4, 0x0, 0x14, 0x80, 0xa, 0xbe, 0x4, + 0xff, 0xec, 0x58, 0x4, 0x7e, 0x4, 0xff, 0xec, 0x7e, 0xa3, 0x2, 0xfa, 0xbe, + 0xa0, 0x1, 0x78, 0x4d, 0xbe, 0x34, 0x0, 0x0, 0x18, 0x2, 0xc1, 0xf4, 0x7e, + 0x47, 0x2, 0xf8, 0x9d, 0x43, 0xbe, 0x44, 0x0, 0x4b, 0x58, 0x6, 0x7e, 0x44, + 0x0, 0x4b, 0x80, 0x1b, 0xbe, 0x34, 0x0, 0x3, 0x8, 0x15, 0xbe, 0x44, 0x0, + 0x69, 0x58, 0xf, 0x7d, 0x34, 0x9e, 0x34, 0x0, 0x5a, 0x12, 0x6f, 0xdc, 0x7d, + 0x43, 0x2e, 0x44, 0x0, 0x4b, 0x12, 0x6f, 0x97, 0x7e, 0x17, 0x2, 0xf6, 0x12, + 0x6f, 0xd5, 0x58, 0x4, 0x6d, 0x11, 0x80, 0x58, 0xbd, 0xb1, 0x50, 0x54, 0x7d, + 0x1b, 0x80, 0x50, 0xbe, 0xa0, 0x2, 0x78, 0x53, 0xbe, 0x34, 0x0, 0x0, 0x48, + 0x2, 0xc1, 0xf4, 0x7d, 0x2c, 0x12, 0x1, 0x20, 0x7e, 0x47, 0x2, 0xf8, 0x9d, + 0x43, 0x7e, 0xc7, 0x76, 0x29, 0x7d, 0xec, 0x1b, 0xe4, 0xbd, 0xe4, 0x50, 0x2, + 0x7d, 0x4e, 0xb, 0xf5, 0xbe, 0xf7, 0x2, 0xf8, 0x50, 0xc, 0x7d, 0xfc, 0x9e, + 0xf4, 0x0, 0xb, 0xbd, 0xf4, 0x50, 0x2, 0x7d, 0x4e, 0x12, 0x6f, 0x97, 0x12, + 0x6f, 0x9e, 0xbe, 0x14, 0x0, 0x0, 0x58, 0x4, 0x6d, 0x11, 0x80, 0x6, 0xbd, + 0xb1, 0x50, 0x2, 0x7d, 0x1b, 0x7e, 0x1d, 0x2e, 0x1b, 0x1a, 0x10, 0x80, 0x59, + 0xbe, 0xa0, 0x3, 0x78, 0x29, 0x7d, 0xd, 0xbe, 0x4, 0x0, 0x0, 0x58, 0x4c, + 0x12, 0x6f, 0x9e, 0x7e, 0x7, 0x76, 0x1b, 0x1b, 0x4, 0xbd, 0x1, 0x50, 0x2, + 0x7d, 0x10, 0x12, 0x6f, 0xb7, 0x58, 0x4, 0x6d, 0x44, 0x80, 0x31, 0x12, 0x6f, + 0xae, 0x50, 0x2c, 0x7d, 0x40, 0x80, 0x28, 0xbe, 0xa0, 0x4, 0x78, 0x26, 0x7d, + 0xd, 0xbe, 0x4, 0x0, 0x0, 0x8, 0x1e, 0x12, 0x6f, 0x9e, 0xbe, 0x14, 0x0, 0x0, + 0x58, 0x2, 0x6d, 0x11, 0x12, 0x6f, 0xb7, 0x58, 0x4, 0x6d, 0x44, 0x80, 0x7, + 0x12, 0x6f, 0xae, 0x50, 0x2, 0x7d, 0x40, 0x12, 0x6f, 0x97, 0xc2, 0x22, 0x22, + 0xbe, 0xf4, 0x0, 0x50, 0x28, 0x25, 0xbe, 0xf4, 0x0, 0xcd, 0x50, 0x1f, 0xbe, + 0xe4, 0x1, 0x7c, 0x28, 0x19, 0xbe, 0xe4, 0x2, 0xbc, 0x50, 0x13, 0x7e, 0xb3, + 0x69, 0x69, 0xb4, 0x1, 0xc, 0x7e, 0x6b, 0xb0, 0x70, 0x7, 0x12, 0x6f, 0x83, + 0x74, 0x1, 0x80, 0x59, 0xbe, 0xf4, 0x7, 0xc2, 0x28, 0x25, 0xbe, 0xe4, 0x0, + 0x1e, 0x28, 0x1f, 0xbe, 0xe4, 0x4, 0x1a, 0x50, 0x19, 0x7e, 0xb3, 0x69, 0x69, + 0xb4, 0x1, 0x12, 0x7e, 0x6b, 0xb0, 0x70, 0xd, 0x7e, 0xb3, 0x59, 0x47, 0x70, + 0x3c, 0x12, 0x6f, 0x83, 0x74, 0x2, 0x80, 0x2e, 0xbe, 0xe4, 0x4, 0x5, 0x28, + 0x11, 0x7e, 0xb3, 0x69, 0x69, 0xb4, 0x1, 0xa, 0x7e, 0x6b, 0xb0, 0x70, 0x5, + 0x12, 0x6f, 0x83, 0x80, 0x17, 0xbe, 0xe4, 0x0, 0x32, 0x50, 0x18, 0x7e, 0xb3, + 0x69, 0x69, 0xb4, 0x1, 0x11, 0x7e, 0x6b, 0xb0, 0x70, 0xc, 0x12, 0x6f, 0x83, + 0x74, 0x4, 0x7a, 0xb3, 0x2, 0xfa, 0x75, 0x18, 0x0, 0x22, 0x74, 0x3, 0x7a, + 0x6b, 0xb0, 0x7a, 0xa3, 0x2, 0x73, 0x7a, 0xe7, 0x2, 0xf6, 0x7a, 0xf7, 0x2, + 0xf8, 0xd2, 0x22, 0x22, 0x7e, 0x1d, 0x32, 0x1b, 0x1a, 0x40, 0x22, 0x7e, + 0x24, 0x0, 0x2, 0x7d, 0x30, 0x12, 0x1, 0x20, 0x7e, 0x17, 0x2, 0xf6, 0x9d, + 0x13, 0x22, 0x7e, 0x7, 0x76, 0x29, 0x1b, 0x4, 0xbd, 0x4, 0x22, 0x7e, 0x1d, + 0x2e, 0x1b, 0x1a, 0x10, 0x7d, 0x3f, 0x9e, 0x37, 0x2, 0xf8, 0x7e, 0x24, 0x0, + 0x2, 0x12, 0x1, 0x20, 0x7e, 0x47, 0x2, 0xf8, 0x9d, 0x43, 0xbe, 0x44, 0x0, + 0x0, 0x22, 0x9d, 0x10, 0xbe, 0x14, 0x0, 0x0, 0x22, 0x7e, 0x24, 0x0, 0x2, + 0x2, 0x1, 0x20, 0x7e, 0xb3, 0x69, 0x69, 0x4, 0x7a, 0xb3, 0x69, 0x69, 0x22, + 0x7c, 0xab, 0x74, 0x1, 0xa, 0x3a, 0x19, 0xb3, 0x1, 0x32, 0x22, 0x7c, 0x6b, + 0x24, 0xdd, 0x68, 0x42, 0x24, 0xfd, 0x68, 0x3e, 0x1b, 0xb1, 0x68, 0x3a, + 0x24, 0xfa, 0x68, 0x36, 0x14, 0x68, 0x33, 0x80, 0x0, 0xa5, 0xbe, 0x25, 0x7, + 0xd2, 0x21, 0x7a, 0x73, 0x59, 0x39, 0x22, 0xbe, 0x60, 0x40, 0x68, 0x9, 0xbe, + 0x60, 0x41, 0x68, 0x4, 0xa5, 0xbe, 0xb, 0x2, 0xd2, 0x20, 0xa5, 0xbe, 0x50, + 0xa, 0xa5, 0xbf, 0x1, 0x6, 0x74, 0x5, 0x7a, 0xb3, 0x9b, 0x83, 0xa, 0x26, + 0x19, 0x72, 0x59, 0x3b, 0xd2, 0x1f, 0x22, 0x7e, 0x34, 0x59, 0x3b, 0x30, + 0x1f, 0x42, 0xc2, 0x1f, 0x7e, 0x39, 0x50, 0xa, 0x25, 0x12, 0x16, 0xf6, 0x7a, + 0x27, 0x81, 0xed, 0x9, 0x53, 0x0, 0x1, 0xa, 0x25, 0x12, 0x16, 0xf6, 0x7a, + 0x27, 0x81, 0xef, 0x9, 0x53, 0x0, 0x2, 0xa, 0x25, 0x12, 0x16, 0xf6, 0x7a, + 0x27, 0x81, 0xf3, 0x9, 0x53, 0x0, 0x3, 0xa, 0x25, 0x12, 0x16, 0xf6, 0x7a, + 0x27, 0x81, 0xf5, 0x9, 0x73, 0x0, 0x5, 0x12, 0x70, 0x93, 0x3e, 0x34, 0x7a, + 0x37, 0x81, 0xfd, 0x7e, 0x37, 0x81, 0xed, 0x7a, 0x37, 0x59, 0xab, 0x22, 0xa, + 0x37, 0x3e, 0x34, 0x3e, 0x34, 0x3e, 0x34, 0x3e, 0x34, 0x22, 0x7e, 0x57, + 0x75, 0x96, 0xbe, 0x54, 0x0, 0xc0, 0x50, 0x6, 0x7e, 0x54, 0x0, 0xc0, 0x80, + 0xa, 0xbe, 0x54, 0x1, 0x20, 0x28, 0x4, 0x7e, 0x54, 0x1, 0x20, 0x1e, 0x54, + 0x1e, 0x54, 0x1e, 0x54, 0x1e, 0x54, 0x1e, 0x54, 0x22, 0x7e, 0x18, 0x1d, + 0xa0, 0x7a, 0x1f, 0x2d, 0x2a, 0x7e, 0x18, 0x4, 0x0, 0x7a, 0x1f, 0x2d, 0x2e, + 0x7e, 0xf, 0x2d, 0x2a, 0x12, 0x70, 0xf9, 0x7e, 0xf, 0x2d, 0x2e, 0x7e, 0x34, + 0x5, 0x20, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x2d, 0x0, 0x7e, 0x34, 0x0, 0x26, + 0x12, 0x0, 0x2e, 0x7a, 0xb3, 0x2e, 0x74, 0x22, 0x7e, 0x8, 0x3a, 0x0, 0x7e, + 0x34, 0x5, 0x20, 0xe4, 0x2, 0x0, 0x2e, 0x7e, 0x34, 0xb, 0x87, 0xca, 0x39, + 0x7e, 0x18, 0x69, 0xe4, 0x7e, 0x8, 0x82, 0xa, 0x12, 0x0, 0x6e, 0x1b, 0xfd, + 0x7e, 0x37, 0x82, 0x37, 0x2e, 0x37, 0x82, 0x35, 0x7a, 0x37, 0x8d, 0x94, + 0x7e, 0x73, 0x75, 0x8d, 0x7a, 0x73, 0x39, 0xf7, 0x7e, 0xb3, 0x69, 0xea, + 0x7e, 0x73, 0x69, 0xeb, 0x12, 0x0, 0x29, 0x7e, 0xb3, 0x76, 0x16, 0x70, 0x6, + 0x7e, 0x63, 0x82, 0xd, 0x80, 0x4, 0x7e, 0x63, 0x82, 0xc, 0x7e, 0x70, 0x40, + 0xac, 0x67, 0x1b, 0x34, 0x7a, 0x37, 0x8d, 0x96, 0x22, 0x7e, 0x8, 0x65, 0x60, + 0x7e, 0x34, 0x2, 0x19, 0xe4, 0x12, 0x0, 0x2e, 0x7e, 0x63, 0x75, 0x8d, 0x7e, + 0x70, 0xd, 0xac, 0x67, 0x7e, 0x8, 0x65, 0xdc, 0x74, 0xff, 0x2, 0x0, 0x2e, + 0x7e, 0x37, 0x76, 0x42, 0x7a, 0x37, 0x67, 0x7b, 0x7e, 0x37, 0x76, 0x44, + 0x7a, 0x37, 0x67, 0x7d, 0x7e, 0x37, 0x76, 0x46, 0x7a, 0x37, 0x67, 0x7f, + 0x7e, 0x73, 0x76, 0x48, 0x7a, 0x73, 0x67, 0x81, 0x7e, 0x73, 0x76, 0x49, + 0x7a, 0x73, 0x67, 0x82, 0xe4, 0x7a, 0xb3, 0x67, 0x86, 0x7a, 0xb3, 0x67, + 0x87, 0x22, 0x7e, 0x73, 0x75, 0x8c, 0x7a, 0x73, 0x81, 0xeb, 0x12, 0x72, 0x5, + 0x12, 0x72, 0xe, 0x12, 0x71, 0xfc, 0x12, 0x72, 0x17, 0x12, 0x72, 0x31, 0x6d, + 0x33, 0x9e, 0x37, 0x75, 0xa2, 0x7a, 0x37, 0x81, 0xf7, 0x12, 0x72, 0x22, + 0x7a, 0x37, 0x81, 0xfb, 0x7e, 0x73, 0x75, 0xd8, 0x7a, 0x73, 0x81, 0xff, + 0x7e, 0x73, 0x75, 0x8f, 0x7a, 0x73, 0x82, 0x0, 0xbe, 0x70, 0x14, 0x50, 0x6, + 0x74, 0x14, 0x7a, 0xb3, 0x82, 0x0, 0x7e, 0x37, 0x75, 0x90, 0x7a, 0x37, 0x82, + 0x1, 0x7e, 0x37, 0x75, 0xa8, 0x7a, 0x37, 0x81, 0xfd, 0xe4, 0x7a, 0xb3, 0x82, + 0x3, 0x7a, 0xb3, 0x82, 0x4, 0x22, 0x7e, 0x37, 0x75, 0x98, 0x7a, 0x37, 0x81, + 0xef, 0x22, 0x7e, 0x73, 0x75, 0x8e, 0x7a, 0x73, 0x81, 0xec, 0x22, 0x7e, + 0x37, 0x75, 0x96, 0x7a, 0x37, 0x81, 0xed, 0x22, 0x6d, 0x33, 0x9e, 0x37, + 0x75, 0x9a, 0x7a, 0x37, 0x81, 0xf1, 0x22, 0x7e, 0x37, 0x75, 0xa4, 0x7a, + 0x37, 0x81, 0xf9, 0x6d, 0x33, 0x9e, 0x37, 0x75, 0xa6, 0x22, 0x7e, 0x37, + 0x75, 0x9e, 0x7a, 0x37, 0x81, 0xf3, 0x7e, 0x37, 0x75, 0xa0, 0x7a, 0x37, + 0x81, 0xf5, 0x22, 0x12, 0x17, 0x1, 0x12, 0x74, 0xb0, 0x2, 0x72, 0x4b, 0xca, + 0xf8, 0x12, 0x74, 0xbb, 0x12, 0x72, 0x64, 0x6c, 0xff, 0x7c, 0xbf, 0x12, + 0x18, 0x67, 0xb, 0xf0, 0xbe, 0xf0, 0x4, 0x40, 0xf4, 0xda, 0xf8, 0x22, 0xca, + 0x3b, 0x6d, 0xee, 0x12, 0x5f, 0xbc, 0x60, 0xa, 0x7e, 0x97, 0x82, 0x37, 0x7e, + 0x87, 0x82, 0x35, 0x80, 0x8, 0x7e, 0x97, 0x82, 0x35, 0x7e, 0x87, 0x82, 0x37, + 0x7d, 0xd8, 0x2d, 0xd9, 0x7e, 0x8, 0x93, 0x70, 0x12, 0x74, 0xb3, 0x6d, 0xbb, + 0x80, 0x38, 0x12, 0x74, 0xa3, 0x60, 0x19, 0x7d, 0x5a, 0x12, 0x4e, 0xa, 0x60, + 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3a, 0x12, 0x4e, 0x2e, 0x3e, 0x34, + 0x2e, 0x34, 0x93, 0x9e, 0x80, 0x17, 0x7d, 0x5a, 0x12, 0x4e, 0xa, 0x60, 0x5, + 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3a, 0x12, 0x4e, 0x2e, 0x3e, 0x34, + 0x2e, 0x34, 0x93, 0x70, 0x12, 0x74, 0x98, 0xbd, 0x9b, 0x38, 0xc4, 0x7d, + 0xb9, 0x80, 0x38, 0x12, 0x74, 0xa3, 0x60, 0x19, 0x7d, 0x5a, 0x12, 0x4e, 0xa, + 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3a, 0x12, 0x4e, 0x2e, 0x3e, + 0x34, 0x2e, 0x34, 0x93, 0x70, 0x80, 0x17, 0x7d, 0x5a, 0x12, 0x4e, 0xa, 0x60, + 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3a, 0x12, 0x4e, 0x2e, 0x3e, 0x34, + 0x2e, 0x34, 0x93, 0x9e, 0x12, 0x74, 0x98, 0xbd, 0xdb, 0x38, 0xc4, 0x6d, + 0xbb, 0x80, 0x1e, 0x7d, 0xb, 0x3e, 0x4, 0x49, 0x20, 0x69, 0xee, 0x12, 0x74, + 0x8d, 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x12, 0x74, 0x4d, 0x3e, 0x24, + 0x2e, 0x24, 0x93, 0x70, 0x12, 0x74, 0x82, 0x7e, 0x73, 0x69, 0xed, 0xa, 0x37, + 0xbd, 0x3b, 0x38, 0xd8, 0x6d, 0xbb, 0x80, 0x1e, 0x7d, 0xb, 0x3e, 0x4, 0x49, + 0x20, 0x69, 0xff, 0x12, 0x74, 0x8d, 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, + 0x12, 0x74, 0x4d, 0x3e, 0x24, 0x2e, 0x24, 0x93, 0x9e, 0x12, 0x74, 0x82, + 0x7e, 0x73, 0x69, 0xfe, 0xa, 0x37, 0xbd, 0x3b, 0x38, 0xd8, 0x6d, 0x33, 0x7d, + 0xf3, 0x7d, 0xe3, 0x7d, 0xb3, 0x7d, 0xab, 0x1e, 0xa4, 0x1e, 0xa4, 0x7d, + 0x2b, 0x7c, 0xa5, 0x7e, 0x17, 0x8d, 0xe8, 0x7c, 0xba, 0x60, 0x5, 0x1e, 0x14, + 0x14, 0x78, 0xfb, 0x5e, 0x14, 0x0, 0xf, 0x7e, 0x27, 0x8d, 0xec, 0x12, 0x74, + 0x6e, 0x78, 0x2, 0x7d, 0xfa, 0x7e, 0x17, 0x8d, 0xfa, 0x7c, 0xba, 0x60, 0x5, + 0x1e, 0x14, 0x14, 0x78, 0xfb, 0x5e, 0x14, 0x0, 0xf, 0x7e, 0x27, 0x8d, 0xfe, + 0x12, 0x74, 0x6e, 0x78, 0x2, 0x7d, 0xea, 0xb, 0xb6, 0xbe, 0xb4, 0x0, 0xf, + 0x40, 0xb6, 0x12, 0x5f, 0xd1, 0x7d, 0xb3, 0x7d, 0xab, 0x2e, 0xa4, 0x1, 0x24, + 0x7d, 0x5b, 0x2d, 0x5f, 0x12, 0x74, 0x77, 0x3e, 0x44, 0x49, 0x74, 0x93, + 0x70, 0x5e, 0x54, 0x0, 0xf, 0x60, 0x5, 0x1e, 0x74, 0x14, 0x78, 0xfb, 0x12, + 0x74, 0x65, 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x7d, 0x2a, 0x12, 0x74, + 0x53, 0x3e, 0x24, 0x2e, 0x24, 0x93, 0x70, 0x12, 0x74, 0x5c, 0x7d, 0x5b, + 0x2d, 0x5e, 0x12, 0x74, 0x77, 0x3e, 0x44, 0x49, 0x74, 0x93, 0x9e, 0x5e, + 0x54, 0x0, 0xf, 0x60, 0x5, 0x1e, 0x74, 0x14, 0x78, 0xfb, 0x12, 0x74, 0x65, + 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x7d, 0x2a, 0x12, 0x74, 0x53, 0x3e, + 0x24, 0x2e, 0x24, 0x93, 0x9e, 0x12, 0x74, 0x5c, 0xb, 0xb4, 0xbe, 0xb4, 0x0, + 0x24, 0x78, 0x92, 0x6d, 0xbb, 0x7e, 0x74, 0x0, 0xee, 0xad, 0x7b, 0x2e, 0x74, + 0x1, 0x1e, 0x7d, 0x37, 0x7e, 0x8, 0x93, 0x70, 0x12, 0x17, 0x8b, 0x7d, 0x37, + 0x7e, 0x8, 0x93, 0x9e, 0x12, 0x17, 0x2a, 0x12, 0x4c, 0x34, 0x40, 0xdf, 0xda, + 0x3b, 0x22, 0x7d, 0x13, 0x6e, 0x14, 0xff, 0xff, 0x1e, 0x24, 0x1e, 0x24, + 0x1e, 0x24, 0x1e, 0x24, 0x22, 0xb, 0x28, 0x30, 0x4d, 0x31, 0x1b, 0x28, 0x30, + 0x22, 0x7d, 0x5a, 0x5e, 0x54, 0x0, 0xf, 0xa, 0x1f, 0x22, 0xa, 0x24, 0x5e, + 0x24, 0x0, 0xf, 0xbd, 0x12, 0x22, 0x7d, 0x45, 0x1e, 0x44, 0x1e, 0x44, 0x1e, + 0x44, 0x1e, 0x44, 0x22, 0xb, 0x28, 0x30, 0x5d, 0x31, 0x1b, 0x28, 0x30, 0xb, + 0xb4, 0x22, 0x7d, 0x52, 0x5e, 0x54, 0x0, 0xf, 0x7e, 0x34, 0x0, 0x1, 0x22, + 0xb, 0x38, 0xc0, 0x4d, 0xc2, 0x1b, 0x38, 0xc0, 0xb, 0xb4, 0x22, 0x7d, 0xcb, + 0x3e, 0xc4, 0x49, 0xac, 0x82, 0x51, 0x7e, 0xb3, 0x69, 0xec, 0x22, 0x2, 0x17, + 0x40, 0x7e, 0x34, 0x0, 0x5c, 0xe4, 0x2, 0x0, 0x2e, 0x6c, 0xaa, 0x7e, 0x30, + 0x3c, 0xac, 0x3a, 0x12, 0x1a, 0xd3, 0x7e, 0x34, 0x0, 0x3c, 0xe4, 0x12, 0x0, + 0x2e, 0xb, 0xa0, 0xbe, 0xa0, 0x4, 0x40, 0xe9, 0x22, 0xca, 0xd8, 0xca, 0x79, + 0x7c, 0xf7, 0x7c, 0xeb, 0x6c, 0xdd, 0x74, 0x8, 0xac, 0xbd, 0x19, 0xe5, 0x9b, + 0x25, 0x19, 0xf5, 0x9b, 0x26, 0xb, 0xd0, 0xbe, 0xd0, 0x4, 0x78, 0xed, 0x6c, + 0xdd, 0x74, 0xee, 0xac, 0xbd, 0x12, 0x75, 0xca, 0x7a, 0xf1, 0x29, 0x7e, + 0x70, 0x3c, 0xac, 0x7d, 0x7d, 0x13, 0x12, 0x1a, 0xc7, 0x2e, 0x34, 0x8e, + 0x5a, 0x6d, 0x22, 0x7c, 0xbe, 0x12, 0x75, 0x3f, 0x7d, 0x3f, 0xb, 0x34, 0x74, + 0x3c, 0xac, 0xbd, 0x49, 0x25, 0x8e, 0x2a, 0x12, 0x75, 0x33, 0xac, 0xbd, + 0x12, 0x75, 0xd1, 0xb, 0xd0, 0xbe, 0xd0, 0x4, 0x40, 0xc6, 0xda, 0x79, 0xda, + 0xd8, 0x22, 0x12, 0x12, 0x86, 0x7d, 0x3f, 0x2e, 0x34, 0x0, 0x19, 0x74, 0x3c, + 0x22, 0xb, 0xa, 0x40, 0x5e, 0x80, 0xc7, 0x1b, 0xa, 0x40, 0x54, 0x7, 0xa, + 0x5b, 0x7d, 0x45, 0x7c, 0x89, 0x6c, 0x99, 0x3e, 0x44, 0x3e, 0x44, 0x3e, + 0x44, 0xb, 0xa, 0x50, 0x4d, 0x54, 0x12, 0x75, 0x7f, 0x5e, 0x20, 0xe3, 0x1b, + 0x1a, 0x10, 0xe5, 0x29, 0x54, 0x7, 0xa, 0x1b, 0x7d, 0x1, 0x7c, 0x1, 0x6c, + 0x11, 0x3e, 0x4, 0x3e, 0x4, 0xb, 0x1a, 0x10, 0x4d, 0x10, 0x1b, 0x1a, 0x10, + 0x22, 0x1b, 0xa, 0x50, 0xb, 0x1a, 0x10, 0x22, 0xb, 0xa, 0x50, 0x4e, 0xa0, + 0x10, 0x1b, 0xa, 0x50, 0xb, 0x1a, 0x50, 0x4e, 0x54, 0x40, 0xa, 0x1b, 0x1a, + 0x50, 0xb, 0xa, 0x50, 0x30, 0x9, 0xc, 0x4e, 0xa0, 0x8, 0x12, 0x75, 0x7f, + 0x4e, 0x14, 0x20, 0x5, 0x80, 0xa, 0x5e, 0xa0, 0xf7, 0x12, 0x75, 0x7f, 0x5e, + 0x14, 0xdf, 0xfa, 0x1b, 0x1a, 0x10, 0x22, 0xb, 0xa, 0x50, 0x5e, 0xa0, 0xef, + 0x12, 0x75, 0x7f, 0x5e, 0x14, 0xbf, 0xf5, 0x1b, 0x1a, 0x10, 0x22, 0x7d, + 0xf5, 0x2e, 0xf4, 0x1, 0x0, 0x22, 0x49, 0x25, 0x8e, 0x5a, 0x2, 0x12, 0x86, + 0xd2, 0x2, 0x60, 0x3, 0xb4, 0x2, 0x2, 0xc2, 0x2, 0xa2, 0x2, 0x22, 0xca, + 0xf8, 0x7c, 0x8b, 0x7e, 0x68, 0x1d, 0xa0, 0x7e, 0x93, 0x82, 0xd, 0x7a, 0x93, + 0x91, 0xff, 0x7e, 0x93, 0x82, 0xc, 0x7a, 0x93, 0x91, 0xfe, 0x12, 0x77, 0x9, + 0x6d, 0x33, 0x7a, 0x37, 0x92, 0x8, 0xbe, 0x80, 0x2, 0x78, 0x6, 0x7e, 0x68, + 0x27, 0xe0, 0x80, 0x4, 0x7e, 0x68, 0x1d, 0xa0, 0x6c, 0xff, 0x7e, 0x70, 0x1e, + 0xac, 0x7f, 0x9, 0xb3, 0x39, 0x56, 0x60, 0x77, 0xbe, 0x80, 0x2, 0x78, 0x6, + 0x49, 0xf3, 0x39, 0x65, 0x80, 0x4, 0x49, 0xf3, 0x39, 0x5d, 0x7d, 0x3f, 0x7a, + 0x37, 0x92, 0x2, 0x7d, 0x3d, 0x7a, 0x37, 0x92, 0x4, 0x7d, 0x3f, 0x12, 0x76, + 0xba, 0x12, 0x27, 0x50, 0x7e, 0xb3, 0x9b, 0xa8, 0x12, 0x75, 0xd8, 0x40, 0xd, + 0x7e, 0xb3, 0x9b, 0x7f, 0x70, 0x1f, 0x7e, 0xb3, 0x9b, 0xaf, 0xb4, 0x1, 0x18, + 0x12, 0x76, 0xcc, 0x7a, 0x37, 0x92, 0x2, 0x7e, 0x34, 0x22, 0xc0, 0x7a, 0x37, + 0x92, 0x4, 0x12, 0x76, 0xcc, 0x12, 0x76, 0xba, 0x12, 0x27, 0x50, 0x30, 0x2b, + 0x18, 0x12, 0x76, 0xc3, 0x7a, 0x37, 0x92, 0x2, 0x7e, 0x34, 0x27, 0xe0, 0x7a, + 0x37, 0x92, 0x4, 0x12, 0x76, 0xc3, 0x12, 0x76, 0xba, 0x12, 0x27, 0x50, 0x6c, + 0xaa, 0x7e, 0x70, 0x1e, 0xac, 0x7f, 0x19, 0xa3, 0x39, 0x56, 0xb, 0xf0, 0xbe, + 0xf0, 0x3, 0x50, 0x2, 0xc1, 0x16, 0xda, 0xf8, 0x22, 0x7a, 0x37, 0x92, 0x8, + 0x7e, 0x1f, 0x2d, 0x2e, 0x7a, 0x37, 0x92, 0x2, 0x7d, 0x3f, 0x7a, 0x37, 0x92, + 0x4, 0x7e, 0x1f, 0x2d, 0x2e, 0x7a, 0x37, 0x92, 0x6, 0x7e, 0x8, 0x91, 0xfe, + 0x22, 0x74, 0x1e, 0xac, 0xbf, 0x49, 0x35, 0x39, 0x65, 0x22, 0x74, 0x1e, + 0xac, 0xbf, 0x49, 0x35, 0x39, 0x61, 0x22, 0x12, 0x77, 0x9c, 0x60, 0x2e, + 0x12, 0x77, 0x4f, 0x68, 0x29, 0xa5, 0xb8, 0x0, 0x14, 0x74, 0x1e, 0xa5, 0xb9, + 0x2, 0x7, 0xa4, 0x49, 0xf5, 0x39, 0x65, 0x80, 0xa, 0xa4, 0x49, 0xf5, 0x39, + 0x5d, 0x80, 0x3, 0x12, 0x77, 0x94, 0x12, 0x77, 0xb1, 0x12, 0x77, 0x9, 0x6d, + 0x33, 0x12, 0x76, 0xa4, 0x2, 0x27, 0x50, 0x22, 0xe4, 0x7a, 0xb3, 0x92, 0x0, + 0x7a, 0xb3, 0x92, 0x1, 0x22, 0x12, 0x77, 0x9c, 0x60, 0x36, 0x12, 0x77, 0x4f, + 0x68, 0x31, 0xa5, 0xb8, 0x0, 0x1a, 0xa5, 0xb9, 0x1, 0x9, 0x74, 0x1e, 0xa4, + 0x49, 0xf5, 0x39, 0x5d, 0x80, 0x10, 0xa5, 0xb9, 0x2, 0xc, 0x74, 0x1e, 0xa4, + 0x49, 0xf5, 0x39, 0x65, 0x80, 0x3, 0x12, 0x77, 0x94, 0x12, 0x77, 0xb1, 0x12, + 0x77, 0x9, 0x7e, 0x34, 0x0, 0x10, 0x12, 0x76, 0xa4, 0x2, 0x27, 0x50, 0x22, + 0x7e, 0xb3, 0x39, 0xc0, 0x12, 0x77, 0x71, 0x7c, 0xab, 0x7e, 0x30, 0x2, 0xac, + 0x3a, 0x49, 0x41, 0x76, 0x60, 0x7e, 0x23, 0x39, 0xdb, 0x7e, 0x30, 0x2, 0xac, + 0x23, 0x49, 0x11, 0x76, 0x60, 0xbd, 0x14, 0x22, 0x7c, 0x7b, 0x6c, 0xaa, + 0x6c, 0x66, 0x7e, 0x50, 0x2, 0xac, 0x56, 0x49, 0x12, 0x76, 0x60, 0xa, 0x27, + 0xbd, 0x21, 0x78, 0x4, 0x7c, 0xa6, 0x80, 0x7, 0xb, 0x60, 0xbe, 0x60, 0x3, + 0x40, 0xe6, 0x7c, 0xba, 0x22, 0x74, 0x1e, 0xa4, 0x49, 0xf5, 0x39, 0x61, + 0x22, 0x7c, 0x17, 0x7c, 0xb, 0x7e, 0xb3, 0x8d, 0x91, 0x22, 0x7e, 0x8, 0x91, + 0xfe, 0x7e, 0x34, 0x0, 0x10, 0xe4, 0x12, 0x0, 0x2e, 0x7e, 0x73, 0x82, 0xd, + 0x7a, 0x73, 0x91, 0xff, 0x7e, 0x73, 0x82, 0xc, 0x7a, 0x73, 0x91, 0xfe, 0x22, + 0x74, 0x1, 0x7a, 0xb3, 0x67, 0x92, 0x7e, 0xb3, 0x67, 0x83, 0xb4, 0x1, 0x5, + 0xe4, 0x7a, 0xb3, 0x67, 0x92, 0x12, 0x9b, 0xf6, 0x28, 0x5, 0xe4, 0x7a, 0xb3, + 0x67, 0x92, 0x7e, 0xb3, 0x2e, 0x74, 0x70, 0x5, 0xe4, 0x7a, 0xb3, 0x67, 0x92, + 0x7e, 0xb3, 0x3, 0xe4, 0xb4, 0x1, 0x5, 0xe4, 0x7a, 0xb3, 0x67, 0x92, 0x7e, + 0xb3, 0x9b, 0xa8, 0x2, 0x75, 0xd8, 0x7e, 0x8, 0x9, 0x20, 0x7e, 0x1f, 0x2d, + 0x2e, 0x2, 0x27, 0x36, 0x7c, 0x67, 0x7c, 0x7b, 0xd2, 0x1, 0x7e, 0xb3, 0x3, + 0xfd, 0xb4, 0x3, 0x4b, 0x7c, 0xb6, 0x12, 0x75, 0xd8, 0x50, 0x44, 0x7e, 0xa3, + 0x9a, 0xc5, 0xbe, 0xa0, 0x2, 0x40, 0x31, 0x12, 0x25, 0xee, 0x68, 0x28, 0x7e, + 0x63, 0x39, 0xfd, 0xa, 0x26, 0x2e, 0x24, 0x0, 0x4e, 0x12, 0x61, 0xa1, 0x24, + 0xff, 0x92, 0x1, 0x7c, 0xb6, 0x4, 0x7a, 0xb3, 0x39, 0xfd, 0x7e, 0x63, 0x39, + 0xfd, 0xbe, 0x60, 0x8, 0x40, 0x15, 0xe4, 0x7a, 0xb3, 0x39, 0xfd, 0x80, 0xe, + 0xd2, 0x1, 0x80, 0xa, 0xbc, 0xa7, 0x78, 0x4, 0xd2, 0x1, 0x80, 0x2, 0xc2, + 0x1, 0xa2, 0x1, 0x22, 0x7c, 0x4b, 0x74, 0x2, 0xac, 0xb4, 0x9, 0x55, 0x65, + 0x60, 0x9, 0x65, 0x65, 0x61, 0x7e, 0x73, 0x67, 0x6a, 0xbc, 0x75, 0x78, 0xa, + 0x7e, 0x73, 0x67, 0x6b, 0xbc, 0x76, 0x78, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0xca, + 0x3b, 0xc2, 0x2, 0x7e, 0xf3, 0x67, 0x62, 0x7e, 0x87, 0x67, 0x68, 0xbe, 0x84, + 0x0, 0xc8, 0x58, 0x2, 0xc2, 0x2a, 0x12, 0x2d, 0x55, 0x92, 0x0, 0x4c, 0xff, + 0x78, 0x2, 0x21, 0x60, 0x20, 0x0, 0x18, 0x7e, 0x87, 0x3, 0xf2, 0xbe, 0x84, + 0x0, 0x32, 0x38, 0x2, 0x21, 0x5a, 0x7e, 0x87, 0x3, 0xf7, 0xbe, 0x84, 0x0, + 0x64, 0x38, 0x2, 0x21, 0x5a, 0x7e, 0x73, 0x82, 0xe, 0xa, 0x87, 0x1b, 0x84, + 0x7d, 0x38, 0x7c, 0xe7, 0x7e, 0x73, 0x82, 0xf, 0xa, 0x67, 0x1b, 0x64, 0x30, + 0x0, 0x15, 0x7e, 0x37, 0x67, 0x68, 0x12, 0x79, 0x68, 0x7d, 0x93, 0xbe, 0x94, + 0x3, 0x20, 0x50, 0xa, 0x7e, 0x94, 0x3, 0x20, 0x80, 0x4, 0x7e, 0x94, 0x1, + 0x90, 0x6c, 0xcc, 0x80, 0x64, 0x7c, 0xbc, 0x12, 0x67, 0x50, 0x60, 0x5b, + 0x7e, 0x70, 0x2, 0xac, 0x7c, 0x12, 0x7f, 0x45, 0x7d, 0x83, 0xe5, 0x27, 0xbe, + 0xb0, 0x0, 0x28, 0x3e, 0xbe, 0xe1, 0x27, 0x28, 0x39, 0xe5, 0x28, 0xbe, 0xb0, + 0x2, 0x28, 0x32, 0xbe, 0xd1, 0x27, 0x28, 0x2d, 0xbd, 0x89, 0x50, 0x29, 0xe5, + 0x27, 0x7e, 0x71, 0x28, 0x7e, 0x8, 0x0, 0x29, 0x12, 0xba, 0xf3, 0x24, 0xff, + 0x92, 0x1, 0x20, 0x1, 0x2, 0x80, 0xb, 0x7e, 0x37, 0x67, 0x68, 0x12, 0x79, + 0x68, 0xbd, 0x38, 0x8, 0x9, 0x7c, 0xbc, 0x6c, 0x77, 0x12, 0x61, 0xaa, 0xd2, + 0x2, 0x7c, 0xbc, 0x12, 0x78, 0x62, 0x50, 0x5, 0x30, 0x2, 0x2, 0xd2, 0x2a, + 0xb, 0xc0, 0xbc, 0xfc, 0x38, 0x98, 0x30, 0x2, 0x3, 0x12, 0x64, 0x8f, 0xda, + 0x3b, 0x22, 0x7c, 0xb9, 0x12, 0x2e, 0x26, 0x7e, 0x24, 0x0, 0x3, 0x2, 0x1, + 0x20, 0xca, 0x79, 0x7c, 0x5, 0x7c, 0x96, 0x7c, 0xf7, 0x7c, 0x1b, 0x12, 0x79, + 0x63, 0x12, 0x7e, 0xd4, 0xbe, 0x17, 0x92, 0xd, 0x8, 0x4, 0x7a, 0x17, 0x92, + 0xd, 0x12, 0x7e, 0xdd, 0x7a, 0xf3, 0x92, 0x3, 0x12, 0x7d, 0x4, 0x7c, 0x6f, + 0x12, 0x7c, 0xe4, 0x7a, 0x73, 0x92, 0x7, 0x12, 0x7e, 0xcc, 0x7e, 0xf3, 0x92, + 0x4, 0x80, 0x19, 0x7e, 0xe3, 0x92, 0x6, 0x80, 0x9, 0x7c, 0xbf, 0x7c, 0x7e, + 0x12, 0x43, 0x4c, 0xb, 0xe0, 0x7e, 0x73, 0x92, 0x7, 0xbc, 0x7e, 0x38, 0xef, + 0xb, 0xf0, 0x7e, 0x73, 0x92, 0x5, 0xbc, 0x7f, 0x38, 0xdf, 0x12, 0x7d, 0x35, + 0xda, 0x79, 0x22, 0xca, 0xf8, 0x7c, 0xf6, 0x7c, 0x87, 0x7c, 0x9b, 0xa, 0x2f, + 0x7d, 0x32, 0x3e, 0x34, 0xb, 0x34, 0x7c, 0xb7, 0xbc, 0xf9, 0x38, 0x14, 0xa, + 0xf8, 0x1b, 0xf4, 0xa, 0x3f, 0x9d, 0xf3, 0xa, 0x39, 0xbd, 0x3f, 0x18, 0x6, + 0x7c, 0xab, 0xa, 0x39, 0x80, 0x1d, 0xbc, 0xf9, 0x28, 0xd, 0xa, 0x39, 0xa, + 0x5f, 0x2d, 0x53, 0xb, 0x54, 0x7c, 0xab, 0xe4, 0x80, 0x10, 0xa, 0x3f, 0xa, + 0x58, 0x2d, 0x53, 0xa, 0x39, 0x9d, 0x53, 0x7c, 0xab, 0x9d, 0x32, 0x7c, 0xb7, + 0x7a, 0xb, 0xb0, 0x7c, 0xba, 0xda, 0xf8, 0x22, 0xca, 0x3b, 0x7c, 0x5, 0x7c, + 0x96, 0x7c, 0xc7, 0x7c, 0x1b, 0x7e, 0xd3, 0x82, 0xd, 0x12, 0x79, 0x63, 0x12, + 0x7e, 0xd4, 0xbe, 0x17, 0x92, 0xd, 0x8, 0x4, 0x7a, 0x17, 0x92, 0xd, 0x12, + 0x7e, 0xdd, 0x7a, 0xc3, 0x92, 0x3, 0x12, 0x7d, 0x4, 0x7c, 0x6c, 0x12, 0x7c, + 0xe4, 0x7a, 0x73, 0x92, 0x7, 0x7e, 0x18, 0x92, 0x1d, 0x7a, 0x1f, 0x92, 0x9, + 0x7e, 0x33, 0x91, 0xfe, 0xac, 0x3d, 0x7e, 0x73, 0x91, 0xff, 0xa, 0x7, 0x2d, + 0x10, 0x7d, 0x1, 0x3e, 0x4, 0x49, 0x0, 0x4, 0x0, 0xb, 0x4, 0x7e, 0x24, 0x0, + 0x5, 0x7d, 0x30, 0x12, 0x1, 0x20, 0x7e, 0x27, 0x3, 0xf4, 0xbe, 0x24, 0x0, + 0x0, 0x28, 0x9, 0x7e, 0x24, 0x0, 0x4, 0x7d, 0x30, 0x12, 0x1, 0x20, 0x9f, + 0x22, 0x7a, 0x2d, 0x2e, 0x6d, 0x22, 0x7a, 0x27, 0x92, 0xf, 0x6d, 0x77, 0x7e, + 0xa3, 0x92, 0x4, 0x80, 0x41, 0x7e, 0x53, 0x92, 0x6, 0x80, 0x31, 0x7c, 0x3a, + 0xac, 0x3d, 0xa, 0x45, 0x2d, 0x14, 0x7d, 0x41, 0x3e, 0x44, 0x49, 0xf4, 0x4, + 0x0, 0xe4, 0x19, 0xb1, 0x92, 0x1d, 0xbd, 0x3f, 0x58, 0x16, 0xbd, 0xf, 0x8, + 0x12, 0x7d, 0x4f, 0x7d, 0xbf, 0x1a, 0x48, 0x1a, 0xa8, 0x7e, 0x6d, 0x2e, + 0x2f, 0x65, 0x7a, 0x6d, 0x2e, 0xb, 0x74, 0xb, 0x50, 0x7e, 0x43, 0x92, 0x7, + 0xbc, 0x45, 0x38, 0xc7, 0xb, 0xa0, 0x7e, 0x43, 0x92, 0x5, 0xbc, 0x4a, 0x38, + 0xb7, 0xbe, 0x74, 0x0, 0x0, 0x28, 0xc, 0x7e, 0x1d, 0x2e, 0x7d, 0x17, 0x12, + 0x1, 0x6c, 0x7a, 0x37, 0x92, 0xf, 0x12, 0x7e, 0xcc, 0x7e, 0x73, 0x91, 0xff, + 0x7e, 0xb3, 0x91, 0xfe, 0x12, 0x44, 0x5d, 0x12, 0x7d, 0x35, 0xda, 0x3b, + 0x22, 0xca, 0x3b, 0x75, 0x2d, 0x0, 0x6c, 0xee, 0x12, 0x7f, 0x2, 0x7c, 0xdb, + 0xc2, 0x0, 0x6c, 0xff, 0x7e, 0xb3, 0x82, 0xe, 0xf5, 0x2b, 0x7e, 0xb3, 0x82, + 0xf, 0xf5, 0x2c, 0xe4, 0x7a, 0xb3, 0x3, 0xff, 0x7e, 0xb3, 0x2e, 0x74, 0xb4, + 0x1, 0x2, 0x80, 0x2, 0x81, 0xb2, 0x7e, 0xa3, 0x67, 0x62, 0xbe, 0xa0, 0x4, + 0x38, 0xe, 0x7e, 0xe0, 0x1, 0xc2, 0x0, 0xbe, 0xa0, 0x1, 0x78, 0x1d, 0x80, + 0x13, 0x80, 0x19, 0xbe, 0xd0, 0x2, 0x38, 0x1c, 0xbe, 0xd0, 0x1, 0x40, 0x17, + 0xd2, 0x0, 0xbe, 0xd0, 0x1, 0x78, 0x8, 0x75, 0x27, 0x5, 0x75, 0x28, 0x5, + 0x80, 0xa, 0x75, 0x27, 0x4, 0x75, 0x28, 0x4, 0x80, 0x2, 0x6c, 0xee, 0x6c, + 0xcc, 0x81, 0x9e, 0x7e, 0x70, 0x2, 0xac, 0x7c, 0x9, 0xb3, 0x65, 0x60, 0xf5, + 0x29, 0x9, 0xb3, 0x65, 0x61, 0xf5, 0x2a, 0x30, 0x0, 0xc, 0x12, 0x7c, 0xb5, + 0x50, 0x5, 0x7e, 0xe0, 0x1, 0x80, 0x2, 0x6c, 0xee, 0xe5, 0x2a, 0xbe, 0xb0, + 0x0, 0x40, 0x9, 0xe5, 0x2a, 0xbe, 0xb0, 0x1, 0x38, 0x2, 0x6c, 0xee, 0xbe, + 0xe0, 0x1, 0x78, 0x8, 0x12, 0x7c, 0xda, 0x12, 0x7a, 0x1f, 0x81, 0x72, 0x75, + 0x27, 0x3, 0x75, 0x28, 0x3, 0x7e, 0x63, 0x67, 0x62, 0xbe, 0x60, 0x6, 0x40, + 0x17, 0x12, 0x7c, 0xb5, 0x50, 0x47, 0xbe, 0xd0, 0x1, 0x78, 0x2, 0x80, 0x1a, + 0xbe, 0xd0, 0x2, 0x38, 0x33, 0x80, 0x29, 0x80, 0x2f, 0x80, 0x35, 0xbe, 0x60, + 0x4, 0x40, 0x38, 0x12, 0x7c, 0xb5, 0x50, 0x2b, 0xbe, 0xd0, 0x1, 0x78, 0x8, + 0x75, 0x27, 0x5, 0x75, 0x28, 0x5, 0x80, 0x7a, 0xbe, 0xd0, 0x2, 0x38, 0x2, + 0x80, 0x7, 0x7e, 0xb3, 0x67, 0x62, 0xb4, 0x4, 0x8, 0x75, 0x27, 0x3, 0x75, + 0x28, 0x3, 0x80, 0x64, 0x75, 0x27, 0x2, 0x75, 0x28, 0x2, 0x80, 0x5c, 0x75, + 0x27, 0x1, 0x75, 0x28, 0x1, 0x80, 0x54, 0xe5, 0x29, 0xbe, 0xb0, 0x1, 0x28, + 0xe, 0xe5, 0x2b, 0xa, 0x2b, 0x1b, 0x25, 0xe5, 0x29, 0xa, 0x3b, 0xbd, 0x32, + 0x48, 0x3, 0x75, 0x27, 0x2, 0xe5, 0x2a, 0xbe, 0xb0, 0x1, 0x28, 0xe, 0xe5, + 0x2c, 0xa, 0x2b, 0x1b, 0x25, 0xe5, 0x2a, 0xa, 0x3b, 0xbd, 0x32, 0x48, 0x3, + 0x75, 0x28, 0x2, 0xc2, 0x1, 0xe5, 0x29, 0x7e, 0x71, 0x2a, 0x7c, 0x6c, 0x12, + 0xcd, 0xeb, 0xbe, 0xb0, 0xff, 0x68, 0x6, 0x75, 0x27, 0x2, 0x75, 0x28, 0x2, + 0x7c, 0xbc, 0x7e, 0x8, 0x0, 0x27, 0x7e, 0x18, 0x0, 0x28, 0x12, 0x7f, 0x55, + 0x12, 0x7c, 0xda, 0x12, 0x79, 0x6f, 0x7e, 0x70, 0xd, 0xac, 0x7f, 0x9, 0xb3, + 0x65, 0xe2, 0xbe, 0xb1, 0x2d, 0x28, 0x2, 0xf5, 0x2d, 0x7e, 0xb3, 0x76, 0x16, + 0xb4, 0x1, 0x11, 0x7d, 0x13, 0x2e, 0x14, 0x65, 0xdc, 0x6d, 0x0, 0x2e, 0x34, + 0x65, 0xde, 0x6d, 0x22, 0x12, 0x7f, 0x36, 0xb, 0xf0, 0xb, 0xc0, 0x7e, 0x73, + 0x67, 0x62, 0xbc, 0x7c, 0x28, 0x2, 0x61, 0x78, 0x7a, 0xf3, 0x67, 0x62, 0xe5, + 0x2d, 0x7a, 0xb3, 0x3, 0xff, 0xda, 0x3b, 0x22, 0xe5, 0x29, 0x7e, 0x71, 0x2a, + 0x7c, 0xab, 0x4c, 0x77, 0x68, 0x18, 0x7e, 0xb3, 0x82, 0xf, 0x14, 0xbc, 0xb7, + 0x68, 0xf, 0x4c, 0xaa, 0x68, 0xb, 0x7e, 0xb3, 0x82, 0xe, 0x14, 0xbc, 0xba, + 0x68, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0xe5, 0x27, 0x7e, 0x71, 0x28, 0x7c, 0x6c, + 0x7c, 0x5f, 0x22, 0x7e, 0x8, 0x92, 0x6, 0x12, 0x79, 0xcc, 0x7a, 0xb3, 0x92, + 0x7, 0x7e, 0x73, 0x92, 0x4, 0x2e, 0x73, 0x92, 0x5, 0x7a, 0x73, 0x92, 0x5, + 0x7e, 0x73, 0x92, 0x6, 0x2e, 0x73, 0x92, 0x7, 0x22, 0xe4, 0x7a, 0xb3, 0x92, + 0x8, 0x9f, 0x11, 0x7a, 0x1f, 0x92, 0x11, 0x7a, 0x1f, 0x92, 0x15, 0x7a, 0x1f, + 0x92, 0x19, 0x7e, 0xb3, 0x91, 0xfe, 0x7e, 0x73, 0x82, 0xc, 0x7c, 0x61, 0x7e, + 0x8, 0x92, 0x4, 0x12, 0x79, 0xcc, 0x7a, 0xb3, 0x92, 0x5, 0x7e, 0xb3, 0x91, + 0xff, 0x7e, 0x73, 0x82, 0xd, 0x22, 0x7e, 0xd, 0x10, 0x69, 0x30, 0x0, 0x15, + 0x69, 0x20, 0x0, 0x13, 0xbe, 0x18, 0x0, 0x0, 0x78, 0xc, 0x7e, 0x18, 0x0, + 0x1, 0x79, 0x30, 0x0, 0x15, 0x79, 0x20, 0x0, 0x13, 0x20, 0x26, 0x28, 0x74, + 0x6, 0x7e, 0xd, 0x10, 0x2e, 0x14, 0x0, 0x17, 0x12, 0x46, 0xc8, 0x2f, 0x11, + 0x14, 0x78, 0xfb, 0x12, 0x43, 0x44, 0x74, 0x6, 0x7e, 0xd, 0x10, 0x2e, 0x14, + 0x0, 0x1b, 0x12, 0x46, 0xc8, 0x2f, 0x11, 0x14, 0x78, 0xfb, 0x12, 0x43, 0x44, + 0x7e, 0x7d, 0x10, 0x69, 0xb7, 0x0, 0x15, 0x69, 0xa7, 0x0, 0x13, 0x69, 0x37, + 0x0, 0x19, 0x69, 0x27, 0x0, 0x17, 0x7f, 0x5, 0x12, 0x1, 0xbf, 0x7d, 0xd3, + 0x69, 0x37, 0x0, 0x1d, 0x69, 0x27, 0x0, 0x1b, 0x7f, 0x5, 0x12, 0x1, 0xbf, + 0x30, 0x26, 0x19, 0xbe, 0xd4, 0x0, 0x0, 0x58, 0x2, 0x6d, 0xdd, 0xbe, 0x34, + 0x0, 0x0, 0x58, 0x2, 0x6d, 0x33, 0x12, 0x7e, 0xc4, 0x59, 0xd5, 0x65, 0xdc, + 0x80, 0x11, 0x7d, 0x2d, 0x2e, 0x24, 0x0, 0x20, 0x12, 0x7e, 0xc4, 0x59, 0x25, + 0x65, 0xdc, 0x2e, 0x34, 0x0, 0x20, 0x59, 0x35, 0x65, 0xde, 0x29, 0xa7, 0x0, + 0xa, 0x29, 0x67, 0x0, 0x3, 0x7e, 0x70, 0xd, 0xac, 0x67, 0x19, 0xa3, 0x65, + 0xe2, 0x9, 0x53, 0x65, 0xe2, 0xbe, 0x50, 0x2d, 0x28, 0x6, 0x74, 0x2d, 0x19, + 0xb3, 0x65, 0xe2, 0x29, 0xb7, 0x0, 0x2, 0x12, 0x2e, 0x26, 0x7d, 0xb3, 0xbe, + 0xb4, 0x0, 0x0, 0x18, 0x4, 0x7e, 0xb4, 0x0, 0x1, 0x6c, 0xaa, 0x7e, 0x6d, + 0x10, 0x29, 0x76, 0x0, 0x1, 0x4c, 0x77, 0x68, 0xb, 0x7e, 0x63, 0x82, 0xf, + 0x7c, 0xb6, 0x14, 0xbc, 0x7b, 0x78, 0x5, 0x2e, 0xa0, 0x6, 0x80, 0xf, 0xbe, + 0x70, 0x1, 0x68, 0x8, 0x7c, 0xb6, 0x24, 0xfe, 0xbc, 0x7b, 0x78, 0x2, 0xb, + 0xa2, 0x7e, 0x6b, 0x70, 0x4c, 0x77, 0x68, 0xb, 0x7e, 0x63, 0x82, 0xe, 0x7c, + 0xb6, 0x14, 0xbc, 0x7b, 0x78, 0x5, 0x2e, 0xa0, 0x6, 0x80, 0xf, 0xbe, 0x70, + 0x1, 0x68, 0x8, 0x7c, 0xb6, 0x24, 0xfe, 0xbc, 0x7b, 0x78, 0x2, 0xb, 0xa2, + 0xa, 0x3a, 0x6d, 0x22, 0x7e, 0x33, 0x82, 0x0, 0xa, 0x13, 0x6d, 0x0, 0x9f, + 0x1, 0x69, 0xf6, 0x0, 0x15, 0x69, 0xe6, 0x0, 0x13, 0x7f, 0x17, 0x12, 0x1, + 0xbf, 0x7d, 0x1b, 0x1a, 0x2, 0x1a, 0x0, 0xbf, 0x10, 0x28, 0x6, 0x7d, 0x3b, + 0x1a, 0x26, 0x1a, 0x24, 0x7e, 0x14, 0x0, 0x7f, 0x12, 0x1, 0x63, 0x7d, 0x1b, + 0x1a, 0x2, 0x1a, 0x0, 0x12, 0x1, 0x6e, 0x7c, 0xa7, 0x29, 0x66, 0x0, 0x3, + 0x7e, 0x70, 0xd, 0xac, 0x67, 0x19, 0xa3, 0x65, 0xe1, 0x29, 0xa6, 0x0, 0x2, + 0x74, 0x2, 0xa4, 0x9, 0x55, 0x65, 0x60, 0x19, 0x53, 0x65, 0xe3, 0x9, 0x55, + 0x65, 0x61, 0x19, 0x53, 0x65, 0xe4, 0x59, 0xf3, 0x65, 0xe7, 0x59, 0xe3, + 0x65, 0xe5, 0x22, 0x29, 0xa7, 0x0, 0x3, 0x74, 0xd, 0xa4, 0x22, 0x7e, 0x18, + 0x91, 0xfe, 0x7a, 0x1d, 0x10, 0x22, 0x7a, 0x37, 0x92, 0xd, 0x7e, 0x17, 0x82, + 0x1, 0x22, 0x74, 0x2, 0xac, 0xb9, 0x9, 0x85, 0x65, 0x60, 0x7a, 0x83, 0x91, + 0xfe, 0x74, 0x2, 0xac, 0xb9, 0x9, 0x85, 0x65, 0x61, 0x7a, 0x83, 0x91, 0xff, + 0x7a, 0x93, 0x92, 0x0, 0x7a, 0x3, 0x92, 0x1, 0x7a, 0x13, 0x92, 0x2, 0x22, + 0x6c, 0x33, 0x6c, 0x22, 0x80, 0x20, 0x7c, 0xb2, 0x12, 0x67, 0x50, 0x60, + 0x17, 0x74, 0x2, 0xac, 0xb2, 0x9, 0x15, 0x65, 0x60, 0x9, 0x5, 0x65, 0x61, + 0x7c, 0xb1, 0x7c, 0x70, 0x12, 0x7c, 0xba, 0x50, 0x2, 0xb, 0x30, 0xb, 0x20, + 0x7e, 0x73, 0x67, 0x62, 0xbc, 0x72, 0x38, 0xd8, 0x7c, 0xb3, 0x22, 0x2, 0x7b, + 0xe, 0x7f, 0x20, 0xb, 0x2a, 0x10, 0xb, 0x1a, 0x0, 0x1b, 0x2a, 0x0, 0x1b, + 0x1a, 0x10, 0x22, 0x9, 0xb3, 0x65, 0x60, 0xf5, 0x27, 0x9, 0x73, 0x65, 0x61, + 0x7a, 0x71, 0x28, 0x2, 0x2e, 0x40, 0x7c, 0xab, 0x7e, 0xb3, 0x67, 0x78, 0x60, + 0x27, 0xb4, 0x1, 0x9, 0x7e, 0xb3, 0x67, 0x62, 0xbe, 0xb0, 0x2, 0x68, 0x1b, + 0x7e, 0xb3, 0x67, 0x62, 0xb4, 0x2, 0x14, 0x74, 0xd, 0xa4, 0x9, 0xb5, 0x65, + 0xe2, 0xbe, 0xb0, 0x14, 0x28, 0x8, 0x74, 0x4, 0x7a, 0xb, 0xb0, 0x7a, 0x1b, + 0xb0, 0x22, 0x7e, 0xb3, 0x9b, 0x84, 0xb4, 0x1, 0x6, 0x7e, 0xb3, 0x2e, 0x75, + 0x60, 0x43, 0x7e, 0xb3, 0x59, 0xed, 0x7e, 0x1f, 0x2d, 0x26, 0xb4, 0x11, 0xf, + 0x6d, 0x22, 0x7e, 0x14, 0x9, 0xc4, 0x12, 0x2d, 0x3e, 0x7d, 0xc3, 0x74, 0x22, + 0x80, 0xf, 0x7e, 0x24, 0x32, 0xc8, 0x7e, 0x14, 0x42, 0x68, 0x12, 0x2d, 0x3e, + 0x7d, 0xc3, 0x74, 0x11, 0x7a, 0xb3, 0x59, 0xed, 0x7e, 0xa3, 0x82, 0xd, 0x7e, + 0xb3, 0x82, 0xc, 0xa4, 0x7d, 0xd5, 0x1e, 0xd4, 0x1e, 0xd4, 0xbd, 0xdc, 0x50, + 0x3, 0x75, 0xe9, 0xff, 0x22, 0x2, 0x7f, 0xd9, 0xca, 0x79, 0x6c, 0xff, 0xc2, + 0x0, 0x7e, 0xb3, 0x82, 0x4, 0x60, 0x6, 0x7e, 0xd4, 0x2, 0xbc, 0x80, 0x4, + 0x7e, 0xd4, 0x3, 0xe8, 0x7e, 0xb3, 0x82, 0x9, 0xb4, 0x1, 0x4, 0x7e, 0xd4, + 0x0, 0xf0, 0x7e, 0xc7, 0x67, 0x68, 0x6c, 0xee, 0x80, 0x71, 0xc2, 0x0, 0x7c, + 0xbe, 0x12, 0x2e, 0x26, 0x7d, 0xb3, 0x74, 0x2, 0xac, 0xbe, 0x9, 0xb5, 0x65, + 0x60, 0x12, 0x0, 0xfb, 0xbd, 0x3b, 0x58, 0x4, 0xd2, 0x0, 0x80, 0x26, 0x7e, + 0x73, 0x69, 0x6a, 0xbe, 0x73, 0x67, 0x62, 0x78, 0x1c, 0x7e, 0xa7, 0x39, + 0xf5, 0x1e, 0xa4, 0xbd, 0xac, 0x50, 0x12, 0x7c, 0xbe, 0x7e, 0x70, 0x1, 0x12, + 0x80, 0x87, 0x7d, 0x1d, 0x6d, 0x0, 0xbf, 0x10, 0x8, 0x2, 0xd2, 0x0, 0x30, + 0x0, 0x2a, 0x7c, 0xbe, 0x12, 0x67, 0x50, 0x60, 0x23, 0x7e, 0xa4, 0x0, 0xd, + 0xca, 0xa9, 0x7e, 0x70, 0xd, 0xac, 0x7e, 0x2e, 0x34, 0x65, 0xdc, 0x6d, 0x22, + 0x7e, 0x30, 0xd, 0xac, 0x3f, 0x2e, 0x14, 0x67, 0x93, 0x6d, 0x0, 0x12, 0x0, + 0x6e, 0x1b, 0xfd, 0xb, 0xf0, 0xb, 0xe0, 0x12, 0x67, 0xd2, 0x38, 0x8a, 0x7a, + 0x73, 0x67, 0x77, 0x7a, 0xf3, 0x69, 0x69, 0x7a, 0xc7, 0x39, 0xf5, 0xda, + 0x79, 0x22, 0x7c, 0x67, 0x7c, 0x7b, 0x7e, 0x50, 0x2, 0xac, 0x57, 0x9, 0xb2, + 0x65, 0x60, 0x9, 0x72, 0x65, 0x61, 0x7e, 0xa3, 0x76, 0x37, 0xbc, 0xab, 0x78, + 0x3, 0x9f, 0x11, 0x22, 0x2, 0x80, 0xa6, 0x7c, 0x16, 0x7c, 0x7, 0x7c, 0x9b, + 0x7e, 0x83, 0x82, 0xe, 0x7a, 0x83, 0x91, 0xfe, 0x7e, 0x83, 0x82, 0xf, 0x7a, + 0x83, 0x91, 0xff, 0x9f, 0x77, 0xa, 0x31, 0xa, 0x19, 0x9d, 0x13, 0x7c, 0x83, + 0x80, 0x7c, 0x7a, 0x81, 0x28, 0xbe, 0x80, 0x0, 0x58, 0xc, 0x1a, 0x58, 0x1a, + 0x19, 0x9d, 0x15, 0xa, 0x59, 0x2d, 0x51, 0xf5, 0x28, 0x7e, 0x73, 0x91, 0xfe, + 0xbc, 0x78, 0x18, 0xc, 0x1a, 0x59, 0x1a, 0x18, 0x9d, 0x15, 0xa, 0x59, 0x9d, + 0x51, 0xf5, 0x28, 0xa, 0x11, 0xa, 0x50, 0x9d, 0x51, 0xf5, 0x27, 0x80, 0x3a, + 0x85, 0x27, 0x29, 0xe5, 0x27, 0xbe, 0xb0, 0x0, 0x58, 0xe, 0xe5, 0x27, 0x1a, + 0x5b, 0x1a, 0x10, 0x9d, 0x15, 0xa, 0x50, 0x2d, 0x51, 0xf5, 0x29, 0x7e, 0x73, + 0x91, 0xff, 0xbe, 0x71, 0x27, 0x18, 0xe, 0x1a, 0x30, 0xe5, 0x27, 0x1a, 0x1b, + 0x9d, 0x13, 0xa, 0x50, 0x9d, 0x51, 0xf5, 0x29, 0x12, 0x81, 0x55, 0x1a, 0x26, + 0x1a, 0x24, 0x2f, 0x71, 0x5, 0x27, 0xa, 0x21, 0xa, 0x30, 0x2d, 0x32, 0xe5, + 0x27, 0x1a, 0x1b, 0xbd, 0x13, 0x8, 0xb8, 0xb, 0x80, 0xa, 0x11, 0xa, 0x59, + 0x2d, 0x51, 0x1a, 0x18, 0xbd, 0x15, 0x18, 0x2, 0x1, 0xc8, 0x7f, 0x17, 0x22, + 0xe5, 0x28, 0x7e, 0x71, 0x29, 0x2, 0x2e, 0x40, 0xca, 0x79, 0x7f, 0x70, 0x75, + 0x2a, 0xff, 0x7e, 0xb3, 0x67, 0x62, 0xf5, 0x2b, 0x6c, 0x99, 0x6c, 0xff, + 0x6c, 0xee, 0x80, 0xd, 0xa, 0x1e, 0x12, 0x82, 0x6b, 0xbc, 0x7f, 0x40, 0x2, + 0x7c, 0xf7, 0xb, 0xe0, 0xe5, 0x2b, 0xbc, 0xbe, 0x38, 0xed, 0x7e, 0xe0, 0x1, + 0x41, 0x3f, 0x75, 0x2c, 0x0, 0x6d, 0xdd, 0x75, 0x27, 0x0, 0x41, 0x1b, 0x12, + 0x67, 0xe1, 0x9, 0xb1, 0x65, 0x60, 0xf5, 0x28, 0x9, 0xb1, 0x65, 0x61, 0xf5, + 0x29, 0xe5, 0x27, 0xa, 0x1b, 0x12, 0x82, 0x6b, 0xbc, 0x7e, 0x78, 0x6b, 0x5, + 0x2c, 0xe5, 0x2c, 0xb4, 0x1, 0x3, 0x12, 0x82, 0x64, 0xbe, 0xf0, 0x1, 0x78, + 0x4e, 0x7e, 0xa3, 0x39, 0x3b, 0xbe, 0xa0, 0xff, 0x68, 0x45, 0x7e, 0xb3, + 0x39, 0x3a, 0xa, 0x3b, 0xe5, 0x29, 0xa, 0xcb, 0x7d, 0x1c, 0x9d, 0x13, 0xbe, + 0x14, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xc3, 0x80, 0x4, 0x6d, 0xcc, 0x9d, 0xc1, + 0xa, 0x3a, 0xe5, 0x28, 0xa, 0x1b, 0x7d, 0x51, 0x9d, 0x53, 0xbe, 0x54, 0x0, + 0x0, 0x8, 0x4, 0x9d, 0x13, 0x80, 0x4, 0x6d, 0x11, 0x9d, 0x15, 0x2d, 0x1c, + 0x7c, 0x83, 0xbe, 0x81, 0x2a, 0x50, 0x16, 0x12, 0x82, 0x64, 0x7a, 0x81, + 0x2a, 0x80, 0xe, 0x12, 0x81, 0x55, 0x7d, 0xc3, 0xbd, 0xdc, 0x58, 0x5, 0x7d, + 0xdc, 0x12, 0x82, 0x64, 0x5, 0x27, 0xe5, 0x2b, 0xbe, 0xb1, 0x27, 0x28, 0x2, + 0x21, 0x94, 0xe5, 0x2c, 0xbe, 0xb0, 0x0, 0x28, 0x12, 0x74, 0x2, 0xac, 0xb9, + 0x19, 0x5, 0x38, 0xa1, 0x74, 0x2, 0xac, 0xb9, 0x19, 0x15, 0x38, 0xa2, 0xb, + 0x90, 0xb, 0xe0, 0xbc, 0xfe, 0x40, 0x2, 0x21, 0x8a, 0xbe, 0x90, 0x1, 0x78, + 0x12, 0x7e, 0x83, 0x38, 0xa1, 0x7a, 0x83, 0x39, 0x3b, 0x7e, 0x83, 0x38, + 0xa2, 0x7a, 0x83, 0x39, 0x3a, 0x80, 0x3, 0x12, 0x86, 0x3d, 0x7c, 0xb9, 0xda, + 0x79, 0x22, 0x7e, 0x1, 0x28, 0x7e, 0x11, 0x29, 0x22, 0x7f, 0x17, 0x2d, 0x31, + 0x7e, 0x1b, 0x70, 0x22, 0xca, 0x3b, 0x7c, 0xfb, 0xc2, 0x2, 0xc2, 0x3, 0xc2, + 0x4, 0xd2, 0x5, 0x7e, 0xe3, 0x67, 0x62, 0xe4, 0x7a, 0xb3, 0x38, 0xde, 0x7a, + 0xb3, 0x38, 0xdf, 0x7a, 0xb3, 0x38, 0xa0, 0x7a, 0xb3, 0x39, 0x3e, 0x7e, 0x8, + 0x38, 0xe0, 0x7e, 0x73, 0x75, 0x8d, 0xa, 0x37, 0x12, 0x0, 0x2e, 0x7e, 0x73, + 0x75, 0x8d, 0xa, 0x37, 0x3e, 0x34, 0x7e, 0x8, 0x38, 0xa1, 0x12, 0x0, 0x2e, + 0xbe, 0xe0, 0x2, 0x50, 0x2, 0xa1, 0x3f, 0x12, 0xc2, 0x43, 0x6c, 0xdd, 0xa1, + 0x39, 0x7e, 0x70, 0x2, 0xac, 0x7d, 0x9, 0xb3, 0x65, 0x60, 0xf5, 0x28, 0x9, + 0xb3, 0x65, 0x61, 0xf5, 0x29, 0x4c, 0xdd, 0x68, 0x5, 0x12, 0x85, 0x42, 0x70, + 0xa, 0xa, 0x3d, 0xb, 0x34, 0xa, 0x8d, 0x19, 0x78, 0x38, 0xe0, 0xa, 0x8d, + 0xb, 0x84, 0x7d, 0x38, 0x7c, 0xc7, 0xa1, 0x31, 0x7e, 0x70, 0x2, 0xac, 0x7c, + 0x9, 0xa3, 0x65, 0x60, 0x7a, 0xa1, 0x2a, 0x9, 0xb3, 0x65, 0x61, 0xf5, 0x2b, + 0xa, 0x8a, 0xe5, 0x28, 0x12, 0x86, 0x32, 0x8, 0x4, 0x9d, 0x58, 0x80, 0x4, + 0x6d, 0x55, 0x9d, 0x54, 0xf5, 0x2c, 0xe5, 0x2b, 0xa, 0x8b, 0xe5, 0x29, 0x12, + 0x86, 0x32, 0x8, 0x4, 0x9d, 0x58, 0x80, 0x4, 0x6d, 0x55, 0x9d, 0x54, 0xf5, + 0x2d, 0xe5, 0x19, 0xbe, 0xb1, 0x2c, 0x28, 0x7, 0xe5, 0x19, 0xbe, 0xb1, 0x2d, + 0x38, 0x3e, 0xe5, 0x29, 0x60, 0x9, 0xe5, 0x29, 0xb4, 0x1, 0x2, 0x80, 0x2, + 0xa1, 0x2f, 0xe5, 0x2b, 0x60, 0x9, 0xe5, 0x2b, 0xb4, 0x1, 0x2, 0x80, 0x2, + 0xa1, 0x2f, 0xe5, 0x28, 0xbe, 0xb0, 0x5, 0x50, 0x2, 0xa1, 0x2f, 0xe5, 0x28, + 0xbe, 0xb0, 0xc, 0x28, 0x2, 0xa1, 0x2f, 0xe5, 0x2a, 0xbe, 0xb0, 0x5, 0x50, + 0x2, 0xa1, 0x2f, 0xe5, 0x2a, 0xbe, 0xb0, 0xc, 0x28, 0x2, 0xa1, 0x2f, 0x7e, + 0x94, 0x0, 0x51, 0x12, 0x81, 0x55, 0x7a, 0x35, 0x2f, 0xe5, 0x2a, 0x7e, 0x71, + 0x2b, 0x12, 0x2e, 0x40, 0x7a, 0x35, 0x31, 0x7e, 0x85, 0x2f, 0xbe, 0x85, + 0x31, 0x8, 0x5, 0x7e, 0x35, 0x31, 0x80, 0x3, 0x7e, 0x35, 0x2f, 0x7a, 0x35, + 0x35, 0xbe, 0x85, 0x31, 0x58, 0x5, 0x7e, 0x85, 0x31, 0x80, 0x3, 0x7e, 0x85, + 0x2f, 0x7a, 0x85, 0x37, 0x7e, 0x85, 0x35, 0xe, 0x84, 0x7a, 0x85, 0x33, 0x75, + 0x2e, 0x0, 0xe5, 0x2c, 0xbe, 0xb0, 0x1, 0x38, 0x23, 0xe5, 0x2d, 0xbe, 0xb0, + 0x1, 0x38, 0x1c, 0x7c, 0xbf, 0x30, 0xe0, 0x17, 0x7e, 0xb3, 0x38, 0xa0, 0x4, + 0x7a, 0xb3, 0x38, 0xa0, 0x75, 0x2e, 0x1, 0x7e, 0xb3, 0x38, 0xde, 0x4, 0x7a, + 0xb3, 0x38, 0xde, 0x81, 0xa8, 0xe5, 0x19, 0xbe, 0xb1, 0x2c, 0x38, 0x2, 0x81, + 0xa8, 0xe5, 0x19, 0xbe, 0xb1, 0x2d, 0x38, 0x2, 0x81, 0xa8, 0x7c, 0xbf, 0x20, + 0xe1, 0x2, 0x81, 0xa8, 0xc2, 0x3, 0xe5, 0x2c, 0xbe, 0xb0, 0x2, 0x38, 0x9, + 0xe5, 0x2d, 0xbe, 0xb0, 0x2, 0x38, 0x2, 0xd2, 0x3, 0xe5, 0x28, 0x7e, 0x71, + 0x29, 0x7e, 0x61, 0x2a, 0x7e, 0x51, 0x2b, 0x12, 0xc0, 0x14, 0x1a, 0x26, + 0x1a, 0x24, 0x7a, 0x1d, 0x3f, 0x7e, 0x85, 0x31, 0x2e, 0x85, 0x2f, 0xe, 0x84, + 0x7a, 0x85, 0x39, 0xc2, 0x2, 0xbe, 0x18, 0x7f, 0xff, 0x78, 0x5, 0x9f, 0x11, + 0x7a, 0x1d, 0x3f, 0x7c, 0xbd, 0x7c, 0x7c, 0x7e, 0xd, 0x3f, 0x7e, 0x25, 0x39, + 0x12, 0x87, 0x3f, 0x92, 0x4, 0x12, 0x86, 0x68, 0x92, 0x1, 0x30, 0x1, 0x5, + 0x7e, 0x35, 0x37, 0x80, 0x3, 0x7e, 0x35, 0x35, 0x1a, 0x26, 0x1a, 0x24, 0x7a, + 0x1d, 0x3b, 0x7e, 0x87, 0x3, 0xf4, 0xbe, 0x84, 0x0, 0x0, 0x28, 0xa, 0xbe, + 0x94, 0x0, 0x4b, 0x8, 0x4, 0x7e, 0x94, 0x0, 0x4b, 0x7e, 0xb3, 0x59, 0x8b, + 0xb4, 0x1, 0x4, 0x7e, 0x94, 0x0, 0x3c, 0x7d, 0x19, 0x1a, 0x2, 0x1a, 0x0, + 0x7e, 0x1d, 0x3b, 0x12, 0x1, 0x52, 0x7e, 0x8, 0x0, 0x64, 0x12, 0x1, 0xbf, + 0x7f, 0x1, 0x7e, 0x1d, 0x3f, 0xbf, 0x10, 0x8, 0x2, 0xd2, 0x2, 0x30, 0x4, + 0x5, 0x20, 0x3, 0x2, 0xc2, 0x2, 0x30, 0x2, 0x3, 0x75, 0x2e, 0x2, 0xe5, 0x29, + 0x60, 0x5, 0xe5, 0x29, 0xb4, 0x1, 0x28, 0xe5, 0x2b, 0x60, 0x5, 0xe5, 0x2b, + 0xb4, 0x1, 0x1f, 0xe5, 0x28, 0xbe, 0xb0, 0x5, 0x40, 0x18, 0xe5, 0x28, 0xbe, + 0xb0, 0xc, 0x38, 0x11, 0xe5, 0x2a, 0xbe, 0xb0, 0x5, 0x40, 0xa, 0xe5, 0x2a, + 0xbe, 0xb0, 0xc, 0x38, 0x3, 0x75, 0x2e, 0x2, 0xe5, 0x2e, 0xbe, 0xb0, 0x0, + 0x28, 0x4f, 0xa, 0x8c, 0x9, 0xa8, 0x38, 0xe0, 0x4c, 0xaa, 0x78, 0xb, 0x12, + 0x85, 0x42, 0xa, 0x4c, 0x19, 0xb4, 0x38, 0xe0, 0x80, 0x3a, 0x12, 0x85, 0x42, + 0xf5, 0x43, 0xbc, 0xba, 0x28, 0x3, 0x7a, 0xa1, 0x43, 0x75, 0x27, 0x0, 0x80, + 0x24, 0xa, 0x8c, 0x9, 0x78, 0x38, 0xe0, 0xe5, 0x27, 0xa, 0x8b, 0x9, 0x68, + 0x38, 0xe0, 0xbc, 0x67, 0x68, 0xa, 0xa, 0x2d, 0x9, 0x72, 0x38, 0xe0, 0xbc, + 0x67, 0x78, 0x6, 0xe5, 0x43, 0x19, 0xb8, 0x38, 0xe0, 0x5, 0x27, 0xbe, 0xe1, + 0x27, 0x38, 0xd7, 0xb, 0xc0, 0xbc, 0xec, 0x28, 0x2, 0x41, 0xec, 0xb, 0xd0, + 0xbc, 0xed, 0x28, 0x2, 0x41, 0xbe, 0xda, 0x3b, 0x22, 0xa, 0x8d, 0x9, 0xb8, + 0x38, 0xe0, 0x22, 0xca, 0xd8, 0xca, 0x79, 0xc2, 0x0, 0x7e, 0xe0, 0x3, 0xe4, + 0x7a, 0xb3, 0x38, 0xdd, 0x7e, 0xd3, 0x69, 0x75, 0xbe, 0xd0, 0x4, 0x40, 0x5, + 0x75, 0x19, 0x4, 0x80, 0x3, 0x75, 0x19, 0x6, 0x12, 0xc0, 0xe8, 0x7e, 0xf3, + 0x67, 0x62, 0xbe, 0xf0, 0x1, 0x38, 0x2, 0xc1, 0x20, 0x7c, 0xbe, 0x12, 0x82, + 0x73, 0x4c, 0xdd, 0x78, 0x4, 0xc2, 0x0, 0x80, 0x5f, 0xbe, 0xd0, 0x1, 0x28, + 0xd, 0x7e, 0x73, 0x39, 0x3f, 0xbe, 0x71, 0x19, 0x28, 0x4, 0xc2, 0x0, 0x80, + 0x4d, 0xc2, 0x0, 0x7e, 0x53, 0x67, 0x62, 0xbc, 0x5d, 0x78, 0x11, 0x12, 0x86, + 0x48, 0x50, 0x5, 0x7e, 0xe0, 0x3, 0x80, 0x3, 0x7e, 0xe0, 0x1, 0xd2, 0x0, + 0x80, 0x32, 0x7e, 0x43, 0x38, 0xde, 0xa, 0x34, 0xa, 0x25, 0x7d, 0x12, 0x9d, + 0x13, 0xb, 0x14, 0xa, 0x3d, 0xbd, 0x31, 0x78, 0x7, 0x7e, 0xe0, 0x1, 0xd2, + 0x0, 0x80, 0x17, 0x7e, 0x73, 0x38, 0xa0, 0xa, 0x37, 0x9d, 0x23, 0xb, 0x24, + 0x7e, 0x73, 0x39, 0x40, 0xbd, 0x32, 0x78, 0x5, 0x7e, 0xe0, 0x3, 0xd2, 0x0, + 0x30, 0x0, 0x5, 0x7c, 0xbe, 0x12, 0x82, 0x73, 0x7e, 0x8, 0x38, 0xe0, 0x12, + 0x81, 0x5d, 0x7a, 0xb3, 0x38, 0xdd, 0x7e, 0xa3, 0x38, 0xdd, 0x7a, 0xa3, + 0x67, 0x62, 0x74, 0x2, 0xa4, 0xca, 0x59, 0x7e, 0x18, 0x38, 0xa1, 0x7e, 0x8, + 0x65, 0x60, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x7e, 0x73, 0x67, 0x62, 0x7a, 0x73, + 0x39, 0x40, 0x12, 0x86, 0xb9, 0x7a, 0xb3, 0x39, 0x3f, 0x80, 0xd, 0x74, 0x64, + 0x7a, 0xb3, 0x39, 0x3f, 0x7a, 0xf3, 0x39, 0x40, 0x12, 0x86, 0x3d, 0xda, + 0x79, 0xda, 0xd8, 0x22, 0xa, 0x5b, 0x7d, 0x45, 0x9d, 0x48, 0xbe, 0x44, 0x0, + 0x0, 0x22, 0x74, 0xff, 0x7a, 0xb3, 0x39, 0x3b, 0x7a, 0xb3, 0x39, 0x3a, 0x22, + 0x6c, 0xaa, 0x80, 0x12, 0x7e, 0x70, 0xd, 0xac, 0x7a, 0x9, 0xb3, 0x65, 0xe2, + 0xbe, 0xb0, 0x10, 0x28, 0x2, 0xd3, 0x22, 0xb, 0xa0, 0x7e, 0xb3, 0x67, 0x78, + 0xbc, 0xba, 0x38, 0xe6, 0xc3, 0x22, 0xd2, 0x6, 0x7e, 0xa3, 0x67, 0x62, 0xbe, + 0xa0, 0x3, 0x50, 0x2, 0xc3, 0x22, 0x6c, 0x77, 0x80, 0x39, 0xa, 0x27, 0xb, + 0x24, 0x7c, 0x65, 0x80, 0x2b, 0x7e, 0x50, 0x2, 0xac, 0x56, 0x9, 0x12, 0x65, + 0x60, 0x7e, 0x30, 0x2, 0xac, 0x37, 0x9, 0xb1, 0x65, 0x60, 0xbc, 0xb1, 0x78, + 0x2, 0x80, 0xc, 0x9, 0x52, 0x65, 0x61, 0x9, 0xb1, 0x65, 0x61, 0xbc, 0xb5, + 0x78, 0x5, 0xc2, 0x6, 0xa2, 0x6, 0x22, 0xb, 0x60, 0xbc, 0xa6, 0x38, 0xd1, + 0xb, 0x70, 0xbc, 0xa7, 0x38, 0xc3, 0xa2, 0x6, 0x22, 0xca, 0x3b, 0x7e, 0xa0, + 0x64, 0x6c, 0x77, 0x80, 0x69, 0xa, 0x27, 0xb, 0x24, 0x7c, 0x65, 0x80, 0x57, + 0x7e, 0xf0, 0x2, 0xac, 0xf6, 0x9, 0xb7, 0x65, 0x60, 0xa, 0xb, 0x7e, 0xd0, + 0x2, 0xac, 0xd7, 0x9, 0xb6, 0x65, 0x60, 0xa, 0x2b, 0x7d, 0x12, 0x12, 0x6f, + 0xd5, 0x8, 0x4, 0x9d, 0x20, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x21, 0x9, 0x47, + 0x65, 0x61, 0xa, 0x44, 0x9, 0x46, 0x65, 0x61, 0xa, 0x14, 0x7d, 0x1, 0x9d, + 0x4, 0xbe, 0x4, 0x0, 0x0, 0x8, 0x4, 0x9d, 0x14, 0x80, 0x4, 0x6d, 0x11, 0x9d, + 0x10, 0x7c, 0x43, 0xbc, 0x45, 0x50, 0x4, 0x7c, 0x35, 0x80, 0x2, 0x7c, 0x34, + 0xbc, 0xa3, 0x28, 0x2, 0x7c, 0xa3, 0xb, 0x60, 0x7e, 0x23, 0x67, 0x62, 0xbc, + 0x26, 0x38, 0xa1, 0xb, 0x70, 0x7e, 0xb3, 0x67, 0x62, 0xbc, 0xb7, 0x38, 0x8f, + 0xbe, 0xa0, 0x64, 0x78, 0x2, 0x6c, 0xaa, 0x7c, 0xba, 0xda, 0x3b, 0x22, 0xca, + 0x69, 0x7d, 0x42, 0x7f, 0x70, 0x7c, 0x37, 0x7c, 0xab, 0x7e, 0x70, 0x2, 0x7c, + 0xd3, 0xac, 0xd7, 0x49, 0xd6, 0x38, 0xfe, 0x7c, 0x1a, 0xac, 0x17, 0x49, + 0x80, 0x38, 0xfe, 0x7d, 0xc8, 0x2d, 0xcd, 0x7e, 0xb4, 0x0, 0x2, 0x7d, 0x3c, + 0x7d, 0x2b, 0x12, 0x1, 0x20, 0x7d, 0x23, 0x7d, 0xa4, 0x9d, 0xa2, 0xbe, 0xa4, + 0x0, 0x0, 0x8, 0x6, 0x7d, 0x34, 0x9d, 0x32, 0x80, 0x4, 0x6d, 0x33, 0x9d, + 0x3a, 0x7d, 0x24, 0x7d, 0xb4, 0x1a, 0x24, 0x1a, 0xa4, 0x7f, 0x65, 0x9f, + 0x67, 0x7d, 0x2d, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x6, 0x7f, 0x5, 0x9f, 0x7, + 0x80, 0x10, 0x7d, 0x12, 0x1a, 0x2, 0x1a, 0x0, 0x6e, 0x14, 0xff, 0xff, 0x6e, + 0x4, 0xff, 0xff, 0xb, 0xc, 0x7d, 0x21, 0x7e, 0x14, 0x0, 0x4, 0xad, 0x13, + 0xbd, 0x12, 0x58, 0xf, 0xbe, 0x24, 0x0, 0x64, 0x8, 0x9, 0xbe, 0x34, 0x0, + 0x64, 0x8, 0x3, 0xd3, 0x80, 0x1, 0xc3, 0xda, 0x69, 0x22, 0xca, 0x79, 0x7c, + 0xab, 0xd2, 0x0, 0x6c, 0x99, 0x80, 0x48, 0x7e, 0xf0, 0xd, 0xac, 0xf9, 0x9, + 0xb7, 0x67, 0x97, 0xbc, 0xba, 0x78, 0x39, 0x49, 0x57, 0x67, 0x95, 0xbd, + 0x50, 0x38, 0x10, 0xbd, 0x51, 0x40, 0xc, 0x49, 0x17, 0x67, 0x93, 0xbd, 0x12, + 0x38, 0x4, 0xbd, 0x13, 0x50, 0x2, 0xc2, 0x0, 0x30, 0x0, 0x18, 0x49, 0x37, + 0x67, 0x93, 0xbe, 0x34, 0x2, 0xd0, 0x50, 0xe, 0xbe, 0x34, 0x1, 0x68, 0x28, + 0x8, 0xbe, 0x54, 0x0, 0x64, 0x50, 0x2, 0xc2, 0x0, 0xa2, 0x0, 0x80, 0xc, 0xb, + 0x90, 0x7e, 0xb3, 0x69, 0x69, 0xbc, 0xb9, 0x38, 0xb0, 0xa2, 0x0, 0xda, 0x79, + 0x22, 0x7f, 0x71, 0x7f, 0x60, 0x30, 0x32, 0x6, 0x7e, 0xb3, 0x9b, 0xae, 0x70, + 0x9, 0x7e, 0x8, 0x1, 0x3c, 0x12, 0x8c, 0x28, 0x1, 0xc6, 0x6c, 0x11, 0xa, + 0x31, 0x2d, 0x3f, 0x7d, 0x2e, 0x7e, 0x1b, 0xb0, 0x60, 0x9, 0xe4, 0xa, 0x31, + 0x19, 0xb3, 0x1, 0x3c, 0x80, 0x67, 0xa, 0x31, 0x9, 0xb3, 0x1, 0x3c, 0x60, + 0x5f, 0x7e, 0x70, 0xd, 0xac, 0x71, 0x2e, 0x34, 0x1, 0xc8, 0x7e, 0x23, 0x69, + 0x69, 0x7c, 0xb2, 0x4, 0x7a, 0xb3, 0x69, 0x69, 0x7e, 0x30, 0xd, 0xac, 0x23, + 0x12, 0x88, 0xcb, 0x7e, 0x90, 0xd, 0xac, 0x91, 0x49, 0x34, 0x1, 0xc8, 0x74, + 0x8, 0xac, 0xb1, 0x7f, 0x56, 0x2d, 0xb5, 0x79, 0x35, 0x0, 0x2, 0x49, 0x34, + 0x1, 0xca, 0x2d, 0x5d, 0x7d, 0x4c, 0x79, 0x32, 0x0, 0x4, 0x74, 0x1, 0xa, + 0x31, 0x2d, 0x3f, 0x7d, 0x2e, 0x7a, 0x1b, 0xb0, 0xa, 0x31, 0x9, 0x3, 0x1, + 0x0, 0xa, 0x11, 0x19, 0x1, 0x1, 0x14, 0x2e, 0x34, 0x1, 0x3c, 0x7e, 0x39, + 0xb0, 0x14, 0x7a, 0x39, 0xb0, 0xb, 0x10, 0xa5, 0xb9, 0xa, 0x2, 0x80, 0x2, + 0x1, 0x41, 0x7e, 0xb3, 0x69, 0x69, 0x22, 0x2e, 0x14, 0x67, 0x93, 0x74, 0xd, + 0x2, 0x1, 0xf3, 0xca, 0x3b, 0x6c, 0xff, 0x6c, 0xee, 0x6c, 0x11, 0x7e, 0x30, + 0xd, 0xac, 0x31, 0x7d, 0x31, 0x2e, 0x34, 0x67, 0x93, 0x2e, 0x14, 0x92, 0x8, + 0x12, 0x9e, 0x3, 0xa5, 0xb9, 0xa, 0xea, 0x7e, 0x8, 0x67, 0x93, 0x12, 0x8c, + 0x30, 0x6c, 0x11, 0x7e, 0x90, 0xd, 0xac, 0x91, 0x9, 0xd4, 0x92, 0xc, 0xbe, + 0xd0, 0xff, 0x68, 0x45, 0x74, 0x8, 0xac, 0xbd, 0x9, 0xc5, 0x69, 0x19, 0xbe, + 0xc0, 0x2, 0x68, 0x4, 0x4c, 0xcc, 0x78, 0x12, 0x7d, 0x34, 0x2e, 0x34, 0x92, + 0x8, 0x7e, 0x30, 0xd, 0xac, 0x3f, 0x12, 0x88, 0xcb, 0xb, 0xf0, 0x80, 0x22, + 0xbe, 0xc0, 0x1, 0x78, 0x1d, 0x7d, 0x34, 0x2e, 0x34, 0x92, 0x8, 0xa, 0x2e, + 0x7e, 0x3, 0x69, 0x69, 0xa, 0x40, 0x2d, 0x42, 0x7e, 0x54, 0x0, 0xd, 0xad, + 0x54, 0x7d, 0x15, 0x12, 0x88, 0xcb, 0xb, 0xe0, 0xb, 0x10, 0xbe, 0x10, 0xa, + 0x40, 0xa6, 0xda, 0x3b, 0x22, 0xca, 0x3b, 0x7f, 0x51, 0x7f, 0x60, 0x7e, 0x8, + 0x92, 0x24, 0x12, 0x8c, 0x28, 0x7e, 0x8, 0x92, 0x2e, 0x12, 0x3c, 0x6b, 0x7e, + 0x8, 0x92, 0x38, 0x12, 0x8c, 0x30, 0x7e, 0x84, 0x0, 0x5a, 0x7a, 0x85, 0x2a, + 0x7e, 0x97, 0x76, 0x1b, 0x9e, 0x94, 0x0, 0x5b, 0x7e, 0x67, 0x76, 0x29, 0x9e, + 0x64, 0x0, 0x5b, 0x6c, 0xee, 0x61, 0x1, 0xa, 0x3e, 0x2d, 0x3b, 0x7d, 0x2a, + 0x7e, 0x1b, 0xb0, 0xb4, 0x1, 0x2, 0x80, 0x2, 0x41, 0x80, 0x12, 0x8c, 0x7, + 0xb4, 0x1, 0x6, 0x74, 0x3, 0x39, 0xb0, 0x0, 0x1, 0x2d, 0x3d, 0x7d, 0x2c, + 0x29, 0xb1, 0x0, 0x1, 0xb4, 0x3, 0x2, 0x80, 0x2, 0x41, 0x5c, 0xa, 0x3e, 0x9, + 0x63, 0x1, 0x14, 0xa, 0x2e, 0x9, 0x72, 0x1, 0x0, 0xbc, 0x67, 0x40, 0x2, + 0x41, 0x58, 0x7e, 0xb3, 0x9b, 0x84, 0xb4, 0x1, 0x2, 0x80, 0x2, 0x41, 0x58, + 0x7c, 0xbe, 0x7e, 0x35, 0x2a, 0x7d, 0x29, 0x7d, 0x18, 0x7d, 0x6, 0x12, 0x87, + 0xca, 0x50, 0x72, 0xa, 0x3e, 0x2e, 0x34, 0x1, 0x14, 0x7e, 0x39, 0xb0, 0x4, + 0x7a, 0x39, 0xb0, 0x74, 0x1, 0xa, 0x3e, 0x19, 0xb3, 0x92, 0x24, 0x7e, 0xa0, + 0x3, 0x12, 0x8b, 0xfa, 0x6c, 0xff, 0x80, 0x49, 0x7e, 0x70, 0xd, 0xac, 0x7f, + 0x9, 0xb3, 0x67, 0x97, 0xf5, 0x27, 0xbe, 0xe1, 0x27, 0x78, 0x37, 0x2e, 0x34, + 0x67, 0x93, 0x7e, 0x14, 0x0, 0x2c, 0x74, 0xd, 0x12, 0x1, 0xf3, 0x7e, 0x8, + 0x67, 0x93, 0x7e, 0xb3, 0x69, 0x69, 0x7c, 0x7f, 0x12, 0x8d, 0x2e, 0x40, + 0x1b, 0x74, 0x2, 0xa, 0x3e, 0x19, 0xb3, 0x1, 0x3c, 0x7e, 0x70, 0xd, 0xac, + 0x7f, 0x12, 0x9d, 0xfb, 0xac, 0x3e, 0x2e, 0x14, 0x1, 0xc8, 0x74, 0xd, 0x12, + 0x1, 0xf3, 0xb, 0xf0, 0x7e, 0x73, 0x69, 0x69, 0xbc, 0x7f, 0x38, 0xaf, 0x41, + 0xf5, 0x6c, 0xaa, 0x80, 0x1f, 0x12, 0x8b, 0xdc, 0x29, 0xb1, 0x0, 0x1, 0x70, + 0x5, 0x7e, 0xa0, 0x2, 0x80, 0x11, 0x12, 0x8b, 0xdc, 0x29, 0xb1, 0x0, 0x1, + 0xb4, 0x2, 0x2, 0x80, 0x2, 0x41, 0xf5, 0x7e, 0xa0, 0x2, 0x12, 0x8b, 0xfa, + 0x80, 0x75, 0x12, 0x8c, 0x7, 0xbe, 0xb0, 0x2, 0x68, 0x2, 0x70, 0x53, 0xa, + 0x2e, 0x9, 0xb2, 0x1, 0xa, 0x9, 0xa2, 0x1, 0x1e, 0xbc, 0xab, 0x50, 0x27, + 0xa, 0x2e, 0x9, 0xb2, 0x1, 0x32, 0x70, 0x1f, 0xa, 0x2e, 0x2e, 0x24, 0x1, + 0x1e, 0x7c, 0xba, 0x4, 0x7a, 0x29, 0xb0, 0x74, 0x2, 0x7a, 0xb, 0xb0, 0x74, + 0x1, 0xa, 0x2e, 0x19, 0xb2, 0x92, 0x2e, 0x19, 0xb2, 0x1, 0x28, 0x80, 0x36, + 0x74, 0x1, 0x7f, 0x6, 0x2d, 0x13, 0x7a, 0xb, 0xb0, 0xe4, 0xa, 0x2e, 0x19, + 0xb2, 0x1, 0x14, 0x19, 0xb2, 0x1, 0x1e, 0x19, 0xb2, 0x1, 0x28, 0x19, 0xb2, + 0x1, 0x32, 0x80, 0x18, 0x74, 0x3, 0x2d, 0x3d, 0x7d, 0x2c, 0x7a, 0x1b, 0xb0, + 0xe4, 0xa, 0x3e, 0x19, 0xb3, 0x1, 0x14, 0x19, 0xb3, 0x1, 0x1e, 0x19, 0xb3, + 0x1, 0x28, 0x12, 0x8b, 0xe5, 0x7e, 0xb, 0x70, 0x39, 0x70, 0x0, 0x1, 0xb, + 0xe0, 0x12, 0x8b, 0xd5, 0x28, 0x2, 0x21, 0x8e, 0x75, 0x28, 0x0, 0x6c, 0xee, + 0x80, 0x1d, 0x7e, 0x70, 0xd, 0xac, 0x7e, 0x9, 0x53, 0x67, 0x97, 0x7a, 0x51, + 0x27, 0xa, 0x25, 0x9, 0xb2, 0x92, 0x24, 0x70, 0x7, 0x2e, 0x34, 0x67, 0x93, + 0x12, 0x8c, 0x15, 0xb, 0xe0, 0x7e, 0x73, 0x69, 0x69, 0xbc, 0x7e, 0x38, 0xdb, + 0x75, 0x29, 0x0, 0x6c, 0xee, 0x80, 0x45, 0xa, 0x3e, 0x9, 0xb3, 0x92, 0x2e, + 0x60, 0x3b, 0x5, 0x29, 0x6c, 0xff, 0x7e, 0x70, 0xd, 0xac, 0x7f, 0x9, 0xb3, + 0x1, 0x4a, 0xf5, 0x27, 0xbe, 0xe1, 0x27, 0x78, 0x20, 0x49, 0x23, 0x1, 0x46, + 0x12, 0x8b, 0xe5, 0x79, 0x20, 0x0, 0x2, 0x49, 0x23, 0x1, 0x48, 0x7f, 0x6, + 0x2d, 0x15, 0x79, 0x20, 0x0, 0x4, 0x2e, 0x34, 0x1, 0x46, 0x12, 0x8c, 0x15, + 0x80, 0x7, 0xb, 0xf0, 0xbe, 0xf0, 0xa, 0x40, 0xc9, 0xb, 0xe0, 0x12, 0x8b, + 0xd5, 0x38, 0xb6, 0x7e, 0xf1, 0x28, 0x6c, 0xee, 0x80, 0x16, 0x12, 0x8b, + 0xdc, 0x7e, 0x1b, 0xb0, 0xb4, 0x1, 0xb, 0x7c, 0xaf, 0xb, 0xf0, 0x74, 0xd, + 0xa4, 0x19, 0xe5, 0x92, 0x3c, 0xb, 0xe0, 0x12, 0x8b, 0xd5, 0x38, 0xe5, 0x6c, + 0xee, 0x12, 0x8b, 0xee, 0x2e, 0x14, 0x1, 0x46, 0x74, 0xd, 0x12, 0x1, 0xf3, + 0x12, 0x8b, 0xee, 0x12, 0x88, 0xcb, 0xb, 0xe0, 0xbe, 0xe0, 0xa, 0x40, 0xe7, + 0xe5, 0x28, 0x7a, 0xb3, 0x69, 0x69, 0x7e, 0xb3, 0x2, 0x4a, 0x25, 0x29, 0x7a, + 0xb3, 0x2, 0x4a, 0xda, 0x3b, 0x22, 0x7e, 0x73, 0x75, 0x8c, 0xbc, 0x7e, 0x22, + 0x74, 0x8, 0xac, 0xbe, 0x7f, 0x16, 0x2d, 0x35, 0x22, 0x74, 0x8, 0xac, 0xbe, + 0x7f, 0x6, 0x2d, 0x15, 0x22, 0x7e, 0x30, 0xd, 0xac, 0x3e, 0x7d, 0x31, 0x2e, + 0x34, 0x92, 0x38, 0x22, 0x7e, 0x70, 0x8, 0xac, 0x7e, 0x2d, 0x3d, 0x7d, 0x2c, + 0x7a, 0x1b, 0xa0, 0x22, 0x7e, 0x70, 0x8, 0xac, 0x7e, 0x7f, 0x6, 0x2d, 0x13, + 0x29, 0xb0, 0x0, 0x1, 0x22, 0x7e, 0x31, 0x28, 0x7c, 0xb3, 0x4, 0xf5, 0x28, + 0x74, 0xd, 0xac, 0x3b, 0x2e, 0x14, 0x92, 0x38, 0x2, 0x1, 0xf3, 0x7e, 0x34, + 0x0, 0xa, 0xe4, 0x2, 0x0, 0x2e, 0x7e, 0x34, 0x0, 0x82, 0x74, 0xff, 0x2, 0x0, + 0x2e, 0xca, 0xf8, 0x7f, 0x60, 0x6c, 0xff, 0x12, 0x8c, 0x6b, 0x30, 0xe2, 0x5, + 0x7c, 0xbf, 0x12, 0x8c, 0x75, 0xb, 0xf0, 0xbe, 0xf0, 0xa, 0x78, 0xee, 0x6c, + 0xff, 0x12, 0x8c, 0x6b, 0x30, 0xe3, 0x5, 0x7c, 0xbf, 0x12, 0x8c, 0xfd, 0xb, + 0xf0, 0xbe, 0xf0, 0xa, 0x40, 0xee, 0x12, 0x88, 0xd4, 0xda, 0xf8, 0x22, 0xa, + 0x3f, 0x2d, 0x3d, 0x7d, 0x2c, 0x7e, 0x1b, 0xb0, 0x22, 0x7c, 0x1b, 0x7e, 0x3, + 0x75, 0x8c, 0xa, 0x30, 0x1b, 0x34, 0x7c, 0x7, 0x80, 0x12, 0xbc, 0x10, 0x68, + 0xc, 0x12, 0x8c, 0xf4, 0x9, 0xb1, 0x69, 0x19, 0xbe, 0xb0, 0x3, 0x68, 0x7, + 0x1b, 0x0, 0xbe, 0x0, 0x0, 0x58, 0xe9, 0xbe, 0x0, 0x0, 0x58, 0x2, 0x7c, 0x1, + 0x6c, 0x99, 0x80, 0x46, 0x1a, 0xe9, 0x7e, 0xf4, 0x0, 0xd, 0xad, 0xfe, 0x9, + 0x8f, 0x67, 0x97, 0xbc, 0x81, 0x78, 0x2a, 0x12, 0xbd, 0x67, 0x7d, 0x1f, + 0x12, 0x88, 0xcb, 0x1a, 0x29, 0x7e, 0x34, 0x0, 0xd, 0xad, 0x32, 0x19, 0x3, + 0x67, 0x97, 0xe4, 0x12, 0x8c, 0xf4, 0x19, 0xb1, 0x69, 0x1a, 0x19, 0xb1, + 0x69, 0x19, 0x12, 0x6f, 0xe3, 0x7c, 0xb0, 0x12, 0x6f, 0xed, 0x80, 0xa, 0xbc, + 0x80, 0x78, 0x6, 0x74, 0xff, 0x19, 0xbf, 0x67, 0x97, 0xb, 0x90, 0x7e, 0x83, + 0x75, 0x8c, 0xbc, 0x89, 0x18, 0xb2, 0x22, 0x1a, 0x10, 0x3e, 0x14, 0x3e, + 0x14, 0x3e, 0x14, 0x22, 0x7c, 0x7b, 0x74, 0x8, 0xac, 0xb7, 0x9, 0xb5, 0x69, + 0x19, 0xb4, 0x1, 0x23, 0x7e, 0x63, 0x69, 0x69, 0x80, 0x15, 0x7e, 0x50, 0xd, + 0xac, 0x56, 0x9, 0x32, 0x67, 0x97, 0xbc, 0x37, 0x78, 0x6, 0x74, 0xff, 0x19, + 0xb2, 0x67, 0x97, 0xb, 0x60, 0xbe, 0x60, 0xa, 0x40, 0xe6, 0x12, 0xbd, 0x7c, + 0x22, 0xca, 0x79, 0x7c, 0x6b, 0x85, 0x33, 0x3f, 0x7e, 0xa1, 0x34, 0x6c, + 0x55, 0x80, 0x67, 0xbc, 0x57, 0x68, 0x61, 0x7e, 0x90, 0xd, 0xac, 0x95, 0x7f, + 0x70, 0x2d, 0xf4, 0x29, 0x47, 0x0, 0x7, 0x7a, 0x41, 0x40, 0x29, 0xb7, 0x0, + 0x8, 0xf5, 0x41, 0xe5, 0x3f, 0xa, 0xfb, 0xa, 0x44, 0x9d, 0x4f, 0xbe, 0x44, + 0x0, 0x0, 0x8, 0xb, 0xe5, 0x3f, 0xa, 0xeb, 0xe5, 0x40, 0x12, 0x8d, 0xb4, + 0x80, 0x3, 0x12, 0x8d, 0xab, 0xf5, 0x42, 0xa, 0xfa, 0xe5, 0x41, 0xa, 0x4b, + 0x9d, 0x4f, 0xbe, 0x44, 0x0, 0x0, 0x8, 0x9, 0xa, 0xea, 0xe5, 0x41, 0x12, + 0x8d, 0xb4, 0x80, 0x3, 0x12, 0x8d, 0xab, 0xf5, 0x43, 0xe5, 0x42, 0xbe, 0xb0, + 0x4, 0x38, 0xa, 0xe5, 0x43, 0xbe, 0xb0, 0x3, 0x38, 0x3, 0xd3, 0x80, 0x7, + 0xb, 0x50, 0xbc, 0x65, 0x38, 0x95, 0xc3, 0xda, 0x79, 0x22, 0x6e, 0x44, 0xff, + 0xff, 0xb, 0x44, 0x7c, 0xb9, 0x22, 0xa, 0xfb, 0x9d, 0xfe, 0x7d, 0x7f, 0x7c, + 0xbf, 0x22, 0xca, 0x3b, 0xe4, 0x7a, 0xb3, 0x37, 0xd1, 0x12, 0xba, 0xeb, + 0x78, 0x2, 0xc1, 0x6c, 0x6c, 0xdd, 0x80, 0x64, 0x6c, 0xcc, 0x7e, 0x30, 0xd, + 0xac, 0x3d, 0x9, 0xf1, 0x67, 0x97, 0x5e, 0xf0, 0xf, 0x12, 0x8e, 0x6f, 0x9, + 0xb1, 0x67, 0x9a, 0x9, 0x71, 0x67, 0x9b, 0x49, 0x21, 0x67, 0x93, 0x49, 0x11, + 0x67, 0x95, 0x7c, 0x6f, 0x12, 0xbd, 0xea, 0x4c, 0xee, 0x78, 0xb, 0x7c, 0xbd, + 0x7c, 0x7f, 0x12, 0x8e, 0x78, 0x7c, 0xcb, 0x80, 0xe, 0xbe, 0xe0, 0x2, 0x78, + 0x9, 0x7c, 0xbd, 0x7c, 0x7f, 0x12, 0x8f, 0x5e, 0x7c, 0xcb, 0x7c, 0x1d, 0x2e, + 0x10, 0x27, 0x7c, 0xbc, 0xa5, 0xf7, 0x7e, 0x70, 0x15, 0xac, 0x7f, 0x9, 0xb3, + 0x37, 0x0, 0xbe, 0xb0, 0xff, 0x50, 0x8, 0x2e, 0x34, 0x37, 0x0, 0x4, 0x7a, + 0x39, 0xb0, 0xb, 0xd0, 0x7e, 0x73, 0x69, 0x69, 0xbc, 0x7d, 0x38, 0x94, 0x7e, + 0x8, 0x0, 0x27, 0x12, 0xbd, 0x1, 0x6c, 0xff, 0xe4, 0xa, 0x3f, 0x19, 0xb3, + 0x91, 0xfe, 0x12, 0x8e, 0x6f, 0xbe, 0xe0, 0x1, 0x78, 0xb, 0x7c, 0xbf, 0x12, + 0xbd, 0x88, 0xa, 0x3f, 0x19, 0xb3, 0x91, 0xfe, 0xb, 0xf0, 0xbe, 0xf0, 0xa, + 0x78, 0xdf, 0x7e, 0x8, 0x91, 0xfe, 0x12, 0x8c, 0x39, 0xda, 0x3b, 0x22, 0x74, + 0x8, 0xac, 0xbf, 0x9, 0xe5, 0x69, 0x19, 0x22, 0xca, 0xd8, 0xca, 0x79, 0x7c, + 0xe7, 0x7c, 0xdb, 0x6c, 0xff, 0x7c, 0xbd, 0x7c, 0x7e, 0x12, 0x9b, 0x59, + 0x1b, 0xb1, 0x68, 0x1b, 0x14, 0x68, 0x29, 0x14, 0x68, 0x30, 0x24, 0x3, 0x78, + 0x37, 0x12, 0x8e, 0xff, 0x40, 0x7, 0x7c, 0xbd, 0x12, 0x8f, 0xfc, 0x50, 0x28, + 0x12, 0x8e, 0xec, 0x80, 0x23, 0x12, 0x8e, 0xff, 0x40, 0x7, 0x7c, 0xbd, 0x12, + 0x8f, 0xfc, 0x50, 0x17, 0x12, 0x8e, 0xec, 0x80, 0x12, 0x12, 0x8e, 0xff, + 0x50, 0xd, 0x12, 0x8e, 0xec, 0x80, 0x8, 0x12, 0x8e, 0xff, 0x50, 0x3, 0x12, + 0x8e, 0xec, 0x7e, 0xf0, 0x1, 0x7e, 0x70, 0xd, 0xac, 0x7d, 0x2e, 0x34, 0x67, + 0x93, 0x7e, 0x30, 0x15, 0xac, 0x3e, 0x2e, 0x14, 0x37, 0x7, 0x74, 0xd, 0x12, + 0x1, 0xf3, 0x7c, 0xbf, 0xda, 0x79, 0xda, 0xd8, 0x22, 0x7e, 0xa0, 0x2, 0x7e, + 0x70, 0x15, 0xac, 0x7e, 0x19, 0xa3, 0x37, 0x1, 0x74, 0x14, 0x19, 0xb3, 0x37, + 0x6, 0x22, 0x7e, 0xa0, 0x1, 0x7e, 0x70, 0x15, 0xac, 0x7e, 0x19, 0xa3, 0x37, + 0x1, 0x7c, 0xbe, 0x7c, 0x3b, 0x7e, 0xb3, 0x59, 0x47, 0x7e, 0x60, 0x8, 0xb4, + 0x1, 0x8, 0x7e, 0x70, 0x5, 0x7e, 0xa0, 0x8, 0x80, 0x6, 0x7e, 0x70, 0x6, + 0x7e, 0xa0, 0x9, 0x7e, 0x50, 0x15, 0xac, 0x53, 0x9, 0xb2, 0x36, 0xff, 0xbe, + 0xb0, 0x1, 0x68, 0x3, 0xb4, 0x2, 0xa, 0x9, 0x22, 0x37, 0x3, 0xbc, 0x26, + 0x40, 0x1c, 0xd3, 0x22, 0xb4, 0x3, 0xa, 0x9, 0x22, 0x37, 0x5, 0xbc, 0x27, + 0x40, 0xf, 0xd3, 0x22, 0xb4, 0x4, 0xa, 0x9, 0xb2, 0x37, 0x5, 0xbc, 0xba, + 0x40, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0xca, 0x79, 0x7c, 0xf7, 0x7c, 0xeb, 0x12, + 0x8f, 0xf4, 0x9, 0xb3, 0x37, 0x1, 0xb4, 0x1, 0x2a, 0x7c, 0xbe, 0x7c, 0x7f, + 0x6c, 0x66, 0x12, 0xbc, 0x74, 0x50, 0x2, 0x80, 0x2c, 0x7c, 0xbf, 0x12, 0x8f, + 0xd, 0x40, 0x7, 0x7c, 0xbe, 0x12, 0x8f, 0xfc, 0x50, 0x63, 0x7e, 0xa0, 0x2, + 0x7e, 0x70, 0x15, 0xac, 0x7f, 0x12, 0x8e, 0xf4, 0x80, 0x56, 0x80, 0x54, + 0xb4, 0x2, 0x54, 0x7c, 0xbe, 0x7c, 0x7f, 0x7e, 0x60, 0x1, 0x12, 0xbc, 0x74, + 0x50, 0xc, 0x12, 0x8f, 0xf4, 0x19, 0xa3, 0x37, 0x1, 0x7e, 0xa0, 0x2, 0x80, + 0x3c, 0x7c, 0xbf, 0x12, 0x8f, 0xd, 0x40, 0x7, 0x7c, 0xbe, 0x12, 0x8f, 0xfc, + 0x50, 0xe, 0x7e, 0xa0, 0x14, 0x7e, 0x70, 0x15, 0xac, 0x7f, 0x19, 0xa3, 0x37, + 0x6, 0x80, 0x1d, 0x7e, 0x90, 0x15, 0xac, 0x9f, 0x9, 0xb4, 0x37, 0x6, 0x60, + 0xc, 0x7d, 0x34, 0x2e, 0x34, 0x37, 0x6, 0x14, 0x7a, 0x39, 0xb0, 0x80, 0x6, + 0x74, 0x1, 0x19, 0xb4, 0x37, 0x1, 0x7e, 0xa0, 0x1, 0x7c, 0xba, 0xda, 0x79, + 0x22, 0x6c, 0xaa, 0x7e, 0x70, 0x15, 0xac, 0x7f, 0x22, 0xca, 0xf8, 0x7c, + 0x7b, 0xc2, 0x0, 0x7e, 0x90, 0xd, 0xac, 0x97, 0x9, 0xa4, 0x67, 0x9a, 0x4c, + 0xaa, 0x78, 0x5, 0x7e, 0xf0, 0x1, 0x80, 0xd, 0xbe, 0xa0, 0x11, 0x78, 0x5, + 0x7e, 0xf0, 0x10, 0x80, 0x3, 0xc3, 0x80, 0x44, 0x9, 0x94, 0x67, 0x9b, 0x7c, + 0xba, 0x7c, 0x79, 0x12, 0x2e, 0x40, 0x7d, 0x3, 0xbe, 0x4, 0x3, 0x20, 0x8, + 0x3, 0xc3, 0x80, 0x2e, 0x7c, 0xbf, 0x7c, 0x79, 0x12, 0x2e, 0x40, 0x7d, 0x13, + 0xbe, 0x14, 0x0, 0x0, 0x58, 0x5, 0xd2, 0x0, 0xd3, 0x80, 0x1a, 0x7d, 0x30, + 0x1a, 0x26, 0x1a, 0x24, 0x2f, 0x11, 0x2f, 0x11, 0x2f, 0x11, 0xb, 0x14, 0x12, + 0x1, 0x6c, 0xbe, 0x70, 0x32, 0x28, 0x2, 0xd2, 0x0, 0xa2, 0x0, 0xda, 0xf8, + 0x22, 0xa, 0x3b, 0x9, 0xb3, 0x1, 0x28, 0x22, 0xca, 0x3b, 0x7e, 0xb3, 0x69, + 0x75, 0xf5, 0x29, 0x75, 0x3b, 0xa, 0x7e, 0x68, 0x69, 0x19, 0x7e, 0x58, 0x67, + 0x93, 0x74, 0xa, 0x7a, 0xb3, 0x92, 0x8, 0x74, 0x2, 0x7a, 0xb3, 0x92, 0x9, + 0x7e, 0x84, 0x0, 0x64, 0x7a, 0x85, 0x31, 0x7e, 0x97, 0x76, 0x1b, 0x7d, 0x39, + 0x9e, 0x34, 0x0, 0x65, 0x7a, 0x35, 0x33, 0x7a, 0x85, 0x35, 0x7e, 0x77, 0x76, + 0x29, 0x7d, 0x87, 0x9e, 0x84, 0x0, 0x65, 0x7a, 0x85, 0x37, 0x6d, 0x88, 0x7a, + 0x85, 0x39, 0x1b, 0x94, 0x9e, 0x74, 0x0, 0x3d, 0x6c, 0xdd, 0xc1, 0xb1, 0x7e, + 0x50, 0xd, 0xac, 0x5d, 0x7f, 0x75, 0x2d, 0xf2, 0x29, 0xc7, 0x0, 0x4, 0xbe, + 0xc0, 0xa, 0x40, 0x2, 0xc1, 0xaf, 0xb, 0x7a, 0x30, 0xbe, 0x35, 0x39, 0x28, + 0x4, 0xbd, 0x39, 0x40, 0x5, 0x75, 0x27, 0x1, 0x80, 0x3, 0x75, 0x27, 0x0, + 0x69, 0x37, 0x0, 0x2, 0xbd, 0x38, 0x28, 0x4, 0xbd, 0x37, 0x40, 0x5, 0x75, + 0x28, 0x1, 0x80, 0x3, 0x75, 0x28, 0x0, 0x74, 0x8, 0xac, 0xbc, 0x7f, 0x6, + 0x2d, 0x15, 0x7e, 0xb, 0xb0, 0xb4, 0x2, 0x2, 0x80, 0x2, 0xc1, 0x94, 0x12, + 0x96, 0xef, 0xb, 0x7a, 0x10, 0x7d, 0x31, 0x9d, 0x30, 0x7a, 0x37, 0x92, 0x2, + 0x49, 0x55, 0x2f, 0xc7, 0x7f, 0x75, 0x2d, 0xf2, 0x69, 0x27, 0x0, 0x2, 0x7d, + 0x2, 0x9d, 0x5, 0x7a, 0x7, 0x92, 0x4, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x6, 0x7e, + 0x37, 0x92, 0x2, 0x80, 0x6, 0x6d, 0x33, 0x9e, 0x37, 0x92, 0x2, 0x7a, 0x37, + 0x91, 0xfe, 0x7e, 0x37, 0x92, 0x4, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x6, 0x7e, + 0x37, 0x92, 0x4, 0x80, 0x6, 0x6d, 0x33, 0x9e, 0x37, 0x92, 0x4, 0x7a, 0x37, + 0x92, 0x0, 0x74, 0x1f, 0xac, 0xbc, 0x49, 0x5, 0x2f, 0xcb, 0x7d, 0x32, 0x9d, + 0x30, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x4, 0x9d, 0x20, 0x80, 0x4, 0x6d, 0x22, + 0x9d, 0x23, 0x74, 0x1f, 0xac, 0xbc, 0x49, 0x5, 0x2f, 0xc9, 0x12, 0x6f, 0xd5, + 0x8, 0xf, 0x74, 0xd, 0xac, 0xbd, 0x2d, 0x5b, 0x7d, 0x4a, 0xb, 0x2a, 0x30, + 0x9d, 0x30, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x31, 0x2d, 0x32, 0x7a, 0x37, 0x92, + 0x6, 0x12, 0x96, 0xbb, 0x29, 0xb1, 0x0, 0x5, 0xf5, 0x2b, 0x12, 0x96, 0xbb, + 0x29, 0xb1, 0x0, 0x6, 0xf5, 0x2c, 0x12, 0x96, 0xce, 0x69, 0x30, 0x0, 0xb, + 0x69, 0x20, 0x0, 0x9, 0x7a, 0x1d, 0x2d, 0x74, 0x1f, 0xac, 0xbc, 0x9, 0x75, + 0x2f, 0xc0, 0xbe, 0x71, 0x2b, 0x50, 0xc, 0x7e, 0xa1, 0x2b, 0x7e, 0x70, 0x1f, + 0xac, 0x7c, 0x19, 0xa3, 0x2f, 0xc0, 0x74, 0x1f, 0xac, 0xbc, 0x9, 0x75, 0x2f, + 0xc1, 0xbe, 0x71, 0x2c, 0x50, 0xc, 0x7e, 0xa1, 0x2c, 0x7e, 0x70, 0x1f, 0xac, + 0x7c, 0x19, 0xa3, 0x2f, 0xc1, 0x74, 0x1f, 0xac, 0xbc, 0x9, 0xa5, 0x2f, 0xbb, + 0xbe, 0xa0, 0xfa, 0x50, 0xf, 0x7e, 0x70, 0x1f, 0xac, 0x7c, 0x2e, 0x34, 0x2f, + 0xbb, 0x7c, 0xba, 0x4, 0x7a, 0x39, 0xb0, 0x7c, 0xbc, 0x12, 0x90, 0x68, 0x60, + 0xa, 0x74, 0x1f, 0xac, 0xbc, 0x9, 0xb5, 0x2f, 0xba, 0xf5, 0x3b, 0x75, 0x2a, + 0x0, 0xe5, 0x29, 0xbe, 0xb0, 0x8, 0x40, 0x11, 0x7e, 0x37, 0x92, 0x6, 0xbe, + 0x34, 0x0, 0x50, 0x50, 0x33, 0x75, 0x2a, 0x1e, 0x80, 0x36, 0x80, 0x2c, 0xe5, + 0x29, 0xbe, 0xb0, 0x5, 0x40, 0x14, 0x7e, 0x37, 0x92, 0x6, 0xbe, 0x34, 0x0, + 0x3c, 0x50, 0x5, 0x75, 0x2a, 0x14, 0x80, 0x1e, 0x75, 0x2a, 0xa, 0x80, 0x19, + 0xe5, 0x29, 0xbe, 0xb0, 0x3, 0x40, 0x12, 0x7e, 0x37, 0x92, 0x6, 0xbe, 0x34, + 0x0, 0x32, 0x50, 0x5, 0x75, 0x2a, 0xf, 0x80, 0x3, 0x75, 0x2a, 0x7, 0x7e, + 0x30, 0x1f, 0xac, 0x3c, 0x9, 0xb1, 0x2f, 0xbe, 0x60, 0x2, 0x61, 0xac, 0x9, + 0x71, 0x2f, 0xbb, 0xbe, 0x70, 0x12, 0x40, 0x2, 0x61, 0x4e, 0x9, 0x41, 0x2f, + 0xba, 0x7e, 0x50, 0x3, 0xac, 0x45, 0x7e, 0x71, 0x2b, 0x74, 0x2, 0xac, 0x7b, + 0xbd, 0x23, 0x58, 0x23, 0xe5, 0x2b, 0xbe, 0xb0, 0x28, 0x28, 0x1c, 0x12, + 0x79, 0x68, 0x19, 0x71, 0x2f, 0xba, 0x7e, 0x73, 0x69, 0x69, 0xbe, 0x70, 0x3, + 0x50, 0x1b, 0xe5, 0x2b, 0xa, 0x3b, 0x1e, 0x34, 0x19, 0x71, 0x2f, 0xba, 0x80, + 0xf, 0x9, 0x71, 0x2f, 0xc0, 0xbe, 0x70, 0x19, 0x50, 0x6, 0x74, 0xa, 0x19, + 0xb1, 0x2f, 0xba, 0xe5, 0x2b, 0xbe, 0xb0, 0xa0, 0x50, 0xf, 0x7d, 0x1, 0x2e, + 0x4, 0x2f, 0xc2, 0x7e, 0x9, 0xb0, 0x4, 0x7a, 0x9, 0xb0, 0x80, 0x5, 0xe4, + 0x19, 0xb1, 0x2f, 0xc2, 0x9, 0x71, 0x2f, 0xc0, 0xbe, 0x70, 0xa0, 0x38, 0x2, + 0x61, 0x99, 0x9, 0x61, 0x2f, 0xc2, 0xbe, 0x60, 0x3, 0x40, 0x2, 0x61, 0x99, + 0xa, 0x37, 0xe5, 0x2b, 0xa, 0xb, 0x2e, 0x4, 0x0, 0x14, 0xbd, 0x3, 0x48, + 0x10, 0x9, 0x71, 0x2f, 0xc1, 0xa, 0x7, 0x7e, 0xa1, 0x2c, 0x74, 0x2, 0xa4, + 0xbd, 0x50, 0x58, 0x7d, 0x7e, 0x7, 0x92, 0x0, 0x2e, 0x7, 0x91, 0xfe, 0xbe, + 0x4, 0x0, 0x64, 0x50, 0x8, 0x6d, 0x0, 0x7a, 0x7, 0x91, 0xfe, 0x80, 0x10, + 0x7e, 0x7, 0x91, 0xfe, 0x1e, 0x4, 0x1e, 0x4, 0x7a, 0x7, 0x91, 0xfe, 0x1e, + 0x4, 0x1e, 0x4, 0x7a, 0x7, 0x92, 0x0, 0x74, 0x2, 0x19, 0xb1, 0x2f, 0xbf, + 0x80, 0x4b, 0xe5, 0x2b, 0xbe, 0xb0, 0xc8, 0x28, 0x11, 0x7e, 0x37, 0x92, 0x6, + 0xbe, 0x34, 0x0, 0x64, 0x50, 0x20, 0x7e, 0xa0, 0x1e, 0x80, 0x16, 0x80, 0x19, + 0xe5, 0x2b, 0xbe, 0xb0, 0xa0, 0x28, 0x20, 0x7e, 0x37, 0x92, 0x6, 0xbe, 0x34, + 0x0, 0x46, 0x50, 0x8, 0x7e, 0xa0, 0x19, 0x12, 0x96, 0xc4, 0x80, 0x1a, 0x7e, + 0x34, 0x7f, 0xff, 0x74, 0x1f, 0xac, 0xbc, 0x59, 0x35, 0x2f, 0xc9, 0x80, 0xc, + 0x12, 0x97, 0xa, 0xbe, 0xa3, 0x92, 0x8, 0x28, 0x3, 0x12, 0x97, 0x37, 0x12, + 0x96, 0xd7, 0xbe, 0x34, 0x0, 0x4, 0x50, 0xa, 0x6d, 0x33, 0x7a, 0x37, 0x91, + 0xfe, 0x7a, 0x37, 0x92, 0x0, 0x12, 0x96, 0xbb, 0xb, 0x1a, 0x10, 0xbe, 0x15, + 0x31, 0x40, 0x13, 0xbe, 0x15, 0x33, 0x38, 0xe, 0x69, 0x31, 0x0, 0x2, 0xbe, + 0x35, 0x35, 0x40, 0x5, 0xbe, 0x35, 0x37, 0x28, 0x4, 0xd2, 0x0, 0x80, 0x2, + 0xc2, 0x0, 0x7e, 0x44, 0x0, 0x3, 0x7e, 0x7d, 0x2d, 0x7f, 0x17, 0x7d, 0x14, + 0x12, 0x1, 0x63, 0x12, 0x97, 0x1d, 0xbf, 0x10, 0x58, 0x5, 0x75, 0x2a, 0x64, + 0x80, 0x6b, 0x7f, 0x7, 0x2f, 0x0, 0x12, 0x97, 0x2a, 0xbf, 0x1, 0x58, 0x2, + 0x80, 0x36, 0x12, 0x97, 0x2a, 0x7d, 0x14, 0x12, 0x1, 0x63, 0x7f, 0x1, 0x7e, + 0x1d, 0x2d, 0x2f, 0x11, 0x2f, 0x11, 0xbf, 0x10, 0x58, 0x26, 0x75, 0x2a, 0xa, + 0x12, 0x96, 0xd7, 0xbe, 0x34, 0x0, 0x64, 0x50, 0x3d, 0x74, 0x1f, 0xac, 0xbc, + 0x49, 0x35, 0x2f, 0xc3, 0xbe, 0x34, 0x0, 0x1e, 0x50, 0x2f, 0xe5, 0x2b, 0xbe, + 0xb0, 0xa0, 0x28, 0x28, 0x75, 0x2a, 0x32, 0x80, 0x23, 0x12, 0x97, 0x1, 0x60, + 0x1e, 0x12, 0x97, 0xa, 0xbe, 0xa0, 0xa, 0x28, 0xe, 0x7e, 0x70, 0xa, 0x7e, + 0x50, 0x1f, 0xac, 0x5c, 0x19, 0x72, 0x2f, 0xba, 0x80, 0x8, 0xbe, 0xa0, 0x2, + 0x28, 0x3, 0x12, 0x97, 0x37, 0x30, 0x0, 0xf, 0x12, 0x97, 0x1, 0xb4, 0x1, + 0x9, 0x75, 0x2a, 0x0, 0x7e, 0xa0, 0x1, 0x12, 0x96, 0xc4, 0x12, 0x97, 0x1d, + 0x7e, 0x1d, 0x2d, 0x2f, 0x10, 0x7e, 0x8, 0x0, 0x2, 0x12, 0x1, 0xbf, 0x74, + 0x1f, 0xac, 0xbc, 0x59, 0x35, 0x2f, 0xd7, 0x59, 0x25, 0x2f, 0xd5, 0x12, + 0x96, 0xd7, 0x74, 0x1f, 0xac, 0xbc, 0x59, 0x35, 0x2f, 0xc3, 0x12, 0x96, + 0xbb, 0xb, 0x1a, 0x30, 0x74, 0x1f, 0xac, 0xbc, 0x59, 0x35, 0x2f, 0xcd, 0x12, + 0x96, 0xbb, 0x69, 0x31, 0x0, 0x2, 0x74, 0x1f, 0xac, 0xbc, 0x59, 0x35, 0x2f, + 0xcf, 0x12, 0x96, 0xf8, 0xbe, 0x71, 0x2a, 0x50, 0x6, 0x7e, 0xa1, 0x2a, 0x12, + 0x96, 0xc4, 0x7c, 0xbc, 0x12, 0x90, 0x68, 0x60, 0x6, 0x7e, 0xa1, 0x3b, 0x12, + 0x96, 0xc4, 0x7e, 0x70, 0x1f, 0xac, 0x7c, 0x9, 0x53, 0x2f, 0xba, 0xa, 0x25, + 0xbe, 0x27, 0x91, 0xfe, 0x28, 0x42, 0xbe, 0x27, 0x92, 0x0, 0x28, 0x3c, 0xe5, + 0x27, 0xbe, 0xb0, 0x1, 0x68, 0xa, 0x49, 0x13, 0x2f, 0xc5, 0x12, 0x96, 0xbb, + 0x1b, 0x1a, 0x10, 0xe5, 0x28, 0xbe, 0xb0, 0x1, 0x68, 0xf, 0x74, 0x1f, 0xac, + 0xbc, 0x49, 0x35, 0x2f, 0xc7, 0x12, 0x96, 0xce, 0x79, 0x30, 0x0, 0x2, 0x7e, + 0x70, 0x1f, 0xac, 0x7c, 0x9, 0xb3, 0x2f, 0xbf, 0x60, 0x2, 0xc1, 0xaf, 0x74, + 0x1, 0x19, 0xb3, 0x2f, 0xbf, 0xc1, 0xaf, 0x74, 0x1f, 0xac, 0xbc, 0x9, 0xa5, + 0x2f, 0xbf, 0x4c, 0xaa, 0x78, 0x2, 0xa1, 0xcc, 0xe5, 0x29, 0xb4, 0x1, 0x34, + 0xbe, 0xa0, 0x2, 0x78, 0x1b, 0x7e, 0x37, 0x91, 0xfe, 0xbe, 0x34, 0x0, 0x3c, + 0x38, 0xc, 0x7e, 0x37, 0x92, 0x0, 0xbe, 0x34, 0x0, 0x3c, 0x38, 0x2, 0xa1, + 0xcc, 0x7e, 0xa0, 0x4, 0x80, 0x7e, 0x12, 0x96, 0xf8, 0xbe, 0x70, 0x28, 0x28, + 0x79, 0xe5, 0x2b, 0xbe, 0xb0, 0xa0, 0x28, 0x72, 0x7e, 0xa0, 0x8, 0x80, 0x6a, + 0x7e, 0x27, 0x91, 0xfe, 0xbe, 0x24, 0x0, 0x3b, 0x38, 0xa, 0x7e, 0x37, 0x92, + 0x0, 0xbe, 0x34, 0x0, 0x3b, 0x28, 0xa, 0x7e, 0xa0, 0x8, 0x12, 0x96, 0xe0, + 0x28, 0x51, 0x80, 0x2a, 0xbe, 0x24, 0x0, 0x27, 0x38, 0x6, 0xbe, 0x34, 0x0, + 0x27, 0x28, 0xa, 0x7e, 0xa0, 0x6, 0x12, 0x96, 0xe0, 0x28, 0x3b, 0x80, 0x14, + 0xbe, 0x24, 0x0, 0x5, 0x50, 0x6, 0xbe, 0x34, 0x0, 0x5, 0x40, 0x1b, 0x7e, + 0xa0, 0x4, 0x12, 0x96, 0xe0, 0x28, 0x25, 0x7e, 0x30, 0x1f, 0xac, 0x3c, 0x2e, + 0x14, 0x2f, 0xbd, 0x7e, 0x19, 0xb0, 0xb, 0xb2, 0x7a, 0x19, 0xb0, 0x80, 0x12, + 0xbe, 0x24, 0x0, 0x2, 0x50, 0x6, 0xbe, 0x34, 0x0, 0x2, 0x40, 0x6, 0x7e, + 0xa0, 0x3, 0x12, 0x97, 0x13, 0x74, 0x1f, 0xac, 0xbc, 0x9, 0xa5, 0x2f, 0xbd, + 0xbe, 0xa0, 0x1, 0x28, 0x75, 0x7e, 0x70, 0x1f, 0xac, 0x7c, 0x2e, 0x34, 0x2f, + 0xbd, 0x7c, 0xba, 0x14, 0x7a, 0x39, 0xb0, 0x7e, 0x37, 0x91, 0xfe, 0xbe, + 0x34, 0x0, 0xc8, 0x40, 0x11, 0x7e, 0x37, 0x92, 0x0, 0xbe, 0x34, 0x0, 0xc8, + 0x40, 0x7, 0xe5, 0x2b, 0xbe, 0xb0, 0x46, 0x28, 0x46, 0x74, 0x1f, 0xac, 0xbc, + 0x9, 0x75, 0x2f, 0xbd, 0xa, 0x27, 0x7e, 0x37, 0x92, 0x2, 0x12, 0x1, 0x20, + 0x12, 0x96, 0xef, 0x2d, 0x3, 0x7e, 0x30, 0xd, 0xac, 0x3d, 0x7f, 0x15, 0x2d, + 0x31, 0x1b, 0x1a, 0x0, 0x7e, 0x10, 0x1f, 0xac, 0x1c, 0x9, 0x70, 0x2f, 0xbd, + 0xa, 0x27, 0x7e, 0x37, 0x92, 0x4, 0x12, 0x1, 0x20, 0x7d, 0x23, 0x49, 0x30, + 0x2f, 0xc7, 0x2d, 0x32, 0x2d, 0x1b, 0x7d, 0xa, 0x79, 0x30, 0x0, 0x2, 0x80, + 0x5, 0x6c, 0xaa, 0x12, 0x97, 0x13, 0x7e, 0xa0, 0x1, 0x7e, 0x70, 0x1f, 0xac, + 0x7c, 0x19, 0xa3, 0x2f, 0xbe, 0xe4, 0x19, 0xb3, 0x2f, 0xbf, 0x12, 0x96, + 0xce, 0xb, 0xa, 0x20, 0x59, 0x23, 0x2f, 0xc5, 0x69, 0x20, 0x0, 0x2, 0x59, + 0x23, 0x2f, 0xc7, 0x9, 0xb3, 0x2f, 0xba, 0xbe, 0xb3, 0x92, 0x8, 0x40, 0xa, + 0x7e, 0xa3, 0x92, 0x9, 0x19, 0xa3, 0x2f, 0xba, 0x80, 0x2a, 0xbe, 0xb0, 0x1, + 0x28, 0x25, 0x2e, 0x34, 0x2f, 0xba, 0x14, 0x7a, 0x39, 0xb0, 0x80, 0x1b, + 0x74, 0x8, 0xac, 0xbc, 0x7f, 0x16, 0x2d, 0x35, 0x7e, 0x1b, 0xb0, 0x70, 0xe, + 0x7c, 0xbc, 0x7e, 0x70, 0xd, 0xac, 0x7d, 0x7f, 0x5, 0x2d, 0x13, 0x12, 0xa9, + 0x8f, 0xb, 0xd0, 0x12, 0x97, 0x48, 0x28, 0x2, 0x1, 0xc1, 0xda, 0x3b, 0x22, + 0x74, 0xd, 0xac, 0xbd, 0x7f, 0x15, 0x2d, 0x35, 0x22, 0x7e, 0x70, 0x1f, 0xac, + 0x7c, 0x19, 0xa3, 0x2f, 0xba, 0x22, 0x74, 0xd, 0xac, 0xbd, 0x7f, 0x5, 0x2d, + 0x15, 0x22, 0x7e, 0x37, 0x92, 0x0, 0x2e, 0x37, 0x91, 0xfe, 0x22, 0x7e, 0x30, + 0x1f, 0xac, 0x3c, 0x19, 0xa1, 0x2f, 0xbd, 0xe5, 0x2b, 0xbe, 0xb0, 0xa0, + 0x22, 0x74, 0x1f, 0xac, 0xbc, 0x49, 0x5, 0x2f, 0xc5, 0x22, 0x74, 0x1f, 0xac, + 0xbc, 0x9, 0x75, 0x2f, 0xba, 0x22, 0x74, 0x1f, 0xac, 0xbc, 0x9, 0xb5, 0x2f, + 0xbe, 0x22, 0x74, 0x1f, 0xac, 0xbc, 0x9, 0xa5, 0x2f, 0xba, 0x22, 0x7e, 0x70, + 0x1f, 0xac, 0x7c, 0x19, 0xa3, 0x2f, 0xbd, 0x22, 0x74, 0x1f, 0xac, 0xbc, + 0x49, 0x15, 0x2f, 0xd7, 0x49, 0x5, 0x2f, 0xd5, 0x22, 0x74, 0x1f, 0xac, 0xbc, + 0x49, 0x35, 0x2f, 0xd7, 0x49, 0x25, 0x2f, 0xd5, 0x22, 0x7e, 0x70, 0x1f, + 0xac, 0x7c, 0x2e, 0x34, 0x2f, 0xba, 0x7c, 0xba, 0x24, 0xfe, 0x7a, 0x39, + 0xb0, 0x22, 0x7e, 0x73, 0x75, 0x8c, 0xbc, 0x7d, 0x22, 0xca, 0x3b, 0x7c, + 0xfb, 0x6c, 0xee, 0xe1, 0xe4, 0x6c, 0xdd, 0x80, 0x16, 0x74, 0xd, 0xac, 0xbd, + 0x9, 0x65, 0x68, 0x9b, 0x74, 0xd, 0xac, 0xbe, 0x9, 0x75, 0x67, 0x97, 0xbc, + 0x67, 0x68, 0x7, 0xb, 0xd0, 0x12, 0x97, 0x48, 0x38, 0xe5, 0x12, 0x97, 0x48, + 0x28, 0x6f, 0x7e, 0x50, 0xd, 0xac, 0x5d, 0x9, 0xc2, 0x68, 0x9b, 0x49, 0x42, + 0x68, 0x99, 0x74, 0xd, 0xac, 0xbe, 0x49, 0xa5, 0x67, 0x95, 0x7d, 0x3a, 0x9d, + 0x34, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xa4, 0x80, 0x4, 0x6d, 0xaa, + 0x9d, 0xa3, 0x49, 0x42, 0x68, 0x97, 0x49, 0xb5, 0x67, 0x93, 0x7d, 0x3b, + 0x9d, 0x34, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xb4, 0x80, 0x4, 0x6d, + 0xbb, 0x9d, 0xb3, 0x2d, 0xba, 0x74, 0x8, 0xac, 0xbc, 0x9, 0xb5, 0x69, 0x19, + 0xb4, 0x1, 0xe, 0x6d, 0xaa, 0x74, 0x2, 0xac, 0xbc, 0x59, 0xa5, 0x2e, 0x7a, + 0x59, 0xa5, 0x30, 0xf1, 0x7d, 0x3b, 0x7c, 0xbd, 0x7c, 0x5e, 0x7c, 0x4c, + 0x12, 0x97, 0xed, 0xb, 0xe0, 0xbc, 0xfe, 0x28, 0x2, 0xe1, 0x57, 0xda, 0x3b, + 0x22, 0x2, 0x97, 0xf0, 0xca, 0x3b, 0x7c, 0xc4, 0x7c, 0xd5, 0x7c, 0xeb, 0x7d, + 0xf3, 0x7e, 0xd4, 0xff, 0xfc, 0x7e, 0x7, 0x81, 0xfd, 0xbd, 0x3, 0x38, 0x6, + 0x7e, 0x14, 0x1, 0x0, 0x80, 0x19, 0x6d, 0x22, 0x7c, 0x56, 0x7c, 0x67, 0x6c, + 0x77, 0x7d, 0x10, 0x12, 0x1, 0x6c, 0x7d, 0x13, 0xbe, 0x14, 0x0, 0x10, 0x50, + 0x4, 0x7e, 0x14, 0x0, 0x10, 0x74, 0x2, 0xac, 0xbc, 0x49, 0x5, 0x30, 0xf1, + 0xbd, 0xf, 0x28, 0x6, 0x49, 0x15, 0x2e, 0x7a, 0x80, 0x4, 0x59, 0x15, 0x2e, + 0x7a, 0x59, 0xf5, 0x30, 0xf1, 0xa, 0xc, 0x9, 0xa0, 0x2e, 0x8e, 0x4c, 0xaa, + 0x68, 0x40, 0xbe, 0xa0, 0xff, 0x78, 0xa, 0x7e, 0xf0, 0xff, 0xe4, 0x19, 0xb0, + 0x2e, 0x8e, 0x80, 0x29, 0xa, 0x3a, 0x7e, 0xc4, 0x0, 0x8, 0x9d, 0xc3, 0x7d, + 0x3c, 0x7c, 0xb7, 0x7e, 0xc4, 0x0, 0x2, 0x60, 0x5, 0x3e, 0xc4, 0x14, 0x78, + 0xfb, 0x2e, 0xc4, 0x0, 0x23, 0x7d, 0x3c, 0x7c, 0xf7, 0x2e, 0x4, 0x2e, 0x8e, + 0x7c, 0xba, 0x14, 0x7a, 0x9, 0xb0, 0xa, 0xf, 0xbd, 0x1, 0x50, 0x2, 0x7d, + 0x10, 0xbe, 0x14, 0x1, 0x0, 0x28, 0x4, 0x7e, 0x14, 0x1, 0x0, 0x7e, 0xa3, + 0x69, 0x69, 0xbe, 0xa0, 0x3, 0x40, 0x2, 0x21, 0x1d, 0x7e, 0x50, 0xd, 0xac, + 0x5e, 0x49, 0x42, 0x68, 0x97, 0x7e, 0x70, 0xd, 0xac, 0x7d, 0x49, 0xc3, 0x67, + 0x93, 0x7d, 0xc, 0x9d, 0x4, 0xbe, 0x4, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xc4, 0x80, + 0x4, 0x6d, 0xcc, 0x9d, 0xc0, 0x49, 0x22, 0x68, 0x99, 0x49, 0x3, 0x67, 0x95, + 0x7d, 0x30, 0x12, 0x64, 0x88, 0x8, 0x4, 0x9d, 0x2, 0x80, 0x4, 0x6d, 0x0, + 0x9d, 0x3, 0xbe, 0xc4, 0x5, 0xdc, 0x38, 0x6, 0xbe, 0x4, 0x5, 0xdc, 0x28, + 0x38, 0xbe, 0x14, 0x0, 0xfa, 0x28, 0x32, 0x7e, 0x10, 0x2, 0xac, 0x1d, 0x9, + 0x70, 0x65, 0x60, 0x9, 0xb0, 0x65, 0x61, 0xbe, 0x70, 0x1, 0x28, 0x20, 0x7e, + 0x63, 0x82, 0xe, 0xa, 0x46, 0x1b, 0x45, 0xa, 0x7, 0xbd, 0x4, 0x58, 0x12, + 0xbe, 0xb0, 0x1, 0x28, 0xd, 0x12, 0x67, 0xf2, 0xa, 0xb, 0xbd, 0xc, 0x58, + 0x4, 0x7e, 0x14, 0x0, 0x77, 0xbe, 0xa0, 0x5, 0x28, 0x4, 0x1e, 0x14, 0x1e, + 0x14, 0x7e, 0x90, 0xd, 0xac, 0x9e, 0x49, 0x4, 0x68, 0x97, 0x74, 0xd, 0xac, + 0xbd, 0x49, 0xe5, 0x67, 0x93, 0x7d, 0xce, 0x9d, 0xc0, 0xbe, 0xc4, 0x0, 0x0, + 0x8, 0x6, 0x7d, 0xfe, 0x9d, 0xf0, 0x80, 0x4, 0x6d, 0xff, 0x9d, 0xfc, 0x7d, + 0x31, 0xad, 0x3f, 0x7c, 0x76, 0x7c, 0x65, 0xa, 0x24, 0x7d, 0xf3, 0x5d, 0xfd, + 0xbd, 0xe0, 0x74, 0xd, 0x28, 0xc, 0x12, 0x99, 0xc8, 0x7d, 0xc0, 0x2d, 0xcf, + 0x1b, 0xe8, 0xc0, 0x80, 0x8, 0x12, 0x99, 0xc8, 0x9d, 0xf, 0x1b, 0xe8, 0x0, + 0x7e, 0x50, 0xd, 0xac, 0x5e, 0x49, 0x32, 0x68, 0x99, 0x74, 0xd, 0xac, 0xbd, + 0x49, 0xe5, 0x67, 0x95, 0x7d, 0xe, 0x9d, 0x3, 0xbe, 0x4, 0x0, 0x0, 0x8, 0x6, + 0x7d, 0xfe, 0x9d, 0xf3, 0x80, 0x4, 0x6d, 0xff, 0x9d, 0xf0, 0xad, 0x1f, 0x7c, + 0x32, 0x7c, 0x21, 0xa, 0x0, 0x7d, 0xf1, 0x5d, 0xfd, 0xbd, 0xe3, 0x28, 0xf, + 0x7d, 0xe2, 0x2e, 0xe4, 0x68, 0x99, 0x7d, 0x23, 0x2d, 0x2f, 0x1b, 0xe8, + 0x20, 0x80, 0xe, 0x7e, 0x50, 0xd, 0xac, 0x5e, 0x2e, 0x24, 0x68, 0x99, 0x9d, + 0x3f, 0x1b, 0x28, 0x30, 0xda, 0x3b, 0x22, 0xac, 0xbe, 0x7d, 0xe5, 0x2e, + 0xe4, 0x68, 0x97, 0x22, 0xca, 0xf8, 0x7e, 0xb3, 0x69, 0x69, 0x70, 0x17, + 0xe4, 0x7a, 0xb3, 0x69, 0x72, 0x12, 0x9b, 0xf6, 0x28, 0x1f, 0x74, 0x1, 0x7a, + 0xb3, 0x69, 0x6e, 0xe4, 0x7a, 0xb3, 0x69, 0x71, 0x80, 0x12, 0x74, 0x1, 0x7a, + 0xb3, 0x69, 0x72, 0x7e, 0xb3, 0x69, 0x6a, 0x70, 0x6, 0x74, 0x1, 0x7a, 0xb3, + 0x69, 0x6d, 0x12, 0x9b, 0xfe, 0xca, 0x59, 0x7e, 0x18, 0x67, 0x93, 0x7e, 0x8, + 0x68, 0x15, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x7e, 0x73, 0x69, 0xd0, 0xbe, 0x70, + 0x0, 0x28, 0x25, 0x6c, 0xff, 0x80, 0x1c, 0x74, 0xd, 0xac, 0xbf, 0x12, 0x9a, + 0x4c, 0x74, 0xd, 0xac, 0xbf, 0x59, 0x35, 0x68, 0x15, 0x12, 0x9a, 0xcc, 0x74, + 0xd, 0xac, 0xbf, 0x59, 0x35, 0x68, 0x17, 0xb, 0xf0, 0x12, 0x9a, 0x45, 0x38, + 0xdf, 0xda, 0xf8, 0x22, 0x7e, 0x73, 0x75, 0x8c, 0xbc, 0x7f, 0x22, 0x49, + 0x35, 0x67, 0x93, 0x7e, 0xe7, 0x76, 0x1b, 0x7d, 0xfe, 0x7e, 0xb3, 0x69, + 0xd0, 0x70, 0x1, 0x22, 0x7e, 0xb3, 0x76, 0x16, 0xb4, 0x1, 0x8, 0x7e, 0x27, + 0x76, 0x29, 0x1b, 0x24, 0x80, 0x4, 0x7d, 0x2e, 0x1b, 0x24, 0x7e, 0xb3, 0x76, + 0x1f, 0xa, 0xeb, 0xbd, 0xe3, 0x28, 0x1f, 0x7d, 0xe, 0x9d, 0x3, 0x7e, 0x17, + 0x76, 0x21, 0x12, 0x9a, 0xc3, 0xa, 0x5b, 0x6d, 0x44, 0xbf, 0x2, 0x40, 0x4, + 0x7f, 0x2, 0x1b, 0xc, 0x1b, 0x2c, 0x9f, 0x20, 0x7f, 0x2, 0x80, 0x27, 0x7e, + 0xb3, 0x76, 0x20, 0x12, 0x9b, 0x50, 0x50, 0x1c, 0x7d, 0x3, 0x9d, 0xe, 0x7e, + 0x17, 0x76, 0x23, 0x12, 0x9a, 0xc3, 0xa, 0xdb, 0x6d, 0xcc, 0xbf, 0x6, 0x40, + 0x4, 0x7f, 0x6, 0x1b, 0xc, 0x12, 0x9b, 0x47, 0x80, 0x2, 0x7d, 0x13, 0x7d, + 0x31, 0x22, 0xad, 0x10, 0x6d, 0x0, 0x7c, 0x32, 0x7c, 0x21, 0x22, 0x49, 0x35, + 0x67, 0x95, 0x9f, 0x0, 0x7e, 0xe7, 0x76, 0x29, 0x7d, 0xfe, 0x7e, 0xb3, 0x69, + 0xd0, 0x70, 0x1, 0x22, 0x7e, 0xb3, 0x76, 0x16, 0xb4, 0x1, 0x6, 0x7e, 0x27, + 0x76, 0x1b, 0x80, 0x2, 0x7d, 0x2e, 0x7e, 0xb3, 0x76, 0x2d, 0xa, 0xeb, 0xbd, + 0xe3, 0x28, 0x1f, 0x7d, 0xe, 0x9d, 0x3, 0x7e, 0x17, 0x76, 0x2f, 0x12, 0x9a, + 0xc3, 0x1a, 0x0, 0xa, 0x5b, 0x6d, 0x44, 0xbf, 0x2, 0x48, 0x4, 0x7f, 0x2, + 0x1b, 0xc, 0x9f, 0x20, 0x7f, 0x2, 0x80, 0x2d, 0x7e, 0xb3, 0x76, 0x2e, 0x12, + 0x9b, 0x50, 0x50, 0x22, 0xbd, 0x23, 0x40, 0x20, 0x7d, 0x3, 0x9d, 0xe, 0x7e, + 0x17, 0x76, 0x31, 0x12, 0x9a, 0xc3, 0x1a, 0x0, 0xa, 0xdb, 0x6d, 0xcc, 0xbf, + 0x6, 0x48, 0x4, 0x7f, 0x6, 0x1b, 0xc, 0x12, 0x9b, 0x47, 0x80, 0x2, 0x7d, + 0x13, 0x7d, 0x31, 0x22, 0x7d, 0x5f, 0x9d, 0x54, 0x6d, 0x44, 0x2f, 0x2, 0x22, + 0xa, 0x4b, 0x7d, 0xe2, 0x9d, 0xe4, 0xbd, 0xe3, 0x22, 0xca, 0x3b, 0x7c, 0xf7, + 0x7c, 0xeb, 0x74, 0xd, 0xac, 0xbe, 0x12, 0x9a, 0x4c, 0x7d, 0x63, 0x74, 0xd, + 0xac, 0xbe, 0x12, 0x9a, 0xcc, 0x7d, 0x23, 0x12, 0x8f, 0xf4, 0x19, 0xa3, + 0x36, 0xff, 0x7e, 0xb3, 0x59, 0x47, 0xb4, 0x1, 0xe, 0x7e, 0x84, 0x0, 0x2d, + 0x7e, 0x94, 0x4, 0xa, 0x7e, 0xa4, 0x0, 0x37, 0x80, 0xc, 0x7e, 0x84, 0x0, + 0x1e, 0x7e, 0x94, 0x4, 0x19, 0x7e, 0xa4, 0x0, 0x19, 0x7e, 0xb4, 0x8, 0xe7, + 0xbd, 0x86, 0x28, 0x10, 0xbe, 0x24, 0x0, 0x0, 0x40, 0x48, 0xbe, 0x24, 0x8, + 0xe7, 0x38, 0x42, 0x74, 0x1, 0x80, 0x3a, 0xbd, 0x96, 0x50, 0x10, 0xbe, 0x24, + 0x0, 0x0, 0x40, 0x34, 0xbe, 0x24, 0x8, 0xe7, 0x38, 0x2e, 0x74, 0x2, 0x80, + 0x26, 0xbd, 0xa2, 0x28, 0x10, 0xbe, 0x64, 0x0, 0x0, 0x40, 0x20, 0xbe, 0x64, + 0x4, 0x37, 0x38, 0x1a, 0x74, 0x3, 0x80, 0x12, 0xbd, 0xb2, 0x50, 0x12, 0xbe, + 0x64, 0x0, 0x0, 0x40, 0xc, 0xbe, 0x64, 0x4, 0x37, 0x38, 0x6, 0x74, 0x4, + 0x19, 0xb3, 0x36, 0xff, 0x9, 0xb3, 0x36, 0xff, 0xda, 0x3b, 0x22, 0x7e, 0x73, + 0x69, 0x6a, 0xbe, 0x70, 0x0, 0x22, 0x7e, 0xa3, 0x75, 0x8c, 0x74, 0xd, 0xa4, + 0x22, 0xca, 0x79, 0x7e, 0xf3, 0x69, 0x69, 0x7e, 0xe3, 0x69, 0x6a, 0x7c, + 0xbf, 0x7c, 0x7e, 0x12, 0x9c, 0x47, 0x7c, 0xbf, 0x12, 0x9c, 0xa1, 0x4c, + 0xee, 0x78, 0x14, 0x12, 0x9b, 0xfe, 0xca, 0x59, 0x7e, 0x18, 0x67, 0x93, + 0x7e, 0x8, 0x68, 0x97, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x80, 0xb, 0x7e, 0xb3, + 0x69, 0x70, 0x70, 0x5, 0x7c, 0xbf, 0x12, 0x97, 0x4f, 0x7c, 0xbf, 0x12, 0x9e, + 0x14, 0xda, 0x79, 0x22, 0x7c, 0x67, 0x7c, 0x7b, 0xa5, 0xbf, 0x0, 0xd, 0xbe, + 0x60, 0x0, 0x28, 0x5, 0xe4, 0x7a, 0xb3, 0x69, 0x70, 0x2, 0x67, 0x84, 0xa5, + 0xbe, 0x0, 0x12, 0x6c, 0xaa, 0x80, 0x9, 0x12, 0x9e, 0xb, 0x19, 0x62, 0x68, + 0x9b, 0xb, 0xa0, 0x12, 0x3f, 0x50, 0x38, 0xf2, 0x6c, 0xaa, 0x80, 0x26, 0x7e, + 0x30, 0xd, 0xac, 0x3a, 0x2e, 0x14, 0x67, 0x93, 0xb, 0x18, 0x20, 0x12, 0x16, + 0xf8, 0x1b, 0x18, 0x20, 0x7e, 0x30, 0xd, 0xac, 0x3a, 0x2e, 0x14, 0x67, 0x95, + 0xb, 0x18, 0x20, 0x12, 0x16, 0xf8, 0x1b, 0x18, 0x20, 0xb, 0xa0, 0xbc, 0x7a, + 0x38, 0xd6, 0x22, 0xca, 0x79, 0x7c, 0xeb, 0x7e, 0xf3, 0x75, 0x8c, 0x7e, + 0x70, 0xd, 0xac, 0x7f, 0x7e, 0x8, 0x91, 0xfe, 0x74, 0xff, 0x12, 0x0, 0x2e, + 0xe4, 0x6c, 0x77, 0x7c, 0x6e, 0x12, 0x9d, 0x1c, 0x7c, 0x7e, 0x7c, 0x6f, + 0x12, 0x9d, 0x1c, 0x7c, 0x1b, 0x6c, 0x0, 0x80, 0x36, 0x6c, 0x99, 0x80, 0x17, + 0x74, 0xd, 0xac, 0xb9, 0x9, 0xa5, 0x92, 0x2, 0x7e, 0x30, 0xd, 0xac, 0x30, + 0x9, 0x81, 0x67, 0x97, 0xbc, 0x8a, 0x68, 0x6, 0xb, 0x90, 0xbc, 0x19, 0x38, + 0xe5, 0xbc, 0x19, 0x78, 0x11, 0x7e, 0x70, 0xd, 0xac, 0x70, 0x12, 0x9d, 0xfb, + 0xac, 0x31, 0x2e, 0x14, 0x91, 0xfe, 0x12, 0x9e, 0x3, 0xb, 0x0, 0xbc, 0xf0, + 0x38, 0xc6, 0x74, 0xd, 0xac, 0xbf, 0xca, 0x59, 0x7e, 0x18, 0x91, 0xfe, 0x7e, + 0x8, 0x68, 0x97, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0xda, 0x79, 0x22, 0x7e, 0x8, + 0x91, 0xfe, 0xca, 0x69, 0xca, 0xf8, 0x7f, 0x70, 0x7c, 0x86, 0x7c, 0xf7, + 0x7c, 0xab, 0x6c, 0x99, 0xa1, 0xe0, 0x7c, 0x3f, 0xa1, 0xd8, 0x7e, 0x10, 0xd, + 0xac, 0x19, 0x9, 0x20, 0x68, 0x9b, 0x7e, 0x10, 0xd, 0xac, 0x13, 0x9, 0xb0, + 0x67, 0x97, 0xbc, 0xb2, 0x68, 0x2, 0xa1, 0xd6, 0xbe, 0x20, 0xff, 0x78, 0x2, + 0xa1, 0xd6, 0x7e, 0xd0, 0x8, 0xac, 0xd2, 0x9, 0xb6, 0x69, 0x19, 0x70, 0xa, + 0x7d, 0x30, 0x2e, 0x34, 0x67, 0x93, 0x6d, 0x22, 0x80, 0xb, 0x7e, 0x70, 0xd, + 0xac, 0x79, 0x2e, 0x34, 0x68, 0x97, 0x6d, 0x22, 0x29, 0x11, 0x0, 0x4, 0x12, + 0x9d, 0xf1, 0x39, 0x16, 0x0, 0x4, 0xb, 0x1a, 0x0, 0x12, 0x9d, 0xf1, 0x1b, + 0x6a, 0x0, 0x69, 0x1, 0x0, 0x2, 0x12, 0x9d, 0xf1, 0x79, 0x6, 0x0, 0x2, 0x7e, + 0x10, 0xd, 0xac, 0x13, 0x9, 0x10, 0x67, 0x98, 0x12, 0x9d, 0xf1, 0x39, 0x16, + 0x0, 0x5, 0x7e, 0x10, 0xd, 0xac, 0x13, 0x9, 0x10, 0x67, 0x99, 0x12, 0x9d, + 0xf1, 0x39, 0x16, 0x0, 0x6, 0x7e, 0x10, 0xd, 0xac, 0x13, 0x9, 0x10, 0x67, + 0x9a, 0x12, 0x9d, 0xf1, 0x39, 0x16, 0x0, 0x7, 0x7e, 0x10, 0xd, 0xac, 0x13, + 0x9, 0x10, 0x67, 0x9b, 0x12, 0x9d, 0xf1, 0x39, 0x16, 0x0, 0x8, 0xb, 0xa0, + 0x80, 0x8, 0xb, 0x30, 0xbc, 0x83, 0x28, 0x2, 0xa1, 0x34, 0xb, 0x90, 0x7e, + 0x23, 0x75, 0x8c, 0xbc, 0x29, 0x28, 0x2, 0xa1, 0x30, 0x7c, 0xba, 0xda, 0xf8, + 0xda, 0x69, 0x22, 0x7e, 0xd0, 0xd, 0xac, 0xda, 0x7f, 0x67, 0x2d, 0xd6, 0x22, + 0x2e, 0x34, 0x67, 0x93, 0x7e, 0x30, 0xd, 0x22, 0x74, 0xd, 0x12, 0x1, 0xf3, + 0xb, 0x10, 0x22, 0x7e, 0x60, 0xff, 0x7e, 0x50, 0xd, 0xac, 0x5a, 0x22, 0x6c, + 0xaa, 0x80, 0x63, 0x7e, 0x50, 0xd, 0xac, 0x5a, 0x49, 0x32, 0x68, 0x97, 0x12, + 0x4e, 0x2e, 0x59, 0x32, 0x67, 0x93, 0x7e, 0x50, 0xd, 0xac, 0x5a, 0x49, 0x32, + 0x68, 0x99, 0x12, 0x4e, 0x2e, 0x59, 0x32, 0x67, 0x95, 0x7e, 0x90, 0xd, 0xac, + 0x9a, 0x9, 0xb4, 0x68, 0x9b, 0x19, 0xb4, 0x67, 0x97, 0x7e, 0x90, 0xd, 0xac, + 0x9a, 0x9, 0xb4, 0x68, 0x9c, 0x19, 0xb4, 0x67, 0x98, 0x7e, 0x90, 0xd, 0xac, + 0x9a, 0x9, 0xb4, 0x68, 0x9d, 0x19, 0xb4, 0x67, 0x99, 0x7e, 0x90, 0xd, 0xac, + 0x9a, 0x9, 0xb4, 0x68, 0x9e, 0x19, 0xb4, 0x67, 0x9a, 0x7e, 0x90, 0xd, 0xac, + 0x9a, 0x9, 0xb4, 0x68, 0x9f, 0x19, 0xb4, 0x67, 0x9b, 0xb, 0xa0, 0x12, 0x3c, + 0x72, 0x38, 0x98, 0x22, 0xca, 0x3b, 0x6d, 0xdd, 0x7d, 0x8d, 0x7e, 0x73, + 0x69, 0x69, 0x7a, 0x71, 0x3b, 0xbe, 0x70, 0x0, 0x28, 0x1a, 0x7e, 0x37, 0x36, + 0xf3, 0xb, 0x34, 0x7a, 0x37, 0x36, 0xf3, 0xbe, 0x34, 0x0, 0x64, 0x28, 0xe, + 0x7e, 0x34, 0x0, 0x64, 0x7a, 0x37, 0x36, 0xf3, 0x80, 0x4, 0x7a, 0xd7, 0x36, + 0xf3, 0x7e, 0xb3, 0x59, 0x60, 0xb4, 0x1, 0x4, 0x74, 0x3, 0x80, 0x7, 0x7e, + 0xb3, 0x36, 0xa2, 0x60, 0x5, 0x14, 0x7a, 0xb3, 0x36, 0xa2, 0x7e, 0xd7, 0x2e, + 0x78, 0xbe, 0xd7, 0x9b, 0xa9, 0x28, 0x12, 0x7e, 0x54, 0xff, 0xff, 0x9e, + 0x57, 0x2e, 0x78, 0x2e, 0x57, 0x9b, 0xa9, 0xb, 0x54, 0xf5, 0x3a, 0x80, 0xa, + 0x7e, 0x57, 0x9b, 0xa9, 0x9e, 0x57, 0x2e, 0x78, 0xf5, 0x3a, 0x7e, 0xd7, + 0x9b, 0xa9, 0x7a, 0xd7, 0x2e, 0x78, 0x7e, 0xb3, 0x69, 0x70, 0x60, 0x3, 0x2, + 0xa8, 0x17, 0xc2, 0x28, 0x7e, 0xa4, 0x67, 0x93, 0x7e, 0x8, 0x92, 0xd2, 0x12, + 0xd5, 0x86, 0xe5, 0x3b, 0x60, 0x6, 0x7e, 0xb3, 0x69, 0x6a, 0x70, 0x3c, 0x6c, + 0xff, 0x6c, 0xaa, 0x80, 0x2e, 0xa, 0x4f, 0x19, 0xa4, 0x36, 0x8e, 0xe4, 0x19, + 0xb4, 0x36, 0x98, 0x6d, 0xdd, 0x7e, 0x70, 0x2, 0xac, 0x7f, 0x59, 0xd3, 0x36, + 0xcb, 0x59, 0xd3, 0x36, 0xdf, 0x7e, 0x70, 0xff, 0x7e, 0x50, 0xd, 0xac, 0x5f, + 0x19, 0x72, 0x31, 0x10, 0x74, 0x1, 0x19, 0xb4, 0x36, 0xf5, 0xb, 0xf0, 0x7e, + 0xb3, 0x75, 0x8c, 0xbc, 0xbf, 0x38, 0xca, 0xe4, 0x7a, 0xb3, 0x2e, 0x77, + 0x7e, 0xb3, 0x2f, 0xb9, 0x60, 0x6, 0x7e, 0xb3, 0x82, 0x4, 0x60, 0xb, 0x12, + 0xa8, 0xe6, 0x60, 0x6, 0x74, 0x1, 0x7a, 0xb3, 0x2e, 0x77, 0x6c, 0xff, 0x2, + 0xa6, 0x76, 0x7e, 0x50, 0xd, 0xac, 0x5f, 0x9, 0xe2, 0x67, 0x97, 0x5e, 0xe0, + 0xf, 0x12, 0x8b, 0xd5, 0x38, 0x3, 0x2, 0xa6, 0x74, 0x7e, 0x10, 0x8, 0xac, + 0x1e, 0x9, 0xa0, 0x69, 0x19, 0xbe, 0xa0, 0x1, 0x78, 0x3, 0x2, 0xa6, 0x51, + 0x7e, 0x70, 0x2, 0xac, 0x7e, 0x7d, 0x13, 0x2e, 0x14, 0x36, 0xcb, 0xb, 0x18, + 0xd0, 0xb, 0xd4, 0x1b, 0x18, 0xd0, 0x4c, 0xaa, 0x78, 0x1a, 0x49, 0x42, 0x67, + 0x93, 0x74, 0x4, 0xac, 0xbe, 0x59, 0x45, 0x36, 0xa3, 0x49, 0x22, 0x67, 0x95, + 0x59, 0x25, 0x36, 0xa5, 0x6d, 0xdd, 0x59, 0xd3, 0x36, 0xdf, 0x6c, 0xdd, 0x2, + 0xa6, 0x47, 0x7e, 0x10, 0xd, 0xac, 0x1d, 0x9, 0xc0, 0x31, 0x10, 0xbc, 0xce, + 0x68, 0x3, 0x2, 0xa6, 0x45, 0x7e, 0x70, 0x73, 0xac, 0x7c, 0x2e, 0x34, 0x32, + 0x10, 0x6d, 0x22, 0x7a, 0x1d, 0x2e, 0x12, 0xd9, 0x5b, 0x49, 0x10, 0x31, 0xc, + 0x49, 0x0, 0x31, 0xe, 0x12, 0xbc, 0x36, 0x7d, 0x93, 0x12, 0xd9, 0x5b, 0x74, + 0x4, 0xac, 0xbc, 0x49, 0x15, 0x36, 0xa3, 0x49, 0x5, 0x36, 0xa5, 0x12, 0xbc, + 0x36, 0x7a, 0x35, 0x2c, 0x7e, 0x70, 0x2, 0xac, 0x7c, 0x7d, 0xd3, 0x2e, 0xd4, + 0x36, 0xdf, 0xb, 0xd8, 0x20, 0x2d, 0x29, 0x1b, 0xd8, 0x20, 0x49, 0x23, 0x36, + 0xdf, 0xbe, 0x24, 0xf, 0xa0, 0x28, 0x8, 0x7e, 0x24, 0xf, 0xa0, 0x59, 0x23, + 0x36, 0xdf, 0xe5, 0x3a, 0x7a, 0xb3, 0x92, 0x8d, 0x7e, 0x50, 0xd, 0xac, 0x5f, + 0x2d, 0x2a, 0x9, 0x32, 0x0, 0x6, 0x7a, 0x33, 0x92, 0x8f, 0x7a, 0x97, 0x92, + 0x96, 0x7e, 0xd5, 0x2c, 0x7a, 0xd7, 0x92, 0x98, 0xb, 0x28, 0xd0, 0x7a, 0xd7, + 0x92, 0x9a, 0x49, 0x22, 0x0, 0x2, 0x7a, 0x27, 0x92, 0x9c, 0x49, 0x23, 0x36, + 0xcb, 0x7a, 0x27, 0x92, 0x9e, 0x49, 0xd3, 0x36, 0xdf, 0x7a, 0xd7, 0x92, + 0xa2, 0x74, 0xd, 0xac, 0xbd, 0x49, 0xd5, 0x31, 0xc, 0x7e, 0x47, 0x92, 0x9a, + 0x9d, 0x4d, 0x7a, 0x47, 0x92, 0x92, 0x49, 0x35, 0x31, 0xe, 0x7e, 0xd7, 0x92, + 0x9c, 0x9d, 0xd3, 0x7a, 0xd7, 0x92, 0x94, 0xa, 0xdc, 0x9, 0xad, 0x36, 0x8e, + 0xbe, 0xa0, 0x0, 0x28, 0x16, 0x12, 0xd9, 0xb7, 0x2e, 0x34, 0xff, 0xe9, 0x7e, + 0x14, 0x92, 0xa4, 0x74, 0x17, 0x12, 0x2, 0x3d, 0x7e, 0x87, 0x92, 0xad, 0x80, + 0x9, 0x7e, 0x8, 0x92, 0xa4, 0x12, 0xda, 0xe4, 0x6d, 0x88, 0xa, 0xdc, 0x9, + 0xad, 0x36, 0x8e, 0xbe, 0xa0, 0x2, 0x40, 0x12, 0x12, 0xd9, 0xb7, 0x2e, 0x34, + 0xff, 0xd2, 0x7e, 0x14, 0x92, 0xbb, 0x74, 0x17, 0x12, 0x2, 0x3d, 0x80, 0x7, + 0x7e, 0x8, 0x92, 0xbb, 0x12, 0xda, 0xe4, 0x6d, 0xdd, 0x7a, 0xd5, 0x28, 0x75, + 0x27, 0x0, 0x80, 0x12, 0x7e, 0xa1, 0x27, 0x12, 0xd9, 0xb7, 0x69, 0xd1, 0x0, + 0x9, 0x2e, 0xd5, 0x28, 0x7a, 0xd5, 0x28, 0x5, 0x27, 0xa, 0xdc, 0x9, 0x7d, + 0x36, 0x8e, 0xbe, 0x71, 0x27, 0x38, 0xe3, 0xbe, 0x70, 0x0, 0x28, 0xa, 0xa, + 0x27, 0x7e, 0x35, 0x28, 0x8d, 0x32, 0x7a, 0x35, 0x28, 0x7e, 0xd5, 0x28, + 0x7a, 0xd7, 0x92, 0xa0, 0x12, 0x67, 0xcb, 0xc2, 0x3, 0xc2, 0x4, 0xa, 0xdc, + 0x9, 0xbd, 0x36, 0xf5, 0x60, 0x2, 0x41, 0x6e, 0x7e, 0xa1, 0x3a, 0x74, 0x6, + 0xa4, 0x7d, 0xd5, 0x2e, 0xd4, 0x0, 0x14, 0xbd, 0xd8, 0x50, 0x6, 0xbd, 0xd9, + 0x50, 0x2, 0xd2, 0x28, 0x7e, 0xa3, 0x92, 0xa4, 0x74, 0x6, 0xa4, 0xbe, 0x57, + 0x92, 0xad, 0x50, 0x19, 0x7e, 0xa3, 0x92, 0xbb, 0x74, 0x6, 0xa4, 0xbe, 0x57, + 0x92, 0xc4, 0x50, 0xc, 0x7e, 0xd7, 0x92, 0xb7, 0xbe, 0xd4, 0x0, 0x14, 0x28, + 0x2, 0xd2, 0x1, 0xa2, 0x1, 0xe4, 0x33, 0x7a, 0xb3, 0x92, 0x90, 0x7e, 0xa1, + 0x3a, 0x74, 0x1e, 0xa4, 0x7d, 0xd5, 0x2d, 0xd8, 0xbd, 0xd9, 0x50, 0x4, 0xd2, + 0x3, 0x80, 0x12, 0x7e, 0x34, 0x0, 0x3, 0xad, 0x38, 0xbd, 0x39, 0x50, 0x8, + 0xbe, 0x94, 0x0, 0x6e, 0x28, 0x2, 0xd2, 0x4, 0x30, 0x3, 0x6, 0xd2, 0x2, + 0x74, 0x64, 0x80, 0x14, 0x30, 0x4, 0xf, 0x30, 0x1, 0x6, 0xc2, 0x2, 0x74, + 0xa, 0x80, 0x8, 0xd2, 0x2, 0x74, 0xc8, 0x80, 0x2, 0x74, 0x14, 0x7a, 0xb3, + 0x92, 0x8e, 0x20, 0x2, 0x2, 0x41, 0x43, 0x7e, 0xd7, 0x92, 0xa0, 0xbe, 0xd4, + 0x0, 0xa, 0x28, 0x7b, 0x7e, 0xd7, 0x92, 0xb7, 0xbe, 0xd4, 0x0, 0xa, 0x28, + 0x71, 0x7e, 0xd7, 0x92, 0xce, 0xbe, 0xd4, 0x0, 0xa, 0x28, 0x67, 0x7e, 0xc7, + 0x92, 0xa9, 0x2e, 0xc7, 0x92, 0xb1, 0xbe, 0xc4, 0x0, 0x0, 0x58, 0x2, 0x6d, + 0xcc, 0x7e, 0xb7, 0x92, 0xab, 0x2e, 0xb7, 0x92, 0xb3, 0xbe, 0xb4, 0x0, 0x0, + 0x58, 0x2, 0x6d, 0xbb, 0x12, 0xd9, 0xae, 0x7d, 0x1c, 0x7d, 0xb, 0x12, 0xbc, + 0x36, 0x7d, 0xc3, 0x7e, 0xd7, 0x92, 0xb9, 0xbe, 0xd4, 0xf, 0xa0, 0x40, 0xa, + 0x7e, 0x27, 0x92, 0xb7, 0x7e, 0x34, 0x0, 0xa, 0x80, 0x13, 0x12, 0xdb, 0xc7, + 0x7e, 0x27, 0x92, 0xb7, 0x28, 0x6, 0x7e, 0x34, 0x0, 0x6, 0x80, 0x4, 0x7e, + 0x34, 0x0, 0x3, 0xad, 0x32, 0x7a, 0x35, 0x2a, 0x7e, 0xd5, 0x2a, 0xbd, 0xdc, + 0x28, 0x8, 0xc2, 0x2, 0x74, 0x28, 0x7a, 0xb3, 0x92, 0x8e, 0x7e, 0xb3, 0x2e, + 0x77, 0xb4, 0x1, 0xc, 0xc2, 0x2, 0xe4, 0x12, 0xd8, 0x87, 0x74, 0x6e, 0x7a, + 0xb3, 0x92, 0x8e, 0x7e, 0xa1, 0x3a, 0x74, 0xe, 0xa4, 0x7a, 0x55, 0x38, 0xbe, + 0x54, 0x0, 0xc8, 0x28, 0x2a, 0x7e, 0xd4, 0x0, 0xc8, 0x7a, 0xd5, 0x38, 0x80, + 0x21, 0xa, 0xdc, 0x2e, 0xd4, 0x36, 0xf5, 0x7e, 0xd9, 0xb0, 0x14, 0x7a, 0xd9, + 0xb0, 0x7e, 0xd4, 0x0, 0xb4, 0x7a, 0xd5, 0x38, 0x74, 0x78, 0x7a, 0xb3, 0x92, + 0x8e, 0xd2, 0x2, 0xe4, 0x7a, 0xb3, 0x92, 0x90, 0xa2, 0x2, 0xe4, 0x33, 0x7a, + 0xb3, 0x92, 0x91, 0xa, 0xdc, 0x9, 0xad, 0x36, 0x98, 0x4c, 0xaa, 0x78, 0x18, + 0x7e, 0xd5, 0x38, 0xbd, 0xd9, 0x40, 0x2, 0x81, 0xca, 0x20, 0x2, 0x2, 0x81, + 0xca, 0x74, 0x1, 0xa, 0x4c, 0x19, 0xb4, 0x36, 0x98, 0x81, 0xca, 0xbe, 0xa0, + 0x1, 0x68, 0x2, 0x81, 0x9e, 0x7e, 0x37, 0x92, 0xce, 0xbe, 0x34, 0x0, 0x3, + 0x50, 0x2d, 0x7e, 0x27, 0x92, 0xad, 0xbe, 0x24, 0x0, 0x50, 0x50, 0x23, 0x7e, + 0x27, 0x92, 0x9e, 0xbe, 0x24, 0x0, 0x14, 0x50, 0x19, 0x7e, 0x27, 0x92, 0xc6, + 0xbe, 0x24, 0x0, 0x1e, 0x50, 0xf, 0x7e, 0x27, 0x92, 0xaf, 0xbe, 0x24, 0x0, + 0x50, 0x50, 0x5, 0x7a, 0x85, 0x2a, 0x61, 0xcd, 0x7e, 0x27, 0x92, 0x9e, 0xbe, + 0x24, 0x0, 0xa, 0x50, 0x13, 0x7e, 0x27, 0x92, 0xb7, 0xbe, 0x24, 0x0, 0x8, + 0x28, 0x9, 0x7e, 0x53, 0x92, 0x8f, 0xbe, 0x50, 0xf, 0x40, 0x15, 0x7e, 0x27, + 0x92, 0xb7, 0xbe, 0x24, 0x0, 0xf, 0x28, 0x42, 0xbe, 0x34, 0x0, 0xf, 0x28, + 0x3c, 0x12, 0xdb, 0xc7, 0x50, 0x37, 0x7e, 0xa3, 0x92, 0xa4, 0xa, 0xa, 0x7d, + 0x18, 0x8d, 0x10, 0x7d, 0x1, 0x1e, 0x4, 0x12, 0xda, 0xb, 0xbe, 0x14, 0x0, + 0x78, 0x28, 0x7, 0x7e, 0x34, 0x0, 0x78, 0x7a, 0x35, 0x2a, 0xbe, 0xa0, 0xa, + 0x38, 0x2, 0x61, 0xcd, 0x7e, 0x35, 0x2a, 0xbe, 0x34, 0x0, 0x50, 0x50, 0x76, + 0x7e, 0x34, 0x0, 0x50, 0x7a, 0x35, 0x2a, 0x80, 0x6d, 0x7e, 0x73, 0x92, 0xa4, + 0xa, 0x7, 0x7e, 0x17, 0x92, 0xad, 0x8d, 0x10, 0x7d, 0x1, 0x12, 0xda, 0xb, + 0x7e, 0xa3, 0x92, 0xa6, 0x74, 0x2, 0xa4, 0x7e, 0x73, 0x92, 0x8f, 0xa, 0xd7, + 0xbd, 0xd5, 0x8, 0x2b, 0xbe, 0x24, 0x0, 0x1e, 0x50, 0x25, 0x7e, 0x63, 0x92, + 0xbd, 0xa, 0x16, 0x7d, 0x2d, 0x9d, 0x21, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x4, + 0x9d, 0xd1, 0x80, 0x4, 0x6d, 0xdd, 0x9d, 0xd2, 0xbe, 0xd4, 0x0, 0x5, 0x8, + 0x7, 0x12, 0xdb, 0xbf, 0x50, 0x22, 0x80, 0xa, 0xbe, 0x70, 0xf, 0x28, 0xb, + 0x12, 0xdb, 0xbf, 0x28, 0x16, 0x7e, 0xd4, 0x0, 0xc8, 0x80, 0xd, 0x7e, 0xd5, + 0x2a, 0xbe, 0xd4, 0x0, 0x78, 0x28, 0x7, 0x7e, 0xd4, 0x0, 0x78, 0x7a, 0xd5, + 0x2a, 0x7e, 0xd5, 0x2a, 0xbd, 0xd9, 0x28, 0x42, 0xd2, 0x0, 0x7e, 0xd7, 0x92, + 0x9e, 0xbe, 0xd4, 0x0, 0x8, 0x50, 0x11, 0x12, 0xda, 0xdb, 0x28, 0xc, 0x74, + 0x2, 0xa, 0x3c, 0x19, 0xb3, 0x36, 0x98, 0xc2, 0x0, 0x80, 0x7a, 0x7e, 0x37, + 0x92, 0xc6, 0xbe, 0x34, 0x0, 0x64, 0x28, 0x70, 0x12, 0xda, 0xdb, 0x28, 0x6b, + 0xbe, 0xd4, 0x0, 0x14, 0x50, 0x65, 0x7e, 0x73, 0x92, 0x8f, 0xbe, 0x70, 0x14, + 0x50, 0x5c, 0x12, 0xd8, 0x85, 0xc2, 0x0, 0x80, 0x55, 0x7e, 0xd5, 0x38, 0xbd, + 0xd9, 0x50, 0x8, 0x30, 0x2, 0x5, 0x74, 0x3, 0x12, 0xd8, 0x87, 0x7e, 0xd7, + 0x92, 0x9e, 0xbe, 0xd4, 0x0, 0x1e, 0x50, 0x3c, 0x7e, 0x73, 0x2e, 0x99, 0xbe, + 0x70, 0x2, 0x28, 0x18, 0x7e, 0xb3, 0x92, 0xa7, 0x70, 0x12, 0x12, 0xda, 0xd2, + 0x50, 0xd, 0x12, 0xd9, 0xae, 0x12, 0xaa, 0xf, 0x50, 0x20, 0x12, 0xd8, 0x85, + 0x80, 0x1b, 0x12, 0xda, 0xd2, 0x50, 0x16, 0x7e, 0xd7, 0x92, 0x98, 0xbe, + 0xd4, 0x0, 0x1e, 0x50, 0xc, 0x7e, 0xd7, 0x36, 0xf3, 0xbe, 0xd4, 0x0, 0x78, + 0x50, 0x2, 0xd2, 0x0, 0xa, 0xdc, 0x9, 0x8d, 0x36, 0x98, 0xbe, 0x80, 0x1, + 0x78, 0x1f, 0x12, 0xd9, 0xae, 0x7e, 0x17, 0x92, 0xc8, 0x7e, 0x7, 0x92, 0xca, + 0x12, 0xbc, 0x36, 0xbe, 0x34, 0x0, 0x3c, 0x50, 0x3c, 0xc2, 0x0, 0xe4, 0xa, + 0xdc, 0x19, 0xbd, 0x36, 0x8e, 0x80, 0x31, 0xbe, 0x80, 0x3, 0x78, 0x30, 0x74, + 0x1, 0x80, 0x29, 0xa, 0xdc, 0x9, 0xbd, 0x36, 0x98, 0xb4, 0x2, 0x23, 0x7e, + 0x73, 0x92, 0xbb, 0xa, 0x27, 0x7e, 0x37, 0x92, 0xc4, 0x8d, 0x32, 0x7d, 0x23, + 0x1e, 0x24, 0xe5, 0x3a, 0xa, 0x3b, 0xad, 0x32, 0x7a, 0x35, 0x2a, 0xbd, 0x39, + 0x28, 0x2, 0xd2, 0x0, 0xe4, 0x12, 0xd8, 0x87, 0x7e, 0xa1, 0x3a, 0x74, 0x5a, + 0xa4, 0x7a, 0x55, 0x32, 0xbe, 0x54, 0x5, 0x0, 0x28, 0xd, 0x7e, 0xb3, 0x36, + 0xa2, 0x70, 0x7, 0x7e, 0xd4, 0x5, 0x0, 0x7a, 0xd5, 0x32, 0x7e, 0xd5, 0x32, + 0xbd, 0xd9, 0x50, 0xc, 0x7e, 0xd7, 0x92, 0x9e, 0xbe, 0xd4, 0x0, 0x2, 0x28, + 0x2, 0xd2, 0x0, 0x20, 0x0, 0x2, 0xa1, 0x84, 0xe4, 0x12, 0xd8, 0x87, 0x7e, + 0x70, 0x8, 0xac, 0x7e, 0x9, 0xb3, 0x69, 0x19, 0x70, 0x8, 0x74, 0x3, 0x19, + 0xb3, 0x69, 0x19, 0x80, 0x2d, 0x74, 0x1, 0x19, 0xb3, 0x69, 0x19, 0x75, 0x27, + 0x0, 0x80, 0x19, 0x7e, 0x71, 0x27, 0x74, 0xd, 0xac, 0x7b, 0x9, 0x53, 0x68, + 0x9b, 0xbc, 0x5e, 0x78, 0x8, 0x74, 0xff, 0x19, 0xb3, 0x68, 0x9b, 0x80, 0xb, + 0x5, 0x27, 0x7e, 0x73, 0x75, 0x8c, 0xbe, 0x71, 0x27, 0x38, 0xde, 0x7e, 0xa0, + 0x3, 0x7e, 0x70, 0x8, 0xac, 0x7c, 0x19, 0xa3, 0x69, 0x1a, 0xe5, 0x3b, 0xbe, + 0xb0, 0x0, 0x28, 0x2f, 0x15, 0x3b, 0x7e, 0x70, 0xd, 0xac, 0x7f, 0x2e, 0x34, + 0x67, 0x93, 0x7e, 0x14, 0x91, 0xfe, 0x74, 0xd, 0x12, 0x1, 0xf3, 0x7e, 0x71, + 0x3b, 0x74, 0xd, 0xac, 0x7b, 0x12, 0x9d, 0xfb, 0xac, 0x3f, 0x12, 0xbd, 0x75, + 0x7e, 0x34, 0x91, 0xfe, 0x7e, 0x31, 0x3b, 0x12, 0xbd, 0x71, 0x1b, 0xf0, 0xa, + 0xdc, 0x9, 0xad, 0x36, 0x98, 0xbe, 0xa0, 0x1, 0x78, 0x25, 0x7e, 0xb3, 0x92, + 0x8e, 0xbe, 0xb0, 0x78, 0x68, 0x46, 0x7e, 0x47, 0x92, 0xa9, 0x7e, 0x70, 0x4, + 0xac, 0x7c, 0x59, 0x43, 0x92, 0xd2, 0x7e, 0x47, 0x92, 0xab, 0x7e, 0x70, 0x4, + 0xac, 0x7c, 0x59, 0x43, 0x92, 0xd4, 0x80, 0x2a, 0xbe, 0xa0, 0x2, 0x78, 0x25, + 0x7e, 0xb3, 0x92, 0xa5, 0xbe, 0xb0, 0x78, 0x68, 0x1c, 0x7e, 0xd7, 0x92, + 0xc0, 0x3e, 0xd4, 0x74, 0x4, 0xac, 0xbc, 0x59, 0xd5, 0x92, 0xd2, 0x7e, 0xd7, + 0x92, 0xc2, 0x3e, 0xd4, 0x74, 0x4, 0xac, 0xbc, 0x59, 0xd5, 0x92, 0xd4, 0xa, + 0xdc, 0x9, 0xbd, 0x36, 0x8e, 0xb4, 0x5, 0x38, 0x75, 0x27, 0x0, 0x80, 0x1a, + 0x7e, 0xa1, 0x27, 0x74, 0x17, 0xa4, 0x7e, 0xd, 0x2e, 0x7f, 0x10, 0x2d, 0x35, + 0x2e, 0x34, 0x0, 0x17, 0x2d, 0x15, 0x74, 0x17, 0x12, 0x2, 0x14, 0x5, 0x27, + 0xe5, 0x27, 0xbe, 0xb0, 0x4, 0x40, 0xdf, 0x7e, 0x34, 0x92, 0x8d, 0x7e, 0xd, + 0x2e, 0x2e, 0x14, 0x0, 0x5c, 0x74, 0x17, 0x12, 0x2, 0x62, 0x80, 0x55, 0x7e, + 0x34, 0x92, 0x8d, 0xa, 0x2c, 0x9, 0xa2, 0x36, 0x8e, 0x74, 0x17, 0xa4, 0x7e, + 0xd, 0x2e, 0x2d, 0x15, 0x74, 0x17, 0x12, 0x2, 0x62, 0xa, 0xdc, 0x2e, 0xd4, + 0x36, 0x8e, 0x7e, 0xd9, 0xb0, 0x4, 0x7a, 0xd9, 0xb0, 0x80, 0x2f, 0xb, 0xd0, + 0x12, 0x97, 0x48, 0x28, 0x3, 0x2, 0x9f, 0xcd, 0x80, 0x23, 0x12, 0xd9, 0xff, + 0x6d, 0x33, 0x74, 0x2, 0xac, 0xbe, 0x59, 0x35, 0x36, 0xcb, 0x59, 0x35, 0x36, + 0xdf, 0x7e, 0xa0, 0xff, 0x7e, 0x70, 0xd, 0xac, 0x7e, 0x19, 0xa3, 0x31, 0x10, + 0x74, 0x1, 0x19, 0xbd, 0x36, 0xf5, 0xb, 0xf0, 0xe5, 0x3b, 0xbc, 0xbf, 0x28, + 0x3, 0x2, 0x9f, 0x72, 0x6c, 0xff, 0x80, 0xe, 0x12, 0x6c, 0xb8, 0x2e, 0x34, + 0x67, 0x93, 0x2e, 0x14, 0x92, 0xb, 0x12, 0x6c, 0xc0, 0x12, 0x9a, 0x45, 0x38, + 0xed, 0x6c, 0xff, 0xe1, 0x93, 0x74, 0xd, 0xac, 0xbf, 0x9, 0xe5, 0x67, 0x97, + 0xa, 0xde, 0x9, 0x7d, 0x36, 0x98, 0xbe, 0x70, 0x0, 0x38, 0x2, 0xe1, 0x91, + 0x6c, 0xdd, 0xe1, 0x8a, 0xa, 0x4e, 0x9, 0xa4, 0x36, 0x98, 0xbe, 0xa0, 0x1, + 0x78, 0x66, 0x7e, 0x70, 0xd, 0xac, 0x7d, 0x9, 0xb3, 0x31, 0x10, 0xbc, 0xbe, + 0x68, 0x2, 0xe1, 0x88, 0x7e, 0x50, 0x4, 0xac, 0x5e, 0x49, 0xd2, 0x92, 0xd2, + 0x49, 0xc3, 0x31, 0xc, 0x12, 0xd8, 0x70, 0x8, 0x4, 0x7d, 0xcd, 0x80, 0x9, + 0x7e, 0xd5, 0x36, 0xbd, 0xdc, 0x58, 0x2, 0x7d, 0xcd, 0x7e, 0x70, 0xd, 0xac, + 0x7f, 0x59, 0xc3, 0x67, 0x93, 0x7e, 0x70, 0x4, 0xac, 0x7e, 0x49, 0xd3, 0x92, + 0xd4, 0x7e, 0x70, 0xd, 0xac, 0x7d, 0x49, 0xb3, 0x31, 0xe, 0x12, 0xd8, 0xf2, + 0x8, 0x4, 0x7d, 0xbd, 0x80, 0x9, 0x7e, 0xd5, 0x36, 0xbd, 0xdb, 0x58, 0x2, + 0x7d, 0xbd, 0x7e, 0x70, 0xd, 0xac, 0x7f, 0x59, 0xb3, 0x67, 0x95, 0x80, 0x6d, + 0xbe, 0xa0, 0x2, 0x78, 0x5f, 0x7e, 0x70, 0xd, 0xac, 0x7d, 0x9, 0x53, 0x31, + 0x92, 0xbc, 0x5e, 0x78, 0x52, 0x74, 0x4, 0xac, 0xbe, 0x49, 0xd5, 0x92, 0xd2, + 0x49, 0xc3, 0x31, 0x8e, 0x12, 0xd8, 0x70, 0x8, 0x4, 0x7d, 0xcd, 0x80, 0x9, + 0x7e, 0xd5, 0x36, 0xbd, 0xdc, 0x58, 0x2, 0x7d, 0xcd, 0x74, 0xd, 0xac, 0xbf, + 0x59, 0xc5, 0x67, 0x93, 0x74, 0x4, 0xac, 0xbe, 0x49, 0xd5, 0x92, 0xd4, 0x74, + 0xd, 0xac, 0xbd, 0x49, 0xb5, 0x31, 0x90, 0x12, 0xd8, 0xf2, 0x8, 0x4, 0x7d, + 0xbd, 0x80, 0x9, 0x7e, 0xd5, 0x36, 0xbd, 0xdb, 0x58, 0x2, 0x7d, 0xbd, 0x74, + 0xd, 0xac, 0xbf, 0x59, 0xb5, 0x67, 0x95, 0x80, 0x9, 0xb, 0xd0, 0x12, 0x97, + 0x48, 0x28, 0x2, 0xc1, 0xb3, 0xb, 0xf0, 0xe5, 0x3b, 0xbc, 0xbf, 0x28, 0x2, + 0xc1, 0x9a, 0x6c, 0xff, 0x80, 0x1e, 0x12, 0x6c, 0xb8, 0x2e, 0x34, 0x31, 0xc, + 0x2e, 0x14, 0x31, 0x8e, 0x74, 0xd, 0x12, 0x1, 0xf3, 0x12, 0x6c, 0xb8, 0x2e, + 0x34, 0x92, 0xb, 0x2e, 0x14, 0x31, 0xc, 0x12, 0x6c, 0xc0, 0x12, 0x9a, 0x45, + 0x38, 0xdd, 0x6c, 0xff, 0x80, 0x41, 0x7e, 0x70, 0xd, 0xac, 0x7f, 0x9, 0xe3, + 0x31, 0x10, 0x7e, 0x53, 0x75, 0x8c, 0xbc, 0x5e, 0x28, 0x2e, 0x7e, 0x50, 0x8, + 0xac, 0x5e, 0x9, 0xb2, 0x69, 0x19, 0xbe, 0xb0, 0x1, 0x68, 0x3, 0xb4, 0x3, + 0x1d, 0x12, 0xd9, 0xff, 0x6d, 0x22, 0x74, 0x2, 0xac, 0xbe, 0x59, 0x25, 0x36, + 0xcb, 0x59, 0x25, 0x36, 0xdf, 0x74, 0xff, 0x19, 0xb3, 0x31, 0x10, 0x74, 0x1, + 0x19, 0xbd, 0x36, 0xf5, 0xb, 0xf0, 0x12, 0x9a, 0x45, 0x38, 0xba, 0xe5, 0x3b, + 0x7a, 0xb3, 0x69, 0x69, 0xe4, 0x7a, 0xb3, 0x30, 0xf0, 0xda, 0x3b, 0x22, + 0x6c, 0xaa, 0x7e, 0x63, 0x2e, 0x98, 0xe4, 0xa, 0x46, 0x19, 0xb4, 0x2e, 0x9a, + 0x6c, 0x77, 0x80, 0x2f, 0x7e, 0x50, 0xd, 0xac, 0x57, 0x49, 0x22, 0x67, 0x93, + 0x12, 0xa8, 0x8d, 0x59, 0x21, 0x2e, 0xa1, 0x7e, 0x50, 0xd, 0xac, 0x57, 0x49, + 0x22, 0x67, 0x95, 0x12, 0xa8, 0x8d, 0x59, 0x21, 0x2e, 0xa3, 0xa, 0x26, 0x2e, + 0x24, 0x2e, 0x9a, 0x7e, 0x29, 0xb0, 0x4, 0x7a, 0x29, 0xb0, 0xb, 0x70, 0x7e, + 0xb3, 0x69, 0x69, 0xbc, 0xb7, 0x38, 0xc9, 0x7e, 0xb3, 0x2e, 0x98, 0x4, 0x7a, + 0xb3, 0x2e, 0x98, 0xb4, 0x7, 0x5, 0xe4, 0x7a, 0xb3, 0x2e, 0x98, 0x6c, 0x77, + 0xa, 0x27, 0x9, 0x62, 0x2e, 0x9a, 0xbc, 0x6a, 0x28, 0x2, 0x7c, 0xa6, 0xb, + 0x70, 0xbe, 0x70, 0x7, 0x40, 0xed, 0x7a, 0xa3, 0x2e, 0x99, 0x22, 0xa, 0x16, + 0x9, 0x1, 0x2e, 0x9a, 0x7e, 0x10, 0x4, 0xac, 0x1, 0x7e, 0x30, 0x28, 0xac, + 0x36, 0x2d, 0x10, 0x22, 0x6c, 0xaa, 0x6c, 0x77, 0x80, 0x35, 0x7e, 0x50, 0xd, + 0xac, 0x57, 0x49, 0x42, 0x67, 0x93, 0x49, 0x22, 0x67, 0x95, 0xbe, 0x44, 0x0, + 0x40, 0x28, 0x20, 0x7e, 0x17, 0x76, 0x1b, 0x9e, 0x14, 0x0, 0x41, 0xbd, 0x14, + 0x28, 0x14, 0xbe, 0x24, 0x0, 0x40, 0x28, 0xe, 0x7e, 0x17, 0x76, 0x29, 0x9e, + 0x14, 0x0, 0x41, 0xbd, 0x12, 0x28, 0x2, 0xb, 0xa0, 0xb, 0x70, 0x7e, 0x63, + 0x69, 0x69, 0xbc, 0x67, 0x38, 0xc3, 0x7c, 0xba, 0x22, 0x7e, 0x73, 0x69, + 0x6a, 0xbe, 0x73, 0x69, 0x69, 0x78, 0x7e, 0x7e, 0xb3, 0x69, 0x69, 0xb4, 0x1, + 0x77, 0x7e, 0xb3, 0x31, 0x5, 0xbe, 0xb0, 0x2, 0x38, 0x13, 0x4, 0x7a, 0xb3, + 0x31, 0x5, 0x7e, 0x37, 0x67, 0x93, 0x7a, 0x37, 0x31, 0x8, 0x7e, 0x37, 0x67, + 0x95, 0x80, 0x6a, 0x7e, 0x37, 0x31, 0x6, 0xbe, 0x34, 0x6, 0xa4, 0x50, 0x4e, + 0x7e, 0x27, 0x67, 0x93, 0x7d, 0x12, 0x9e, 0x17, 0x31, 0x8, 0xbe, 0x14, 0x0, + 0x0, 0x8, 0x8, 0x7d, 0x32, 0x9e, 0x37, 0x31, 0x8, 0x80, 0x4, 0x6d, 0x33, + 0x9d, 0x31, 0x2e, 0x37, 0x31, 0x6, 0x7a, 0x37, 0x31, 0x6, 0x7e, 0x37, 0x67, + 0x95, 0x7d, 0x3, 0x9e, 0x7, 0x31, 0xa, 0xbe, 0x4, 0x0, 0x0, 0x8, 0x8, 0x7d, + 0x13, 0x9e, 0x17, 0x31, 0xa, 0x80, 0x4, 0x6d, 0x11, 0x9d, 0x10, 0x2e, 0x17, + 0x31, 0x6, 0x7a, 0x17, 0x31, 0x6, 0x7a, 0x27, 0x31, 0x8, 0x80, 0x12, 0x74, + 0x1, 0x22, 0xe4, 0x7a, 0xb3, 0x31, 0x5, 0x6d, 0x33, 0x7a, 0x37, 0x31, 0x6, + 0x7a, 0x37, 0x31, 0x8, 0x7a, 0x37, 0x31, 0xa, 0xe4, 0x22, 0x7e, 0x8, 0x2e, + 0x98, 0x7e, 0x34, 0x1, 0x21, 0xe4, 0x2, 0x0, 0x2e, 0x7f, 0x70, 0x7c, 0x9b, + 0x7e, 0xa0, 0xa, 0x7e, 0x30, 0x1f, 0xac, 0x39, 0x19, 0xa1, 0x2f, 0xba, 0xe4, + 0x19, 0xb1, 0x2f, 0xbb, 0x19, 0xb1, 0x2f, 0xbc, 0x74, 0x1, 0x19, 0xb1, 0x2f, + 0xbd, 0xe4, 0x19, 0xb1, 0x2f, 0xbe, 0x19, 0xb1, 0x2f, 0xbf, 0x29, 0x77, 0x0, + 0x5, 0x19, 0x71, 0x2f, 0xc0, 0x29, 0x77, 0x0, 0x6, 0x19, 0x71, 0x2f, 0xc1, + 0x19, 0xb1, 0x2f, 0xc2, 0x7e, 0x4, 0x7f, 0xff, 0x59, 0x1, 0x2f, 0xc3, 0xb, + 0x7a, 0x30, 0x59, 0x31, 0x2f, 0xc5, 0x69, 0x7, 0x0, 0x2, 0x59, 0x1, 0x2f, + 0xc7, 0x59, 0x31, 0x2f, 0xc9, 0x59, 0x1, 0x2f, 0xcb, 0x59, 0x31, 0x2f, 0xcd, + 0x59, 0x1, 0x2f, 0xcf, 0x7e, 0x4, 0x7f, 0xff, 0x59, 0x1, 0x2f, 0xd1, 0x59, + 0x1, 0x2f, 0xd3, 0x69, 0x37, 0x0, 0xb, 0x69, 0x27, 0x0, 0x9, 0x59, 0x31, + 0x2f, 0xd7, 0x59, 0x21, 0x2f, 0xd5, 0x22, 0x6c, 0xaa, 0x6c, 0x33, 0x80, + 0x4e, 0x7e, 0x90, 0x4, 0xac, 0x93, 0x7e, 0x10, 0x28, 0xac, 0x1a, 0x7d, 0xe0, + 0x2d, 0xe4, 0x49, 0xe, 0x2e, 0xa1, 0x7d, 0xf3, 0x9d, 0xf0, 0xbe, 0xf4, 0x0, + 0x0, 0x8, 0x6, 0x7d, 0x43, 0x9d, 0x40, 0x80, 0x4, 0x6d, 0x44, 0x9d, 0x4f, + 0x49, 0xde, 0x2e, 0xa3, 0x7d, 0xf2, 0x9d, 0xfd, 0xbe, 0xf4, 0x0, 0x0, 0x8, + 0x6, 0x7d, 0x2, 0x9d, 0xd, 0x80, 0x4, 0x6d, 0x0, 0x9d, 0xf, 0xbe, 0x44, 0x0, + 0x50, 0x50, 0x8, 0xbe, 0x4, 0x0, 0x50, 0x50, 0x2, 0xd3, 0x22, 0xb, 0x30, + 0xa, 0xfa, 0x9, 0x2f, 0x2e, 0x9a, 0xbc, 0x23, 0x38, 0xa8, 0xb, 0xa0, 0xbe, + 0xa0, 0x7, 0x40, 0x9d, 0xc3, 0x22, 0x7e, 0xb3, 0x30, 0xf0, 0xbe, 0xb0, 0xfa, + 0x50, 0x5, 0x4, 0x7a, 0xb3, 0x30, 0xf0, 0x22, 0xc2, 0x0, 0x7e, 0xa3, 0x2e, + 0x75, 0xbe, 0xa0, 0x2, 0x50, 0x2e, 0x7e, 0xb3, 0x67, 0x8c, 0x60, 0x21, 0xa, + 0x4a, 0x9, 0xb4, 0x39, 0xdf, 0xbe, 0xb3, 0x67, 0x82, 0x50, 0xc, 0x7d, 0x34, + 0x2e, 0x34, 0x39, 0xdf, 0x4, 0x7a, 0x39, 0xb0, 0x80, 0x10, 0xe4, 0x19, 0xb4, + 0x39, 0xdf, 0xd2, 0x0, 0x80, 0x7, 0xe4, 0xa, 0x3a, 0x19, 0xb3, 0x39, 0xdf, + 0x20, 0x0, 0x2a, 0x7e, 0xb3, 0x67, 0x8c, 0xb4, 0x1, 0x1e, 0xe4, 0x7a, 0xb3, + 0x67, 0x92, 0x7e, 0x73, 0x67, 0x82, 0xbe, 0x73, 0x39, 0xde, 0x28, 0xc, 0xe4, + 0x7a, 0xb3, 0x67, 0x8c, 0x7e, 0xb3, 0x39, 0xde, 0x4, 0x80, 0x4, 0xe4, 0x80, + 0x1, 0xe4, 0x7a, 0xb3, 0x39, 0xde, 0x7e, 0xb3, 0x67, 0x92, 0xb4, 0x1, 0x1a, + 0x7e, 0x73, 0x67, 0x81, 0xbe, 0x73, 0x39, 0xe2, 0x28, 0xc, 0xe4, 0x7a, 0xb3, + 0x67, 0x92, 0x7e, 0xb3, 0x39, 0xe2, 0x4, 0x80, 0x6, 0x74, 0x1, 0x80, 0x2, + 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xe2, 0x22, 0x12, 0x77, 0xc2, 0x12, 0xaf, 0xdd, + 0x12, 0xab, 0x1f, 0x2, 0xaa, 0x85, 0x7e, 0x47, 0x67, 0x6c, 0x7e, 0x7, 0x81, + 0xf1, 0x7e, 0x34, 0x0, 0x6, 0xad, 0x30, 0x7e, 0x14, 0x0, 0x4, 0x12, 0xab, + 0xcc, 0x8, 0x5, 0x7e, 0xa0, 0x4, 0x80, 0x1d, 0x7d, 0x30, 0x3e, 0x34, 0x12, + 0xab, 0xca, 0x8, 0x5, 0x7e, 0xa0, 0x3, 0x80, 0xf, 0x7d, 0x30, 0x12, 0xab, + 0xca, 0x8, 0x5, 0x7e, 0xa0, 0x2, 0x80, 0x3, 0x7e, 0xa0, 0x1, 0x7e, 0xb3, + 0x67, 0x89, 0x60, 0x3, 0x7e, 0xa0, 0x4, 0x30, 0x2a, 0x3, 0x7e, 0xa0, 0x4, + 0x12, 0xaf, 0x7f, 0x60, 0x3, 0x7e, 0xa0, 0x1, 0xa, 0x2a, 0x7e, 0x37, 0x76, + 0x46, 0xad, 0x32, 0x7a, 0x37, 0x67, 0x7f, 0x7e, 0xb3, 0x76, 0x48, 0x7a, + 0xb3, 0x67, 0x81, 0x7e, 0xb3, 0x67, 0x62, 0xbe, 0xb0, 0x0, 0x28, 0x28, 0x7e, + 0xb3, 0x67, 0x83, 0x70, 0x22, 0x7e, 0x37, 0x67, 0x7f, 0xbe, 0x34, 0x0, 0x2, + 0x48, 0x9, 0x12, 0x6f, 0xdc, 0x7a, 0x37, 0x67, 0x7f, 0x80, 0xf, 0x7e, 0x63, + 0x67, 0x81, 0x7e, 0x70, 0x2, 0xac, 0x67, 0x7c, 0xb7, 0x7a, 0xb3, 0x67, 0x81, + 0x7e, 0xb3, 0x59, 0x60, 0xb4, 0x1, 0xe, 0x7e, 0x27, 0x67, 0x7f, 0x7e, 0x34, + 0x0, 0x5, 0xad, 0x32, 0x7a, 0x37, 0x67, 0x7f, 0x22, 0x3e, 0x34, 0x7d, 0x21, + 0x12, 0x1, 0x20, 0xbd, 0x34, 0x22, 0x12, 0xac, 0x4b, 0x12, 0xab, 0x13, 0x12, + 0xac, 0x30, 0x40, 0x5, 0xe4, 0x7a, 0xb3, 0x67, 0x8c, 0x7e, 0xb3, 0x67, 0x8c, + 0x60, 0x30, 0xe4, 0x7a, 0xb3, 0x39, 0xde, 0x7e, 0x8, 0x39, 0xdf, 0x7e, 0x34, + 0x0, 0x2, 0x12, 0x0, 0x2e, 0x7e, 0xa3, 0x9b, 0xae, 0x12, 0xac, 0x44, 0x60, + 0x5, 0x3e, 0x44, 0x14, 0x78, 0xfb, 0x7c, 0xb9, 0x4e, 0xb3, 0x8d, 0x93, 0x7a, + 0xb3, 0x8d, 0x93, 0xbe, 0xa0, 0x1, 0x78, 0x3, 0x12, 0x5f, 0xc6, 0x12, 0xac, + 0x30, 0x40, 0x6, 0x12, 0xac, 0x7b, 0x12, 0xaf, 0xa2, 0x7e, 0xb3, 0x67, 0x92, + 0x60, 0x4, 0xe4, 0x2, 0xae, 0x66, 0x22, 0x7e, 0xb3, 0x9b, 0xaf, 0x70, 0xc, + 0x7e, 0x73, 0x9b, 0x87, 0xbe, 0x73, 0x9b, 0xb0, 0x40, 0x2, 0xc3, 0x22, 0xd3, + 0x22, 0x7e, 0x44, 0x0, 0x1, 0x7c, 0xba, 0x22, 0x12, 0xad, 0x5, 0x12, 0xb5, + 0x72, 0x12, 0xaf, 0x84, 0x2, 0xac, 0x57, 0x7e, 0x27, 0x8d, 0x94, 0x1e, 0x24, + 0x1e, 0x24, 0xe4, 0x7a, 0xb3, 0x67, 0x89, 0x7e, 0x37, 0x67, 0x64, 0xbd, + 0x32, 0x38, 0x8, 0x7e, 0x37, 0x67, 0x66, 0xbd, 0x32, 0x28, 0x6, 0x74, 0x1, + 0x7a, 0xb3, 0x67, 0x89, 0x22, 0x7e, 0x18, 0x9, 0x20, 0x7a, 0x1d, 0x27, 0x7e, + 0x1f, 0x2d, 0x2a, 0x7f, 0x1, 0xe4, 0x2, 0xac, 0x8c, 0x7c, 0xab, 0x7f, 0x61, + 0x7f, 0x70, 0x12, 0xaf, 0x7, 0x7e, 0xb3, 0x82, 0xd, 0x7a, 0xb3, 0x91, 0xff, + 0x7e, 0xb3, 0x82, 0xc, 0x7a, 0xb3, 0x91, 0xfe, 0x7a, 0xa3, 0x92, 0x0, 0xe4, + 0x12, 0xaf, 0xac, 0x7e, 0x1d, 0x27, 0x7a, 0x37, 0x92, 0x4, 0x7d, 0x3f, 0x7a, + 0x37, 0x92, 0x6, 0x7e, 0x34, 0x0, 0x10, 0x12, 0xaf, 0x99, 0x2, 0x27, 0x50, + 0x7c, 0xab, 0x6c, 0x77, 0x7e, 0x63, 0x39, 0xdb, 0xbc, 0x67, 0x78, 0x8, 0x6c, + 0x66, 0x12, 0xac, 0xfb, 0xe4, 0x80, 0x17, 0x12, 0xac, 0x44, 0x60, 0x5, 0x3e, + 0x44, 0x14, 0x78, 0xfb, 0x12, 0xad, 0x87, 0x68, 0xc, 0x7e, 0x60, 0x1, 0x12, + 0xac, 0xfb, 0x74, 0x1, 0x19, 0xb4, 0x39, 0x56, 0xb, 0x70, 0xbe, 0x70, 0x3, + 0x40, 0xce, 0x22, 0x7e, 0x90, 0x1e, 0xac, 0x97, 0x19, 0x64, 0x39, 0x55, + 0x22, 0xe4, 0x7a, 0xb3, 0x67, 0x83, 0x75, 0x27, 0x0, 0x75, 0x28, 0x0, 0x7e, + 0xb3, 0x82, 0xc, 0xf5, 0x29, 0x7e, 0xb3, 0x82, 0xd, 0xf5, 0x2a, 0x7e, 0x8, + 0x0, 0x27, 0x7e, 0x37, 0x81, 0xef, 0x12, 0xad, 0x90, 0xe4, 0x33, 0x7a, 0xb3, + 0x67, 0x83, 0x12, 0xaf, 0xb7, 0xe4, 0x33, 0x7a, 0xb3, 0x67, 0x87, 0x12, + 0xad, 0xda, 0xe4, 0x33, 0x7a, 0xb3, 0x67, 0x88, 0x22, 0x7c, 0xab, 0x6c, + 0x77, 0x7e, 0x63, 0x39, 0xdb, 0xbc, 0x67, 0x78, 0x4, 0x6c, 0x66, 0x80, 0x22, + 0x12, 0xac, 0x44, 0x60, 0x5, 0x3e, 0x44, 0x14, 0x78, 0xfb, 0x12, 0xad, 0x87, + 0x68, 0x6, 0x7e, 0x60, 0x1, 0x12, 0xad, 0x7d, 0x7e, 0x63, 0x8d, 0x93, 0xa, + 0x26, 0x5d, 0x24, 0x68, 0x6, 0x7e, 0x60, 0x1, 0x12, 0xad, 0x7d, 0xb, 0x70, + 0xbe, 0x70, 0x3, 0x40, 0xc8, 0x22, 0x7e, 0x50, 0x1e, 0xac, 0x57, 0x19, 0x62, + 0x39, 0x56, 0x22, 0x7e, 0x63, 0x8d, 0x92, 0xa, 0x26, 0x5d, 0x24, 0x22, 0xca, + 0xd8, 0xca, 0x79, 0x7d, 0x43, 0x7f, 0x70, 0x7e, 0x73, 0x67, 0x62, 0xbe, + 0x70, 0x0, 0x28, 0x33, 0x6c, 0xff, 0x80, 0x2a, 0x74, 0x2, 0xac, 0xbf, 0x9, + 0xe5, 0x65, 0x60, 0x9, 0xd5, 0x65, 0x61, 0x7c, 0xbe, 0x7c, 0x7d, 0x12, 0x2e, + 0x40, 0x7d, 0xd3, 0x7f, 0x7, 0x7c, 0x7d, 0x12, 0xb5, 0xc5, 0x50, 0x7, 0xbd, + 0x4d, 0x58, 0x6, 0xd3, 0x80, 0xb, 0xd3, 0x80, 0x8, 0xb, 0xf0, 0x12, 0x67, + 0x3e, 0x38, 0xd1, 0xc3, 0xda, 0x79, 0xda, 0xd8, 0x22, 0xd2, 0x0, 0x6c, 0x99, + 0x80, 0x35, 0x74, 0x2, 0xac, 0xb9, 0x9, 0x5, 0x58, 0xfd, 0x9, 0x15, 0x58, + 0xfe, 0x12, 0xae, 0x5f, 0x74, 0x2, 0xac, 0xb9, 0x49, 0x25, 0x58, 0xc0, 0x7d, + 0xf3, 0x9d, 0xf2, 0xbe, 0xf4, 0x0, 0x0, 0x8, 0x4, 0x7d, 0x1f, 0x80, 0x4, + 0x6d, 0x11, 0x9d, 0x1f, 0xbe, 0x17, 0x67, 0x7b, 0x28, 0x4, 0xc2, 0x0, 0x80, + 0xa, 0xb, 0x90, 0x7e, 0x83, 0x58, 0xfc, 0xbc, 0x89, 0x38, 0xc3, 0x20, 0x0, + 0x31, 0x6c, 0x99, 0x80, 0x21, 0x74, 0x2, 0xac, 0xb9, 0x9, 0x5, 0x65, 0x60, + 0x9, 0x15, 0x65, 0x61, 0x12, 0xae, 0x5f, 0x74, 0x2, 0xac, 0xb9, 0x59, 0x35, + 0x58, 0xc0, 0x19, 0x5, 0x58, 0xfd, 0x19, 0x15, 0x58, 0xfe, 0xb, 0x90, 0x7e, + 0x73, 0x67, 0x62, 0xbc, 0x79, 0x38, 0xd7, 0x7a, 0x73, 0x58, 0xfc, 0x7e, + 0xb3, 0x67, 0x62, 0x70, 0x5, 0xe4, 0x7a, 0xb3, 0x58, 0xfc, 0xa2, 0x0, 0x22, + 0x7c, 0xb0, 0x7c, 0x71, 0x2, 0x2e, 0x40, 0xca, 0xf8, 0x7c, 0xfb, 0x12, 0xaf, + 0x7, 0x7e, 0x8, 0x92, 0xe, 0x7e, 0x34, 0x0, 0x5, 0x12, 0x0, 0x2e, 0x7e, + 0xa3, 0x82, 0xc, 0x7e, 0x73, 0x82, 0xd, 0x7e, 0xa7, 0x67, 0x7f, 0x7d, 0xca, + 0x3e, 0xc4, 0x3e, 0xc4, 0x4c, 0xff, 0x78, 0x76, 0x7e, 0xb7, 0x8d, 0x94, + 0x7a, 0x73, 0x91, 0xff, 0x7a, 0xa3, 0x91, 0xfe, 0x7e, 0xd4, 0x9, 0x20, 0x7a, + 0xd7, 0x92, 0x2, 0x7e, 0x1f, 0x2d, 0x2a, 0x7d, 0xd3, 0x7a, 0xd7, 0x92, 0x4, + 0x7e, 0x1f, 0x2d, 0x2a, 0x7d, 0xd3, 0x7a, 0xd7, 0x92, 0x6, 0x7d, 0x3a, 0x7c, + 0xb7, 0xf5, 0x27, 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x18, 0x92, 0xe, 0x7d, 0x5a, + 0x12, 0x2b, 0xa8, 0x7e, 0x70, 0x4, 0x7d, 0xab, 0x3e, 0xa4, 0x49, 0xda, 0x9, + 0x20, 0xbd, 0xcd, 0x58, 0x10, 0x7e, 0xf, 0x2d, 0x2a, 0x2d, 0x1a, 0xb, 0xa, + 0x20, 0x2d, 0x2c, 0x1b, 0xa, 0x20, 0x80, 0x16, 0x6d, 0x22, 0x9d, 0x2c, 0xbd, + 0x2d, 0x8, 0xe, 0x7e, 0xf, 0x2d, 0x2a, 0x2d, 0x1a, 0xb, 0xa, 0xa0, 0x9d, + 0xac, 0x1b, 0xa, 0xa0, 0xb, 0xb4, 0x1b, 0x70, 0x78, 0xc8, 0xda, 0xf8, 0x22, + 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x34, 0x0, 0x10, 0xe4, 0x2, 0x0, 0x2e, 0x7f, + 0x61, 0x7f, 0x70, 0x7e, 0x8, 0x96, 0x48, 0x12, 0xaf, 0xb, 0x7e, 0x73, 0x82, + 0xd, 0x7a, 0x73, 0x96, 0x49, 0x7e, 0x73, 0x82, 0xc, 0x7a, 0x73, 0x96, 0x48, + 0x7a, 0xb3, 0x96, 0x4b, 0x7d, 0x3d, 0x7a, 0x37, 0x96, 0x4c, 0x7d, 0x3f, + 0x7a, 0x37, 0x96, 0x50, 0x7e, 0x8, 0x96, 0x48, 0x2, 0xaf, 0x45, 0xa9, 0xa6, + 0xcb, 0x92, 0x8, 0x12, 0xaf, 0x91, 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, + 0x46, 0x69, 0x30, 0x0, 0x8, 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x4a, + 0x12, 0xaf, 0xc9, 0x59, 0x32, 0x0, 0x42, 0x12, 0xaf, 0x8a, 0x12, 0x4f, 0xe1, + 0x7e, 0x47, 0x39, 0xf9, 0x59, 0x54, 0x0, 0x4c, 0x12, 0x2c, 0x8b, 0xa2, 0x8, + 0xa9, 0x96, 0xcb, 0x22, 0x7e, 0xb3, 0x39, 0xa3, 0x22, 0xe4, 0x7a, 0xb3, + 0x67, 0x86, 0x22, 0x29, 0xb0, 0x0, 0x3, 0x54, 0x1, 0x22, 0xa9, 0xd6, 0xcb, + 0x69, 0x30, 0x0, 0x4, 0x22, 0x7a, 0x37, 0x92, 0x8, 0x7e, 0x8, 0x91, 0xfe, + 0x22, 0xe4, 0x7a, 0xb3, 0x67, 0x62, 0x7a, 0xb3, 0x67, 0x63, 0x22, 0x7a, + 0xb3, 0x92, 0x1, 0x7d, 0x3d, 0x7a, 0x37, 0x92, 0x2, 0x22, 0x7e, 0x37, 0x67, + 0x66, 0x2e, 0x37, 0x67, 0x64, 0xbe, 0x37, 0x67, 0x7d, 0x28, 0x2, 0xd3, 0x22, + 0xc3, 0x22, 0x7e, 0xb, 0x70, 0x7c, 0x47, 0x6c, 0x55, 0x29, 0x70, 0x0, 0x1, + 0xa, 0x37, 0x2d, 0x32, 0x7e, 0x27, 0x39, 0xf9, 0x22, 0xd2, 0x0, 0xe4, 0x7a, + 0xb3, 0x67, 0x8c, 0x7a, 0xb3, 0x67, 0x8f, 0x7e, 0xb3, 0x67, 0x84, 0xb4, 0x1, + 0x6, 0x74, 0x1, 0x7a, 0xb3, 0x67, 0x8c, 0x7e, 0xb3, 0x67, 0x88, 0x70, 0x2, + 0xc2, 0x0, 0x7e, 0xb3, 0x2e, 0x74, 0x70, 0x2, 0xc2, 0x0, 0x20, 0x0, 0x5, + 0xe4, 0x7a, 0xb3, 0x67, 0x8c, 0x22, 0x12, 0xb3, 0x50, 0x12, 0xb0, 0x1e, 0x2, + 0xb0, 0x17, 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xf8, 0x22, 0xca, 0x3b, 0x7e, 0x34, + 0x0, 0xb3, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x14, 0x91, 0xfe, 0x74, 0x24, 0x12, + 0x2, 0x3d, 0x7e, 0x34, 0x0, 0xd7, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x14, 0x92, + 0x22, 0x74, 0x24, 0x12, 0x2, 0x3d, 0x75, 0x2d, 0x0, 0x6d, 0x33, 0x7a, 0x35, + 0x32, 0x7e, 0xa3, 0x82, 0xe, 0x7a, 0xa1, 0x34, 0x7e, 0xb3, 0x82, 0xf, 0xf5, + 0x35, 0x7e, 0x58, 0x4, 0x0, 0x7e, 0x38, 0x92, 0x46, 0xb, 0x75, 0x5e, 0xf0, + 0xfe, 0x6d, 0x66, 0x7e, 0xb3, 0x82, 0xc, 0xf5, 0x28, 0x7e, 0x48, 0x92, 0xb8, + 0xb, 0x95, 0x5e, 0x94, 0xff, 0xfe, 0x6d, 0x88, 0x85, 0x35, 0x37, 0xc2, 0x0, + 0xc2, 0x1, 0xd2, 0x2, 0x7f, 0x4, 0x7e, 0x1f, 0x2d, 0x2e, 0x7c, 0xba, 0x12, + 0xb3, 0x3, 0x6c, 0xaa, 0x80, 0x17, 0x7e, 0x70, 0x2, 0xac, 0x7a, 0x49, 0x23, + 0x91, 0xfe, 0x7f, 0x3, 0x2d, 0x13, 0x1b, 0xa, 0x20, 0x49, 0x43, 0x92, 0x22, + 0x12, 0xb2, 0xef, 0xe5, 0x28, 0xbc, 0xba, 0x38, 0xe3, 0x7e, 0x18, 0x92, + 0x92, 0x7a, 0x1d, 0x29, 0x7e, 0x34, 0x92, 0x94, 0x7e, 0x24, 0x0, 0x0, 0x7a, + 0x1d, 0x29, 0x5e, 0x70, 0xfe, 0x6d, 0x22, 0x7a, 0x1d, 0x29, 0x7a, 0x3d, + 0x36, 0xc2, 0x0, 0xc2, 0x1, 0xd2, 0x2, 0xc2, 0x3, 0x7e, 0xd, 0x29, 0x12, + 0xb2, 0x9f, 0x80, 0x21, 0x7e, 0x30, 0x2, 0xac, 0x3a, 0x7e, 0x1d, 0x29, 0x2d, + 0x31, 0xb, 0x1a, 0x30, 0x7d, 0x23, 0xb, 0x24, 0x2d, 0x17, 0x7d, 0x6, 0x1b, + 0xa, 0x20, 0x7e, 0x44, 0xff, 0xff, 0x9d, 0x43, 0x12, 0xb2, 0xef, 0xe5, 0x28, + 0xbc, 0xba, 0x38, 0xd9, 0x7a, 0x3d, 0x36, 0x12, 0x67, 0xcb, 0xd2, 0x3, 0x7e, + 0x8, 0x2d, 0x0, 0x12, 0xb2, 0x9f, 0x80, 0x16, 0x7e, 0x70, 0x2, 0xac, 0x7a, + 0x49, 0x33, 0x2d, 0x0, 0xbe, 0x34, 0x7f, 0xff, 0x78, 0x5, 0x75, 0x2d, 0x1, + 0x80, 0x8, 0xb, 0xa0, 0xe5, 0x34, 0xbc, 0xba, 0x38, 0xe4, 0xe5, 0x2d, 0xb4, + 0x1, 0x5, 0x7e, 0x1d, 0x29, 0x80, 0x4, 0x7e, 0x18, 0x2d, 0x0, 0x7a, 0x1d, + 0x2e, 0x6c, 0xaa, 0x41, 0x89, 0x7e, 0x71, 0x35, 0xac, 0x7a, 0x7d, 0xb3, + 0x3e, 0xb4, 0x2e, 0xb4, 0x4, 0x0, 0x6d, 0xaa, 0x7e, 0x30, 0x2, 0xac, 0x3a, + 0x7f, 0x74, 0x2d, 0xf1, 0xb, 0x7a, 0x0, 0xbe, 0x4, 0x0, 0x14, 0x58, 0x7, + 0x12, 0xb3, 0x48, 0x78, 0x2, 0x41, 0x87, 0x30, 0x2a, 0x26, 0xbe, 0x4, 0x7, + 0xd0, 0x8, 0x6, 0x7e, 0x34, 0x3, 0x20, 0x80, 0x4a, 0xbe, 0x4, 0x3, 0xe8, + 0x8, 0x6, 0x7e, 0x34, 0x2, 0x58, 0x80, 0x3e, 0xbe, 0x4, 0x0, 0x0, 0x18, 0x2, + 0x41, 0x87, 0x7e, 0x34, 0x1, 0xf4, 0x80, 0x30, 0x7e, 0x44, 0x0, 0xc8, 0x7e, + 0x34, 0x0, 0x96, 0x7e, 0x24, 0x0, 0x64, 0x7e, 0xb3, 0x9b, 0xaf, 0xb4, 0x2, + 0xc, 0x2e, 0x44, 0x0, 0xc8, 0x2e, 0x34, 0x0, 0xc8, 0x2e, 0x24, 0x0, 0xc8, + 0xbe, 0x4, 0x7, 0xd0, 0x8, 0x5, 0x1b, 0x7a, 0x40, 0x80, 0x1a, 0xbe, 0x4, + 0x3, 0xe8, 0x8, 0x5, 0x1b, 0x7a, 0x30, 0x80, 0xf, 0xbe, 0x4, 0x0, 0x0, 0x18, + 0x2, 0x41, 0x87, 0x7f, 0x74, 0x2d, 0xf1, 0x1b, 0x7a, 0x20, 0x7e, 0xb3, 0x9b, + 0xaf, 0x70, 0xb, 0x7e, 0xf4, 0x1, 0x90, 0x2d, 0x19, 0x7d, 0x8, 0x1b, 0xa, + 0xf0, 0x7e, 0x30, 0x2, 0xac, 0x3a, 0x7e, 0x7d, 0x2e, 0x2d, 0xf1, 0xb, 0x7a, + 0x0, 0x7e, 0x30, 0x2, 0xac, 0x3a, 0x7f, 0x64, 0x2d, 0xd1, 0xb, 0x6a, 0x10, + 0xbd, 0x10, 0x58, 0x5, 0x1b, 0x7a, 0x10, 0x80, 0x20, 0x7e, 0x30, 0x2, 0xac, + 0x3a, 0x2d, 0x19, 0x7d, 0x8, 0xb, 0xa, 0x10, 0x6d, 0xff, 0x9d, 0xf1, 0x12, + 0xb2, 0x94, 0xb, 0xa, 0xe0, 0xbd, 0xfe, 0x8, 0x6, 0x12, 0xb2, 0x94, 0x1b, + 0xa, 0xf0, 0x12, 0xb2, 0x94, 0xb, 0xa, 0x10, 0x7d, 0x1, 0xe, 0x4, 0x7a, 0x5, + 0x32, 0xbe, 0x14, 0x0, 0x0, 0x48, 0x1f, 0x75, 0x27, 0x0, 0x80, 0x11, 0xb, + 0x5a, 0x0, 0xbe, 0x5, 0x32, 0x8, 0x5, 0x9d, 0x1, 0x1b, 0x5a, 0x0, 0xb, 0xb5, + 0x5, 0x27, 0xe5, 0x35, 0xbe, 0xb1, 0x27, 0x38, 0xe8, 0x80, 0x2a, 0x75, 0x27, + 0x0, 0x80, 0x1e, 0xb, 0x5a, 0x0, 0xbe, 0x5, 0x32, 0x58, 0x12, 0x7e, 0xf0, + 0x2, 0xac, 0xfa, 0x7e, 0x7d, 0x2e, 0x2d, 0xf7, 0xb, 0x7a, 0xf0, 0x9d, 0xf, + 0x1b, 0x5a, 0x0, 0xb, 0xb5, 0x5, 0x27, 0xe5, 0x35, 0xbe, 0xb1, 0x27, 0x38, + 0xdb, 0xb, 0xa0, 0xe5, 0x34, 0xbc, 0xba, 0x28, 0x2, 0x21, 0x43, 0xda, 0x3b, + 0x22, 0x7e, 0xf0, 0x2, 0xac, 0xfa, 0x7e, 0xd, 0x2e, 0x2d, 0x17, 0x22, 0x7e, + 0x1f, 0x2d, 0x2e, 0x12, 0xb2, 0xa9, 0x6c, 0xaa, 0x22, 0x7f, 0x61, 0x7f, + 0x70, 0x7e, 0x8, 0x92, 0xde, 0x12, 0xaf, 0xb, 0x7e, 0x73, 0x82, 0xd, 0x7a, + 0x73, 0x92, 0xdf, 0x7e, 0x73, 0x82, 0xc, 0x7a, 0x73, 0x92, 0xde, 0x7d, 0x3d, + 0x7a, 0x37, 0x92, 0xe2, 0x7e, 0x1d, 0x36, 0x7a, 0x37, 0x92, 0xe4, 0x7d, + 0x3f, 0x7a, 0x37, 0x92, 0xe6, 0xa2, 0x2, 0x12, 0xb3, 0x2c, 0x7e, 0x34, 0x80, + 0x0, 0x7a, 0x37, 0x92, 0xe8, 0xa2, 0x3, 0x92, 0x4, 0x7e, 0x8, 0x92, 0xde, + 0x2, 0x2b, 0x8d, 0xe5, 0x28, 0xa, 0x2b, 0xa, 0x3a, 0x2d, 0x32, 0x3e, 0x34, + 0x2d, 0x37, 0x7d, 0x26, 0x1b, 0x1a, 0x40, 0xb, 0xa0, 0x22, 0x7a, 0x37, 0x92, + 0xe2, 0x7d, 0x31, 0x7a, 0x37, 0x92, 0xe6, 0x7a, 0xb3, 0x92, 0xde, 0xe5, + 0x37, 0x7a, 0xb3, 0x92, 0xdf, 0x7e, 0x34, 0x80, 0x20, 0x7a, 0x37, 0x92, + 0xe8, 0xa2, 0x2, 0xe4, 0x12, 0xb3, 0x2c, 0x7e, 0x8, 0x92, 0xde, 0x2, 0x2b, + 0x37, 0x33, 0x7c, 0x6b, 0x3e, 0x60, 0xa2, 0x0, 0xe4, 0x33, 0x7c, 0x7b, 0x3e, + 0x70, 0x3e, 0x70, 0x4c, 0x76, 0xa2, 0x1, 0xe4, 0x33, 0x4c, 0x7b, 0x7a, 0x73, + 0x92, 0xe1, 0x22, 0x7e, 0xb3, 0x59, 0x62, 0xbe, 0xb0, 0x1, 0x22, 0xe4, 0x7a, + 0xb3, 0x67, 0x8a, 0x7a, 0xb3, 0x67, 0x8b, 0x22, 0xca, 0x3b, 0x7e, 0xe3, + 0x82, 0xc, 0x7e, 0xd3, 0x82, 0xd, 0xc2, 0x33, 0x7e, 0xd7, 0x67, 0x68, 0xe, + 0xd4, 0x6c, 0xcc, 0x81, 0xd2, 0x7e, 0x30, 0x2, 0xac, 0x3c, 0x9, 0xb1, 0x65, + 0x60, 0x7a, 0xb3, 0x91, 0xfe, 0x9, 0x71, 0x65, 0x61, 0x7a, 0x73, 0x91, 0xff, + 0x12, 0x2e, 0x40, 0x7d, 0xc3, 0xbd, 0xdc, 0x8, 0x2, 0x81, 0xd0, 0xbe, 0xe3, + 0x91, 0xfe, 0x38, 0x2, 0x81, 0xd0, 0xbe, 0xd3, 0x91, 0xff, 0x38, 0x2, 0x81, + 0xd0, 0x7d, 0x1c, 0xe, 0x14, 0x7d, 0xec, 0xe, 0xe4, 0xe, 0xe4, 0x2d, 0xe1, + 0x6d, 0xff, 0x12, 0xb5, 0x47, 0x12, 0xb5, 0x4, 0x80, 0x32, 0x6c, 0x99, 0x7e, + 0xf3, 0x91, 0xfe, 0x80, 0x1e, 0x7c, 0xbf, 0x12, 0x2e, 0x3c, 0x7d, 0x3, 0xbd, + 0xe0, 0x18, 0x9, 0xbd, 0xc0, 0x48, 0x5, 0x12, 0xb4, 0xfb, 0x80, 0x8, 0x7e, + 0x73, 0x92, 0x2, 0xbc, 0x7f, 0x58, 0x7, 0x1b, 0xf0, 0xbe, 0xf0, 0x0, 0x58, + 0xdd, 0x4c, 0x99, 0x68, 0x8, 0x12, 0xb5, 0x17, 0x12, 0xb4, 0xe1, 0x58, 0xc9, + 0x12, 0xb5, 0x3a, 0x58, 0x38, 0x12, 0xb5, 0x4, 0x80, 0x2e, 0x12, 0xb5, 0x2d, + 0x80, 0x1e, 0x7c, 0xb8, 0x12, 0x2e, 0x3c, 0x7d, 0x3, 0xbd, 0xe0, 0x18, 0x9, + 0xbd, 0xc0, 0x48, 0x5, 0x12, 0xb4, 0xe9, 0x80, 0x8, 0x7e, 0x73, 0x92, 0x1, + 0xbc, 0x78, 0x28, 0x6, 0xb, 0x80, 0xbc, 0xe8, 0x38, 0xde, 0x4c, 0x99, 0x68, + 0x8, 0x12, 0xb5, 0x17, 0x12, 0xb4, 0xe1, 0x58, 0xcd, 0x12, 0xb5, 0x47, 0xa, + 0x5d, 0x1b, 0x54, 0x7e, 0x73, 0x91, 0xff, 0xa, 0x17, 0xbd, 0x15, 0x58, 0x77, + 0x12, 0xb4, 0xf2, 0x80, 0x2e, 0x6c, 0x99, 0x7e, 0xf3, 0x91, 0xfe, 0x80, + 0x1a, 0x7c, 0xbf, 0x12, 0xb5, 0x21, 0x18, 0x9, 0xbd, 0xc0, 0x48, 0x5, 0x12, + 0xb4, 0xfb, 0x80, 0x8, 0x7e, 0x73, 0x92, 0x2, 0xbc, 0x7f, 0x58, 0x7, 0x1b, + 0xf0, 0xbe, 0xf0, 0x0, 0x58, 0xe1, 0x4c, 0x99, 0x68, 0x9, 0x12, 0xb5, 0xd, + 0xbe, 0xd3, 0x92, 0x0, 0x38, 0xcc, 0x12, 0xb5, 0x3a, 0x58, 0x39, 0x7e, 0x73, + 0x91, 0xff, 0x12, 0xb4, 0xf2, 0x80, 0x2a, 0x12, 0xb5, 0x2d, 0x80, 0x1a, + 0x7c, 0xb8, 0x12, 0xb5, 0x21, 0x18, 0x9, 0xbd, 0xc0, 0x48, 0x5, 0x12, 0xb4, + 0xe9, 0x80, 0x8, 0x7e, 0x73, 0x92, 0x1, 0xbc, 0x78, 0x28, 0x6, 0xb, 0x80, + 0xbc, 0xe8, 0x38, 0xe2, 0x4c, 0x99, 0x68, 0x9, 0x12, 0xb5, 0xd, 0xbe, 0xd3, + 0x92, 0x0, 0x38, 0xd0, 0x7e, 0x73, 0x76, 0x59, 0xa, 0x17, 0xbd, 0x1f, 0x38, + 0x14, 0xd2, 0x33, 0x7e, 0x73, 0x91, 0xfe, 0x7a, 0x73, 0x3, 0xe7, 0x7e, 0x73, + 0x91, 0xff, 0x7a, 0x73, 0x3, 0xe8, 0x80, 0xc, 0xb, 0xc0, 0x7e, 0x73, 0x67, + 0x62, 0xbc, 0x7c, 0x28, 0x2, 0x61, 0x70, 0xa2, 0x33, 0xda, 0x3b, 0x22, 0x7e, + 0x73, 0x92, 0x3, 0xbe, 0x70, 0x0, 0x22, 0xb, 0xf4, 0xb, 0x90, 0x7a, 0x83, + 0x92, 0x1, 0x22, 0xa, 0x37, 0xb, 0x34, 0x7a, 0x73, 0x92, 0x0, 0x22, 0xb, + 0xf4, 0xb, 0x90, 0x7a, 0xf3, 0x92, 0x2, 0x22, 0x7e, 0x73, 0x91, 0xff, 0x7a, + 0x73, 0x92, 0x3, 0x22, 0x7e, 0xb3, 0x92, 0x0, 0x4, 0x7a, 0xb3, 0x92, 0x0, + 0x22, 0x7e, 0xb3, 0x92, 0x3, 0x14, 0x7a, 0xb3, 0x92, 0x3, 0x22, 0x7e, 0x73, + 0x92, 0x0, 0x12, 0x2e, 0x40, 0x7d, 0x3, 0xbd, 0xe0, 0x22, 0x6c, 0x99, 0x7e, + 0x83, 0x91, 0xfe, 0xa, 0x18, 0xb, 0x14, 0x7c, 0x83, 0x22, 0xa, 0x5e, 0x1b, + 0x54, 0x7e, 0x73, 0x91, 0xfe, 0xa, 0x17, 0xbd, 0x15, 0x22, 0x7e, 0x73, 0x91, + 0xfe, 0xa, 0x37, 0xb, 0x34, 0x7a, 0x73, 0x92, 0x1, 0x7e, 0x73, 0x91, 0xfe, + 0x7a, 0x73, 0x92, 0x2, 0x22, 0x6d, 0x33, 0x7a, 0x37, 0x3, 0xe9, 0xe4, 0x7a, + 0xb3, 0x3, 0xe7, 0x7a, 0xb3, 0x3, 0xe8, 0x7a, 0xb3, 0x3, 0xe4, 0x2, 0x67, + 0xe9, 0xe4, 0x7a, 0xb3, 0x67, 0x84, 0x7e, 0xa3, 0x67, 0x63, 0xbe, 0xa0, 0x0, + 0x28, 0x1d, 0x7e, 0x27, 0x81, 0xf1, 0x7e, 0x34, 0x0, 0x6, 0xad, 0x32, 0x7e, + 0x24, 0x0, 0x4, 0x12, 0x1, 0x20, 0xbe, 0x37, 0x67, 0x6c, 0x8, 0x6, 0x74, + 0x1, 0x7a, 0xb3, 0x67, 0x84, 0x7e, 0xb3, 0x67, 0x84, 0xb4, 0x1, 0x20, 0xbe, + 0xa0, 0x0, 0x28, 0x1b, 0xbe, 0xa0, 0x3, 0x50, 0x16, 0x7e, 0xb3, 0x67, 0x62, + 0xb4, 0x1, 0xf, 0x7e, 0x73, 0x65, 0x60, 0xbe, 0x73, 0x76, 0x37, 0x68, 0x5, + 0xe4, 0x7a, 0xb3, 0x67, 0x84, 0x22, 0x7c, 0x67, 0x7e, 0xb, 0x70, 0xbc, 0x7b, + 0x38, 0x1a, 0x29, 0x70, 0x0, 0x2, 0xbc, 0x7b, 0x28, 0x12, 0x29, 0x70, 0x0, + 0x1, 0xbc, 0x76, 0x38, 0xa, 0x29, 0x70, 0x0, 0x3, 0xbc, 0x76, 0x28, 0x2, + 0xd3, 0x22, 0xc3, 0x22, 0x7c, 0x5b, 0x6c, 0x77, 0x6c, 0xaa, 0x74, 0x1e, + 0xac, 0x5b, 0x9, 0x62, 0x39, 0x49, 0x6c, 0x55, 0x7e, 0x10, 0x1e, 0xac, 0x15, + 0x9, 0x40, 0x39, 0x49, 0xa, 0x14, 0xa, 0x46, 0x9d, 0x14, 0xbe, 0x14, 0x0, + 0x0, 0x8, 0xa, 0xa, 0x44, 0xa, 0xf6, 0x9d, 0x4f, 0x7c, 0x49, 0x80, 0x8, + 0x6e, 0x14, 0xff, 0xff, 0xb, 0x14, 0x7c, 0x43, 0xbc, 0x74, 0x50, 0x4, 0x7c, + 0x74, 0x7c, 0xa5, 0xb, 0x50, 0xbe, 0x50, 0x3, 0x40, 0xca, 0x7c, 0xba, 0x22, + 0xca, 0xf8, 0x12, 0xb6, 0xd1, 0xc2, 0x16, 0x7e, 0xb3, 0x39, 0x48, 0x60, + 0x63, 0x7e, 0xf3, 0x39, 0x46, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0x2, 0x6c, + 0xff, 0x7e, 0x24, 0x0, 0x1, 0x7c, 0xbf, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, + 0xfb, 0x7e, 0x73, 0x39, 0x42, 0x6c, 0x66, 0x5c, 0x75, 0xbe, 0x34, 0x0, 0x0, + 0x8, 0x9, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0x2, 0x6c, 0xff, 0x7e, 0xa3, + 0x39, 0x45, 0xbc, 0xaf, 0x78, 0x12, 0x7e, 0xb3, 0x39, 0x47, 0x4, 0x7a, 0xb3, + 0x39, 0x47, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0x2, 0x6c, 0xff, 0x7e, 0xb3, + 0x76, 0x6e, 0xbe, 0xb3, 0x39, 0x47, 0x38, 0x7, 0x7c, 0xba, 0x12, 0xb5, 0xea, + 0x7c, 0xfb, 0x12, 0xb6, 0xa6, 0x7a, 0xf3, 0x39, 0x41, 0xda, 0xf8, 0x22, + 0x7e, 0xb3, 0x9b, 0xa8, 0x7c, 0x7f, 0x2, 0x35, 0x19, 0xca, 0xf8, 0x7c, 0xfb, + 0xbe, 0xf0, 0x3, 0x50, 0x16, 0xbe, 0x70, 0x3, 0x50, 0x11, 0xd2, 0x4, 0x12, + 0xb, 0xc5, 0x12, 0xb6, 0xd1, 0x12, 0xb6, 0xa6, 0x7a, 0xf3, 0x39, 0x45, 0xd2, + 0x14, 0xda, 0xf8, 0x22, 0x7e, 0x73, 0x9b, 0x3b, 0x7a, 0x73, 0x39, 0xbf, + 0x22, 0xca, 0xd8, 0xca, 0x79, 0x7c, 0xdb, 0xbe, 0xd0, 0x80, 0x78, 0x17, + 0x7e, 0xe0, 0xff, 0x6c, 0xff, 0x12, 0xb7, 0x32, 0x38, 0x4, 0x7c, 0xe7, 0x7c, + 0xdf, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x78, 0xf0, 0x80, 0x19, 0xbe, 0xd0, 0x81, + 0x78, 0x14, 0x6c, 0xee, 0x6c, 0xff, 0x12, 0xb7, 0x32, 0x40, 0x4, 0x7c, 0xe7, + 0x7c, 0xdf, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x78, 0xf0, 0xbe, 0xd0, 0x3, 0x40, + 0x2, 0x6c, 0xdd, 0x7e, 0x73, 0x39, 0x45, 0xbc, 0x7d, 0x68, 0x5, 0x7c, 0xbd, + 0x12, 0xb6, 0xaf, 0x7a, 0xd3, 0x9a, 0xc6, 0xda, 0x79, 0xda, 0xd8, 0x22, + 0x74, 0x1e, 0xac, 0xbf, 0x9, 0x75, 0x39, 0x49, 0xbc, 0x7e, 0x22, 0x7c, 0xab, + 0x6c, 0x77, 0xbc, 0xa7, 0x78, 0x2a, 0x7e, 0x63, 0x9b, 0xa8, 0xa, 0x6, 0x12, + 0x36, 0xca, 0x12, 0xb7, 0xcb, 0x7e, 0x8, 0x1d, 0xa0, 0x59, 0x12, 0x39, 0x5d, + 0x59, 0x2, 0x39, 0x5b, 0x7e, 0x8, 0x22, 0xc0, 0x59, 0x12, 0x39, 0x61, 0x59, + 0x2, 0x39, 0x5f, 0x7e, 0x8, 0x27, 0xe0, 0x80, 0x4a, 0x7e, 0x50, 0x4, 0xac, + 0x5a, 0xa, 0x17, 0x2d, 0x21, 0x2e, 0x24, 0x0, 0x93, 0x12, 0x61, 0xa1, 0x7c, + 0x6b, 0x7e, 0xb3, 0x9b, 0xa8, 0xa, 0xb, 0x12, 0x36, 0xca, 0x12, 0xb7, 0xcb, + 0xa, 0x6, 0x7e, 0x14, 0xf, 0x60, 0xad, 0x10, 0x7d, 0xf1, 0x2e, 0xf4, 0x3a, + 0x0, 0x6d, 0xee, 0x59, 0xf2, 0x39, 0x5d, 0x59, 0xe2, 0x39, 0x5b, 0x7d, 0xf1, + 0x2e, 0xf4, 0x3f, 0x20, 0x59, 0xf2, 0x39, 0x61, 0x59, 0xe2, 0x39, 0x5f, + 0x2e, 0x14, 0x44, 0x40, 0x6d, 0x0, 0x59, 0x12, 0x39, 0x65, 0x59, 0x2, 0x39, + 0x63, 0xb, 0x70, 0xbe, 0x70, 0x3, 0x50, 0x2, 0xe1, 0x41, 0x22, 0x7e, 0x50, + 0x1e, 0xac, 0x57, 0x59, 0x12, 0x39, 0x59, 0x59, 0x2, 0x39, 0x57, 0x22, 0x7c, + 0x57, 0x7c, 0x4b, 0xc2, 0x1, 0x7e, 0x37, 0x39, 0xc1, 0x7c, 0xb4, 0x12, 0x75, + 0xd8, 0x40, 0x1, 0x22, 0xa5, 0xbd, 0x0, 0x2, 0x80, 0x3, 0x2, 0xb8, 0xa9, + 0xd2, 0x1, 0x7e, 0xb3, 0x39, 0x48, 0x60, 0x3, 0x2, 0xb8, 0xa9, 0x7e, 0xb3, + 0x39, 0xdd, 0x4, 0x7a, 0xb3, 0x39, 0xdd, 0x7e, 0xb3, 0x39, 0xdc, 0x4, 0x7a, + 0xb3, 0x39, 0xdc, 0xbe, 0xb0, 0x14, 0x40, 0x5, 0xe4, 0x7a, 0xb3, 0x39, 0xdc, + 0x7e, 0x47, 0x39, 0x43, 0x7d, 0x24, 0x3e, 0x24, 0x3e, 0x24, 0xbd, 0x23, + 0x50, 0x4, 0x74, 0x8, 0x80, 0xa, 0x7d, 0x24, 0x3e, 0x24, 0xbd, 0x23, 0x50, + 0xe, 0x74, 0x4, 0x7e, 0x53, 0x39, 0xdc, 0xa, 0x25, 0x19, 0xb2, 0x39, 0xa4, + 0x80, 0x1d, 0xbd, 0x43, 0x50, 0xe, 0x74, 0x1, 0x7e, 0x73, 0x39, 0xdc, 0xa, + 0x47, 0x19, 0xb4, 0x39, 0xa4, 0x80, 0xb, 0xe4, 0x7e, 0xa3, 0x39, 0xdc, 0xa, + 0x3a, 0x19, 0xb3, 0x39, 0xa4, 0x6c, 0xaa, 0xe4, 0xa, 0x4b, 0x9, 0x74, 0x39, + 0xa4, 0x2c, 0xa7, 0x4, 0xb4, 0x14, 0xf4, 0xbe, 0xa0, 0x8, 0x40, 0x21, 0xe4, + 0x7a, 0xb3, 0x39, 0xdd, 0x7e, 0xb3, 0x39, 0xa3, 0x44, 0x1, 0x7a, 0xb3, 0x39, + 0xa3, 0x74, 0x1, 0x7a, 0xb3, 0x39, 0x48, 0x7e, 0x8, 0x39, 0xa4, 0x7e, 0x34, + 0x0, 0x14, 0xe4, 0x2, 0x0, 0x2e, 0x7e, 0x73, 0x39, 0xdd, 0xbe, 0x70, 0x20, + 0x40, 0xb, 0x74, 0x20, 0x7a, 0xb3, 0x39, 0xdd, 0xe4, 0x7a, 0xb3, 0x39, 0xa3, + 0x22, 0x7c, 0xab, 0x6d, 0x33, 0x6c, 0x55, 0x12, 0xb8, 0xf2, 0x49, 0x11, + 0x8e, 0x0, 0x59, 0x10, 0x39, 0xc7, 0x12, 0xb8, 0xf2, 0x49, 0x41, 0x8e, 0x0, + 0xbd, 0x43, 0x28, 0x2, 0x7d, 0x34, 0x49, 0x11, 0x8e, 0xa, 0x59, 0x10, 0x39, + 0xd1, 0x7e, 0x30, 0x2, 0xac, 0x35, 0x7e, 0x10, 0x14, 0xac, 0x1a, 0x2d, 0x1, + 0x49, 0x10, 0x8e, 0xa, 0xbd, 0x13, 0x28, 0x2, 0x7d, 0x31, 0xb, 0x50, 0xbe, + 0x50, 0x5, 0x40, 0xc3, 0x7a, 0x37, 0x39, 0xc5, 0x22, 0x7e, 0x10, 0x2, 0xac, + 0x15, 0x7e, 0x30, 0x14, 0xac, 0x3a, 0x2d, 0x10, 0x22, 0x7c, 0xab, 0x6c, + 0x77, 0x7e, 0x50, 0x1e, 0xac, 0x57, 0x9, 0x62, 0x39, 0x49, 0xbc, 0x6a, 0x68, + 0x7, 0xb, 0x70, 0xbe, 0x70, 0x3, 0x40, 0xec, 0xa5, 0xbf, 0x3, 0x6, 0x7a, + 0xa3, 0x39, 0x49, 0xd3, 0x22, 0xc3, 0x22, 0x7c, 0x2b, 0xc2, 0x2, 0x7e, 0x33, + 0x39, 0x45, 0x74, 0x1e, 0xac, 0xb3, 0x9, 0x35, 0x39, 0x49, 0x7c, 0xb2, 0x12, + 0xac, 0xc4, 0x6c, 0x22, 0x6c, 0xaa, 0x7e, 0x10, 0x1e, 0xac, 0x1a, 0x19, + 0x20, 0x39, 0x55, 0xb, 0xa0, 0xbe, 0xa0, 0x3, 0x78, 0xf0, 0x30, 0x2, 0x8, + 0x7c, 0xb3, 0x12, 0x1b, 0x53, 0x12, 0x12, 0xa6, 0xd3, 0x22, 0xca, 0xf8, + 0x7c, 0xfb, 0xc2, 0x0, 0xd2, 0x1, 0x6d, 0x33, 0x7a, 0x37, 0x9b, 0x77, 0x7e, + 0xb3, 0x9b, 0xaf, 0xb4, 0x1, 0x7, 0xd2, 0x0, 0x74, 0x4, 0x12, 0x37, 0xa4, + 0x7c, 0xbf, 0x12, 0xb9, 0x23, 0x92, 0x1, 0x30, 0x1, 0x5, 0x7c, 0xbf, 0x12, + 0x35, 0x29, 0x30, 0x0, 0x3, 0x12, 0x37, 0xa0, 0xa2, 0x1, 0xda, 0xf8, 0x22, + 0x7e, 0x8, 0x39, 0xc1, 0x7e, 0x34, 0x0, 0x1a, 0xe4, 0x2, 0x0, 0x2e, 0x7e, + 0x37, 0x76, 0x6c, 0x7a, 0x37, 0x39, 0x43, 0x7e, 0x34, 0x3, 0x20, 0x7a, 0x37, + 0x39, 0xbb, 0x22, 0x7c, 0xa7, 0x7c, 0x5b, 0x12, 0xba, 0xeb, 0x78, 0x2, 0x41, + 0x8c, 0x7e, 0xb3, 0x9b, 0xaf, 0xb4, 0x1, 0x2, 0x80, 0x2, 0x41, 0x8c, 0x7e, + 0xb3, 0x8d, 0x91, 0x70, 0x2, 0x41, 0x8c, 0x7e, 0xb3, 0x59, 0x60, 0xbe, 0xb0, + 0x1, 0x78, 0x2, 0x41, 0x8c, 0xbe, 0xa0, 0x1, 0x78, 0x2, 0x41, 0x8c, 0x12, + 0xb9, 0x9b, 0x7c, 0xb5, 0x7c, 0x7a, 0x12, 0xb7, 0xd9, 0x7e, 0xb3, 0x39, + 0x48, 0x1b, 0xb1, 0x68, 0x33, 0x4, 0x68, 0x2, 0x41, 0x8c, 0x7e, 0x73, 0x39, + 0x45, 0x7a, 0x73, 0x39, 0x46, 0xe4, 0x7a, 0xb3, 0x39, 0x47, 0x6c, 0xaa, + 0x6d, 0x33, 0x7e, 0x90, 0x1e, 0xac, 0x9a, 0x59, 0x34, 0x39, 0x4b, 0x59, + 0x34, 0x39, 0x4d, 0xe4, 0x19, 0xb4, 0x39, 0x4a, 0xb, 0xa0, 0xbe, 0xa0, 0x3, + 0x78, 0xe5, 0x74, 0x2, 0x80, 0x67, 0x7e, 0xa3, 0x39, 0x46, 0x74, 0x1e, 0xa4, + 0x49, 0x35, 0x39, 0x4b, 0x2e, 0x37, 0x39, 0xc1, 0xbe, 0x34, 0x7f, 0xff, + 0x50, 0xb, 0x7d, 0x45, 0x2e, 0x44, 0x39, 0x4b, 0x1b, 0x48, 0x30, 0x80, 0x8, + 0x7e, 0x44, 0x7f, 0xff, 0x59, 0x45, 0x39, 0x4b, 0x49, 0x45, 0x39, 0x4d, + 0xbe, 0x47, 0x39, 0xc1, 0x50, 0x8, 0x7e, 0x37, 0x39, 0xc1, 0x59, 0x35, 0x39, + 0x4d, 0x7e, 0x73, 0x39, 0x41, 0x7a, 0x73, 0x39, 0x46, 0x7e, 0x73, 0x76, + 0x6e, 0xbe, 0x73, 0x39, 0x47, 0x38, 0x1f, 0x12, 0xba, 0x8d, 0xbe, 0xb0, + 0xff, 0x68, 0x12, 0x30, 0x17, 0xf, 0x7e, 0x73, 0x39, 0x45, 0x12, 0xb6, 0xaf, + 0x12, 0x32, 0xc0, 0xe4, 0x7a, 0xb3, 0x39, 0xa3, 0xe4, 0x7a, 0xb3, 0x39, + 0x48, 0x22, 0x6c, 0x77, 0x7e, 0x8, 0xff, 0xff, 0x6c, 0x66, 0x7e, 0x44, 0x0, + 0x1, 0x7c, 0xb6, 0x60, 0x5, 0x3e, 0x44, 0x14, 0x78, 0xfb, 0x7e, 0xb3, 0x39, + 0x42, 0xa, 0x2b, 0x5d, 0x24, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x3, 0x12, 0xba, + 0xdd, 0x7e, 0xb3, 0x39, 0x45, 0xbc, 0xb6, 0x78, 0x3, 0x12, 0xba, 0xdd, 0x7e, + 0x50, 0x1e, 0xac, 0x56, 0x49, 0xf2, 0x39, 0x4b, 0x6d, 0xee, 0xbf, 0x70, + 0x50, 0x4, 0x7f, 0x7, 0x7c, 0x76, 0xb, 0x60, 0xbe, 0x60, 0x3, 0x40, 0xbd, + 0x7c, 0xa7, 0x7c, 0xba, 0x22, 0x7e, 0x24, 0xff, 0xff, 0x7e, 0x90, 0x1e, + 0xac, 0x96, 0x59, 0x24, 0x39, 0x4b, 0x22, 0x7e, 0xb3, 0x59, 0x8b, 0xbe, + 0xb0, 0x1, 0x22, 0xca, 0x3b, 0x7f, 0x70, 0x7c, 0x17, 0x7c, 0xb, 0x75, 0x2b, + 0x1, 0x7e, 0x73, 0x82, 0xe, 0x7c, 0xc7, 0x7e, 0x73, 0x82, 0xf, 0x7c, 0xd7, + 0x6d, 0x22, 0x7d, 0xc2, 0x7d, 0xd2, 0x12, 0xae, 0x5f, 0x7d, 0xb3, 0xa, 0x50, + 0x1b, 0x55, 0x7c, 0xfb, 0x61, 0xb0, 0x7a, 0xf1, 0x2c, 0xbe, 0xf0, 0x0, 0x58, + 0xc, 0x1a, 0x3f, 0x1a, 0x40, 0x9d, 0x43, 0xa, 0x50, 0x2d, 0x54, 0xf5, 0x2c, + 0xbc, 0xcf, 0x18, 0xc, 0x1a, 0x30, 0x1a, 0x4f, 0x9d, 0x43, 0xa, 0x50, 0x9d, + 0x54, 0xf5, 0x2c, 0xa, 0x51, 0x1b, 0x55, 0x7c, 0xeb, 0x80, 0x60, 0x7a, 0xe1, + 0x2d, 0xbe, 0xe0, 0x0, 0x58, 0xc, 0x1a, 0x3e, 0x1a, 0x41, 0x9d, 0x43, 0xa, + 0x51, 0x2d, 0x54, 0xf5, 0x2d, 0xbc, 0xde, 0x18, 0xc, 0x1a, 0x31, 0x1a, 0x4e, + 0x9d, 0x43, 0xa, 0x51, 0x9d, 0x54, 0xf5, 0x2d, 0xe5, 0x2c, 0x7e, 0x71, 0x2d, + 0x12, 0x2e, 0x40, 0x7d, 0xa3, 0x7c, 0xb0, 0x24, 0xfe, 0xbc, 0xbf, 0x68, + 0x12, 0x12, 0xbc, 0x24, 0x68, 0xd, 0x7c, 0xb1, 0x24, 0xfe, 0xbc, 0xbe, 0x68, + 0x5, 0x12, 0xbc, 0x2d, 0x78, 0x8, 0x7d, 0x3a, 0x2d, 0x3d, 0x7d, 0xd3, 0x80, + 0xe, 0xbc, 0xf, 0x78, 0x4, 0xbc, 0x1e, 0x68, 0x6, 0x7d, 0x3a, 0x2d, 0x3c, + 0x7d, 0xc3, 0xb, 0xe0, 0x12, 0xbc, 0x2d, 0x8, 0x9b, 0xb, 0xf0, 0x12, 0xbc, + 0x24, 0x18, 0x2, 0x61, 0x1d, 0x7d, 0x3c, 0x12, 0x4f, 0x27, 0x7d, 0x23, 0x7d, + 0x3d, 0x12, 0x4f, 0x25, 0x7d, 0xa3, 0x7d, 0x12, 0x9d, 0x1a, 0xbe, 0x14, 0x0, + 0x0, 0x8, 0x6, 0x7d, 0x32, 0x9d, 0x3a, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x31, + 0xbe, 0x34, 0x0, 0x50, 0x8, 0x2, 0x80, 0x38, 0x7d, 0xb, 0x9d, 0x2, 0xbe, + 0x4, 0x0, 0x0, 0x8, 0x6, 0x7d, 0x3b, 0x9d, 0x32, 0x80, 0x4, 0x6d, 0x33, + 0x9d, 0x30, 0xbe, 0x34, 0x0, 0x46, 0x48, 0x19, 0x30, 0x29, 0x1b, 0xbe, 0x4, + 0x0, 0x0, 0x8, 0x6, 0x7d, 0x3b, 0x9d, 0x32, 0x80, 0x4, 0x6d, 0x33, 0x9d, + 0x30, 0xbe, 0x34, 0x0, 0x64, 0x58, 0x5, 0x75, 0x2b, 0x0, 0x80, 0x3, 0x75, + 0x2b, 0x1, 0x1b, 0x7a, 0x20, 0xe5, 0x2b, 0xda, 0x3b, 0x22, 0xa, 0x20, 0xb, + 0x25, 0x1a, 0x3f, 0xbd, 0x32, 0x22, 0xa, 0x21, 0xb, 0x25, 0x1a, 0x3e, 0xbd, + 0x32, 0x22, 0x7e, 0x54, 0x2d, 0x32, 0x7a, 0x57, 0x92, 0xfc, 0x7e, 0x54, + 0x2d, 0x5a, 0x7a, 0x57, 0x92, 0xfe, 0x7e, 0x54, 0x2d, 0x82, 0x7a, 0x57, + 0x93, 0x0, 0x74, 0x1, 0x7a, 0xb3, 0x92, 0xfa, 0x7a, 0xb3, 0x92, 0xfb, 0x7a, + 0x37, 0x2d, 0x32, 0x7a, 0x27, 0x2d, 0x34, 0x7a, 0x17, 0x2d, 0x5a, 0x7a, 0x7, + 0x2d, 0x5c, 0x7e, 0x8, 0x92, 0xfa, 0x12, 0x2b, 0xe, 0x7e, 0x37, 0x2d, 0x82, + 0x22, 0x7c, 0xa6, 0x7c, 0x87, 0x7c, 0x9b, 0xc2, 0x0, 0x7e, 0x50, 0x15, 0xac, + 0x58, 0x49, 0x2, 0x37, 0x7, 0x7e, 0x30, 0xd, 0xac, 0x39, 0x49, 0x31, 0x67, + 0x93, 0x9d, 0x30, 0x49, 0x22, 0x37, 0x9, 0x49, 0x11, 0x67, 0x95, 0x9d, 0x12, + 0xbe, 0x34, 0x0, 0x0, 0x8, 0x4, 0x7d, 0x23, 0x80, 0x4, 0x6d, 0x22, 0x9d, + 0x23, 0xbe, 0x14, 0x0, 0x0, 0x8, 0x4, 0x7d, 0x31, 0x80, 0x4, 0x6d, 0x33, + 0x9d, 0x31, 0x4c, 0xaa, 0x78, 0xe, 0x7d, 0x12, 0x2d, 0x13, 0xbe, 0x14, 0x0, + 0x4b, 0x28, 0x13, 0xd2, 0x0, 0x80, 0xf, 0xbe, 0xa0, 0x1, 0x78, 0xa, 0x2d, + 0x32, 0xbe, 0x34, 0x0, 0xc8, 0x28, 0x2, 0xd2, 0x0, 0xa2, 0x0, 0x22, 0x7c, + 0xab, 0x7e, 0xb3, 0x69, 0x69, 0xbe, 0xb0, 0x0, 0x28, 0x1b, 0x14, 0x7a, 0xb3, + 0x69, 0x69, 0x7e, 0x60, 0xff, 0x74, 0xd, 0xa4, 0x19, 0x65, 0x67, 0x97, 0x12, + 0xbd, 0x7c, 0x7e, 0xb3, 0x37, 0xd1, 0x4, 0x7a, 0xb3, 0x37, 0xd1, 0x22, 0xca, + 0xf8, 0x7f, 0x70, 0x7e, 0x93, 0x69, 0x69, 0x6c, 0x88, 0x80, 0x30, 0x74, 0xd, + 0xac, 0xb8, 0x9, 0xf5, 0x67, 0x97, 0x5e, 0xf0, 0xf, 0xa, 0x58, 0x7f, 0x17, + 0x2d, 0x35, 0x7e, 0x1b, 0x50, 0x7c, 0xb5, 0x30, 0xe0, 0x9, 0x7c, 0xb8, 0x7c, + 0x7f, 0x12, 0xbc, 0xda, 0x80, 0xc, 0x7c, 0xb5, 0x30, 0xe1, 0x7, 0x7c, 0xb8, + 0x7c, 0x7f, 0x12, 0xbd, 0x44, 0xb, 0x80, 0xbc, 0x98, 0x38, 0xcc, 0xda, 0xf8, + 0x22, 0x7c, 0x17, 0x7c, 0x3b, 0x12, 0xbd, 0x67, 0x12, 0xbd, 0x71, 0x6c, 0x0, + 0x7e, 0x70, 0x8, 0xac, 0x71, 0x19, 0x3, 0x69, 0x1a, 0xe4, 0x19, 0xb3, 0x69, + 0x19, 0x74, 0x7, 0xa, 0x31, 0x19, 0xb3, 0x2e, 0x8e, 0x22, 0x7e, 0x70, 0x15, + 0xac, 0x71, 0x2e, 0x34, 0x37, 0x7, 0x22, 0x74, 0xd, 0xac, 0x3b, 0x2e, 0x14, + 0x67, 0x93, 0x2, 0x1, 0xf3, 0x7e, 0xa0, 0x3, 0x74, 0x8, 0xac, 0x7b, 0x19, + 0xa3, 0x69, 0x19, 0x22, 0x7c, 0x7b, 0x6c, 0xaa, 0x7e, 0x90, 0x15, 0xac, + 0x97, 0x9, 0xb4, 0x37, 0x1, 0xb4, 0x1, 0x10, 0x9, 0x64, 0x37, 0x0, 0xbe, + 0x60, 0x3c, 0x50, 0xa, 0x7e, 0xa0, 0x4, 0x80, 0x8, 0x80, 0x3, 0xb4, 0x2, + 0x3, 0x7e, 0xa0, 0x8, 0xe4, 0x19, 0xb4, 0x37, 0x0, 0x19, 0xb4, 0x37, 0x1, + 0x7c, 0xba, 0x22, 0x7c, 0x14, 0x7c, 0x46, 0x7c, 0xab, 0x1a, 0x1a, 0x2d, + 0x11, 0x1a, 0xf7, 0x7d, 0x41, 0x9d, 0x4f, 0x7c, 0x69, 0xbc, 0x16, 0x58, 0x4, + 0x7c, 0xb6, 0x80, 0x2, 0x7c, 0xb4, 0x1a, 0x4, 0x9d, 0x10, 0x7c, 0x63, 0xbc, + 0x56, 0x8, 0x4, 0x7c, 0xa6, 0x80, 0x2, 0x7c, 0xa7, 0x9c, 0xba, 0x4, 0x22, + 0xca, 0xd8, 0xca, 0x79, 0x7c, 0xf6, 0x7d, 0x92, 0x7c, 0xe7, 0x7c, 0xdb, + 0x6c, 0xaa, 0x7e, 0x10, 0x15, 0xac, 0x1f, 0x19, 0xa0, 0x37, 0x2, 0xe4, 0x19, + 0xb0, 0x37, 0x4, 0x19, 0xb0, 0x37, 0x5, 0x19, 0xb0, 0x37, 0x3, 0x7e, 0x87, + 0x76, 0x29, 0x7d, 0x8, 0x1e, 0x4, 0x1e, 0x4, 0xbd, 0x1, 0x40, 0x8, 0x12, + 0xbe, 0x81, 0x7e, 0x50, 0x1, 0x80, 0x1d, 0x7e, 0x34, 0x0, 0x3, 0xad, 0x38, + 0x7d, 0x3, 0x1e, 0x4, 0x1e, 0x4, 0xbd, 0x1, 0x38, 0x10, 0x7e, 0x87, 0x76, + 0x29, 0xbd, 0x81, 0x40, 0x8, 0x12, 0xbe, 0x81, 0x6c, 0x55, 0x12, 0x2f, 0xd, + 0x7e, 0x87, 0x76, 0x1b, 0x1e, 0x84, 0x1e, 0x84, 0xbd, 0x89, 0x28, 0x8, 0x12, + 0xbe, 0x81, 0x7e, 0x50, 0x1, 0x80, 0x21, 0x7e, 0x27, 0x76, 0x1b, 0x7e, 0x34, + 0x0, 0x3, 0xad, 0x32, 0x7d, 0x83, 0x1e, 0x84, 0x1e, 0x84, 0xbd, 0x89, 0x50, + 0x10, 0x7e, 0x37, 0x76, 0x1b, 0xbd, 0x39, 0x40, 0x8, 0x12, 0xbe, 0x81, 0x6c, + 0x55, 0x12, 0x2e, 0x51, 0xda, 0x79, 0xda, 0xd8, 0x22, 0x7c, 0xbd, 0x7c, + 0x7e, 0x7c, 0x6f, 0x22, 0x7e, 0x8, 0x39, 0xfe, 0x7e, 0x34, 0x0, 0x1, 0x74, + 0xff, 0x2, 0x0, 0x2e, 0x12, 0xbe, 0x88, 0x2, 0xbe, 0x9b, 0xca, 0xf8, 0x74, + 0x1, 0x7a, 0xb3, 0x39, 0xfe, 0x7e, 0x73, 0x75, 0x8e, 0x1e, 0x70, 0x7a, 0x73, + 0x81, 0xec, 0x7e, 0xb4, 0x0, 0xd2, 0x7a, 0xb7, 0x81, 0xed, 0x7e, 0xa4, 0x0, + 0xc8, 0x7a, 0xa7, 0x81, 0xef, 0x7e, 0xf3, 0x39, 0xf8, 0x7a, 0xb3, 0x39, + 0xf8, 0x12, 0xcf, 0x12, 0x7a, 0xf3, 0x39, 0xf8, 0x7e, 0xa3, 0x67, 0x62, + 0xbe, 0xa0, 0x0, 0x38, 0x2, 0xe1, 0xc3, 0x7e, 0xb3, 0x9b, 0xaf, 0x70, 0x2, + 0xe1, 0xc3, 0xbe, 0xa0, 0x8, 0x28, 0x1c, 0x7e, 0xa7, 0x67, 0x68, 0xbe, 0xa4, + 0x2, 0x58, 0x58, 0x12, 0x7e, 0xb3, 0x75, 0x8e, 0x1e, 0xb0, 0xa, 0x3b, 0x7d, + 0x2b, 0x7e, 0x4, 0x0, 0xc8, 0x7d, 0x10, 0xe1, 0xbc, 0xbe, 0xa0, 0x5, 0x28, + 0x19, 0x7e, 0x37, 0x67, 0x68, 0xbe, 0x34, 0x2, 0xbc, 0x58, 0xf, 0x12, 0xbf, + 0xee, 0x7e, 0x4, 0x0, 0xfa, 0x7d, 0x20, 0x7e, 0x14, 0x0, 0xe6, 0xe1, 0xbc, + 0xbe, 0xa0, 0x3, 0x28, 0x1b, 0x7e, 0x37, 0x67, 0x68, 0xbe, 0x34, 0x3, 0x84, + 0x58, 0x11, 0x12, 0xbf, 0xee, 0x7e, 0x24, 0x1, 0x2c, 0x7e, 0x14, 0x1, 0xe, + 0x7e, 0x4, 0x0, 0xfa, 0x80, 0x7e, 0xbe, 0xa0, 0x2, 0x28, 0x1b, 0x7e, 0x37, + 0x67, 0x68, 0xbe, 0x34, 0x4, 0x4c, 0x58, 0x11, 0x12, 0xbf, 0xee, 0x7e, 0x24, + 0x1, 0x5e, 0x7e, 0x14, 0x1, 0x4a, 0x7e, 0x4, 0x0, 0xfa, 0x80, 0x5e, 0xbe, + 0xa0, 0x1, 0x28, 0x60, 0x7e, 0x37, 0x67, 0x68, 0xbe, 0x34, 0x5, 0x14, 0x58, + 0x56, 0x7e, 0xb3, 0x69, 0x75, 0xbe, 0xb0, 0x2, 0x68, 0xf, 0xb4, 0x1, 0x34, + 0xbe, 0xa0, 0x2, 0x78, 0x2f, 0x7e, 0xb3, 0x69, 0x6a, 0xb4, 0x2, 0x28, 0x7e, + 0x73, 0x67, 0x98, 0xbe, 0x70, 0x46, 0x38, 0x9, 0x7e, 0x73, 0x67, 0xa5, 0xbe, + 0x70, 0x46, 0x28, 0x16, 0x12, 0xbf, 0xe7, 0x7e, 0x24, 0x1, 0x2c, 0x7e, 0x14, + 0x1, 0x18, 0x7e, 0x4, 0x0, 0xfa, 0x12, 0xbf, 0xf5, 0xd2, 0x29, 0x80, 0x1b, + 0x12, 0xbf, 0xe7, 0x7e, 0x24, 0x1, 0x90, 0x7e, 0x14, 0x1, 0x7c, 0x7e, 0x4, + 0x0, 0xfa, 0x12, 0xbf, 0xf5, 0x80, 0x7, 0x80, 0x0, 0xe4, 0x7a, 0xb3, 0x39, + 0xfe, 0x7e, 0xb3, 0x39, 0xfe, 0x70, 0x14, 0x12, 0xbf, 0xe7, 0x7e, 0x27, + 0x75, 0x96, 0x7e, 0x17, 0x75, 0x98, 0x7e, 0x7, 0x75, 0xa4, 0x12, 0xbf, 0xf5, + 0x80, 0x2, 0xd2, 0x1f, 0xda, 0xf8, 0x22, 0x7e, 0x73, 0x75, 0x8e, 0xa, 0x37, + 0x22, 0x7e, 0xb3, 0x75, 0x8e, 0xa, 0x3b, 0x22, 0x7a, 0x73, 0x81, 0xec, 0x7a, + 0x27, 0x81, 0xed, 0x7a, 0x17, 0x81, 0xef, 0x7a, 0x7, 0x81, 0xf9, 0x6d, 0x33, + 0x9d, 0x30, 0x12, 0x4e, 0x24, 0x12, 0x4f, 0x1b, 0x7a, 0x73, 0x59, 0x3c, + 0x22, 0xca, 0x3b, 0x7c, 0xf5, 0x7c, 0xe6, 0xbc, 0xbe, 0x50, 0x5, 0x75, 0x45, + 0x1, 0x80, 0xc, 0xbc, 0xbe, 0x28, 0x5, 0x75, 0x45, 0xff, 0x80, 0x3, 0x75, + 0x45, 0x0, 0xbc, 0x7f, 0x50, 0x5, 0x75, 0x46, 0x1, 0x80, 0xc, 0xbc, 0x7f, + 0x28, 0x5, 0x75, 0x46, 0xff, 0x80, 0x3, 0x75, 0x46, 0x0, 0x7c, 0xdb, 0x7c, + 0xc7, 0x7e, 0xe4, 0x7f, 0xff, 0x1, 0xd7, 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x34, + 0x0, 0xc, 0x74, 0xff, 0x12, 0x0, 0x2e, 0x7a, 0xc3, 0x91, 0xff, 0x7a, 0xd3, + 0x92, 0x2, 0xbc, 0xed, 0x68, 0x10, 0xe5, 0x45, 0x1a, 0x2b, 0xa, 0x3d, 0x2d, + 0x32, 0x7a, 0x73, 0x91, 0xfe, 0x7a, 0x73, 0x92, 0x6, 0xbc, 0xfc, 0x68, 0x10, + 0xe5, 0x46, 0x1a, 0x2b, 0xa, 0x3c, 0x2d, 0x32, 0x7a, 0x73, 0x92, 0x3, 0x7a, + 0x73, 0x92, 0x7, 0x7e, 0xf4, 0xd8, 0xf0, 0x75, 0x47, 0xff, 0x75, 0x44, 0x0, + 0x7e, 0x51, 0x44, 0x74, 0x4, 0xac, 0x5b, 0x9, 0xb2, 0x91, 0xfe, 0xbe, 0xb0, + 0xff, 0x68, 0x17, 0x9, 0x72, 0x91, 0xff, 0xbe, 0x70, 0xff, 0x68, 0xe, 0x12, + 0x2e, 0x40, 0x7d, 0xd3, 0xbd, 0xfd, 0x58, 0x5, 0x7d, 0xfd, 0x85, 0x44, 0x47, + 0x5, 0x44, 0xe5, 0x44, 0xb4, 0x3, 0xd2, 0x7e, 0xa1, 0x47, 0x74, 0x4, 0xa4, + 0x9, 0xd5, 0x91, 0xfe, 0x9, 0xc5, 0x91, 0xff, 0xbd, 0xfe, 0x58, 0x2, 0x7d, + 0xef, 0xbc, 0xed, 0x68, 0x2, 0x1, 0x4e, 0xbc, 0xfc, 0x68, 0x2, 0x1, 0x4e, + 0x7d, 0x3e, 0xda, 0x3b, 0x22, 0xca, 0x3b, 0x7e, 0x80, 0xff, 0x6c, 0xff, + 0x7e, 0xc0, 0xff, 0x6c, 0xee, 0x75, 0x29, 0x0, 0x6c, 0x99, 0x7e, 0xf4, 0x7f, + 0xff, 0x6c, 0xdd, 0x80, 0x58, 0x7e, 0x70, 0x2, 0xac, 0x7d, 0x12, 0x7f, 0x45, + 0x7d, 0x3, 0xbd, 0xf, 0x58, 0x2, 0x7d, 0xf0, 0xe5, 0x27, 0xbc, 0xb8, 0x50, + 0x3, 0x7e, 0x81, 0x27, 0xe5, 0x27, 0xbc, 0xbf, 0x28, 0x3, 0x7e, 0xf1, 0x27, + 0xe5, 0x28, 0xbc, 0xbc, 0x50, 0x3, 0x7e, 0xc1, 0x28, 0xe5, 0x28, 0xbc, 0xbe, + 0x28, 0x3, 0x7e, 0xe1, 0x28, 0xa, 0x58, 0xa, 0x1f, 0x9d, 0x15, 0xbe, 0x14, + 0x0, 0x7, 0x18, 0xc, 0xa, 0x5c, 0xa, 0x1e, 0x9d, 0x15, 0xbe, 0x14, 0x0, 0x7, + 0x8, 0xa, 0x7e, 0x14, 0x1, 0xf4, 0x7a, 0x17, 0x39, 0x3c, 0x41, 0x28, 0xb, + 0xd0, 0x12, 0x64, 0x7f, 0x38, 0xa3, 0x7d, 0x3f, 0x3e, 0x34, 0x12, 0x79, + 0x68, 0x7d, 0x3, 0xbc, 0xec, 0x78, 0x17, 0xbe, 0xc0, 0x0, 0x28, 0x2, 0x1b, + 0xc0, 0x7e, 0x73, 0x82, 0xf, 0xa, 0x57, 0x1b, 0x54, 0xa, 0x1e, 0xbd, 0x15, + 0x58, 0x2, 0xb, 0xe0, 0xbc, 0xf8, 0x78, 0x17, 0xbe, 0x80, 0x0, 0x28, 0x2, + 0x1b, 0x80, 0x7e, 0x73, 0x82, 0xe, 0xa, 0x57, 0x1b, 0x54, 0xa, 0x1f, 0xbd, + 0x15, 0x58, 0x2, 0xb, 0xf0, 0x7c, 0xdc, 0x80, 0x1b, 0x7c, 0xc8, 0x80, 0x11, + 0x7c, 0xbc, 0x7c, 0x7d, 0x12, 0x2e, 0x40, 0xbd, 0x30, 0x8, 0x2, 0x5, 0x29, + 0xb, 0x90, 0xb, 0xc0, 0xbc, 0xfc, 0x50, 0xeb, 0xb, 0xd0, 0xbc, 0xed, 0x50, + 0xe1, 0x7e, 0x83, 0x69, 0x6a, 0xbe, 0x80, 0x3, 0x40, 0xd, 0x12, 0xc2, 0x31, + 0x50, 0x28, 0xb, 0x14, 0x7a, 0x17, 0x39, 0x3c, 0x80, 0x20, 0xbe, 0x80, 0x1, + 0x38, 0x1b, 0x7e, 0x17, 0x39, 0x3c, 0xbe, 0x14, 0x0, 0x2, 0x28, 0x6, 0x1b, + 0x15, 0x7a, 0x17, 0x39, 0x3c, 0x12, 0xc2, 0x3a, 0x50, 0x6, 0xb, 0x14, 0x7a, + 0x17, 0x38, 0x9e, 0x7e, 0x83, 0x67, 0x62, 0xbe, 0x80, 0x1, 0x40, 0x2f, 0x7e, + 0x30, 0x2, 0xac, 0x39, 0x7e, 0xa1, 0x29, 0x74, 0x3, 0xa4, 0xbd, 0x51, 0x8, + 0xf, 0x6d, 0x11, 0x7a, 0x17, 0x39, 0x3c, 0x12, 0xc2, 0x3a, 0x50, 0x15, 0xb, + 0x14, 0x80, 0xd, 0x12, 0xc2, 0x31, 0x50, 0x6, 0xb, 0x15, 0x7a, 0x17, 0x39, + 0x3c, 0x6d, 0x11, 0x7a, 0x17, 0x38, 0x9e, 0xda, 0x3b, 0x22, 0x7e, 0x17, + 0x39, 0x3c, 0xbe, 0x14, 0x3, 0xe8, 0x22, 0x7e, 0x17, 0x38, 0x9e, 0xbe, 0x14, + 0x1, 0xf4, 0x22, 0xca, 0x79, 0x7e, 0x13, 0x82, 0xe, 0x7e, 0x3, 0x82, 0xf, + 0x6c, 0xff, 0x61, 0x1f, 0x7e, 0x30, 0x2, 0xac, 0x3f, 0x9, 0xa1, 0x65, 0x60, + 0x7a, 0xa3, 0x91, 0xfe, 0x9, 0xb1, 0x65, 0x61, 0xf5, 0x47, 0x7e, 0x44, 0x80, + 0x1, 0x1a, 0x5a, 0x1b, 0x54, 0xf5, 0x44, 0x61, 0x3, 0x85, 0x44, 0x45, 0xe5, + 0x44, 0xbe, 0xb0, 0x0, 0x58, 0x12, 0xe5, 0x44, 0x1a, 0x3b, 0x7e, 0x53, 0x91, + 0xfe, 0x1a, 0x15, 0x7d, 0x51, 0x9d, 0x53, 0x2d, 0x51, 0xf5, 0x45, 0xbe, + 0x11, 0x44, 0x18, 0x12, 0x7e, 0x73, 0x91, 0xfe, 0x1a, 0x37, 0xe5, 0x44, + 0x1a, 0x1b, 0x9d, 0x13, 0x7d, 0x53, 0x9d, 0x51, 0xf5, 0x45, 0xe5, 0x47, + 0x1a, 0x1b, 0x1b, 0x14, 0x7c, 0xe3, 0x80, 0x48, 0x7a, 0xe1, 0x46, 0xbe, + 0xe0, 0x0, 0x58, 0xe, 0x1a, 0x3e, 0xe5, 0x47, 0x1a, 0x1b, 0x7d, 0x51, 0x9d, + 0x53, 0x2d, 0x51, 0xf5, 0x46, 0xbc, 0xe, 0x18, 0xc, 0xe5, 0x47, 0x1a, 0x5b, + 0x1a, 0x1e, 0x9d, 0x15, 0x9d, 0x51, 0xf5, 0x46, 0x7e, 0x73, 0x91, 0xfe, + 0xbe, 0x71, 0x45, 0x78, 0x7, 0xe5, 0x47, 0xbe, 0xb1, 0x46, 0x68, 0x10, 0xe5, + 0x45, 0x7e, 0x71, 0x46, 0x12, 0x2e, 0x40, 0x7d, 0xf3, 0xbd, 0xf4, 0x8, 0x2, + 0x7d, 0x4f, 0xb, 0xe0, 0xe5, 0x47, 0x1a, 0x5b, 0xb, 0x54, 0x1a, 0x1e, 0xbd, + 0x15, 0x8, 0xac, 0x5, 0x44, 0x7e, 0x73, 0x91, 0xfe, 0x1a, 0x37, 0xb, 0x34, + 0xe5, 0x44, 0x1a, 0x1b, 0xbd, 0x13, 0x18, 0x2, 0x41, 0x70, 0x74, 0x2, 0xac, + 0xbf, 0x59, 0x45, 0x38, 0xfe, 0xb, 0xf0, 0x12, 0x67, 0x3e, 0x28, 0x2, 0x41, + 0x51, 0xda, 0x79, 0x22, 0xca, 0x79, 0x6d, 0x22, 0x7d, 0x53, 0x1b, 0x54, + 0x7e, 0x7f, 0x39, 0xe4, 0x79, 0x57, 0x0, 0xa, 0x7e, 0x7f, 0x39, 0xe4, 0xb, + 0x7a, 0x50, 0x44, 0x20, 0x1b, 0x7a, 0x50, 0x6d, 0x55, 0x7e, 0x7f, 0x39, + 0xe4, 0x79, 0x57, 0x0, 0x6, 0x80, 0x1b, 0x7e, 0x2f, 0x39, 0xe4, 0x69, 0xf2, + 0x0, 0xc, 0x5e, 0xf4, 0x0, 0xff, 0x68, 0xd, 0x69, 0x72, 0x0, 0x8, 0x7f, + 0x20, 0x2d, 0x52, 0x7a, 0x2b, 0xf0, 0xb, 0x24, 0xbd, 0x32, 0x38, 0xe1, 0x7e, + 0x34, 0x0, 0x1, 0x7e, 0xf, 0x39, 0xe4, 0x79, 0x30, 0x0, 0x4, 0xda, 0x79, + 0x22, 0x7e, 0x70, 0x3, 0xd2, 0xc8, 0xc2, 0xea, 0x7e, 0xf, 0x39, 0xe4, 0xb, + 0xa, 0x20, 0x5e, 0x24, 0x0, 0x13, 0x1b, 0xa, 0x20, 0xa, 0x27, 0x3e, 0x24, + 0x3e, 0x24, 0x7e, 0xf, 0x39, 0xe4, 0x2, 0x16, 0xaf, 0x75, 0xed, 0x8f, 0x75, + 0xad, 0xb0, 0xa9, 0xc7, 0x94, 0xa9, 0xd4, 0x94, 0x22, 0x75, 0xec, 0xff, + 0x75, 0xee, 0xff, 0x75, 0xeb, 0x3, 0x75, 0xac, 0xc0, 0xa9, 0xd0, 0xea, 0x12, + 0xc3, 0xa1, 0x75, 0xe1, 0x2, 0x22, 0xc2, 0x8c, 0xc2, 0xa9, 0x32, 0xca, 0x7b, + 0xca, 0x6b, 0xca, 0x5b, 0xca, 0x4b, 0xca, 0x2b, 0xca, 0x1b, 0xca, 0xb, 0xc0, + 0xd0, 0xc0, 0x83, 0xc0, 0x82, 0xc2, 0x8f, 0x12, 0x0, 0x56, 0xd0, 0x82, 0xd0, + 0x83, 0xd0, 0xd0, 0xda, 0xb, 0xda, 0x1b, 0xda, 0x2b, 0xda, 0x4b, 0xda, 0x5b, + 0xda, 0x6b, 0xda, 0x7b, 0x32, 0xca, 0xb8, 0xa9, 0x31, 0xcd, 0x10, 0xa9, + 0x31, 0xe5, 0xc, 0x12, 0x55, 0xb6, 0x74, 0x1, 0x7a, 0xb3, 0x9b, 0xab, 0xa9, + 0xc1, 0xcd, 0xa9, 0x37, 0xcd, 0x7, 0xa9, 0x37, 0xe5, 0x3, 0xa9, 0xc7, 0xcd, + 0x75, 0xcd, 0x0, 0xda, 0xb8, 0x32, 0x12, 0xc4, 0x28, 0x20, 0x2d, 0x3, 0x2, + 0xc4, 0x48, 0x22, 0x30, 0x2e, 0x3, 0x12, 0xc4, 0x2f, 0x22, 0xa9, 0xd2, 0xea, + 0xa9, 0xc2, 0xea, 0xc2, 0x2e, 0xc2, 0x2d, 0x22, 0x12, 0x1f, 0xd5, 0x68, 0x8, + 0xe4, 0x7a, 0xb3, 0x9b, 0x7a, 0x2, 0xc4, 0x1e, 0x22, 0x20, 0xd, 0x3, 0x12, + 0x4f, 0x63, 0xe4, 0x7a, 0xb3, 0x9b, 0x82, 0x74, 0x3, 0x7a, 0xb3, 0x9a, 0x7b, + 0x74, 0x2, 0x7a, 0xb3, 0x9a, 0x7c, 0x7a, 0xb3, 0x9a, 0x7d, 0x22, 0xca, 0xb8, + 0xca, 0x39, 0x12, 0x51, 0xf2, 0x7e, 0x37, 0x9b, 0x77, 0xb, 0x34, 0x7a, 0x37, + 0x9b, 0x77, 0x7e, 0x37, 0x9b, 0xa9, 0xb, 0x34, 0x7a, 0x37, 0x9b, 0xa9, 0x7e, + 0x37, 0x3, 0xd8, 0x4d, 0x33, 0x68, 0x6, 0x1b, 0x34, 0x7a, 0x37, 0x3, 0xd8, + 0x7e, 0xb3, 0x9b, 0x79, 0x60, 0x5, 0x14, 0x7a, 0xb3, 0x9b, 0x79, 0x7e, 0xb3, + 0x9b, 0x79, 0x70, 0x2, 0xd2, 0x12, 0x7e, 0x37, 0x3, 0xd6, 0xb, 0x34, 0x7a, + 0x37, 0x3, 0xd6, 0x7e, 0x37, 0x9b, 0x85, 0xbe, 0x34, 0x0, 0x0, 0x28, 0x6, + 0x1b, 0x34, 0x7a, 0x37, 0x9b, 0x85, 0x7e, 0xb3, 0x9b, 0xb1, 0xbe, 0xb0, + 0xff, 0x50, 0x5, 0x4, 0x7a, 0xb3, 0x9b, 0xb1, 0xda, 0x39, 0xda, 0xb8, 0x32, + 0xc2, 0x88, 0xd2, 0xa8, 0x22, 0xa9, 0xd6, 0xcd, 0xa9, 0xd5, 0xcd, 0x22, + 0xa9, 0xd6, 0xef, 0x22, 0x7e, 0xb3, 0x9b, 0xb0, 0x4, 0x7a, 0xb3, 0x9b, 0xb0, + 0x7e, 0x73, 0x9b, 0xb0, 0xbe, 0x70, 0xc8, 0x28, 0x6, 0x74, 0xc8, 0x7a, 0xb3, + 0x9b, 0xb0, 0x22, 0xa2, 0x13, 0x30, 0x9, 0x1, 0xb3, 0x50, 0x46, 0xa2, 0x9, + 0x92, 0x13, 0x30, 0x9, 0x2a, 0xa9, 0xd5, 0xc3, 0xa9, 0xd4, 0xc3, 0xa9, 0xd3, + 0xc7, 0x7e, 0x34, 0x0, 0x60, 0x12, 0xc5, 0x49, 0xa9, 0xd4, 0xc7, 0xa9, 0xd5, + 0xc7, 0x7e, 0x34, 0x0, 0x80, 0x12, 0xc5, 0x49, 0xa9, 0xd7, 0xc3, 0xa9, 0xd6, + 0xc3, 0x7e, 0x34, 0x1, 0xa0, 0x2, 0xc5, 0x49, 0xa9, 0xc7, 0xc3, 0xa9, 0xc6, + 0xc3, 0xa9, 0xc4, 0xc7, 0xa9, 0xc5, 0xc7, 0xa9, 0xc5, 0xc3, 0xa9, 0xc4, + 0xc3, 0xa9, 0xc3, 0xc7, 0x22, 0x7e, 0x34, 0x0, 0x64, 0x80, 0x10, 0x7e, 0x24, + 0x0, 0x2, 0x80, 0x1, 0x0, 0x7d, 0x12, 0x1b, 0x24, 0x4d, 0x11, 0x78, 0xf7, + 0x0, 0x7d, 0x13, 0x1b, 0x34, 0x4d, 0x11, 0x78, 0xe8, 0x22, 0x75, 0x9a, 0x2f, + 0xa9, 0xd1, 0x99, 0xa9, 0xd6, 0xdf, 0x22, 0xd2, 0xcb, 0xc2, 0x8c, 0x43, + 0x89, 0x1, 0x75, 0x8c, 0x1, 0x75, 0x8a, 0x0, 0xd2, 0xa9, 0x22, 0xd2, 0xcb, + 0xc2, 0x8e, 0x43, 0x89, 0x20, 0x75, 0x8d, 0x1, 0x75, 0x8b, 0x0, 0xd2, 0x8e, + 0xd2, 0xab, 0x22, 0x75, 0xb7, 0x0, 0x75, 0xb8, 0x0, 0x75, 0xf7, 0x0, 0x75, + 0xf8, 0x0, 0xa9, 0xd0, 0xb7, 0xd2, 0xb8, 0xa9, 0xd5, 0xb7, 0xd2, 0xbd, 0xa9, + 0xd0, 0xf7, 0xd2, 0xf8, 0xa9, 0xd6, 0xf7, 0xd2, 0xfe, 0xa9, 0xd1, 0xf7, + 0xc2, 0xf9, 0xa9, 0xc4, 0xb7, 0xd2, 0xbc, 0xa9, 0xc2, 0xb7, 0xc2, 0xba, + 0xa9, 0xc1, 0xb7, 0xc2, 0xb9, 0xa9, 0xc3, 0xb7, 0xc2, 0xbb, 0xa9, 0xc3, + 0xf7, 0xc2, 0xfb, 0x22, 0xd2, 0xe9, 0xc2, 0xc1, 0x22, 0xd2, 0xcc, 0x12, + 0xc6, 0x43, 0x12, 0xc6, 0x1, 0x78, 0xfb, 0x7e, 0x34, 0x0, 0x3, 0x1b, 0xa, + 0x30, 0x7e, 0x34, 0x0, 0x81, 0x7e, 0xf, 0x39, 0xe8, 0x79, 0x30, 0x0, 0x2, + 0xd2, 0xeb, 0xc2, 0xc3, 0x6d, 0x11, 0x7e, 0x1f, 0x39, 0xe8, 0x1b, 0x1a, + 0x10, 0xc2, 0xcc, 0x22, 0x7e, 0xf, 0x39, 0xe8, 0x69, 0x30, 0x0, 0x4, 0x5e, + 0x34, 0x0, 0x2, 0x22, 0x12, 0xc6, 0x76, 0x6d, 0x33, 0x7e, 0xf, 0x39, 0xe8, + 0x79, 0x30, 0x0, 0xa, 0x12, 0xc6, 0x8c, 0xe4, 0x7a, 0xb3, 0x39, 0xec, 0x80, + 0xa, 0x12, 0xc6, 0x64, 0x68, 0x5, 0x12, 0xc6, 0x50, 0x80, 0x5, 0x12, 0xc6, + 0x57, 0x68, 0xf1, 0x12, 0xc6, 0x43, 0x12, 0xc6, 0x1, 0x78, 0xfb, 0x69, 0x50, + 0x0, 0xa, 0x2, 0x31, 0x5c, 0x7e, 0x34, 0x0, 0x2, 0x7e, 0xf, 0x39, 0xe8, + 0x79, 0x30, 0x0, 0x4, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xec, 0x22, 0x7e, + 0x1f, 0x39, 0xe8, 0x69, 0x31, 0x0, 0x4, 0x5e, 0x34, 0x0, 0x2, 0x22, 0xe4, + 0x7a, 0xb3, 0x39, 0xec, 0x7e, 0x1f, 0x39, 0xf1, 0x69, 0x31, 0x0, 0x4, 0x5e, + 0x34, 0x0, 0x1, 0x22, 0xd2, 0xcc, 0x7e, 0x24, 0x0, 0x3, 0x7e, 0xf, 0x39, + 0xe8, 0x1b, 0xa, 0x20, 0x7e, 0xf, 0x39, 0xe8, 0x79, 0x30, 0x0, 0x6, 0x22, + 0x7e, 0xf, 0x39, 0xf1, 0xb, 0xa, 0x30, 0x5e, 0x70, 0xfd, 0x1b, 0xa, 0x30, + 0x7e, 0x34, 0x0, 0x1, 0x7e, 0xf, 0x39, 0xf1, 0x79, 0x30, 0x0, 0x4, 0x7e, + 0xf, 0x39, 0xf1, 0xb, 0xa, 0x30, 0x4e, 0x70, 0x1, 0x1b, 0xa, 0x30, 0x22, + 0x12, 0x1c, 0xb5, 0x4e, 0x60, 0x80, 0x1b, 0xa, 0x30, 0x12, 0xc6, 0xc2, 0x2, + 0xc6, 0xa9, 0x7e, 0xf, 0x39, 0xed, 0x2e, 0x14, 0x0, 0x14, 0x22, 0xa9, 0xd0, + 0x99, 0xa9, 0xc6, 0xdf, 0x22, 0xca, 0x39, 0xca, 0xb, 0x7e, 0xf, 0x39, 0xe8, + 0x69, 0x30, 0x0, 0x2, 0x5e, 0x34, 0x0, 0x1, 0x68, 0x22, 0x69, 0x30, 0x0, + 0x4, 0x5e, 0x34, 0x0, 0x1, 0x68, 0x18, 0xd2, 0xcc, 0x7e, 0x34, 0x0, 0x1, + 0x79, 0x30, 0x0, 0x4, 0xd2, 0xcc, 0x7e, 0xf, 0x39, 0xe8, 0xb, 0xa, 0x30, + 0x12, 0xc7, 0xd, 0xc2, 0xcc, 0xc2, 0xc3, 0xda, 0xb, 0xda, 0x39, 0x32, 0x4e, + 0x70, 0x4, 0x1b, 0xa, 0x30, 0x22, 0x7d, 0x12, 0x2d, 0x13, 0x3e, 0x14, 0x6d, + 0x0, 0x7e, 0x18, 0xbb, 0x80, 0x2, 0x1, 0xbf, 0x7e, 0x8, 0x8d, 0xb2, 0x7e, + 0x34, 0x0, 0x44, 0xe4, 0x12, 0x0, 0x2e, 0x7e, 0x34, 0x32, 0x3, 0x7a, 0x37, + 0x8d, 0xb2, 0x6d, 0x33, 0x7a, 0x37, 0x8d, 0xb4, 0x7e, 0xb3, 0x69, 0xec, + 0x60, 0x6, 0x7e, 0x34, 0x9d, 0x0, 0x80, 0x4, 0x7e, 0x34, 0x9d, 0x2, 0x7a, + 0x37, 0x8d, 0xb6, 0x7e, 0x37, 0x82, 0x3d, 0x7a, 0x37, 0x8d, 0xb8, 0x6d, + 0x33, 0x7a, 0x37, 0x8d, 0xba, 0x7a, 0x37, 0x8d, 0xbc, 0x7e, 0x34, 0x2, 0x0, + 0x7a, 0x37, 0x8d, 0xbe, 0x7e, 0x34, 0x44, 0x60, 0x7a, 0x37, 0x8d, 0xc0, + 0x7e, 0x34, 0x29, 0x1, 0x7a, 0x37, 0x8d, 0xc2, 0x7e, 0x34, 0xf, 0x70, 0x7a, + 0x37, 0x8d, 0xc4, 0x7e, 0x34, 0x8, 0xa, 0x7a, 0x37, 0x8d, 0xc6, 0x7e, 0x34, + 0x70, 0x0, 0x7a, 0x37, 0x8d, 0xc8, 0x7e, 0x34, 0x5, 0x80, 0x7a, 0x37, 0x8d, + 0xca, 0x7e, 0x34, 0x80, 0x0, 0x7a, 0x37, 0x8d, 0xcc, 0x6d, 0x33, 0x7a, 0x37, + 0x8d, 0xce, 0x7e, 0x34, 0x0, 0xf0, 0x7a, 0x37, 0x8d, 0xd0, 0x7e, 0x34, 0x0, + 0x30, 0x7a, 0x37, 0x8d, 0xd2, 0x6d, 0x33, 0x7a, 0x37, 0x8d, 0xd4, 0x7e, + 0x34, 0x0, 0x2a, 0x7a, 0x37, 0x8d, 0xd6, 0x7e, 0x34, 0x2d, 0x2d, 0x7a, 0x37, + 0x8d, 0xd8, 0x7e, 0x34, 0x11, 0x11, 0x7a, 0x37, 0x8d, 0xda, 0x7e, 0x34, + 0x11, 0x0, 0x7a, 0x37, 0x8d, 0xdc, 0x7e, 0x34, 0x1, 0x23, 0x7a, 0x37, 0x8d, + 0xde, 0x7e, 0x34, 0x45, 0x67, 0x7a, 0x37, 0x8d, 0xe0, 0x7e, 0x34, 0x89, + 0xab, 0x7a, 0x37, 0x8d, 0xe2, 0x7e, 0x34, 0xcd, 0xef, 0x7a, 0x37, 0x8d, + 0xe4, 0x6d, 0x33, 0x7a, 0x37, 0x8d, 0xe6, 0x7e, 0x34, 0x43, 0x21, 0x7a, + 0x37, 0x8d, 0xe8, 0x7e, 0x34, 0x23, 0x45, 0x7a, 0x37, 0x8d, 0xea, 0x7e, + 0x34, 0x12, 0x5, 0x7a, 0x37, 0x8d, 0xec, 0x7e, 0x34, 0xfe, 0xdc, 0x7a, 0x37, + 0x8d, 0xee, 0x7e, 0x34, 0xba, 0x98, 0x7a, 0x37, 0x8d, 0xf0, 0x7e, 0x34, + 0x76, 0x54, 0x7a, 0x37, 0x8d, 0xf2, 0x7e, 0x34, 0x32, 0x10, 0x7a, 0x37, + 0x8d, 0xf4, 0x22, 0xa9, 0xd2, 0xea, 0xa9, 0xc2, 0xea, 0x7e, 0x34, 0x70, + 0x43, 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, 0x0, 0xe, 0x7e, 0x34, 0x0, 0x4e, + 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, 0x0, 0x10, 0x12, 0xc9, 0x4f, 0x12, 0xc9, + 0x70, 0x12, 0xc9, 0x46, 0x7e, 0x34, 0x80, 0x12, 0x7e, 0xf, 0x39, 0xed, 0x79, + 0x30, 0x0, 0x26, 0x7e, 0xb3, 0x69, 0xec, 0x60, 0x7, 0x12, 0xc9, 0x23, 0x6d, + 0x33, 0x80, 0x8, 0x6d, 0x33, 0x12, 0xc9, 0x2b, 0x12, 0xc9, 0x67, 0x12, 0xc9, + 0x3d, 0x7e, 0x34, 0xff, 0xff, 0x12, 0xc9, 0x79, 0x12, 0xc9, 0x34, 0x7e, + 0x34, 0x0, 0x14, 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, 0x0, 0x1e, 0x7e, 0xf, + 0x39, 0xed, 0x79, 0x30, 0x0, 0x20, 0x6d, 0x33, 0x7e, 0xf, 0x39, 0xed, 0x79, + 0x30, 0x0, 0x22, 0x7e, 0x34, 0x0, 0x1f, 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, + 0x0, 0x28, 0x7e, 0x34, 0x8, 0x30, 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, 0x0, + 0x48, 0x7e, 0x34, 0x7, 0x3, 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, 0x0, 0x4a, + 0x7e, 0x34, 0x7f, 0x33, 0x12, 0xc9, 0x5e, 0x12, 0x4f, 0x63, 0x7e, 0x34, + 0xff, 0xff, 0x12, 0x1f, 0xc1, 0x7e, 0x34, 0xf0, 0x7f, 0x7e, 0xf, 0x39, 0xed, + 0x79, 0x30, 0x0, 0x4, 0xd2, 0x4, 0x12, 0x30, 0xca, 0x75, 0xc2, 0x0, 0xa9, + 0xd6, 0xc2, 0xa9, 0xd5, 0xc2, 0x53, 0xc3, 0xf8, 0x43, 0xc3, 0x3, 0x75, 0xc4, + 0x0, 0x75, 0xc5, 0x0, 0x75, 0xc6, 0x90, 0x75, 0xc7, 0x0, 0xa9, 0xd2, 0xc2, + 0xd2, 0xac, 0xa9, 0xc7, 0xea, 0x7e, 0x73, 0x75, 0x8b, 0x7a, 0x73, 0x9b, + 0x7f, 0x22, 0x7e, 0x37, 0x6a, 0x19, 0x2e, 0x34, 0x0, 0x9, 0x7e, 0xf, 0x39, + 0xed, 0x79, 0x30, 0x0, 0x16, 0x22, 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, 0x0, + 0x1c, 0x22, 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, 0x0, 0x18, 0x22, 0x7e, 0xf, + 0x39, 0xed, 0x79, 0x30, 0x0, 0x14, 0x22, 0x6d, 0x33, 0x7e, 0xf, 0x39, 0xed, + 0x79, 0x30, 0x0, 0x12, 0x22, 0x7e, 0x37, 0x38, 0x7e, 0x7e, 0xf, 0x39, 0xed, + 0x79, 0x30, 0x0, 0x4c, 0x22, 0x7e, 0x37, 0x6a, 0x17, 0x2e, 0x34, 0x0, 0x9, + 0x22, 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, 0x0, 0x24, 0x22, 0x7e, 0xf, 0x39, + 0xed, 0x79, 0x30, 0x0, 0x1a, 0x22, 0xa9, 0xd5, 0xcb, 0xa9, 0xd1, 0xcb, 0xa9, + 0xd2, 0xca, 0xa9, 0xd2, 0xcb, 0x22, 0xc2, 0xed, 0xc2, 0xc5, 0x32, 0xe4, + 0x7a, 0xb3, 0x9a, 0x78, 0x12, 0xc9, 0xa8, 0x7a, 0xb3, 0x9a, 0x7b, 0x12, + 0xc9, 0xb4, 0x7a, 0xb3, 0x9a, 0x85, 0x22, 0x7a, 0xb3, 0x9a, 0x79, 0x74, + 0xff, 0x7a, 0xb3, 0x9a, 0x7a, 0xe4, 0x22, 0x7a, 0xb3, 0x9a, 0x7c, 0x7a, + 0xb3, 0x9a, 0x7d, 0x7a, 0xb3, 0x9a, 0x7e, 0x7a, 0xb3, 0x9a, 0x82, 0x74, + 0xff, 0x7a, 0xb3, 0x9a, 0x83, 0xe4, 0x7a, 0xb3, 0x9a, 0x84, 0x22, 0x6d, + 0x33, 0x12, 0xc9, 0xfc, 0x7e, 0x57, 0x9a, 0x4c, 0x12, 0xca, 0x18, 0xe4, 0x2, + 0xc9, 0xe0, 0x7a, 0xb3, 0x9a, 0x7f, 0x7a, 0xb3, 0x9a, 0x80, 0x22, 0x7e, + 0x34, 0x0, 0x2, 0x12, 0xc9, 0xfc, 0x7e, 0x57, 0x9a, 0x62, 0x12, 0xca, 0x18, + 0x74, 0x2, 0x2, 0xc9, 0xe0, 0x7e, 0x24, 0xe, 0x40, 0x7e, 0x14, 0x13, 0x60, + 0x22, 0x7e, 0x34, 0x0, 0x1, 0x12, 0xc9, 0xfc, 0x7e, 0x57, 0x9a, 0x57, 0x12, + 0xca, 0x18, 0x74, 0x1, 0x2, 0xc9, 0xe0, 0x7c, 0x1b, 0x7d, 0x43, 0x7e, 0xa3, + 0x9a, 0x78, 0xbe, 0xa0, 0x6, 0x50, 0x2e, 0x7e, 0x70, 0x9, 0xac, 0x7a, 0x59, + 0x43, 0x9a, 0x86, 0x59, 0x23, 0x9a, 0x88, 0x59, 0x13, 0x9a, 0x8a, 0xbe, + 0x44, 0x0, 0x1, 0x78, 0x6, 0x7e, 0x24, 0x18, 0x80, 0x80, 0x0, 0x59, 0x23, + 0x9a, 0x8c, 0x19, 0x13, 0x9a, 0x8e, 0x7c, 0xba, 0x4, 0x7a, 0xb3, 0x9a, 0x78, + 0xc3, 0x22, 0xd3, 0x22, 0x7e, 0x34, 0x0, 0x3, 0x12, 0xc9, 0xfc, 0x7e, 0x57, + 0x9a, 0x6d, 0x12, 0xca, 0x18, 0x74, 0x3, 0x7a, 0xb3, 0x9a, 0x81, 0x22, 0x7e, + 0x34, 0x0, 0x4, 0x12, 0xc9, 0xfc, 0x12, 0xca, 0x18, 0x7e, 0x73, 0x9b, 0xa8, + 0x7a, 0x73, 0x9a, 0x7f, 0x7a, 0x73, 0x9a, 0x80, 0x22, 0xca, 0xf8, 0x7e, + 0xb3, 0x9a, 0x7b, 0xb4, 0x1, 0x50, 0x7e, 0xa3, 0x9a, 0x79, 0x7a, 0xa3, 0x9a, + 0x7a, 0x7e, 0xb3, 0x9a, 0x83, 0x4, 0x7a, 0xb3, 0x9a, 0x83, 0x6c, 0xff, 0x6c, + 0x77, 0x80, 0xd, 0x7e, 0x50, 0x9, 0xac, 0x57, 0x9, 0x62, 0x9a, 0x8e, 0x2c, + 0xf6, 0xb, 0x70, 0xbc, 0xa7, 0x50, 0xef, 0x30, 0x2b, 0xe, 0x7e, 0xb3, 0x9a, + 0x83, 0xb4, 0x1, 0x7, 0x7e, 0xb3, 0x9b, 0x38, 0x12, 0x34, 0x64, 0xa, 0x2f, + 0x1b, 0x24, 0x7e, 0x73, 0x9a, 0x83, 0xa, 0x37, 0xbd, 0x32, 0x48, 0x9, 0x7e, + 0xb3, 0x9a, 0x79, 0x4, 0x7a, 0xb3, 0x9a, 0x79, 0xda, 0xf8, 0x22, 0x74, 0x2, + 0x7a, 0xb3, 0x9a, 0x61, 0x22, 0x12, 0x1f, 0xd9, 0x78, 0x50, 0x7e, 0x37, + 0x9b, 0x85, 0x4d, 0x33, 0x78, 0xf8, 0x12, 0xcb, 0x3a, 0x7e, 0xb3, 0x59, + 0x60, 0xb4, 0x1, 0x8, 0x7e, 0x73, 0x59, 0x44, 0xa, 0x37, 0x80, 0xc, 0x7e, + 0x73, 0x59, 0x43, 0xa, 0x27, 0x7e, 0x34, 0x0, 0x64, 0x8d, 0x32, 0x1b, 0x34, + 0x7a, 0x37, 0x9b, 0x85, 0x7e, 0x73, 0x59, 0x67, 0xa, 0x27, 0x7e, 0x37, 0x9b, + 0x85, 0xad, 0x32, 0x7e, 0x24, 0x0, 0x18, 0x8d, 0x32, 0x7a, 0x37, 0x9b, 0x85, + 0x7e, 0x37, 0x9b, 0x80, 0xbe, 0x37, 0x9b, 0x85, 0x50, 0x4, 0x7a, 0x37, 0x9b, + 0x85, 0x22, 0x7e, 0x73, 0x59, 0x45, 0x7e, 0xb3, 0x59, 0x60, 0x70, 0x35, + 0x7e, 0xb3, 0x9b, 0xaf, 0x70, 0x22, 0x7e, 0x63, 0x59, 0x43, 0xbe, 0x60, + 0x14, 0x28, 0x5, 0x7e, 0x60, 0x14, 0x80, 0x7, 0xa5, 0xbe, 0x0, 0x3, 0x7e, + 0x60, 0x1, 0xa, 0x26, 0x7e, 0x34, 0x0, 0x64, 0x12, 0x1, 0x20, 0x7c, 0x67, + 0x80, 0x63, 0x7e, 0xb3, 0x9b, 0x7f, 0xa, 0x27, 0xb4, 0x1, 0x2, 0x80, 0x32, + 0x80, 0x3e, 0x7e, 0xf, 0x39, 0xed, 0x69, 0x20, 0x0, 0x6, 0x5e, 0x24, 0x0, + 0x1, 0x78, 0xe, 0x7e, 0x63, 0x59, 0x44, 0xbe, 0x60, 0x7f, 0x28, 0x3f, 0x7e, + 0x60, 0x7f, 0x80, 0x3a, 0x7e, 0xb3, 0x3, 0xd5, 0xbe, 0xb0, 0x3c, 0x68, 0x2, + 0x70, 0x23, 0x7e, 0xb3, 0x9b, 0x7f, 0xa, 0x27, 0xb4, 0x1, 0xe, 0x7e, 0x34, + 0x1, 0xf4, 0x8d, 0x32, 0x9e, 0x34, 0x0, 0x5, 0x7c, 0x67, 0x80, 0x18, 0x7e, + 0x34, 0x3, 0xe8, 0x8d, 0x32, 0x1b, 0x35, 0x7c, 0x67, 0x80, 0xc, 0xa, 0x27, + 0x7e, 0x34, 0x3, 0xe8, 0x8d, 0x32, 0x1b, 0x36, 0x7c, 0x67, 0x7e, 0x73, 0x59, + 0x67, 0xac, 0x67, 0x7e, 0x24, 0x0, 0x18, 0x12, 0x1, 0x20, 0x7a, 0x73, 0x9b, + 0x79, 0xc2, 0x12, 0x6d, 0x33, 0x7a, 0x37, 0x9b, 0x77, 0x22, 0xc2, 0x4, 0x12, + 0xcc, 0x7, 0x38, 0x4, 0xc2, 0x4, 0x80, 0x10, 0x7e, 0xa3, 0x9a, 0x79, 0x74, + 0x9, 0xa4, 0x49, 0x55, 0x9a, 0x86, 0x12, 0x15, 0x3d, 0x92, 0x4, 0xa2, 0x4, + 0x22, 0x7e, 0x73, 0x9a, 0x78, 0xbe, 0x73, 0x9a, 0x79, 0x22, 0xe4, 0x7a, + 0xb3, 0x9a, 0x85, 0x6c, 0xaa, 0x80, 0x13, 0x7e, 0x70, 0x9, 0xac, 0x7a, 0x9, + 0xb3, 0x9a, 0x8e, 0x2e, 0xb3, 0x9a, 0x85, 0x7a, 0xb3, 0x9a, 0x85, 0xb, 0xa0, + 0x7e, 0xb3, 0x9a, 0x78, 0xbc, 0xba, 0x38, 0xe5, 0x22, 0x12, 0x37, 0xe2, + 0x12, 0x46, 0xf6, 0x12, 0x3b, 0x89, 0x12, 0xcc, 0x7f, 0x68, 0x1a, 0x7f, + 0x20, 0x12, 0xcc, 0x6c, 0x4e, 0x60, 0x2, 0x1b, 0x2a, 0x30, 0x7e, 0x2f, 0x39, + 0xed, 0x12, 0xcc, 0x6c, 0x5e, 0x70, 0xfd, 0x1b, 0x2a, 0x30, 0x80, 0x6, 0x12, + 0x1c, 0xa8, 0x12, 0x1f, 0xef, 0x12, 0xcc, 0x74, 0x12, 0x37, 0xdb, 0x2, 0x32, + 0x20, 0x2e, 0x54, 0x0, 0xe, 0xb, 0x2a, 0x30, 0x22, 0x74, 0x1, 0x7a, 0xb3, + 0x59, 0x62, 0x7a, 0xb3, 0x3, 0xfd, 0x22, 0x7e, 0xf, 0x39, 0xed, 0x69, 0x30, + 0x0, 0x6, 0x5e, 0x34, 0x0, 0x1, 0x22, 0xc2, 0x18, 0xc2, 0x1b, 0x22, 0xd2, + 0x4, 0x12, 0xb, 0xc5, 0x12, 0x0, 0x46, 0x70, 0xfb, 0x22, 0x7c, 0xab, 0xe4, + 0x80, 0x3, 0x1e, 0xa0, 0x4, 0xbe, 0xa0, 0x4, 0x38, 0xf8, 0x22, 0xbe, 0xb0, + 0x6, 0x40, 0x2, 0xa1, 0x4e, 0xbe, 0xb0, 0x6, 0x40, 0x2, 0xa1, 0x4e, 0x6d, + 0x44, 0xa1, 0x44, 0x7d, 0x54, 0x3e, 0x54, 0x49, 0xd5, 0xe, 0x40, 0x7d, 0xed, + 0x9d, 0xe3, 0xbe, 0xe4, 0x0, 0x0, 0x8, 0x6, 0x7d, 0xfd, 0x9d, 0xf3, 0x80, + 0x4, 0x6d, 0xff, 0x9d, 0xfe, 0x7e, 0x5d, 0x34, 0x2d, 0xb5, 0xb, 0x5a, 0xe0, + 0x7d, 0xce, 0x9d, 0xc3, 0xbe, 0xc4, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xe3, 0x80, + 0x4, 0x6d, 0xee, 0x9d, 0xec, 0xbd, 0xef, 0x40, 0x2f, 0xbe, 0xd5, 0x3a, 0x28, + 0x2a, 0x49, 0x55, 0xe, 0x40, 0xbe, 0x55, 0x3c, 0x50, 0x21, 0x12, 0xcd, 0x58, + 0x7d, 0xb4, 0x3e, 0xb4, 0x7e, 0x6d, 0x34, 0x2d, 0xdb, 0x1b, 0x6a, 0x50, + 0x12, 0xcd, 0x4f, 0x7d, 0x5d, 0x2d, 0x54, 0x9, 0xb5, 0x5a, 0x0, 0x7f, 0x60, + 0x2d, 0xd4, 0x7a, 0x6b, 0xb0, 0x12, 0xcd, 0x58, 0xbd, 0x53, 0x50, 0x16, + 0x7c, 0xa5, 0x6e, 0xa0, 0xff, 0x12, 0xcd, 0x4f, 0x2d, 0xd4, 0x2e, 0xd4, + 0x5a, 0x0, 0x7e, 0xd9, 0xb0, 0x5c, 0xba, 0x7a, 0xd9, 0xb0, 0xb, 0x44, 0x7e, + 0x57, 0x8d, 0x94, 0xbd, 0x54, 0x28, 0x2, 0x81, 0xbc, 0x22, 0xa, 0xc4, 0x7e, + 0xd4, 0x2, 0xd8, 0xad, 0xdc, 0x22, 0x7d, 0x54, 0x3e, 0x54, 0x49, 0x55, 0xe, + 0x40, 0x22, 0x12, 0x77, 0xb1, 0xe4, 0x7a, 0xb3, 0x92, 0x0, 0x7e, 0x1f, 0x2d, + 0x26, 0x7a, 0x37, 0x92, 0x2, 0x7e, 0x1f, 0x2d, 0x2e, 0x7a, 0x37, 0x92, 0x6, + 0x7e, 0xb3, 0x8d, 0x91, 0x70, 0xb, 0xe4, 0x7a, 0xb3, 0x92, 0x1, 0x7e, 0x34, + 0x0, 0x20, 0x80, 0x10, 0x74, 0x1, 0x7a, 0xb3, 0x92, 0x1, 0x7e, 0x1f, 0x2d, + 0x2a, 0x7a, 0x37, 0x92, 0x4, 0x6d, 0x33, 0x12, 0xaf, 0x99, 0x12, 0x27, 0x50, + 0x12, 0xcd, 0xe4, 0x7e, 0xb3, 0x8d, 0x91, 0xa, 0x4a, 0xb4, 0x1, 0x1a, 0x2d, + 0x43, 0x3e, 0x44, 0x7e, 0xf, 0x2d, 0x2a, 0x2d, 0x14, 0xb, 0xa, 0x10, 0x7e, + 0x7f, 0x2d, 0x26, 0x2d, 0xf4, 0xb, 0x7a, 0x20, 0x9d, 0x21, 0x80, 0xd, 0x2d, + 0x43, 0x3e, 0x44, 0x7e, 0xf, 0x2d, 0x26, 0x2d, 0x14, 0xb, 0xa, 0x20, 0x7e, + 0xf, 0x2d, 0x2e, 0x2d, 0x14, 0x1b, 0xa, 0x20, 0xb, 0xa0, 0xbe, 0xa0, 0x4, + 0x40, 0xc0, 0x22, 0x7e, 0x37, 0x8d, 0x94, 0x6c, 0xaa, 0x22, 0xca, 0x79, + 0x7c, 0x5b, 0x7e, 0x40, 0xff, 0x7e, 0xa0, 0xff, 0x6c, 0x33, 0xc1, 0x7f, + 0xbc, 0x63, 0x78, 0x2, 0xc1, 0x7d, 0x7e, 0x90, 0x2, 0xac, 0x93, 0x9, 0x24, + 0x65, 0x60, 0xa, 0xf2, 0xa, 0x5, 0x9d, 0xf, 0xbe, 0x4, 0x0, 0x0, 0x8, 0xc, + 0xa, 0xe2, 0xa, 0xf5, 0x9d, 0xfe, 0x7d, 0x7f, 0x7c, 0x2f, 0x80, 0x8, 0x6e, + 0x4, 0xff, 0xff, 0xb, 0x4, 0x7c, 0x21, 0x7e, 0x10, 0x2, 0xac, 0x13, 0x9, + 0xb0, 0x65, 0x61, 0xa, 0xb, 0xa, 0x47, 0x9d, 0x40, 0xbe, 0x44, 0x0, 0x0, + 0x8, 0x8, 0xa, 0xfb, 0xa, 0x7, 0x9d, 0xf, 0x80, 0x4, 0x6d, 0x0, 0x9d, 0x4, + 0xbe, 0x20, 0x1, 0x38, 0xa, 0xbe, 0x10, 0x1, 0x38, 0x5, 0x7e, 0xa0, 0x1, + 0x80, 0x31, 0xbe, 0x20, 0x2, 0x38, 0xa, 0xbe, 0x10, 0x2, 0x38, 0x5, 0x7e, + 0x40, 0x2, 0x80, 0x10, 0x30, 0x1, 0xd, 0xbe, 0x20, 0x3, 0x38, 0x8, 0xbe, + 0x10, 0x3, 0x38, 0x3, 0x7e, 0x40, 0x3, 0xbc, 0x4a, 0x50, 0x2, 0x7c, 0xa4, + 0xb, 0x30, 0x7e, 0x3, 0x67, 0x62, 0xbc, 0x3, 0x28, 0x2, 0xa1, 0xf9, 0x7c, + 0xba, 0xda, 0x79, 0x22, 0xca, 0xf8, 0x7c, 0xfb, 0x7a, 0x1d, 0x33, 0x7a, 0xd, + 0x2f, 0x7e, 0x18, 0xe, 0x40, 0x7a, 0x1d, 0x37, 0x12, 0xb, 0xc0, 0x7e, 0xb3, + 0x9b, 0x5, 0xb4, 0x1, 0x3, 0x12, 0x26, 0x94, 0x7e, 0xd, 0x2f, 0x7e, 0x1d, + 0x37, 0x12, 0x27, 0x36, 0x20, 0x3, 0xd, 0x7e, 0xb3, 0x9b, 0x7f, 0x70, 0x11, + 0x7e, 0xb3, 0x9b, 0xaf, 0xb4, 0x1, 0xa, 0x7e, 0x18, 0x13, 0x60, 0x7e, 0xd, + 0x33, 0x12, 0x27, 0x36, 0x7e, 0xd, 0x2f, 0x74, 0x8, 0xac, 0xbf, 0x12, 0x27, + 0x7b, 0x20, 0x3, 0xd, 0x7e, 0xb3, 0x9b, 0x7f, 0x70, 0x11, 0x7e, 0xb3, 0x9b, + 0xaf, 0xb4, 0x1, 0xa, 0x7e, 0xd, 0x33, 0x74, 0x8, 0xac, 0xbf, 0x12, 0x27, + 0x7b, 0xda, 0xf8, 0x22, 0xe4, 0x7a, 0xb3, 0x67, 0x77, 0x12, 0xcf, 0x12, + 0xe4, 0x12, 0x0, 0x2a, 0x7e, 0xb3, 0x2e, 0x74, 0xb4, 0x1, 0x8, 0x7e, 0x73, + 0x67, 0x62, 0x7a, 0x73, 0x67, 0x76, 0x22, 0x6c, 0xaa, 0x80, 0x9, 0xe4, 0xa, + 0x4a, 0x19, 0xb4, 0x65, 0xd8, 0xb, 0xa0, 0x7e, 0xb3, 0x39, 0xf7, 0xc4, 0x23, + 0x54, 0x1f, 0xa, 0x2b, 0xb, 0x24, 0xa, 0x3a, 0xbd, 0x32, 0x48, 0xe5, 0x12, + 0xaf, 0xa2, 0x6d, 0x33, 0x7a, 0x37, 0x67, 0x64, 0x7a, 0x37, 0x67, 0x66, + 0x7a, 0x37, 0x67, 0x68, 0x7a, 0x37, 0x67, 0x6c, 0x7e, 0xd4, 0x92, 0x0, 0x1e, + 0xd4, 0x3e, 0xd4, 0x6d, 0xcc, 0x7e, 0x1f, 0x2d, 0x2e, 0x7a, 0x37, 0x92, + 0x40, 0x7d, 0x3d, 0x7a, 0x37, 0x92, 0x44, 0x7e, 0x34, 0x2d, 0x82, 0x7a, + 0x37, 0x92, 0x42, 0x7e, 0x73, 0x82, 0xc, 0x7a, 0x73, 0x92, 0x3d, 0x7e, 0x73, + 0x82, 0xd, 0x7a, 0x73, 0x92, 0x3c, 0x7e, 0x37, 0x81, 0xef, 0x7a, 0x37, 0x92, + 0x46, 0x7e, 0x37, 0x81, 0xf1, 0x7a, 0x37, 0x92, 0x48, 0x7e, 0x37, 0x81, + 0xf9, 0x7a, 0x37, 0x92, 0x4a, 0x7e, 0x37, 0x81, 0xfb, 0x7a, 0x37, 0x92, + 0x4c, 0x7e, 0x73, 0x39, 0xf7, 0xa, 0x37, 0x1b, 0x34, 0x7a, 0x73, 0x92, 0x3e, + 0x7e, 0x73, 0x39, 0xf8, 0x7a, 0x73, 0x92, 0x3f, 0x7e, 0x8, 0x92, 0x3c, 0x7e, + 0x18, 0x92, 0x4e, 0x12, 0x29, 0x6b, 0x7e, 0x73, 0x92, 0x4e, 0x7a, 0x73, + 0x67, 0x62, 0x7e, 0x73, 0x92, 0x4f, 0x7a, 0x73, 0x67, 0x63, 0x7e, 0x37, + 0x92, 0x50, 0x7a, 0x37, 0x67, 0x64, 0x7e, 0x37, 0x92, 0x52, 0x7a, 0x37, + 0x67, 0x66, 0x7e, 0x37, 0x92, 0x58, 0x7a, 0x37, 0x67, 0x68, 0x7e, 0x37, + 0x92, 0x5a, 0x7d, 0x23, 0x7a, 0x53, 0x67, 0x6a, 0xa, 0x36, 0x7a, 0x73, 0x67, + 0x6b, 0x7e, 0x37, 0x92, 0x54, 0x7a, 0x37, 0x67, 0x6c, 0x7e, 0x37, 0x92, + 0x56, 0x7d, 0x23, 0x7a, 0x53, 0x67, 0x6e, 0xa, 0x36, 0x7a, 0x73, 0x67, 0x6f, + 0x6c, 0xaa, 0x80, 0x3c, 0x7c, 0xba, 0xc4, 0x23, 0x54, 0x1f, 0x7c, 0x7b, + 0x7c, 0xba, 0x54, 0x7, 0x7e, 0x44, 0x0, 0x1, 0x60, 0x5, 0x3e, 0x44, 0x14, + 0x78, 0xfb, 0x7c, 0x69, 0xa, 0x27, 0x12, 0x67, 0xd9, 0x4c, 0xb6, 0x7a, 0x29, + 0xb0, 0x7e, 0x50, 0x2, 0xac, 0x5a, 0x49, 0x12, 0x2d, 0x82, 0xa, 0x2, 0x7c, + 0xb1, 0x19, 0xb2, 0x65, 0x60, 0x7c, 0xb3, 0x19, 0xb2, 0x65, 0x61, 0xb, 0xa0, + 0x7e, 0xb3, 0x67, 0x62, 0xbc, 0xba, 0x38, 0xbc, 0x6c, 0xaa, 0x80, 0x1c, + 0x7e, 0x90, 0x2, 0xac, 0x9a, 0x7f, 0x16, 0x2d, 0x34, 0xb, 0x1a, 0x30, 0xa, + 0x26, 0x7c, 0xb5, 0x19, 0xb4, 0x65, 0x9c, 0x7c, 0xb7, 0x19, 0xb4, 0x65, + 0x9d, 0xb, 0xa0, 0x7e, 0xb3, 0x67, 0x63, 0xbc, 0xba, 0x38, 0xdc, 0x22, 0xe4, + 0x7a, 0xb3, 0x3, 0xc9, 0x22, 0xca, 0xf8, 0x7e, 0xb3, 0x69, 0x69, 0xbe, 0xb0, + 0x1, 0x38, 0x9, 0x7e, 0xa3, 0x69, 0x6a, 0xbe, 0xa0, 0x1, 0x28, 0x4, 0xd2, + 0x36, 0x80, 0x7, 0x30, 0x36, 0x4, 0x70, 0x2, 0xc2, 0x36, 0x7e, 0xb3, 0x59, + 0x8b, 0x70, 0xe, 0x6d, 0x33, 0x7a, 0x37, 0x9a, 0x21, 0x12, 0xd1, 0x11, 0x12, + 0xd0, 0x76, 0x80, 0x5f, 0x12, 0xd1, 0x2b, 0x12, 0xd5, 0x8e, 0x50, 0xa, 0x12, + 0xd3, 0x7d, 0x7c, 0xab, 0x12, 0xd1, 0x11, 0x80, 0x5, 0x12, 0xd4, 0x1e, 0x7c, + 0xab, 0xbe, 0xa0, 0x30, 0x68, 0x5, 0xbe, 0xa0, 0x57, 0x78, 0x24, 0x12, 0xd1, + 0x21, 0x49, 0x23, 0x96, 0x5c, 0x7e, 0x37, 0x96, 0x60, 0x12, 0xd1, 0x17, 0x8, + 0x2, 0x6c, 0xaa, 0x12, 0xd1, 0x21, 0x49, 0x23, 0x96, 0x5e, 0x7e, 0x37, 0x96, + 0x62, 0x12, 0xd1, 0x17, 0x8, 0x2, 0x6c, 0xaa, 0x30, 0x36, 0x2, 0x6c, 0xaa, + 0x4c, 0xaa, 0x68, 0x11, 0x7e, 0xf0, 0xff, 0x4c, 0xff, 0x68, 0xa, 0x7a, 0xa3, + 0x59, 0x8e, 0x74, 0x1, 0x7a, 0xb3, 0x69, 0x6f, 0xda, 0xf8, 0x22, 0xe4, 0x7a, + 0xb3, 0x9a, 0x23, 0x22, 0x9d, 0x32, 0x12, 0x0, 0xa3, 0xbe, 0x34, 0x1, 0x90, + 0x22, 0x7e, 0x63, 0x9a, 0x4b, 0x7e, 0x70, 0x4, 0xac, 0x67, 0x22, 0xca, 0xf8, + 0x7e, 0x53, 0x69, 0x69, 0x7c, 0xa5, 0x7e, 0x63, 0x69, 0x6a, 0x7c, 0x76, + 0xbe, 0xa0, 0x1, 0x38, 0xa, 0x7e, 0x17, 0x67, 0x64, 0xbe, 0x14, 0x0, 0x1e, + 0x28, 0xa, 0x7e, 0x17, 0x96, 0x58, 0x4d, 0x11, 0x78, 0x2, 0x80, 0x34, 0xa5, + 0xbd, 0x1, 0x14, 0xa5, 0xbe, 0x1, 0x10, 0x7e, 0x27, 0x9a, 0x21, 0xbe, 0x24, + 0xea, 0x60, 0x50, 0x6, 0xb, 0x24, 0x7a, 0x27, 0x9a, 0x21, 0x7e, 0xb3, 0x67, + 0x62, 0x70, 0x6, 0x6d, 0x22, 0x7a, 0x27, 0x9a, 0x21, 0x7e, 0xf3, 0x9a, 0x23, + 0x4c, 0xff, 0x68, 0xc, 0x7e, 0x27, 0x96, 0x58, 0x4d, 0x22, 0x78, 0x4, 0xd2, + 0x10, 0x80, 0x47, 0x4c, 0xaa, 0x78, 0x34, 0xa5, 0xbf, 0x1, 0x30, 0x7e, 0x37, + 0x96, 0x58, 0x7a, 0x37, 0x9a, 0x25, 0x7e, 0xb3, 0x9a, 0x23, 0xb4, 0x3, 0x1f, + 0x7e, 0x37, 0x96, 0x58, 0xbe, 0x34, 0x0, 0x0, 0x28, 0x26, 0x74, 0x4, 0x7a, + 0xb3, 0x9a, 0x23, 0x7e, 0x37, 0x9a, 0x3b, 0x7e, 0x27, 0x9a, 0x3d, 0x12, + 0xd2, 0x54, 0x41, 0x4d, 0x80, 0x11, 0x80, 0xf, 0x7e, 0xc7, 0x68, 0x15, 0x7e, + 0xd7, 0x68, 0x17, 0x7e, 0xb3, 0x68, 0x19, 0xb4, 0x1, 0x5, 0x12, 0xd5, 0x99, + 0x80, 0x77, 0x4c, 0xff, 0x78, 0x1b, 0xa5, 0xbf, 0x0, 0x43, 0xbe, 0xa0, 0x1, + 0x78, 0x3e, 0x7d, 0x3c, 0x7d, 0x2d, 0x12, 0xd3, 0xc1, 0x12, 0xd2, 0x50, + 0x74, 0x1, 0x7a, 0xb3, 0x9a, 0x23, 0x80, 0x2c, 0xbe, 0xf0, 0x1, 0x78, 0x1a, + 0x12, 0xd3, 0x74, 0xbe, 0x37, 0x76, 0xa3, 0x38, 0x9, 0x12, 0xd2, 0xff, 0xbe, + 0x37, 0x76, 0xa5, 0x28, 0x15, 0x74, 0x3, 0x7a, 0xb3, 0x9a, 0x23, 0x80, 0x5, + 0xbe, 0xf0, 0x3, 0x78, 0x8, 0x7a, 0xc7, 0x9a, 0x3b, 0x7a, 0xd7, 0x9a, 0x3d, + 0x7e, 0xb3, 0x9a, 0x23, 0x60, 0x26, 0x7d, 0x3c, 0x7d, 0x2d, 0x7e, 0x17, + 0x96, 0x5c, 0x7e, 0x7, 0x96, 0x5e, 0x12, 0xd3, 0x8d, 0xa, 0x2b, 0x7e, 0x73, + 0x9a, 0x20, 0xa, 0x37, 0xbd, 0x32, 0x58, 0xb, 0x12, 0xd2, 0x50, 0x7a, 0xc7, + 0x96, 0x5c, 0x7a, 0xd7, 0x96, 0x5e, 0xda, 0xf8, 0x22, 0x7d, 0x3c, 0x7d, + 0x2d, 0x7d, 0x42, 0x7d, 0x13, 0x7d, 0x24, 0x12, 0xd5, 0xa5, 0x7d, 0x31, + 0x12, 0xd3, 0x8, 0x2, 0xd2, 0x65, 0x7e, 0x3, 0x9a, 0x4b, 0xbe, 0x0, 0xf0, + 0x50, 0x2, 0x41, 0xfe, 0x41, 0xf3, 0x6c, 0x99, 0x7e, 0xb3, 0x9a, 0x20, 0xbe, + 0xb0, 0x20, 0x50, 0x5, 0x4, 0x7a, 0xb3, 0x9a, 0x20, 0x7e, 0x1f, 0x96, 0x60, + 0x7a, 0x1f, 0x91, 0xfe, 0x7e, 0x80, 0x1, 0x80, 0x49, 0x74, 0x4, 0xac, 0xb8, + 0x49, 0x35, 0x96, 0x60, 0x49, 0x25, 0x96, 0x62, 0x7e, 0x17, 0x91, 0xfe, + 0x7e, 0x7, 0x92, 0x0, 0x12, 0xd3, 0x8d, 0x7c, 0x1b, 0x7e, 0x3, 0x9a, 0x20, + 0xbc, 0x1, 0x38, 0x26, 0xb, 0x90, 0x7e, 0x70, 0x4, 0xac, 0x78, 0x2e, 0x34, + 0x96, 0x60, 0x7e, 0x14, 0x91, 0xfe, 0x74, 0x4, 0x12, 0x1, 0xf3, 0x7e, 0x34, + 0x91, 0xfe, 0x7e, 0x30, 0x4, 0xac, 0x39, 0x2e, 0x14, 0x96, 0x60, 0x74, 0x4, + 0x12, 0x1, 0xf3, 0xb, 0x80, 0x7e, 0x3, 0x9a, 0x4b, 0xbc, 0x8, 0x38, 0xaf, + 0xa, 0x59, 0xb, 0x54, 0x7c, 0xb, 0x7a, 0x3, 0x9a, 0x4b, 0x7e, 0x3, 0x9a, + 0x20, 0xbe, 0x0, 0x20, 0x50, 0xb, 0x7e, 0x3, 0x9a, 0x4b, 0xbe, 0x0, 0xec, + 0x40, 0x2, 0x41, 0x72, 0x22, 0x7e, 0x37, 0x9a, 0x39, 0x9e, 0x37, 0x9a, 0x31, + 0x22, 0x7e, 0x17, 0x9a, 0x33, 0xbd, 0x13, 0x28, 0xa, 0x7a, 0x37, 0x9a, 0x33, + 0x7a, 0x27, 0x9a, 0x35, 0x80, 0x10, 0x7e, 0x17, 0x9a, 0x2b, 0xbd, 0x13, + 0x50, 0x8, 0x7a, 0x37, 0x9a, 0x2b, 0x7a, 0x27, 0x9a, 0x2d, 0x7e, 0x17, 0x9a, + 0x31, 0xbd, 0x12, 0x28, 0xa, 0x7a, 0x27, 0x9a, 0x31, 0x7a, 0x37, 0x9a, 0x2f, + 0x80, 0x10, 0x7e, 0x17, 0x9a, 0x39, 0xbd, 0x12, 0x50, 0x8, 0x7a, 0x27, 0x9a, + 0x39, 0x7a, 0x37, 0x9a, 0x37, 0x7e, 0xb3, 0x9a, 0x4b, 0xb4, 0xa, 0xf, 0x12, + 0xd3, 0x74, 0x7a, 0x37, 0x9a, 0x43, 0x12, 0xd2, 0xff, 0x7a, 0x37, 0x9a, + 0x45, 0x22, 0xb4, 0x14, 0xe, 0x12, 0xd3, 0x74, 0x7a, 0x37, 0x9a, 0x47, 0x12, + 0xd2, 0xff, 0x7a, 0x37, 0x9a, 0x49, 0x22, 0x7e, 0x37, 0x9a, 0x2b, 0x9e, + 0x37, 0x9a, 0x33, 0x22, 0x12, 0xd3, 0x74, 0x7a, 0x37, 0x9a, 0x3f, 0x12, + 0xd2, 0xff, 0x7a, 0x37, 0x9a, 0x41, 0xe4, 0x22, 0x7d, 0x51, 0x7d, 0x12, + 0x7d, 0x23, 0x9d, 0x25, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x4, 0x7d, 0x52, 0x80, + 0x4, 0x6d, 0x55, 0x9d, 0x52, 0x7c, 0xab, 0x7d, 0x21, 0x9d, 0x20, 0xbe, 0x24, + 0x0, 0x0, 0x8, 0x4, 0x7d, 0x32, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x32, 0x7c, + 0xb7, 0xbc, 0xba, 0x50, 0x3, 0x7c, 0xba, 0x22, 0x22, 0x7d, 0xf2, 0x7d, 0xe3, + 0x7e, 0x8, 0x9a, 0x23, 0x12, 0xd5, 0x86, 0x7e, 0x8, 0x96, 0x60, 0x7e, 0x34, + 0x3, 0xc0, 0x12, 0x0, 0x2e, 0x7a, 0xb3, 0x59, 0x8e, 0x7e, 0x37, 0x76, 0xa7, + 0x7a, 0x37, 0x96, 0x58, 0x7a, 0xe7, 0x9a, 0x27, 0x7a, 0xf7, 0x9a, 0x29, + 0x7a, 0xe7, 0x9a, 0x2b, 0x7a, 0xe7, 0x9a, 0x2f, 0x7a, 0xe7, 0x9a, 0x33, + 0x7a, 0xe7, 0x9a, 0x37, 0x7a, 0xf7, 0x9a, 0x2d, 0x7a, 0xf7, 0x9a, 0x31, + 0x7a, 0xf7, 0x9a, 0x35, 0x7a, 0xf7, 0x9a, 0x39, 0x7a, 0xe7, 0x96, 0x5c, + 0x7a, 0xf7, 0x96, 0x5e, 0x7a, 0xb3, 0x9a, 0x4b, 0x74, 0x2, 0x7a, 0xb3, 0x9a, + 0x20, 0x22, 0xca, 0x79, 0x6c, 0xaa, 0x6d, 0xff, 0x7d, 0x4f, 0x7d, 0xf, 0x7e, + 0xe3, 0x69, 0x69, 0x7e, 0xf3, 0x69, 0x6a, 0x7e, 0xb3, 0x3, 0xc9, 0x60, 0x18, + 0x7e, 0x17, 0x3, 0xd2, 0x4d, 0x11, 0x78, 0x2, 0xa1, 0x7, 0xbe, 0xe0, 0x1, + 0x28, 0x2, 0xa1, 0x7, 0x30, 0x35, 0x6, 0xc2, 0x35, 0xa1, 0x7, 0xc2, 0x35, + 0xbe, 0xe0, 0x1, 0x78, 0x1d, 0xbe, 0xb0, 0x4, 0x78, 0x2, 0xa1, 0x7, 0x7e, + 0x47, 0x68, 0x15, 0x7e, 0x7, 0x68, 0x17, 0x7d, 0x34, 0x7d, 0x20, 0x12, 0xd5, + 0xca, 0xbe, 0xb0, 0x1, 0x78, 0x2, 0xa1, 0x7, 0x7e, 0x73, 0x3, 0xc9, 0x7c, + 0xb7, 0x14, 0x68, 0x2f, 0x14, 0x68, 0x55, 0x14, 0x68, 0x29, 0x14, 0x78, 0x2, + 0xa1, 0x4, 0xb, 0xb2, 0x78, 0x7d, 0xbe, 0xe0, 0x1, 0x68, 0x2, 0xa1, 0x16, + 0x4c, 0xff, 0x68, 0x2, 0xa1, 0x16, 0x74, 0x1, 0x7a, 0xb3, 0x3, 0xc9, 0x12, + 0xd5, 0x24, 0x7e, 0x27, 0x76, 0x7d, 0x7a, 0x27, 0x3, 0xd2, 0x80, 0x6c, 0x4c, + 0xee, 0x78, 0x17, 0xa5, 0xbf, 0x1, 0x7, 0x74, 0x2, 0x12, 0xd5, 0x1b, 0x80, + 0x45, 0x74, 0x4, 0x7a, 0xb3, 0x3, 0xc9, 0x7e, 0x37, 0x76, 0x81, 0x80, 0x39, + 0x12, 0xd5, 0x2d, 0x7e, 0xb3, 0x76, 0x70, 0x12, 0xd5, 0x36, 0x68, 0x36, + 0x80, 0x43, 0xbe, 0xe0, 0x1, 0x78, 0x3e, 0x4c, 0xff, 0x78, 0x3a, 0x12, 0xd5, + 0x2d, 0x7e, 0x17, 0x76, 0x7d, 0x9e, 0x17, 0x76, 0x79, 0xbe, 0x17, 0x3, 0xd2, + 0x40, 0x1a, 0x7e, 0xb3, 0x76, 0x6f, 0x12, 0xd5, 0x36, 0x68, 0x11, 0x12, + 0xd5, 0x24, 0x74, 0x3, 0x12, 0xd5, 0x1b, 0x7a, 0x37, 0x3, 0xd2, 0x80, 0x12, + 0x7e, 0xa0, 0x24, 0xe4, 0x7a, 0xb3, 0x3, 0xc9, 0x6d, 0x33, 0x7a, 0x37, 0x3, + 0xd2, 0x7c, 0xba, 0x80, 0x2, 0x7c, 0xba, 0xda, 0x79, 0x22, 0x7a, 0xb3, 0x3, + 0xc9, 0x7e, 0x37, 0x76, 0x7d, 0x22, 0x7a, 0x47, 0x3, 0xca, 0x7a, 0x7, 0x3, + 0xcc, 0x22, 0x7a, 0x47, 0x3, 0xce, 0x7a, 0x7, 0x3, 0xd0, 0x22, 0xa, 0x3b, + 0x12, 0xd5, 0x40, 0xa, 0xfb, 0x4d, 0xff, 0x22, 0x7d, 0x23, 0x12, 0x16, 0xfa, + 0x7e, 0x37, 0x3, 0xce, 0x7d, 0x13, 0x9e, 0x17, 0x3, 0xca, 0xbe, 0x14, 0x0, + 0x0, 0x8, 0x6, 0x9e, 0x37, 0x3, 0xca, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x31, + 0xbd, 0x32, 0x38, 0x21, 0x7e, 0x37, 0x3, 0xd0, 0x7d, 0x13, 0x9e, 0x17, 0x3, + 0xcc, 0xbe, 0x14, 0x0, 0x0, 0x8, 0x6, 0x9e, 0x37, 0x3, 0xcc, 0x80, 0x4, + 0x6d, 0x33, 0x9d, 0x31, 0xbd, 0x32, 0x38, 0x3, 0x74, 0x1, 0x22, 0xe4, 0x22, + 0x7e, 0x34, 0x0, 0x28, 0xe4, 0x2, 0x0, 0x2e, 0x7e, 0xb3, 0x9a, 0x23, 0xb4, + 0x4, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0x74, 0xfe, 0x7a, 0xb3, 0x59, 0x8e, 0xe4, + 0x7a, 0xb3, 0x9a, 0x23, 0x22, 0x7e, 0xa3, 0x9a, 0x4b, 0xbe, 0xa0, 0xf0, + 0x50, 0x1b, 0x74, 0x4, 0xa4, 0x59, 0x35, 0x96, 0x60, 0x7e, 0xa3, 0x9a, 0x4b, + 0x74, 0x4, 0xa4, 0x59, 0x25, 0x96, 0x62, 0x7e, 0xb3, 0x9a, 0x4b, 0x4, 0x7a, + 0xb3, 0x9a, 0x4b, 0x22, 0x7d, 0x13, 0x7e, 0x37, 0x76, 0x71, 0xbd, 0x31, + 0x50, 0x1a, 0x7e, 0x37, 0x76, 0x73, 0xbd, 0x31, 0x28, 0x12, 0x7e, 0x37, + 0x76, 0x75, 0xbd, 0x32, 0x50, 0xa, 0x7e, 0x37, 0x76, 0x77, 0xbd, 0x32, 0x28, + 0x2, 0xe4, 0x22, 0x74, 0x1, 0x22, 0x7e, 0x8, 0x96, 0x58, 0x2, 0x5f, 0xf0, + 0x54, 0x3f, 0x5e, 0x70, 0x3f, 0x12, 0xd6, 0x10, 0x59, 0x31, 0x0, 0x32, 0x7e, + 0x37, 0x39, 0xf9, 0x59, 0x23, 0x0, 0x14, 0xa9, 0xc6, 0xcb, 0x22, 0xa9, 0xd6, + 0xcb, 0x7e, 0x14, 0x0, 0x21, 0x7e, 0x7, 0x39, 0xf9, 0x59, 0x10, 0x0, 0x2, + 0x7c, 0x2b, 0x6c, 0x33, 0xa, 0x37, 0x2d, 0x31, 0x7e, 0x17, 0x39, 0xf9, 0x22, + 0x12, 0xd6, 0x10, 0x59, 0x31, 0x0, 0x3e, 0x7e, 0x37, 0x39, 0xf9, 0x59, 0x23, + 0x0, 0x3c, 0x12, 0x2c, 0xc, 0x4e, 0x70, 0x10, 0x1b, 0x28, 0x30, 0xa9, 0xc6, + 0xcb, 0x22, 0x9, 0xb5, 0x9b, 0x28, 0xb, 0xa, 0x30, 0x6c, 0x77, 0x1b, 0xa, + 0x30, 0xa, 0x2b, 0xb, 0x24, 0x2, 0x16, 0xaf, 0xb, 0xa, 0x30, 0x30, 0x2, 0x5, + 0x5e, 0x60, 0xf7, 0x80, 0x3, 0x4e, 0x60, 0x8, 0x1b, 0xa, 0x30, 0x22, 0x2d, + 0x23, 0x3e, 0x24, 0xa, 0x3b, 0x9d, 0x23, 0xe5, 0x2f, 0xa, 0x3b, 0x9d, 0x23, + 0xbe, 0x24, 0x0, 0x0, 0x28, 0x3, 0x12, 0x1a, 0x89, 0x22, 0xb, 0xa, 0x30, + 0x5e, 0x70, 0x3, 0xb4, 0x3, 0x5, 0x4e, 0x70, 0xc, 0x80, 0x6, 0xb4, 0x4, 0x3, + 0x4e, 0x70, 0x10, 0x1b, 0xa, 0x30, 0x22, 0xb, 0xa, 0x30, 0x5e, 0x60, 0xdf, + 0x1b, 0xa, 0x30, 0x30, 0x1, 0x9, 0xb, 0xa, 0x30, 0x4e, 0x60, 0x20, 0x1b, + 0xa, 0x30, 0x22, 0x12, 0xd6, 0xc2, 0x1b, 0xa, 0x30, 0x4e, 0x70, 0x8, 0x1b, + 0xa, 0x30, 0x22, 0x7d, 0x23, 0xb, 0xa, 0x30, 0x5e, 0x34, 0xf8, 0x0, 0x22, + 0x12, 0xd6, 0xb3, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x7d, 0x31, 0x2e, 0x34, + 0x8e, 0x54, 0x6d, 0x22, 0x7a, 0x1d, 0x2f, 0x7e, 0x4, 0x0, 0x12, 0x7a, 0x5, + 0x33, 0x2e, 0x14, 0x8e, 0x58, 0x6d, 0x0, 0x22, 0xb, 0xa, 0x30, 0x12, 0x1f, + 0xff, 0xa2, 0x1, 0xe4, 0x33, 0xa, 0x2b, 0x3e, 0x24, 0x2, 0x16, 0xaf, 0x74, + 0x3, 0xac, 0xbf, 0x9, 0xb5, 0x9b, 0x57, 0xb, 0xa, 0x30, 0x5e, 0x60, 0xf, + 0x1b, 0xa, 0x30, 0xa, 0x5b, 0x12, 0x49, 0x61, 0x2, 0x48, 0xbe, 0x12, 0x1c, + 0xb5, 0x4e, 0x60, 0x80, 0x12, 0xd7, 0x27, 0x4e, 0x70, 0x10, 0x12, 0xd7, + 0x38, 0x2, 0xd7, 0x4e, 0x1b, 0xa, 0x30, 0x7e, 0xf, 0x39, 0xed, 0x2e, 0x14, + 0x0, 0x14, 0xb, 0xa, 0x30, 0x5e, 0x70, 0xfe, 0x1b, 0xa, 0x30, 0x7e, 0xf, + 0x39, 0xed, 0x2e, 0x14, 0x0, 0x26, 0xb, 0xa, 0x30, 0x22, 0x7e, 0xf, 0x39, + 0xe4, 0xb, 0xa, 0x30, 0x5e, 0x70, 0xdf, 0x1b, 0xa, 0x30, 0x22, 0xa9, 0xd6, + 0xca, 0x22, 0x7e, 0x34, 0x0, 0x1e, 0x7e, 0x8, 0x8d, 0xb2, 0x7e, 0x24, 0x0, + 0x22, 0x12, 0x17, 0x8f, 0x7e, 0x34, 0x0, 0x20, 0x7e, 0x27, 0x8d, 0xf6, 0x12, + 0x12, 0x79, 0x7e, 0x34, 0x0, 0x21, 0x7e, 0x27, 0x8d, 0xf8, 0x12, 0x12, 0x79, + 0x7e, 0x34, 0x0, 0x39, 0x7e, 0x8, 0x8d, 0xfa, 0x7e, 0x24, 0x0, 0x3, 0x22, + 0x7a, 0x37, 0x8d, 0xf6, 0x7e, 0x37, 0x82, 0x3f, 0x7a, 0x37, 0x8d, 0xf8, + 0x7e, 0x34, 0x43, 0x21, 0x7a, 0x37, 0x8d, 0xfa, 0x7e, 0x34, 0x23, 0x45, + 0x7a, 0x37, 0x8d, 0xfc, 0x7e, 0x34, 0x12, 0x5, 0x7a, 0x37, 0x8d, 0xfe, 0xc2, + 0x8, 0x12, 0x15, 0x16, 0x7e, 0xb3, 0x9b, 0x7f, 0x22, 0x7e, 0x2f, 0x39, 0xf1, + 0xb, 0x2a, 0x30, 0x5e, 0x70, 0xfd, 0x1b, 0x2a, 0x30, 0x7e, 0x34, 0x0, 0x1, + 0x7e, 0x2f, 0x39, 0xf1, 0x79, 0x32, 0x0, 0x4, 0x7e, 0x2f, 0x39, 0xf1, 0xb, + 0x2a, 0x30, 0x22, 0x7d, 0xf3, 0x3e, 0xf4, 0x2d, 0xf1, 0x7d, 0xe0, 0xb, 0x7a, + 0xd0, 0x7d, 0xc3, 0x3e, 0xc4, 0x7f, 0x72, 0x2d, 0xfc, 0x1b, 0x7a, 0xd0, 0xb, + 0x34, 0x22, 0x12, 0x0, 0x16, 0x7d, 0x3e, 0x2e, 0x34, 0x0, 0x7, 0x74, 0x3c, + 0xac, 0xbf, 0x49, 0x25, 0x8e, 0x36, 0x12, 0x12, 0x86, 0xb, 0xf0, 0xbe, 0xf0, + 0x4, 0x22, 0x7f, 0x70, 0x7d, 0x12, 0xd2, 0xcc, 0x7e, 0x4, 0x0, 0x3, 0x7e, + 0x2f, 0x39, 0xe8, 0x1b, 0x2a, 0x0, 0x7e, 0x2f, 0x39, 0xe8, 0x79, 0x32, 0x0, + 0x6, 0x22, 0x3e, 0x24, 0x7e, 0xf, 0x8f, 0x18, 0x2d, 0x12, 0x69, 0x30, 0x0, + 0x1a, 0x59, 0x32, 0x3a, 0x0, 0xa, 0x1f, 0xad, 0x1b, 0x7d, 0x1, 0x22, 0x7e, + 0xf, 0x39, 0xed, 0xb, 0x16, 0xb, 0xa, 0x30, 0x4e, 0x60, 0x10, 0x1b, 0xa, + 0x30, 0x22, 0x7e, 0x2f, 0x39, 0xe8, 0x69, 0x32, 0x0, 0x4, 0x5e, 0x34, 0x0, + 0x2, 0x22, 0x12, 0x17, 0x8f, 0x7d, 0x3b, 0x2e, 0x34, 0x0, 0xb, 0x7e, 0x30, + 0x6, 0xac, 0x3f, 0x2e, 0x14, 0x8d, 0x9a, 0x6d, 0x0, 0x22, 0x2d, 0xcd, 0x6d, + 0xdd, 0x7a, 0xd5, 0x34, 0x7e, 0xd7, 0x76, 0x1b, 0x1b, 0xd4, 0x7a, 0xd5, + 0x36, 0x6d, 0xdd, 0xbd, 0xdc, 0x22, 0x74, 0x2, 0xa, 0xdc, 0x19, 0xbd, 0x36, + 0x98, 0x22, 0x74, 0x3, 0x12, 0x14, 0xcb, 0x7d, 0x37, 0x2e, 0x34, 0x0, 0x9, + 0x22, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x2a, 0x7e, 0x34, 0x0, 0x20, 0x7e, + 0x27, 0x3f, 0x2a, 0x22, 0xe4, 0x7a, 0xb3, 0x39, 0xec, 0x7e, 0x2f, 0x39, + 0xf1, 0x69, 0x32, 0x0, 0x4, 0x5e, 0x34, 0x0, 0x1, 0x22, 0x74, 0x8, 0xa4, + 0x7d, 0xf5, 0xb, 0xf6, 0x74, 0xee, 0xac, 0xbf, 0x7d, 0xe5, 0x2e, 0xe4, 0x1, + 0x0, 0x22, 0x2e, 0x7, 0x91, 0xfe, 0x3e, 0x4, 0x7e, 0x1f, 0x8f, 0x18, 0x2d, + 0x30, 0xb, 0x1a, 0x30, 0x7d, 0x21, 0x22, 0x7e, 0x63, 0x37, 0xe1, 0x7e, 0x70, + 0xee, 0xac, 0x67, 0x2e, 0x34, 0x1, 0x0, 0x2e, 0x34, 0x0, 0x1e, 0x22, 0x2d, + 0xbd, 0x7e, 0xd7, 0x76, 0x29, 0x1b, 0xd4, 0x7a, 0xd5, 0x36, 0x7e, 0xd5, + 0x34, 0xbd, 0xdb, 0x22, 0xe5, 0xc3, 0x7a, 0xb3, 0x37, 0xe3, 0xe5, 0xc3, + 0x54, 0xf8, 0x4e, 0xb3, 0x37, 0xe2, 0xf5, 0xc3, 0x22, 0x12, 0x14, 0xc4, + 0x7a, 0x37, 0x3f, 0x2c, 0x7e, 0x34, 0x0, 0x20, 0x7e, 0x27, 0x3f, 0x2c, 0x22, + 0x7d, 0x36, 0x12, 0xd, 0x20, 0x7d, 0x27, 0x3e, 0x24, 0x22, 0x7e, 0x18, 0x18, + 0x80, 0x7a, 0x1d, 0x41, 0x7e, 0xd, 0x33, 0x7e, 0x18, 0x18, 0x80, 0x22, 0x7e, + 0x18, 0xe, 0x40, 0x7a, 0x1d, 0x39, 0x7e, 0xd, 0x2f, 0x7e, 0x18, 0xe, 0x40, + 0x22, 0xa2, 0x0, 0x92, 0x3, 0x7e, 0xf, 0x2d, 0x2a, 0x7e, 0x18, 0x22, 0xc0, + 0x7c, 0xbf, 0x22, 0x7e, 0x50, 0xd, 0xac, 0x5f, 0x2d, 0x2a, 0xb, 0x28, 0x30, + 0x49, 0x22, 0x0, 0x2, 0x22, 0x7d, 0x3f, 0x2e, 0x34, 0x0, 0x18, 0x74, 0x3c, + 0xac, 0xbf, 0x49, 0x25, 0x8e, 0x58, 0x22, 0x7d, 0x3f, 0x2e, 0x34, 0x0, 0x16, + 0x74, 0x3c, 0xac, 0xbf, 0x49, 0x25, 0x8e, 0x54, 0x22, 0x7e, 0x34, 0x9a, + 0x57, 0x7e, 0x14, 0x0, 0x45, 0x74, 0xb, 0x2, 0x1, 0xf3, 0x7e, 0xb, 0xa0, + 0x7c, 0x4a, 0x6c, 0x55, 0x29, 0xa0, 0x0, 0x1, 0xa, 0x3a, 0x22, 0x74, 0xee, + 0xac, 0xbf, 0x7d, 0xb5, 0x2e, 0xb4, 0x1, 0x0, 0x22, 0x7e, 0x37, 0x92, 0x9a, + 0x7e, 0x27, 0x92, 0x9c, 0x22, 0x74, 0x17, 0xa4, 0x7e, 0x1d, 0x2e, 0x2d, + 0x35, 0x22, 0x7e, 0x34, 0x0, 0x2, 0x7e, 0x2f, 0x39, 0xe8, 0x79, 0x32, 0x0, + 0x4, 0x22, 0x7e, 0x18, 0x13, 0x60, 0x7a, 0x1f, 0x2d, 0x26, 0x7e, 0x18, 0x22, + 0xc0, 0x22, 0xac, 0x67, 0x2e, 0x34, 0x9b, 0x23, 0x6d, 0x22, 0x7e, 0x8, 0x9a, + 0xed, 0x22, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x8e, 0x54, 0x6d, 0x0, + 0x22, 0xc2, 0x1b, 0xc2, 0x1a, 0x7e, 0xb3, 0x9b, 0xa8, 0xbe, 0xb0, 0x1, 0x22, + 0xe4, 0xa, 0xde, 0x19, 0xbd, 0x36, 0x8e, 0x19, 0xbd, 0x36, 0x98, 0x22, 0x1e, + 0x4, 0xe5, 0x3a, 0xa, 0x1b, 0xad, 0x10, 0x7a, 0x15, 0x2a, 0x22, 0x7e, 0x34, + 0x0, 0x32, 0x2, 0x26, 0x98, 0x7c, 0x8b, 0x74, 0x8, 0xac, 0xb8, 0x9, 0x95, + 0x9b, 0x27, 0x22, 0x7e, 0xb3, 0x9a, 0xbc, 0x44, 0x80, 0x7a, 0xb3, 0x9a, + 0xbc, 0x22, 0xc2, 0xac, 0x7e, 0xf, 0x39, 0xed, 0x22, 0x7e, 0xf, 0x2d, 0x2a, + 0x2d, 0x12, 0xb, 0xa, 0x20, 0x22, 0x2e, 0x14, 0x8e, 0x34, 0x6d, 0x0, 0x22, + 0x7c, 0xbf, 0x7c, 0x78, 0x12, 0x2e, 0x40, 0xbd, 0x3e, 0x22, 0x6d, 0x33, + 0x7a, 0x37, 0x37, 0xda, 0x22, 0x6d, 0x33, 0x7a, 0x37, 0x38, 0x98, 0x22, + 0x7d, 0x36, 0x12, 0x14, 0xc4, 0x7d, 0x27, 0x3e, 0x24, 0x22, 0x74, 0x1, 0x12, + 0x48, 0xaf, 0x7e, 0x8, 0x3f, 0x26, 0x22, 0x7e, 0xb3, 0x9b, 0x7f, 0xd2, 0x2e, + 0xd2, 0x2d, 0x22, 0x7e, 0xf, 0x39, 0xed, 0x2e, 0x14, 0x0, 0x12, 0x22, 0x3e, + 0x34, 0x2e, 0x34, 0xb0, 0x0, 0x6d, 0x22, 0x22, 0x3e, 0x34, 0x2e, 0x34, 0xa0, + 0x0, 0x6d, 0x22, 0x22, 0x7d, 0xf3, 0x3e, 0xf4, 0x2d, 0xf5, 0x7d, 0xe4, 0x22, + 0xb, 0x16, 0xb, 0xa, 0x30, 0x5e, 0x60, 0xef, 0x22, 0x7e, 0x8, 0x8d, 0xf6, + 0x7e, 0x18, 0x8d, 0xc4, 0x22, 0x7e, 0x8, 0x8d, 0xb6, 0x7e, 0x18, 0x8d, 0xc4, + 0x22, 0x74, 0x8, 0xac, 0xbe, 0x9, 0xf5, 0x9b, 0x27, 0x22, 0x7e, 0xf, 0x39, + 0xe4, 0x79, 0x30, 0x0, 0x6, 0x22, 0x7e, 0xd7, 0x92, 0xc6, 0xbe, 0xd4, 0x0, + 0x1e, 0x22, 0x7e, 0x37, 0x92, 0x96, 0xbe, 0x34, 0x0, 0x14, 0x22, 0x7e, 0x34, + 0x0, 0x17, 0xe4, 0x2, 0x0, 0x2e, 0x7e, 0x8, 0x1, 0x0, 0x7e, 0x34, 0x0, 0xa, + 0x22, 0x74, 0x8, 0xac, 0xbf, 0x9, 0x75, 0x9b, 0x23, 0x22, 0x7e, 0xb3, 0x9a, + 0xe8, 0x7e, 0x73, 0x9b, 0xae, 0x22, 0x7e, 0x34, 0x3a, 0x0, 0x7a, 0x37, 0x38, + 0x94, 0x22, 0x7e, 0x1f, 0x2d, 0x2e, 0x7a, 0x37, 0x38, 0x92, 0x22, 0x7e, + 0x34, 0x0, 0x19, 0x7e, 0x27, 0x3f, 0x5a, 0x22, 0x7e, 0x34, 0x0, 0x18, 0x7e, + 0x27, 0x3f, 0x58, 0x22, 0x7e, 0x34, 0x0, 0x16, 0x7e, 0x27, 0x3f, 0x52, 0x22, + 0x7e, 0x34, 0x0, 0x14, 0x7e, 0x27, 0x3f, 0x46, 0x22, 0x7e, 0x34, 0x0, 0x21, + 0x7e, 0x27, 0x3f, 0x4e, 0x22, 0x7e, 0x34, 0x0, 0x21, 0x7e, 0x27, 0x3f, 0x4c, + 0x22, 0x7e, 0x34, 0x0, 0x26, 0x7e, 0x27, 0x3f, 0x30, 0x22, 0x7e, 0x34, 0x0, + 0x1b, 0x7e, 0x27, 0x3f, 0x44, 0x22, 0x7e, 0x34, 0x0, 0x28, 0x7e, 0x27, 0x3f, + 0x34, 0x22, 0x7e, 0x34, 0x0, 0x2a, 0x7e, 0x27, 0x3f, 0x38, 0x22, 0x7e, 0x34, + 0x0, 0x1, 0x7e, 0x27, 0x3f, 0x36, 0x22, 0x7e, 0x34, 0x0, 0x27, 0x7e, 0x27, + 0x3f, 0x32, 0x22, 0x7e, 0x34, 0x0, 0x25, 0x7e, 0x27, 0x3f, 0x2e, 0x22, 0x7e, + 0x34, 0x0, 0x1f, 0x7e, 0x27, 0x3f, 0x76, 0x22, 0x7e, 0x34, 0x1, 0x35, 0x7e, + 0x8, 0x91, 0xfe, 0x22, 0x4e, 0x70, 0x1, 0x1b, 0x2a, 0x30, 0xe4, 0x22, 0x7e, + 0xb3, 0x9a, 0x7b, 0xbe, 0xb0, 0x1, 0x22, 0x7e, 0x37, 0x75, 0x94, 0x2, 0x32, + 0x9d, 0x7e, 0x73, 0x9b, 0xb1, 0xbe, 0x70, 0x64, 0x22, 0x7e, 0xd5, 0x2a, + 0xbe, 0xd4, 0x0, 0xc8, 0x22, 0x7e, 0x73, 0x92, 0x8f, 0xbe, 0x70, 0xa, 0x22, + 0x49, 0x25, 0x8e, 0x34, 0x2, 0x12, 0x86, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, + 0x1a, 0x22, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x2, 0x22, 0x12, 0xd, 0x10, + 0x7e, 0x34, 0x0, 0x17, 0x22, 0x5e, 0x24, 0x7d, 0xfd, 0x4e, 0x40, 0x58, 0x22, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x4d, + 0x18, 0x75, 0xe7, 0x8a, 0x70, 0x8f, 0x0, 0xff, 0xe0, 0x1f, 0x1, 0xaa, 0x48, + 0x63, 0x2, 0xa9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x53, 0x42, 0x32, 0x1, 0xd2, 0x54, + 0x31, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8, + 0x30, 0x30, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x9, 0x9, 0x12, 0x24, + 0x12, 0x24, 0x0, 0x0, 0x1, 0x3, 0x0, 0x0, 0x0, 0x24, 0x0, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x24, 0x0, 0x6d, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, 0x1, 0x44, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x48, 0x1, 0x44, 0x0, 0x48, 0x0, 0x91, 0x0, 0xda, 0x1, + 0x23, 0x0, 0x48, 0x0, 0x91, 0x0, 0xda, 0x1, 0x23, 0x0, 0x49, 0x0, 0x1, 0x0, + 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9, + 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, 0x0, + 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, + 0x18, 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0, + 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x92, 0x0, 0x4a, 0x0, + 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, 0x0, 0x51, 0x0, + 0x52, 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, + 0x59, 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, + 0x60, 0x0, 0x61, 0x0, 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, + 0x67, 0x0, 0x68, 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0xdb, 0x0, + 0x93, 0x0, 0x94, 0x0, 0x95, 0x0, 0x96, 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0, + 0x9a, 0x0, 0x9b, 0x0, 0x9c, 0x0, 0x9d, 0x0, 0x9e, 0x0, 0x9f, 0x0, 0xa0, 0x0, + 0xa1, 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa4, 0x0, 0xa5, 0x0, 0xa6, 0x0, 0xa7, 0x0, + 0xa8, 0x0, 0xa9, 0x0, 0xaa, 0x0, 0xab, 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, + 0xaf, 0x0, 0xb0, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0xb3, 0x0, 0xb4, 0x0, 0xb5, 0x1, + 0x48, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, + 0xe2, 0x0, 0xe3, 0x0, 0xe4, 0x0, 0xe5, 0x0, 0xe6, 0x0, 0xe7, 0x0, 0xe8, 0x0, + 0xe9, 0x0, 0xea, 0x0, 0xeb, 0x0, 0xec, 0x0, 0xed, 0x0, 0xee, 0x0, 0xef, 0x0, + 0xf0, 0x0, 0xf1, 0x0, 0xf2, 0x0, 0xf3, 0x0, 0xf4, 0x0, 0xf5, 0x0, 0xf6, 0x0, + 0xf7, 0x0, 0xf8, 0x0, 0xf9, 0x0, 0xfa, 0x0, 0xfb, 0x0, 0xfc, 0x0, 0xfd, 0x0, + 0xfe, 0x0, 0xff, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b, 0x1, 0x4c, 0x1, 0x4d, 0x1, + 0x4e, 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52, 0x1, 0x53, 0x1, 0x54, 0x1, + 0x55, 0x1, 0x56, 0x1, 0x57, 0x1, 0x58, 0x1, 0x59, 0x1, 0x5a, 0x1, 0x5b, 0x1, + 0x5c, 0x1, 0x5d, 0x1, 0x5e, 0x1, 0x5f, 0x1, 0x60, 0x1, 0x61, 0x1, 0x62, 0x1, + 0x63, 0x1, 0x64, 0x1, 0x65, 0x1, 0x66, 0x1, 0x67, 0x1, 0x68, 0x1, 0x69, 0x1, + 0x6a, 0x1, 0x6b, 0x0, 0xb6, 0x1, 0x0, 0x1, 0x1, 0x1, 0x2, 0x1, 0x3, 0x1, + 0x4, 0x1, 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x8, 0x1, 0x9, 0x1, 0xa, 0x1, 0xb, + 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, 0x1, 0x11, 0x1, 0x12, + 0x1, 0x13, 0x1, 0x14, 0x1, 0x15, 0x1, 0x16, 0x1, 0x17, 0x1, 0x18, 0x1, 0x19, + 0x1, 0x1a, 0x1, 0x1b, 0x1, 0x1c, 0x1, 0x1d, 0x1, 0x1e, 0x1, 0x1f, 0x1, 0x20, + 0x1, 0x21, 0x1, 0x22, 0x0, 0x6d, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9, 0x0, 0xba, + 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0, 0x0, 0xc1, + 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, 0x0, 0xc7, 0x0, 0xc8, + 0x0, 0xc9, 0x0, 0xca, 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd, 0x0, 0xce, 0x0, 0xcf, + 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, + 0x0, 0xd7, 0x0, 0xd8, 0x0, 0xd9, 0x0, 0x24, 0x0, 0x6e, 0x0, 0x6f, 0x0, 0x70, + 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, 0x74, 0x0, 0x75, 0x0, 0x76, 0x0, 0x77, + 0x0, 0x78, 0x0, 0x79, 0x0, 0x7a, 0x0, 0x7b, 0x0, 0x7c, 0x0, 0x7d, 0x0, 0x7e, + 0x0, 0x7f, 0x0, 0x80, 0x0, 0x81, 0x0, 0x82, 0x0, 0x83, 0x0, 0x84, 0x0, 0x85, + 0x0, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0, 0x89, 0x0, 0x8a, 0x0, 0x8b, 0x0, 0x8c, + 0x0, 0x8d, 0x0, 0x8e, 0x0, 0x8f, 0x0, 0x90, 0x0, 0x0, 0x0, 0x25, 0x0, 0x26, + 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, + 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, + 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0x3b, + 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, 0x0, 0x41, 0x0, 0x42, + 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x47, 0x0, 0x0, 0x0, 0x25, + 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, 0x0, 0x2c, + 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, + 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, + 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, 0x0, 0x41, + 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x47, 0x0, 0x24, + 0x0, 0x6e, 0x0, 0x6f, 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, 0x74, + 0x0, 0x75, 0x0, 0x76, 0x0, 0x77, 0x0, 0x78, 0x0, 0x79, 0x0, 0x7a, 0x0, 0x7b, + 0x0, 0x7c, 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80, 0x0, 0x81, 0x0, 0x82, + 0x0, 0x83, 0x0, 0x84, 0x0, 0x85, 0x0, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0, 0x89, + 0x0, 0x8a, 0x0, 0x8b, 0x0, 0x8c, 0x0, 0x8d, 0x0, 0x8e, 0x0, 0x8f, 0x0, 0x90, + 0x0, 0x6d, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9, 0x0, 0xba, 0x0, 0xbb, 0x0, 0xbc, + 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0, 0x0, 0xc1, 0x0, 0xc2, 0x0, 0xc3, + 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, 0x0, 0xc7, 0x0, 0xc8, 0x0, 0xc9, 0x0, 0xca, + 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd, 0x0, 0xce, 0x0, 0xcf, 0x0, 0xd0, 0x0, 0xd1, + 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x0, 0xd7, 0x0, 0xd8, + 0x0, 0xd9, 0x0, 0xb6, 0x1, 0x0, 0x1, 0x1, 0x1, 0x2, 0x1, 0x3, 0x1, 0x4, 0x1, + 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x8, 0x1, 0x9, 0x1, 0xa, 0x1, 0xb, 0x1, 0xc, + 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, 0x1, 0x11, 0x1, 0x12, 0x1, 0x13, + 0x1, 0x14, 0x1, 0x15, 0x1, 0x16, 0x1, 0x17, 0x1, 0x18, 0x1, 0x19, 0x1, 0x1a, + 0x1, 0x1b, 0x1, 0x1c, 0x1, 0x1d, 0x1, 0x1e, 0x1, 0x1f, 0x1, 0x20, 0x1, 0x21, + 0x1, 0x22, 0x0, 0xff, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b, 0x1, 0x4c, 0x1, 0x4d, + 0x1, 0x4e, 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52, 0x1, 0x53, 0x1, 0x54, + 0x1, 0x55, 0x1, 0x56, 0x1, 0x57, 0x1, 0x58, 0x1, 0x59, 0x1, 0x5a, 0x1, 0x5b, + 0x1, 0x5c, 0x1, 0x5d, 0x1, 0x5e, 0x1, 0x5f, 0x1, 0x60, 0x1, 0x61, 0x1, 0x62, + 0x1, 0x63, 0x1, 0x64, 0x1, 0x65, 0x1, 0x66, 0x1, 0x67, 0x1, 0x68, 0x1, 0x69, + 0x1, 0x6a, 0x1, 0x6b, 0x1, 0x48, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf, + 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xe2, 0x0, 0xe3, 0x0, 0xe4, 0x0, 0xe5, 0x0, 0xe6, + 0x0, 0xe7, 0x0, 0xe8, 0x0, 0xe9, 0x0, 0xea, 0x0, 0xeb, 0x0, 0xec, 0x0, 0xed, + 0x0, 0xee, 0x0, 0xef, 0x0, 0xf0, 0x0, 0xf1, 0x0, 0xf2, 0x0, 0xf3, 0x0, 0xf4, + 0x0, 0xf5, 0x0, 0xf6, 0x0, 0xf7, 0x0, 0xf8, 0x0, 0xf9, 0x0, 0xfa, 0x0, 0xfb, + 0x0, 0xfc, 0x0, 0xfd, 0x0, 0xfe, 0x0, 0xdb, 0x0, 0x93, 0x0, 0x94, 0x0, 0x95, + 0x0, 0x96, 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x9b, 0x0, 0x9c, + 0x0, 0x9d, 0x0, 0x9e, 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0xa2, 0x0, 0xa3, + 0x0, 0xa4, 0x0, 0xa5, 0x0, 0xa6, 0x0, 0xa7, 0x0, 0xa8, 0x0, 0xa9, 0x0, 0xaa, + 0x0, 0xab, 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb0, 0x0, 0xb1, + 0x0, 0xb2, 0x0, 0xb3, 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x92, 0x0, 0x4a, 0x0, 0x4b, + 0x0, 0x4c, 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, + 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, + 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, + 0x0, 0x61, 0x0, 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, 0x67, + 0x0, 0x68, 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x49, 0x0, 0x1, + 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, + 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, + 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, + 0x0, 0x18, 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, + 0x0, 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, + 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, + 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0, + 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, + 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, 0x0, + 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x92, 0x0, 0x4a, 0x0, 0x4b, 0x0, 0x4c, 0x0, + 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, + 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, 0x0, + 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, 0x0, 0x61, 0x0, + 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, 0x67, 0x0, 0x68, 0x0, + 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0xdb, 0x0, 0x93, 0x0, 0x94, 0x0, + 0x95, 0x0, 0x96, 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x9b, 0x0, + 0x9c, 0x0, 0x9d, 0x0, 0x9e, 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0xa2, 0x0, + 0xa3, 0x0, 0xa4, 0x0, 0xa5, 0x0, 0xa6, 0x0, 0xa7, 0x0, 0xa8, 0x0, 0xa9, 0x0, + 0xaa, 0x0, 0xab, 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb0, 0x0, + 0xb1, 0x0, 0xb2, 0x0, 0xb3, 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x24, 0x0, 0xdc, 0x0, + 0xdd, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xe2, 0x0, 0xe3, 0x0, + 0xe4, 0x0, 0xe5, 0x0, 0xe6, 0x0, 0xe7, 0x0, 0xe8, 0x0, 0xe9, 0x0, 0xea, 0x0, + 0xeb, 0x0, 0xec, 0x0, 0xed, 0x0, 0xee, 0x0, 0xef, 0x0, 0xf0, 0x0, 0xf1, 0x0, + 0xf2, 0x0, 0xf3, 0x0, 0xf4, 0x0, 0xf5, 0x0, 0xf6, 0x0, 0xf7, 0x0, 0xf8, 0x0, + 0xf9, 0x0, 0xfa, 0x0, 0xfb, 0x0, 0xfc, 0x0, 0xfd, 0x0, 0xfe, 0x0, 0x6d, 0x0, + 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, 0x0, + 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0, + 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, + 0x3a, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, 0x0, + 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x47, 0x0, + 0xb6, 0x0, 0x6e, 0x0, 0x6f, 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, + 0x74, 0x0, 0x75, 0x0, 0x76, 0x0, 0x77, 0x0, 0x78, 0x0, 0x79, 0x0, 0x7a, 0x0, + 0x7b, 0x0, 0x7c, 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80, 0x0, 0x81, 0x0, + 0x82, 0x0, 0x83, 0x0, 0x84, 0x0, 0x85, 0x0, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0, + 0x89, 0x0, 0x8a, 0x0, 0x8b, 0x0, 0x8c, 0x0, 0x8d, 0x0, 0x8e, 0x0, 0x8f, 0x0, + 0x90, 0x0, 0xff, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9, 0x0, 0xba, 0x0, 0xbb, 0x0, + 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0, 0x0, 0xc1, 0x0, 0xc2, 0x0, + 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, 0x0, 0xc7, 0x0, 0xc8, 0x0, 0xc9, 0x0, + 0xca, 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd, 0x0, 0xce, 0x0, 0xcf, 0x0, 0xd0, 0x0, + 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x0, 0xd7, 0x0, + 0xd8, 0x0, 0xd9, 0x1, 0x48, 0x1, 0x0, 0x1, 0x1, 0x1, 0x2, 0x1, 0x3, 0x1, + 0x4, 0x1, 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x8, 0x1, 0x9, 0x1, 0xa, 0x1, 0xb, + 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, 0x1, 0x11, 0x1, 0x12, + 0x1, 0x13, 0x1, 0x14, 0x1, 0x15, 0x1, 0x16, 0x1, 0x17, 0x1, 0x18, 0x1, 0x19, + 0x1, 0x1a, 0x1, 0x1b, 0x1, 0x1c, 0x1, 0x1d, 0x1, 0x1e, 0x1, 0x1f, 0x1, 0x20, + 0x1, 0x21, 0x1, 0x22, 0x0, 0x0, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b, 0x1, 0x4c, + 0x1, 0x4d, 0x1, 0x4e, 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52, 0x1, 0x53, + 0x1, 0x54, 0x1, 0x55, 0x1, 0x56, 0x1, 0x57, 0x1, 0x58, 0x1, 0x59, 0x1, 0x5a, + 0x1, 0x5b, 0x1, 0x5c, 0x1, 0x5d, 0x1, 0x5e, 0x1, 0x5f, 0x1, 0x60, 0x1, 0x61, + 0x1, 0x62, 0x1, 0x63, 0x1, 0x64, 0x1, 0x65, 0x1, 0x66, 0x1, 0x67, 0x1, 0x68, + 0x1, 0x69, 0x1, 0x6a, 0x1, 0x6b, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x2, + 0x1, 0x3, 0x1, 0x4, 0x1, 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x8, 0x1, 0x9, 0x1, + 0xa, 0x1, 0xb, 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, 0x1, 0x11, + 0x1, 0x12, 0x1, 0x13, 0x1, 0x14, 0x1, 0x15, 0x1, 0x16, 0x1, 0x17, 0x1, 0x18, + 0x1, 0x19, 0x1, 0x1a, 0x1, 0x1b, 0x1, 0x1c, 0x1, 0x1d, 0x1, 0x1e, 0x1, 0x1f, + 0x1, 0x20, 0x1, 0x21, 0x1, 0x22, 0x0, 0xff, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9, + 0x0, 0xba, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0, + 0x0, 0xc1, 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, 0x0, 0xc7, + 0x0, 0xc8, 0x0, 0xc9, 0x0, 0xca, 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd, 0x0, 0xce, + 0x0, 0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, + 0x0, 0xd6, 0x0, 0xd7, 0x0, 0xd8, 0x0, 0xd9, 0x0, 0xb6, 0x0, 0x6e, 0x0, 0x6f, + 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, 0x74, 0x0, 0x75, 0x0, 0x76, + 0x0, 0x77, 0x0, 0x78, 0x0, 0x79, 0x0, 0x7a, 0x0, 0x7b, 0x0, 0x7c, 0x0, 0x7d, + 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80, 0x0, 0x81, 0x0, 0x82, 0x0, 0x83, 0x0, 0x84, + 0x0, 0x85, 0x0, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0, 0x89, 0x0, 0x8a, 0x0, 0x8b, + 0x0, 0x8c, 0x0, 0x8d, 0x0, 0x8e, 0x0, 0x8f, 0x0, 0x90, 0x0, 0x6d, 0x0, 0x25, + 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, 0x0, 0x2c, + 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, + 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, + 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, 0x0, 0x41, + 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x47, 0x0, 0x24, + 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b, 0x1, 0x4c, 0x1, 0x4d, 0x1, 0x4e, 0x1, 0x4f, + 0x1, 0x50, 0x1, 0x51, 0x1, 0x52, 0x1, 0x53, 0x1, 0x54, 0x1, 0x55, 0x1, 0x56, + 0x1, 0x57, 0x1, 0x58, 0x1, 0x59, 0x1, 0x5a, 0x1, 0x5b, 0x1, 0x5c, 0x1, 0x5d, + 0x1, 0x5e, 0x1, 0x5f, 0x1, 0x60, 0x1, 0x61, 0x1, 0x62, 0x1, 0x63, 0x1, 0x64, + 0x1, 0x65, 0x1, 0x66, 0x1, 0x67, 0x1, 0x68, 0x1, 0x69, 0x1, 0x6a, 0x1, 0x6b, + 0x1, 0x48, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, + 0x0, 0xe2, 0x0, 0xe3, 0x0, 0xe4, 0x0, 0xe5, 0x0, 0xe6, 0x0, 0xe7, 0x0, 0xe8, + 0x0, 0xe9, 0x0, 0xea, 0x0, 0xeb, 0x0, 0xec, 0x0, 0xed, 0x0, 0xee, 0x0, 0xef, + 0x0, 0xf0, 0x0, 0xf1, 0x0, 0xf2, 0x0, 0xf3, 0x0, 0xf4, 0x0, 0xf5, 0x0, 0xf6, + 0x0, 0xf7, 0x0, 0xf8, 0x0, 0xf9, 0x0, 0xfa, 0x0, 0xfb, 0x0, 0xfc, 0x0, 0xfd, + 0x0, 0xfe, 0x0, 0xdb, 0x0, 0x93, 0x0, 0x94, 0x0, 0x95, 0x0, 0x96, 0x0, 0x97, + 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x9b, 0x0, 0x9c, 0x0, 0x9d, 0x0, 0x9e, + 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa4, 0x0, 0xa5, + 0x0, 0xa6, 0x0, 0xa7, 0x0, 0xa8, 0x0, 0xa9, 0x0, 0xaa, 0x0, 0xab, 0x0, 0xac, + 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb0, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0xb3, + 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x92, 0x0, 0x4a, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, + 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, + 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, 0x0, 0x5b, + 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, 0x0, 0x61, 0x0, 0x62, + 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, 0x67, 0x0, 0x68, 0x0, 0x69, + 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x49, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, + 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0, + 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, 0x0, 0x11, 0x0, + 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, + 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0, + 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0x5, 0x7, 0x7, 0x0, 0x8, 0x5, 0x0, 0x1f, 0x5, 0x7, 0x7, 0x1, + 0x8, 0x5, 0x0, 0x1f, 0x5, 0x7, 0x7, 0x2, 0x6, 0x5, 0x0, 0x1f, 0x5, 0x7, 0x7, + 0x3, 0x8, 0x3, 0x1, 0x1, 0xa, 0x1e, 0x20, 0x1a, 0x0, 0x64, 0xd, 0xac, 0x0, + 0xc8, 0x1, 0x90, 0x1, 0x7c, 0x1, 0x7c, 0x1, 0x5e, 0x9, 0xc4, 0x7, 0xd0, 0x7, + 0xd0, 0x0, 0xfa, 0x0, 0xfa, 0xc, 0x80, 0x1, 0xc2, 0x1, 0x3, 0x6, 0x21, 0x3c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xb, 0x0, 0x1, 0x87, 0x1, 0x0, 0x13, 0x1, + 0xe0, 0x0, 0x7, 0x0, 0x18, 0x1, 0x2, 0x1, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xe0, 0xa5, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x40, 0x4, 0x80, 0x4, 0x38, 0x2, 0x1c, 0x40, 0x40, 0x2, 0x58, 0x2, 0x58, + 0x1, 0x0, 0x1, 0x0, 0x8, 0xe8, 0x4, 0x74, 0x40, 0x40, 0x2, 0x58, 0x2, 0x58, + 0x1, 0x0, 0x1, 0x0, 0x12, 0x0, 0xb4, 0x1, 0x68, 0x2, 0x1c, 0x0, 0x0, 0x7, + 0xa8, 0x0, 0x64, 0x0, 0x51, 0x0, 0x5, 0x1, 0x5, 0x0, 0xc8, 0x13, 0x88, 0xf, + 0x6, 0x6, 0x0, 0x78, 0x1, 0x5e, 0x1, 0xc2, 0x1f, 0x40, 0x3c, 0x2, 0x58, 0x0, + 0xc8, 0x0, 0x14, 0x0, 0x1f, 0x0, 0x18, 0x0, 0x11, 0x3, 0x20, 0x1, 0x90, 0x6, + 0x40, 0x5, 0xdc, 0x4, 0x14, 0x32, 0x0, 0x50, 0x3, 0xe8, 0x0, 0x50, 0x8, + 0x98, 0x0, 0x32, 0x1, 0xf4, 0x1, 0xf4, 0x3, 0x20, 0x0, 0x14, 0x0, 0x3c, 0x0, + 0x1e, 0x0, 0x80, 0x2, 0x1c, 0x0, 0xdc, 0x0, 0x3c, 0x3, 0xe8, 0x4, 0x74, 0x2, + 0x1c, 0x0, 0x3c, 0x3, 0xe8, 0x0, 0x20, 0x4, 0x18, 0x0, 0x0, 0x8, 0xe8, 0x0, + 0x64, 0x0, 0xa0, 0x0, 0xa0, 0x6, 0x40, 0x1, 0x2c, 0x0, 0x2b, 0x0, 0x1e, 0x0, + 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, + 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, + 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, + 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, + 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x74, 0x0, + 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, + 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, + 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, + 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, + 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, + 0xb1, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, + 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, + 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, + 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, + 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, + 0x96, 0x0, 0xee, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, + 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, + 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, + 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, + 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, + 0xd2, 0x0, 0xd2, 0x1, 0x2b, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, + 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, + 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, + 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, + 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, + 0xe, 0x1, 0x7a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, + 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, + 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, + 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, + 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, + 0x4a, 0x1, 0x4a, 0x0, 0x0, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, + 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, + 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, + 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, + 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, + 0x86, 0x1, 0x86, 0x1, 0x86, 0x0, 0x0, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, + 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, + 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, + 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, + 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, + 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x0, 0x0, 0x1, 0xfe, 0x1, 0xfe, 0x1, + 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, + 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, + 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, + 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, + 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x0, 0x0, 0x2, 0x3a, 0x2, + 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, + 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, + 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, + 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, + 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x0, 0x0, 0x2, + 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, + 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, + 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, + 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, + 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x0, + 0x0, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, + 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, + 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, + 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, + 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, + 0xb2, 0x2, 0xb5, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, + 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, + 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, + 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, + 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, + 0xee, 0x2, 0xee, 0x3, 0xe, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, + 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, + 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, + 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, + 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, + 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x4b, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, + 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, + 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, + 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, + 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, + 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x88, 0x3, 0xa2, 0x3, 0xa2, 0x3, + 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, + 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, + 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, + 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, + 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xc5, 0x3, 0xde, 0x3, + 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, + 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, + 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, + 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, + 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x4, 0xe, 0x4, + 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, + 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, + 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, + 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, + 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, + 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, + 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, + 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, + 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, + 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, + 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, + 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, + 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, + 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, + 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, + 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, + 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, + 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, + 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, + 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, + 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, + 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, + 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, + 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, + 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, + 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, + 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, + 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, + 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, + 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, + 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, + 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, + 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, + 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, + 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, + 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x0, 0x0, 0x4e, 0x0, 0xa2, 0x0, 0xe2, + 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, + 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, + 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, + 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, + 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x0, 0x0, 0x42, 0x0, 0xa2, + 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, + 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, + 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, + 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, + 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x0, 0x0, 0x42, + 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, + 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, + 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, + 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, + 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x0, + 0x0, 0x42, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, + 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, + 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, + 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, + 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, + 0x0, 0x0, 0x0, 0x42, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, + 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, + 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, + 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, + 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, + 0x8, 0xc8, 0x0, 0x0, 0x0, 0x42, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, + 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, + 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, + 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, + 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, + 0x8, 0x89, 0x8, 0xc8, 0x0, 0x0, 0x0, 0x4e, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, + 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, + 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, + 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, + 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, + 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, + 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, + 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, + 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, + 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, + 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, + 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, + 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, + 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, + 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, + 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, + 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, + 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, + 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, + 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, + 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, + 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, + 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, + 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, + 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, + 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, + 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, + 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, + 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, + 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, + 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, + 0x8, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xd, 0x64, 0x9b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x67, 0x3f, 0xff, 0x55, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_ft8719_d2tA.i b/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_ft8719_d2tA.i new file mode 100644 index 000000000000..46a7d44174ee --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_ft8719_d2tA.i @@ -0,0 +1,4774 @@ +0x2, 0x0, 0x6e, 0x2, 0xde, 0xa5, 0xeb, 0xaa, 0x8, 0xd3, 0x22, 0x2, 0xde, 0xcc, + 0x22, 0x2, 0x5f, 0xfa, 0x22, 0x2, 0xdf, 0x17, 0xb2, 0x86, 0x22, 0x22, 0x22, + 0x2, 0x88, 0x1f, 0x7c, 0xb7, 0x22, 0xff, 0xff, 0x2, 0x5b, 0x13, 0x7d, 0x23, + 0x2, 0x6b, 0x5f, 0x2, 0x88, 0xb2, 0x7d, 0x43, 0x7f, 0x10, 0x80, 0x7, 0x1b, + 0x44, 0x7a, 0xb, 0xb0, 0xb, 0x14, 0x4d, 0x44, 0x78, 0xf5, 0x22, 0xc2, 0x18, + 0x22, 0x2, 0x88, 0xca, 0xa9, 0xd6, 0xef, 0x22, 0xff, 0x2, 0x2d, 0xbf, 0x0, + 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x0, 0xa9, 0xd6, 0xca, 0x22, 0xff, 0x2, 0xe0, + 0x5f, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0xc2, 0x88, 0xd2, 0xa8, + 0x22, 0x2, 0xe1, 0xc5, 0x75, 0x84, 0x1, 0x7e, 0x44, 0x9f, 0xff, 0xe4, 0x7a, + 0x49, 0xb0, 0x1b, 0x44, 0x78, 0xf9, 0x7e, 0xf8, 0x74, 0x11, 0x75, 0x10, 0x0, + 0x75, 0x11, 0x0, 0xc2, 0x1a, 0xc2, 0x1b, 0xc2, 0x1c, 0x75, 0xd, 0x0, 0x75, + 0xe, 0x0, 0xc2, 0x27, 0xc2, 0x1d, 0xc2, 0x1e, 0xc2, 0x28, 0xc2, 0x29, 0xc2, + 0x2a, 0xc2, 0x2b, 0xc2, 0x1f, 0xc2, 0x20, 0x75, 0x16, 0x0, 0xc2, 0x21, 0xd2, + 0x22, 0xd2, 0x2d, 0x75, 0x12, 0x0, 0x75, 0x13, 0x0, 0xc2, 0x23, 0xc2, 0x24, + 0xc2, 0x2e, 0xc2, 0xd, 0xc2, 0xe, 0xc2, 0xf, 0xc2, 0x10, 0xc2, 0x11, 0xc2, + 0x12, 0xd2, 0x13, 0xc2, 0x14, 0xc2, 0x15, 0xc2, 0x2f, 0xc2, 0x30, 0xd2, + 0x25, 0xc2, 0x26, 0x7e, 0x4, 0x0, 0xff, 0x7e, 0x14, 0x2b, 0x3c, 0xb, 0xa, + 0x40, 0x5d, 0x44, 0x68, 0x1a, 0x69, 0x20, 0x0, 0x2, 0xb, 0xe, 0xb, 0x44, + 0x80, 0xa, 0x7e, 0xb, 0xb0, 0x7a, 0x29, 0xb0, 0xb, 0x24, 0xb, 0xc, 0x1b, + 0x44, 0x78, 0xf2, 0x80, 0xdf, 0x2, 0x2f, 0xfb, 0xf2, 0xa8, 0xd, 0x57, 0xf7, + 0xbc, 0x8, 0x43, 0x88, 0x66, 0x77, 0x99, 0xe0, 0x1f, 0xa, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xb, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1f, 0xff, 0xff, 0xf0, + 0x6, 0x70, 0x8f, 0x0, 0xff, 0xe0, 0x1f, 0x1, 0xaa, 0x48, 0x63, 0x2, 0xa9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x53, 0x42, 0x32, 0x1, 0xd2, 0x54, 0x31, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x43, 0x53, 0x4f, 0x54, 0x5f, 0x36, + 0x50, 0x32, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x0, 0x0, 0x0, 0x9, 0x9, 0x12, 0x24, 0x12, 0x24, 0x0, 0x0, 0x1, + 0x1, 0x44, 0x1, 0x44, 0x0, 0x0, 0x0, 0x0, 0x1, 0x48, 0x1, 0x44, 0x0, 0x48, + 0x0, 0x91, 0x0, 0xda, 0x1, 0x23, 0x0, 0x48, 0x0, 0x91, 0x0, 0xda, 0x1, 0x23, + 0x0, 0x49, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, + 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, + 0x0, 0xf, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, + 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, + 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, + 0x0, 0x92, 0x0, 0x4a, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, + 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, + 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, + 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, 0x0, 0x61, 0x0, 0x62, 0x0, 0x63, 0x0, 0x64, + 0x0, 0x65, 0x0, 0x66, 0x0, 0x67, 0x0, 0x68, 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, + 0x0, 0x6c, 0x0, 0xdb, 0x0, 0x93, 0x0, 0x94, 0x0, 0x95, 0x0, 0x96, 0x0, 0x97, + 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x9b, 0x0, 0x9c, 0x0, 0x9d, 0x0, 0x9e, + 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa4, 0x0, 0xa5, + 0x0, 0xa6, 0x0, 0xa7, 0x0, 0xa8, 0x0, 0xa9, 0x0, 0xaa, 0x0, 0xab, 0x0, 0xac, + 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb0, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0xb3, + 0x0, 0xb4, 0x0, 0xb5, 0x1, 0x48, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf, + 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xe2, 0x0, 0xe3, 0x0, 0xe4, 0x0, 0xe5, 0x0, 0xe6, + 0x0, 0xe7, 0x0, 0xe8, 0x0, 0xe9, 0x0, 0xea, 0x0, 0xeb, 0x0, 0xec, 0x0, 0xed, + 0x0, 0xee, 0x0, 0xef, 0x0, 0xf0, 0x0, 0xf1, 0x0, 0xf2, 0x0, 0xf3, 0x0, 0xf4, + 0x0, 0xf5, 0x0, 0xf6, 0x0, 0xf7, 0x0, 0xf8, 0x0, 0xf9, 0x0, 0xfa, 0x0, 0xfb, + 0x0, 0xfc, 0x0, 0xfd, 0x0, 0xfe, 0x0, 0xff, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b, + 0x1, 0x4c, 0x1, 0x4d, 0x1, 0x4e, 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52, + 0x1, 0x53, 0x1, 0x54, 0x1, 0x55, 0x1, 0x56, 0x1, 0x57, 0x1, 0x58, 0x1, 0x59, + 0x1, 0x5a, 0x1, 0x5b, 0x1, 0x5c, 0x1, 0x5d, 0x1, 0x5e, 0x1, 0x5f, 0x1, 0x60, + 0x1, 0x61, 0x1, 0x62, 0x1, 0x63, 0x1, 0x64, 0x1, 0x65, 0x1, 0x66, 0x1, 0x67, + 0x1, 0x68, 0x1, 0x69, 0x1, 0x6a, 0x1, 0x6b, 0x0, 0xb6, 0x1, 0x0, 0x1, 0x1, + 0x1, 0x2, 0x1, 0x3, 0x1, 0x4, 0x1, 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x8, 0x1, + 0x9, 0x1, 0xa, 0x1, 0xb, 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, + 0x1, 0x11, 0x1, 0x12, 0x1, 0x13, 0x1, 0x14, 0x1, 0x15, 0x1, 0x16, 0x1, 0x17, + 0x1, 0x18, 0x1, 0x19, 0x1, 0x1a, 0x1, 0x1b, 0x1, 0x1c, 0x1, 0x1d, 0x1, 0x1e, + 0x1, 0x1f, 0x1, 0x20, 0x1, 0x21, 0x1, 0x22, 0x0, 0x6d, 0x0, 0xb7, 0x0, 0xb8, + 0x0, 0xb9, 0x0, 0xba, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, + 0x0, 0xc0, 0x0, 0xc1, 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, + 0x0, 0xc7, 0x0, 0xc8, 0x0, 0xc9, 0x0, 0xca, 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd, + 0x0, 0xce, 0x0, 0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, + 0x0, 0xd5, 0x0, 0xd6, 0x0, 0xd7, 0x0, 0xd8, 0x0, 0xd9, 0x0, 0x24, 0x0, 0x6e, + 0x0, 0x6f, 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, 0x74, 0x0, 0x75, + 0x0, 0x76, 0x0, 0x77, 0x0, 0x78, 0x0, 0x79, 0x0, 0x7a, 0x0, 0x7b, 0x0, 0x7c, + 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80, 0x0, 0x81, 0x0, 0x82, 0x0, 0x83, + 0x0, 0x84, 0x0, 0x85, 0x0, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0, 0x89, 0x0, 0x8a, + 0x0, 0x8b, 0x0, 0x8c, 0x0, 0x8d, 0x0, 0x8e, 0x0, 0x8f, 0x0, 0x90, 0x0, 0x0, + 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, + 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, + 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, + 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, + 0x0, 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x47, + 0x0, 0x0, 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, + 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, + 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, + 0x0, 0x39, 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, + 0x0, 0x40, 0x0, 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, + 0x0, 0x47, 0x0, 0x24, 0x0, 0x6e, 0x0, 0x6f, 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, + 0x0, 0x73, 0x0, 0x74, 0x0, 0x75, 0x0, 0x76, 0x0, 0x77, 0x0, 0x78, 0x0, 0x79, + 0x0, 0x7a, 0x0, 0x7b, 0x0, 0x7c, 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80, + 0x0, 0x81, 0x0, 0x82, 0x0, 0x83, 0x0, 0x84, 0x0, 0x85, 0x0, 0x86, 0x0, 0x87, + 0x0, 0x88, 0x0, 0x89, 0x0, 0x8a, 0x0, 0x8b, 0x0, 0x8c, 0x0, 0x8d, 0x0, 0x8e, + 0x0, 0x8f, 0x0, 0x90, 0x0, 0x6d, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9, 0x0, 0xba, + 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0, 0x0, 0xc1, + 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, 0x0, 0xc7, 0x0, 0xc8, + 0x0, 0xc9, 0x0, 0xca, 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd, 0x0, 0xce, 0x0, 0xcf, + 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, + 0x0, 0xd7, 0x0, 0xd8, 0x0, 0xd9, 0x0, 0xb6, 0x1, 0x0, 0x1, 0x1, 0x1, 0x2, + 0x1, 0x3, 0x1, 0x4, 0x1, 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x8, 0x1, 0x9, 0x1, + 0xa, 0x1, 0xb, 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, 0x1, 0x11, + 0x1, 0x12, 0x1, 0x13, 0x1, 0x14, 0x1, 0x15, 0x1, 0x16, 0x1, 0x17, 0x1, 0x18, + 0x1, 0x19, 0x1, 0x1a, 0x1, 0x1b, 0x1, 0x1c, 0x1, 0x1d, 0x1, 0x1e, 0x1, 0x1f, + 0x1, 0x20, 0x1, 0x21, 0x1, 0x22, 0x0, 0xff, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b, + 0x1, 0x4c, 0x1, 0x4d, 0x1, 0x4e, 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52, + 0x1, 0x53, 0x1, 0x54, 0x1, 0x55, 0x1, 0x56, 0x1, 0x57, 0x1, 0x58, 0x1, 0x59, + 0x1, 0x5a, 0x1, 0x5b, 0x1, 0x5c, 0x1, 0x5d, 0x1, 0x5e, 0x1, 0x5f, 0x1, 0x60, + 0x1, 0x61, 0x1, 0x62, 0x1, 0x63, 0x1, 0x64, 0x1, 0x65, 0x1, 0x66, 0x1, 0x67, + 0x1, 0x68, 0x1, 0x69, 0x1, 0x6a, 0x1, 0x6b, 0x1, 0x48, 0x0, 0xdc, 0x0, 0xdd, + 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xe2, 0x0, 0xe3, 0x0, 0xe4, + 0x0, 0xe5, 0x0, 0xe6, 0x0, 0xe7, 0x0, 0xe8, 0x0, 0xe9, 0x0, 0xea, 0x0, 0xeb, + 0x0, 0xec, 0x0, 0xed, 0x0, 0xee, 0x0, 0xef, 0x0, 0xf0, 0x0, 0xf1, 0x0, 0xf2, + 0x0, 0xf3, 0x0, 0xf4, 0x0, 0xf5, 0x0, 0xf6, 0x0, 0xf7, 0x0, 0xf8, 0x0, 0xf9, + 0x0, 0xfa, 0x0, 0xfb, 0x0, 0xfc, 0x0, 0xfd, 0x0, 0xfe, 0x0, 0xdb, 0x0, 0x93, + 0x0, 0x94, 0x0, 0x95, 0x0, 0x96, 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, + 0x0, 0x9b, 0x0, 0x9c, 0x0, 0x9d, 0x0, 0x9e, 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1, + 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa4, 0x0, 0xa5, 0x0, 0xa6, 0x0, 0xa7, 0x0, 0xa8, + 0x0, 0xa9, 0x0, 0xaa, 0x0, 0xab, 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, + 0x0, 0xb0, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0xb3, 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x92, + 0x0, 0x4a, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, + 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, + 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, + 0x0, 0x5f, 0x0, 0x60, 0x0, 0x61, 0x0, 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, + 0x0, 0x66, 0x0, 0x67, 0x0, 0x68, 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, + 0x0, 0x49, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, + 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, + 0x0, 0xf, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, + 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, + 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0x0, 0x1, 0x0, 0x2, + 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, + 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, 0x0, 0x11, + 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, + 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, + 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x92, 0x0, 0x4a, 0x0, 0x4b, + 0x0, 0x4c, 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, + 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, + 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, + 0x0, 0x61, 0x0, 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, 0x67, + 0x0, 0x68, 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0xdb, 0x0, 0x93, + 0x0, 0x94, 0x0, 0x95, 0x0, 0x96, 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, + 0x0, 0x9b, 0x0, 0x9c, 0x0, 0x9d, 0x0, 0x9e, 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1, + 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa4, 0x0, 0xa5, 0x0, 0xa6, 0x0, 0xa7, 0x0, 0xa8, + 0x0, 0xa9, 0x0, 0xaa, 0x0, 0xab, 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, + 0x0, 0xb0, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0xb3, 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x24, + 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xe2, + 0x0, 0xe3, 0x0, 0xe4, 0x0, 0xe5, 0x0, 0xe6, 0x0, 0xe7, 0x0, 0xe8, 0x0, 0xe9, + 0x0, 0xea, 0x0, 0xeb, 0x0, 0xec, 0x0, 0xed, 0x0, 0xee, 0x0, 0xef, 0x0, 0xf0, + 0x0, 0xf1, 0x0, 0xf2, 0x0, 0xf3, 0x0, 0xf4, 0x0, 0xf5, 0x0, 0xf6, 0x0, 0xf7, + 0x0, 0xf8, 0x0, 0xf9, 0x0, 0xfa, 0x0, 0xfb, 0x0, 0xfc, 0x0, 0xfd, 0x0, 0xfe, + 0x0, 0x6d, 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, + 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, + 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, + 0x0, 0x39, 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, + 0x0, 0x40, 0x0, 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, + 0x0, 0x47, 0x0, 0xb6, 0x0, 0x6e, 0x0, 0x6f, 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, + 0x0, 0x73, 0x0, 0x74, 0x0, 0x75, 0x0, 0x76, 0x0, 0x77, 0x0, 0x78, 0x0, 0x79, + 0x0, 0x7a, 0x0, 0x7b, 0x0, 0x7c, 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80, + 0x0, 0x81, 0x0, 0x82, 0x0, 0x83, 0x0, 0x84, 0x0, 0x85, 0x0, 0x86, 0x0, 0x87, + 0x0, 0x88, 0x0, 0x89, 0x0, 0x8a, 0x0, 0x8b, 0x0, 0x8c, 0x0, 0x8d, 0x0, 0x8e, + 0x0, 0x8f, 0x0, 0x90, 0x0, 0xff, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9, 0x0, 0xba, + 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0, 0x0, 0xc1, + 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, 0x0, 0xc7, 0x0, 0xc8, + 0x0, 0xc9, 0x0, 0xca, 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd, 0x0, 0xce, 0x0, 0xcf, + 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, + 0x0, 0xd7, 0x0, 0xd8, 0x0, 0xd9, 0x1, 0x48, 0x1, 0x0, 0x1, 0x1, 0x1, 0x2, + 0x1, 0x3, 0x1, 0x4, 0x1, 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x8, 0x1, 0x9, 0x1, + 0xa, 0x1, 0xb, 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, 0x1, 0x11, + 0x1, 0x12, 0x1, 0x13, 0x1, 0x14, 0x1, 0x15, 0x1, 0x16, 0x1, 0x17, 0x1, 0x18, + 0x1, 0x19, 0x1, 0x1a, 0x1, 0x1b, 0x1, 0x1c, 0x1, 0x1d, 0x1, 0x1e, 0x1, 0x1f, + 0x1, 0x20, 0x1, 0x21, 0x1, 0x22, 0x0, 0x0, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b, + 0x1, 0x4c, 0x1, 0x4d, 0x1, 0x4e, 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52, + 0x1, 0x53, 0x1, 0x54, 0x1, 0x55, 0x1, 0x56, 0x1, 0x57, 0x1, 0x58, 0x1, 0x59, + 0x1, 0x5a, 0x1, 0x5b, 0x1, 0x5c, 0x1, 0x5d, 0x1, 0x5e, 0x1, 0x5f, 0x1, 0x60, + 0x1, 0x61, 0x1, 0x62, 0x1, 0x63, 0x1, 0x64, 0x1, 0x65, 0x1, 0x66, 0x1, 0x67, + 0x1, 0x68, 0x1, 0x69, 0x1, 0x6a, 0x1, 0x6b, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, + 0x1, 0x2, 0x1, 0x3, 0x1, 0x4, 0x1, 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x8, 0x1, + 0x9, 0x1, 0xa, 0x1, 0xb, 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, + 0x1, 0x11, 0x1, 0x12, 0x1, 0x13, 0x1, 0x14, 0x1, 0x15, 0x1, 0x16, 0x1, 0x17, + 0x1, 0x18, 0x1, 0x19, 0x1, 0x1a, 0x1, 0x1b, 0x1, 0x1c, 0x1, 0x1d, 0x1, 0x1e, + 0x1, 0x1f, 0x1, 0x20, 0x1, 0x21, 0x1, 0x22, 0x0, 0xff, 0x0, 0xb7, 0x0, 0xb8, + 0x0, 0xb9, 0x0, 0xba, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, + 0x0, 0xc0, 0x0, 0xc1, 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, + 0x0, 0xc7, 0x0, 0xc8, 0x0, 0xc9, 0x0, 0xca, 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd, + 0x0, 0xce, 0x0, 0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, + 0x0, 0xd5, 0x0, 0xd6, 0x0, 0xd7, 0x0, 0xd8, 0x0, 0xd9, 0x0, 0xb6, 0x0, 0x6e, + 0x0, 0x6f, 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, 0x74, 0x0, 0x75, + 0x0, 0x76, 0x0, 0x77, 0x0, 0x78, 0x0, 0x79, 0x0, 0x7a, 0x0, 0x7b, 0x0, 0x7c, + 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80, 0x0, 0x81, 0x0, 0x82, 0x0, 0x83, + 0x0, 0x84, 0x0, 0x85, 0x0, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0, 0x89, 0x0, 0x8a, + 0x0, 0x8b, 0x0, 0x8c, 0x0, 0x8d, 0x0, 0x8e, 0x0, 0x8f, 0x0, 0x90, 0x0, 0x6d, + 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, + 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, + 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, + 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, + 0x0, 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x47, + 0x0, 0x24, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b, 0x1, 0x4c, 0x1, 0x4d, 0x1, 0x4e, + 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52, 0x1, 0x53, 0x1, 0x54, 0x1, 0x55, + 0x1, 0x56, 0x1, 0x57, 0x1, 0x58, 0x1, 0x59, 0x1, 0x5a, 0x1, 0x5b, 0x1, 0x5c, + 0x1, 0x5d, 0x1, 0x5e, 0x1, 0x5f, 0x1, 0x60, 0x1, 0x61, 0x1, 0x62, 0x1, 0x63, + 0x1, 0x64, 0x1, 0x65, 0x1, 0x66, 0x1, 0x67, 0x1, 0x68, 0x1, 0x69, 0x1, 0x6a, + 0x1, 0x6b, 0x1, 0x48, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, + 0x0, 0xe1, 0x0, 0xe2, 0x0, 0xe3, 0x0, 0xe4, 0x0, 0xe5, 0x0, 0xe6, 0x0, 0xe7, + 0x0, 0xe8, 0x0, 0xe9, 0x0, 0xea, 0x0, 0xeb, 0x0, 0xec, 0x0, 0xed, 0x0, 0xee, + 0x0, 0xef, 0x0, 0xf0, 0x0, 0xf1, 0x0, 0xf2, 0x0, 0xf3, 0x0, 0xf4, 0x0, 0xf5, + 0x0, 0xf6, 0x0, 0xf7, 0x0, 0xf8, 0x0, 0xf9, 0x0, 0xfa, 0x0, 0xfb, 0x0, 0xfc, + 0x0, 0xfd, 0x0, 0xfe, 0x0, 0xdb, 0x0, 0x93, 0x0, 0x94, 0x0, 0x95, 0x0, 0x96, + 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x9b, 0x0, 0x9c, 0x0, 0x9d, + 0x0, 0x9e, 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa4, + 0x0, 0xa5, 0x0, 0xa6, 0x0, 0xa7, 0x0, 0xa8, 0x0, 0xa9, 0x0, 0xaa, 0x0, 0xab, + 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb0, 0x0, 0xb1, 0x0, 0xb2, + 0x0, 0xb3, 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x92, 0x0, 0x4a, 0x0, 0x4b, 0x0, 0x4c, + 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, + 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, + 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, 0x0, 0x61, + 0x0, 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, 0x67, 0x0, 0x68, + 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x49, 0x0, 0x1, 0x0, 0x2, + 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, + 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, 0x0, 0x11, + 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, + 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, + 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0x5, 0x7, 0x7, 0x0, 0x8, 0x5, 0x0, 0x16, 0x5, 0x7, 0x7, + 0x1, 0x8, 0x5, 0x0, 0x16, 0x5, 0x7, 0x7, 0x2, 0x6, 0x5, 0x0, 0x16, 0x5, 0x7, + 0x7, 0x3, 0x8, 0x3, 0x1, 0x1, 0xa, 0x1e, 0x20, 0x14, 0x0, 0x64, 0xd, 0xac, + 0x0, 0xc8, 0x1, 0x90, 0x1, 0x2c, 0x0, 0xc8, 0x1, 0x2c, 0x9, 0xc4, 0x7, 0xd0, + 0x7, 0xd0, 0x0, 0x96, 0x0, 0x96, 0xa, 0x0, 0x1, 0xf4, 0x1, 0x5, 0x6, 0x21, + 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xb, 0x0, 0x1, 0x87, 0x1, 0x0, 0xa, 0x1, + 0xe0, 0x0, 0x7, 0x0, 0x18, 0x1, 0x2, 0x1, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe0, + 0xa5, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, + 0x4, 0x80, 0x4, 0x38, 0x2, 0x1c, 0x3c, 0x3c, 0x4, 0x0, 0x4, 0x0, 0x1, 0x1, + 0x1, 0x3, 0x8, 0xe8, 0x4, 0x74, 0x41, 0x40, 0x4, 0x0, 0x4, 0x0, 0x1, 0x1, + 0x1, 0x0, 0x12, 0x0, 0xb4, 0x1, 0x68, 0x2, 0x1c, 0x0, 0x0, 0x7, 0xa8, 0x0, + 0x64, 0x0, 0x51, 0x0, 0x2, 0x1, 0x5, 0x1, 0x2, 0x2, 0x4, 0x4, 0x6, 0x80, + 0x0, 0xc8, 0x13, 0x88, 0xf, 0x5, 0x6, 0x0, 0x1e, 0x0, 0xc8, 0x1, 0xc2, 0x1f, + 0x40, 0x28, 0x2, 0x58, 0x0, 0xc8, 0x0, 0xa, 0x0, 0x16, 0x0, 0x1f, 0x0, 0x11, + 0x3, 0x20, 0x1, 0x90, 0x6, 0x40, 0x3, 0x20, 0x4, 0xa, 0x5, 0x0, 0x74, 0x3, + 0xc4, 0x0, 0x41, 0x8, 0xa7, 0x0, 0x32, 0x1, 0x90, 0x1, 0x90, 0x3, 0x20, 0x0, + 0xc8, 0x0, 0x3c, 0x0, 0x1e, 0x0, 0x80, 0x1, 0xe, 0x1, 0x1d, 0x0, 0x3c, 0x3, + 0xe8, 0x2, 0x3a, 0x0, 0x87, 0x0, 0x3c, 0x3, 0xe8, 0x0, 0x22, 0x4, 0x16, 0x0, + 0x13, 0x8, 0xd5, 0x0, 0x64, 0x0, 0xa0, 0x0, 0xa0, 0x13, 0x88, 0x1, 0x2c, + 0x0, 0x2b, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, + 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, + 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, + 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, + 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, + 0x0, 0x1e, 0x0, 0x74, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, + 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, + 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, + 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, + 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, + 0x0, 0x5a, 0x0, 0x5a, 0x0, 0xb1, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, + 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, + 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, + 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, + 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, + 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0xee, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, + 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, + 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, + 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, + 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, + 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x1, 0x2b, 0x1, 0xe, 0x1, 0xe, + 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, + 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, + 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, + 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, + 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xa2, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, + 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, + 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, + 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, + 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, + 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x93, 0x1, 0x86, 0x1, 0x86, + 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, + 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, + 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, + 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, + 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0xc2, 0x1, 0xc2, + 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, + 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, + 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, + 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, + 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xfe, + 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, + 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, + 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, + 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, + 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, + 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, + 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, + 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, + 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, + 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, + 0x2, 0x3a, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, + 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, + 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, + 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, + 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, + 0x2, 0x76, 0x2, 0x76, 0x2, 0xa5, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, + 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, + 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, + 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, + 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, + 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xa1, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, + 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, + 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, + 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, + 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, + 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x3, 0xe, 0x3, 0x2a, 0x3, 0x2a, + 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, + 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, + 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, + 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, + 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x4b, 0x3, 0x66, + 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, + 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, + 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, + 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, + 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x88, + 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, + 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, + 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, + 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, + 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, + 0x3, 0xc5, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, + 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, + 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, + 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, + 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, + 0x3, 0xde, 0x4, 0xe, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, + 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, + 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, + 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, + 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, + 0x4, 0x1a, 0x4, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, + 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, + 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, + 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, + 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, + 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, + 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, + 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, + 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, + 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, + 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, + 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, + 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, + 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, + 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, + 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, + 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, + 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, + 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, + 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, + 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, + 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, + 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, + 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, + 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, + 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, + 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0xf, 0x0, 0x62, 0x0, 0xa2, + 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, + 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, + 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, + 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, + 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, + 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, + 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, + 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, + 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, + 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x29, + 0x0, 0x6a, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, + 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, + 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, + 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, + 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, + 0x0, 0x29, 0x0, 0x6a, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, + 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, + 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, + 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, + 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, + 0x8, 0xc8, 0x0, 0x29, 0x0, 0x6a, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, + 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, + 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, + 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, + 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, + 0x8, 0x89, 0x8, 0xc8, 0x0, 0x29, 0x0, 0x6a, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, + 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, + 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, + 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, + 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, + 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, + 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, + 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, + 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, + 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, + 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0xf, 0x0, 0x62, 0x0, 0xa2, + 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, + 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, + 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, + 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, + 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, + 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, + 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, + 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, + 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, + 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, + 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, + 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, + 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, + 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, + 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, + 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, + 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, + 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, + 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, + 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, + 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, + 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, + 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, + 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, + 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, + 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, + 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, + 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, + 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, + 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, + 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xe, 0x15, 0x1a, 0x1f, 0x26, 0x2b, 0x2d, 0x2e, 0x2f, 0x2c, 0x2a, + 0x24, 0x1f, 0x1a, 0x14, 0xf, 0x8, 0x3, 0x3, 0x6, 0xb, 0x10, 0x15, 0x1c, + 0x22, 0x28, 0x2d, 0x34, 0x39, 0x3d, 0x40, 0xe, 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, + 0xc, 0x11, 0x16, 0x1c, 0x23, 0x2b, 0x32, 0x37, 0x3c, 0x40, 0x45, 0x4a, 0x4d, + 0x4c, 0x4b, 0x4a, 0x48, 0x46, 0x46, 0x45, 0x45, 0x44, 0x44, 0x43, 0x44, + 0x45, 0x78, 0x65, 0x55, 0x0, 0x8, 0xe, 0x13, 0x17, 0x1b, 0x20, 0x23, 0x24, + 0x24, 0x24, 0x23, 0x21, 0x1e, 0x1d, 0x1b, 0x18, 0x16, 0x12, 0xf, 0x11, 0x14, + 0x1a, 0x21, 0x27, 0x2a, 0x2d, 0x32, 0x36, 0x3a, 0x3d, 0x40, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x11, 0x14, 0x19, 0x1e, 0x23, 0x27, 0x2b, + 0x2f, 0x34, 0x38, 0x3e, 0x3d, 0x3b, 0x36, 0x31, 0x2c, 0x2a, 0x27, 0x24, + 0x21, 0x1e, 0x1b, 0x1a, 0x5e, 0x9f, 0x65, 0x55, 0x2, 0xd, 0x14, 0x1b, 0x21, + 0x25, 0x2b, 0x31, 0x37, 0x36, 0x33, 0x2d, 0x28, 0x20, 0x19, 0x14, 0xd, 0x8, + 0x1, 0x2, 0x5, 0xb, 0x10, 0x18, 0x1e, 0x23, 0x2a, 0x30, 0x35, 0x3a, 0x3e, + 0x3f, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x9, 0xf, 0x15, + 0x1d, 0x24, 0x2a, 0x30, 0x35, 0x3b, 0x3e, 0x3f, 0x40, 0x3f, 0x3e, 0x3d, + 0x3d, 0x3c, 0x3c, 0x3b, 0x3b, 0x39, 0x37, 0x1a, 0x2d, 0x65, 0x55, 0x13, + 0x1c, 0x23, 0x28, 0x2d, 0x31, 0x36, 0x34, 0x30, 0x2b, 0x27, 0x24, 0x20, + 0x1b, 0x16, 0x12, 0xb, 0x6, 0x3, 0x0, 0x4, 0x8, 0xc, 0x13, 0x1b, 0x22, 0x27, + 0x2c, 0x32, 0x37, 0x3c, 0x40, 0x0, 0x1, 0x1, 0x2, 0x2, 0x3, 0x4, 0xa, 0x10, + 0x14, 0x19, 0x1d, 0x21, 0x26, 0x2b, 0x2f, 0x36, 0x3a, 0x3e, 0x41, 0x42, + 0x40, 0x3f, 0x3c, 0x3a, 0x38, 0x36, 0x34, 0x32, 0x31, 0x2f, 0x2e, 0xb5, + 0xca, 0x65, 0x55, 0x1b, 0x29, 0x27, 0x1e, 0x14, 0x11, 0x1a, 0x26, 0x2e, + 0x37, 0x3d, 0x3f, 0x3d, 0x37, 0x2e, 0x21, 0x16, 0xc, 0x5, 0x1, 0x0, 0x0, + 0x1, 0x3, 0xa, 0x13, 0x1d, 0x26, 0x2e, 0x33, 0x38, 0x3a, 0x16, 0x21, 0x2b, + 0x32, 0x30, 0x2a, 0x27, 0x2a, 0x2f, 0x2d, 0x24, 0x1a, 0x10, 0x7, 0x1, 0x0, + 0x2, 0x7, 0x10, 0x19, 0x23, 0x2d, 0x36, 0x41, 0x49, 0x4c, 0x4a, 0x45, 0x3c, + 0x34, 0x2a, 0x27, 0x51, 0x71, 0x50, 0x55, 0x28, 0x12, 0x11, 0x18, 0x23, + 0x29, 0x2b, 0x2a, 0x2e, 0x35, 0x3c, 0x3e, 0x3f, 0x39, 0x31, 0x28, 0x1e, + 0x15, 0xe, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xc, 0x16, 0x20, 0x2b, 0x32, 0x37, + 0x39, 0x20, 0x29, 0x32, 0x37, 0x31, 0x28, 0x21, 0x2a, 0x31, 0x2d, 0x23, + 0x1b, 0x13, 0x8, 0x1, 0x0, 0x1, 0x5, 0xc, 0x18, 0x20, 0x29, 0x34, 0x3e, + 0x47, 0x4f, 0x50, 0x4d, 0x45, 0x3c, 0x34, 0x31, 0x26, 0xcb, 0x50, 0x55, + 0x1d, 0x2f, 0x2c, 0x25, 0x1a, 0x1b, 0x20, 0x29, 0x31, 0x31, 0x2e, 0x2d, + 0x35, 0x3d, 0x3f, 0x3d, 0x38, 0x2c, 0x22, 0x15, 0xd, 0x6, 0x1, 0x0, 0x1, + 0x6, 0x10, 0x1b, 0x24, 0x2f, 0x38, 0x3d, 0xd, 0x1b, 0x27, 0x31, 0x32, 0x28, + 0x1e, 0x14, 0x15, 0x1d, 0x28, 0x31, 0x34, 0x2a, 0x1f, 0x14, 0x9, 0x1, 0x0, + 0x4, 0xd, 0x17, 0x21, 0x2c, 0x35, 0x40, 0x47, 0x47, 0x44, 0x3c, 0x34, 0x30, + 0x1b, 0x82, 0x50, 0x55, 0x19, 0x2e, 0x2a, 0x1f, 0x18, 0x1b, 0x22, 0x2d, + 0x30, 0x2e, 0x2e, 0x35, 0x3d, 0x3f, 0x3d, 0x3a, 0x2f, 0x24, 0x18, 0xf, 0x7, + 0x1, 0x0, 0x0, 0x3, 0xb, 0x16, 0x1e, 0x29, 0x32, 0x3a, 0x3d, 0x11, 0x1f, + 0x28, 0x32, 0x30, 0x26, 0x1b, 0x14, 0x1c, 0x25, 0x2e, 0x35, 0x2e, 0x23, + 0x19, 0x11, 0x4, 0x0, 0x1, 0x8, 0x10, 0x1c, 0x25, 0x30, 0x38, 0x40, 0x42, + 0x3f, 0x39, 0x32, 0x2c, 0x27, 0xc0, 0xd1, 0x50, 0x55, 0x18, 0x2c, 0x29, + 0x1e, 0x14, 0x13, 0x16, 0x1e, 0x29, 0x30, 0x2e, 0x2c, 0x2b, 0x37, 0x3d, + 0x3f, 0x3e, 0x39, 0x30, 0x25, 0x1b, 0x10, 0x8, 0x1, 0x0, 0x2, 0x9, 0x13, + 0x1f, 0x2d, 0x38, 0x3c, 0x11, 0x1a, 0x23, 0x2f, 0x33, 0x29, 0x20, 0x16, 0xe, + 0x13, 0x1d, 0x28, 0x32, 0x31, 0x28, 0x1e, 0x16, 0xb, 0x2, 0x0, 0x1, 0x8, + 0x12, 0x1e, 0x29, 0x33, 0x3b, 0x3f, 0x3c, 0x32, 0x29, 0x26, 0x30, 0x6e, + 0x50, 0x55, 0x16, 0x2b, 0x24, 0x17, 0xd, 0xa, 0xe, 0x15, 0x24, 0x28, 0x25, + 0x23, 0x2b, 0x36, 0x3b, 0x3d, 0x3b, 0x37, 0x2b, 0x20, 0x15, 0xb, 0x4, 0x0, + 0x0, 0x3, 0xe, 0x19, 0x27, 0x33, 0x3d, 0x3f, 0x13, 0x21, 0x2e, 0x37, 0x3a, + 0x31, 0x27, 0x1c, 0x13, 0x1c, 0x28, 0x34, 0x3e, 0x37, 0x2d, 0x22, 0x18, 0xc, + 0x1, 0x0, 0x3, 0xd, 0x18, 0x25, 0x31, 0x3c, 0x47, 0x48, 0x42, 0x38, 0x2e, + 0x2a, 0x31, 0x62, 0x50, 0x55, 0x35, 0x2e, 0x27, 0x22, 0x1f, 0x1b, 0x16, + 0x10, 0xc, 0x8, 0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12, + 0x17, 0x1d, 0x22, 0x26, 0x2a, 0x30, 0x35, 0x39, 0x3d, 0x3f, 0x0, 0x0, 0x1, + 0x4, 0x6, 0x8, 0xb, 0x10, 0x16, 0x1b, 0x1f, 0x23, 0x28, 0x2d, 0x32, 0x36, + 0x3b, 0x40, 0x44, 0x48, 0x4a, 0x4b, 0x4c, 0x4b, 0x4a, 0x48, 0x46, 0x43, + 0x40, 0x3e, 0x3c, 0x3a, 0x3c, 0x9c, 0x34, 0x55, 0x2d, 0x28, 0x24, 0x22, + 0x1f, 0x1c, 0x19, 0x16, 0x13, 0x10, 0xc, 0x8, 0x5, 0x2, 0x0, 0x3, 0x7, 0xa, + 0xe, 0x11, 0x16, 0x19, 0x1e, 0x22, 0x27, 0x2c, 0x30, 0x33, 0x36, 0x39, 0x3d, + 0x40, 0x0, 0x2, 0x6, 0x9, 0xb, 0xe, 0x11, 0x14, 0x16, 0x18, 0x1b, 0x1f, + 0x22, 0x25, 0x28, 0x29, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x32, 0x33, + 0x35, 0x36, 0x38, 0x39, 0x3b, 0x3c, 0x3e, 0x40, 0xac, 0x6a, 0x51, 0x55, + 0x25, 0x1e, 0x1a, 0x17, 0x15, 0x11, 0xe, 0xb, 0x9, 0x7, 0x4, 0x2, 0x1, 0x2, + 0x5, 0x9, 0xd, 0x10, 0x13, 0x17, 0x1b, 0x1e, 0x21, 0x25, 0x29, 0x2d, 0x30, + 0x33, 0x37, 0x3b, 0x3e, 0x40, 0x0, 0x6, 0xc, 0x10, 0x13, 0x19, 0x1f, 0x23, + 0x27, 0x2b, 0x2f, 0x33, 0x36, 0x38, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, + 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3f, 0x40, + 0xca, 0xd8, 0x51, 0x55, 0x9, 0x17, 0x1d, 0x26, 0x2e, 0x37, 0x3c, 0x3f, 0x3b, + 0x33, 0x2b, 0x22, 0x1a, 0x11, 0xb, 0x5, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, + 0x6, 0xa, 0x11, 0x19, 0x22, 0x2a, 0x32, 0x39, 0x3d, 0x30, 0x30, 0x2f, 0x2c, + 0x26, 0x1e, 0x17, 0xd, 0x5, 0x0, 0x0, 0x1, 0x6, 0xe, 0x15, 0x1e, 0x26, 0x2c, + 0x32, 0x3a, 0x41, 0x48, 0x50, 0x5b, 0x61, 0x64, 0x64, 0x60, 0x5b, 0x56, + 0x51, 0x4f, 0xd8, 0x2c, 0x33, 0x55, 0x6, 0x11, 0x18, 0x1e, 0x22, 0x27, 0x2a, + 0x2c, 0x29, 0x25, 0x1f, 0x18, 0x11, 0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, + 0xa, 0x11, 0x18, 0x20, 0x26, 0x2c, 0x32, 0x36, 0x3b, 0x3d, 0x3f, 0x48, 0x37, + 0x2e, 0x24, 0x1a, 0x11, 0xa, 0x4, 0x0, 0x0, 0x1, 0x5, 0xb, 0x12, 0x1b, 0x21, + 0x28, 0x30, 0x37, 0x41, 0x47, 0x4e, 0x54, 0x53, 0x4e, 0x48, 0x41, 0x3b, + 0x33, 0x2c, 0x28, 0x25, 0xb, 0x67, 0x33, 0x55, 0x26, 0x1c, 0x19, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x17, 0x15, 0xf, 0x9, 0x4, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x12, 0x18, 0x1f, 0x28, 0x31, 0x37, 0x3c, + 0x40, 0x1, 0x7, 0xe, 0x14, 0x1c, 0x23, 0x2c, 0x34, 0x3e, 0x44, 0x4c, 0x54, + 0x5b, 0x60, 0x5d, 0x55, 0x4f, 0x49, 0x43, 0x3d, 0x38, 0x32, 0x2b, 0x26, + 0x22, 0x1f, 0x1e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x66, 0x54, 0x74, 0x55, + 0x3e, 0x2c, 0x21, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1e, 0x1e, 0x1d, 0x1a, 0x11, 0xc, 0x7, 0x2, 0x0, 0x0, 0x3, 0xa, + 0x12, 0x1c, 0x23, 0x2c, 0x38, 0x40, 0xc, 0x0, 0x6, 0xf, 0x17, 0x22, 0x29, + 0x32, 0x3b, 0x41, 0x47, 0x4f, 0x55, 0x5c, 0x66, 0x71, 0x79, 0x3e, 0x76, + 0x6d, 0x64, 0x5a, 0x52, 0x4b, 0x42, 0x39, 0x35, 0x33, 0x32, 0x32, 0x31, + 0x31, 0xf3, 0xdb, 0x74, 0x55, 0x9, 0x7, 0x6, 0x6, 0x5, 0x5, 0x4, 0x4, 0x4, + 0x4, 0x3, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa, 0x10, 0x14, + 0x1b, 0x22, 0x28, 0x2e, 0x34, 0x39, 0x3d, 0x40, 0x0, 0xb, 0x11, 0x16, 0x1b, + 0x22, 0x28, 0x2c, 0x33, 0x39, 0x40, 0x46, 0x4d, 0x52, 0x56, 0x5c, 0x61, + 0x68, 0x6d, 0x73, 0x73, 0x71, 0x71, 0x71, 0x70, 0x70, 0x6f, 0x6f, 0x6f, + 0x6f, 0x6d, 0x6e, 0x79, 0x80, 0x44, 0x55, 0x17, 0x13, 0x12, 0x12, 0x11, + 0x10, 0xf, 0xd, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, + 0x1, 0x4, 0xb, 0x10, 0x16, 0x1d, 0x24, 0x29, 0x31, 0x39, 0x3d, 0x40, 0x0, + 0xe, 0x16, 0x1a, 0x1f, 0x24, 0x29, 0x2e, 0x33, 0x38, 0x3e, 0x43, 0x47, 0x50, + 0x55, 0x59, 0x62, 0x69, 0x6e, 0x75, 0x7c, 0xff, 0x7d, 0x7c, 0x79, 0x73, + 0x6d, 0x68, 0x60, 0x5a, 0x57, 0x56, 0x5d, 0x8, 0x44, 0x55, 0x0, 0x7, 0xb, + 0xd, 0x10, 0x12, 0x16, 0x17, 0x17, 0x18, 0x18, 0x19, 0x19, 0x19, 0x1c, 0x1e, + 0x20, 0x22, 0x23, 0x25, 0x27, 0x29, 0x2b, 0x30, 0x32, 0x33, 0x35, 0x38, + 0x39, 0x3b, 0x3d, 0x3f, 0x3e, 0x29, 0x1f, 0x18, 0xf, 0x7, 0x6, 0xc, 0x12, + 0x1d, 0x25, 0x2d, 0x36, 0x3e, 0x3b, 0x35, 0x2c, 0x26, 0x20, 0x19, 0x11, 0xa, + 0x3, 0x3, 0x9, 0x10, 0x18, 0x24, 0x2c, 0x33, 0x3a, 0x3e, 0x60, 0x9b, 0x32, + 0x55, 0x0, 0x5, 0x5, 0x5, 0x4, 0x3, 0x2, 0x3, 0x5, 0x7, 0xa, 0xe, 0x11, + 0x19, 0x1b, 0x1c, 0x1d, 0x1c, 0x1c, 0x1d, 0x1f, 0x22, 0x25, 0x2a, 0x31, + 0x33, 0x35, 0x37, 0x38, 0x39, 0x3c, 0x40, 0x0, 0x12, 0x1c, 0x24, 0x2b, 0x34, + 0x3c, 0x39, 0x2f, 0x29, 0x21, 0x16, 0xf, 0xd, 0x14, 0x1e, 0x2a, 0x33, 0x31, + 0x27, 0x20, 0x18, 0x10, 0x7, 0xa, 0x10, 0x1a, 0x26, 0x2f, 0x37, 0x3d, 0x3f, + 0xfb, 0x8f, 0x32, 0x55, 0x2, 0x2, 0x2, 0x3, 0x3, 0x2, 0x4, 0xd, 0x14, 0x1b, + 0x22, 0x2a, 0x31, 0x37, 0x3b, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3d, 0x3e, + 0x3e, 0x37, 0x31, 0x2a, 0x23, 0x19, 0x12, 0xa, 0x3, 0x0, 0x8, 0x18, 0x21, + 0x2b, 0x32, 0x38, 0x3d, 0x40, 0x41, 0x43, 0x44, 0x45, 0x45, 0x45, 0x42, + 0x38, 0x31, 0x28, 0x21, 0x15, 0xc, 0x5, 0x0, 0x0, 0x1, 0x1, 0x2, 0x4, 0x5, + 0x6, 0x7, 0x8, 0x27, 0x90, 0xff, 0x55, 0x0, 0x16, 0x22, 0x2c, 0x37, 0x3e, + 0x3e, 0x3d, 0x3d, 0x3d, 0x3d, 0x3e, 0x3f, 0x3f, 0x3d, 0x33, 0x2a, 0x1e, + 0x15, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x2, 0x62, + 0x62, 0x62, 0x62, 0x62, 0x60, 0x58, 0x4c, 0x41, 0x36, 0x2b, 0x1f, 0x13, 0x9, + 0x0, 0x1, 0x1, 0x3, 0x4, 0x5, 0x7, 0x10, 0x1b, 0x23, 0x2e, 0x39, 0x41, 0x4d, + 0x57, 0x63, 0x6d, 0x71, 0xb0, 0x7d, 0xff, 0x55, 0x3f, 0x3f, 0x3e, 0x3e, + 0x3f, 0x3f, 0x3f, 0x39, 0x31, 0x2a, 0x23, 0x1a, 0x13, 0xd, 0x8, 0x7, 0x6, + 0x4, 0x3, 0x2, 0x1, 0x0, 0x2, 0x7, 0x11, 0x17, 0x1d, 0x24, 0x2b, 0x33, 0x39, + 0x3d, 0x38, 0x26, 0x1e, 0x17, 0x10, 0x6, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x2, + 0x2, 0x6, 0xe, 0x15, 0x1c, 0x25, 0x2c, 0x34, 0x3a, 0x3f, 0x3e, 0x3e, 0x3e, + 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x85, 0xdb, 0xff, 0x55, 0x40, 0x2d, + 0x25, 0x1c, 0x15, 0xc, 0x6, 0x5, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x2, 0x8, + 0xf, 0x18, 0x21, 0x2c, 0x33, 0x3c, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c, + 0x3c, 0x3d, 0x3e, 0x5, 0x3, 0x2, 0x2, 0x2, 0x2, 0x4, 0xb, 0x13, 0x1e, 0x26, + 0x30, 0x38, 0x40, 0x45, 0x45, 0x45, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x49, + 0x3f, 0x36, 0x2a, 0x23, 0x19, 0x13, 0xa, 0x3, 0x0, 0xc5, 0x68, 0xff, 0x55, + 0x4, 0x17, 0x20, 0x29, 0x31, 0x3a, 0x3e, 0x3c, 0x3c, 0x3d, 0x3d, 0x3e, 0x3e, + 0x3e, 0x3d, 0x37, 0x2d, 0x23, 0x1b, 0x10, 0x9, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x3, 0x3, 0x1, 0x1, 0x0, 0x4, 0xc, 0x14, 0x1b, + 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x4b, 0x4b, 0x4c, 0x4c, 0x4d, 0x4e, 0x4f, + 0x47, 0x3f, 0x36, 0x2e, 0x26, 0x1d, 0x13, 0xb, 0x4, 0x1, 0xcb, 0xef, 0xff, + 0x55, 0x3a, 0x3b, 0x3c, 0x3d, 0x3d, 0x3e, 0x3c, 0x37, 0x2e, 0x25, 0x1e, + 0x16, 0xe, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x2, 0x2, 0x3, 0xc, 0x14, + 0x1d, 0x27, 0x2e, 0x36, 0x3c, 0x40, 0xb, 0x1d, 0x28, 0x33, 0x3c, 0x45, 0x4f, + 0x52, 0x54, 0x55, 0x56, 0x56, 0x56, 0x56, 0x52, 0x48, 0x41, 0x37, 0x2c, + 0x23, 0x18, 0xf, 0x7, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, + 0x9, 0xff, 0x55, 0x38, 0x25, 0x1b, 0x15, 0xc, 0x5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x7, 0xf, 0x1a, 0x21, 0x2a, 0x30, 0x38, 0x3e, 0x3d, + 0x3d, 0x3c, 0x3c, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x43, 0x45, 0x46, + 0x47, 0x49, 0x46, 0x40, 0x38, 0x30, 0x26, 0x1e, 0x16, 0xf, 0x6, 0x5, 0x4, + 0x3, 0x3, 0x2, 0x2, 0x0, 0x1, 0x8, 0x10, 0x19, 0x21, 0x2a, 0x31, 0x3b, 0x41, + 0x45, 0x97, 0x8c, 0xff, 0x55, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x7, 0xf, 0x18, 0x22, 0x2a, 0x33, 0x3b, 0x3c, 0x3c, 0x3c, 0x3d, 0x3e, 0x3e, + 0x3f, 0x3e, 0x36, 0x2e, 0x25, 0x1f, 0x17, 0xd, 0x5, 0x2, 0x50, 0x3c, 0x34, + 0x2b, 0x22, 0x19, 0x12, 0x9, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x0, 0x0, 0x5, + 0xd, 0x17, 0x22, 0x2b, 0x33, 0x3c, 0x43, 0x45, 0x47, 0x48, 0x48, 0x49, 0x49, + 0x4a, 0x4b, 0xa3, 0x50, 0xff, 0x55, 0x15, 0xf, 0xb, 0x9, 0x7, 0x5, 0x4, 0x2, + 0x0, 0x3, 0x8, 0xe, 0x13, 0x19, 0x1f, 0x25, 0x2a, 0x2f, 0x34, 0x39, 0x3e, + 0x3d, 0x38, 0x33, 0x2d, 0x28, 0x24, 0x1f, 0x1c, 0x17, 0x13, 0x11, 0x7, 0x12, + 0x1a, 0x1f, 0x24, 0x2b, 0x30, 0x36, 0x3c, 0x3f, 0x3f, 0x3e, 0x3d, 0x3c, + 0x3a, 0x3a, 0x39, 0x39, 0x38, 0x37, 0x35, 0x30, 0x29, 0x22, 0x1b, 0x16, + 0x11, 0xd, 0x9, 0x4, 0x1, 0x0, 0x62, 0x83, 0xff, 0x55, 0x1, 0xd, 0x13, 0x1a, + 0x21, 0x28, 0x2e, 0x35, 0x3b, 0x3f, 0x3c, 0x39, 0x35, 0x30, 0x2c, 0x27, + 0x22, 0x1e, 0x1c, 0x18, 0x13, 0x10, 0xd, 0xa, 0x8, 0x6, 0x5, 0x3, 0x2, 0x1, + 0x0, 0x0, 0x46, 0x43, 0x43, 0x42, 0x42, 0x41, 0x41, 0x40, 0x40, 0x3d, 0x39, + 0x32, 0x2b, 0x24, 0x1f, 0x19, 0x12, 0xc, 0x7, 0x1, 0x4, 0xb, 0x12, 0x17, + 0x1f, 0x25, 0x2b, 0x31, 0x38, 0x3f, 0x44, 0x47, 0x95, 0x9c, 0xff, 0x55, 0x4, + 0x9, 0xc, 0x10, 0x14, 0x17, 0x1b, 0x1f, 0x22, 0x25, 0x28, 0x2b, 0x2d, 0x2e, + 0x30, 0x33, 0x35, 0x38, 0x3a, 0x3d, 0x3e, 0x3f, 0x3e, 0x37, 0x31, 0x29, + 0x20, 0x18, 0x10, 0x9, 0x3, 0x0, 0x54, 0x45, 0x3e, 0x35, 0x2d, 0x25, 0x1d, + 0x13, 0xb, 0x5, 0x3, 0xa, 0x12, 0x19, 0x1f, 0x27, 0x2e, 0x35, 0x3c, 0x44, + 0x4c, 0x52, 0x58, 0x5b, 0x5c, 0x5b, 0x5a, 0x59, 0x58, 0x57, 0x57, 0x57, + 0x2b, 0xc6, 0xff, 0x55, 0x19, 0x1d, 0x21, 0x26, 0x28, 0x2d, 0x32, 0x36, + 0x3a, 0x3d, 0x3e, 0x3e, 0x36, 0x31, 0x29, 0x21, 0x1b, 0x14, 0xe, 0x9, 0x3, + 0x1, 0x4, 0x7, 0xb, 0xe, 0x12, 0x16, 0x19, 0x1c, 0x1f, 0x20, 0x0, 0xb, 0x13, + 0x1b, 0x21, 0x28, 0x31, 0x38, 0x40, 0x46, 0x4b, 0x4f, 0x50, 0x50, 0x4f, + 0x4d, 0x4c, 0x4c, 0x4b, 0x4a, 0x4a, 0x46, 0x40, 0x39, 0x31, 0x2a, 0x23, + 0x1b, 0x15, 0xf, 0xa, 0x7, 0xb3, 0x46, 0xff, 0x55, 0x40, 0x2c, 0x23, 0x1b, + 0x12, 0xc, 0x5, 0x0, 0x3, 0x6, 0xa, 0xc, 0x10, 0x15, 0x19, 0x1c, 0x1f, 0x21, + 0x23, 0x28, 0x2a, 0x2c, 0x2f, 0x31, 0x33, 0x35, 0x37, 0x38, 0x39, 0x3b, + 0x3c, 0x3e, 0x5f, 0x5f, 0x60, 0x60, 0x5f, 0x5f, 0x5f, 0x5c, 0x54, 0x4e, + 0x44, 0x3e, 0x37, 0x2b, 0x22, 0x1b, 0x12, 0xb, 0x3, 0x4, 0xb, 0x12, 0x1e, + 0x27, 0x30, 0x3a, 0x43, 0x4b, 0x53, 0x59, 0x60, 0x64, 0x1f, 0xdb, 0xff, + 0x55, 0x1b, 0x14, 0x11, 0xf, 0xc, 0xa, 0x7, 0x5, 0x3, 0x0, 0x2, 0x7, 0xc, + 0x12, 0x17, 0x1e, 0x25, 0x2a, 0x30, 0x36, 0x3c, 0x40, 0x3e, 0x3b, 0x3a, + 0x37, 0x35, 0x30, 0x2c, 0x27, 0x23, 0x20, 0x0, 0xc, 0x14, 0x19, 0x1f, 0x24, + 0x2b, 0x31, 0x36, 0x3c, 0x3f, 0x3e, 0x3e, 0x3d, 0x3d, 0x3c, 0x3b, 0x3b, + 0x3a, 0x3a, 0x3a, 0x35, 0x2d, 0x25, 0x21, 0x1b, 0x15, 0xd, 0x8, 0x4, 0x1, + 0x0, 0x72, 0x5e, 0xff, 0x55, 0x19, 0x13, 0x11, 0xf, 0xc, 0xa, 0x7, 0x5, 0x3, + 0x0, 0x3, 0x8, 0x10, 0x15, 0x1a, 0x21, 0x26, 0x2c, 0x31, 0x37, 0x3d, 0x3c, + 0x38, 0x34, 0x31, 0x2c, 0x28, 0x23, 0x20, 0x1d, 0x19, 0x17, 0x0, 0xb, 0x12, + 0x18, 0x1e, 0x23, 0x28, 0x2d, 0x33, 0x3a, 0x3e, 0x3e, 0x3f, 0x3f, 0x40, + 0x40, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3b, 0x36, 0x2f, 0x2a, 0x23, 0x1d, + 0x16, 0x12, 0xc, 0x7, 0x4, 0x99, 0x97, 0xff, 0x55, 0x1b, 0x14, 0x12, 0xf, + 0xd, 0x9, 0x6, 0x3, 0x0, 0x6, 0xc, 0x12, 0x17, 0x1e, 0x24, 0x29, 0x2e, 0x34, + 0x3c, 0x3f, 0x3d, 0x3b, 0x38, 0x35, 0x31, 0x2e, 0x29, 0x25, 0x21, 0x1d, + 0x19, 0x15, 0x0, 0xd, 0x14, 0x1c, 0x23, 0x2c, 0x32, 0x3a, 0x3f, 0x3e, 0x3e, + 0x3e, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3d, 0x3a, 0x34, 0x30, 0x29, + 0x25, 0x1e, 0x18, 0x12, 0xe, 0x8, 0x4, 0x1, 0x1, 0x11, 0x7d, 0xff, 0x55, + 0x1e, 0x15, 0x12, 0x10, 0xc, 0x9, 0x7, 0x4, 0x2, 0x0, 0x3, 0x8, 0xe, 0x15, + 0x1b, 0x22, 0x28, 0x2e, 0x33, 0x39, 0x3f, 0x3f, 0x3d, 0x39, 0x36, 0x2f, + 0x2b, 0x28, 0x23, 0x1f, 0x1b, 0x18, 0x0, 0xb, 0x13, 0x18, 0x20, 0x26, 0x2c, + 0x33, 0x39, 0x3f, 0x41, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, + 0x40, 0x3c, 0x37, 0x33, 0x2a, 0x24, 0x1c, 0x15, 0x10, 0xa, 0x6, 0x1, 0x0, + 0x33, 0xd1, 0xff, 0x55, 0x1d, 0x15, 0x12, 0xe, 0xc, 0x9, 0x7, 0x4, 0x2, 0x0, + 0x3, 0x8, 0xe, 0x14, 0x19, 0x1e, 0x23, 0x29, 0x2e, 0x34, 0x3b, 0x3e, 0x3f, + 0x3e, 0x3b, 0x38, 0x35, 0x31, 0x2c, 0x27, 0x22, 0x1f, 0x6, 0x12, 0x17, 0x1e, + 0x24, 0x29, 0x2e, 0x34, 0x39, 0x3e, 0x3f, 0x3f, 0x3e, 0x3e, 0x3d, 0x3d, + 0x3c, 0x3c, 0x3b, 0x3a, 0x37, 0x33, 0x2d, 0x28, 0x20, 0x1b, 0x15, 0x10, 0x9, + 0x3, 0x0, 0x0, 0xa4, 0xaf, 0xff, 0x55, 0x2c, 0x23, 0x1f, 0x19, 0x13, 0xc, + 0x7, 0x3, 0x0, 0x0, 0x0, 0x1, 0x5, 0xa, 0xf, 0x16, 0x1d, 0x23, 0x2a, 0x30, + 0x36, 0x3b, 0x3e, 0x40, 0x3f, 0x3e, 0x3b, 0x38, 0x33, 0x2f, 0x2b, 0x28, 0x9, + 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14, 0x1b, 0x21, 0x27, 0x2e, 0x36, 0x3b, + 0x3e, 0x41, 0x41, 0x40, 0x3d, 0x3a, 0x36, 0x2f, 0x2b, 0x26, 0x20, 0x1c, + 0x16, 0x10, 0xc, 0xa, 0x9, 0xb, 0x36, 0xdc, 0x30, 0x55, 0x1a, 0x9, 0x5, 0x1, + 0x0, 0x0, 0x0, 0x2, 0x5, 0x9, 0xf, 0x16, 0x1c, 0x22, 0x2a, 0x31, 0x36, 0x39, + 0x3c, 0x3e, 0x3f, 0x3f, 0x3d, 0x38, 0x30, 0x27, 0x1f, 0x18, 0x12, 0xb, 0x6, + 0x5, 0x7, 0x12, 0x19, 0x22, 0x2c, 0x36, 0x3f, 0x49, 0x53, 0x5c, 0x63, 0x66, + 0x64, 0x5f, 0x58, 0x4c, 0x43, 0x3d, 0x34, 0x2b, 0x22, 0x1b, 0x15, 0xb, 0x4, + 0x0, 0x0, 0x1, 0x4, 0xb, 0x13, 0x18, 0xf1, 0xc, 0x30, 0x55, 0x18, 0x2c, + 0x34, 0x39, 0x3c, 0x3d, 0x3f, 0x3f, 0x3f, 0x3d, 0x3b, 0x36, 0x30, 0x2a, + 0x24, 0x1c, 0x16, 0xd, 0x6, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x5, 0x9, + 0xf, 0x17, 0x1e, 0x24, 0x1, 0x2, 0x8, 0xe, 0x14, 0x1a, 0x21, 0x28, 0x30, + 0x37, 0x40, 0x49, 0x50, 0x55, 0x59, 0x5c, 0x5c, 0x58, 0x51, 0x48, 0x3f, + 0x38, 0x31, 0x2b, 0x25, 0x1d, 0x17, 0x11, 0xa, 0x4, 0x1, 0x1, 0x9d, 0xbf, + 0x30, 0x55, 0x16, 0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16, + 0x1f, 0x28, 0x30, 0x38, 0x3c, 0x3e, 0x3f, 0x40, 0x3f, 0x3f, 0x3d, 0x3b, + 0x37, 0x32, 0x2c, 0x25, 0x1d, 0x16, 0xf, 0xc, 0x53, 0x46, 0x3e, 0x35, 0x2e, + 0x27, 0x20, 0x1a, 0x14, 0xd, 0x6, 0x1, 0x0, 0x0, 0x3, 0xa, 0x13, 0x1a, 0x20, + 0x27, 0x2d, 0x33, 0x3a, 0x40, 0x48, 0x4f, 0x54, 0x58, 0x5a, 0x5a, 0x58, + 0x57, 0xc6, 0x55, 0x30, 0x55, 0x7, 0x1, 0x4, 0xa, 0x10, 0x18, 0x20, 0x2a, + 0x32, 0x38, 0x3c, 0x3e, 0x3f, 0x3e, 0x3d, 0x3b, 0x39, 0x35, 0x30, 0x27, + 0x21, 0x19, 0x12, 0xb, 0x6, 0x3, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x1d, + 0x12, 0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, 0xd, 0x17, 0x20, 0x2a, 0x32, 0x3b, + 0x45, 0x4e, 0x58, 0x63, 0x69, 0x6b, 0x6a, 0x64, 0x5d, 0x57, 0x4f, 0x47, + 0x40, 0x38, 0x32, 0x2f, 0x1a, 0xb5, 0x30, 0x55, 0x21, 0x13, 0xc, 0x8, 0x5, + 0x2, 0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17, 0x1e, 0x24, 0x2b, 0x32, 0x39, + 0x3d, 0x3e, 0x3f, 0x3f, 0x3d, 0x3a, 0x36, 0x30, 0x29, 0x21, 0x1a, 0x16, + 0x13, 0x5, 0x9, 0xe, 0x14, 0x1a, 0x22, 0x29, 0x30, 0x38, 0x3f, 0x47, 0x4d, + 0x51, 0x51, 0x4f, 0x4d, 0x49, 0x42, 0x39, 0x31, 0x2b, 0x25, 0x1e, 0x17, + 0x10, 0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf, 0x13, 0x30, 0x55, 0x38, 0x3f, + 0x3d, 0x3a, 0x36, 0x2e, 0x26, 0x1f, 0x14, 0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, + 0x2, 0x5, 0x9, 0xe, 0x14, 0x1c, 0x23, 0x2a, 0x34, 0x38, 0x3a, 0x3b, 0x3d, + 0x3d, 0x3d, 0x3d, 0x29, 0x1a, 0x10, 0x9, 0x4, 0x0, 0x0, 0x1, 0x4, 0xc, 0x14, + 0x1c, 0x22, 0x28, 0x2f, 0x37, 0x3f, 0x47, 0x4f, 0x56, 0x5a, 0x5b, 0x59, + 0x56, 0x4e, 0x47, 0x40, 0x37, 0x30, 0x28, 0x22, 0x1f, 0x2a, 0xa9, 0x30, + 0x55, 0x3e, 0x3b, 0x38, 0x33, 0x2b, 0x24, 0x1d, 0x16, 0x10, 0x7, 0x3, 0x1, + 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x6, 0xc, 0x15, 0x1c, 0x23, 0x29, 0x2f, 0x35, + 0x38, 0x3b, 0x3c, 0x3e, 0x3f, 0x3f, 0x1f, 0x10, 0xa, 0x6, 0x0, 0x0, 0x0, + 0x2, 0x4, 0xc, 0x12, 0x18, 0x1e, 0x25, 0x2c, 0x35, 0x3c, 0x42, 0x4a, 0x51, + 0x56, 0x56, 0x53, 0x4e, 0x49, 0x40, 0x3a, 0x33, 0x2c, 0x25, 0x1f, 0x1c, + 0xf9, 0xa2, 0x30, 0x55, 0x1f, 0x2b, 0x31, 0x35, 0x38, 0x3b, 0x3e, 0x3f, + 0x3f, 0x3d, 0x3a, 0x34, 0x2d, 0x27, 0x23, 0x1d, 0x17, 0x10, 0x9, 0x4, 0x1, + 0x0, 0x0, 0x1, 0x3, 0x6, 0xa, 0xf, 0x15, 0x1b, 0x20, 0x23, 0x45, 0x42, 0x3e, + 0x38, 0x34, 0x2d, 0x24, 0x1c, 0x15, 0x11, 0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, + 0x3, 0x7, 0xd, 0x12, 0x18, 0x20, 0x28, 0x30, 0x36, 0x3c, 0x42, 0x47, 0x48, + 0x49, 0x4a, 0x65, 0x9d, 0x30, 0x55, 0x1c, 0x2a, 0x33, 0x39, 0x3c, 0x3e, + 0x3f, 0x3f, 0x3e, 0x3d, 0x3a, 0x35, 0x2e, 0x28, 0x23, 0x1c, 0x15, 0xf, 0x9, + 0x4, 0x1, 0x0, 0x0, 0x1, 0x1, 0x4, 0x8, 0xd, 0x13, 0x19, 0x1e, 0x22, 0x40, + 0x3e, 0x3a, 0x33, 0x2f, 0x29, 0x22, 0x1b, 0x15, 0x10, 0xa, 0x5, 0x1, 0x0, + 0x0, 0x1, 0x2, 0x5, 0xa, 0x11, 0x17, 0x1c, 0x24, 0x2a, 0x30, 0x35, 0x3b, + 0x40, 0x43, 0x44, 0x45, 0x45, 0xcb, 0xc6, 0x30, 0x55, 0x5, 0x3, 0x4, 0x7, + 0xa, 0x10, 0x17, 0x21, 0x28, 0x2e, 0x33, 0x38, 0x3c, 0x3e, 0x3f, 0x3f, 0x3e, + 0x3b, 0x38, 0x31, 0x29, 0x21, 0x18, 0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x26, 0x35, 0x3d, 0x45, 0x4b, 0x51, 0x53, 0x52, 0x4f, 0x4c, 0x46, 0x41, + 0x3b, 0x34, 0x2e, 0x25, 0x1e, 0x17, 0x11, 0x9, 0x3, 0x0, 0x0, 0x2, 0x6, 0xc, + 0x12, 0x18, 0x1e, 0x24, 0x2c, 0x31, 0xf4, 0xb6, 0x30, 0x55, 0xa, 0x5, 0x5, + 0x5, 0x8, 0xf, 0x16, 0x20, 0x29, 0x31, 0x36, 0x3a, 0x3c, 0x3e, 0x3f, 0x3f, + 0x3e, 0x3c, 0x3a, 0x33, 0x2d, 0x24, 0x1c, 0x14, 0xf, 0x8, 0x4, 0x0, 0x0, + 0x0, 0x1, 0x2, 0x35, 0x46, 0x4e, 0x56, 0x5d, 0x65, 0x68, 0x66, 0x60, 0x57, + 0x4f, 0x47, 0x3f, 0x37, 0x2e, 0x25, 0x1e, 0x16, 0x10, 0x6, 0x2, 0x0, 0x1, + 0x5, 0xb, 0x15, 0x1d, 0x28, 0x2f, 0x39, 0x41, 0x45, 0xf0, 0xbc, 0x30, 0x55, + 0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17, 0x20, 0x28, 0x30, 0x36, 0x3b, 0x3d, + 0x3f, 0x3f, 0x3d, 0x39, 0x36, 0x2d, 0x25, 0x1d, 0x16, 0xd, 0x8, 0x2, 0x0, + 0x0, 0x1, 0x2, 0x3, 0x5, 0x2e, 0x3f, 0x48, 0x50, 0x59, 0x5f, 0x67, 0x68, + 0x63, 0x5d, 0x52, 0x4a, 0x3e, 0x35, 0x2b, 0x20, 0x18, 0x10, 0xa, 0x3, 0x0, + 0x0, 0x1, 0x7, 0xe, 0x19, 0x22, 0x2b, 0x31, 0x3a, 0x42, 0x47, 0xef, 0xc9, + 0x30, 0x55, 0x3b, 0x3c, 0x3c, 0x3b, 0x39, 0x36, 0x2f, 0x27, 0x21, 0x19, + 0x11, 0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x4, 0x6, 0xa, 0x10, 0x16, 0x1f, + 0x26, 0x2d, 0x33, 0x39, 0x3c, 0x3e, 0x3f, 0x3f, 0x22, 0x31, 0x3b, 0x41, + 0x47, 0x4d, 0x56, 0x59, 0x5a, 0x58, 0x55, 0x51, 0x4b, 0x43, 0x3d, 0x35, + 0x29, 0x20, 0x18, 0x11, 0x9, 0x3, 0x0, 0x0, 0x1, 0x3, 0x7, 0xf, 0x15, 0x1b, + 0x21, 0x26, 0x2b, 0xa0, 0x30, 0x55, 0x37, 0x38, 0x37, 0x34, 0x2d, 0x26, + 0x1c, 0x16, 0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x10, + 0x17, 0x20, 0x26, 0x2e, 0x35, 0x3a, 0x3c, 0x3e, 0x3f, 0x3f, 0x3e, 0x3e, + 0x30, 0x40, 0x49, 0x50, 0x59, 0x5e, 0x60, 0x5d, 0x56, 0x50, 0x47, 0x41, + 0x39, 0x33, 0x2a, 0x20, 0x1a, 0x10, 0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10, + 0x17, 0x1f, 0x25, 0x2f, 0x38, 0x3c, 0x37, 0xc3, 0x30, 0x55, 0x3b, 0x3d, + 0x3d, 0x3b, 0x38, 0x32, 0x27, 0x1c, 0x13, 0xe, 0x8, 0x3, 0x0, 0x0, 0x0, 0x1, + 0x3, 0x7, 0xb, 0x12, 0x18, 0x20, 0x28, 0x31, 0x39, 0x3d, 0x3f, 0x40, 0x3f, + 0x3f, 0x3e, 0x3e, 0x33, 0x45, 0x4e, 0x57, 0x5d, 0x65, 0x6c, 0x6a, 0x66, + 0x63, 0x5c, 0x53, 0x4a, 0x40, 0x38, 0x2e, 0x25, 0x1a, 0x11, 0x8, 0x4, 0x0, + 0x0, 0x2, 0x9, 0x10, 0x19, 0x21, 0x2a, 0x32, 0x39, 0x3e, 0x7, 0x90, 0x30, + 0x55, 0x39, 0x2b, 0x24, 0x1c, 0x15, 0xe, 0x9, 0x6, 0x5, 0x6, 0x9, 0x10, + 0x19, 0x22, 0x27, 0x2e, 0x35, 0x3b, 0x3e, 0x3f, 0x3d, 0x38, 0x32, 0x2c, + 0x26, 0x1f, 0x19, 0x13, 0xb, 0x5, 0x1, 0x0, 0x6, 0x0, 0x1, 0x2, 0x6, 0xb, + 0x11, 0x17, 0x1d, 0x24, 0x2a, 0x2f, 0x32, 0x34, 0x35, 0x36, 0x37, 0x3b, + 0x41, 0x47, 0x4e, 0x56, 0x5d, 0x61, 0x64, 0x65, 0x65, 0x63, 0x60, 0x5c, + 0x57, 0x54, 0xd1, 0x4a, 0x46, 0x55, 0x0, 0x1, 0x3, 0x5, 0x7, 0x8, 0xa, 0xb, + 0xc, 0xe, 0xf, 0x11, 0x12, 0x14, 0x16, 0x1a, 0x1e, 0x22, 0x24, 0x27, 0x2a, + 0x2c, 0x2e, 0x31, 0x33, 0x36, 0x38, 0x3a, 0x3c, 0x3e, 0x3f, 0x3f, 0x1, 0xe, + 0x14, 0x1b, 0x23, 0x28, 0x2e, 0x35, 0x3a, 0x40, 0x48, 0x4f, 0x56, 0x5d, + 0x62, 0x61, 0x5a, 0x53, 0x4e, 0x47, 0x40, 0x3b, 0x35, 0x2d, 0x29, 0x22, + 0x1b, 0x17, 0x10, 0x9, 0x5, 0x1, 0x6d, 0x7d, 0x54, 0x55, 0x40, 0x39, 0x38, + 0x36, 0x35, 0x33, 0x31, 0x2e, 0x2c, 0x2b, 0x29, 0x27, 0x25, 0x24, 0x22, + 0x1f, 0x1d, 0x1a, 0x18, 0x15, 0x14, 0x12, 0xf, 0xc, 0x9, 0x7, 0x4, 0x2, 0x1, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x15, 0x1d, 0x23, 0x2a, 0x32, 0x3b, 0x43, 0x48, + 0x50, 0x57, 0x5d, 0x63, 0x68, 0x65, 0x5e, 0x58, 0x51, 0x4a, 0x45, 0x3f, + 0x38, 0x32, 0x2b, 0x26, 0x1f, 0x16, 0x10, 0x8, 0x4, 0x1, 0x6a, 0xec, 0x54, + 0x55, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x2, 0x4, 0x5, + 0x7, 0x9, 0xd, 0x10, 0x13, 0x18, 0x1f, 0x24, 0x27, 0x2b, 0x2e, 0x31, 0x34, + 0x36, 0x39, 0x3c, 0x3e, 0x40, 0x0, 0x7, 0xf, 0x13, 0x16, 0x1a, 0x1e, 0x22, + 0x25, 0x28, 0x2f, 0x36, 0x3b, 0x3f, 0x43, 0x47, 0x4b, 0x4c, 0x4c, 0x4c, + 0x49, 0x46, 0x43, 0x3f, 0x3a, 0x35, 0x32, 0x2d, 0x27, 0x21, 0x1d, 0x1a, + 0xb5, 0xd0, 0x54, 0x55, 0x0, 0x1, 0x1, 0x1, 0x2, 0x3, 0x3, 0x4, 0x5, 0x9, + 0xf, 0x16, 0x1d, 0x22, 0x28, 0x2d, 0x30, 0x32, 0x34, 0x37, 0x39, 0x3a, 0x3c, + 0x3d, 0x3e, 0x3e, 0x3f, 0x3f, 0x3e, 0x3e, 0x3c, 0x3a, 0x22, 0x2e, 0x36, + 0x3f, 0x46, 0x4c, 0x51, 0x56, 0x5b, 0x5e, 0x60, 0x5e, 0x5c, 0x58, 0x53, + 0x4d, 0x49, 0x45, 0x41, 0x3a, 0x35, 0x31, 0x2d, 0x27, 0x23, 0x1f, 0x19, + 0x11, 0xd, 0x8, 0x3, 0x0, 0x3b, 0x38, 0x54, 0x55, 0x0, 0x2, 0x3, 0x5, 0x6, + 0x8, 0xb, 0x10, 0x13, 0x16, 0x17, 0x19, 0x1b, 0x1d, 0x1f, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x25, 0x28, 0x2e, 0x31, 0x34, 0x36, 0x38, 0x3a, 0x3c, + 0x3e, 0x3f, 0x6, 0x17, 0x20, 0x27, 0x30, 0x38, 0x3e, 0x39, 0x32, 0x2b, 0x25, + 0x1e, 0x18, 0x10, 0x9, 0x9, 0x10, 0x18, 0x1f, 0x26, 0x2f, 0x36, 0x3c, 0x38, + 0x2f, 0x27, 0x1f, 0x18, 0xf, 0x8, 0x1, 0x2, 0xc7, 0x75, 0x31, 0x55, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x8, 0xd, 0x12, 0x15, 0x17, 0x18, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x22, 0x27, 0x2e, 0x35, 0x38, 0x3b, 0x3d, + 0x3e, 0x3f, 0x40, 0x3f, 0x3e, 0x6, 0x15, 0x1b, 0x23, 0x29, 0x2f, 0x37, 0x3c, + 0x37, 0x2e, 0x27, 0x20, 0x1a, 0x13, 0xe, 0x14, 0x1a, 0x21, 0x27, 0x2f, 0x38, + 0x3f, 0x3d, 0x35, 0x2e, 0x26, 0x20, 0x18, 0x11, 0xb, 0x3, 0x0, 0x67, 0x3f, + 0x31, 0x55, 0x10, 0x78, 0xc2, 0xd5, 0x7c, 0xb4, 0x30, 0xe7, 0x8, 0xb2, 0xd5, + 0x6e, 0x24, 0xff, 0xff, 0xb, 0x24, 0x7c, 0xb6, 0x30, 0xe7, 0x12, 0xb2, 0xd5, + 0x6e, 0x34, 0xff, 0xff, 0xb, 0x34, 0x8d, 0x32, 0x6e, 0x24, 0xff, 0xff, 0xb, + 0x24, 0x80, 0x2, 0x8d, 0x32, 0x30, 0xd5, 0x6, 0x6e, 0x34, 0xff, 0xff, 0xb, + 0x34, 0x22, 0x7d, 0x51, 0xad, 0x3, 0x7d, 0x2, 0x7d, 0x21, 0xad, 0x5, 0x2d, + 0x12, 0xad, 0x35, 0x2d, 0x21, 0x22, 0x7d, 0x2, 0xad, 0x31, 0xad, 0x10, 0x2d, + 0x21, 0x22, 0x6d, 0x0, 0x74, 0x10, 0x4d, 0x0, 0x78, 0xb, 0x4d, 0x22, 0x78, + 0x27, 0x8d, 0x31, 0x7d, 0x12, 0x6d, 0x22, 0x22, 0x7d, 0x43, 0x7d, 0x32, + 0x6d, 0x22, 0x2f, 0x11, 0x2d, 0x44, 0x50, 0x2, 0xa5, 0xf, 0xbf, 0x10, 0x40, + 0x4, 0x9f, 0x10, 0xb, 0x90, 0x14, 0x78, 0xed, 0x7f, 0x1, 0x6d, 0x22, 0x7d, + 0x34, 0x22, 0x7d, 0x41, 0x7d, 0x13, 0x8d, 0x24, 0x7d, 0x2, 0x2f, 0x0, 0x40, + 0x4, 0xbd, 0x4, 0x40, 0x4, 0x9d, 0x4, 0xb, 0x14, 0x14, 0x78, 0xf1, 0x7d, + 0x23, 0x7d, 0x31, 0x7d, 0x10, 0x6d, 0x0, 0x22, 0xc2, 0xd5, 0x7c, 0xb0, 0x30, + 0xe7, 0x8, 0xb2, 0xd5, 0x9f, 0x22, 0x9f, 0x20, 0x7f, 0x2, 0x7c, 0xb4, 0x30, + 0xe7, 0x13, 0xb2, 0xd5, 0x9f, 0x22, 0x9f, 0x21, 0x7f, 0x12, 0x12, 0x2a, + 0x3c, 0x9f, 0x22, 0x9f, 0x20, 0x7f, 0x2, 0x80, 0x3, 0x12, 0x2a, 0x3c, 0x30, + 0xd5, 0x6, 0x9f, 0x22, 0x9f, 0x21, 0x7f, 0x12, 0x22, 0x6c, 0xaa, 0x4d, 0x11, + 0x68, 0x1a, 0x1e, 0x54, 0x68, 0xe, 0xb, 0x38, 0x20, 0x1b, 0x18, 0x20, 0xb, + 0x35, 0xb, 0x15, 0x1b, 0x54, 0x78, 0xf2, 0x50, 0x6, 0x7e, 0x39, 0x40, 0x7a, + 0x19, 0x40, 0x22, 0x6c, 0xaa, 0x4d, 0x11, 0x68, 0x1e, 0x1e, 0x54, 0x50, 0xc, + 0x7e, 0x1b, 0x0, 0x7a, 0x19, 0x0, 0x68, 0x12, 0xb, 0x1c, 0xb, 0x14, 0xb, + 0x1a, 0x0, 0x1b, 0x18, 0x0, 0xb, 0x1d, 0xb, 0x15, 0x1b, 0x54, 0x78, 0xf2, + 0x22, 0xca, 0xf8, 0x7f, 0x20, 0x80, 0xa, 0x7e, 0x1b, 0xf0, 0x7a, 0x2b, 0xf0, + 0xb, 0x34, 0xb, 0x54, 0x69, 0xff, 0xff, 0xfc, 0x7d, 0xef, 0x1b, 0xe4, 0x79, + 0xef, 0xff, 0xfc, 0x4d, 0xff, 0x78, 0xe6, 0x7f, 0x10, 0xda, 0xf8, 0x22, + 0x7d, 0x23, 0xbe, 0x24, 0x0, 0x0, 0x48, 0x3, 0x7d, 0x32, 0x22, 0x6d, 0x33, + 0x9d, 0x32, 0x22, 0x0, 0x1, 0x39, 0xa4, 0x3, 0x0, 0x1, 0x39, 0xa6, 0x0, 0x0, + 0x1, 0x39, 0xb0, 0xc, 0x0, 0x1, 0x39, 0xb4, 0x3, 0x0, 0x1, 0x39, 0xb8, 0x0, + 0x0, 0x2, 0x39, 0xc4, 0x44, 0x40, 0x0, 0x1, 0x39, 0xcd, 0x0, 0x0, 0x1, 0x39, + 0xd4, 0x0, 0x0, 0x1, 0x39, 0xd5, 0x0, 0x0, 0x1, 0x39, 0xec, 0x0, 0x0, 0x2, + 0x39, 0xed, 0x0, 0x0, 0x0, 0x1, 0x39, 0xef, 0x1, 0x0, 0x1, 0x39, 0xf0, 0x0, + 0x0, 0x1, 0x56, 0xbc, 0x1, 0x0, 0x1, 0x54, 0xc3, 0x0, 0x0, 0x2, 0x54, 0xc4, + 0x0, 0x0, 0x0, 0x1, 0x53, 0xec, 0xff, 0x0, 0x2, 0x54, 0x5e, 0x0, 0x0, 0x0, + 0x14, 0x3, 0xcc, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x0, 0x14, 0x3, 0xec, 0x3, 0x3, 0x0, + 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, 0x1, 0x3, 0x1, + 0x1, 0x1, 0x0, 0x1, 0x56, 0xbe, 0x0, 0x0, 0x3c, 0x55, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x55, + 0xef, 0x0, 0x0, 0x1, 0x56, 0x64, 0x0, 0x0, 0x1, 0x1, 0x8d, 0xff, 0x0, 0x1, + 0x1, 0xa3, 0x0, 0x0, 0x1, 0x1, 0xa4, 0x0, 0x0, 0xa, 0x2, 0x6f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x2, 0x79, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x2, 0x83, 0x0, 0x0, 0x1, 0x56, + 0xac, 0x1, 0x0, 0x6, 0x56, 0x9c, 0x3f, 0x1f, 0x50, 0x11, 0x20, 0x10, 0x0, + 0x1, 0x56, 0xa2, 0x3e, 0x0, 0x1, 0x55, 0xaf, 0xff, 0x0, 0x1, 0x55, 0xb0, + 0xff, 0x0, 0x2, 0x55, 0xb1, 0x0, 0x0, 0x0, 0x1, 0x39, 0xa3, 0x0, 0x0, 0x1, + 0x52, 0xf0, 0xff, 0x0, 0x1, 0x52, 0xf1, 0xff, 0x0, 0x1, 0x52, 0xf5, 0x64, + 0x0, 0x1, 0x52, 0xf6, 0x0, 0x0, 0x1, 0x55, 0xf6, 0x0, 0x0, 0x2, 0x55, 0xf9, + 0x0, 0x21, 0x0, 0x1, 0x55, 0xfd, 0x1, 0x0, 0x1, 0x56, 0x0, 0x4, 0x0, 0x1, + 0x56, 0x21, 0x1, 0x0, 0x1, 0x56, 0x24, 0x0, 0x0, 0x2, 0x56, 0x25, 0x0, 0x20, + 0x0, 0x1, 0x56, 0x27, 0x0, 0x0, 0x1, 0x56, 0x28, 0x0, 0x0, 0x1, 0x56, 0x2a, + 0x0, 0x0, 0x1, 0x56, 0x8d, 0xff, 0x0, 0x2, 0x56, 0x91, 0x0, 0x0, 0x0, 0x1, + 0x56, 0x94, 0x0, 0x0, 0x1, 0x56, 0xc1, 0x1, 0x0, 0x1, 0x39, 0xf1, 0x0, 0x0, + 0x2, 0x4e, 0x82, 0x4e, 0x88, 0x0, 0x1, 0x52, 0x48, 0x2, 0x0, 0x1, 0x55, + 0x2e, 0xff, 0x0, 0x1, 0x55, 0x2f, 0x0, 0x0, 0x1, 0x55, 0x30, 0x0, 0x0, 0x1, + 0x55, 0x31, 0x40, 0x0, 0x1, 0x55, 0x32, 0x40, 0x0, 0x2, 0x56, 0xba, 0xc3, + 0x0, 0x0, 0x4, 0x56, 0xad, 0x0, 0x0, 0xc5, 0x0, 0x0, 0x4, 0x35, 0xa5, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0x4, 0x35, 0xa9, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x4, 0x38, + 0x87, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x4, 0x39, 0xfc, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x4, 0x56, 0xb2, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xe8, 0x0, 0x51, 0x0, + 0x3, 0x3, 0x20, 0x0, 0x50, 0x0, 0x3, 0x2, 0x58, 0x0, 0x4e, 0x0, 0x4, 0x1, + 0xc2, 0x0, 0x4b, 0x0, 0x4, 0x1, 0x40, 0x0, 0x47, 0x0, 0x4, 0x0, 0xc8, 0x0, + 0x44, 0x0, 0x4, 0x0, 0x78, 0x0, 0x3e, 0x0, 0x5, 0x0, 0x64, 0x0, 0x3c, 0x0, + 0x5, 0x1b, 0xb, 0x17, 0xa, 0x10, 0x9, 0x12, 0xf1, 0x11, 0xe4, 0x7a, 0xb3, + 0x54, 0x60, 0x7a, 0xb3, 0x54, 0xc3, 0x2, 0x2d, 0xb4, 0x12, 0x5a, 0xa8, 0x74, + 0xf, 0x7a, 0xb3, 0x74, 0xa, 0x7a, 0xb3, 0x74, 0xb, 0x22, 0xca, 0x7b, 0xca, + 0x6b, 0xca, 0x5b, 0xca, 0x4b, 0xca, 0x2b, 0xca, 0x1b, 0xca, 0xb, 0xc0, 0xd0, + 0xc0, 0x83, 0xc0, 0x82, 0x12, 0x2f, 0x9c, 0x5e, 0x34, 0x0, 0x40, 0x68, 0x5b, + 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0x40, 0x68, 0x52, 0x7e, 0x34, 0x0, 0x40, + 0x79, 0x30, 0x0, 0x2, 0x30, 0x1b, 0x5, 0x12, 0x2f, 0xa5, 0xc2, 0x1b, 0x7e, + 0xb3, 0x55, 0xfb, 0xbe, 0xb0, 0x1, 0x68, 0x3, 0xb4, 0x4, 0x13, 0x12, 0x2f, + 0xa5, 0x30, 0xf, 0x8, 0x7e, 0x73, 0x55, 0xf4, 0x7a, 0x73, 0x55, 0xf2, 0xe4, + 0x7a, 0xb3, 0x55, 0xfb, 0x7e, 0x1f, 0x39, 0xfc, 0x69, 0x31, 0x0, 0xa, 0x5e, + 0x34, 0xf, 0xc0, 0x12, 0x4b, 0x99, 0x1e, 0x34, 0x7a, 0x73, 0x55, 0xf7, 0xe4, + 0x7a, 0xb3, 0x56, 0x8d, 0x7e, 0xb3, 0x56, 0xc0, 0x4, 0x7a, 0xb3, 0x56, 0xc0, + 0x12, 0x2f, 0x9c, 0x5e, 0x34, 0x0, 0x8, 0x68, 0x11, 0xb, 0xa, 0x30, 0x5e, + 0x34, 0x0, 0x8, 0x68, 0x8, 0x7e, 0x34, 0x0, 0x8, 0x79, 0x30, 0x0, 0x2, 0x12, + 0x2f, 0x9c, 0x5e, 0x34, 0x0, 0x10, 0x68, 0x26, 0xb, 0xa, 0x30, 0x5e, 0x34, + 0x0, 0x10, 0x68, 0x1d, 0x7e, 0x34, 0x0, 0x10, 0x79, 0x30, 0x0, 0x2, 0x7e, + 0xb3, 0x55, 0xfb, 0xb4, 0x3, 0x8, 0xe4, 0x7a, 0xb3, 0x55, 0xfb, 0x12, 0x2f, + 0xa5, 0x74, 0x2, 0x7a, 0xb3, 0x56, 0x8d, 0x12, 0x2f, 0x9c, 0x5e, 0x34, 0x0, + 0x20, 0x68, 0x17, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0x20, 0x68, 0xe, 0x7e, + 0x34, 0x0, 0x20, 0x79, 0x30, 0x0, 0x2, 0x74, 0x1, 0x7a, 0xb3, 0x56, 0x8d, + 0x12, 0x2f, 0x9c, 0x5e, 0x34, 0x40, 0x0, 0x68, 0x2e, 0xb, 0xa, 0x30, 0x5e, + 0x34, 0x40, 0x0, 0x68, 0x25, 0x7e, 0x34, 0x40, 0x0, 0x79, 0x30, 0x0, 0x2, + 0xd2, 0xe, 0x7e, 0xb3, 0x55, 0xf3, 0xbe, 0xb0, 0xc8, 0x50, 0x5, 0x4, 0x7a, + 0xb3, 0x55, 0xf3, 0x7e, 0xb3, 0x55, 0xf3, 0xb4, 0x1, 0x3, 0x12, 0x2d, 0xb4, + 0x12, 0x7f, 0xc4, 0x12, 0x2f, 0x9c, 0x5e, 0x34, 0x20, 0x0, 0x68, 0x16, 0xb, + 0xa, 0x30, 0x5e, 0x34, 0x20, 0x0, 0x68, 0xd, 0x7e, 0x34, 0x20, 0x0, 0x79, + 0x30, 0x0, 0x2, 0xd2, 0xe, 0x12, 0x7f, 0xc4, 0x12, 0x2f, 0x9c, 0x5e, 0x34, + 0x10, 0x0, 0x68, 0x66, 0xb, 0xa, 0x30, 0x7d, 0x23, 0x5e, 0x24, 0x10, 0x0, + 0x68, 0x5b, 0x5e, 0x34, 0x8, 0x0, 0x2e, 0x34, 0xff, 0xff, 0x92, 0x11, 0x69, + 0x30, 0x0, 0x6, 0x7d, 0x23, 0x5e, 0x24, 0x0, 0x1, 0x68, 0xc, 0x5e, 0x34, + 0x4, 0x0, 0x2e, 0x34, 0xff, 0xff, 0x72, 0x11, 0x92, 0x11, 0x7e, 0x34, 0x8, + 0x0, 0x79, 0x30, 0x0, 0x2, 0x7e, 0xb3, 0x39, 0xd5, 0xb4, 0x1, 0xf, 0x74, + 0x2, 0x7a, 0xb3, 0x39, 0xd5, 0x7e, 0x34, 0x10, 0x0, 0x12, 0x5b, 0x91, 0x80, + 0x3d, 0xc2, 0x26, 0x12, 0xe1, 0xca, 0x12, 0x6e, 0x12, 0x7e, 0xb3, 0x56, + 0xa7, 0xbe, 0xb0, 0x3, 0x68, 0xa, 0x12, 0x5f, 0x78, 0x78, 0x5, 0xc2, 0xa, + 0x12, 0x5e, 0x72, 0x12, 0x2f, 0x9c, 0x5e, 0x34, 0x0, 0x4, 0x68, 0x19, 0xb, + 0xa, 0x30, 0x5e, 0x34, 0x0, 0x4, 0x68, 0x10, 0x7e, 0x34, 0x0, 0x4, 0x79, + 0x30, 0x0, 0x2, 0x7e, 0xb3, 0x54, 0x13, 0x70, 0x2, 0xd2, 0x14, 0xd0, 0x82, + 0xd0, 0x83, 0xd0, 0xd0, 0xda, 0xb, 0xda, 0x1b, 0xda, 0x2b, 0xda, 0x4b, 0xda, + 0x5b, 0xda, 0x6b, 0xda, 0x7b, 0x32, 0x7e, 0xf, 0x39, 0xfc, 0x69, 0x30, 0x0, + 0x4, 0x22, 0x12, 0x5f, 0x18, 0x2, 0x2f, 0xab, 0x4e, 0x70, 0x2, 0x1b, 0xa, + 0x30, 0x22, 0x12, 0x47, 0x90, 0xc2, 0x2, 0x12, 0x2f, 0xd7, 0xc2, 0xe, 0x30, + 0xd, 0x13, 0xd2, 0x2, 0x12, 0x46, 0xb8, 0xc2, 0xd, 0x12, 0x5b, 0x9a, 0x12, + 0x45, 0x56, 0x12, 0x7b, 0x30, 0x12, 0x2d, 0xb4, 0xd2, 0x2, 0x2, 0x2f, 0xd7, + 0xa2, 0xac, 0x92, 0x3, 0x12, 0x77, 0xb3, 0x30, 0x2, 0xa, 0xb, 0x16, 0xb, + 0xa, 0x30, 0x4e, 0x70, 0x3, 0x80, 0x8, 0xb, 0x16, 0xb, 0xa, 0x30, 0x5e, + 0x70, 0xfc, 0x1b, 0xa, 0x30, 0xa2, 0x3, 0x92, 0xac, 0x22, 0x12, 0x71, 0x23, + 0x12, 0x33, 0x7d, 0x12, 0x87, 0xc3, 0x12, 0x97, 0xf5, 0x12, 0x2d, 0xa2, + 0x12, 0x30, 0x23, 0x7e, 0xb3, 0x54, 0x15, 0x24, 0xfd, 0x68, 0x9, 0xb, 0xb1, + 0x78, 0xf4, 0x12, 0x32, 0xc, 0x80, 0xef, 0x12, 0x50, 0x77, 0x80, 0xea, 0xca, + 0x79, 0x7e, 0xb3, 0x39, 0xcd, 0xbe, 0xb0, 0x1, 0x78, 0x2, 0x21, 0x83, 0x7e, + 0x1f, 0x39, 0xfc, 0x69, 0xa1, 0x0, 0x6, 0x5e, 0xa4, 0x8, 0x0, 0x68, 0x2, + 0x21, 0x48, 0x6c, 0xee, 0x12, 0x31, 0xe4, 0x7e, 0x34, 0xf4, 0xb1, 0x7e, 0x8, + 0x2e, 0x77, 0x7e, 0x24, 0x0, 0x6, 0x12, 0x31, 0x86, 0x7d, 0xb3, 0xbe, 0xb4, + 0x0, 0x6, 0x78, 0x4, 0xb, 0xe0, 0x80, 0x7, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, + 0xde, 0xbe, 0xb4, 0x0, 0x6, 0x78, 0x10, 0x6c, 0xff, 0x12, 0x31, 0xf3, 0x19, + 0x7a, 0x39, 0xd6, 0xb, 0xf0, 0xbe, 0xf0, 0x6, 0x78, 0xf2, 0x12, 0x31, 0xe4, + 0x7e, 0x34, 0xf3, 0x12, 0x7e, 0x8, 0x2e, 0x77, 0x7e, 0x24, 0x0, 0x9, 0x12, + 0x31, 0x86, 0x7d, 0xb3, 0xbe, 0xb4, 0x0, 0x9, 0x78, 0x4, 0xb, 0xe0, 0x80, + 0x7, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0xde, 0xbe, 0xb4, 0x0, 0x9, 0x78, + 0x10, 0x6c, 0xff, 0x12, 0x31, 0xf3, 0x19, 0x7a, 0x39, 0xb9, 0xb, 0xf0, 0xbe, + 0xf0, 0x9, 0x78, 0xf2, 0x12, 0x31, 0xe4, 0x7e, 0x34, 0xd2, 0x2, 0x7e, 0x8, + 0x2e, 0x77, 0x7e, 0x24, 0x0, 0x2, 0x12, 0x31, 0x86, 0x7d, 0xb3, 0xbe, 0xb4, + 0x0, 0x2, 0x78, 0x4, 0xb, 0xe0, 0x80, 0x7, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, + 0xde, 0xbe, 0xb4, 0x0, 0x2, 0x78, 0x10, 0x6c, 0xff, 0x12, 0x31, 0xf3, 0x19, + 0x7a, 0x39, 0xde, 0xb, 0xf0, 0xbe, 0xf0, 0x2, 0x78, 0xf2, 0x12, 0x31, 0xe4, + 0x7e, 0x34, 0xf3, 0x90, 0x12, 0x31, 0xfa, 0x78, 0x4, 0xb, 0xe0, 0x80, 0x7, + 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0xec, 0xbe, 0xb4, 0x0, 0x1, 0x78, 0x8, + 0x7e, 0x73, 0x2e, 0x77, 0x7a, 0x73, 0x39, 0xb8, 0x12, 0x31, 0xe4, 0x7e, + 0x34, 0xf3, 0xb3, 0x12, 0x31, 0xfa, 0x78, 0x4, 0xb, 0xe0, 0x80, 0x7, 0xb, + 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0xec, 0xbe, 0xb4, 0x0, 0x1, 0x78, 0x8, 0x7e, + 0x73, 0x2e, 0x77, 0x7a, 0x73, 0x39, 0xa6, 0xbe, 0xe0, 0x5, 0x78, 0x6, 0x74, + 0x1, 0x7a, 0xb3, 0x39, 0xcd, 0x7e, 0xb3, 0x39, 0xcd, 0xb4, 0x1, 0x34, 0x7e, + 0x73, 0x39, 0xde, 0x7a, 0x73, 0x54, 0x11, 0x7e, 0x73, 0x39, 0xdf, 0x7a, + 0x73, 0x54, 0xd, 0x7e, 0xb3, 0x54, 0x11, 0xb4, 0x86, 0x9, 0x7e, 0xb3, 0x54, + 0xd, 0xbe, 0xb0, 0x15, 0x68, 0xc, 0x74, 0x87, 0x7a, 0xb3, 0x54, 0x11, 0x74, + 0x19, 0x7a, 0xb3, 0x54, 0xd, 0x7e, 0x73, 0x39, 0xb8, 0x7a, 0x73, 0x54, 0x1f, + 0xda, 0x79, 0x22, 0x12, 0xef, 0x1f, 0x80, 0x42, 0x6d, 0x33, 0x7e, 0x2f, + 0x56, 0xad, 0x79, 0x32, 0x0, 0xa, 0x12, 0xee, 0x73, 0x80, 0xa, 0x12, 0xef, + 0xe0, 0x68, 0x5, 0x12, 0xf0, 0x89, 0x80, 0x5, 0x12, 0xef, 0x5e, 0x68, 0xf1, + 0x12, 0xf0, 0x7c, 0x7e, 0x6f, 0x56, 0xad, 0x69, 0x36, 0x0, 0x4, 0x5e, 0x34, + 0x0, 0x2, 0x78, 0xf2, 0x7e, 0xb3, 0x56, 0xb1, 0x70, 0x11, 0x69, 0x36, 0x0, + 0xa, 0x6c, 0x66, 0x7a, 0x7b, 0x70, 0xb, 0xf4, 0x1b, 0x14, 0x4d, 0x11, 0x78, + 0xba, 0x2, 0x31, 0xd4, 0x6d, 0x33, 0x7e, 0x2f, 0x56, 0xad, 0x1b, 0x2a, 0x30, + 0xc2, 0xcc, 0x7d, 0x32, 0x9d, 0x31, 0x22, 0x7e, 0x8, 0x2e, 0x77, 0x7e, 0x34, + 0x0, 0x9, 0xe4, 0x12, 0x0, 0x2e, 0x6c, 0xff, 0x22, 0xa, 0xaf, 0x9, 0x7a, + 0x2e, 0x77, 0x22, 0x7e, 0x8, 0x2e, 0x77, 0x7e, 0x24, 0x0, 0x1, 0x12, 0x31, + 0x86, 0x7d, 0xb3, 0xbe, 0xb4, 0x0, 0x1, 0x22, 0x30, 0x29, 0xc, 0x7e, 0xb3, + 0x54, 0x5c, 0xb4, 0x1, 0x5, 0x12, 0x77, 0xba, 0x80, 0x3, 0x12, 0x80, 0xbe, + 0xc2, 0x29, 0xd2, 0x86, 0x12, 0x30, 0x23, 0x7e, 0xb3, 0x56, 0xa7, 0xb4, 0x1, + 0x2, 0x80, 0x2, 0x41, 0xc3, 0xe4, 0x12, 0x89, 0x32, 0x12, 0x7f, 0xfd, 0x12, + 0x5d, 0x78, 0x12, 0x5a, 0x7a, 0x7e, 0x34, 0xd, 0x16, 0x12, 0x32, 0xdf, 0x12, + 0x5a, 0xa8, 0x12, 0x93, 0xf9, 0x12, 0x58, 0xb0, 0x7e, 0xb3, 0x2e, 0x74, + 0x70, 0x9, 0x12, 0x34, 0x0, 0x12, 0x37, 0xf6, 0xb4, 0x3, 0xc9, 0x12, 0x97, + 0xaa, 0x7e, 0xb3, 0x54, 0x12, 0xb4, 0x1, 0x2, 0xd2, 0x86, 0x12, 0xaf, 0x1c, + 0x7e, 0xb3, 0x68, 0x9e, 0x70, 0x6, 0x12, 0xca, 0xf9, 0x12, 0xaf, 0xbf, 0x12, + 0x9b, 0x18, 0x7e, 0xb3, 0x2e, 0x74, 0x60, 0x3, 0x30, 0x2a, 0x9, 0x12, 0x34, + 0x0, 0x12, 0x37, 0xf6, 0xb4, 0x3, 0x99, 0x74, 0x1, 0x12, 0x33, 0xdc, 0x12, + 0x34, 0xc, 0x12, 0xa7, 0x74, 0x12, 0xa7, 0x77, 0x74, 0x2, 0x12, 0x33, 0xdc, + 0x12, 0xaf, 0xd6, 0x74, 0x3, 0x12, 0x33, 0xdc, 0x12, 0xb3, 0xa2, 0x74, 0x4, + 0x12, 0x33, 0xdc, 0x12, 0xaf, 0x4d, 0x12, 0x8c, 0xe1, 0x12, 0x7e, 0xd1, + 0x12, 0x7c, 0xa8, 0x12, 0x7f, 0xce, 0x12, 0x80, 0xac, 0x41, 0x25, 0xd2, 0x2, + 0x12, 0x46, 0xb8, 0x12, 0x78, 0x78, 0x2, 0x34, 0x3, 0x7a, 0x37, 0x68, 0x87, + 0x90, 0xd, 0x10, 0xe4, 0x93, 0x7a, 0xb3, 0x68, 0x86, 0x7e, 0x34, 0xd, 0x1a, + 0x7e, 0x24, 0x0, 0xff, 0xb, 0x1a, 0x30, 0x22, 0x90, 0xd, 0xe, 0xe4, 0x93, + 0x7a, 0xb3, 0x68, 0x85, 0x12, 0xca, 0xd5, 0x7e, 0x34, 0xd, 0x18, 0x12, 0x32, + 0xdf, 0x7a, 0x37, 0x68, 0x87, 0x12, 0x32, 0xdb, 0x7a, 0x37, 0x68, 0x89, + 0x7e, 0x34, 0xd, 0x1c, 0x12, 0x32, 0xdf, 0x12, 0x37, 0xa6, 0x7a, 0x37, 0x68, + 0x8b, 0x7e, 0x34, 0xd, 0x20, 0x12, 0x32, 0xdf, 0x12, 0xcb, 0x4e, 0x12, 0x32, + 0xdf, 0x7a, 0x37, 0x68, 0x8f, 0x7e, 0x34, 0xd, 0x24, 0x12, 0x32, 0xdf, 0x12, + 0x37, 0xa6, 0x7a, 0x37, 0x68, 0x91, 0x7e, 0x34, 0xd, 0x26, 0x12, 0x32, 0xdf, + 0x7a, 0x37, 0x68, 0x93, 0x7e, 0x34, 0xd, 0x28, 0x12, 0x32, 0xdf, 0x12, 0x37, + 0xa6, 0x7a, 0x37, 0x68, 0x95, 0x90, 0xd, 0x5a, 0xe4, 0x93, 0x7a, 0xb3, 0x68, + 0x99, 0x90, 0xd, 0x11, 0xe4, 0x93, 0x7a, 0xb3, 0x68, 0x9a, 0x7e, 0x34, 0xd, + 0x12, 0x12, 0x32, 0xdf, 0x7a, 0x37, 0x68, 0x9b, 0x7e, 0x34, 0xd, 0x2a, 0x12, + 0x32, 0xdf, 0x7a, 0x37, 0x68, 0x97, 0xe4, 0x7a, 0xb3, 0x68, 0x9d, 0x7a, + 0xb3, 0x68, 0x9e, 0x22, 0x7e, 0x34, 0xd, 0x18, 0x12, 0x32, 0xdf, 0x12, 0x4b, + 0x99, 0x7a, 0x73, 0x53, 0xee, 0x12, 0x32, 0xdb, 0x12, 0x4f, 0xbe, 0x7a, + 0x73, 0x53, 0xef, 0x7e, 0x34, 0xd, 0x20, 0x12, 0x32, 0xdf, 0x12, 0x4b, 0x99, + 0x7a, 0x73, 0x53, 0xf0, 0x7e, 0x34, 0xd, 0x22, 0x12, 0x32, 0xdf, 0x12, 0x4f, + 0xbe, 0x7a, 0x73, 0x53, 0xf1, 0xe4, 0x7a, 0xb3, 0x53, 0xf2, 0x7e, 0x34, 0xd, + 0x2a, 0x12, 0x32, 0xdf, 0x12, 0x4b, 0x99, 0x7a, 0x73, 0x53, 0xf3, 0x7e, + 0x34, 0x0, 0x6a, 0xca, 0x39, 0x7e, 0x34, 0xd, 0x2e, 0x7e, 0x24, 0x0, 0xff, + 0x7e, 0x8, 0x53, 0xf4, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x22, 0x1b, 0xb1, 0x68, + 0xd, 0x14, 0x68, 0x10, 0xb, 0xb1, 0x78, 0x18, 0xe4, 0x7a, 0xb3, 0x68, 0x83, + 0x22, 0x12, 0xb8, 0x31, 0x2, 0xb7, 0xf7, 0x12, 0x8c, 0xf8, 0x12, 0x67, 0x13, + 0x12, 0x81, 0x5, 0x2, 0x86, 0x6d, 0x22, 0x12, 0x37, 0xe0, 0x7e, 0x73, 0x54, + 0x15, 0x7a, 0x73, 0x56, 0xa7, 0x22, 0x12, 0x36, 0x10, 0x12, 0xa2, 0x30, + 0x12, 0x36, 0x10, 0x12, 0xc9, 0x7e, 0x12, 0x36, 0x10, 0x12, 0x36, 0x10, + 0x12, 0xa7, 0xdf, 0x12, 0x36, 0x10, 0x12, 0x9c, 0x8a, 0x12, 0x36, 0x10, + 0x12, 0xc5, 0x23, 0x12, 0x36, 0x10, 0x12, 0x36, 0x10, 0x2, 0x34, 0x36, 0xca, + 0x3b, 0x7e, 0xd3, 0x66, 0xea, 0xa, 0x3d, 0x3e, 0x34, 0xca, 0x39, 0x7e, 0x18, + 0x65, 0x60, 0x7e, 0x8, 0x2e, 0x77, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x6c, 0x11, + 0x75, 0x27, 0x0, 0x6c, 0xcc, 0xa1, 0xb, 0x7e, 0x44, 0x3, 0xff, 0x7e, 0xe0, + 0xff, 0x6c, 0xff, 0x80, 0x5a, 0x7c, 0xbf, 0x12, 0xa0, 0x72, 0x60, 0x51, + 0x12, 0xf1, 0xb7, 0xbe, 0x0, 0xff, 0x68, 0x49, 0x9, 0x5, 0x2e, 0x78, 0xa, + 0x10, 0x7e, 0x70, 0x2, 0xac, 0x7c, 0x9, 0x3, 0x55, 0xb4, 0xa, 0x30, 0x12, + 0xf1, 0xae, 0x8, 0x4, 0x9d, 0x31, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x32, 0x12, + 0xf1, 0xb7, 0xa, 0xf0, 0x74, 0x2, 0xac, 0xbc, 0x9, 0x5, 0x55, 0xb3, 0xa, + 0x10, 0x7d, 0x21, 0x9d, 0x2f, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x4, 0x9d, 0x1f, + 0x80, 0x4, 0x6d, 0x11, 0x9d, 0x12, 0x2d, 0x13, 0xbd, 0x41, 0x28, 0x4, 0x7d, + 0x41, 0x7c, 0xef, 0xb, 0xf0, 0xbc, 0xdf, 0x38, 0xa2, 0xbe, 0xe0, 0xff, 0x68, + 0x43, 0x7e, 0x70, 0x2, 0xac, 0x7e, 0x9, 0xb3, 0x2e, 0x77, 0x9, 0x73, 0x2e, + 0x78, 0x12, 0x36, 0x62, 0x7d, 0x13, 0x74, 0x2, 0xac, 0xbe, 0x9, 0xb5, 0x2e, + 0x77, 0x12, 0xa8, 0x14, 0xbd, 0x13, 0x48, 0x22, 0x7e, 0x70, 0x2, 0xac, 0x7e, + 0x9, 0x3, 0x2e, 0x77, 0x12, 0x8f, 0xd0, 0x19, 0x5, 0x2e, 0xb3, 0x9, 0x3, + 0x2e, 0x78, 0x19, 0x5, 0x2e, 0xb4, 0x74, 0xff, 0x19, 0xb3, 0x2e, 0x77, 0xb, + 0x10, 0x5, 0x27, 0xb, 0xc0, 0x7e, 0x3, 0x55, 0xef, 0xbc, 0xc, 0x28, 0x2, + 0x81, 0x58, 0x7c, 0xc1, 0x80, 0x6b, 0x6d, 0x0, 0x7e, 0xe0, 0xff, 0x6c, 0xff, + 0x80, 0x39, 0x7c, 0xbf, 0x12, 0xa0, 0x72, 0x60, 0x30, 0x7e, 0x30, 0x2, 0xac, + 0x3f, 0x9, 0xb1, 0x2e, 0x77, 0xbe, 0xb0, 0xff, 0x68, 0x22, 0x9, 0x71, 0x2e, + 0x78, 0x12, 0x36, 0x62, 0x7d, 0x43, 0xbd, 0x4, 0x58, 0x15, 0x7e, 0x70, 0x2, + 0xac, 0x7f, 0x9, 0xb3, 0x2e, 0x77, 0xf5, 0x28, 0x9, 0xb3, 0x2e, 0x78, 0xf5, + 0x29, 0x7d, 0x4, 0x7c, 0xef, 0xb, 0xf0, 0xbc, 0xdf, 0x38, 0xc3, 0xbe, 0xe0, + 0xff, 0x68, 0x1e, 0x7e, 0xa1, 0x28, 0x12, 0xc7, 0x19, 0x19, 0xa1, 0x2e, + 0xb3, 0xe5, 0x29, 0x19, 0xb1, 0x2e, 0xb4, 0x7e, 0xa0, 0xff, 0x7e, 0x30, 0x2, + 0xac, 0x3e, 0x19, 0xa1, 0x2e, 0x77, 0x5, 0x27, 0xb, 0xc0, 0x90, 0xd, 0xe, + 0xe4, 0x93, 0xbc, 0xbc, 0x38, 0x8c, 0x90, 0xd, 0xf, 0xe4, 0x93, 0x7c, 0xab, + 0x74, 0x2, 0xa4, 0xca, 0x59, 0x7e, 0x18, 0x2e, 0xb3, 0x7e, 0x8, 0x2e, 0x77, + 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x7e, 0xd1, 0x27, 0x12, 0x87, 0x82, 0x74, 0x2, + 0xac, 0x7b, 0x7e, 0x8, 0x55, 0xb3, 0x74, 0xff, 0x12, 0x0, 0x2e, 0xbe, 0xd0, + 0x0, 0x28, 0x38, 0xa, 0x3d, 0x3e, 0x34, 0xca, 0x39, 0x7e, 0x18, 0x2e, 0x77, + 0x7e, 0x8, 0x65, 0x60, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0xa, 0x3d, 0x3e, 0x34, + 0xca, 0x39, 0x7e, 0x18, 0x2e, 0x77, 0x7e, 0x8, 0x55, 0xb3, 0x12, 0x2b, 0x7, + 0x1b, 0xfd, 0x6c, 0xcc, 0x80, 0xa, 0x7c, 0xbc, 0x7e, 0x70, 0x1, 0x12, 0x9d, + 0x1b, 0xb, 0xc0, 0xbc, 0xdc, 0x38, 0xf2, 0x7a, 0xd3, 0x55, 0xef, 0x7a, 0xd3, + 0x66, 0xea, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbe, 0xb3, 0x66, 0xea, 0x50, 0x4, + 0x7a, 0xb3, 0x66, 0xea, 0xda, 0x3b, 0x22, 0xca, 0x79, 0x6c, 0xff, 0x6c, + 0xee, 0x80, 0x31, 0x7c, 0xbe, 0x12, 0xa0, 0x72, 0x60, 0x28, 0x7e, 0x34, 0x0, + 0x2, 0xca, 0x39, 0xac, 0x7e, 0x2e, 0x34, 0x65, 0x60, 0x6d, 0x22, 0x7e, 0x30, + 0x2, 0xac, 0x3f, 0x2e, 0x14, 0x65, 0x60, 0x6d, 0x0, 0x12, 0x2b, 0x7, 0x1b, + 0xfd, 0x7c, 0xbf, 0x7e, 0x70, 0x1, 0x12, 0x9d, 0x1b, 0xb, 0xf0, 0xb, 0xe0, + 0x12, 0xa7, 0x7a, 0x38, 0xca, 0x7a, 0xf3, 0x66, 0xea, 0xda, 0x79, 0x22, + 0x7e, 0x70, 0x9, 0xac, 0x78, 0x9, 0xb3, 0x67, 0x22, 0x9, 0x73, 0x67, 0x23, + 0x12, 0x54, 0x34, 0x7d, 0x13, 0x3e, 0x14, 0x7e, 0x1f, 0x2d, 0x2e, 0x2d, + 0x31, 0xb, 0x1a, 0x30, 0x22, 0xca, 0xf8, 0x7c, 0x8b, 0xc2, 0x0, 0x6d, 0xee, + 0x7d, 0xfe, 0x74, 0x9, 0xac, 0xb8, 0x9, 0xf5, 0x67, 0x22, 0x9, 0x85, 0x67, + 0x23, 0xbe, 0x80, 0x2, 0x50, 0x7, 0x6c, 0x99, 0x7e, 0x0, 0x5, 0x80, 0x2f, + 0x90, 0x1, 0x8b, 0xe4, 0x93, 0xa, 0x3b, 0x7d, 0x13, 0x9e, 0x14, 0x0, 0x3, + 0xa, 0x28, 0xbd, 0x21, 0x8, 0x10, 0x9e, 0x34, 0x0, 0x5, 0x1b, 0x34, 0x7c, + 0x97, 0xa, 0x5b, 0x1b, 0x54, 0x7c, 0xb, 0x80, 0xc, 0xa, 0x38, 0x1b, 0x35, + 0x7c, 0x97, 0xa, 0x58, 0xb, 0x55, 0x7c, 0xb, 0xbe, 0xf0, 0x4, 0x38, 0x4a, + 0x7c, 0x19, 0x80, 0x40, 0xe4, 0x12, 0x37, 0x7f, 0x8, 0x18, 0xe4, 0x12, 0x37, + 0x89, 0x8, 0x5, 0x12, 0x37, 0x9f, 0x80, 0x4, 0x6d, 0x55, 0x9d, 0x53, 0x60, + 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x2d, 0xf1, 0x74, 0x1, 0x12, 0x37, 0x7f, + 0x8, 0x19, 0x74, 0x1, 0x12, 0x37, 0x89, 0x8, 0x5, 0x12, 0x37, 0x9f, 0x80, + 0x4, 0x6d, 0x55, 0x9d, 0x53, 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x2d, + 0xe1, 0xb, 0x10, 0xbc, 0x1, 0x50, 0xbc, 0x80, 0x5d, 0x90, 0x1, 0x8a, 0xe4, + 0x93, 0xa, 0x5b, 0x1b, 0x56, 0xa, 0x1f, 0xbd, 0x15, 0x48, 0x4e, 0x7c, 0x19, + 0x80, 0x46, 0x12, 0x37, 0xef, 0x12, 0x37, 0x7f, 0x8, 0x1a, 0x12, 0x37, 0xef, + 0x12, 0x37, 0x89, 0x8, 0x5, 0x12, 0x37, 0x9f, 0x80, 0x4, 0x6d, 0x55, 0x9d, + 0x53, 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x2d, 0xf1, 0x12, 0xf2, 0x72, + 0x12, 0x37, 0x7f, 0x8, 0x1a, 0x12, 0xf2, 0x72, 0x12, 0x37, 0x89, 0x8, 0x5, + 0x12, 0x37, 0x9f, 0x80, 0x4, 0x6d, 0x55, 0x9d, 0x53, 0x60, 0x5, 0x3e, 0x14, + 0x14, 0x78, 0xfb, 0x2d, 0xe1, 0xb, 0x10, 0xbc, 0x1, 0x50, 0xb6, 0x7d, 0x1e, + 0x3e, 0x14, 0xbd, 0x1f, 0x50, 0x2, 0xd2, 0x0, 0xa2, 0x0, 0xda, 0xf8, 0x22, + 0x7c, 0x71, 0x12, 0x36, 0x62, 0xbe, 0x34, 0x0, 0x2d, 0x22, 0x7c, 0x71, 0x12, + 0x36, 0x62, 0x7d, 0x13, 0x9e, 0x14, 0x0, 0x2d, 0xa, 0x28, 0xa, 0x31, 0x9d, + 0x32, 0xbe, 0x34, 0x0, 0x0, 0x22, 0xa, 0x28, 0xa, 0x51, 0x9d, 0x52, 0x22, + 0x6e, 0x34, 0xff, 0xff, 0xb, 0x34, 0x22, 0x7e, 0x34, 0xd, 0xc4, 0x12, 0x32, + 0xdf, 0x7a, 0x37, 0x67, 0x3, 0x7e, 0x34, 0xd, 0xc6, 0x12, 0x32, 0xdf, 0x7a, + 0x37, 0x67, 0x5, 0x7e, 0x34, 0xd, 0xc8, 0x12, 0x32, 0xdf, 0x12, 0x9f, 0xb7, + 0x90, 0xd, 0xcb, 0xe4, 0x93, 0x7a, 0xb3, 0x67, 0xa, 0xe4, 0x7a, 0xb3, 0x67, + 0xe, 0x7a, 0xb3, 0x67, 0xf, 0x22, 0x7e, 0xb3, 0x1, 0x8e, 0xbe, 0xb0, 0xfa, + 0x50, 0x5, 0x4, 0x7a, 0xb3, 0x1, 0x8e, 0x22, 0x90, 0x1, 0x8a, 0xe4, 0x93, + 0x14, 0x22, 0x12, 0x46, 0x49, 0x7e, 0xb3, 0x54, 0x13, 0x22, 0xca, 0x3b, + 0x7e, 0xf3, 0x56, 0x21, 0x7e, 0x30, 0x8, 0xac, 0x3f, 0x9, 0xc1, 0x3, 0xac, + 0x9, 0xd1, 0x3, 0xad, 0x7e, 0x4, 0x0, 0x8, 0xca, 0x9, 0x2e, 0x14, 0x3, 0xac, + 0x6d, 0x0, 0x7e, 0x18, 0x54, 0x91, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x74, 0x8, + 0xac, 0xbf, 0x9, 0xe5, 0x3, 0xb0, 0x74, 0xee, 0xac, 0xbe, 0x7d, 0xa5, 0x2e, + 0xa4, 0x1, 0x0, 0x74, 0x3, 0x12, 0x3f, 0xc8, 0x12, 0x39, 0xa0, 0x5e, 0x34, + 0x1, 0x0, 0x68, 0xd, 0x5e, 0xb4, 0xfe, 0xff, 0x7a, 0xb7, 0x39, 0xcb, 0x7c, + 0xbf, 0x12, 0x40, 0x7, 0x12, 0x39, 0xa0, 0x5e, 0x34, 0x0, 0x1, 0x68, 0x2c, + 0x5e, 0xb4, 0xff, 0xfe, 0x7a, 0xb7, 0x39, 0xcb, 0x7e, 0xb3, 0x54, 0x91, + 0x12, 0x0, 0x9, 0x50, 0xf, 0x7e, 0xb3, 0x54, 0x91, 0x12, 0x6c, 0x91, 0x12, + 0x77, 0xfd, 0x12, 0x3f, 0x30, 0x80, 0xc, 0x74, 0x8, 0xac, 0xbf, 0x19, 0xc5, + 0x3, 0xac, 0x7a, 0xc3, 0x54, 0x91, 0x12, 0x39, 0xa0, 0x5e, 0x34, 0x0, 0x2, + 0x68, 0x2c, 0x5e, 0xb4, 0xff, 0xfd, 0x7a, 0xb7, 0x39, 0xcb, 0x7e, 0xb3, + 0x54, 0x92, 0x12, 0x48, 0x5, 0x50, 0xf, 0x7e, 0xb3, 0x54, 0x92, 0x12, 0x6c, + 0xd3, 0x12, 0x77, 0xfd, 0x12, 0x3f, 0x30, 0x80, 0xc, 0x74, 0x8, 0xac, 0xbf, + 0x19, 0xd5, 0x3, 0xad, 0x7a, 0xd3, 0x54, 0x92, 0x12, 0x39, 0xa0, 0x5e, 0x34, + 0x0, 0x4, 0x68, 0x56, 0x5e, 0xb4, 0xff, 0xfb, 0x7a, 0xb7, 0x39, 0xcb, 0x4e, + 0xb4, 0x2, 0x0, 0x7a, 0xb7, 0x39, 0xcb, 0x4e, 0xb4, 0x10, 0x0, 0x7a, 0xb7, + 0x39, 0xcb, 0x7c, 0xbf, 0x12, 0x67, 0xa7, 0x7e, 0x30, 0x3c, 0xac, 0x3e, + 0x12, 0x6b, 0x89, 0x74, 0x3, 0xac, 0xbf, 0x12, 0x6b, 0xdb, 0x7e, 0x30, 0x3c, + 0xac, 0x3e, 0x12, 0xf1, 0x42, 0x12, 0x93, 0xd7, 0x12, 0xed, 0x8d, 0x7d, + 0x3a, 0x2e, 0x34, 0x0, 0x6, 0x74, 0x3c, 0xac, 0xbe, 0x12, 0xf2, 0x7a, 0x7d, + 0x3a, 0xb, 0x35, 0x74, 0x3c, 0xac, 0xbe, 0x49, 0x25, 0x34, 0xb9, 0x12, 0x39, + 0xab, 0x12, 0x39, 0x99, 0x5e, 0x24, 0x0, 0x10, 0x68, 0x12, 0x5e, 0x70, 0xef, + 0x7a, 0x37, 0x39, 0xcb, 0x7e, 0xb3, 0x54, 0x93, 0x7e, 0x73, 0x54, 0x94, + 0x12, 0x98, 0x31, 0x12, 0x39, 0x99, 0x5e, 0x24, 0x0, 0x40, 0x68, 0xe, 0x5e, + 0x70, 0xbf, 0x7a, 0x37, 0x39, 0xcb, 0x7c, 0xbf, 0xa, 0xf, 0x12, 0x41, 0x29, + 0x12, 0x39, 0x99, 0x5e, 0x24, 0x0, 0x80, 0x68, 0xa, 0x5e, 0x70, 0x7f, 0x7a, + 0x37, 0x39, 0xcb, 0x12, 0x40, 0x6d, 0x12, 0x39, 0x99, 0x5e, 0x24, 0x4, 0x0, + 0x68, 0x7, 0x5e, 0x60, 0xfb, 0x7a, 0x37, 0x39, 0xcb, 0x12, 0x39, 0x99, 0x5e, + 0x24, 0x10, 0x0, 0x68, 0x7, 0x5e, 0x60, 0xef, 0x7a, 0x37, 0x39, 0xcb, 0x12, + 0x39, 0x99, 0x5e, 0x24, 0x20, 0x0, 0x68, 0xc, 0x5e, 0x60, 0xdf, 0x7a, 0x37, + 0x39, 0xcb, 0x7c, 0xbf, 0x12, 0x68, 0x1, 0xda, 0x3b, 0x22, 0x7e, 0x37, 0x39, + 0xcb, 0x7d, 0x23, 0x22, 0x7e, 0xb7, 0x39, 0xcb, 0x7d, 0x3b, 0x22, 0x49, + 0x25, 0x34, 0xe7, 0x7d, 0x12, 0x12, 0xf1, 0x66, 0x1b, 0x1a, 0x10, 0x22, + 0xca, 0x3b, 0x30, 0x0, 0x2, 0xa1, 0xbe, 0x74, 0x3, 0x12, 0x3f, 0xc8, 0x7e, + 0x34, 0x2e, 0x77, 0x7e, 0x24, 0x15, 0x15, 0x7e, 0x74, 0x0, 0xb9, 0x1b, 0x38, + 0x20, 0xb, 0x35, 0x1b, 0x74, 0x78, 0xf7, 0x12, 0xf2, 0x59, 0x7e, 0x24, 0x0, + 0xb9, 0x12, 0x40, 0xbe, 0x12, 0xf2, 0x59, 0x12, 0x40, 0x57, 0x7e, 0xb3, + 0x56, 0x28, 0xb4, 0x1, 0x3f, 0x7e, 0xf, 0x39, 0xfc, 0x69, 0x30, 0x0, 0x1c, + 0x7a, 0x37, 0x39, 0xaa, 0x69, 0x30, 0x0, 0x1a, 0x7a, 0x37, 0x39, 0xae, 0x69, + 0x30, 0x0, 0x12, 0x7a, 0x37, 0x39, 0xc8, 0x69, 0x30, 0x0, 0x14, 0x7a, 0x37, + 0x39, 0xd2, 0x7e, 0x34, 0x0, 0x3f, 0x79, 0x30, 0x0, 0x1a, 0x6d, 0x33, 0x12, + 0x77, 0xd9, 0x7e, 0x34, 0x0, 0x20, 0x12, 0xef, 0xa0, 0x7e, 0x34, 0x0, 0x1, + 0x12, 0x77, 0xeb, 0xe4, 0x7a, 0xb3, 0x39, 0xb3, 0x74, 0x3, 0x7a, 0xb3, 0x39, + 0xb4, 0x7a, 0xb3, 0x39, 0xa4, 0x7e, 0x93, 0x56, 0x28, 0x4c, 0x99, 0x78, + 0x29, 0xe5, 0xc2, 0x7a, 0xb3, 0x39, 0xb2, 0x12, 0xf0, 0x16, 0x43, 0xc3, + 0x20, 0x7e, 0x34, 0x0, 0x1, 0x12, 0x58, 0x3d, 0x43, 0xc3, 0xc0, 0x7e, 0x34, + 0x0, 0x1, 0x12, 0x58, 0x3d, 0x43, 0xc2, 0x40, 0x7e, 0x34, 0x0, 0x1, 0x12, + 0x58, 0x3d, 0x80, 0x8, 0xbe, 0x90, 0x1, 0x78, 0x3, 0x12, 0xf0, 0x16, 0x7e, + 0xb3, 0x56, 0x28, 0xb4, 0x1, 0x6, 0xa9, 0xd0, 0x9e, 0xa9, 0xd4, 0x9e, 0x90, + 0x1, 0x90, 0xe4, 0x93, 0x60, 0x13, 0x6d, 0x33, 0x12, 0x76, 0x89, 0x7e, 0x34, + 0x1, 0x99, 0x12, 0x32, 0xdf, 0x2e, 0x34, 0x0, 0x9, 0x12, 0x77, 0xe2, 0x12, + 0x40, 0xd4, 0x74, 0x3, 0x12, 0x3f, 0xc8, 0x7e, 0x34, 0x0, 0x1f, 0x12, 0x3f, + 0x29, 0x7a, 0x37, 0x3f, 0x76, 0x12, 0xf2, 0x50, 0x4e, 0x50, 0x1, 0x12, 0x3f, + 0x10, 0x7e, 0x34, 0x0, 0x25, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x2e, 0x12, + 0xf2, 0x47, 0x5e, 0x24, 0x0, 0x9f, 0x4e, 0x40, 0x76, 0x12, 0x3f, 0x10, 0x7e, + 0x34, 0x0, 0x27, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x32, 0x12, 0xf2, 0x3e, + 0x5e, 0x24, 0xf6, 0x4f, 0x4e, 0x24, 0x60, 0xf, 0x12, 0x3f, 0x10, 0x7e, 0x34, + 0x0, 0x1, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x36, 0x12, 0xf2, 0x35, 0x5e, + 0x24, 0xc0, 0x0, 0x4e, 0x50, 0xc2, 0x12, 0x3f, 0x10, 0x7e, 0x34, 0x0, 0x2a, + 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x38, 0x12, 0xf2, 0x2c, 0x5e, 0x50, 0xf, + 0x4e, 0x50, 0x20, 0x12, 0x3f, 0x10, 0x7e, 0xf, 0x39, 0xfc, 0x69, 0x30, 0x0, + 0x4c, 0x7a, 0x37, 0x39, 0xd0, 0x7e, 0x53, 0x39, 0xa4, 0xa, 0x55, 0x7d, 0x25, + 0x12, 0x5d, 0x6f, 0x2d, 0x25, 0x6c, 0x77, 0x4d, 0x32, 0x79, 0x30, 0x0, 0x4c, + 0x90, 0x1, 0x90, 0xe4, 0x93, 0x7e, 0x34, 0x0, 0x20, 0x60, 0x33, 0x12, 0x3f, + 0x29, 0x7d, 0x3, 0x5e, 0x4, 0x0, 0x2, 0x7e, 0x34, 0x0, 0x20, 0x12, 0x3f, + 0xaa, 0x7d, 0x13, 0x5e, 0x14, 0x0, 0x2, 0x7e, 0x34, 0x0, 0x20, 0x12, 0xef, + 0xa9, 0x12, 0xf2, 0xa0, 0x4d, 0x21, 0x12, 0x3f, 0xec, 0x12, 0xf0, 0xb7, + 0x7e, 0x27, 0x3f, 0x2c, 0x12, 0xf2, 0xa0, 0x4d, 0x20, 0x80, 0x19, 0x12, + 0xef, 0xa9, 0x5e, 0x40, 0x7d, 0x4e, 0x40, 0x58, 0x12, 0x3f, 0xec, 0x12, + 0xf0, 0xb7, 0x7e, 0x27, 0x3f, 0x2c, 0x5e, 0x40, 0x7d, 0x4e, 0x40, 0x58, + 0x12, 0x3f, 0x20, 0x7e, 0x34, 0x0, 0x28, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, + 0x34, 0x12, 0xf2, 0x23, 0x5e, 0x24, 0xf7, 0xef, 0x4e, 0x40, 0x8, 0x12, 0x3f, + 0x10, 0x7e, 0x34, 0x0, 0x1b, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x44, 0x12, + 0xf2, 0x1a, 0x5e, 0x40, 0xdf, 0x12, 0xf2, 0x91, 0x12, 0x3f, 0x29, 0x7a, + 0x37, 0x3f, 0x48, 0x7e, 0x34, 0x0, 0x17, 0x7e, 0xb3, 0x39, 0xa5, 0x54, 0x3f, + 0xa, 0x2b, 0x12, 0x3f, 0x10, 0x7e, 0x34, 0x0, 0x26, 0x12, 0x3f, 0x29, 0x7a, + 0x37, 0x3f, 0x30, 0x12, 0xf2, 0x11, 0x5e, 0x24, 0xf1, 0xdf, 0x12, 0x3f, + 0x10, 0x6d, 0x33, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x4a, 0x6d, 0x33, + 0x7e, 0x27, 0x3f, 0x4a, 0x5e, 0x24, 0x7f, 0xfd, 0x12, 0x3f, 0x10, 0x7e, + 0x34, 0x0, 0x21, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x4c, 0x12, 0xf2, 0x8, + 0x5e, 0x40, 0xef, 0x12, 0x39, 0xab, 0x7e, 0x34, 0x0, 0x21, 0x12, 0x3f, 0xaa, + 0x7a, 0x37, 0x3f, 0x4e, 0x12, 0xf1, 0xff, 0x5e, 0x40, 0xef, 0x12, 0x3f, + 0x20, 0x7e, 0x34, 0x0, 0x14, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x46, 0x12, + 0xf1, 0xf6, 0x5e, 0x24, 0xfc, 0x0, 0x12, 0xf2, 0x89, 0x12, 0x3f, 0x29, 0x7a, + 0x37, 0x3f, 0x5c, 0x7e, 0x34, 0x0, 0x2, 0x7e, 0x53, 0x39, 0xa7, 0xa, 0x55, + 0x12, 0x6c, 0x33, 0x7e, 0x27, 0x3f, 0x5c, 0x5e, 0x24, 0x8, 0x0, 0x4d, 0x25, + 0x4e, 0x50, 0x2e, 0x12, 0x3f, 0x10, 0x7e, 0x34, 0x0, 0x16, 0x12, 0x3f, 0x29, + 0x7a, 0x37, 0x3f, 0x52, 0x12, 0xf1, 0xed, 0x5e, 0x24, 0xf8, 0x0, 0x4e, 0x50, + 0xc4, 0x12, 0x3f, 0x10, 0x7e, 0x34, 0x0, 0x18, 0x12, 0x3f, 0x29, 0x7a, 0x37, + 0x3f, 0x58, 0x12, 0xf1, 0xe4, 0x5e, 0x24, 0xfc, 0x0, 0x4e, 0x50, 0xda, 0x12, + 0x3f, 0x10, 0x7e, 0x34, 0x0, 0x19, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x5a, + 0x12, 0xf1, 0xdb, 0x5e, 0x24, 0xfc, 0x0, 0x4e, 0x24, 0x1, 0x90, 0x12, 0x3f, + 0x10, 0x6d, 0x77, 0x7d, 0x67, 0x2e, 0x64, 0x0, 0x6, 0x12, 0x3f, 0xf4, 0x59, + 0x32, 0x3f, 0x3a, 0x7d, 0x27, 0x3e, 0x24, 0x49, 0x32, 0x3f, 0x3a, 0x59, + 0x32, 0x3f, 0x20, 0xb, 0x74, 0xbe, 0x74, 0x0, 0x5, 0x78, 0xdf, 0x7e, 0xb3, + 0x56, 0x28, 0x7e, 0x8, 0x3f, 0x26, 0x70, 0x7, 0x12, 0xf1, 0x53, 0x74, 0x1, + 0x80, 0x5, 0x12, 0xf1, 0x53, 0x74, 0x2, 0x7e, 0x70, 0x1, 0x12, 0x6b, 0x3f, + 0x7e, 0x8, 0x3f, 0x28, 0x74, 0x1, 0x12, 0x6b, 0x2c, 0x7e, 0x8, 0x3f, 0x28, + 0x74, 0x1, 0x12, 0x6b, 0x8, 0x7e, 0x73, 0x39, 0xca, 0xa, 0x37, 0x7a, 0x37, + 0x3f, 0x20, 0x7e, 0x34, 0x0, 0x6, 0x7e, 0x27, 0x3f, 0x20, 0x12, 0x3f, 0x10, + 0x7e, 0x34, 0x0, 0x9, 0x7e, 0x27, 0x3f, 0x26, 0x12, 0x3f, 0x10, 0x7e, 0x34, + 0x0, 0xa, 0x7e, 0x27, 0x3f, 0x28, 0x12, 0x3f, 0x10, 0x6d, 0x77, 0x7d, 0x67, + 0x2e, 0x64, 0x0, 0xb, 0x12, 0x3f, 0xf4, 0x59, 0x32, 0x3f, 0x5e, 0x12, 0xf1, + 0x49, 0x59, 0x32, 0x3f, 0x64, 0x12, 0x3f, 0xb4, 0x78, 0xe7, 0x7e, 0x34, 0x0, + 0xb, 0x7e, 0x24, 0x11, 0x11, 0x12, 0x3f, 0x10, 0x7e, 0x34, 0x0, 0xc, 0x7e, + 0x24, 0x0, 0x1, 0x12, 0x3f, 0x10, 0x7e, 0x34, 0x1, 0xfb, 0x12, 0x3f, 0x29, + 0x7d, 0x73, 0x7e, 0x34, 0x0, 0xd, 0x7d, 0x27, 0x12, 0x3f, 0x10, 0x6d, 0x77, + 0x7d, 0x67, 0x2e, 0x64, 0x0, 0x39, 0x12, 0x3f, 0xf4, 0x59, 0x32, 0x3f, 0x6a, + 0x12, 0xf1, 0x49, 0x59, 0x32, 0x3f, 0x70, 0x12, 0x3f, 0xb4, 0x78, 0xe7, + 0x7e, 0x34, 0x0, 0x39, 0x12, 0xf2, 0x99, 0x7e, 0x34, 0x0, 0x3a, 0x12, 0xf2, + 0x99, 0x7e, 0x34, 0x0, 0x3b, 0x7e, 0x24, 0x50, 0x5, 0x12, 0x39, 0xab, 0x7e, + 0x34, 0x0, 0x39, 0x7e, 0x24, 0x12, 0x34, 0x12, 0x3f, 0x20, 0x7e, 0x34, 0x0, + 0x3a, 0x7e, 0x24, 0x23, 0x45, 0x12, 0x3f, 0x20, 0x7e, 0x34, 0x0, 0x3b, 0x7e, + 0x24, 0x10, 0x5, 0x12, 0x3f, 0x20, 0xe1, 0xd, 0x7e, 0xa3, 0x56, 0x28, 0x4c, + 0xaa, 0x78, 0x24, 0x7e, 0xb3, 0x39, 0xb2, 0xf5, 0xc2, 0x7e, 0x73, 0x39, + 0xb5, 0x7c, 0xb7, 0x54, 0xc0, 0x4c, 0xb7, 0xf5, 0xc3, 0x7c, 0xb7, 0x54, + 0x20, 0x4c, 0xb7, 0xf5, 0xc3, 0x7c, 0xb7, 0x54, 0x7, 0x4c, 0xb7, 0xf5, 0xc3, + 0x80, 0xb, 0xbe, 0xa0, 0x1, 0x78, 0x6, 0x7e, 0xb3, 0x39, 0xb5, 0xf5, 0xc3, + 0x12, 0x63, 0xfe, 0x12, 0xf2, 0x50, 0x12, 0x3f, 0x10, 0x12, 0xf2, 0x47, + 0x12, 0x3f, 0x10, 0x12, 0xf2, 0x3e, 0x12, 0x3f, 0x10, 0x12, 0xf2, 0x35, + 0x12, 0x3f, 0x10, 0x12, 0xf2, 0x2c, 0x12, 0x3f, 0x10, 0x12, 0x63, 0xfe, + 0x12, 0xef, 0xb0, 0x12, 0x3f, 0xec, 0x7e, 0x27, 0x3f, 0x2c, 0x12, 0x3f, + 0x20, 0x12, 0xf2, 0x23, 0x12, 0x3f, 0x10, 0x12, 0xf2, 0x1a, 0x12, 0xf2, + 0x91, 0x7e, 0x27, 0x3f, 0x48, 0x12, 0x3f, 0x10, 0x12, 0xf2, 0x11, 0x12, + 0x3f, 0x10, 0x6d, 0x33, 0x7e, 0x27, 0x3f, 0x4a, 0x12, 0x3f, 0x10, 0x12, + 0xf2, 0x8, 0x12, 0x39, 0xab, 0x12, 0xf1, 0xff, 0x12, 0x3f, 0x20, 0x12, 0xf1, + 0xf6, 0x12, 0xf2, 0x89, 0x7e, 0x27, 0x3f, 0x5c, 0x12, 0x3f, 0x10, 0x7e, + 0x34, 0x0, 0x10, 0x7e, 0x27, 0x3f, 0x50, 0x12, 0x3f, 0x10, 0x12, 0xf1, 0xed, + 0x12, 0x3f, 0x10, 0x12, 0xf1, 0xe4, 0x12, 0x3f, 0x10, 0x12, 0xf1, 0xdb, + 0x12, 0x3f, 0x10, 0x90, 0x1, 0x90, 0xe4, 0x93, 0x60, 0xf, 0x7e, 0x34, 0x1, + 0x9b, 0x12, 0x32, 0xdf, 0x12, 0x76, 0x85, 0x6d, 0x33, 0x12, 0x77, 0xe2, + 0x7e, 0xb3, 0x56, 0x28, 0xb4, 0x1, 0x1c, 0x7e, 0x37, 0x39, 0xaa, 0x12, 0x77, + 0xd9, 0x7e, 0x37, 0x39, 0xae, 0x12, 0xf1, 0xa5, 0x7e, 0x37, 0x39, 0xc8, + 0x12, 0xef, 0xa0, 0x7e, 0x37, 0x39, 0xd2, 0x12, 0x77, 0xeb, 0x6d, 0x77, + 0x7d, 0x67, 0x2e, 0x64, 0x0, 0x6, 0x12, 0x3f, 0xc1, 0x49, 0x22, 0x3f, 0x3a, + 0x12, 0x3f, 0x10, 0xb, 0x74, 0xbe, 0x74, 0x0, 0x5, 0x78, 0xe8, 0x6d, 0x77, + 0x12, 0x3f, 0xbb, 0x49, 0x22, 0x3f, 0x5e, 0x12, 0x39, 0xab, 0x12, 0x3f, + 0xbb, 0x49, 0x22, 0x3f, 0x64, 0x12, 0x3f, 0xb1, 0x78, 0xea, 0x6d, 0x77, + 0x7d, 0x67, 0x2e, 0x64, 0x0, 0x39, 0x12, 0x3f, 0xc1, 0x49, 0x22, 0x3f, 0x6a, + 0x12, 0x39, 0xab, 0x12, 0x3f, 0xc1, 0x49, 0x22, 0x3f, 0x70, 0x12, 0x3f, + 0xb1, 0x78, 0xe4, 0x12, 0x4d, 0x95, 0x12, 0x40, 0x6d, 0xda, 0x3b, 0x22, + 0x7d, 0x2, 0x7d, 0x53, 0x7d, 0x20, 0x12, 0x39, 0xab, 0x7d, 0x35, 0x7d, 0x20, + 0x2, 0x3f, 0x20, 0x7d, 0x12, 0x12, 0x3f, 0xfe, 0x1b, 0x1a, 0x10, 0x22, 0x12, + 0xf1, 0x66, 0xb, 0x1a, 0x30, 0x22, 0xca, 0xf8, 0x6c, 0xff, 0x74, 0xee, 0xac, + 0xbf, 0x12, 0x98, 0x9b, 0x12, 0x96, 0xeb, 0xa, 0xe7, 0x3e, 0xe4, 0x3e, 0xe4, + 0x3e, 0xe4, 0xb, 0xe6, 0x9, 0x75, 0x3, 0xad, 0xa, 0xd7, 0x3e, 0xd4, 0x3e, + 0xd4, 0x3e, 0xd4, 0xb, 0xd6, 0x7e, 0xc4, 0x0, 0x2c, 0x7a, 0xc5, 0x29, 0x12, + 0xf0, 0xe1, 0x7d, 0x3e, 0x7d, 0x2d, 0x12, 0xee, 0xcb, 0x7d, 0x3e, 0x7d, + 0x2d, 0x12, 0x6b, 0xc9, 0x7d, 0x3e, 0x7d, 0x2d, 0x74, 0x2a, 0x12, 0xed, + 0xae, 0x12, 0xf0, 0x51, 0x12, 0x39, 0xab, 0x12, 0xf0, 0x42, 0x12, 0x98, + 0x8f, 0xac, 0xbf, 0x12, 0x39, 0xa7, 0x12, 0xf0, 0x51, 0x12, 0x3f, 0x20, + 0x12, 0xf0, 0x42, 0x12, 0x3f, 0x20, 0x12, 0x98, 0x92, 0xac, 0xbf, 0x49, + 0x25, 0x34, 0xe7, 0x12, 0x3f, 0x20, 0xb, 0xf0, 0xbe, 0xf0, 0x4, 0x40, 0x8d, + 0xda, 0xf8, 0x22, 0x12, 0x3f, 0xfe, 0xb, 0x1a, 0x30, 0x22, 0x12, 0x3f, 0x20, + 0xb, 0x74, 0xbe, 0x74, 0x0, 0x3, 0x22, 0x7d, 0x67, 0x2e, 0x64, 0x0, 0xb, + 0x7d, 0x36, 0x7d, 0x27, 0x3e, 0x24, 0x22, 0x7c, 0xab, 0x7e, 0x8, 0x34, 0x43, + 0x7c, 0xba, 0x12, 0xed, 0xc6, 0x7e, 0x8, 0x34, 0x83, 0x12, 0xed, 0xc6, 0x12, + 0x3f, 0xe4, 0x7e, 0x27, 0x34, 0x83, 0x2, 0x3f, 0x20, 0x7e, 0x34, 0x0, 0x20, + 0x7e, 0x27, 0x34, 0x43, 0x12, 0x39, 0xab, 0x7e, 0x34, 0x0, 0x20, 0x22, 0x7d, + 0x36, 0x12, 0x3f, 0x29, 0x7d, 0x27, 0x3e, 0x24, 0x22, 0x3e, 0x34, 0x2e, + 0x34, 0xb0, 0x0, 0x6d, 0x22, 0x22, 0xca, 0x79, 0x7c, 0xeb, 0x12, 0xf1, 0x8a, + 0x7e, 0x73, 0x54, 0x97, 0x19, 0x75, 0x3, 0xb2, 0x7e, 0x34, 0x0, 0x5, 0xca, + 0x39, 0x7e, 0x30, 0x5, 0xac, 0x3e, 0x2e, 0x14, 0x3, 0xcc, 0x6d, 0x0, 0x7e, + 0x18, 0x54, 0xa0, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x12, 0xee, 0x15, 0x12, 0xee, + 0x5, 0x12, 0xf0, 0x9d, 0x2e, 0x34, 0x0, 0xb, 0x7e, 0x30, 0x3c, 0xac, 0x3f, + 0x2e, 0x14, 0x34, 0xcb, 0x6d, 0x0, 0x7e, 0x24, 0x0, 0x3, 0x12, 0xef, 0xcd, + 0x6d, 0x0, 0x12, 0x40, 0x57, 0xda, 0x79, 0x22, 0x7d, 0x53, 0x3e, 0x54, 0x2e, + 0x54, 0xb0, 0x0, 0x6d, 0x44, 0x6d, 0x33, 0x80, 0x3, 0x12, 0xee, 0xec, 0xbd, + 0x32, 0x40, 0xf9, 0x22, 0x12, 0xf1, 0x9c, 0xe4, 0x12, 0xf0, 0x39, 0x12, + 0xf1, 0x93, 0x60, 0x29, 0x6d, 0x22, 0x12, 0x41, 0x1d, 0x7e, 0x8, 0x68, 0xc9, + 0x7d, 0x2b, 0x12, 0x41, 0x1d, 0x7d, 0x1b, 0x3e, 0x14, 0x2e, 0x14, 0x68, + 0xc9, 0x6d, 0x0, 0x7d, 0x2a, 0x12, 0x40, 0xbe, 0x7d, 0x3a, 0x12, 0x41, 0x14, + 0x7e, 0x24, 0x0, 0x4, 0x2, 0x40, 0xbe, 0x12, 0xf0, 0xed, 0x7e, 0x8, 0x68, + 0xc9, 0x12, 0xf0, 0x6e, 0x2e, 0x14, 0x68, 0xc9, 0x6d, 0x0, 0x12, 0x41, 0xd, + 0x6d, 0x22, 0x2, 0x40, 0x57, 0x7e, 0x24, 0x0, 0x17, 0x7d, 0x53, 0x3e, 0x54, + 0x2e, 0x54, 0xa0, 0x0, 0x6d, 0x44, 0x6d, 0x33, 0x80, 0x3, 0x12, 0xee, 0xec, + 0xbd, 0x32, 0x40, 0xf9, 0x22, 0x90, 0x1, 0x90, 0xe4, 0x93, 0x60, 0xa, 0x7e, + 0xa7, 0x68, 0xaf, 0x7e, 0xb7, 0x68, 0xad, 0x80, 0x3, 0x12, 0xf1, 0x9c, 0xe4, + 0x12, 0x3f, 0xc8, 0x12, 0xf1, 0x93, 0x12, 0xf0, 0xed, 0x7e, 0x14, 0x7, 0x4d, + 0x7e, 0x4, 0x0, 0xff, 0x12, 0xf0, 0x6e, 0x2e, 0x14, 0x7, 0x4d, 0x7e, 0x4, + 0x0, 0xff, 0x12, 0x41, 0xd, 0x6d, 0x22, 0x2, 0x40, 0x57, 0x7d, 0x2b, 0x12, + 0x40, 0x57, 0x7d, 0x3b, 0x2e, 0x34, 0x1, 0x0, 0x7e, 0x8, 0x68, 0xb9, 0x22, + 0x12, 0x40, 0x57, 0x7e, 0x34, 0x1, 0x0, 0x22, 0x7c, 0xbd, 0xa, 0xd, 0x7e, + 0x14, 0x2, 0xd8, 0xad, 0x10, 0x2e, 0x14, 0x5a, 0x0, 0x6d, 0x0, 0xca, 0x3b, + 0x7f, 0x70, 0x7c, 0xab, 0xbe, 0xa0, 0x4, 0x40, 0x2, 0x41, 0x3f, 0x74, 0x8, + 0xa4, 0x9, 0xb5, 0x3, 0xb0, 0xf5, 0x3c, 0x12, 0xf0, 0x37, 0x60, 0xd, 0x7e, + 0x37, 0x68, 0xaf, 0x7a, 0x35, 0x34, 0x7e, 0x37, 0x68, 0xad, 0x80, 0xb, 0x7e, + 0x37, 0x68, 0xad, 0x7a, 0x35, 0x34, 0x7e, 0x37, 0x68, 0xaf, 0x7a, 0x35, + 0x36, 0x2e, 0x35, 0x34, 0x7f, 0x7, 0x2d, 0x13, 0x7a, 0xd, 0x38, 0x6d, 0x77, + 0x80, 0xf, 0x12, 0xf0, 0x27, 0x60, 0x5, 0x12, 0x46, 0x2a, 0x80, 0x3, 0x12, + 0x46, 0x34, 0xb, 0x74, 0x7e, 0x25, 0x34, 0xbd, 0x27, 0x38, 0xea, 0x7d, 0x72, + 0x80, 0xf, 0x12, 0xf0, 0x27, 0x60, 0x5, 0x12, 0x46, 0x34, 0x80, 0x3, 0x12, + 0x46, 0x2a, 0xb, 0x74, 0xbd, 0x37, 0x38, 0xed, 0x6d, 0x77, 0x7c, 0xbf, 0x7e, + 0x24, 0x0, 0x1, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7e, 0x73, 0x68, + 0xaa, 0x12, 0x46, 0x42, 0x68, 0x14, 0x7d, 0x37, 0x3e, 0x34, 0x49, 0x63, + 0x68, 0xb9, 0x7e, 0x1d, 0x38, 0x2d, 0x37, 0x7e, 0x1b, 0x70, 0x19, 0x76, + 0x35, 0xad, 0xb, 0x74, 0xbe, 0x74, 0x0, 0x4, 0x78, 0xce, 0x6d, 0x77, 0x80, + 0x2d, 0x7c, 0xbf, 0x7e, 0x24, 0x0, 0x1, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, + 0xfb, 0x7e, 0x73, 0x68, 0xab, 0x12, 0x46, 0x42, 0x68, 0x15, 0x7d, 0x37, + 0x3e, 0x34, 0x49, 0x63, 0x68, 0xc1, 0x7e, 0x1d, 0x38, 0x2d, 0x37, 0x29, + 0x71, 0x0, 0x4, 0x19, 0x76, 0x37, 0x1a, 0xb, 0x74, 0xbe, 0x74, 0x0, 0x0, + 0x40, 0xcd, 0x7e, 0x71, 0x3c, 0x74, 0xee, 0xac, 0x7b, 0x2e, 0x34, 0x1, 0x0, + 0x2e, 0x34, 0x0, 0x35, 0x7a, 0x35, 0x3d, 0x7e, 0x8, 0x31, 0x54, 0x7e, 0x18, + 0x35, 0xad, 0x12, 0x45, 0x47, 0x12, 0x40, 0xbe, 0x7e, 0x8, 0x31, 0x54, 0x7e, + 0x18, 0x37, 0x1a, 0x12, 0x45, 0x47, 0x12, 0x40, 0x57, 0xda, 0x3b, 0x22, + 0xca, 0x79, 0x7f, 0x71, 0x7e, 0xa0, 0x25, 0x6c, 0x77, 0x6c, 0x66, 0x6c, + 0x55, 0x6c, 0x44, 0x41, 0xe9, 0x7c, 0x97, 0xac, 0x9a, 0xa, 0xd4, 0x2d, 0x4d, + 0x7e, 0xf0, 0x49, 0xac, 0xf7, 0x7d, 0xd7, 0xa5, 0xbc, 0x0, 0x11, 0x7e, 0xc4, + 0x1, 0x24, 0x9d, 0xcd, 0x7f, 0x57, 0x2d, 0xbc, 0x7e, 0x5b, 0xb0, 0xa, 0xcb, + 0x80, 0x2e, 0xa5, 0xbc, 0x12, 0x14, 0x7e, 0xc4, 0x1, 0x47, 0x9d, 0xcd, 0x12, + 0x43, 0xb, 0x7e, 0xc4, 0x1, 0x48, 0x9d, 0xcd, 0x12, 0x42, 0xfd, 0x80, 0x16, + 0xa5, 0xbc, 0x24, 0x17, 0x7e, 0xc4, 0x1, 0x6b, 0x9d, 0xcd, 0x12, 0x43, 0xb, + 0x7e, 0xc4, 0x1, 0x6c, 0x9d, 0xcd, 0x12, 0x42, 0xfd, 0x12, 0x45, 0x3a, 0x80, + 0x3d, 0xbe, 0x40, 0x12, 0x50, 0x1d, 0x7e, 0xb4, 0x1, 0x25, 0x9d, 0xbd, 0xa, + 0xc6, 0x12, 0x43, 0x9, 0x7e, 0xa4, 0x1, 0x26, 0x9d, 0xad, 0xa, 0xc6, 0x12, + 0x42, 0xfb, 0x12, 0x45, 0x3a, 0xb, 0x61, 0x80, 0x1b, 0x7e, 0xb4, 0x1, 0x49, + 0x9d, 0xbd, 0xa, 0xc5, 0x12, 0x43, 0x9, 0x7e, 0xa4, 0x1, 0x4a, 0x9d, 0xad, + 0xa, 0xc5, 0x12, 0x42, 0xfb, 0x12, 0x45, 0x3a, 0xb, 0x51, 0xb, 0x40, 0xbc, + 0xa4, 0x28, 0x2, 0x41, 0x53, 0xb, 0x70, 0xbe, 0x70, 0x5, 0x50, 0x2, 0x41, + 0x4b, 0xda, 0x79, 0x22, 0x2d, 0xca, 0x7f, 0x47, 0x2d, 0x9c, 0x7e, 0x4b, + 0xb0, 0xa, 0xcb, 0x2d, 0xcb, 0x22, 0x2d, 0xcb, 0x7f, 0x57, 0x2d, 0xbc, 0x7e, + 0x5b, 0xb0, 0xa, 0xbb, 0x7d, 0x7b, 0x7c, 0xef, 0x6c, 0xff, 0x7d, 0xb7, 0x22, + 0xca, 0x3b, 0x7c, 0xdb, 0x7e, 0x34, 0x3, 0xe8, 0x7a, 0x37, 0x31, 0x4f, 0x7e, + 0x34, 0x3e, 0x80, 0x7a, 0x37, 0x31, 0x51, 0x74, 0x1, 0x7a, 0xb3, 0x31, 0x53, + 0x7e, 0x37, 0x74, 0xc, 0xb, 0x36, 0x7a, 0x35, 0x2c, 0x7e, 0x90, 0x3, 0xac, + 0x9d, 0x9, 0xa4, 0x3, 0xe2, 0xa, 0xfa, 0x6d, 0xee, 0x7e, 0x14, 0x5, 0xdc, + 0x7f, 0x17, 0x12, 0x2a, 0x31, 0x9, 0xb4, 0x3, 0xe0, 0x60, 0xc, 0x1e, 0x34, + 0x1e, 0x24, 0x50, 0x3, 0x4e, 0x60, 0x80, 0x14, 0x78, 0xf4, 0x7a, 0x35, 0x2e, + 0xbe, 0xa0, 0x8, 0x68, 0x2e, 0x7e, 0x37, 0x31, 0x51, 0x12, 0x46, 0x20, 0x1e, + 0x34, 0x1e, 0x24, 0x50, 0x3, 0x4e, 0x60, 0x80, 0x14, 0x78, 0xf4, 0x7a, 0x37, + 0x31, 0x51, 0x7e, 0x37, 0x31, 0x4f, 0x12, 0x46, 0x20, 0x1e, 0x34, 0x1e, + 0x24, 0x50, 0x3, 0x4e, 0x60, 0x80, 0x14, 0x78, 0xf4, 0x7a, 0x37, 0x31, 0x4f, + 0x12, 0x45, 0x31, 0x2e, 0x14, 0x5a, 0x0, 0x6d, 0x0, 0x7e, 0x35, 0x2c, 0xe4, + 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x2e, 0x77, 0x7e, 0x34, 0x2, 0xd8, 0x74, 0xff, + 0x12, 0x0, 0x2e, 0x6d, 0x77, 0x80, 0xe, 0x7e, 0x34, 0x7f, 0xff, 0x7d, 0x27, + 0x3e, 0x24, 0x59, 0x32, 0x13, 0x60, 0xb, 0x74, 0x7e, 0x35, 0x2c, 0xbd, 0x37, + 0x38, 0xeb, 0x7e, 0xc0, 0x5, 0x12, 0x5a, 0xa4, 0xbe, 0xc0, 0x7, 0x58, 0x13, + 0x7e, 0x34, 0x0, 0x1, 0x7c, 0xbc, 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, + 0x7c, 0xb7, 0xf5, 0x2b, 0x80, 0x3, 0x75, 0x2b, 0xc0, 0xbe, 0xc0, 0x6, 0x58, + 0x22, 0x7e, 0xb3, 0x31, 0x53, 0x60, 0x1c, 0x6d, 0x77, 0x80, 0x13, 0x12, + 0x46, 0x17, 0x2d, 0x37, 0x2e, 0x34, 0x5a, 0x0, 0x7e, 0x39, 0xb0, 0x45, 0x2b, + 0x7a, 0x39, 0xb0, 0xb, 0x74, 0x12, 0x45, 0x2a, 0x38, 0xe8, 0x12, 0x41, 0x25, + 0x12, 0x46, 0xb3, 0xbe, 0xc0, 0x6, 0x48, 0x2, 0x81, 0xb3, 0xbe, 0xc0, 0x6, + 0x48, 0x2, 0x81, 0xb3, 0x6d, 0x77, 0x80, 0x7a, 0x7d, 0x47, 0x3e, 0x44, 0x49, + 0x34, 0xe, 0x40, 0x7d, 0x53, 0x12, 0x46, 0xf, 0x8, 0x7, 0x7d, 0x23, 0x9e, + 0x25, 0x2e, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x25, 0x7a, 0x25, 0x30, 0x49, 0x24, + 0x13, 0x60, 0x7d, 0x52, 0x12, 0x46, 0xf, 0x8, 0x5, 0x9e, 0x25, 0x2e, 0x80, + 0x4, 0x6d, 0x22, 0x9d, 0x25, 0x7a, 0x25, 0x32, 0xbe, 0x25, 0x30, 0x40, 0x22, + 0x7e, 0x25, 0x2e, 0x1e, 0x24, 0xbd, 0x32, 0x28, 0x19, 0xbe, 0x34, 0x3e, + 0x80, 0x50, 0x13, 0x59, 0x34, 0x13, 0x60, 0x12, 0x45, 0x31, 0x7d, 0x21, + 0x2d, 0x27, 0x9, 0x52, 0x5a, 0x0, 0x19, 0x57, 0x2e, 0x77, 0x74, 0x1, 0x7a, + 0xb3, 0x31, 0x53, 0xbe, 0x35, 0x2e, 0x50, 0x12, 0xe5, 0x2b, 0x64, 0xff, + 0x12, 0x46, 0x17, 0x7d, 0x23, 0x2d, 0x27, 0x2e, 0x24, 0x5a, 0x0, 0x12, 0x9d, + 0x50, 0xb, 0x74, 0x12, 0x45, 0x2a, 0x38, 0x81, 0x20, 0xd, 0x71, 0x20, 0xe, + 0x6e, 0x1b, 0xc0, 0xbe, 0xc0, 0x0, 0x48, 0x2, 0x61, 0xd7, 0x7e, 0xb3, 0x54, + 0x80, 0xb4, 0x2, 0x9, 0x7e, 0xb3, 0x54, 0x81, 0xbe, 0xb0, 0x2, 0x68, 0x33, + 0x6d, 0x77, 0x80, 0x2a, 0x7d, 0x27, 0x3e, 0x24, 0x49, 0x32, 0x13, 0x60, + 0xbe, 0x37, 0x31, 0x4f, 0x28, 0x1a, 0xbe, 0x37, 0x31, 0x51, 0x50, 0x14, 0x9, + 0x77, 0x2e, 0x77, 0xbe, 0x70, 0xff, 0x68, 0xb, 0x12, 0x45, 0x31, 0x7d, 0x21, + 0x2d, 0x27, 0x19, 0x72, 0x5a, 0x0, 0xb, 0x74, 0x12, 0x45, 0x2a, 0x38, 0xd1, + 0x12, 0x41, 0x25, 0x7c, 0xbd, 0x12, 0x98, 0xe2, 0x50, 0x15, 0x7e, 0x8, 0x62, + 0x88, 0x7e, 0x35, 0x2c, 0x74, 0xc, 0x12, 0x0, 0x2e, 0x74, 0x3, 0x7e, 0x8, + 0x62, 0x88, 0x12, 0x41, 0x35, 0x12, 0x7b, 0x30, 0xda, 0x3b, 0x22, 0x7e, + 0x37, 0x74, 0xc, 0xbd, 0x37, 0x22, 0xa, 0xd, 0x7e, 0x14, 0x2, 0xd8, 0xad, + 0x10, 0x22, 0x7e, 0xf0, 0x2, 0xac, 0xf9, 0x7f, 0x50, 0x2d, 0xb7, 0x1b, 0x5a, + 0xc0, 0x22, 0x12, 0x42, 0x42, 0x7e, 0x35, 0x3d, 0x7e, 0x8, 0x31, 0x54, 0x7e, + 0x24, 0x0, 0xb9, 0x22, 0x12, 0xf1, 0xc9, 0x7e, 0x63, 0x56, 0x21, 0xa, 0x6, + 0x12, 0x45, 0x33, 0x7d, 0x21, 0x2e, 0x24, 0x5a, 0x0, 0x7a, 0x27, 0x39, 0xdc, + 0x6d, 0x22, 0x7a, 0x27, 0x39, 0xa8, 0x7e, 0x24, 0x68, 0xc9, 0x7a, 0x27, + 0x39, 0xc6, 0x7e, 0x24, 0x0, 0x8, 0xca, 0x29, 0x7e, 0x70, 0x8, 0xac, 0x67, + 0x2e, 0x34, 0x3, 0xac, 0x6d, 0x22, 0x7e, 0x8, 0x54, 0x91, 0x12, 0x2b, 0x7, + 0x1b, 0xfd, 0x7e, 0x34, 0x0, 0x5, 0xca, 0x39, 0x7e, 0x63, 0x56, 0x21, 0xac, + 0x67, 0x2e, 0x34, 0x3, 0xcc, 0x6d, 0x22, 0x7e, 0x8, 0x54, 0xa0, 0x12, 0x2b, + 0x7, 0x1b, 0xfd, 0x7e, 0xb3, 0x56, 0x21, 0x12, 0x6b, 0x17, 0x12, 0x46, 0x7, + 0x9, 0x75, 0x3, 0xec, 0x7a, 0x73, 0x54, 0x80, 0x12, 0x46, 0x7, 0x9, 0x75, + 0x3, 0xed, 0x7a, 0x73, 0x54, 0x81, 0x12, 0x46, 0x7, 0x9, 0x75, 0x3, 0xee, + 0x7a, 0x73, 0x54, 0x82, 0x12, 0x46, 0x7, 0x9, 0x75, 0x3, 0xef, 0x7a, 0x73, + 0x54, 0x83, 0x12, 0x46, 0x7, 0x9, 0x75, 0x3, 0xf0, 0x7a, 0x73, 0x54, 0x84, + 0x7e, 0x73, 0x56, 0x21, 0x7a, 0x73, 0x54, 0x90, 0x12, 0x77, 0xf4, 0xe4, 0x2, + 0x45, 0xfc, 0x7a, 0xb3, 0x54, 0xab, 0x74, 0x3f, 0x7a, 0xb3, 0x54, 0xac, + 0x22, 0x7e, 0xa3, 0x56, 0x21, 0x74, 0x5, 0xa4, 0x22, 0x9e, 0x55, 0x2e, 0xbe, + 0x54, 0x0, 0x0, 0x22, 0xa, 0x2d, 0x7e, 0x34, 0x2, 0xd8, 0xad, 0x32, 0x22, + 0x6d, 0x22, 0x7f, 0x7, 0x12, 0x2a, 0x20, 0x74, 0x3, 0x22, 0x2d, 0x17, 0x7e, + 0xb, 0x50, 0x19, 0x56, 0x37, 0x1a, 0x22, 0x2d, 0x17, 0x7e, 0xb, 0x50, 0x19, + 0x56, 0x35, 0xad, 0x22, 0x7e, 0x73, 0x74, 0xb, 0x6c, 0x66, 0x5c, 0x75, 0x4d, + 0x33, 0x22, 0x30, 0x18, 0x42, 0x30, 0x19, 0x11, 0x12, 0xf0, 0xf9, 0x68, 0x9, + 0x12, 0x78, 0x8d, 0x7e, 0xb3, 0x56, 0x8d, 0x70, 0xfa, 0x12, 0x46, 0x8f, + 0x7e, 0xb3, 0x56, 0x28, 0xb4, 0x2, 0x27, 0x7e, 0xb3, 0x56, 0x21, 0x7e, 0x24, + 0x0, 0x1, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7e, 0x73, 0x74, 0xa, + 0x12, 0x46, 0x42, 0x78, 0x5, 0x12, 0x46, 0x3e, 0x68, 0x7, 0x74, 0x1, 0x7a, + 0xb3, 0x54, 0xf7, 0x22, 0x2, 0x46, 0x8f, 0x22, 0xe4, 0x7a, 0xb3, 0x54, 0xf6, + 0x12, 0xf1, 0x5, 0x12, 0xef, 0x39, 0x7a, 0xb3, 0x54, 0xff, 0xc2, 0x2, 0x12, + 0x2f, 0xd7, 0x12, 0xe2, 0x23, 0x40, 0x6, 0x74, 0x3, 0x7a, 0xb3, 0x54, 0xf6, + 0xd2, 0x2, 0x2, 0x2f, 0xd7, 0x12, 0x46, 0x8f, 0xd2, 0x2, 0x12, 0x7f, 0x99, + 0x80, 0x11, 0x12, 0xf2, 0x6a, 0x40, 0x3, 0x12, 0x7f, 0xc4, 0x30, 0xd, 0x3, + 0x12, 0x7f, 0xc4, 0x12, 0x47, 0x90, 0x7e, 0xb3, 0x54, 0xf6, 0xbe, 0xb0, 0x1, + 0x68, 0xe6, 0x30, 0x2, 0x3, 0x2, 0x76, 0x9c, 0x22, 0x20, 0x1c, 0x2, 0xe1, + 0x61, 0xc2, 0x1c, 0x12, 0x57, 0xf9, 0xd2, 0x2, 0x12, 0x46, 0xb8, 0x7e, 0x73, + 0x54, 0x90, 0xbe, 0x73, 0x56, 0x21, 0x68, 0x9, 0x7a, 0x73, 0x56, 0x21, 0xd2, + 0x0, 0x12, 0x47, 0x7f, 0x7e, 0xb3, 0x54, 0x7e, 0xbe, 0xb3, 0x68, 0xaa, 0x68, + 0x14, 0x54, 0x7, 0x7a, 0xb3, 0x54, 0x7e, 0x7e, 0x73, 0x54, 0x7e, 0x7a, 0x73, + 0x68, 0xaa, 0x12, 0x91, 0x95, 0x12, 0x0, 0x1a, 0x7e, 0xb3, 0x54, 0x7f, 0xbe, + 0xb3, 0x68, 0xab, 0x68, 0x14, 0x54, 0x7, 0x7a, 0xb3, 0x54, 0x7f, 0x7e, 0x73, + 0x54, 0x7f, 0x7a, 0x73, 0x68, 0xab, 0x12, 0x91, 0x95, 0x12, 0x0, 0x1a, 0x7e, + 0xb3, 0x54, 0x6e, 0x54, 0xfe, 0x7a, 0xb3, 0x54, 0x6e, 0x7e, 0xb3, 0x54, + 0xa9, 0xb4, 0x1, 0x3, 0x12, 0x59, 0x4e, 0x7e, 0xb3, 0x54, 0x6f, 0x60, 0x8, + 0x12, 0x70, 0x34, 0xe4, 0x7a, 0xb3, 0x39, 0xd5, 0x12, 0x46, 0x8f, 0x7e, + 0x37, 0x39, 0xcb, 0x4d, 0x33, 0x68, 0x15, 0xd2, 0x2, 0x12, 0x46, 0xb8, 0x12, + 0x37, 0xfe, 0x7e, 0xb3, 0x54, 0x6e, 0x54, 0xfd, 0x7a, 0xb3, 0x54, 0x6e, 0x2, + 0x46, 0x8f, 0x22, 0x12, 0x64, 0xa4, 0xd2, 0x2, 0x12, 0x46, 0xb8, 0x12, 0x6d, + 0xbd, 0x12, 0x78, 0xfc, 0x2, 0x45, 0x56, 0x30, 0x27, 0x3d, 0x12, 0x77, 0x54, + 0x5e, 0x34, 0x8, 0x0, 0x78, 0x34, 0xc2, 0x27, 0x7e, 0x34, 0x28, 0x0, 0x12, + 0x58, 0x35, 0x7e, 0x34, 0x10, 0x0, 0x12, 0x58, 0x35, 0x7e, 0x34, 0xf7, 0x0, + 0x74, 0x5a, 0x12, 0x47, 0xd1, 0x7e, 0x34, 0xf7, 0x1, 0x74, 0xa5, 0x12, 0x47, + 0xd1, 0x7e, 0x34, 0xf7, 0x2, 0x74, 0x95, 0x12, 0x47, 0xd1, 0x7e, 0x34, 0xf7, + 0x3, 0x74, 0x27, 0x2, 0x47, 0xd1, 0x22, 0x12, 0xef, 0x78, 0xa, 0x3b, 0x7e, + 0xf, 0x56, 0xad, 0x79, 0x30, 0x0, 0x8, 0x12, 0xee, 0x9f, 0x80, 0xa, 0x12, + 0xef, 0xf2, 0x68, 0x5, 0x12, 0xf0, 0x89, 0x80, 0x5, 0x12, 0xf0, 0x90, 0x68, + 0xf1, 0x12, 0xef, 0x6b, 0x12, 0xef, 0x51, 0x78, 0xfb, 0x2, 0x47, 0xfd, 0x6d, + 0x33, 0x1b, 0xa, 0x30, 0xc2, 0xcc, 0x22, 0x7c, 0x7b, 0x74, 0x8, 0xac, 0x7b, + 0xb, 0x36, 0xbe, 0x34, 0x0, 0x6, 0x50, 0x2, 0xc3, 0x22, 0xd3, 0x22, 0x7c, + 0x2b, 0xa5, 0xba, 0x0, 0x3, 0x2, 0x88, 0x9a, 0xa5, 0xba, 0x5f, 0x5, 0x7e, + 0xb3, 0x54, 0xbf, 0x22, 0xbe, 0x20, 0x5c, 0x38, 0x7, 0xa, 0x32, 0x9, 0xb3, + 0x54, 0x60, 0x22, 0xbe, 0x20, 0x6a, 0x68, 0x4, 0xa5, 0xba, 0x6b, 0x1d, 0x7e, + 0x37, 0x39, 0xac, 0x7d, 0x23, 0xb, 0x24, 0x7a, 0x27, 0x39, 0xac, 0x2e, 0x37, + 0x39, 0xe4, 0x7e, 0x39, 0x30, 0xa5, 0xba, 0x6b, 0x3, 0x75, 0xf, 0x6a, 0x7c, + 0xb3, 0x22, 0xbe, 0x20, 0x6e, 0x68, 0x4, 0xa5, 0xba, 0x6f, 0x2d, 0x7e, 0x7, + 0x74, 0xc, 0xbe, 0x7, 0x39, 0xa8, 0x7e, 0x37, 0x39, 0xa8, 0x28, 0x8, 0x12, + 0x49, 0xda, 0x5e, 0x30, 0x3f, 0x80, 0x3, 0x12, 0x49, 0xda, 0x7e, 0x7, 0x39, + 0xa8, 0xb, 0x4, 0x7a, 0x7, 0x39, 0xa8, 0xa5, 0xba, 0x6f, 0x3, 0x75, 0xf, + 0x6e, 0x7c, 0xb3, 0x22, 0xbe, 0x20, 0x6c, 0x68, 0x4, 0xa5, 0xba, 0x6d, 0x1d, + 0x7e, 0x37, 0x39, 0xe0, 0x7d, 0x23, 0xb, 0x24, 0x7a, 0x27, 0x39, 0xe0, 0x2e, + 0x37, 0x39, 0xc6, 0x7e, 0x39, 0x30, 0xa5, 0xba, 0x6d, 0x3, 0x75, 0xf, 0x6c, + 0x7c, 0xb3, 0x22, 0xbe, 0x20, 0x89, 0x68, 0x4, 0xa5, 0xba, 0x8a, 0x1d, 0x7e, + 0x37, 0x39, 0xea, 0x7d, 0x23, 0xb, 0x24, 0x7a, 0x27, 0x39, 0xea, 0x2e, 0x37, + 0x39, 0xe6, 0x7e, 0x39, 0x30, 0xa5, 0xba, 0x8a, 0x3, 0x75, 0xf, 0x89, 0x7c, + 0xb3, 0x22, 0xa5, 0xba, 0x10, 0x7, 0x7e, 0x33, 0x54, 0x70, 0x7c, 0xb3, 0x22, + 0xbe, 0x20, 0x8b, 0x68, 0x4, 0xa5, 0xba, 0x8c, 0xd, 0x12, 0x4b, 0x35, 0xa5, + 0xba, 0x8c, 0x3, 0x75, 0xf, 0x8b, 0x7c, 0xb3, 0x22, 0xbe, 0x20, 0x8d, 0x68, + 0x4, 0xa5, 0xba, 0x8e, 0xd, 0x12, 0x4b, 0x35, 0xa5, 0xba, 0x8e, 0x3, 0x75, + 0xf, 0x8d, 0x7c, 0xb3, 0x22, 0xbe, 0x20, 0x70, 0x40, 0xa, 0xbe, 0x20, 0x7f, + 0x38, 0x5, 0x7c, 0xb2, 0x2, 0x76, 0xc3, 0xbe, 0x20, 0x81, 0x68, 0x4, 0xa5, + 0xba, 0x82, 0x20, 0x7e, 0xa3, 0x54, 0x77, 0xa, 0x3a, 0x2e, 0x34, 0x1, 0x20, + 0x12, 0x49, 0xe4, 0x7c, 0x3b, 0x7c, 0xba, 0x4, 0x7a, 0xb3, 0x54, 0x77, 0xa5, + 0xba, 0x82, 0x3, 0x75, 0xf, 0x81, 0x7c, 0xb3, 0x22, 0xa5, 0xba, 0x83, 0x5, + 0x7e, 0xb3, 0x39, 0xb0, 0x22, 0xa5, 0xba, 0x86, 0x5, 0x7e, 0xb3, 0x39, 0xb4, + 0x22, 0xa5, 0xba, 0x87, 0x5, 0x7e, 0xb3, 0x39, 0xa4, 0x22, 0xa5, 0xba, 0x88, + 0x3, 0xe5, 0xc4, 0x22, 0xbe, 0x20, 0x92, 0x68, 0x4, 0xa5, 0xba, 0x93, 0x13, + 0x7e, 0xb3, 0x39, 0xb1, 0xa, 0x3b, 0x9, 0x33, 0x39, 0xd6, 0xa5, 0xba, 0x93, + 0x3, 0x75, 0xf, 0x92, 0x80, 0x1a, 0xbe, 0x20, 0x94, 0x68, 0x4, 0xa5, 0xba, + 0x95, 0x19, 0x7e, 0xb3, 0x39, 0xb1, 0xa, 0x3b, 0x9, 0x33, 0x39, 0xb9, 0xa5, + 0xba, 0x95, 0x3, 0x75, 0xf, 0x94, 0x4, 0x7a, 0xb3, 0x39, 0xb1, 0x7c, 0xb3, + 0x22, 0xa5, 0xba, 0xed, 0x5, 0x7e, 0xb3, 0x39, 0xd4, 0x22, 0xa5, 0xba, 0xee, + 0x5, 0x7e, 0xb3, 0x39, 0xce, 0x22, 0xa5, 0xba, 0xef, 0x5, 0x7e, 0xb3, 0x39, + 0xcf, 0x22, 0xa5, 0xba, 0xfe, 0xd, 0x7e, 0x23, 0x56, 0x21, 0x74, 0x8, 0xac, + 0xb2, 0x9, 0xb5, 0x3, 0xac, 0x22, 0xe4, 0x22, 0x2e, 0x37, 0x39, 0xdc, 0x7e, + 0x39, 0x30, 0x22, 0x7d, 0x3b, 0x7a, 0x71, 0x82, 0x7a, 0x61, 0x83, 0xe4, + 0x93, 0x22, 0xca, 0xf8, 0x6c, 0xff, 0x74, 0x1, 0x7a, 0xb3, 0x56, 0xbf, 0x7e, + 0xb4, 0xd, 0x10, 0x12, 0x49, 0xe2, 0x7c, 0x7b, 0x1e, 0x70, 0x7a, 0x73, 0x68, + 0x86, 0x7e, 0xa4, 0x0, 0x96, 0x7a, 0xa7, 0x68, 0x87, 0x7e, 0x34, 0x0, 0x78, + 0x7a, 0x37, 0x68, 0x89, 0x12, 0xc0, 0xc1, 0x6c, 0xaa, 0x80, 0x31, 0x12, + 0xdc, 0x9f, 0xbe, 0xb0, 0x0, 0x28, 0x27, 0xa, 0x2b, 0x7e, 0xb3, 0x68, 0xa8, + 0xa, 0x3b, 0x1b, 0x34, 0xbd, 0x23, 0x58, 0x19, 0x9, 0xb4, 0x65, 0x61, 0xbe, + 0xb0, 0x0, 0x28, 0x10, 0xa, 0x2b, 0x7e, 0xb3, 0x68, 0xa9, 0xa, 0x3b, 0x1b, + 0x34, 0xbd, 0x23, 0x58, 0x2, 0xb, 0xf0, 0xb, 0xa0, 0x7e, 0xb3, 0x66, 0xea, + 0xbc, 0xba, 0x38, 0xc7, 0x7a, 0xf3, 0x66, 0xea, 0xbe, 0xf0, 0x0, 0x38, 0x2, + 0x61, 0x4, 0x7e, 0xb3, 0x56, 0x28, 0x70, 0x2, 0x61, 0x4, 0x7e, 0x73, 0x66, + 0xea, 0xbe, 0x70, 0x8, 0x28, 0x1a, 0x12, 0xaf, 0xab, 0x58, 0x15, 0x12, 0x49, + 0xe2, 0x7c, 0x7b, 0x1e, 0x70, 0xa, 0x37, 0x7d, 0x2a, 0x7e, 0x14, 0x0, 0x78, + 0x7e, 0x4, 0x0, 0x82, 0x80, 0x71, 0x7e, 0x73, 0x66, 0xea, 0xbe, 0x70, 0x5, + 0x28, 0x24, 0x7e, 0x37, 0x66, 0xf0, 0xbe, 0x34, 0x2, 0x26, 0x58, 0x1a, 0x7e, + 0x73, 0x56, 0xb7, 0xbe, 0x70, 0xf, 0x50, 0x11, 0x12, 0x49, 0xe2, 0xa, 0x3b, + 0x7e, 0x24, 0x0, 0xa0, 0x7e, 0x14, 0x0, 0x82, 0x7d, 0xa, 0x80, 0x44, 0x12, + 0xdc, 0x97, 0x28, 0x1b, 0x7e, 0x37, 0x66, 0xf0, 0xbe, 0x34, 0x3, 0x20, 0x58, + 0x11, 0x12, 0x49, 0xe2, 0xa, 0x3b, 0x7e, 0x24, 0x0, 0xb4, 0x7d, 0x1a, 0x7e, + 0x4, 0x0, 0xc8, 0x80, 0x24, 0x7e, 0x73, 0x66, 0xea, 0xbe, 0x70, 0x2, 0x28, + 0x22, 0x7e, 0xa7, 0x66, 0xf0, 0xbe, 0xa4, 0x3, 0x84, 0x58, 0x18, 0x12, 0x49, + 0xe2, 0xa, 0x3b, 0x7e, 0x24, 0x0, 0xc8, 0x7e, 0x14, 0x0, 0xa0, 0x7e, 0x4, + 0x0, 0xe6, 0x12, 0x4b, 0x49, 0x80, 0x7, 0x80, 0x0, 0xe4, 0x7a, 0xb3, 0x56, + 0xbf, 0x7e, 0xb3, 0x56, 0xbf, 0x70, 0x21, 0x90, 0xd, 0x10, 0xe4, 0x93, 0xa, + 0x3b, 0x12, 0xa7, 0x95, 0x7e, 0x14, 0xd, 0x1a, 0x12, 0x4f, 0x69, 0x7e, 0x54, + 0xd, 0x26, 0x7e, 0x44, 0x0, 0xff, 0xb, 0x2a, 0x0, 0x12, 0x4b, 0x49, 0x80, + 0x2, 0xd2, 0x1d, 0xda, 0xf8, 0x22, 0x7e, 0x37, 0x39, 0xe2, 0x7d, 0x23, 0xb, + 0x24, 0x7a, 0x27, 0x39, 0xe2, 0x2e, 0x37, 0x39, 0xc4, 0x7e, 0x39, 0x30, + 0x22, 0x7a, 0x73, 0x68, 0x86, 0x7a, 0x27, 0x68, 0x87, 0x7a, 0x17, 0x68, + 0x89, 0x7a, 0x7, 0x68, 0x93, 0x6d, 0x33, 0x9d, 0x30, 0x12, 0x4b, 0x91, 0x12, + 0x4f, 0xb6, 0x7a, 0x73, 0x53, 0xef, 0x22, 0x7a, 0x37, 0x68, 0x89, 0xe4, + 0x7a, 0xb3, 0x56, 0xbf, 0x7e, 0x34, 0xd, 0x26, 0x7e, 0x24, 0x0, 0xff, 0xb, + 0x1a, 0x30, 0x7a, 0x37, 0x68, 0x93, 0x7e, 0x34, 0xd, 0x28, 0x7e, 0x24, 0x0, + 0xff, 0xb, 0x1a, 0x30, 0x6e, 0x34, 0xff, 0xff, 0xb, 0x34, 0x7a, 0x37, 0x68, + 0x95, 0x7e, 0x37, 0x68, 0x87, 0x1e, 0x34, 0x1e, 0x34, 0x1e, 0x34, 0x1e, + 0x34, 0x1e, 0x34, 0x22, 0xca, 0x79, 0x7e, 0x97, 0x68, 0xad, 0x7a, 0x97, + 0x2e, 0x79, 0x7e, 0xf3, 0x68, 0xa7, 0x6d, 0xaa, 0x74, 0x4, 0xac, 0xbf, 0x7a, + 0x57, 0x2e, 0x7b, 0x7d, 0x85, 0x2e, 0x87, 0x2e, 0x79, 0x7a, 0x87, 0x2e, + 0x7d, 0x7e, 0x1f, 0x39, 0xfc, 0x69, 0x81, 0x0, 0x18, 0x7a, 0x87, 0x2e, 0x77, + 0x7e, 0xe3, 0x68, 0xa4, 0x12, 0x4f, 0xf5, 0x6d, 0x88, 0xa1, 0x4, 0x7e, 0x8, + 0x2e, 0x7f, 0x12, 0x4f, 0x71, 0x12, 0x88, 0x14, 0x6d, 0xbb, 0xa, 0x3f, 0xad, + 0x3b, 0x2d, 0x3a, 0x12, 0x4d, 0x7d, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, + 0x7d, 0x3f, 0x12, 0x4b, 0x9b, 0x12, 0x4d, 0x6c, 0xbe, 0xb4, 0x0, 0x4, 0x78, + 0xe2, 0x6d, 0xbb, 0xa, 0x3f, 0xad, 0x3b, 0x2e, 0x37, 0x2e, 0x7b, 0x12, 0x4d, + 0x7d, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3f, 0x12, 0x4b, 0x9b, + 0x12, 0x4d, 0x6c, 0xbe, 0xb4, 0x0, 0x5, 0x78, 0xe0, 0x6d, 0xbb, 0xa, 0x3f, + 0xad, 0x3b, 0x2d, 0x39, 0x12, 0x4d, 0x7d, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, + 0xfb, 0x7d, 0x3f, 0x12, 0x4b, 0x9b, 0x3e, 0x34, 0x2e, 0x34, 0x2e, 0xad, + 0x12, 0x4d, 0x72, 0xbe, 0xb4, 0x0, 0x4, 0x78, 0xdc, 0x6d, 0xbb, 0xa, 0x3f, + 0xad, 0x3b, 0x2e, 0x37, 0x2e, 0x7d, 0x12, 0x4d, 0x7d, 0x60, 0x5, 0x3e, 0x24, + 0x14, 0x78, 0xfb, 0x7d, 0x3f, 0x12, 0x4b, 0x9b, 0x3e, 0x34, 0x2e, 0x34, + 0x2e, 0xad, 0x12, 0x4d, 0x72, 0xbe, 0xb4, 0x0, 0x5, 0x78, 0xda, 0x12, 0x4f, + 0xa4, 0x7e, 0x8, 0x2e, 0x7f, 0x12, 0x40, 0xba, 0x12, 0x4f, 0xa4, 0x7e, 0x8, + 0x2e, 0xad, 0x12, 0x40, 0x57, 0x12, 0x78, 0x51, 0x30, 0x11, 0xf, 0x7e, 0x8, + 0x3a, 0x0, 0x7e, 0x34, 0x5, 0x20, 0x74, 0xff, 0x12, 0x0, 0x2e, 0x80, 0x6c, + 0xa9, 0xd7, 0xea, 0x6d, 0xbb, 0xa, 0x3f, 0xad, 0x3b, 0x7d, 0x23, 0x2d, 0x2a, + 0x12, 0x4f, 0xde, 0x2d, 0xa, 0x12, 0x4f, 0x92, 0x2d, 0x29, 0x3e, 0x24, 0x59, + 0x32, 0x3a, 0x0, 0x12, 0x4f, 0x41, 0x78, 0xe3, 0x6d, 0xbb, 0xa, 0x3f, 0xad, + 0x3b, 0x7d, 0x23, 0x2e, 0x27, 0x2e, 0x7b, 0x12, 0x4f, 0xde, 0x2e, 0x7, 0x2e, + 0x7b, 0x12, 0x4f, 0x92, 0x2e, 0x27, 0x2e, 0x7d, 0x3e, 0x24, 0x59, 0x32, + 0x3a, 0x0, 0x12, 0x4f, 0x48, 0x78, 0xdd, 0xa9, 0xc7, 0xea, 0xb, 0xa4, 0x7e, + 0x37, 0x2e, 0x7b, 0xb, 0x34, 0x7a, 0x37, 0x2e, 0x7b, 0xb, 0x94, 0x7e, 0x37, + 0x2e, 0x7d, 0xb, 0x34, 0x7a, 0x37, 0x2e, 0x7d, 0xb, 0x84, 0xa, 0x3f, 0xbd, + 0x38, 0x28, 0x2, 0x61, 0xdd, 0x90, 0x1, 0x90, 0xe4, 0x93, 0x60, 0x56, 0x6d, + 0x88, 0x7d, 0xa8, 0xa, 0x2e, 0x1b, 0x24, 0xa, 0x3f, 0xad, 0x32, 0x7d, 0x93, + 0x2e, 0x97, 0x2e, 0x79, 0x80, 0x3c, 0x6d, 0xbb, 0x80, 0x2c, 0xa, 0x5f, 0xad, + 0x5b, 0x7d, 0x15, 0x2d, 0x1a, 0x3e, 0x14, 0x49, 0x31, 0x3a, 0x0, 0x7d, 0x29, + 0x9d, 0x25, 0x3e, 0x24, 0x49, 0x22, 0x3a, 0x0, 0x59, 0x21, 0x3a, 0x0, 0xa, + 0x5f, 0xad, 0x5b, 0x7d, 0x19, 0x9d, 0x15, 0x3e, 0x14, 0x59, 0x31, 0x3a, 0x0, + 0xb, 0xb4, 0xa, 0x1e, 0xbd, 0x1b, 0x38, 0xce, 0xb, 0xa4, 0xb, 0x94, 0xb, + 0x84, 0xa, 0x3f, 0xbd, 0x38, 0x38, 0xbe, 0xda, 0x79, 0x22, 0x3e, 0x34, 0x2e, + 0x34, 0x2e, 0x7f, 0xb, 0x38, 0xe0, 0x4d, 0xe2, 0x1b, 0x38, 0xe0, 0xb, 0xb4, + 0x22, 0x3e, 0x34, 0x2e, 0x34, 0x7, 0x4d, 0x7e, 0x24, 0x0, 0xff, 0xb, 0x1a, + 0xf0, 0x7d, 0x5f, 0x5e, 0x54, 0x0, 0xf, 0x7e, 0x24, 0x0, 0x1, 0x22, 0xca, + 0x3b, 0x12, 0xf0, 0x37, 0x60, 0xa, 0x7e, 0x97, 0x68, 0xaf, 0x7e, 0x87, 0x68, + 0xad, 0x80, 0x8, 0x7e, 0x97, 0x68, 0xad, 0x7e, 0x87, 0x68, 0xaf, 0x7d, 0xf8, + 0x2d, 0xf9, 0x7e, 0x8, 0x2f, 0xe9, 0x12, 0x4f, 0x71, 0x6d, 0xbb, 0x80, 0x38, + 0x12, 0x4f, 0x84, 0x60, 0x19, 0x7d, 0x5a, 0x12, 0x4d, 0x8c, 0x60, 0x5, 0x3e, + 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3a, 0x12, 0x4b, 0x9b, 0x3e, 0x34, 0x2e, + 0x34, 0x30, 0x17, 0x80, 0x17, 0x7d, 0x5a, 0x12, 0x4d, 0x8c, 0x60, 0x5, 0x3e, + 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3a, 0x12, 0x4b, 0x9b, 0x3e, 0x34, 0x2e, + 0x34, 0x2f, 0xe9, 0x12, 0x4d, 0x72, 0xbd, 0x9b, 0x38, 0xc4, 0x7d, 0xb9, + 0x80, 0x38, 0x12, 0x4f, 0x84, 0x60, 0x19, 0x7d, 0x5a, 0x12, 0x4d, 0x8c, + 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3a, 0x12, 0x4b, 0x9b, 0x3e, + 0x34, 0x2e, 0x34, 0x2f, 0xe9, 0x80, 0x17, 0x7d, 0x5a, 0x12, 0x4d, 0x8c, + 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3a, 0x12, 0x4b, 0x9b, 0x3e, + 0x34, 0x2e, 0x34, 0x30, 0x17, 0x12, 0x4d, 0x72, 0xbd, 0xfb, 0x38, 0xc4, + 0x6d, 0xbb, 0x7d, 0x3b, 0x7c, 0xb7, 0x7e, 0x14, 0x0, 0x1, 0x7d, 0x31, 0x60, + 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x7e, 0x53, 0x68, 0xaa, 0xa, 0x5, 0x5d, + 0x3, 0x68, 0x21, 0x7d, 0xb, 0x3e, 0x4, 0x49, 0xa0, 0x68, 0xb9, 0x7d, 0x5a, + 0x5e, 0x54, 0x0, 0xf, 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x12, 0x4f, + 0x58, 0x3e, 0x24, 0x2e, 0x24, 0x2f, 0xe9, 0x12, 0x4f, 0x4f, 0x12, 0x4f, + 0x41, 0x78, 0xbf, 0x7e, 0x37, 0x30, 0x23, 0x5e, 0x60, 0xdf, 0x7a, 0x37, + 0x30, 0x23, 0x7e, 0x37, 0x30, 0x1b, 0x5e, 0x70, 0xef, 0x7a, 0x37, 0x30, + 0x1b, 0x7e, 0x37, 0x30, 0x17, 0x5e, 0x70, 0xfe, 0x7a, 0x37, 0x30, 0x17, + 0x7e, 0x37, 0x2f, 0xe9, 0x5e, 0x70, 0xfe, 0x7a, 0x37, 0x2f, 0xe9, 0x7e, + 0x37, 0x2f, 0xed, 0x5e, 0x70, 0xef, 0x7a, 0x37, 0x2f, 0xed, 0x7e, 0x37, + 0x2f, 0xf5, 0x5e, 0x60, 0xdf, 0x7a, 0x37, 0x2f, 0xf5, 0x6d, 0x33, 0x7d, + 0xa3, 0x7d, 0xb3, 0x7e, 0x53, 0x3, 0xba, 0xa, 0x15, 0xbd, 0x1a, 0x28, 0x6, + 0xa, 0x25, 0x7d, 0xa2, 0x80, 0x0, 0x12, 0x4f, 0x41, 0x78, 0xeb, 0xbe, 0xa4, + 0x0, 0x5, 0x78, 0x3c, 0x7d, 0xb3, 0x7d, 0xab, 0x2e, 0xa4, 0x1, 0x24, 0x12, + 0x4f, 0x79, 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x12, 0x4f, 0x58, 0x3e, + 0x24, 0x2e, 0x24, 0x2f, 0xe9, 0x12, 0x4f, 0x4f, 0x12, 0x4f, 0x79, 0x60, 0x5, + 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x12, 0x4f, 0x58, 0x3e, 0x24, 0x2e, 0x24, + 0x30, 0x17, 0x12, 0x4f, 0x4f, 0xb, 0xb4, 0xbe, 0xb4, 0x0, 0x24, 0x78, 0xc6, + 0x6d, 0xbb, 0x7e, 0x74, 0x0, 0xee, 0xad, 0x7b, 0x2e, 0x74, 0x1, 0x1e, 0x7d, + 0x37, 0x7e, 0x8, 0x2f, 0xe9, 0x12, 0x40, 0xba, 0x7d, 0x37, 0x7e, 0x8, 0x30, + 0x17, 0x12, 0x40, 0x57, 0x12, 0x4f, 0x41, 0x40, 0xdf, 0xda, 0x3b, 0x22, 0xb, + 0xb4, 0xbe, 0xb4, 0x0, 0x4, 0x22, 0xb, 0xb4, 0xbe, 0xb4, 0x0, 0x5, 0x22, + 0xb, 0x28, 0x30, 0x4d, 0x31, 0x1b, 0x28, 0x30, 0x22, 0x7d, 0x2a, 0x1e, 0x24, + 0x1e, 0x24, 0x1e, 0x24, 0x1e, 0x24, 0x22, 0x12, 0xd7, 0xb0, 0x2, 0x49, 0xed, + 0x7e, 0x4, 0x0, 0xff, 0xb, 0xa, 0x10, 0x22, 0x7e, 0x34, 0x0, 0x5c, 0xe4, + 0x2, 0x0, 0x2e, 0x7d, 0x5a, 0x5e, 0x54, 0x0, 0xf, 0x7e, 0x14, 0x0, 0x1, + 0x22, 0x7d, 0xeb, 0x3e, 0xe4, 0x49, 0xae, 0x68, 0xc9, 0x90, 0x1, 0x90, 0xe4, + 0x93, 0x22, 0x2e, 0x7, 0x2e, 0x77, 0x3e, 0x4, 0x7e, 0x1f, 0x35, 0xa5, 0x2d, + 0x30, 0xb, 0x1a, 0x30, 0x7d, 0x21, 0x22, 0x7e, 0x63, 0x39, 0xb3, 0x7e, 0x70, + 0xee, 0xac, 0x67, 0x2e, 0x34, 0x1, 0x0, 0x2e, 0x34, 0x0, 0x1e, 0x22, 0x7a, + 0x73, 0x53, 0xee, 0x7e, 0x37, 0x68, 0x89, 0xe, 0x34, 0xe, 0x34, 0xe, 0x34, + 0xe, 0x34, 0xe, 0x34, 0x22, 0x7e, 0x34, 0xd, 0x18, 0x12, 0x32, 0xdf, 0x12, + 0x32, 0xce, 0x12, 0x4b, 0x68, 0x12, 0x4f, 0xb6, 0x7a, 0x73, 0x53, 0xef, + 0x22, 0x3e, 0x24, 0x7e, 0xf, 0x35, 0xa5, 0x2d, 0x12, 0x69, 0x30, 0x0, 0x1a, + 0x59, 0x32, 0x3a, 0x0, 0xa, 0x1f, 0xad, 0x1b, 0x7d, 0x1, 0x22, 0x7e, 0x34, + 0x0, 0x32, 0x2, 0x58, 0x3d, 0x7e, 0xb3, 0x39, 0xd4, 0xb4, 0x1, 0xe, 0x12, + 0x50, 0x70, 0x7e, 0x37, 0x39, 0xe4, 0x12, 0x50, 0x12, 0x7a, 0x73, 0x39, + 0xcf, 0x22, 0xe4, 0x12, 0x50, 0x1d, 0xa, 0x26, 0x7a, 0x53, 0x39, 0xce, 0x22, + 0xa9, 0xd6, 0xcb, 0x7e, 0x17, 0x56, 0xba, 0x59, 0x31, 0x0, 0x4, 0x7e, 0x37, + 0x56, 0xba, 0x59, 0x23, 0x0, 0xc, 0x12, 0x55, 0x23, 0x7e, 0x34, 0x0, 0x90, + 0x12, 0x54, 0x57, 0x49, 0x33, 0x0, 0x2c, 0xa9, 0xc6, 0xcb, 0x22, 0x7e, 0xb3, + 0x39, 0xd4, 0xb4, 0x4, 0xe, 0x12, 0x50, 0x70, 0x7e, 0x34, 0x3a, 0x0, 0x12, + 0x50, 0x12, 0x7a, 0x73, 0x39, 0xcf, 0x22, 0x7e, 0xb3, 0x39, 0xd4, 0xb4, 0x2, + 0x10, 0x12, 0x50, 0x70, 0x7e, 0x37, 0x39, 0xdc, 0x1e, 0x24, 0x12, 0x50, + 0x12, 0x7a, 0x73, 0x39, 0xcf, 0x22, 0x7e, 0x27, 0x74, 0xc, 0xb, 0x26, 0x22, + 0x12, 0x67, 0xc3, 0x7e, 0xb3, 0x56, 0xa7, 0xb4, 0x3, 0x2, 0x80, 0x2, 0x21, + 0x20, 0x74, 0x4, 0x12, 0x89, 0x32, 0x12, 0x46, 0xde, 0x12, 0x5a, 0x7a, 0x12, + 0x5a, 0xa4, 0x7e, 0xb3, 0x54, 0x60, 0x20, 0xe7, 0x7, 0x7e, 0xb3, 0x54, 0x71, + 0xb4, 0x1, 0x77, 0x12, 0x51, 0x2d, 0x68, 0x5, 0xc2, 0x2, 0x12, 0x46, 0xb8, + 0x12, 0x2f, 0xb2, 0x30, 0x10, 0xa, 0xc2, 0x10, 0xd2, 0x0, 0x12, 0x47, 0x7f, + 0x12, 0x46, 0x8f, 0x12, 0x51, 0x2d, 0x68, 0x5, 0x12, 0x97, 0x12, 0x80, 0xe, + 0x12, 0x93, 0xf9, 0x7e, 0xb3, 0x54, 0x8c, 0x7e, 0x73, 0x56, 0x27, 0x12, + 0x97, 0x32, 0x7e, 0xb3, 0x74, 0x9, 0xb4, 0x1, 0x29, 0x12, 0x97, 0xaa, 0x12, + 0xaf, 0xbf, 0x12, 0x9b, 0x18, 0x12, 0x34, 0xc, 0x7e, 0xb3, 0x54, 0x66, 0x70, + 0x17, 0x7e, 0xb3, 0x54, 0xbc, 0x70, 0x11, 0x7e, 0x1f, 0x2d, 0x2a, 0x7a, + 0x1d, 0x27, 0x7e, 0x1f, 0x2d, 0x2e, 0x7f, 0x1, 0xe4, 0x12, 0x9b, 0xce, 0x12, + 0x51, 0x35, 0x12, 0x51, 0x2d, 0x68, 0xd, 0x12, 0x4f, 0xfc, 0x7e, 0xb3, 0x54, + 0x60, 0x54, 0x7f, 0x7a, 0xb3, 0x54, 0x60, 0x12, 0x50, 0x58, 0x12, 0x77, + 0x7b, 0x1, 0x7a, 0xd2, 0x29, 0xd2, 0x2, 0x12, 0x46, 0xb8, 0x12, 0x0, 0xe, + 0x2, 0x34, 0x3, 0x7e, 0xb3, 0x54, 0x71, 0xbe, 0xb0, 0x1, 0x22, 0xca, 0x3b, + 0x7e, 0xd4, 0x3a, 0x0, 0x7e, 0xb3, 0x54, 0x71, 0xb4, 0x1, 0x2, 0x80, 0x2, + 0x61, 0xe2, 0x12, 0xf1, 0x1c, 0x7e, 0xb3, 0x39, 0xef, 0x60, 0x11, 0x7e, + 0xb3, 0x39, 0xf0, 0xbe, 0xb0, 0x2, 0x50, 0x3, 0x4, 0x61, 0xdc, 0xe4, 0x7a, + 0xb3, 0x39, 0xef, 0x7e, 0xc7, 0x39, 0xed, 0x4d, 0xcc, 0x78, 0x2f, 0x7d, + 0x1d, 0x6d, 0x0, 0x12, 0x91, 0x3, 0x7d, 0x1d, 0x2e, 0x14, 0x5, 0x20, 0x12, + 0x53, 0xfa, 0x12, 0x0, 0x2e, 0x7d, 0x1d, 0x2e, 0x14, 0xa, 0x40, 0x12, 0x53, + 0xfa, 0x74, 0x88, 0x12, 0x0, 0x2e, 0x7d, 0x1d, 0x2e, 0x14, 0xf, 0x60, 0x12, + 0x53, 0xfa, 0x74, 0x77, 0x12, 0x0, 0x2e, 0x7e, 0xf7, 0x39, 0xed, 0xb, 0xf4, + 0x7a, 0xf7, 0x39, 0xed, 0x7e, 0xb3, 0x54, 0x73, 0x4, 0x7a, 0xb3, 0x54, 0x73, + 0x7e, 0xd3, 0x68, 0xa7, 0x7e, 0xc3, 0x68, 0xa6, 0x7a, 0xd3, 0x2e, 0x78, + 0x7a, 0xc3, 0x2e, 0x77, 0xe4, 0x7a, 0xb3, 0x2e, 0x79, 0x12, 0x54, 0x1, 0x7e, + 0xf4, 0x0, 0xe0, 0x7a, 0xf7, 0x2e, 0x81, 0x7e, 0x1f, 0x2d, 0x2e, 0x7d, 0xf3, + 0x7a, 0xf7, 0x2e, 0x7b, 0x7e, 0x1f, 0x2d, 0x2e, 0x7d, 0xf3, 0x7a, 0xf7, + 0x2e, 0x7d, 0x7d, 0xfd, 0x12, 0x54, 0x1a, 0x12, 0x55, 0x2, 0x6d, 0xff, 0x7e, + 0xc7, 0x74, 0xc, 0x2d, 0xcf, 0x3e, 0xc4, 0x7e, 0x1f, 0x2d, 0x2e, 0x2d, 0x3c, + 0xb, 0x1a, 0x30, 0xad, 0x33, 0x2d, 0xcd, 0x1b, 0xc8, 0x30, 0x12, 0x53, 0xf3, + 0x78, 0xe3, 0x6d, 0xff, 0x7d, 0xcf, 0x3e, 0xc4, 0x2d, 0xcd, 0x49, 0xcc, 0x5, + 0x20, 0xbe, 0xc4, 0x27, 0x10, 0x28, 0x14, 0x7e, 0x73, 0x54, 0x73, 0xa, 0xc7, + 0x5e, 0xc4, 0x0, 0x1, 0x78, 0x8, 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xec, 0x80, + 0xd, 0xe4, 0x7a, 0xb3, 0x39, 0xec, 0xb, 0xf4, 0xbe, 0xf4, 0x2, 0x90, 0x40, + 0xcf, 0x7e, 0x73, 0x39, 0xec, 0x7a, 0x73, 0x2e, 0x79, 0x12, 0x54, 0x1, 0x7e, + 0xf4, 0x0, 0x10, 0x7a, 0xf7, 0x2e, 0x81, 0x7d, 0xfd, 0x2e, 0xf4, 0x5, 0x20, + 0x7a, 0xf7, 0x2e, 0x7b, 0x7d, 0xfd, 0x7a, 0xf7, 0x2e, 0x7d, 0x2e, 0xf4, 0x5, + 0x20, 0x12, 0x54, 0x1a, 0x12, 0x54, 0xe0, 0x6d, 0xff, 0x7e, 0x37, 0x74, 0xc, + 0x2d, 0x3f, 0x3e, 0x34, 0x7d, 0xc3, 0x2d, 0xcd, 0xb, 0xc8, 0x10, 0x2e, 0xc4, + 0x5, 0x20, 0xb, 0xc8, 0x20, 0x2d, 0x21, 0x1b, 0xc8, 0x20, 0x7e, 0xb3, 0x39, + 0xec, 0xb4, 0x1, 0xe, 0x2d, 0x3d, 0x2e, 0x34, 0x5, 0x20, 0xb, 0x38, 0xc0, + 0x1e, 0xc4, 0x1b, 0x38, 0xc0, 0x12, 0x53, 0xf3, 0x78, 0xcb, 0xb4, 0x1, 0xa, + 0x7e, 0x73, 0x54, 0x73, 0x1e, 0x70, 0x7a, 0x73, 0x54, 0x73, 0x6c, 0xee, + 0x80, 0x25, 0x6c, 0xff, 0x80, 0x1b, 0x12, 0x54, 0x30, 0x7d, 0xf3, 0x7d, + 0xcf, 0x12, 0x54, 0x41, 0x58, 0x4, 0x59, 0xe3, 0xa, 0x40, 0x12, 0x54, 0x11, + 0x8, 0x4, 0x59, 0xec, 0xf, 0x60, 0xb, 0xf0, 0xbc, 0xdf, 0x38, 0xe1, 0xb, + 0xe0, 0xbc, 0xce, 0x38, 0xd7, 0x6d, 0xff, 0x7e, 0xc7, 0x74, 0xc, 0x2d, 0xcf, + 0x12, 0x54, 0x41, 0x58, 0x4, 0x59, 0xe3, 0xa, 0x40, 0x12, 0x54, 0x11, 0x8, + 0x4, 0x59, 0xec, 0xf, 0x60, 0x12, 0x53, 0xf3, 0x78, 0xe3, 0x7e, 0xc7, 0x39, + 0xe8, 0xbe, 0xc7, 0x39, 0xed, 0x68, 0x2, 0x61, 0xf0, 0x6c, 0xee, 0x80, 0x57, + 0x6c, 0xff, 0x80, 0x4d, 0x12, 0x54, 0x30, 0x12, 0x54, 0x23, 0x8, 0x6, 0x49, + 0xc3, 0xf, 0x60, 0x80, 0x4, 0x6d, 0xcc, 0x9d, 0xc2, 0x12, 0x54, 0x8, 0x8, + 0x6, 0x49, 0x3, 0xa, 0x40, 0x80, 0x4, 0x6d, 0x0, 0x9d, 0x1, 0xbd, 0xc, 0x8, + 0x12, 0xbe, 0x14, 0x0, 0x0, 0x8, 0x6, 0x49, 0xc3, 0xa, 0x40, 0x80, 0x16, + 0x6d, 0xcc, 0x9d, 0xc1, 0x80, 0x10, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x6, 0x49, + 0xc3, 0xf, 0x60, 0x80, 0x4, 0x6d, 0xcc, 0x9d, 0xc2, 0x59, 0xc3, 0xa, 0x40, + 0xb, 0xf0, 0xbc, 0xdf, 0x38, 0xaf, 0xb, 0xe0, 0xbc, 0xce, 0x38, 0xa5, 0x6d, + 0xff, 0x7e, 0x37, 0x74, 0xc, 0x2d, 0x3f, 0x12, 0x54, 0x23, 0x8, 0x6, 0x49, + 0xc3, 0xf, 0x60, 0x80, 0x4, 0x6d, 0xcc, 0x9d, 0xc2, 0x12, 0x54, 0x8, 0x8, + 0x6, 0x49, 0x3, 0xa, 0x40, 0x80, 0x4, 0x6d, 0x0, 0x9d, 0x1, 0xbd, 0xc, 0x8, + 0x12, 0xbe, 0x14, 0x0, 0x0, 0x8, 0x6, 0x49, 0xc3, 0xa, 0x40, 0x80, 0x16, + 0x6d, 0xcc, 0x9d, 0xc1, 0x80, 0x10, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x6, 0x49, + 0xc3, 0xf, 0x60, 0x80, 0x4, 0x6d, 0xcc, 0x9d, 0xc2, 0x59, 0xc3, 0xa, 0x40, + 0x12, 0x53, 0xf3, 0x78, 0xad, 0x7d, 0xcd, 0x2e, 0xc4, 0x5, 0x20, 0x7a, 0xc7, + 0x39, 0xc4, 0x7d, 0x3d, 0x2e, 0x34, 0xa, 0x40, 0x7a, 0x37, 0x39, 0xe4, 0x74, + 0xaa, 0x7a, 0xb3, 0x54, 0x71, 0x6d, 0x33, 0x7a, 0x37, 0x39, 0xed, 0x74, 0x1, + 0x7a, 0xb3, 0x39, 0xef, 0xe4, 0x7a, 0xb3, 0x39, 0xf0, 0x80, 0xe, 0x7e, 0x37, + 0x39, 0xed, 0x4d, 0x33, 0x68, 0x6, 0x6d, 0x33, 0x7a, 0x37, 0x39, 0xed, 0xda, + 0x3b, 0x22, 0xb, 0xf4, 0xbe, 0xf4, 0x0, 0x4, 0x22, 0x6d, 0x0, 0x7e, 0x34, + 0x5, 0x20, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x2e, 0x7a, 0x22, 0x49, 0x13, 0xa, + 0x40, 0xbe, 0x14, 0x0, 0x0, 0x22, 0x2d, 0xcd, 0x49, 0x3c, 0xf, 0x60, 0xbd, + 0x3e, 0x22, 0x7a, 0xf7, 0x2e, 0x7f, 0x7e, 0x8, 0x2e, 0x77, 0x22, 0x3e, 0x34, + 0x2d, 0x3d, 0x49, 0x23, 0xf, 0x60, 0xbe, 0x24, 0x0, 0x0, 0x22, 0x7c, 0xbe, + 0x7c, 0x7f, 0x7c, 0xa7, 0x7e, 0x73, 0x68, 0xa7, 0xac, 0x7b, 0xa, 0x2a, 0x2d, + 0x32, 0x22, 0x3e, 0xc4, 0x7e, 0x1f, 0x2d, 0x2e, 0x2d, 0x3c, 0xb, 0x1a, 0xe0, + 0x7d, 0x3c, 0x2d, 0x3d, 0x49, 0x23, 0xa, 0x40, 0xbd, 0x2e, 0x22, 0x12, 0x54, + 0x5f, 0x7e, 0x37, 0x56, 0xba, 0x22, 0x7e, 0xa1, 0xcd, 0x75, 0xcd, 0x0, 0xc2, + 0xaf, 0x80, 0x2, 0xd2, 0xaf, 0x7e, 0xb3, 0x54, 0xc2, 0x20, 0xe2, 0xf7, 0x7d, + 0x13, 0x4e, 0x30, 0x1, 0x7e, 0x27, 0x56, 0xba, 0x12, 0x4f, 0x4f, 0x6c, 0x77, + 0x0, 0xb, 0x70, 0xa5, 0xbf, 0x8, 0xf9, 0xd2, 0xaf, 0x80, 0x35, 0x7e, 0x27, + 0x56, 0xba, 0xb, 0x28, 0x40, 0x7d, 0x14, 0x5e, 0x14, 0x0, 0x8, 0xbe, 0x14, + 0x0, 0x8, 0x78, 0x22, 0xc2, 0xaf, 0x80, 0x2, 0xd2, 0xaf, 0x7e, 0xb3, 0x54, + 0xc2, 0x20, 0xe2, 0xf7, 0x7d, 0x34, 0x4e, 0x70, 0x4, 0x1b, 0x28, 0x30, 0xd2, + 0x31, 0x6c, 0x77, 0x0, 0xb, 0x70, 0xa5, 0xbf, 0x8, 0xf9, 0xd2, 0xaf, 0x7e, + 0x27, 0x56, 0xba, 0x49, 0x12, 0x0, 0x38, 0x5e, 0x14, 0x80, 0x0, 0x68, 0xbd, + 0xb, 0x28, 0x30, 0x4e, 0x60, 0x40, 0x1b, 0x28, 0x30, 0x6d, 0x22, 0x12, 0x55, + 0x27, 0x7a, 0xa1, 0xcd, 0x22, 0xa9, 0xd6, 0xcb, 0xc2, 0x31, 0x12, 0x56, + 0x43, 0x12, 0x57, 0x77, 0x29, 0xb0, 0x0, 0x3, 0x54, 0x1, 0x12, 0x55, 0x23, + 0x2, 0x54, 0xf7, 0x69, 0x30, 0x0, 0xa, 0x12, 0x54, 0x5f, 0xa9, 0xc6, 0xcb, + 0x22, 0x12, 0x56, 0x40, 0x12, 0x57, 0x77, 0x29, 0xb0, 0x0, 0x3, 0x12, 0xf0, + 0xc3, 0x7e, 0x37, 0x56, 0xba, 0x1b, 0x38, 0x50, 0x7e, 0x34, 0x0, 0xe0, 0x2, + 0x54, 0xfb, 0x29, 0xb0, 0x0, 0x3, 0x54, 0x7, 0x7c, 0x4b, 0x6c, 0x55, 0x7e, + 0x37, 0x56, 0xba, 0x1b, 0x38, 0x20, 0x22, 0xa9, 0xd6, 0xcb, 0x69, 0x30, 0x0, + 0x2, 0x12, 0x57, 0xd1, 0x69, 0x30, 0x0, 0x4, 0x12, 0x57, 0xec, 0x12, 0x56, + 0x5f, 0x6d, 0x22, 0x12, 0x55, 0x27, 0x7e, 0x34, 0x0, 0x60, 0x2, 0x54, 0xfb, + 0xca, 0xf8, 0x7f, 0x70, 0x7e, 0x7b, 0xf0, 0x29, 0x77, 0x0, 0x1, 0xbc, 0x7f, + 0x28, 0x2, 0x7c, 0xf7, 0x69, 0x17, 0x0, 0x6, 0x6d, 0x0, 0x7e, 0x34, 0x0, + 0xf2, 0x74, 0xff, 0x12, 0x0, 0x2e, 0x7f, 0x7, 0x12, 0x55, 0x2f, 0xa9, 0xd6, + 0xcb, 0x6c, 0xaa, 0x80, 0x2d, 0x6c, 0x77, 0x80, 0x1f, 0x7e, 0x10, 0xb, 0xac, + 0x1a, 0xa, 0x17, 0x2d, 0x1, 0x3e, 0x4, 0x69, 0x17, 0x0, 0x6, 0x2d, 0x10, + 0x6d, 0x0, 0xb, 0xa, 0x20, 0x6e, 0x24, 0xff, 0xff, 0x1b, 0xa, 0x20, 0xb, + 0x70, 0x29, 0x67, 0x0, 0x1, 0xbc, 0x67, 0x38, 0xd9, 0xb, 0xa0, 0x7e, 0x7b, + 0x60, 0xbc, 0x6a, 0x38, 0xcc, 0x69, 0x37, 0x0, 0x6, 0x12, 0x57, 0xd1, 0x7c, + 0x4f, 0x6c, 0x55, 0xa, 0x3f, 0x12, 0x56, 0x74, 0x6d, 0x22, 0x12, 0x55, 0x27, + 0x7e, 0x34, 0x0, 0xd0, 0x12, 0x54, 0x5f, 0x6c, 0xaa, 0xbe, 0xa0, 0x4, 0x50, + 0x15, 0x7e, 0x70, 0x4, 0xac, 0x7a, 0x12, 0x56, 0x39, 0x49, 0x44, 0x0, 0x26, + 0x60, 0x34, 0x1e, 0x44, 0x14, 0x78, 0xfb, 0x80, 0x2d, 0xbe, 0xa0, 0x8, 0x50, + 0x14, 0xa, 0x3a, 0x1b, 0x36, 0x12, 0x56, 0x35, 0x49, 0x44, 0x0, 0x28, 0x60, + 0x1b, 0x1e, 0x44, 0x14, 0x78, 0xfb, 0x80, 0x14, 0xa, 0x3a, 0x9e, 0x34, 0x0, + 0x8, 0x12, 0x56, 0x35, 0x49, 0x44, 0x0, 0x2a, 0x60, 0x5, 0x1e, 0x44, 0x14, + 0x78, 0xfb, 0x5e, 0x44, 0x0, 0xf, 0x7e, 0x50, 0x2, 0xac, 0x5a, 0x69, 0x37, + 0x0, 0x6, 0x2d, 0x32, 0x6d, 0x22, 0x1b, 0x1a, 0x40, 0xb, 0xa0, 0xbe, 0xa0, + 0xb, 0x40, 0x9e, 0xa9, 0xc6, 0xcb, 0xda, 0xf8, 0x22, 0x3e, 0x34, 0x3e, 0x34, + 0x7c, 0xb7, 0x7e, 0x47, 0x56, 0xba, 0x22, 0xa9, 0xd6, 0xcb, 0x69, 0x30, 0x0, + 0x4, 0x7e, 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, 0x4, 0x69, 0x30, 0x0, 0x6, + 0x7e, 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, 0x6, 0x69, 0x30, 0x0, 0x8, 0x7e, + 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, 0x8, 0x7e, 0xb, 0x70, 0x7c, 0x47, 0x6c, + 0x55, 0x29, 0x70, 0x0, 0x1, 0xa, 0x37, 0x2d, 0x32, 0x7e, 0x27, 0x56, 0xba, + 0x59, 0x32, 0x0, 0xc, 0x22, 0x7f, 0x71, 0x12, 0xee, 0x4b, 0x12, 0xf0, 0x60, + 0x12, 0x56, 0x74, 0x7c, 0x4b, 0x6c, 0x55, 0xe5, 0x27, 0xa, 0x3b, 0x4d, 0x32, + 0x12, 0x57, 0xe3, 0x29, 0x77, 0x0, 0x2, 0xa, 0x37, 0x12, 0xf0, 0xd8, 0x7e, + 0x7b, 0x40, 0x6c, 0x55, 0x4d, 0x23, 0x29, 0x77, 0x0, 0x4, 0x7c, 0x64, 0x4c, + 0x75, 0x12, 0x57, 0x7d, 0x29, 0x77, 0x0, 0x1, 0x7c, 0x47, 0x29, 0x77, 0x0, + 0x3, 0x7c, 0x64, 0x12, 0x57, 0xda, 0x12, 0x72, 0x28, 0x12, 0xf1, 0x27, 0x6d, + 0x22, 0x12, 0x55, 0x27, 0x7e, 0x34, 0x0, 0x30, 0x2, 0x54, 0xfb, 0x7f, 0x71, + 0x12, 0x77, 0xc8, 0x12, 0x57, 0xd1, 0x69, 0x30, 0x0, 0x8, 0x12, 0x57, 0xec, + 0x12, 0xee, 0x6a, 0x29, 0x70, 0x0, 0x1, 0x7c, 0x47, 0x6c, 0x55, 0x7e, 0xb, + 0x70, 0x12, 0x56, 0x72, 0x29, 0x70, 0x0, 0x2, 0xa, 0x37, 0x1b, 0x34, 0x12, + 0x57, 0xda, 0x69, 0x30, 0x0, 0xa, 0x12, 0x57, 0x7d, 0x69, 0x30, 0x0, 0xc, + 0x12, 0x57, 0xe3, 0x69, 0x30, 0x0, 0xe, 0x7e, 0x27, 0x56, 0xba, 0x59, 0x32, + 0x0, 0x12, 0x69, 0x30, 0x0, 0x10, 0x7e, 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, + 0x30, 0x29, 0x70, 0x0, 0x3, 0x7c, 0x47, 0x12, 0x55, 0x25, 0x7e, 0x34, 0x0, + 0xa0, 0x12, 0x54, 0x57, 0x49, 0x23, 0x0, 0x1a, 0x7a, 0x7b, 0x50, 0x49, 0x23, + 0x0, 0x1c, 0x39, 0x57, 0x0, 0x1, 0x49, 0x23, 0x0, 0x16, 0x79, 0x27, 0x0, + 0x2, 0x49, 0x23, 0x0, 0x18, 0x79, 0x27, 0x0, 0x4, 0x49, 0x23, 0x0, 0x22, + 0x79, 0x27, 0x0, 0x6, 0x49, 0x23, 0x0, 0x24, 0x79, 0x27, 0x0, 0x8, 0x49, + 0x23, 0x0, 0x1e, 0x79, 0x27, 0x0, 0xa, 0x49, 0x33, 0x0, 0x20, 0x79, 0x37, + 0x0, 0xc, 0xa9, 0xc6, 0xcb, 0x22, 0x29, 0x70, 0x0, 0x2, 0xa, 0x37, 0x7e, + 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, 0xe, 0x22, 0xa9, 0xd6, 0xcb, 0x69, 0x20, + 0x0, 0x4, 0x7e, 0x57, 0x56, 0xba, 0x59, 0x25, 0x0, 0x4, 0x69, 0x20, 0x0, + 0x8, 0x7e, 0x57, 0x56, 0xba, 0x59, 0x25, 0x0, 0x8, 0x7e, 0xb, 0x50, 0xa, + 0x55, 0x7c, 0xab, 0xe4, 0x29, 0x50, 0x0, 0x1, 0xa, 0x25, 0x2d, 0x25, 0x7e, + 0x57, 0x56, 0xba, 0x59, 0x25, 0x0, 0xc, 0x29, 0x50, 0x0, 0x2, 0xa, 0x25, + 0x12, 0xc0, 0xaf, 0x12, 0x57, 0xda, 0x6d, 0x22, 0x12, 0x55, 0x27, 0x7e, + 0x34, 0x0, 0x40, 0x2, 0x54, 0xfb, 0x7e, 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, + 0x4, 0x22, 0x7e, 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, 0xa, 0x22, 0x7e, 0x27, + 0x56, 0xba, 0x59, 0x32, 0x0, 0x10, 0x22, 0x7e, 0x27, 0x56, 0xba, 0x59, 0x32, + 0x0, 0x6, 0x69, 0x30, 0x0, 0x6, 0x22, 0x7e, 0xa3, 0x54, 0x64, 0xbe, 0xa0, + 0x5, 0x78, 0xd, 0x74, 0x1, 0x7a, 0xb3, 0x54, 0x64, 0x74, 0x2, 0x7a, 0xb3, + 0x54, 0x64, 0x22, 0xbe, 0xa0, 0x4, 0x78, 0x20, 0x74, 0x1, 0x7a, 0xb3, 0x54, + 0x64, 0x7e, 0x34, 0xd, 0x14, 0x12, 0x32, 0xdf, 0x12, 0x2d, 0xb1, 0x12, 0x5a, + 0x7a, 0x74, 0x2, 0x7a, 0xb3, 0x54, 0x64, 0x7e, 0x34, 0x0, 0xc8, 0x2, 0x58, + 0x3d, 0x22, 0xe4, 0x12, 0x47, 0xd1, 0x7e, 0x34, 0x0, 0x46, 0x7d, 0x3, 0x80, + 0x14, 0x7e, 0xa0, 0x4, 0x80, 0x7, 0x7e, 0x34, 0x0, 0xfa, 0x12, 0x5e, 0x1b, + 0x7c, 0x7a, 0x1b, 0xa0, 0xa5, 0xbf, 0x0, 0xf1, 0x7d, 0x10, 0x1b, 0x4, 0x4d, + 0x11, 0x78, 0xe4, 0x22, 0x24, 0xab, 0x68, 0x10, 0x24, 0xef, 0x68, 0x20, + 0x24, 0xde, 0x68, 0x2e, 0x24, 0xde, 0x78, 0x3b, 0x74, 0x5, 0x80, 0x39, 0x7e, + 0xb3, 0x56, 0xbc, 0xb4, 0x5, 0x36, 0x7e, 0x34, 0x0, 0x1, 0x12, 0x58, 0x3d, + 0x12, 0xdf, 0x80, 0x2, 0xe1, 0xc2, 0x7e, 0xb3, 0x56, 0xbc, 0xb4, 0x5, 0x22, + 0x7e, 0x34, 0x0, 0x1, 0x12, 0x58, 0x3d, 0x75, 0xe9, 0xff, 0x22, 0x7e, 0xb3, + 0x56, 0xbc, 0xb4, 0x5, 0x10, 0x7e, 0x34, 0x0, 0x1, 0x12, 0x58, 0x3d, 0x2, + 0x0, 0xf, 0x74, 0x1, 0x7a, 0xb3, 0x56, 0xbc, 0x22, 0xc2, 0x0, 0x12, 0x5f, + 0x78, 0x68, 0x66, 0x7e, 0x73, 0x56, 0xc0, 0xbe, 0x70, 0xa0, 0x40, 0x5d, + 0xe4, 0x7a, 0xb3, 0x56, 0xc0, 0xc2, 0x0, 0x7e, 0x34, 0xa, 0x0, 0x12, 0x59, + 0x1e, 0x7a, 0xb3, 0x2e, 0x77, 0x7e, 0x34, 0xb, 0x0, 0x12, 0x59, 0x1e, 0x7a, + 0xb3, 0x2e, 0x78, 0x7e, 0x34, 0xd, 0x0, 0x12, 0x59, 0x1e, 0x7a, 0xb3, 0x2e, + 0x79, 0x7e, 0xb3, 0x2e, 0x77, 0xb4, 0x9c, 0xc, 0x7e, 0xb3, 0x2e, 0x78, 0x70, + 0x6, 0x7e, 0xb3, 0x2e, 0x79, 0x60, 0x2, 0xd2, 0x0, 0x30, 0x0, 0x1d, 0x7e, + 0x34, 0x20, 0x0, 0xe4, 0x12, 0x47, 0xd1, 0x7e, 0x34, 0x38, 0x0, 0xe4, 0x12, + 0x47, 0xd1, 0xa9, 0xc5, 0x94, 0x7e, 0x34, 0x0, 0x2, 0x12, 0x58, 0x3d, 0xa9, + 0xd5, 0x94, 0x22, 0x12, 0xef, 0x78, 0x6d, 0x33, 0x7e, 0xf, 0x56, 0xad, 0x79, + 0x30, 0x0, 0xa, 0x12, 0xee, 0x9f, 0x80, 0xa, 0x12, 0xef, 0xf2, 0x68, 0x5, + 0x12, 0xf0, 0x89, 0x80, 0x5, 0x12, 0xf0, 0x90, 0x68, 0xf1, 0x12, 0xef, 0x6b, + 0x12, 0xef, 0x51, 0x78, 0xfb, 0x69, 0x50, 0x0, 0xa, 0x2, 0x47, 0xfd, 0xca, + 0x3b, 0x12, 0x77, 0xc1, 0x12, 0xf1, 0xc0, 0x12, 0x90, 0xff, 0x7e, 0x34, + 0xf3, 0xb3, 0x12, 0x59, 0x1e, 0xf5, 0x10, 0xbe, 0xb0, 0x1, 0x50, 0xf, 0x7e, + 0x34, 0xc5, 0xac, 0x12, 0x59, 0x1e, 0xf5, 0x11, 0x7e, 0x34, 0xc5, 0xac, + 0x80, 0xd, 0x7e, 0x34, 0xf4, 0xa2, 0x12, 0x59, 0x1e, 0xf5, 0x11, 0x7e, 0x34, + 0xf4, 0xa2, 0x7e, 0xb3, 0x54, 0xab, 0x12, 0x47, 0xd1, 0xe5, 0x11, 0x7a, + 0xb3, 0x54, 0xaa, 0x12, 0xf2, 0x81, 0x9, 0x75, 0x3, 0xb0, 0x7e, 0xf0, 0xee, + 0xac, 0xf7, 0x2e, 0x74, 0x1, 0x0, 0x12, 0x5a, 0x6e, 0x12, 0x3f, 0x29, 0x7d, + 0x63, 0x7a, 0x65, 0x27, 0x7e, 0x8, 0x0, 0x27, 0x74, 0x3, 0x6c, 0x77, 0x12, + 0x6b, 0x3f, 0x12, 0x5a, 0x73, 0x7e, 0x25, 0x27, 0x12, 0x3f, 0x10, 0x12, + 0x5a, 0x73, 0x12, 0x3f, 0x29, 0x7a, 0x35, 0x27, 0x12, 0x4f, 0xf5, 0x12, + 0x2d, 0xb4, 0x12, 0x5a, 0x7a, 0xd2, 0x2, 0x12, 0x46, 0xb8, 0xe5, 0x10, 0xbe, + 0xb0, 0x1, 0x50, 0x6, 0x7e, 0x34, 0xc5, 0xac, 0x80, 0x4, 0x7e, 0x34, 0xf4, + 0xa2, 0x7e, 0xb3, 0x54, 0xac, 0x12, 0x47, 0xd1, 0x12, 0x4f, 0xf5, 0x12, + 0x46, 0xb3, 0x12, 0x97, 0xd8, 0x7a, 0x1f, 0x2d, 0x2a, 0x7e, 0xf, 0x2d, 0x26, + 0x7e, 0xa3, 0x56, 0x28, 0x74, 0x3, 0xa4, 0x9, 0xb5, 0x3, 0xe2, 0x12, 0x93, + 0x11, 0x12, 0xe3, 0x43, 0x6d, 0x33, 0x80, 0x22, 0x7d, 0x13, 0x3e, 0x14, + 0x7e, 0x2f, 0x2d, 0x2e, 0x2d, 0x51, 0xb, 0x2a, 0x0, 0xbe, 0x4, 0x0, 0x0, + 0x8, 0x5, 0xb, 0x2a, 0x20, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x20, 0x59, 0x21, + 0x3a, 0x0, 0xb, 0x34, 0x7e, 0x27, 0x74, 0xc, 0xbd, 0x23, 0x38, 0xd6, 0x12, + 0x5a, 0x6e, 0x7d, 0x26, 0x12, 0x3f, 0x10, 0x12, 0x5a, 0x73, 0x12, 0x3f, + 0x29, 0x7a, 0x35, 0x27, 0xe5, 0x10, 0xbe, 0xb0, 0x1, 0x50, 0x6, 0x7e, 0x34, + 0xc5, 0xac, 0x80, 0x4, 0x7e, 0x34, 0xf4, 0xa2, 0xe5, 0x11, 0x12, 0x47, 0xd1, + 0x74, 0xaa, 0x7a, 0xb3, 0x54, 0xa9, 0xda, 0x3b, 0x22, 0x74, 0x3, 0x12, 0x3f, + 0xc8, 0x7d, 0x37, 0x2e, 0x34, 0x0, 0x9, 0x22, 0x12, 0x2f, 0xb2, 0x7e, 0xb3, + 0x74, 0xa, 0x60, 0xd, 0x80, 0x6, 0x12, 0x5a, 0xa4, 0x12, 0x2f, 0xb2, 0x12, + 0x7a, 0x4a, 0x50, 0xf5, 0x7e, 0xb3, 0x74, 0xb, 0x60, 0xd, 0x80, 0x6, 0x12, + 0x5a, 0xa4, 0x12, 0x2f, 0xb2, 0x12, 0x7a, 0xba, 0x50, 0xf5, 0x22, 0x7e, + 0x34, 0x9, 0xc4, 0x6d, 0x22, 0x7a, 0x27, 0x56, 0xa3, 0x7a, 0x37, 0x56, 0xa5, + 0x22, 0x7e, 0x34, 0xd, 0x14, 0x12, 0x32, 0xdf, 0x12, 0x5a, 0xa8, 0x12, 0x71, + 0x23, 0x12, 0x87, 0xc3, 0x12, 0x5f, 0xe6, 0x68, 0x1a, 0x7f, 0x20, 0x12, + 0x5a, 0xf2, 0x4e, 0x60, 0x2, 0x1b, 0x2a, 0x30, 0x7e, 0x2f, 0x39, 0xfc, 0x12, + 0x5a, 0xf2, 0x5e, 0x70, 0xfd, 0x1b, 0x2a, 0x30, 0x80, 0x6, 0x12, 0x5a, 0xfa, + 0x12, 0x2f, 0xab, 0x12, 0xf1, 0x11, 0x7e, 0x34, 0xd, 0xac, 0x2, 0x2d, 0xb1, + 0x2e, 0x54, 0x0, 0xe, 0xb, 0x2a, 0x30, 0x22, 0x2e, 0x14, 0x0, 0xe, 0xb, 0xa, + 0x30, 0x5e, 0x60, 0xfd, 0x1b, 0xa, 0x30, 0x7e, 0xf, 0x39, 0xfc, 0x2e, 0x14, + 0x0, 0xe, 0xb, 0xa, 0x30, 0x22, 0xca, 0xb8, 0xca, 0x1b, 0xca, 0xb, 0x12, + 0x2f, 0x9c, 0x5e, 0x34, 0x80, 0x0, 0x68, 0x1c, 0xb, 0xa, 0x30, 0x5e, 0x34, + 0x80, 0x0, 0x68, 0x13, 0x12, 0x5b, 0xb, 0x6e, 0x70, 0x40, 0x1b, 0xa, 0x30, + 0x7e, 0x34, 0x80, 0x0, 0x12, 0x5b, 0x91, 0x12, 0x5f, 0x85, 0x12, 0x2f, 0x9c, + 0x5e, 0x34, 0x0, 0x2, 0x68, 0x19, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0x2, + 0x68, 0x10, 0x12, 0x5a, 0xfa, 0x12, 0x2f, 0xab, 0x7e, 0x34, 0x0, 0x2, 0x12, + 0x5b, 0x91, 0x12, 0x5f, 0x85, 0x12, 0x2f, 0x9c, 0x5e, 0x34, 0x0, 0x1, 0x68, + 0x1f, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0x1, 0x68, 0x16, 0x12, 0x5b, 0xb, + 0x4e, 0x60, 0x2, 0x12, 0x5b, 0x4, 0x12, 0x5f, 0xf3, 0x7e, 0x34, 0x0, 0x1, + 0x12, 0x5b, 0x91, 0x12, 0xde, 0xed, 0xc2, 0xc1, 0xda, 0xb, 0xda, 0x1b, 0xda, + 0xb8, 0x32, 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x2, 0x22, 0x12, 0x5f, + 0x78, 0x68, 0x25, 0x7e, 0xb3, 0x55, 0xf8, 0xb4, 0x1, 0x5, 0x12, 0x5d, 0xfa, + 0x80, 0x3, 0x12, 0x5d, 0xe0, 0x12, 0x5b, 0x7, 0x4e, 0x60, 0x2, 0x12, 0x5b, + 0x4, 0x12, 0x5f, 0xf3, 0x12, 0x5f, 0x69, 0xe4, 0x7a, 0xb3, 0x56, 0x93, 0x80, + 0x2e, 0x12, 0x0, 0x40, 0xe4, 0x12, 0x5f, 0x6b, 0x7e, 0xf, 0x39, 0xfc, 0x2e, + 0x14, 0x0, 0xa, 0x12, 0xf0, 0xd1, 0x1b, 0xa, 0x30, 0x7a, 0xb3, 0x55, 0xf7, + 0x7a, 0xb3, 0x54, 0x13, 0x7a, 0xb3, 0x56, 0x93, 0x7e, 0xf, 0x39, 0xfc, 0x12, + 0x5a, 0xfa, 0x12, 0x2f, 0xab, 0x12, 0x5e, 0x56, 0x12, 0x92, 0x35, 0x7e, + 0xb3, 0x56, 0x28, 0x2, 0x79, 0x0, 0x7c, 0xab, 0xd2, 0x9, 0x12, 0xe2, 0x4a, + 0x1b, 0xa0, 0x68, 0x45, 0x1b, 0xa0, 0x68, 0x5d, 0x1b, 0xa0, 0x78, 0x2, 0x81, + 0xc2, 0x1b, 0xa0, 0x68, 0x70, 0xb, 0xa2, 0x68, 0x2, 0x81, 0xe0, 0xd2, 0xa, + 0x12, 0x5e, 0x72, 0x7e, 0x34, 0x54, 0xc7, 0x12, 0x5d, 0x42, 0x12, 0xf1, + 0x5d, 0x7e, 0xf, 0x39, 0xfc, 0x2e, 0x14, 0x0, 0x10, 0xb, 0xa, 0x30, 0x4e, + 0x70, 0x10, 0x1b, 0xa, 0x30, 0x12, 0x6d, 0x9f, 0x12, 0x5b, 0x7, 0x4e, 0x70, + 0x10, 0x1b, 0xa, 0x30, 0x12, 0x5e, 0x17, 0x80, 0x71, 0xd2, 0xa, 0x12, 0x5d, + 0xc8, 0x7e, 0x34, 0x54, 0xd2, 0x12, 0x5d, 0x42, 0x12, 0x5d, 0x62, 0xd2, + 0x26, 0xd2, 0x25, 0xb4, 0x1, 0x4, 0x74, 0x1, 0x80, 0x6f, 0x80, 0x55, 0x12, + 0x5f, 0x78, 0x78, 0x7, 0xd2, 0xa, 0x12, 0x5e, 0x72, 0x80, 0x5, 0xd2, 0xa, + 0x12, 0x5d, 0xc8, 0x7e, 0x34, 0x54, 0xdd, 0x12, 0x5d, 0x42, 0x12, 0xf1, + 0x5d, 0x80, 0x38, 0x7e, 0x34, 0x0, 0xb, 0xca, 0x39, 0x7e, 0x63, 0x56, 0x28, + 0xac, 0x67, 0x2e, 0x34, 0x54, 0xc7, 0x6d, 0x22, 0x7e, 0x8, 0x34, 0x17, 0x12, + 0x2b, 0x7, 0x1b, 0xfd, 0x7e, 0x34, 0x0, 0x1, 0x7a, 0x37, 0x34, 0x17, 0x7e, + 0x34, 0x34, 0x17, 0x12, 0x5d, 0x42, 0x12, 0x5d, 0x62, 0xd2, 0x26, 0xd2, + 0x25, 0xb4, 0x1, 0x4, 0x74, 0x4, 0x80, 0x18, 0x12, 0x2f, 0xa5, 0x80, 0x20, + 0x7e, 0x34, 0x54, 0xe8, 0x12, 0x5d, 0x42, 0x12, 0x5d, 0x62, 0xb4, 0x1, 0xc, + 0xd2, 0x26, 0xd2, 0x25, 0x74, 0x3, 0x7a, 0xb3, 0x55, 0xfb, 0x80, 0x7, 0x12, + 0xde, 0xfb, 0x80, 0x2, 0xc2, 0x9, 0xa2, 0x9, 0x22, 0x12, 0xef, 0x9e, 0x12, + 0x5f, 0x18, 0x5e, 0x60, 0x7f, 0x1b, 0xa, 0x30, 0xe5, 0x5b, 0x54, 0x1f, 0xa, + 0x2b, 0x12, 0x5d, 0x51, 0xe5, 0x5c, 0x54, 0x1, 0xa, 0x2b, 0x12, 0x5d, 0x6d, + 0x12, 0x5d, 0x51, 0xe5, 0x5d, 0x54, 0x3, 0xa, 0x2b, 0x12, 0x5d, 0x6d, 0x3e, + 0x24, 0x12, 0x5d, 0x51, 0x7e, 0x35, 0x59, 0xbe, 0x34, 0x0, 0x2, 0x78, 0x24, + 0x12, 0x5f, 0x18, 0x4e, 0x60, 0x80, 0x1b, 0xa, 0x30, 0xe5, 0x5e, 0x54, 0x1f, + 0x7c, 0x4b, 0x6c, 0x55, 0x12, 0x5d, 0x51, 0xe5, 0x5f, 0x12, 0xf0, 0xc3, + 0x12, 0x6b, 0xb8, 0xe5, 0x60, 0x12, 0x6f, 0xe2, 0x12, 0x6b, 0xb8, 0x22, + 0x7e, 0x14, 0x0, 0x59, 0x74, 0xb, 0x12, 0x2a, 0xc1, 0x12, 0x5c, 0xe5, 0x74, + 0x1, 0x22, 0x7e, 0xf, 0x39, 0xfc, 0x2e, 0x14, 0x0, 0x12, 0xb, 0xa, 0x30, + 0x4d, 0x32, 0x1b, 0xa, 0x30, 0x22, 0x7a, 0xb3, 0x54, 0xf6, 0x7e, 0xb3, 0x55, + 0xf8, 0x22, 0xa, 0x25, 0x3e, 0x24, 0x3e, 0x24, 0x3e, 0x24, 0x3e, 0x24, 0x3e, + 0x24, 0x22, 0x7e, 0x34, 0x53, 0xee, 0x30, 0x1d, 0x40, 0xc2, 0x1d, 0x7e, + 0x39, 0x50, 0x12, 0x5d, 0x6b, 0x7a, 0x27, 0x68, 0x87, 0x9, 0x53, 0x0, 0x1, + 0x12, 0x5d, 0x6b, 0x7a, 0x27, 0x68, 0x89, 0x9, 0x53, 0x0, 0x2, 0x12, 0x5d, + 0x6b, 0x7a, 0x27, 0x68, 0x8d, 0x9, 0x53, 0x0, 0x3, 0x12, 0x5d, 0x6b, 0x7a, + 0x27, 0x68, 0x8f, 0x9, 0x53, 0x0, 0x5, 0x12, 0x5d, 0x6b, 0x7a, 0x27, 0x68, + 0x97, 0x9, 0x73, 0x0, 0x40, 0x7a, 0x73, 0x68, 0x9d, 0x7e, 0x37, 0x68, 0x87, + 0x7a, 0x37, 0x54, 0x5e, 0x22, 0x12, 0x5e, 0xbf, 0x12, 0xf1, 0x81, 0x12, + 0x5f, 0xc8, 0x12, 0xf1, 0x78, 0x12, 0x5f, 0xc8, 0x12, 0x3f, 0xe4, 0x12, + 0xef, 0x8e, 0x2, 0x39, 0xab, 0x12, 0x5f, 0xe6, 0x78, 0x6, 0xe4, 0x7a, 0xb3, + 0x56, 0x28, 0x22, 0x12, 0x5b, 0xb, 0x12, 0x97, 0x67, 0x12, 0x5f, 0x24, 0x12, + 0x5e, 0x36, 0x2, 0x5e, 0x1b, 0x12, 0x5f, 0xe6, 0x78, 0x6, 0xe4, 0x7a, 0xb3, + 0x56, 0x28, 0x22, 0x12, 0x5b, 0xb, 0x5e, 0x70, 0xfb, 0x1b, 0xa, 0x30, 0x12, + 0x5f, 0xd9, 0x12, 0x5e, 0x36, 0x2, 0x5e, 0x1b, 0x7e, 0x34, 0x0, 0x64, 0x80, + 0x10, 0x7e, 0x24, 0x0, 0x2, 0x80, 0x1, 0x0, 0x7d, 0x12, 0x1b, 0x24, 0x4d, + 0x11, 0x78, 0xf7, 0x0, 0x7d, 0x13, 0x1b, 0x34, 0x4d, 0x11, 0x78, 0xe8, 0x22, + 0xd2, 0x1, 0x12, 0x5e, 0x45, 0xd2, 0xa, 0x12, 0x5d, 0xc8, 0x7e, 0x34, 0x0, + 0xa, 0x22, 0xa2, 0x1, 0x92, 0x2, 0x7e, 0x8, 0x34, 0x51, 0x12, 0xed, 0x9c, + 0x12, 0xef, 0x95, 0x2, 0x39, 0xab, 0x12, 0x5b, 0x7, 0x5e, 0x60, 0x7f, 0x12, + 0x5f, 0x15, 0x12, 0x5f, 0x3a, 0x5e, 0x70, 0xf, 0x1b, 0xa, 0x30, 0xc2, 0x1, + 0x12, 0x5e, 0x45, 0xd2, 0xa, 0x2, 0x5e, 0x72, 0x12, 0x5e, 0xbf, 0xa2, 0xa, + 0x92, 0xb, 0x12, 0xf1, 0x81, 0x12, 0x5f, 0x8e, 0xa2, 0xa, 0x92, 0xb, 0x12, + 0xf1, 0x78, 0x12, 0x5f, 0x8e, 0x12, 0x3f, 0xe4, 0x12, 0xef, 0x8e, 0x2, 0x39, + 0xab, 0x12, 0x7f, 0x9f, 0x12, 0xde, 0x9a, 0x12, 0x5d, 0xe0, 0xc2, 0x1, 0x12, + 0x5e, 0x45, 0x12, 0xf2, 0x62, 0x12, 0x71, 0x15, 0xa9, 0xd7, 0xeb, 0x12, + 0xde, 0x93, 0x74, 0x1, 0x7e, 0x70, 0x82, 0x12, 0xde, 0x3f, 0xa9, 0xc7, 0xeb, + 0xd2, 0x0, 0x12, 0x71, 0x15, 0x2, 0x5b, 0x9a, 0xa2, 0xa, 0x92, 0xb, 0xa2, + 0x15, 0x30, 0xb, 0x1, 0xb3, 0x50, 0x46, 0xa2, 0xb, 0x92, 0x15, 0x30, 0xb, + 0x2a, 0xa9, 0xd5, 0xc3, 0xa9, 0xd4, 0xc3, 0xa9, 0xd3, 0xc7, 0x7e, 0x34, 0x0, + 0x60, 0x12, 0x5e, 0x1b, 0xa9, 0xd4, 0xc7, 0xa9, 0xd5, 0xc7, 0x7e, 0x34, 0x0, + 0x80, 0x12, 0x5e, 0x1b, 0xa9, 0xd7, 0xc3, 0xa9, 0xd6, 0xc3, 0x7e, 0x34, 0x1, + 0xa0, 0x2, 0x5e, 0x1b, 0xa9, 0xc7, 0xc3, 0xa9, 0xc6, 0xc3, 0xa9, 0xc4, 0xc7, + 0xa9, 0xc5, 0xc7, 0xa9, 0xc5, 0xc3, 0xa9, 0xc4, 0xc3, 0xa9, 0xc3, 0xc7, + 0x22, 0x4e, 0x60, 0x80, 0x1b, 0xa, 0x30, 0x7e, 0xf, 0x39, 0xfc, 0x2e, 0x14, + 0x0, 0x14, 0xb, 0xa, 0x30, 0x22, 0x12, 0x5b, 0x7, 0x12, 0x5f, 0x12, 0x12, + 0x5f, 0x3a, 0x4e, 0x70, 0x10, 0x12, 0x5f, 0x3d, 0x5e, 0x70, 0xdf, 0x1b, 0xa, + 0x30, 0x22, 0x5e, 0x70, 0xfe, 0x1b, 0xa, 0x30, 0x7e, 0xf, 0x39, 0xfc, 0x2e, + 0x14, 0x0, 0x26, 0xb, 0xa, 0x30, 0x22, 0x12, 0x5f, 0x78, 0x68, 0x11, 0x7e, + 0xb3, 0x55, 0xf8, 0x70, 0x5, 0x12, 0x5d, 0xe0, 0x80, 0x3, 0x12, 0x5d, 0xfa, + 0x2, 0x5f, 0x69, 0xe4, 0x12, 0x5f, 0x6b, 0x2, 0x5e, 0x56, 0x74, 0x1, 0x7a, + 0xb3, 0x56, 0x28, 0x7a, 0xb3, 0x56, 0x21, 0x22, 0xd2, 0xd, 0xd2, 0x10, 0x7e, + 0x1f, 0x39, 0xfc, 0x69, 0x31, 0x0, 0x6, 0x5e, 0x34, 0x0, 0x1, 0x22, 0x12, + 0x5f, 0x74, 0x78, 0x3, 0x2, 0xde, 0xd1, 0x22, 0xb, 0xa, 0x50, 0x4e, 0xa0, + 0x10, 0x1b, 0xa, 0x50, 0xb, 0x1a, 0x50, 0x4e, 0x54, 0x40, 0xa, 0x1b, 0x1a, + 0x50, 0xb, 0xa, 0x50, 0x30, 0xb, 0xc, 0x4e, 0xa0, 0x8, 0x12, 0x5f, 0xc1, + 0x4e, 0x14, 0x20, 0x5, 0x80, 0xa, 0x5e, 0xa0, 0xf7, 0x12, 0x5f, 0xc1, 0x5e, + 0x14, 0xdf, 0xfa, 0x1b, 0x1a, 0x10, 0x22, 0x1b, 0xa, 0x50, 0xb, 0x1a, 0x10, + 0x22, 0xb, 0xa, 0x50, 0x5e, 0xa0, 0xef, 0x12, 0x5f, 0xc1, 0x5e, 0x14, 0xbf, + 0xf5, 0x1b, 0x1a, 0x10, 0x22, 0x12, 0x5b, 0x7, 0x12, 0x5f, 0x12, 0x4e, 0x70, + 0x1, 0x1b, 0xa, 0x30, 0x22, 0x7e, 0xf, 0x39, 0xfc, 0x69, 0x30, 0x0, 0x6, + 0x5e, 0x34, 0x0, 0x1, 0x22, 0x5e, 0x70, 0xfd, 0x1b, 0xa, 0x30, 0x22, 0x75, + 0xe7, 0x6b, 0xe4, 0x7e, 0x34, 0x1, 0x4, 0x7e, 0x24, 0x0, 0xfe, 0x7a, 0x1b, + 0xb0, 0x7e, 0x34, 0x1, 0x5, 0x7a, 0x1b, 0xb0, 0x75, 0xe9, 0xff, 0x22, 0x7c, + 0x6b, 0xa5, 0xbe, 0x0, 0x7, 0x7c, 0xb7, 0x12, 0x64, 0xfb, 0x61, 0xd5, 0xa5, + 0xbe, 0xf, 0xd, 0x7a, 0x73, 0x54, 0x6f, 0x74, 0x1, 0x7a, 0xb3, 0x54, 0x70, + 0xd2, 0x1c, 0x22, 0xa5, 0xbe, 0x49, 0x19, 0xa5, 0xbf, 0x1, 0x7, 0x7a, 0x73, + 0x54, 0xa9, 0xd2, 0x1c, 0x22, 0xa5, 0xbf, 0x0, 0x2, 0x80, 0x2, 0x61, 0xd5, + 0x7a, 0x73, 0x54, 0xa9, 0x61, 0xd5, 0xa5, 0xbe, 0x4a, 0x6, 0x7a, 0x73, 0x54, + 0xaa, 0x61, 0xd5, 0xa5, 0xbe, 0x4b, 0x6, 0x7a, 0x73, 0x54, 0xab, 0x61, 0xd5, + 0xa5, 0xbe, 0x4c, 0x6, 0x7a, 0x73, 0x54, 0xac, 0x61, 0xd5, 0xa5, 0xbe, 0x11, + 0x29, 0xa5, 0xbf, 0x1, 0x15, 0x12, 0x51, 0x2d, 0x78, 0x2, 0x61, 0xf4, 0x74, + 0x1, 0x7a, 0xb3, 0x54, 0x71, 0xe4, 0x7a, 0xb3, 0x54, 0x73, 0x2, 0xf1, 0x1c, + 0xa5, 0xbf, 0x0, 0x2, 0x80, 0x2, 0x61, 0xf4, 0xe4, 0x7a, 0xb3, 0x54, 0x71, + 0x2, 0xf1, 0xc9, 0xa5, 0xbe, 0x12, 0xf, 0xa, 0x27, 0x3e, 0x24, 0x3e, 0x24, + 0x7a, 0x27, 0x39, 0xe8, 0x7a, 0x73, 0x54, 0x72, 0x22, 0xa5, 0xbe, 0x13, 0xd, + 0x7c, 0x67, 0x6c, 0x77, 0x2e, 0x37, 0x39, 0xe8, 0x7a, 0x37, 0x39, 0xe8, + 0x22, 0xa5, 0xbe, 0x2d, 0x7, 0x7a, 0x73, 0x54, 0x8d, 0xd2, 0x1c, 0x22, 0xa5, + 0xbe, 0x1, 0x1b, 0x7e, 0xf, 0x2d, 0x2e, 0x7d, 0x21, 0x7a, 0x27, 0x39, 0xe4, + 0x6d, 0x22, 0x7a, 0x27, 0x39, 0xac, 0x7a, 0x73, 0x54, 0x61, 0x7c, 0xb7, + 0x12, 0x64, 0x72, 0x61, 0xd5, 0xbe, 0x60, 0x5c, 0x28, 0x2, 0x41, 0xc9, 0xa5, + 0xbe, 0x30, 0x11, 0x7e, 0x53, 0x54, 0x90, 0xbc, 0x57, 0x78, 0x2, 0x61, 0xf4, + 0xbe, 0x70, 0x4, 0x40, 0x2, 0x61, 0xf4, 0xbe, 0x60, 0x20, 0x40, 0xc, 0xbe, + 0x60, 0x24, 0x38, 0x7, 0xbe, 0x70, 0x3, 0x28, 0x2, 0x61, 0xf4, 0x7c, 0xb6, + 0x24, 0xf9, 0x78, 0x2, 0x61, 0xf4, 0x24, 0xfb, 0x78, 0x2, 0x61, 0xf4, 0x14, + 0x78, 0x2, 0x61, 0xf4, 0x14, 0x78, 0x2, 0x61, 0xf4, 0x24, 0xe3, 0x78, 0x2, + 0x61, 0xf4, 0x14, 0x78, 0x2, 0x61, 0xf4, 0x80, 0x0, 0xa, 0x26, 0x19, 0x72, + 0x54, 0x60, 0x7c, 0xb6, 0x1b, 0xb2, 0xbe, 0xb0, 0x45, 0x40, 0x2, 0x41, 0x9f, + 0x7e, 0xa0, 0x3, 0xa4, 0x90, 0x61, 0x53, 0x73, 0x2, 0x62, 0x22, 0x2, 0x62, + 0x9f, 0x2, 0x62, 0x22, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x26, 0x2, 0x62, 0x22, + 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, + 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, + 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, + 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x65, 0x2, 0x62, 0x9f, 0x2, + 0x62, 0x72, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x85, 0x2, 0x62, 0x22, 0x2, 0x62, + 0x22, 0x2, 0x62, 0x2b, 0x2, 0x62, 0x2b, 0x2, 0x62, 0x2b, 0x2, 0x62, 0x2b, + 0x2, 0x62, 0x2b, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x94, 0x2, 0x62, 0x9f, 0x2, + 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, + 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x22, + 0x2, 0x62, 0x3d, 0x2, 0x62, 0x46, 0x2, 0x62, 0x58, 0x2, 0x62, 0x58, 0x2, + 0x62, 0x9f, 0x2, 0x62, 0x4f, 0x2, 0x62, 0x34, 0x2, 0x62, 0x9f, 0x2, 0x62, + 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, + 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x34, 0x2, 0x62, 0x34, 0x2, + 0x62, 0x34, 0x2, 0x62, 0x34, 0x2, 0x62, 0x34, 0x2, 0x62, 0x34, 0x2, 0x62, + 0x34, 0x2, 0x62, 0x34, 0x2, 0x62, 0x34, 0xd2, 0x1c, 0x80, 0x79, 0x12, 0x0, + 0x16, 0x80, 0x74, 0x7e, 0x27, 0x39, 0xcb, 0x4e, 0x40, 0x20, 0x80, 0x2b, + 0x7e, 0x27, 0x39, 0xcb, 0x4e, 0x40, 0x1, 0x80, 0x22, 0x7e, 0x27, 0x39, 0xcb, + 0x4e, 0x50, 0x1, 0x80, 0x19, 0x7e, 0x27, 0x39, 0xcb, 0x4e, 0x50, 0x2, 0x80, + 0x10, 0x7e, 0x27, 0x39, 0xcb, 0x4e, 0x50, 0x4, 0x80, 0x7, 0x7e, 0x27, 0x39, + 0xcb, 0x4e, 0x50, 0x10, 0x7a, 0x27, 0x39, 0xcb, 0x80, 0x3a, 0x7e, 0x53, + 0x54, 0x78, 0x12, 0x63, 0xf5, 0x7a, 0x27, 0x39, 0xa8, 0x80, 0x2d, 0x7e, + 0x53, 0x54, 0x7a, 0x12, 0x63, 0xf5, 0x3e, 0x24, 0x7a, 0x27, 0x39, 0xe0, + 0x7a, 0x27, 0x39, 0xc2, 0x80, 0x1a, 0x7e, 0x53, 0x54, 0x7c, 0x12, 0x63, + 0xf5, 0x3e, 0x24, 0x7a, 0x27, 0x39, 0xac, 0x80, 0xb, 0x7e, 0x53, 0x54, 0x85, + 0x12, 0x63, 0xf5, 0x7a, 0x53, 0x55, 0xf5, 0xbe, 0x60, 0x3b, 0x40, 0x10, + 0xbe, 0x60, 0x3e, 0x38, 0xb, 0x7e, 0x27, 0x39, 0xcb, 0x4e, 0x40, 0x2, 0x7a, + 0x27, 0x39, 0xcb, 0xa5, 0xbe, 0xa, 0x2, 0x80, 0x2, 0x61, 0xd5, 0x7e, 0x37, + 0x39, 0xcb, 0x4e, 0x60, 0x4, 0x7a, 0x37, 0x39, 0xcb, 0x61, 0xd5, 0xbe, 0x60, + 0x6c, 0x68, 0x4, 0xa5, 0xbe, 0x6d, 0x2b, 0x7e, 0x27, 0x39, 0xcb, 0x4e, 0x50, + 0x80, 0x7a, 0x27, 0x39, 0xcb, 0x7e, 0x27, 0x39, 0xc2, 0x7d, 0x12, 0xb, 0x14, + 0x7a, 0x17, 0x39, 0xc2, 0x2e, 0x27, 0x39, 0xc6, 0x7a, 0x29, 0x70, 0xa5, + 0xbe, 0x6d, 0x2, 0x80, 0x2, 0x61, 0xd5, 0x75, 0xf, 0x6c, 0x61, 0xd5, 0xbe, + 0x60, 0x6e, 0x68, 0x4, 0xa5, 0xbe, 0x6f, 0x56, 0x7e, 0x27, 0x39, 0xcb, 0x4e, + 0x50, 0x40, 0x7a, 0x27, 0x39, 0xcb, 0x7e, 0x43, 0x54, 0x78, 0x6c, 0x55, + 0x7e, 0xb3, 0x54, 0x79, 0xa, 0x1b, 0x2d, 0x12, 0x4, 0x7a, 0xb3, 0x54, 0x79, + 0x70, 0x9, 0x7e, 0xb3, 0x54, 0x78, 0x4, 0x7a, 0xb3, 0x54, 0x78, 0x7e, 0x27, + 0x74, 0xc, 0xbd, 0x21, 0x28, 0xf, 0x7c, 0xb7, 0x54, 0x3f, 0x7e, 0x27, 0x39, + 0xdc, 0x2d, 0x21, 0x7a, 0x29, 0xb0, 0x80, 0x9, 0x7e, 0x27, 0x39, 0xdc, 0x2d, + 0x21, 0x7a, 0x29, 0x70, 0xa5, 0xbe, 0x6f, 0x2, 0x80, 0x2, 0x61, 0xd5, 0x75, + 0xf, 0x6e, 0x80, 0x79, 0xbe, 0x60, 0x70, 0x40, 0xc, 0xbe, 0x60, 0x7f, 0x38, + 0x7, 0x7c, 0xb6, 0x12, 0x77, 0x5d, 0x80, 0x68, 0xa5, 0xbe, 0x83, 0x6, 0x7a, + 0x73, 0x39, 0xb0, 0x80, 0x5e, 0xa5, 0xbe, 0x86, 0xf, 0x7c, 0xb7, 0x54, 0x7, + 0x7a, 0xb3, 0x39, 0xb4, 0x53, 0xc3, 0xf8, 0x42, 0xc3, 0x80, 0x4b, 0xa5, + 0xbe, 0x87, 0x1a, 0x7c, 0xb7, 0x54, 0x7, 0x7a, 0xb3, 0x39, 0xa4, 0xa, 0x2b, + 0x7d, 0x32, 0x12, 0xf0, 0xd8, 0x2e, 0x34, 0x7f, 0x0, 0x2d, 0x32, 0x12, 0x64, + 0x2, 0x80, 0x2d, 0xa5, 0xbe, 0x88, 0x5, 0x7a, 0x71, 0xc4, 0x80, 0x24, 0xa5, + 0xbe, 0xed, 0x20, 0x7a, 0x73, 0x39, 0xd4, 0xa5, 0xbf, 0x4, 0x5, 0x12, 0x77, + 0xc1, 0x80, 0x13, 0xa5, 0xbf, 0x2, 0x8, 0x6d, 0x33, 0x7a, 0x37, 0x39, 0xa8, + 0x80, 0x7, 0xa5, 0xbf, 0x3, 0x3, 0x12, 0x64, 0xa4, 0x30, 0x1c, 0xa, 0x7e, + 0xb3, 0x54, 0x6e, 0x44, 0x1, 0x7a, 0xb3, 0x54, 0x6e, 0x7e, 0x37, 0x39, 0xcb, + 0x4d, 0x33, 0x68, 0xa, 0x7e, 0xb3, 0x54, 0x6e, 0x44, 0x2, 0x7a, 0xb3, 0x54, + 0x6e, 0x22, 0x7c, 0x25, 0x6c, 0x33, 0xa, 0x27, 0x2d, 0x21, 0x22, 0x7e, 0x37, + 0x39, 0xd0, 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x4c, 0x22, 0x7c, 0x6b, + 0x12, 0x64, 0x6a, 0x78, 0x5, 0x7c, 0xb6, 0x2, 0x64, 0xab, 0xb4, 0x4, 0x5, + 0x7c, 0xb6, 0x2, 0x60, 0x14, 0x22, 0x30, 0x90, 0x19, 0xc2, 0x90, 0xe5, 0x8, + 0x70, 0x9, 0x75, 0x8, 0x1, 0xe5, 0x91, 0xf5, 0xf, 0x80, 0x11, 0x7e, 0x71, + 0x91, 0xe5, 0xf, 0x12, 0x64, 0xb, 0x5, 0xf, 0x30, 0x91, 0xb, 0xc2, 0x91, + 0x5, 0xf, 0xe5, 0xf, 0x12, 0x64, 0x4b, 0xf5, 0x91, 0x22, 0x7c, 0x7b, 0x6c, + 0xaa, 0x12, 0x64, 0x6a, 0x78, 0x9, 0x7c, 0xb7, 0x12, 0x65, 0x26, 0x7c, 0xab, + 0x80, 0xa, 0xb4, 0x4, 0x7, 0x7c, 0xb7, 0x12, 0x48, 0x17, 0x7c, 0xab, 0x7c, + 0xba, 0x22, 0x7e, 0xb3, 0x54, 0x60, 0xc4, 0x54, 0x7, 0x22, 0x24, 0x52, 0x68, + 0xb, 0x4, 0x78, 0x2a, 0x12, 0x64, 0xa4, 0x7a, 0x37, 0x39, 0xe2, 0x22, 0x7e, + 0x63, 0x68, 0xa6, 0x7e, 0x73, 0x68, 0xa7, 0xac, 0x76, 0x3e, 0x34, 0x7a, + 0x37, 0x39, 0xac, 0x1e, 0x34, 0xa, 0x36, 0x7a, 0x73, 0x54, 0x7c, 0x7e, 0x37, + 0x39, 0xac, 0x1e, 0x34, 0x7a, 0x73, 0x54, 0x7d, 0x22, 0x6d, 0x33, 0x7a, + 0x37, 0x39, 0xac, 0x22, 0x7c, 0xa7, 0x7c, 0x3b, 0xa5, 0xbb, 0x0, 0x7, 0x7c, + 0xba, 0x12, 0x64, 0xfb, 0x80, 0x25, 0xbe, 0x30, 0xeb, 0x68, 0x4, 0xa5, 0xbb, + 0xec, 0x9, 0x7c, 0xb3, 0x7c, 0x7a, 0x12, 0x88, 0xf6, 0x80, 0x13, 0xbe, 0x30, + 0x80, 0x40, 0xe, 0xbe, 0x30, 0xef, 0x38, 0x9, 0x7c, 0xb3, 0x24, 0x80, 0x7c, + 0x7a, 0x12, 0x89, 0x3a, 0xa5, 0xbb, 0xfc, 0x5, 0x7c, 0xba, 0x2, 0x58, 0x5e, + 0xa5, 0xbb, 0xfd, 0x8, 0xbe, 0xa0, 0x5a, 0x78, 0x9, 0xd2, 0x27, 0x22, 0x74, + 0x1, 0x7a, 0xb3, 0x56, 0xbc, 0x22, 0x7a, 0xb3, 0x54, 0x60, 0xc4, 0x54, 0x7, + 0xbe, 0xb0, 0x4, 0x68, 0x3, 0xb4, 0x2, 0x4, 0x74, 0x3, 0x80, 0x7, 0x60, 0x3, + 0xb4, 0x1, 0x7, 0x74, 0x1, 0x7a, 0xb3, 0x54, 0x15, 0x22, 0x74, 0x1, 0x7a, + 0xb3, 0x54, 0x15, 0xe4, 0x7a, 0xb3, 0x54, 0x60, 0x22, 0x70, 0x3, 0x2, 0x88, + 0x9a, 0xbe, 0xb0, 0x3, 0x38, 0x13, 0x30, 0x28, 0x6, 0x7e, 0x18, 0x2, 0xf3, + 0x80, 0x4, 0x7e, 0x18, 0x3, 0x4d, 0x7a, 0x1f, 0x3, 0xa7, 0x80, 0x5, 0xbe, + 0xb0, 0x6e, 0x38, 0xe, 0xa, 0x1b, 0x7e, 0x1f, 0x3, 0xa7, 0x2d, 0x31, 0x1b, + 0x34, 0x7e, 0x1b, 0xb0, 0x22, 0xbe, 0xb0, 0xd3, 0x68, 0x3, 0xb4, 0xd4, 0x10, + 0xb4, 0xd3, 0x8, 0x6d, 0x33, 0x7a, 0x37, 0x54, 0xc0, 0x80, 0x2, 0x15, 0xf, + 0x2, 0x88, 0x4d, 0xb4, 0xf6, 0x7, 0x7e, 0x34, 0x29, 0xec, 0x2, 0x66, 0x11, + 0xb4, 0xf7, 0xa, 0x7e, 0x34, 0x29, 0xec, 0x12, 0x32, 0xdf, 0xa, 0x56, 0x22, + 0xbe, 0xb0, 0xf8, 0x68, 0x3, 0xb4, 0xf9, 0x1c, 0xb4, 0xf8, 0x8, 0x6d, 0x33, + 0x7a, 0x37, 0x54, 0xc0, 0x80, 0x2, 0x15, 0xf, 0x7e, 0x37, 0x54, 0xc0, 0x7d, + 0x23, 0xb, 0x24, 0x7a, 0x27, 0x54, 0xc0, 0x2, 0x0, 0x1e, 0xbe, 0xb0, 0xeb, + 0x68, 0x3, 0xb4, 0xec, 0x3, 0x2, 0x66, 0x19, 0xb4, 0x80, 0x3, 0x2, 0x65, + 0xe9, 0xbe, 0xb0, 0x80, 0x28, 0xc, 0xbe, 0xb0, 0xef, 0x38, 0x7, 0xa, 0x3b, + 0x9, 0xb3, 0x53, 0x6e, 0x22, 0xb4, 0xfc, 0x5, 0x7e, 0xb3, 0x54, 0x15, 0x22, + 0xb4, 0xfd, 0x5, 0xa2, 0x27, 0xe4, 0x33, 0x22, 0xb4, 0xfe, 0x8, 0x12, 0xf2, + 0x81, 0x9, 0xb5, 0x3, 0xac, 0x22, 0x74, 0xff, 0x22, 0x12, 0x66, 0xd, 0xbe, + 0x54, 0x0, 0xc0, 0x50, 0x6, 0x7e, 0x54, 0x0, 0xc0, 0x80, 0xa, 0xbe, 0x54, + 0x1, 0x20, 0x28, 0x4, 0x7e, 0x54, 0x1, 0x20, 0x1e, 0x54, 0x1e, 0x54, 0x1e, + 0x54, 0x1e, 0x54, 0x1e, 0x54, 0x22, 0x7e, 0x34, 0xd, 0x18, 0x7e, 0x24, 0x0, + 0xff, 0xb, 0x1a, 0x50, 0x22, 0xb4, 0xeb, 0x5, 0xe4, 0x7a, 0xb3, 0x54, 0xc6, + 0x7e, 0x73, 0x54, 0xc6, 0xa, 0x27, 0x2e, 0x24, 0x0, 0x6, 0x12, 0x9f, 0x3a, + 0x7c, 0xab, 0x7c, 0xb7, 0x4, 0x7a, 0xb3, 0x54, 0xc6, 0xb4, 0x3, 0xb, 0xe4, + 0x7a, 0xb3, 0x54, 0xc6, 0x6d, 0x33, 0x7a, 0x37, 0x54, 0xc4, 0x75, 0xf, 0xeb, + 0x7c, 0xba, 0x22, 0xca, 0xd8, 0xca, 0x79, 0x7c, 0x8b, 0x6c, 0x99, 0xa, 0xf8, + 0x9, 0xdf, 0x38, 0x8b, 0x7c, 0xbd, 0x20, 0xe7, 0x68, 0x7c, 0xbd, 0x30, 0xe3, + 0x17, 0x7e, 0x70, 0x2, 0xac, 0x78, 0x49, 0x53, 0x38, 0x9f, 0xbe, 0x54, 0x0, + 0x0, 0x28, 0x54, 0xbe, 0x54, 0x0, 0xc, 0x50, 0x4e, 0x80, 0x49, 0x7c, 0xbd, + 0x30, 0xe2, 0x47, 0x7e, 0xf0, 0x2, 0xac, 0xf8, 0x49, 0xe7, 0x38, 0xc7, 0x12, + 0x66, 0xd, 0x3e, 0x54, 0xbd, 0xe5, 0x40, 0x35, 0x7c, 0xbd, 0x30, 0xe4, 0x17, + 0x7c, 0xbd, 0x30, 0xe1, 0x2b, 0x9, 0x7f, 0x38, 0x95, 0xbe, 0x70, 0x14, 0x50, + 0x22, 0x7c, 0xb8, 0x12, 0x66, 0xf3, 0x40, 0x1b, 0x80, 0x16, 0x7c, 0xbd, + 0x20, 0xe0, 0x14, 0x49, 0x57, 0x38, 0x9f, 0xbe, 0x54, 0x0, 0x2, 0x50, 0xa, + 0x7c, 0xb8, 0x12, 0x66, 0xf3, 0x40, 0x3, 0x4e, 0x90, 0x4, 0x4c, 0x99, 0x78, + 0x11, 0x74, 0x2, 0xac, 0xb8, 0x49, 0x55, 0x38, 0x9f, 0xbe, 0x54, 0x0, 0x0, + 0x28, 0x3, 0x4e, 0x90, 0x8, 0x6d, 0x33, 0x74, 0x2, 0xac, 0xb8, 0x59, 0x35, + 0x38, 0x9f, 0xe4, 0xa, 0x38, 0x19, 0xb3, 0x38, 0x8b, 0x7c, 0xb9, 0xda, 0x79, + 0xda, 0xd8, 0x22, 0x7c, 0xab, 0xc2, 0x0, 0x7e, 0x70, 0x9, 0xac, 0x7a, 0x9, + 0xb3, 0x38, 0xf6, 0x9, 0x73, 0x38, 0xf7, 0x12, 0x36, 0x62, 0x12, 0xa7, 0x95, + 0xbd, 0x32, 0x28, 0x2, 0xd2, 0x0, 0xa2, 0x0, 0x22, 0xca, 0xd8, 0xca, 0x79, + 0xe4, 0x7a, 0xb3, 0x39, 0xa3, 0x7e, 0xb3, 0x54, 0x3e, 0xbe, 0xb0, 0x1, 0x68, + 0x7d, 0x6c, 0xdd, 0x80, 0x3b, 0x6c, 0xaa, 0x7e, 0x70, 0x9, 0xac, 0x7d, 0x12, + 0xd1, 0xbc, 0x7e, 0x70, 0x8, 0xac, 0x7f, 0x9, 0xe3, 0x68, 0x29, 0x4c, 0xee, + 0x78, 0xb, 0x7c, 0xbd, 0x7c, 0x7f, 0x12, 0xce, 0x16, 0x7c, 0xab, 0x80, 0xe, + 0xbe, 0xe0, 0x2, 0x78, 0x9, 0x7c, 0xbd, 0x7c, 0x7f, 0x12, 0xcd, 0x43, 0x7c, + 0xab, 0x7c, 0x1d, 0x2e, 0x10, 0x27, 0x7c, 0xba, 0xa5, 0xf7, 0xb, 0xd0, 0x7e, + 0xb3, 0x68, 0x79, 0xbc, 0xbd, 0x38, 0xbd, 0x7e, 0x8, 0x0, 0x27, 0x12, 0xd1, + 0x4c, 0x6c, 0xff, 0xe4, 0xa, 0x3f, 0x19, 0xb3, 0x2e, 0x77, 0x74, 0x8, 0xac, + 0xbf, 0x9, 0xe5, 0x68, 0x29, 0xbe, 0xe0, 0x1, 0x78, 0xb, 0x7c, 0xbf, 0x12, + 0x66, 0x4b, 0xa, 0x3f, 0x19, 0xb3, 0x2e, 0x77, 0xb, 0xf0, 0xbe, 0xf0, 0xa, + 0x78, 0xda, 0x7e, 0x8, 0x2e, 0x77, 0x12, 0xd0, 0xdb, 0xda, 0x79, 0xda, 0xd8, + 0x22, 0xca, 0xf8, 0x7c, 0xfb, 0x12, 0x77, 0xfd, 0x7e, 0xa3, 0x54, 0x96, + 0x7e, 0x70, 0x8, 0xac, 0x7f, 0x19, 0xa3, 0x3, 0xb1, 0x7c, 0xbf, 0x12, 0x92, + 0xc7, 0xda, 0xf8, 0x22, 0xe4, 0x7a, 0xb3, 0x54, 0x13, 0x6d, 0x33, 0x7a, + 0x37, 0x39, 0xe0, 0x7a, 0xb3, 0x39, 0xb1, 0x7e, 0xb3, 0x54, 0xbc, 0x70, 0x5, + 0x12, 0x77, 0xba, 0x80, 0x3, 0x12, 0xf1, 0xd2, 0xc2, 0x0, 0x12, 0x47, 0x7f, + 0x7e, 0x34, 0x5, 0x20, 0xca, 0x39, 0x7e, 0x1f, 0x2d, 0x2a, 0x7e, 0xf, 0x2d, + 0x2e, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x12, 0x46, 0x8f, 0x12, 0x80, 0xe0, 0x2, + 0x30, 0x23, 0x12, 0x6f, 0xd7, 0x7e, 0x70, 0x5, 0xac, 0x78, 0x9, 0x53, 0x3, + 0xec, 0xbe, 0x53, 0x54, 0x80, 0x68, 0x8, 0x7e, 0x53, 0x54, 0x80, 0x19, 0x53, + 0x3, 0xec, 0x9, 0x53, 0x3, 0xed, 0xbe, 0x53, 0x54, 0x81, 0x68, 0x8, 0x7e, + 0x53, 0x54, 0x81, 0x19, 0x53, 0x3, 0xed, 0x9, 0x53, 0x3, 0xee, 0xbe, 0x53, + 0x54, 0x82, 0x68, 0x8, 0x7e, 0x53, 0x54, 0x82, 0x19, 0x53, 0x3, 0xee, 0x9, + 0x53, 0x3, 0xef, 0xbe, 0x53, 0x54, 0x83, 0x68, 0x8, 0x7e, 0x53, 0x54, 0x83, + 0x19, 0x53, 0x3, 0xef, 0x9, 0x53, 0x3, 0xf0, 0xbe, 0x53, 0x54, 0x84, 0x68, + 0x8, 0x7e, 0x53, 0x54, 0x84, 0x19, 0x53, 0x3, 0xf0, 0x12, 0x68, 0xcf, 0x12, + 0x68, 0x70, 0x7e, 0x24, 0x0, 0x2, 0x2, 0x40, 0xbe, 0x9, 0xb3, 0x3, 0xec, + 0x9, 0x73, 0x3, 0xed, 0x12, 0x6b, 0x3f, 0x7e, 0x30, 0x3c, 0xac, 0x39, 0x2e, + 0x14, 0x34, 0xc7, 0x6d, 0x0, 0x74, 0x5, 0xac, 0xb8, 0x9, 0xb5, 0x3, 0xee, + 0x12, 0x6a, 0xf9, 0x7e, 0x30, 0x3c, 0xac, 0x39, 0x2e, 0x14, 0x34, 0xc9, + 0x6d, 0x0, 0x74, 0x5, 0xac, 0xb8, 0x9, 0xb5, 0x3, 0xef, 0x12, 0x6b, 0x2c, + 0x7e, 0x30, 0x3c, 0xac, 0x39, 0x2e, 0x14, 0x34, 0xc9, 0x6d, 0x0, 0x74, 0x5, + 0xac, 0xb8, 0x9, 0xb5, 0x3, 0xf0, 0x12, 0x6b, 0x8, 0x74, 0x3, 0x12, 0x3f, + 0xc8, 0x7e, 0x70, 0xee, 0xac, 0x79, 0x2e, 0x34, 0x1, 0x0, 0x2e, 0x34, 0x0, + 0x9, 0x7e, 0x30, 0x3c, 0xac, 0x39, 0x2e, 0x14, 0x34, 0xc7, 0x6d, 0x0, 0x22, + 0xca, 0x3b, 0x7c, 0xeb, 0xbe, 0xe0, 0x4, 0x40, 0x2, 0x41, 0xf6, 0x12, 0xf1, + 0x8a, 0xbe, 0xf0, 0x4, 0x40, 0x2, 0x41, 0xf6, 0x9, 0x75, 0x3, 0xac, 0xa, + 0x47, 0x3e, 0x44, 0x3e, 0x44, 0x3e, 0x44, 0xb, 0x46, 0x7a, 0x45, 0x27, 0x9, + 0x75, 0x3, 0xad, 0xa, 0x67, 0x3e, 0x64, 0x3e, 0x64, 0x3e, 0x64, 0xb, 0x66, + 0x7e, 0x50, 0x3c, 0xac, 0x5f, 0x2e, 0x24, 0x34, 0xb5, 0xb, 0x28, 0x30, 0x4e, + 0x70, 0x1, 0x1b, 0x28, 0x30, 0x74, 0x8, 0xac, 0xbe, 0x9, 0x75, 0x3, 0xb3, + 0x2e, 0x70, 0xff, 0x92, 0x1, 0x12, 0x6b, 0x9c, 0x12, 0xed, 0xf4, 0x7e, 0x90, + 0x8, 0xac, 0x9e, 0x9, 0xb4, 0x3, 0xaf, 0xf5, 0x29, 0x7e, 0x70, 0x3c, 0xac, + 0x7f, 0x7d, 0x13, 0x12, 0x6b, 0x95, 0x2e, 0x34, 0x34, 0xe7, 0x6d, 0x22, 0x9, + 0xb4, 0x3, 0xae, 0x12, 0x98, 0xa2, 0x12, 0x6b, 0x90, 0x7e, 0x35, 0x27, 0x12, + 0x6b, 0x6f, 0x12, 0x6b, 0x84, 0x7d, 0x36, 0x12, 0x6b, 0x75, 0x7e, 0x30, + 0x3c, 0xac, 0x3f, 0x12, 0xf1, 0x42, 0x74, 0x8, 0xac, 0xbe, 0x9, 0xb5, 0x3, + 0xb1, 0x12, 0xed, 0x8d, 0x12, 0x6b, 0x84, 0x74, 0x3, 0xac, 0xbe, 0x12, 0x6b, + 0xdb, 0x12, 0x6c, 0x85, 0x6d, 0x33, 0x12, 0x0, 0x26, 0x7e, 0x30, 0x3c, 0xac, + 0x3f, 0x12, 0x68, 0xd4, 0x7e, 0x70, 0x5, 0xac, 0x7e, 0x9, 0xb3, 0x3, 0xec, + 0x9, 0x73, 0x3, 0xed, 0x12, 0x6b, 0x3f, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x12, + 0x68, 0xd4, 0x74, 0x5, 0xac, 0xbe, 0x9, 0xb5, 0x3, 0xee, 0x12, 0x6a, 0xf9, + 0x12, 0x6b, 0xa8, 0x9, 0xb5, 0x3, 0xef, 0x12, 0x6b, 0x2c, 0x12, 0x6b, 0xa8, + 0x9, 0xb5, 0x3, 0xf0, 0x12, 0x6b, 0x8, 0x12, 0x6c, 0x64, 0x12, 0x0, 0x26, + 0xc2, 0x1, 0x12, 0x6b, 0xcf, 0x12, 0xed, 0xde, 0x12, 0xee, 0x15, 0x12, 0xee, + 0x5, 0x7e, 0x50, 0x3c, 0xac, 0x5f, 0x2e, 0x24, 0x34, 0xc9, 0xb, 0x28, 0x30, + 0x7e, 0x34, 0x0, 0x2, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x34, 0xd1, 0x74, + 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x34, 0xd3, 0x6d, 0x33, 0x74, 0x3c, 0xac, + 0xbf, 0x59, 0x35, 0x34, 0xd5, 0x7e, 0x34, 0x22, 0x5, 0x74, 0x3c, 0xac, 0xbf, + 0x59, 0x35, 0x34, 0xd7, 0x7e, 0x34, 0x0, 0x6, 0x74, 0x3c, 0xac, 0xbf, 0x59, + 0x35, 0x34, 0xd9, 0x7e, 0x34, 0x0, 0x12, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, + 0x34, 0xdb, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x34, 0xdd, 0x74, 0x3c, + 0xac, 0xbf, 0x59, 0x35, 0x34, 0xdf, 0x7e, 0x34, 0x8, 0x8, 0x74, 0x3c, 0xac, + 0xbf, 0x59, 0x35, 0x34, 0xe1, 0x6d, 0x33, 0x74, 0x3c, 0xac, 0xbf, 0x59, + 0x35, 0x34, 0xe9, 0x7e, 0x34, 0x0, 0x1, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, + 0x34, 0xe3, 0x7e, 0x34, 0xc, 0x1c, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x34, + 0xe5, 0x7e, 0x50, 0x3c, 0xac, 0x5f, 0x2e, 0x24, 0x34, 0xe7, 0xb, 0x28, 0x30, + 0x4e, 0x34, 0x41, 0x96, 0x1b, 0x28, 0x30, 0x7e, 0x34, 0x1f, 0x0, 0x74, 0x3c, + 0xac, 0xbf, 0x59, 0x35, 0x34, 0xeb, 0xbe, 0xe0, 0x3, 0x78, 0x19, 0x7e, 0x34, + 0x3, 0x51, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x34, 0xc5, 0x7e, 0x34, 0x4, + 0x4, 0x12, 0x6b, 0x7b, 0x7e, 0x34, 0x4, 0x29, 0x80, 0x7, 0x7e, 0x34, 0xa, + 0x19, 0x12, 0x6b, 0x7b, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x34, 0xef, + 0x7e, 0x34, 0x0, 0x2c, 0x7a, 0x35, 0x29, 0x12, 0xf0, 0xe1, 0x7e, 0x35, 0x27, + 0x7d, 0x26, 0x12, 0xee, 0xcb, 0x7e, 0x35, 0x27, 0x7d, 0x26, 0x12, 0x6b, + 0xc9, 0x7e, 0x35, 0x27, 0x7d, 0x26, 0x74, 0x2a, 0x12, 0xed, 0xae, 0x74, 0x3, + 0x12, 0x3f, 0xc8, 0x12, 0xf0, 0x9d, 0x12, 0x6b, 0x9c, 0x7e, 0x24, 0x0, 0x1e, + 0x12, 0xef, 0xcd, 0x6d, 0x0, 0x7e, 0x24, 0x0, 0x3, 0x12, 0x40, 0x57, 0xda, + 0x3b, 0x22, 0xb, 0xa, 0x30, 0x5e, 0x60, 0x3f, 0x1b, 0xa, 0x30, 0x12, 0x6f, + 0xe2, 0x2, 0x6b, 0xc0, 0xb, 0xa, 0x30, 0x5e, 0x60, 0xf3, 0x1b, 0xa, 0x30, + 0x12, 0x6f, 0xfb, 0x2, 0x5d, 0x59, 0x12, 0x6f, 0xd7, 0x12, 0x68, 0xcf, 0x7e, + 0x70, 0x5, 0xac, 0x78, 0x12, 0x68, 0x70, 0x7e, 0x24, 0x0, 0x2, 0x2, 0x40, + 0xbe, 0xb, 0xa, 0x30, 0x5e, 0x60, 0xcf, 0x1b, 0xa, 0x30, 0x54, 0x3, 0xa, + 0x5b, 0x12, 0x6c, 0x33, 0x2, 0x6b, 0xc0, 0xb, 0xa, 0x20, 0x5e, 0x40, 0xc3, + 0x1b, 0xa, 0x20, 0x54, 0x3, 0xa, 0x5b, 0x12, 0x6c, 0x33, 0xb, 0xa, 0x20, + 0x4d, 0x25, 0x1b, 0xa, 0x20, 0x7c, 0xb7, 0x12, 0x6f, 0xfb, 0x2, 0x5d, 0x59, + 0xb, 0xa, 0x30, 0x5e, 0x34, 0xfc, 0x0, 0x1b, 0xa, 0x30, 0x4d, 0x32, 0x1b, + 0xa, 0x30, 0x22, 0x12, 0x6f, 0xc3, 0x2, 0x6b, 0x66, 0x12, 0x6f, 0xc3, 0x2, + 0x6b, 0x66, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x34, 0xed, 0x22, 0x7e, + 0x30, 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x34, 0xb9, 0x6d, 0x0, 0x22, 0x7e, 0x30, + 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x34, 0xb7, 0x6d, 0x0, 0x22, 0x7e, 0x30, 0x3c, + 0xac, 0x3f, 0x2e, 0x14, 0x34, 0xb5, 0x6d, 0x0, 0x22, 0x7e, 0x30, 0x3c, 0xac, + 0x3f, 0x2e, 0x14, 0x34, 0xc9, 0x6d, 0x0, 0x74, 0x5, 0xac, 0xbe, 0x22, 0x7e, + 0xf, 0x39, 0xfc, 0x2e, 0x14, 0x0, 0x12, 0xb, 0xa, 0x30, 0x4d, 0x35, 0x1b, + 0xa, 0x30, 0x22, 0x12, 0x6c, 0x3a, 0x75, 0x29, 0x2c, 0x7e, 0x30, 0x3c, 0xac, + 0x3f, 0x2e, 0x14, 0x34, 0xe7, 0x6d, 0x0, 0x22, 0x9, 0xb5, 0x3, 0xe0, 0xb, + 0xa, 0x30, 0x5e, 0x60, 0xf, 0x1b, 0xa, 0x30, 0xa, 0x5b, 0x12, 0x6c, 0x33, + 0x2, 0x6b, 0xc0, 0x7c, 0x9b, 0x29, 0x81, 0x0, 0x2, 0xa, 0xe8, 0x7d, 0x5e, + 0x7c, 0xab, 0xe4, 0x7d, 0xe5, 0x29, 0x81, 0x0, 0x3, 0xa, 0x58, 0xc4, 0x54, + 0xf0, 0x7c, 0xab, 0xe4, 0x2d, 0xe5, 0x29, 0x81, 0x0, 0x1, 0xa, 0xf8, 0x3e, + 0xf4, 0x3e, 0xf4, 0x3e, 0xf4, 0x3e, 0xf4, 0x2d, 0xfe, 0x7e, 0x1b, 0x80, 0xa, + 0x58, 0x2d, 0x5f, 0x1b, 0xa, 0x50, 0x29, 0x81, 0x0, 0x4, 0xa, 0x38, 0x79, + 0x30, 0x0, 0x2, 0xa, 0x59, 0xc4, 0x54, 0xf0, 0x7c, 0xab, 0xe4, 0x22, 0x7d, + 0x52, 0x7d, 0x43, 0x7e, 0x1d, 0x29, 0xb, 0x1a, 0x30, 0x5e, 0x60, 0x7, 0x7e, + 0x25, 0x2d, 0x2d, 0x23, 0x7d, 0x35, 0x2d, 0x34, 0xbe, 0x34, 0x0, 0xe0, 0x28, + 0x8, 0x9e, 0x34, 0x0, 0xe0, 0x3e, 0x34, 0x2d, 0x23, 0x2, 0x6b, 0x5f, 0x12, + 0x39, 0xab, 0x7e, 0x70, 0x3c, 0xac, 0x7f, 0x7d, 0x13, 0x2e, 0x14, 0x34, + 0xc3, 0x6d, 0x0, 0x7a, 0xd, 0x29, 0x7d, 0x13, 0x2e, 0x14, 0x34, 0xb7, 0x6d, + 0x0, 0x2e, 0x34, 0x34, 0xb9, 0x6d, 0x22, 0x12, 0x6d, 0x15, 0x7e, 0x30, 0x3c, + 0xac, 0x3f, 0x2e, 0x14, 0x34, 0xc3, 0x6d, 0x0, 0x22, 0xca, 0xf8, 0x7c, 0xab, + 0x6c, 0xff, 0x7e, 0x70, 0x8, 0xac, 0x7f, 0x19, 0xa3, 0x3, 0xac, 0xb, 0xf0, + 0xbe, 0xf0, 0x4, 0x78, 0xf0, 0x6c, 0xff, 0x74, 0x8, 0xac, 0xbf, 0x9, 0xa5, + 0x3, 0xac, 0x12, 0xf0, 0x4, 0x12, 0x6b, 0x90, 0x7d, 0x3f, 0x12, 0x6b, 0x6f, + 0x7d, 0x3e, 0xb, 0x34, 0x74, 0x3c, 0xac, 0xbf, 0x49, 0x25, 0x34, 0xb7, 0x12, + 0x6c, 0x61, 0x12, 0xef, 0x5, 0x40, 0xd9, 0xda, 0xf8, 0x22, 0xca, 0xf8, 0x7c, + 0xab, 0x6c, 0xff, 0x7e, 0x70, 0x8, 0xac, 0x7f, 0x19, 0xa3, 0x3, 0xad, 0xb, + 0xf0, 0xbe, 0xf0, 0x4, 0x78, 0xf0, 0x6c, 0xff, 0x74, 0x8, 0xac, 0xbf, 0x9, + 0xa5, 0x3, 0xad, 0x12, 0xf0, 0x4, 0x12, 0x6b, 0x84, 0x7d, 0x3f, 0x12, 0x6b, + 0x75, 0x7d, 0x3e, 0xb, 0x35, 0x74, 0x3c, 0xac, 0xbf, 0x49, 0x25, 0x34, 0xb9, + 0x12, 0x6c, 0x61, 0x12, 0xef, 0x5, 0x40, 0xd9, 0xda, 0xf8, 0x22, 0x7f, 0x21, + 0xb, 0xa, 0x20, 0x5e, 0x40, 0x7, 0xb, 0x2a, 0x10, 0x5e, 0x20, 0x7, 0x7e, + 0x2d, 0x29, 0xb, 0x2a, 0x30, 0x5e, 0x60, 0x3, 0x2d, 0x12, 0x2d, 0x13, 0x7e, + 0x24, 0x0, 0xc9, 0xbe, 0x14, 0x0, 0xb8, 0x68, 0x4, 0xbd, 0x21, 0x78, 0x2, + 0xb, 0x34, 0x22, 0x7c, 0x34, 0x7c, 0x25, 0x7c, 0xa6, 0x7c, 0x17, 0x7c, 0xb, + 0x12, 0x6f, 0xcd, 0x5e, 0x80, 0x3, 0x7c, 0xba, 0x12, 0x6f, 0xe2, 0x4d, 0x45, + 0x7c, 0xb0, 0x54, 0x3, 0xa, 0x5b, 0x12, 0x6c, 0x33, 0x4d, 0x45, 0x7c, 0xb1, + 0x54, 0x3, 0x7c, 0xb, 0x6c, 0x11, 0x3e, 0x4, 0x3e, 0x4, 0x4d, 0x40, 0x1b, + 0x1a, 0x40, 0x7e, 0x34, 0xa0, 0x14, 0xb, 0x1a, 0x40, 0x5e, 0x80, 0xc3, 0x7c, + 0xb2, 0x54, 0x3, 0xa, 0x5b, 0x12, 0x6c, 0x33, 0x2, 0x6d, 0x8a, 0x4d, 0x45, + 0x7c, 0xb3, 0x54, 0x3, 0xa, 0x5b, 0x7c, 0xab, 0xe4, 0x3e, 0x54, 0x3e, 0x54, + 0x4d, 0x45, 0x1b, 0x1a, 0x40, 0x22, 0x7e, 0xb3, 0x56, 0x21, 0x7e, 0x70, 0x2, + 0x7e, 0x60, 0x2, 0x7c, 0x36, 0x7c, 0xb7, 0x12, 0x6f, 0xcd, 0x5e, 0x80, 0xc3, + 0x54, 0x3, 0xa, 0x5b, 0x12, 0x6c, 0x33, 0x2, 0x6d, 0x8a, 0x12, 0x5f, 0x78, + 0x78, 0x7, 0xe4, 0x7a, 0xb3, 0x56, 0x21, 0x80, 0x12, 0x7e, 0xb3, 0x56, 0x21, + 0xb4, 0x2, 0x8, 0x74, 0x2, 0x7a, 0xb3, 0x56, 0x21, 0x80, 0x3, 0x12, 0x6e, + 0xb, 0x7a, 0xb3, 0x56, 0x28, 0x74, 0x2, 0x12, 0x68, 0xdb, 0x7e, 0xb3, 0x56, + 0x21, 0x24, 0x0, 0x68, 0x16, 0x24, 0xfd, 0x68, 0xf, 0xb, 0xb1, 0x78, 0x14, + 0x7e, 0xb3, 0x55, 0xf8, 0x70, 0x2, 0x80, 0xc, 0x2, 0x5d, 0xfa, 0x2, 0x6e, + 0xb, 0xe4, 0x12, 0x68, 0xdb, 0x80, 0x0, 0x2, 0x5d, 0xe0, 0x74, 0x1, 0x7a, + 0xb3, 0x56, 0x21, 0x22, 0x7e, 0xb3, 0x54, 0xf6, 0xb4, 0x1, 0x2, 0x80, 0x2, + 0xc1, 0xad, 0x7e, 0x73, 0x54, 0xf3, 0xbe, 0x73, 0x54, 0xf5, 0x28, 0x69, + 0x7e, 0x63, 0x54, 0xf5, 0x7e, 0x70, 0x9, 0xac, 0x67, 0x49, 0x53, 0x55, 0x1, + 0x7c, 0xab, 0x7e, 0x43, 0x54, 0xfe, 0x7e, 0x50, 0x2, 0xac, 0x45, 0x2d, 0x32, + 0x49, 0x33, 0x55, 0x3, 0x7a, 0x35, 0x14, 0x4d, 0x33, 0x68, 0x44, 0xd2, 0x2f, + 0x1b, 0xa0, 0x68, 0x10, 0x1b, 0xa0, 0x68, 0xc, 0x1b, 0xa0, 0x68, 0x19, 0x1b, + 0xa0, 0x68, 0x4, 0xb, 0xa2, 0x78, 0x2e, 0x12, 0x73, 0xe2, 0x30, 0x11, 0x4, + 0x74, 0x2, 0x80, 0x2, 0x74, 0x1, 0x12, 0x76, 0x92, 0x80, 0x1d, 0x12, 0x6e, + 0xae, 0x30, 0x11, 0x4, 0x74, 0x2, 0x80, 0x2, 0x74, 0x1, 0x12, 0x76, 0x92, + 0x74, 0x3, 0x7e, 0x70, 0x3, 0x6c, 0x66, 0x6c, 0x55, 0x6c, 0x44, 0x12, 0x6d, + 0x41, 0x12, 0xe2, 0x41, 0x38, 0x18, 0x74, 0x2, 0x7a, 0xb3, 0x54, 0xf6, 0x7e, + 0xb3, 0x56, 0x28, 0x70, 0xc, 0x12, 0x6d, 0x9f, 0x12, 0x5b, 0x7, 0x5e, 0x70, + 0xef, 0x1b, 0xa, 0x30, 0x22, 0xca, 0x3b, 0x7e, 0x38, 0x18, 0x80, 0x20, 0x2f, + 0x2, 0xe1, 0x80, 0xa9, 0xd7, 0xea, 0x7e, 0x97, 0x74, 0xc, 0x12, 0xf1, 0x38, + 0x60, 0x29, 0x6d, 0xbb, 0x80, 0x1d, 0x12, 0x6f, 0xa0, 0x60, 0x5, 0x3e, 0x34, + 0x14, 0x78, 0xfb, 0x12, 0x6f, 0xb1, 0x68, 0x5, 0x12, 0x6f, 0x83, 0x80, 0x7, + 0x6d, 0x88, 0x12, 0x6f, 0x92, 0xb, 0xa4, 0xb, 0xb4, 0xbe, 0xb4, 0x0, 0x0, + 0x40, 0xdd, 0x80, 0x22, 0x6d, 0xbb, 0x12, 0x6f, 0xa0, 0x60, 0x5, 0x3e, 0x34, + 0x14, 0x78, 0xfb, 0x12, 0x6f, 0xba, 0x68, 0x5, 0x12, 0x6f, 0x83, 0x80, 0x7, + 0x6d, 0x88, 0x12, 0x6f, 0x92, 0xb, 0xa4, 0x12, 0x4f, 0x41, 0x78, 0xe0, 0x7f, + 0x3, 0x2e, 0x14, 0x0, 0x0, 0x7d, 0x8a, 0x3e, 0x84, 0x7e, 0x1f, 0x35, 0xa5, + 0x2d, 0x38, 0x12, 0x73, 0xb0, 0x7e, 0x87, 0x74, 0xc, 0x2d, 0xa8, 0x90, 0x1, + 0x90, 0xe4, 0x93, 0x60, 0x24, 0x6d, 0xbb, 0x12, 0x6f, 0xa0, 0x60, 0x5, 0x3e, + 0x34, 0x14, 0x78, 0xfb, 0x12, 0x6f, 0xba, 0x68, 0x5, 0x12, 0x6f, 0x83, 0x80, + 0x7, 0x6d, 0x88, 0x12, 0x6f, 0x92, 0xb, 0xa4, 0x12, 0x4f, 0x41, 0x78, 0xe0, + 0x80, 0x27, 0x6d, 0xbb, 0x80, 0x1d, 0x12, 0x6f, 0xa0, 0x60, 0x5, 0x3e, 0x34, + 0x14, 0x78, 0xfb, 0x12, 0x6f, 0xb1, 0x68, 0x5, 0x12, 0x6f, 0x83, 0x80, 0x7, + 0x6d, 0x88, 0x12, 0x6f, 0x92, 0xb, 0xa4, 0xb, 0xb4, 0xbe, 0xb4, 0x0, 0x0, + 0x40, 0xdd, 0xa9, 0xc7, 0xea, 0xc2, 0x2f, 0xda, 0x3b, 0x22, 0x7d, 0x8a, 0xb, + 0xa4, 0x3e, 0x84, 0x7e, 0x1f, 0x35, 0xa5, 0x2d, 0x38, 0xb, 0x1a, 0x80, 0x7d, + 0x39, 0xb, 0x94, 0x3e, 0x34, 0x2d, 0x37, 0x7d, 0x26, 0x1b, 0x1a, 0x80, 0x22, + 0x7d, 0x3b, 0x7c, 0xb7, 0x7e, 0x34, 0x0, 0x1, 0x22, 0x12, 0x6b, 0xf0, 0x79, + 0x50, 0x0, 0x4, 0x22, 0x7e, 0x53, 0x68, 0xab, 0xa, 0x85, 0x5d, 0x83, 0x22, + 0x7e, 0x53, 0x68, 0xaa, 0xa, 0x85, 0x5d, 0x83, 0x22, 0x7d, 0x23, 0xb, 0xa, + 0x30, 0x5e, 0x34, 0xf8, 0x0, 0x22, 0x7e, 0x34, 0xa0, 0x12, 0x6d, 0x22, 0xb, + 0x1a, 0x40, 0x22, 0x7c, 0x8b, 0x74, 0x8, 0xac, 0xb8, 0x9, 0x95, 0x3, 0xb0, + 0x22, 0x54, 0x3, 0xa, 0x5b, 0x3, 0x3, 0x54, 0xc0, 0x7c, 0xab, 0xe4, 0x22, + 0x12, 0x6f, 0xc5, 0x1b, 0xa, 0x30, 0x4e, 0x70, 0x8, 0x1b, 0xa, 0x30, 0x22, + 0x54, 0x3, 0xa, 0x3b, 0x7d, 0x23, 0x7c, 0x45, 0x6c, 0x55, 0x3e, 0x24, 0x3e, + 0x24, 0x22, 0x7e, 0xb3, 0x56, 0x28, 0x70, 0xe, 0x74, 0x14, 0x7a, 0xb3, 0x39, + 0xca, 0x74, 0x13, 0x7a, 0xb3, 0x39, 0xa5, 0x80, 0x10, 0x7e, 0x73, 0x39, + 0xb0, 0x7a, 0x73, 0x39, 0xca, 0xa, 0x37, 0x1b, 0x34, 0x7a, 0x73, 0x39, 0xa5, + 0xe4, 0x7a, 0xb3, 0x39, 0xa7, 0x22, 0xca, 0x79, 0x7e, 0x73, 0x68, 0xa7, + 0x7e, 0xf3, 0x68, 0xa6, 0xac, 0xf7, 0xd2, 0x2, 0x12, 0x46, 0xb8, 0x12, 0x90, + 0xff, 0x12, 0x70, 0xa, 0xc2, 0x0, 0x12, 0x39, 0xb4, 0xd2, 0xac, 0xc2, 0xa8, + 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xd5, 0x12, 0x77, 0xc1, 0x12, 0x4b, 0xa4, 0xd2, + 0x0, 0x12, 0x39, 0xb4, 0x7e, 0xb3, 0x54, 0x6f, 0xb4, 0x1, 0x45, 0x20, 0x11, + 0x42, 0x6d, 0xff, 0x80, 0x3a, 0x7d, 0xbf, 0x3e, 0xb4, 0x49, 0xeb, 0x3a, 0x0, + 0x7d, 0x3e, 0x1a, 0x26, 0x1a, 0x24, 0x7e, 0x14, 0x0, 0x46, 0x12, 0x2a, 0x31, + 0x7e, 0x8, 0x0, 0x44, 0x12, 0x2a, 0x8d, 0x7f, 0x61, 0x9e, 0x68, 0x0, 0x78, + 0xbe, 0xe4, 0x0, 0x1e, 0x8, 0xa, 0xbe, 0x68, 0x0, 0x32, 0x18, 0x4, 0x7e, + 0x68, 0x0, 0x32, 0x7d, 0xed, 0x59, 0xeb, 0x3a, 0x0, 0xb, 0xf4, 0xbd, 0x7f, + 0x38, 0xc2, 0x12, 0x70, 0xc1, 0x12, 0x50, 0x42, 0x7e, 0x34, 0x0, 0xc8, 0x12, + 0x58, 0x3d, 0xda, 0x79, 0x22, 0x12, 0xf1, 0xc0, 0x74, 0xaa, 0x7a, 0xb3, + 0x54, 0x70, 0xe4, 0x7a, 0xb3, 0x54, 0x6f, 0x7a, 0xb3, 0x39, 0xd5, 0xc2, + 0x1b, 0x7e, 0xb3, 0x56, 0x28, 0xb4, 0x1, 0x3, 0x12, 0x70, 0xe4, 0xd2, 0xac, + 0xd2, 0xa8, 0x22, 0xa9, 0xd0, 0x9e, 0xa9, 0xd7, 0x9e, 0x22, 0xd2, 0x0, 0x12, + 0x71, 0x15, 0xa9, 0xd0, 0xcb, 0x75, 0x9f, 0x0, 0xa9, 0xd0, 0x9e, 0xa9, 0xd4, + 0x9e, 0x7e, 0x37, 0x56, 0x25, 0xa, 0x56, 0xf5, 0x9d, 0x7d, 0x53, 0xf5, 0x9c, + 0xa9, 0xd3, 0x9e, 0xc2, 0x8a, 0xd2, 0xaa, 0xa9, 0xc1, 0x9e, 0x2, 0x70, 0xe4, + 0xa9, 0xd0, 0xce, 0x30, 0x0, 0x4, 0xa9, 0xd5, 0xc9, 0x22, 0xa9, 0xc5, 0xc9, + 0x22, 0xe4, 0x12, 0x71, 0xcc, 0x12, 0xe1, 0xb5, 0x12, 0xdf, 0xe1, 0x12, + 0x71, 0xc1, 0x12, 0x72, 0x4c, 0x12, 0x5a, 0xa4, 0x12, 0x77, 0xac, 0x12, + 0x77, 0xd0, 0x12, 0x0, 0x66, 0x12, 0x77, 0xa0, 0x12, 0x77, 0xa5, 0x12, 0x0, + 0x46, 0x12, 0xdf, 0xf4, 0x12, 0xdf, 0xfe, 0x12, 0xe0, 0xe, 0x12, 0x71, 0xa6, + 0x12, 0x72, 0x79, 0x12, 0xe0, 0x20, 0x12, 0x70, 0xeb, 0x12, 0x75, 0x8a, + 0xd2, 0xaf, 0x90, 0x1, 0x8a, 0xe4, 0x93, 0xca, 0xb8, 0x12, 0x71, 0x9e, 0x7e, + 0x24, 0x43, 0x31, 0xda, 0xb8, 0x12, 0x71, 0xec, 0x90, 0x1, 0x8a, 0xe4, 0x93, + 0xca, 0xb8, 0x12, 0x71, 0x9e, 0x7e, 0x24, 0x41, 0x21, 0xda, 0xb8, 0x12, + 0x72, 0x8, 0x2, 0x71, 0x8b, 0xa9, 0x27, 0xc1, 0xe, 0x7e, 0x34, 0xf3, 0x1e, + 0x12, 0x59, 0x1e, 0x7e, 0x34, 0xf4, 0xc1, 0x2, 0x47, 0xd1, 0x22, 0x90, 0x1, + 0x8b, 0xe4, 0x93, 0x7c, 0x7b, 0x22, 0x12, 0x0, 0x56, 0xe4, 0x7e, 0x34, 0x1, + 0xf4, 0x2, 0x71, 0xb1, 0x7c, 0xab, 0x74, 0x2, 0xa4, 0x7e, 0xf, 0x56, 0xb2, + 0x2d, 0x15, 0x79, 0x30, 0x0, 0x10, 0x22, 0xc2, 0x8d, 0xc2, 0x8f, 0x12, 0x72, + 0xcb, 0xa9, 0xc0, 0x93, 0x22, 0xd2, 0xcf, 0xa9, 0xc7, 0xcb, 0xbe, 0xb0, 0x8, + 0x50, 0x2, 0xf5, 0xcc, 0x75, 0xe6, 0x0, 0xc2, 0x0, 0x2, 0x71, 0xe0, 0xa9, + 0xd5, 0xc3, 0x12, 0x5e, 0x17, 0xa2, 0x0, 0xa9, 0x97, 0xc1, 0x22, 0x54, 0x3f, + 0x5e, 0x70, 0x3f, 0x12, 0x72, 0x34, 0x7e, 0x17, 0x56, 0xba, 0x59, 0x31, 0x0, + 0x32, 0x7e, 0x37, 0x56, 0xba, 0x59, 0x23, 0x0, 0x14, 0xa9, 0xc6, 0xcb, 0x22, + 0x12, 0x72, 0x34, 0x7e, 0x17, 0x56, 0xba, 0x59, 0x31, 0x0, 0x3e, 0x7e, 0x37, + 0x56, 0xba, 0x59, 0x23, 0x0, 0x3c, 0x12, 0x72, 0x28, 0x4e, 0x70, 0x10, 0x1b, + 0x28, 0x30, 0xa9, 0xc6, 0xcb, 0x22, 0x7e, 0x27, 0x56, 0xba, 0x2e, 0x24, 0x0, + 0x38, 0xb, 0x28, 0x30, 0x22, 0xa9, 0xd6, 0xcb, 0x7e, 0x14, 0x0, 0x21, 0x7e, + 0x7, 0x56, 0xba, 0x59, 0x10, 0x0, 0x2, 0x7c, 0x2b, 0x6c, 0x33, 0xa, 0x37, + 0x2d, 0x31, 0x22, 0xd2, 0xcc, 0x12, 0xef, 0x6b, 0x12, 0xef, 0x51, 0x78, + 0xfb, 0x7e, 0x34, 0x0, 0x3, 0x1b, 0xa, 0x30, 0x7e, 0x34, 0x0, 0x81, 0x7e, + 0xf, 0x56, 0xad, 0x79, 0x30, 0x0, 0x2, 0xd2, 0xeb, 0xc2, 0xc3, 0x6d, 0x11, + 0x7e, 0x1f, 0x56, 0xad, 0x1b, 0x1a, 0x10, 0xc2, 0xcc, 0x22, 0xe4, 0x7a, + 0xb3, 0x54, 0x60, 0x7e, 0xb3, 0x54, 0xc2, 0x54, 0xfb, 0x7a, 0xb3, 0x54, + 0xc2, 0x7e, 0x8, 0x2, 0xf3, 0x12, 0x8c, 0xe6, 0x7e, 0x8, 0x3, 0x4d, 0x7e, + 0x34, 0x0, 0x3e, 0x12, 0x0, 0x2e, 0x7e, 0x18, 0x2, 0xf3, 0x7a, 0x1f, 0x3, + 0xa7, 0x75, 0x8, 0x0, 0x75, 0xf, 0x0, 0x7e, 0xb3, 0x54, 0x60, 0xf5, 0x91, + 0x2, 0x72, 0xb1, 0x12, 0x72, 0xcb, 0x90, 0x1, 0x20, 0xe4, 0x93, 0x54, 0xfe, + 0xf5, 0x92, 0xd2, 0xe8, 0xc2, 0xc0, 0xa9, 0xd4, 0x95, 0xd2, 0xad, 0xd2, + 0x97, 0xd2, 0x94, 0x22, 0x75, 0x91, 0x0, 0xc2, 0x90, 0xc2, 0x91, 0x22, 0x7e, + 0xa1, 0xcd, 0x12, 0x73, 0x60, 0x7d, 0x43, 0x5e, 0x44, 0x80, 0x0, 0x75, 0xcd, + 0x0, 0x5e, 0x60, 0x7f, 0x1b, 0x28, 0x30, 0xc2, 0xaf, 0x80, 0x2, 0xd2, 0xaf, + 0x7e, 0xb3, 0x54, 0xc2, 0x20, 0xe2, 0xf7, 0x12, 0x72, 0x28, 0x4e, 0x70, 0x1, + 0x1b, 0x28, 0x30, 0x6c, 0x33, 0x0, 0xb, 0x30, 0xa5, 0xbb, 0x8, 0xf9, 0xd2, + 0xaf, 0x80, 0x31, 0x12, 0x73, 0x68, 0x5e, 0x4, 0x0, 0x20, 0xbe, 0x4, 0x0, + 0x20, 0x78, 0x24, 0xc2, 0xaf, 0x80, 0x2, 0xd2, 0xaf, 0x7e, 0xb3, 0x54, 0xc2, + 0x20, 0xe2, 0xf7, 0x2e, 0x24, 0x0, 0x38, 0x4e, 0x70, 0x2, 0x1b, 0x28, 0x30, + 0xd2, 0x31, 0x6c, 0x33, 0x0, 0xb, 0x30, 0xa5, 0xbb, 0x8, 0xf9, 0xd2, 0xaf, + 0x12, 0x73, 0x68, 0x5e, 0x4, 0x0, 0x80, 0x68, 0xc6, 0x2e, 0x24, 0x0, 0x38, + 0x4e, 0x70, 0x4, 0x1b, 0x28, 0x30, 0x4d, 0x44, 0x68, 0x9, 0x12, 0x73, 0x60, + 0x4e, 0x60, 0x80, 0x1b, 0x28, 0x30, 0x7a, 0xa1, 0xcd, 0x22, 0x7e, 0x27, + 0x56, 0xba, 0xb, 0x28, 0x30, 0x22, 0x7e, 0x27, 0x56, 0xba, 0x49, 0x32, 0x0, + 0x38, 0x7d, 0x3, 0x22, 0xa9, 0xa6, 0xcb, 0x92, 0x8, 0x12, 0x77, 0xc8, 0x7e, + 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, 0x46, 0x69, 0x30, 0x0, 0x8, 0x7e, 0x27, + 0x56, 0xba, 0x59, 0x32, 0x0, 0x4a, 0x12, 0xef, 0xb9, 0x59, 0x32, 0x0, 0x42, + 0x29, 0xb0, 0x0, 0x3, 0x54, 0x1, 0x12, 0x6f, 0xe4, 0x7e, 0x47, 0x56, 0xba, + 0x59, 0x54, 0x0, 0x4c, 0x12, 0x72, 0xd3, 0xa2, 0x8, 0xa9, 0x96, 0xcb, 0x22, + 0x7f, 0x61, 0x7f, 0x70, 0x7e, 0x8, 0x34, 0x17, 0x12, 0x97, 0xed, 0x7e, 0x73, + 0x68, 0xa7, 0x7a, 0x73, 0x34, 0x18, 0x7e, 0x73, 0x68, 0xa6, 0x7a, 0x73, + 0x34, 0x17, 0x7a, 0xb3, 0x34, 0x1a, 0x7d, 0x3d, 0x7a, 0x37, 0x34, 0x1b, + 0x7d, 0x3f, 0x7a, 0x37, 0x34, 0x1f, 0x7e, 0x8, 0x34, 0x17, 0x2, 0x73, 0x73, + 0xca, 0xd8, 0xca, 0x79, 0x7e, 0x35, 0x14, 0x6d, 0x22, 0x7f, 0x41, 0x7e, + 0xd3, 0x54, 0xfe, 0x20, 0x2f, 0x2, 0xa1, 0x23, 0xa9, 0xd7, 0xea, 0x7e, 0x77, + 0x74, 0xc, 0x12, 0xf1, 0x38, 0x60, 0x3f, 0x6d, 0xbb, 0x7d, 0x1b, 0x12, 0x75, + 0x2c, 0x2d, 0x21, 0x59, 0x32, 0x34, 0x97, 0x12, 0x4f, 0x48, 0x78, 0xf0, + 0x6d, 0xbb, 0x80, 0x21, 0x12, 0x75, 0x81, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, + 0xfb, 0x7e, 0x73, 0x68, 0xab, 0x12, 0x46, 0x42, 0x68, 0x5, 0x12, 0x75, 0x5b, + 0x80, 0x7, 0x6d, 0x11, 0x12, 0x75, 0x6a, 0xb, 0xa4, 0xb, 0xb4, 0xbe, 0xb4, + 0x0, 0x0, 0x40, 0xd9, 0x80, 0x38, 0x6d, 0xbb, 0x7d, 0x1b, 0x12, 0x75, 0x2c, + 0x2d, 0x21, 0x59, 0x32, 0x34, 0x8d, 0x12, 0x4f, 0x48, 0x78, 0xf0, 0x6d, + 0xbb, 0x12, 0x75, 0x81, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7e, 0x73, + 0x68, 0xaa, 0x12, 0x46, 0x42, 0x68, 0x5, 0x12, 0x75, 0x5b, 0x80, 0x7, 0x6d, + 0x11, 0x12, 0x75, 0x6a, 0xb, 0xa4, 0x12, 0x4f, 0x41, 0x78, 0xdc, 0x7f, 0x4, + 0x2e, 0x14, 0x0, 0x0, 0x7d, 0x5a, 0x3e, 0x54, 0x7e, 0x1f, 0x35, 0xa5, 0x2d, + 0x35, 0x12, 0x73, 0xb0, 0x7e, 0x37, 0x74, 0xc, 0x2d, 0xa3, 0x90, 0x1, 0x90, + 0xe4, 0x93, 0x60, 0x41, 0x6d, 0x33, 0x7d, 0xb3, 0x12, 0x75, 0x78, 0x60, 0x5, + 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x7e, 0x53, 0x68, 0xaa, 0x6c, 0x44, 0x5c, + 0x53, 0x4d, 0x22, 0x68, 0x5, 0x12, 0x75, 0x3e, 0x80, 0x7, 0x6d, 0x22, 0x12, + 0x75, 0x4d, 0xb, 0xa4, 0x12, 0x4f, 0x41, 0x78, 0xd9, 0x7d, 0xb3, 0x12, 0x75, + 0x28, 0x7d, 0x1b, 0x3e, 0x14, 0x2d, 0x21, 0x59, 0x32, 0x34, 0x8d, 0x12, + 0x4f, 0x48, 0x78, 0xee, 0x80, 0x44, 0x6d, 0x33, 0x7d, 0xb3, 0x80, 0x24, + 0x12, 0x75, 0x78, 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x7e, 0x53, 0x68, + 0xab, 0x6c, 0x44, 0x5c, 0x53, 0x4d, 0x22, 0x68, 0x5, 0x12, 0x75, 0x3e, 0x80, + 0x7, 0x6d, 0x22, 0x12, 0x75, 0x4d, 0xb, 0xa4, 0xb, 0xb4, 0xbe, 0xb4, 0x0, + 0x0, 0x40, 0xd6, 0x7d, 0xb3, 0x12, 0x75, 0x28, 0x7d, 0x1b, 0x3e, 0x14, 0x2d, + 0x21, 0x59, 0x32, 0x34, 0x97, 0x12, 0x4f, 0x48, 0x78, 0xee, 0xa9, 0xc7, + 0xea, 0xc2, 0x2f, 0xda, 0x79, 0xda, 0xd8, 0x22, 0x7d, 0x1b, 0x2d, 0x1a, + 0x3e, 0x14, 0x7e, 0x1f, 0x35, 0xa5, 0x2d, 0x31, 0x69, 0x31, 0x0, 0x6, 0x7e, + 0x50, 0x14, 0xac, 0x5d, 0x22, 0x7d, 0x2a, 0xb, 0xa4, 0x3e, 0x24, 0x7e, 0xf, + 0x35, 0xa5, 0x2d, 0x12, 0xb, 0xa, 0x20, 0x7d, 0x17, 0xb, 0x74, 0x3e, 0x14, + 0x2d, 0x19, 0x7d, 0x8, 0x1b, 0xa, 0x20, 0x22, 0x7d, 0x1a, 0xb, 0xa4, 0x3e, + 0x14, 0x7e, 0x1f, 0x35, 0xa5, 0x2d, 0x31, 0xb, 0x1a, 0x10, 0x7d, 0x7, 0xb, + 0x74, 0x3e, 0x4, 0x7f, 0x14, 0x2d, 0x30, 0x1b, 0x1a, 0x10, 0x22, 0x7d, 0x2b, + 0x7c, 0xb5, 0x7e, 0x14, 0x0, 0x1, 0x22, 0x7d, 0x3b, 0x7c, 0xb7, 0x7e, 0x24, + 0x0, 0x1, 0x22, 0xa9, 0xd2, 0xea, 0xa9, 0xc2, 0xea, 0x7e, 0x34, 0x70, 0x43, + 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0xe, 0x7e, 0x34, 0x0, 0x4e, 0x7e, + 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x10, 0x12, 0xef, 0x9e, 0x7e, 0xf, 0x39, + 0xfc, 0x79, 0x30, 0x0, 0x24, 0x12, 0x77, 0xeb, 0x7e, 0x34, 0x80, 0x12, 0x7e, + 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x26, 0x90, 0x1, 0x90, 0xe4, 0x93, 0x60, + 0xe, 0x7e, 0x34, 0x1, 0x9b, 0x12, 0x32, 0xdf, 0x12, 0x76, 0x85, 0x6d, 0x33, + 0x80, 0x10, 0x6d, 0x33, 0x12, 0x76, 0x89, 0x7e, 0x34, 0x1, 0x99, 0x12, 0x32, + 0xdf, 0x2e, 0x34, 0x0, 0x9, 0x12, 0x77, 0xe2, 0x7e, 0x34, 0xff, 0xff, 0x12, + 0xf1, 0xa5, 0x12, 0x77, 0xd9, 0x7e, 0x34, 0x0, 0x14, 0x7e, 0xf, 0x39, 0xfc, + 0x79, 0x30, 0x0, 0x1e, 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x20, 0x6d, + 0x33, 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x22, 0x7e, 0x34, 0x0, 0x1f, + 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x28, 0x7e, 0x34, 0x8, 0x30, 0x7e, + 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x48, 0x7e, 0x34, 0x7, 0x3, 0x7e, 0xf, + 0x39, 0xfc, 0x79, 0x30, 0x0, 0x4a, 0x7e, 0x34, 0x7f, 0x33, 0x12, 0x64, 0x2, + 0x12, 0x76, 0x9c, 0x7e, 0x34, 0xff, 0xff, 0x12, 0x5b, 0x91, 0x7e, 0x34, + 0xf0, 0x7f, 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x4, 0xd2, 0x2, 0x12, + 0x2f, 0xd7, 0x75, 0xc2, 0x0, 0xa9, 0xd6, 0xc2, 0xa9, 0xd5, 0xc2, 0x53, 0xc3, + 0xf8, 0x43, 0xc3, 0x3, 0x75, 0xc4, 0x0, 0x75, 0xc5, 0x0, 0x75, 0xc6, 0x90, + 0x75, 0xc7, 0x0, 0xa9, 0xd2, 0xc2, 0xd2, 0xac, 0xa9, 0xc7, 0xea, 0x90, 0xd, + 0xd, 0xe4, 0x93, 0x7a, 0xb3, 0x55, 0xf8, 0x22, 0x2e, 0x34, 0x0, 0x9, 0x7e, + 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x16, 0x22, 0x7e, 0xa3, 0x54, 0xfe, 0xa, + 0x3a, 0x19, 0xb3, 0x54, 0xf7, 0xa2, 0xac, 0x92, 0xc, 0x7e, 0xf, 0x39, 0xfc, + 0xb, 0xa, 0x30, 0x5e, 0x34, 0x10, 0x0, 0x68, 0x8, 0x7e, 0x34, 0x10, 0x0, + 0x79, 0x30, 0x0, 0x2, 0x12, 0x77, 0xb3, 0x12, 0xf0, 0xcf, 0x1b, 0xa, 0x30, + 0xa2, 0xc, 0x92, 0xac, 0x22, 0x7c, 0x7b, 0x7e, 0xa0, 0xff, 0x7c, 0xb7, 0x24, + 0x8c, 0x68, 0x24, 0x24, 0xfb, 0x68, 0x30, 0x14, 0x68, 0x4b, 0x14, 0x68, + 0x35, 0x14, 0x68, 0x4a, 0x14, 0x68, 0x47, 0x24, 0x7, 0x78, 0x6f, 0x7e, 0x1f, + 0x39, 0xfc, 0x69, 0x51, 0x0, 0xe, 0x5e, 0x54, 0x0, 0x4, 0x7c, 0xab, 0x80, + 0x5f, 0x7e, 0x1f, 0x39, 0xfc, 0x69, 0x51, 0x0, 0x6, 0x5e, 0x54, 0x0, 0x1, + 0x7c, 0xab, 0x80, 0x4f, 0x12, 0x77, 0x54, 0x5e, 0x34, 0x4, 0x0, 0xa, 0x56, + 0x80, 0xb, 0x12, 0x77, 0x54, 0x5e, 0x34, 0x8, 0x0, 0xa, 0x56, 0x1e, 0x54, + 0x1e, 0x54, 0x1e, 0x54, 0x7c, 0xab, 0x80, 0x31, 0x7e, 0xa1, 0xef, 0x80, + 0x2c, 0x7e, 0x63, 0x55, 0xf5, 0x7c, 0xb6, 0x4, 0x7a, 0xb3, 0x55, 0xf5, 0xa, + 0x26, 0x9, 0xa2, 0x56, 0x1, 0x7e, 0xb3, 0x54, 0x86, 0x4, 0x7a, 0xb3, 0x54, + 0x86, 0x70, 0x9, 0x7e, 0xb3, 0x54, 0x85, 0x4, 0x7a, 0xb3, 0x54, 0x85, 0xa5, + 0xbf, 0x7d, 0x3, 0x75, 0xf, 0x7c, 0x7c, 0xba, 0x22, 0x7e, 0x1f, 0x39, 0xfc, + 0x69, 0x31, 0x0, 0x6, 0x22, 0x24, 0x8a, 0x78, 0x19, 0x7e, 0xf, 0x39, 0xfc, + 0xa5, 0xbf, 0x0, 0x8, 0x12, 0x5b, 0xb, 0x5e, 0x70, 0xfb, 0x80, 0x6, 0x12, + 0x5b, 0xb, 0x4e, 0x70, 0x4, 0x1b, 0xa, 0x30, 0x22, 0x12, 0x77, 0xf4, 0x7e, + 0x73, 0x55, 0xf7, 0x7a, 0x73, 0x54, 0x67, 0x7e, 0xb3, 0x54, 0xbc, 0x70, 0x5, + 0x12, 0x77, 0xba, 0x80, 0x3, 0x12, 0xf1, 0xd2, 0xe4, 0x7a, 0xb3, 0x68, 0x7a, + 0x7a, 0xb3, 0x68, 0x79, 0x2, 0x34, 0x3, 0xd2, 0xe9, 0xc2, 0xc1, 0x22, 0xa9, + 0xd6, 0xcd, 0xa9, 0xd5, 0xcd, 0x22, 0xa9, 0xd0, 0x99, 0xa9, 0xc6, 0xdf, + 0x22, 0xc2, 0xac, 0x7e, 0xf, 0x39, 0xfc, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x74, + 0x9, 0x22, 0x6d, 0x33, 0x7a, 0x37, 0x39, 0xea, 0x22, 0xa9, 0xd6, 0xcb, 0x69, + 0x30, 0x0, 0x4, 0x22, 0x7e, 0x34, 0xb4, 0x80, 0x74, 0xa, 0x2, 0x47, 0xd1, + 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x1c, 0x22, 0x7e, 0xf, 0x39, 0xfc, + 0x79, 0x30, 0x0, 0x18, 0x22, 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x14, + 0x22, 0x7e, 0x73, 0x56, 0x28, 0x7a, 0x73, 0x54, 0x6c, 0x22, 0x7e, 0x63, + 0x54, 0x91, 0x7e, 0x70, 0x8, 0xac, 0x67, 0xb, 0x36, 0x7e, 0x43, 0x54, 0x92, + 0x7e, 0x50, 0x8, 0xac, 0x45, 0xb, 0x26, 0x7e, 0xb3, 0x56, 0x28, 0x60, 0x28, + 0x12, 0x78, 0x42, 0x7d, 0x53, 0x3e, 0x54, 0x7e, 0x44, 0x0, 0xa, 0x8d, 0x54, + 0x1b, 0x54, 0x7c, 0xab, 0x7e, 0xb3, 0x54, 0x96, 0xbc, 0xba, 0x28, 0xf, 0x7a, + 0xa3, 0x54, 0x96, 0x7e, 0x37, 0x39, 0xcb, 0x4e, 0x70, 0x4, 0x7a, 0x37, 0x39, + 0xcb, 0x22, 0x7d, 0x12, 0x2d, 0x13, 0x3e, 0x14, 0x6d, 0x0, 0x7e, 0x18, 0xbb, + 0x80, 0x2, 0x2a, 0x8d, 0x7e, 0xb3, 0x56, 0x28, 0x70, 0x2, 0x80, 0xe, 0xb4, + 0x1, 0xb, 0x7e, 0xb3, 0x55, 0xf8, 0xb4, 0x1, 0x4, 0xd2, 0x1b, 0x80, 0x3, + 0x12, 0x2f, 0xa5, 0x7e, 0xb3, 0x39, 0xd5, 0xb4, 0x2, 0xf9, 0x74, 0x1, 0x7a, + 0xb3, 0x39, 0xd5, 0x22, 0xe4, 0x7a, 0xb3, 0x54, 0x13, 0x12, 0x0, 0x40, 0x12, + 0x78, 0x8d, 0x7e, 0xb3, 0x54, 0x12, 0xb4, 0x1, 0x2, 0xd2, 0x86, 0x22, 0x12, + 0x6e, 0xb, 0x7a, 0xb3, 0x56, 0x28, 0x7e, 0xb3, 0x55, 0xf8, 0xb4, 0x1, 0x5, + 0x12, 0x5d, 0xfa, 0x80, 0x7, 0x7e, 0x34, 0x0, 0x2, 0x12, 0x79, 0x52, 0x7e, + 0xb3, 0x56, 0x28, 0x2, 0x79, 0x0, 0x30, 0x16, 0x7, 0xd2, 0x18, 0xc2, 0x16, + 0x2, 0x78, 0xd8, 0x30, 0x19, 0x10, 0x12, 0xf0, 0xf9, 0x68, 0x14, 0x12, 0x78, + 0x8d, 0x7e, 0xb3, 0x56, 0x8d, 0x70, 0xfa, 0x80, 0x9, 0x30, 0x18, 0x6, 0x7e, + 0xb3, 0x56, 0x28, 0x70, 0x3, 0x2, 0x46, 0x8f, 0x22, 0x7e, 0xb3, 0x55, 0xf8, + 0xb4, 0x1, 0xf, 0x74, 0x2, 0x7a, 0xb3, 0x56, 0x21, 0x7a, 0xb3, 0x56, 0x28, + 0x12, 0x5d, 0xe0, 0x80, 0x7, 0x7e, 0x34, 0x0, 0x1, 0x12, 0x79, 0x52, 0x7e, + 0xb3, 0x56, 0x28, 0x2, 0x79, 0x0, 0x7e, 0xb3, 0x56, 0x28, 0x7c, 0xab, 0x12, + 0x7a, 0x5, 0x1b, 0xa0, 0x68, 0x11, 0x1b, 0xa0, 0x68, 0x15, 0x1b, 0xa1, 0x68, + 0x16, 0xb, 0xa2, 0x78, 0x15, 0x12, 0x79, 0x5e, 0x80, 0x10, 0x12, 0x79, 0x8a, + 0x12, 0x79, 0xa6, 0x80, 0x8, 0x12, 0x79, 0x77, 0x80, 0x3, 0x12, 0x79, 0xec, + 0x2, 0x79, 0x2d, 0xe4, 0x7a, 0xb3, 0x55, 0x0, 0x6c, 0xaa, 0x80, 0x13, 0x7e, + 0x70, 0x9, 0xac, 0x7a, 0x9, 0xb3, 0x55, 0x9, 0x2e, 0xb3, 0x55, 0x0, 0x7a, + 0xb3, 0x55, 0x0, 0xb, 0xa0, 0x7e, 0xb3, 0x54, 0xf3, 0xbc, 0xba, 0x38, 0xe5, + 0x22, 0x7e, 0xa3, 0x56, 0x28, 0x74, 0xb, 0xa4, 0x59, 0x35, 0x54, 0xc7, 0x22, + 0x6d, 0x33, 0x12, 0x79, 0x9d, 0x7e, 0x57, 0x54, 0xc7, 0x12, 0x79, 0xbb, + 0xe4, 0x2, 0x79, 0x6e, 0x7a, 0xb3, 0x54, 0xfa, 0x7a, 0xb3, 0x54, 0xfb, 0x22, + 0x7e, 0x34, 0x0, 0x2, 0x12, 0x79, 0x9d, 0x7e, 0x57, 0x54, 0xdd, 0x12, 0x79, + 0xbb, 0x74, 0x2, 0x2, 0x79, 0x6e, 0x7e, 0x34, 0x0, 0x1, 0x12, 0x79, 0x9d, + 0x7e, 0x57, 0x54, 0xd2, 0x12, 0x79, 0xbb, 0x74, 0x1, 0x2, 0x79, 0x6e, 0x7e, + 0x24, 0xe, 0x40, 0x7e, 0x14, 0x13, 0x60, 0x22, 0x7e, 0x34, 0x0, 0x3, 0x12, + 0x79, 0x9d, 0x7e, 0x57, 0x54, 0xe8, 0x12, 0x79, 0xbb, 0x74, 0x3, 0x7a, 0xb3, + 0x54, 0xfc, 0x22, 0x7c, 0x1b, 0x7d, 0x43, 0x7e, 0xa3, 0x54, 0xf3, 0xbe, + 0xa0, 0x5, 0x50, 0x22, 0x7e, 0x70, 0x9, 0xac, 0x7a, 0x59, 0x43, 0x55, 0x1, + 0x59, 0x23, 0x55, 0x3, 0x59, 0x13, 0x55, 0x5, 0x59, 0x23, 0x55, 0x7, 0x19, + 0x13, 0x55, 0x9, 0x7c, 0xba, 0x4, 0x7a, 0xb3, 0x54, 0xf3, 0xc3, 0x22, 0xd3, + 0x22, 0x7e, 0x34, 0x0, 0x4, 0x12, 0x79, 0x9d, 0x74, 0x1, 0x12, 0x79, 0xbb, + 0x7e, 0x73, 0x56, 0x21, 0x7a, 0x73, 0x54, 0xfa, 0x7a, 0x73, 0x54, 0xfb, + 0x22, 0xe4, 0x7a, 0xb3, 0x54, 0xf3, 0x12, 0xf1, 0x5, 0x7a, 0xb3, 0x54, 0xf6, + 0x12, 0xef, 0x39, 0x7a, 0xb3, 0x54, 0xff, 0x7a, 0xb3, 0x55, 0x0, 0x22, 0x7c, + 0xb, 0xc2, 0x0, 0xd2, 0x1, 0x6d, 0x33, 0x7a, 0x37, 0x55, 0xf0, 0x7e, 0xb3, + 0x56, 0x28, 0xb4, 0x1, 0x7, 0xd2, 0x0, 0x74, 0x4, 0x12, 0x79, 0x0, 0xd2, + 0x1, 0x30, 0x1, 0x5, 0x7c, 0xb0, 0x12, 0x43, 0x1d, 0x30, 0x0, 0x3, 0x12, + 0x78, 0xfc, 0xa2, 0x1, 0x22, 0xca, 0xf8, 0x7e, 0xf3, 0x56, 0x21, 0x20, 0xd, + 0x3, 0x30, 0xe, 0x3, 0xc3, 0x80, 0x57, 0xc2, 0x30, 0x12, 0x7a, 0xb3, 0x60, + 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x7e, 0x53, 0x74, 0xa, 0x6c, 0x44, 0x5c, + 0x57, 0x4d, 0x22, 0x68, 0x3e, 0x4e, 0x73, 0x74, 0xb, 0x7a, 0x73, 0x74, 0xb, + 0xd2, 0x2, 0x12, 0x46, 0xb8, 0x7c, 0xbf, 0x12, 0x7a, 0x1d, 0x40, 0x3, 0xc3, + 0x80, 0x28, 0x20, 0xd, 0x6, 0x20, 0xe, 0x3, 0x30, 0x30, 0x3, 0xc3, 0x80, + 0x1c, 0x12, 0x7a, 0xb3, 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x6e, 0x70, + 0xff, 0x5e, 0x73, 0x74, 0xa, 0x7a, 0x73, 0x74, 0xa, 0x12, 0x7f, 0xfd, 0xd3, + 0x80, 0x1, 0xd3, 0xda, 0xf8, 0x22, 0x7e, 0x34, 0x0, 0x1, 0x7c, 0xbf, 0x22, + 0xca, 0xf8, 0xc2, 0x0, 0x7e, 0xf3, 0x56, 0x21, 0x20, 0xd, 0x3, 0x30, 0xe, + 0x3, 0xc3, 0x80, 0x62, 0x7e, 0x24, 0x0, 0x1, 0x7c, 0xbf, 0x60, 0x5, 0x3e, + 0x24, 0x14, 0x78, 0xfb, 0x12, 0x46, 0x3e, 0x68, 0x4f, 0x7c, 0xbf, 0x12, + 0x98, 0xe2, 0x50, 0x2, 0xd2, 0x0, 0xd2, 0x2, 0x12, 0x46, 0xb8, 0xe4, 0x7c, + 0x7f, 0x12, 0x97, 0x32, 0xa2, 0x0, 0x92, 0x1, 0x7e, 0xf, 0x2d, 0x2a, 0x7e, + 0x18, 0x22, 0xc0, 0x7c, 0xbf, 0x12, 0x93, 0x6d, 0x20, 0xd, 0x3, 0x30, 0xe, + 0x3, 0xc3, 0x80, 0x22, 0x12, 0x46, 0x8f, 0x12, 0x7a, 0xb3, 0x60, 0x5, 0x3e, + 0x34, 0x14, 0x78, 0xfb, 0x6e, 0x70, 0xff, 0x5e, 0x73, 0x74, 0xb, 0x7a, 0x73, + 0x74, 0xb, 0x12, 0x7b, 0x30, 0x12, 0x7f, 0xfd, 0xd3, 0x80, 0x1, 0xd3, 0xda, + 0xf8, 0x22, 0xe4, 0x7a, 0xb3, 0x56, 0x29, 0x2, 0x7b, 0x38, 0x6d, 0x33, 0x7a, + 0x37, 0x56, 0x8f, 0x22, 0x30, 0x1e, 0x24, 0xc2, 0x1e, 0x7e, 0x73, 0x53, + 0xec, 0x7a, 0x73, 0x54, 0x13, 0x74, 0xff, 0x7a, 0xb3, 0x53, 0xec, 0x7e, + 0xa3, 0x54, 0x13, 0x4c, 0xaa, 0x78, 0x5, 0x12, 0x7b, 0xff, 0x80, 0x7, 0xbe, + 0xa0, 0x1, 0x78, 0x2, 0xd2, 0x17, 0x30, 0x17, 0x3, 0x12, 0x7c, 0x16, 0x7e, + 0xb3, 0x54, 0x13, 0x14, 0x68, 0x55, 0x1b, 0xb1, 0x68, 0x5f, 0x24, 0x3, 0x68, + 0x2, 0x61, 0xfb, 0x12, 0x7c, 0x47, 0x38, 0x7, 0x7e, 0xb3, 0x56, 0x95, 0xb4, + 0x1, 0x15, 0x12, 0x7b, 0x38, 0x7e, 0xb3, 0x53, 0xf4, 0x30, 0xe0, 0x6b, 0x7e, + 0xb3, 0x54, 0x3e, 0x60, 0x65, 0x30, 0x12, 0x62, 0x80, 0x27, 0x7e, 0xb3, + 0x53, 0xf4, 0x30, 0xe0, 0x59, 0x7e, 0x37, 0x56, 0x8f, 0x7e, 0x24, 0x3, 0xe8, + 0x8d, 0x32, 0x7e, 0x53, 0x53, 0xf5, 0xa, 0x25, 0xbd, 0x32, 0x50, 0xc, 0x7e, + 0xb3, 0x54, 0x3e, 0x60, 0x3f, 0xbe, 0x34, 0x0, 0x1, 0x40, 0x39, 0x2, 0x7c, + 0x16, 0x12, 0x7c, 0x47, 0x38, 0x6, 0x7e, 0xb3, 0x53, 0xf4, 0x70, 0x2b, 0x2, + 0x7e, 0xaa, 0x7e, 0x34, 0xd, 0x16, 0x12, 0x32, 0xdf, 0x12, 0x5a, 0xa8, 0x12, + 0x5e, 0x92, 0x12, 0x5a, 0xb3, 0x12, 0x7b, 0xff, 0x7e, 0xb3, 0x56, 0x28, + 0x70, 0x3, 0x12, 0x46, 0x8f, 0x7e, 0xb3, 0x56, 0x28, 0x60, 0x6, 0x2, 0x78, + 0xae, 0x12, 0x7c, 0xbc, 0x22, 0xe4, 0x7a, 0xb3, 0x54, 0x13, 0xd2, 0x14, + 0x12, 0x7b, 0x38, 0x2, 0x7c, 0xc, 0x12, 0x5f, 0x78, 0x68, 0x4, 0xd2, 0x19, + 0xc2, 0x16, 0x22, 0x7e, 0xb3, 0x56, 0x28, 0xb4, 0x1, 0xc, 0x7e, 0xb3, 0x2e, + 0x75, 0x60, 0x6, 0xe4, 0x7a, 0xb3, 0x54, 0x13, 0x22, 0xc2, 0x17, 0x12, 0x7c, + 0xbc, 0x12, 0x7b, 0x38, 0xe4, 0x7a, 0xb3, 0x56, 0x93, 0x7a, 0xb3, 0x56, + 0x8e, 0x2, 0x7c, 0x3d, 0x12, 0x5f, 0x78, 0x68, 0x4, 0xd2, 0x16, 0xc2, 0x19, + 0x22, 0x7e, 0x73, 0x68, 0x79, 0xbe, 0x70, 0x0, 0x22, 0x7e, 0xa0, 0x3b, 0x7e, + 0xb3, 0x54, 0x13, 0xb4, 0x1, 0xf, 0x7e, 0xb3, 0x56, 0x28, 0x60, 0x9, 0x7e, + 0xb3, 0x56, 0x93, 0x70, 0x3, 0x12, 0x7c, 0x3d, 0x7e, 0xb3, 0x54, 0x13, 0xb4, + 0x1, 0x38, 0x7e, 0xb3, 0x56, 0x28, 0x60, 0x26, 0x7e, 0x73, 0x56, 0x93, 0xbc, + 0x7a, 0x78, 0x3, 0x12, 0x7c, 0xc, 0x7e, 0xb3, 0x56, 0x93, 0x7a, 0xb3, 0x56, + 0x8e, 0x4, 0x7a, 0xb3, 0x56, 0x93, 0x7e, 0x73, 0x56, 0x93, 0xbe, 0x70, 0x3c, + 0x28, 0x5, 0xe4, 0x7a, 0xb3, 0x56, 0x93, 0x7e, 0xb3, 0x54, 0x15, 0xbe, 0xb0, + 0x1, 0x68, 0x3, 0x2, 0x7b, 0xff, 0x22, 0x12, 0x7b, 0x3f, 0x7e, 0xb3, 0x56, + 0x28, 0x70, 0x5, 0x12, 0x7f, 0x52, 0x80, 0x3, 0x12, 0x7e, 0xb9, 0x2, 0x7c, + 0x4f, 0x74, 0x1, 0x7a, 0xb3, 0x54, 0x13, 0x22, 0xca, 0xf8, 0x7e, 0xa3, 0x68, + 0x79, 0x7e, 0xb3, 0x68, 0x7a, 0xc2, 0x12, 0xbe, 0xa0, 0x1, 0x38, 0x21, 0xbe, + 0xb0, 0x1, 0x38, 0x1c, 0x7e, 0x47, 0x66, 0xec, 0xbe, 0x44, 0x0, 0x1e, 0x28, + 0x2, 0x80, 0x10, 0x7e, 0xf3, 0x52, 0x49, 0x4c, 0xff, 0x68, 0xf, 0x7e, 0x47, + 0x4e, 0x80, 0x4d, 0x44, 0x78, 0x7, 0xd2, 0x12, 0x12, 0x7c, 0xbc, 0x80, 0x35, + 0x4c, 0xaa, 0x78, 0x36, 0xb4, 0x1, 0x33, 0x7e, 0x37, 0x4e, 0x80, 0x7a, 0x37, + 0x52, 0x4b, 0x7e, 0xb3, 0x52, 0x49, 0xb4, 0x3, 0x1f, 0x7e, 0x37, 0x4e, 0x80, + 0xbe, 0x34, 0x0, 0x0, 0x28, 0x15, 0x74, 0x4, 0x7a, 0xb3, 0x52, 0x49, 0x7e, + 0x37, 0x52, 0x61, 0x7e, 0x27, 0x52, 0x63, 0x12, 0x7d, 0xca, 0xa1, 0xc3, + 0x80, 0x0, 0x12, 0xe7, 0x2b, 0xa1, 0xc3, 0x7e, 0xc7, 0x67, 0x75, 0x7e, 0xd7, + 0x67, 0x77, 0x4c, 0xff, 0x78, 0x19, 0x70, 0x53, 0xbe, 0xa0, 0x1, 0x78, 0x4e, + 0x7d, 0x3c, 0x7d, 0x2d, 0x12, 0xe6, 0xc6, 0x12, 0x7d, 0xc6, 0x74, 0x1, 0x7a, + 0xb3, 0x52, 0x49, 0x80, 0x3c, 0xbe, 0xf0, 0x1, 0x78, 0x2a, 0x7e, 0x27, 0x52, + 0x51, 0x9e, 0x27, 0x52, 0x59, 0x7e, 0x14, 0xe, 0x2c, 0x12, 0x7e, 0x71, 0x38, + 0x11, 0x7e, 0x27, 0x52, 0x5f, 0x9e, 0x27, 0x52, 0x57, 0x7e, 0x14, 0xe, 0x2e, + 0x12, 0x7e, 0x71, 0x28, 0x15, 0x74, 0x3, 0x7a, 0xb3, 0x52, 0x49, 0x80, 0x5, + 0xbe, 0xf0, 0x3, 0x78, 0x8, 0x7a, 0xc7, 0x52, 0x61, 0x7a, 0xd7, 0x52, 0x63, + 0x7e, 0xb3, 0x52, 0x49, 0x60, 0x26, 0x7d, 0x3c, 0x7d, 0x2d, 0x7e, 0x17, + 0x4e, 0x84, 0x7e, 0x7, 0x4e, 0x86, 0x12, 0x7e, 0x7b, 0xa, 0x2b, 0x7e, 0x73, + 0x52, 0x48, 0xa, 0x37, 0xbd, 0x32, 0x58, 0xb, 0x12, 0x7d, 0xc6, 0x7a, 0xc7, + 0x4e, 0x84, 0x7a, 0xd7, 0x4e, 0x86, 0xda, 0xf8, 0x22, 0x7d, 0x3c, 0x7d, + 0x2d, 0x7d, 0x42, 0x7d, 0x13, 0x7d, 0x24, 0x12, 0xe6, 0xa1, 0x7d, 0x31, + 0x12, 0xae, 0xa7, 0x2, 0x7d, 0xdb, 0x7e, 0x3, 0x52, 0x71, 0xbe, 0x0, 0xf0, + 0x50, 0x2, 0xc1, 0x70, 0x80, 0x7d, 0x6c, 0x99, 0x7e, 0xb3, 0x52, 0x48, 0xbe, + 0xb0, 0x20, 0x50, 0x5, 0x4, 0x7a, 0xb3, 0x52, 0x48, 0x7e, 0x1f, 0x4e, 0x88, + 0x7a, 0x1f, 0x2e, 0x77, 0x7e, 0x80, 0x1, 0x80, 0x45, 0x74, 0x4, 0xac, 0xb8, + 0x49, 0x35, 0x4e, 0x88, 0x49, 0x25, 0x4e, 0x8a, 0x7e, 0x17, 0x2e, 0x77, + 0x7e, 0x7, 0x2e, 0x79, 0x12, 0x7e, 0x7b, 0x7c, 0x1b, 0x7e, 0x3, 0x52, 0x48, + 0xbc, 0x1, 0x38, 0x22, 0xb, 0x90, 0x7e, 0x70, 0x4, 0xac, 0x78, 0x2e, 0x34, + 0x4e, 0x88, 0x7e, 0x14, 0x2e, 0x77, 0x74, 0x4, 0x12, 0x8f, 0xf7, 0x7e, 0x30, + 0x4, 0xac, 0x39, 0x2e, 0x14, 0x4e, 0x88, 0x74, 0x4, 0x12, 0x2a, 0xc1, 0xb, + 0x80, 0x7e, 0x3, 0x52, 0x71, 0xbc, 0x8, 0x38, 0xb3, 0xa, 0x59, 0xb, 0x54, + 0x7c, 0xb, 0x7a, 0x3, 0x52, 0x71, 0x7e, 0x3, 0x52, 0x48, 0xbe, 0x0, 0x20, + 0x50, 0xb, 0x7e, 0x3, 0x52, 0x71, 0xbe, 0x0, 0xec, 0x40, 0x2, 0xa1, 0xe8, + 0x22, 0x7e, 0x4, 0x0, 0xff, 0xb, 0xa, 0x30, 0xbd, 0x23, 0x22, 0x7d, 0x51, + 0x7d, 0x12, 0x12, 0xf1, 0x6f, 0x8, 0x4, 0x7d, 0x52, 0x80, 0x4, 0x6d, 0x55, + 0x9d, 0x52, 0x7c, 0xab, 0x7d, 0x21, 0x9d, 0x20, 0xbe, 0x24, 0x0, 0x0, 0x8, + 0x4, 0x7d, 0x32, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x32, 0x7c, 0xb7, 0xbc, 0xba, + 0x50, 0x3, 0x7c, 0xba, 0x22, 0x22, 0x7e, 0xb3, 0x54, 0x3e, 0x60, 0x5, 0x20, + 0x12, 0x5, 0x80, 0x0, 0x2, 0x7b, 0xff, 0x22, 0x20, 0x14, 0x6, 0x12, 0x7e, + 0xf9, 0x12, 0x0, 0x12, 0x12, 0x46, 0x49, 0x12, 0x7f, 0x10, 0x40, 0x6, 0x12, + 0x7f, 0x2, 0x2, 0x0, 0x12, 0x22, 0x7e, 0x73, 0x66, 0xff, 0x7a, 0x73, 0x67, + 0x0, 0x7e, 0x73, 0x39, 0xa3, 0xa, 0x27, 0x7e, 0x73, 0x68, 0x79, 0xa, 0x37, + 0x2d, 0x32, 0x7a, 0x73, 0x68, 0x7a, 0xe4, 0x7a, 0xb3, 0x68, 0x7d, 0x7e, + 0x73, 0x55, 0xf7, 0x7a, 0x73, 0x54, 0x19, 0x22, 0x80, 0x3, 0x12, 0x7f, 0x31, + 0x30, 0x14, 0xfa, 0x22, 0x12, 0x7f, 0x99, 0x80, 0x3, 0x12, 0x7f, 0x31, 0x12, + 0x7f, 0x13, 0x50, 0xf8, 0x22, 0x12, 0x7f, 0x99, 0x12, 0xf2, 0x6a, 0x40, 0x3, + 0x12, 0x7f, 0xc4, 0x30, 0xd, 0x3, 0x12, 0x7f, 0xc4, 0x7e, 0xb3, 0x54, 0xf7, + 0x70, 0x6, 0x7e, 0xb3, 0x54, 0xf8, 0x60, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0x80, + 0xb, 0x12, 0x7f, 0x9f, 0x12, 0x7f, 0x10, 0x40, 0x16, 0x20, 0x14, 0x13, 0x12, + 0xde, 0x6, 0x70, 0xf0, 0x12, 0x7f, 0x9f, 0x12, 0xde, 0x93, 0x74, 0x2, 0x7e, + 0x70, 0x17, 0x2, 0xde, 0x3f, 0x22, 0x12, 0x7f, 0x99, 0x12, 0x7f, 0x13, 0x40, + 0x6, 0x12, 0x7f, 0x2, 0x12, 0x0, 0x12, 0x12, 0xf2, 0x62, 0x12, 0x7f, 0xa6, + 0x80, 0x16, 0x7e, 0xb3, 0x54, 0x3e, 0x60, 0xd, 0x7e, 0xb3, 0x55, 0xfc, 0x70, + 0x7, 0x12, 0xde, 0xb, 0x80, 0x5, 0x80, 0x0, 0x12, 0x7f, 0x31, 0x30, 0x14, + 0xe7, 0x7e, 0xb3, 0x55, 0xfc, 0xbe, 0xb0, 0x0, 0x28, 0x5, 0x14, 0x7a, 0xb3, + 0x55, 0xfc, 0xd2, 0x0, 0x12, 0x7f, 0xa6, 0xd2, 0xa, 0x2, 0x5e, 0x72, 0xe4, + 0x7a, 0xb3, 0x56, 0x2a, 0x22, 0x74, 0x81, 0x7a, 0xb3, 0x55, 0xf6, 0x22, + 0xa2, 0x0, 0xa9, 0x95, 0xcb, 0xa2, 0x0, 0xa9, 0x92, 0xcb, 0xa2, 0x0, 0xa9, + 0x92, 0xca, 0xa2, 0x0, 0xa9, 0x91, 0xcb, 0x22, 0x12, 0x7f, 0x99, 0x12, 0x7f, + 0x13, 0x50, 0xfb, 0x22, 0x30, 0x26, 0x6, 0x12, 0xde, 0xe2, 0x2, 0xde, 0xfb, + 0x22, 0x12, 0xc0, 0x1d, 0x12, 0x7f, 0xf6, 0x12, 0x7f, 0xda, 0x2, 0x34, 0x3, + 0x7e, 0x8, 0x39, 0xfa, 0x2, 0x7f, 0xe1, 0xb, 0xa, 0x30, 0xbe, 0x37, 0x55, + 0xf0, 0x28, 0x6, 0x9e, 0x37, 0x55, 0xf0, 0x80, 0x2, 0x6d, 0x33, 0x1b, 0xa, + 0x30, 0x22, 0x7e, 0x8, 0x4e, 0x80, 0x2, 0x7f, 0xe1, 0x7e, 0x73, 0x53, 0xf8, + 0x7e, 0xb3, 0x54, 0x13, 0x70, 0x35, 0x7e, 0xb3, 0x56, 0x28, 0x70, 0x22, + 0x7e, 0x63, 0x53, 0xf6, 0xbe, 0x60, 0x14, 0x28, 0x5, 0x7e, 0x60, 0x14, 0x80, + 0x7, 0xa5, 0xbe, 0x0, 0x3, 0x7e, 0x60, 0x1, 0xa, 0x26, 0x7e, 0x34, 0x0, + 0x64, 0x12, 0x29, 0xee, 0x7c, 0x67, 0x80, 0x63, 0x7e, 0xb3, 0x55, 0xf8, 0xa, + 0x27, 0xb4, 0x1, 0x2, 0x80, 0x32, 0x80, 0x3e, 0x7e, 0xf, 0x39, 0xfc, 0x69, + 0x20, 0x0, 0x6, 0x5e, 0x24, 0x0, 0x1, 0x78, 0xe, 0x7e, 0x63, 0x53, 0xf7, + 0xbe, 0x60, 0x7f, 0x28, 0x3f, 0x7e, 0x60, 0x7f, 0x80, 0x3a, 0x7e, 0xb3, + 0x56, 0x8e, 0xbe, 0xb0, 0x3c, 0x68, 0x2, 0x70, 0x23, 0x7e, 0xb3, 0x55, 0xf8, + 0xa, 0x27, 0xb4, 0x1, 0xe, 0x7e, 0x34, 0x1, 0xf4, 0x8d, 0x32, 0x9e, 0x34, + 0x0, 0x5, 0x7c, 0x67, 0x80, 0x18, 0x7e, 0x34, 0x3, 0xe8, 0x8d, 0x32, 0x1b, + 0x35, 0x7c, 0x67, 0x80, 0xc, 0xa, 0x27, 0x7e, 0x34, 0x3, 0xe8, 0x8d, 0x32, + 0xb, 0x36, 0x7c, 0x67, 0x7e, 0x73, 0x54, 0x1a, 0xac, 0x67, 0x7e, 0x24, 0x0, + 0x18, 0x12, 0x29, 0xee, 0x7a, 0x73, 0x55, 0xf2, 0xc2, 0x14, 0x6d, 0x33, + 0x7a, 0x37, 0x55, 0xf0, 0x22, 0x7e, 0xb3, 0x56, 0xbd, 0x4, 0x7a, 0xb3, 0x56, + 0xbd, 0x7e, 0x73, 0x56, 0xbd, 0x7a, 0x73, 0x53, 0xff, 0x22, 0xe4, 0x7a, + 0xb3, 0x54, 0x13, 0x12, 0x6e, 0xb, 0x7a, 0xb3, 0x74, 0x9, 0x12, 0x5b, 0x9a, + 0x12, 0x45, 0x56, 0x7e, 0x34, 0xd, 0xac, 0x12, 0x5a, 0xa8, 0x12, 0x80, 0xec, + 0x12, 0x80, 0xe0, 0x2, 0x2d, 0xb4, 0x7e, 0x8, 0x56, 0x4a, 0x7e, 0x34, 0x0, + 0x1a, 0xe4, 0x2, 0x0, 0x2e, 0x7e, 0x8, 0x1, 0x0, 0x7e, 0x34, 0x0, 0xa, 0x74, + 0x14, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x1, 0x64, 0x7e, 0x34, 0x0, 0xa, 0xe4, + 0x2, 0x0, 0x2e, 0xca, 0xd8, 0xca, 0x79, 0x7e, 0xf3, 0x68, 0x79, 0x7c, 0xbf, + 0x7e, 0x8, 0x68, 0x29, 0x7e, 0x78, 0x67, 0x1b, 0x70, 0x35, 0x12, 0x80, 0xec, + 0x7e, 0x8, 0x2, 0x6f, 0x12, 0x84, 0xbb, 0x7e, 0x8, 0x2, 0x79, 0x12, 0x84, + 0xa6, 0x7e, 0x8, 0x2, 0x47, 0x7e, 0x34, 0x0, 0xa, 0x74, 0x1, 0x12, 0x0, + 0x2e, 0x7e, 0x8, 0x2, 0x51, 0x12, 0x84, 0xbb, 0x7e, 0x8, 0x2, 0x5b, 0x12, + 0x84, 0xa6, 0x7e, 0x8, 0x2, 0x65, 0x12, 0x84, 0xa6, 0x81, 0x92, 0x7e, 0xb3, + 0x39, 0xa3, 0xa, 0x3b, 0xa, 0x2f, 0x2d, 0x23, 0x7e, 0xb3, 0x68, 0x7a, 0xa, + 0x3b, 0xbd, 0x32, 0x8, 0x6, 0x74, 0x3, 0x7a, 0xb3, 0x2, 0x83, 0x6c, 0x99, + 0x81, 0x8b, 0x12, 0x84, 0xcd, 0x29, 0x84, 0x0, 0x4, 0xbe, 0x80, 0xff, 0x78, + 0x2, 0x81, 0x89, 0xb, 0x4a, 0xd0, 0xbe, 0xd4, 0x0, 0x20, 0x28, 0x8, 0x90, + 0x1, 0x8a, 0x12, 0x84, 0xfc, 0x40, 0x5, 0x75, 0x27, 0x1, 0x80, 0x3, 0x75, + 0x27, 0x0, 0x69, 0xd4, 0x0, 0x2, 0xbe, 0xd4, 0x0, 0x20, 0x28, 0x8, 0x90, + 0x1, 0x8b, 0x12, 0x84, 0xfc, 0x40, 0x5, 0x7e, 0xa0, 0x1, 0x80, 0x2, 0x6c, + 0xaa, 0x7e, 0x50, 0x8, 0xac, 0x58, 0x7f, 0x60, 0x2d, 0xd2, 0x7e, 0x6b, 0xb0, + 0xb4, 0x2, 0x2, 0x80, 0x2, 0x81, 0x29, 0x7e, 0x50, 0x4, 0xac, 0x58, 0x49, + 0xc2, 0x2, 0x1f, 0xb, 0x4a, 0xd0, 0x9d, 0xdc, 0x49, 0x22, 0x2, 0x21, 0x69, + 0xc4, 0x0, 0x2, 0x9d, 0xc2, 0xbe, 0xd4, 0x0, 0x0, 0x8, 0x4, 0x7d, 0xbd, + 0x80, 0x4, 0x6d, 0xbb, 0x9d, 0xbd, 0xbe, 0xc4, 0x0, 0x0, 0x8, 0x4, 0x7d, + 0xac, 0x80, 0x4, 0x6d, 0xaa, 0x9d, 0xac, 0x29, 0xf4, 0x0, 0x5, 0x2d, 0x3f, + 0x7d, 0x2e, 0x29, 0xe1, 0x0, 0x6, 0xa, 0x38, 0x9, 0xb3, 0x2, 0x5b, 0xbc, + 0xbf, 0x50, 0x6, 0xa, 0x38, 0x19, 0xf3, 0x2, 0x5b, 0xa, 0x38, 0x9, 0xb3, + 0x2, 0x65, 0xbc, 0xbe, 0x50, 0x6, 0xa, 0x38, 0x19, 0xe3, 0x2, 0x65, 0xa, + 0x38, 0x9, 0xb3, 0x2, 0x51, 0xbe, 0xb0, 0x64, 0x50, 0xa, 0xa, 0x38, 0x2e, + 0x34, 0x2, 0x51, 0x4, 0x7a, 0x39, 0xb0, 0x6c, 0xdd, 0x7e, 0x73, 0x68, 0x79, + 0xbe, 0x70, 0x8, 0x40, 0x5, 0x7e, 0xd0, 0xa, 0x80, 0x8, 0xbe, 0x70, 0x3, + 0x40, 0x3, 0x7e, 0xd0, 0x9, 0x7e, 0x73, 0x2, 0x83, 0xbe, 0x70, 0x0, 0x28, + 0xa, 0x7e, 0xd0, 0xa, 0x7c, 0xb7, 0x14, 0x7a, 0xb3, 0x2, 0x83, 0x12, 0x84, + 0x9f, 0xbc, 0xbd, 0x50, 0x6, 0xa, 0x38, 0x19, 0xd3, 0x1, 0x0, 0xa, 0x38, + 0x9, 0xb3, 0x2, 0x6f, 0x60, 0x2, 0x41, 0xfa, 0xa, 0x38, 0x9, 0xb3, 0x2, + 0x51, 0xbe, 0xb0, 0x12, 0x50, 0x5e, 0xa, 0x38, 0x9, 0x63, 0x1, 0x0, 0x7e, + 0x70, 0x2, 0xac, 0x67, 0xa, 0x2f, 0xbd, 0x32, 0x58, 0x9, 0xa, 0x3f, 0x1e, + 0x34, 0x7c, 0xb7, 0x12, 0x84, 0xad, 0xa, 0x38, 0x9, 0xb3, 0x2, 0x5b, 0xbe, + 0xb0, 0x3c, 0x28, 0x46, 0xa, 0x2b, 0xa, 0x3f, 0x2e, 0x34, 0x0, 0x14, 0xbd, + 0x32, 0x48, 0x11, 0x7e, 0x70, 0x2, 0xac, 0x7e, 0xa, 0x28, 0x9, 0xb2, 0x2, + 0x65, 0xa, 0x2b, 0xbd, 0x32, 0x58, 0x29, 0x7d, 0x3a, 0x2d, 0x3b, 0xbe, 0x34, + 0x0, 0x80, 0x50, 0x6, 0x6d, 0xaa, 0x7d, 0xba, 0x80, 0x19, 0x1e, 0xb4, 0x1e, + 0xb4, 0x7d, 0xab, 0x1e, 0xa4, 0x1e, 0xa4, 0x80, 0xd, 0x12, 0x84, 0x9f, 0xbe, + 0xb0, 0x14, 0x28, 0x5, 0x74, 0x14, 0x12, 0x84, 0xad, 0x7d, 0x3a, 0x2d, 0x3b, + 0xbe, 0x34, 0x0, 0x4, 0x50, 0x4, 0x6d, 0xaa, 0x7d, 0xba, 0x12, 0x84, 0x9f, + 0xa, 0x3b, 0xbd, 0x3b, 0x28, 0x5d, 0xbd, 0x3a, 0x28, 0x59, 0xe5, 0x27, 0xbe, + 0xb0, 0x1, 0x68, 0x11, 0x7e, 0x70, 0x4, 0xac, 0x78, 0x49, 0x93, 0x2, 0x1f, + 0x12, 0x84, 0x97, 0x7d, 0x2e, 0x1b, 0x1a, 0x90, 0xbe, 0xa0, 0x1, 0x68, 0x6, + 0x12, 0x84, 0xd7, 0x12, 0x84, 0xee, 0xa, 0x38, 0x2e, 0x34, 0x1, 0x64, 0x7e, + 0x39, 0xb0, 0x4, 0x7a, 0x39, 0xb0, 0xa, 0x38, 0x9, 0xb3, 0x1, 0x64, 0xbe, + 0xb0, 0x32, 0x50, 0x2, 0x81, 0x89, 0x12, 0x84, 0x9f, 0xbe, 0xb0, 0x14, 0x50, + 0xa, 0xa, 0x38, 0x2e, 0x34, 0x1, 0x0, 0x4, 0x7a, 0x39, 0xb0, 0x74, 0x1, 0xa, + 0x38, 0x19, 0xb3, 0x2, 0x79, 0x81, 0x89, 0xa, 0x38, 0x9, 0xb3, 0x2, 0x79, + 0x60, 0x34, 0xbe, 0xb4, 0x0, 0x1e, 0x38, 0x6, 0xbe, 0xa4, 0x0, 0x1e, 0x28, + 0x4, 0x74, 0x1, 0x80, 0x1e, 0xbe, 0xb4, 0x0, 0xa, 0x50, 0x6, 0xbe, 0xa4, + 0x0, 0xa, 0x40, 0x4, 0x74, 0x6, 0x80, 0xe, 0xbe, 0xb4, 0x0, 0x5, 0x50, 0x6, + 0xbe, 0xa4, 0x0, 0x5, 0x40, 0x8, 0x74, 0x3, 0xa, 0x38, 0x19, 0xb3, 0x2, + 0x47, 0x12, 0x84, 0xb4, 0xbe, 0xb0, 0x1, 0x28, 0x3b, 0xa, 0x38, 0x2e, 0x34, + 0x2, 0x47, 0x14, 0x7a, 0x39, 0xb0, 0x12, 0x84, 0xb4, 0xa, 0x2b, 0x7d, 0x3d, + 0x12, 0x29, 0xee, 0x7e, 0x50, 0x4, 0xac, 0x58, 0x49, 0x92, 0x2, 0x1f, 0x2d, + 0x93, 0x12, 0x84, 0x97, 0x7d, 0x2e, 0x1b, 0x1a, 0x90, 0x12, 0x84, 0xb4, 0xa, + 0x2b, 0x7d, 0x3c, 0x12, 0x29, 0xee, 0x7d, 0x23, 0x12, 0x84, 0xd7, 0x2d, + 0x32, 0x12, 0x84, 0xee, 0x74, 0x1, 0xa, 0x38, 0x19, 0xb3, 0x2, 0x6f, 0xe4, + 0x19, 0xb3, 0x2, 0x79, 0x12, 0x84, 0xcd, 0xb, 0x4a, 0x30, 0x12, 0x84, 0xc3, + 0x69, 0x34, 0x0, 0x2, 0x59, 0x32, 0x2, 0x21, 0xa, 0x38, 0x9, 0x53, 0x1, 0x0, + 0xbe, 0x50, 0x14, 0x40, 0x7, 0x74, 0xa, 0x12, 0x84, 0xad, 0x80, 0x11, 0xbe, + 0x50, 0x1, 0x28, 0xc, 0xa, 0x38, 0x2e, 0x34, 0x1, 0x0, 0x7c, 0xb5, 0x14, + 0x7a, 0x39, 0xb0, 0xe4, 0xa, 0x38, 0x19, 0xb3, 0x1, 0x64, 0x80, 0x60, 0x12, + 0x84, 0xe1, 0x70, 0x35, 0x12, 0x84, 0x97, 0x7d, 0x2e, 0xb, 0x1a, 0x30, 0x12, + 0x84, 0xc3, 0x12, 0x84, 0x97, 0x7d, 0x2e, 0x69, 0x31, 0x0, 0x2, 0x7e, 0x50, + 0x4, 0xac, 0x58, 0x59, 0x32, 0x2, 0x21, 0x12, 0x84, 0x97, 0x7d, 0x2e, 0x29, + 0xb1, 0x0, 0x5, 0xa, 0x38, 0x19, 0xb3, 0x2, 0x5b, 0x12, 0x84, 0x97, 0x29, + 0xb1, 0x0, 0x6, 0x80, 0x20, 0x12, 0x84, 0xe1, 0xb4, 0x1, 0x20, 0xe4, 0xa, + 0x38, 0x19, 0xb3, 0x2, 0x6f, 0x19, 0xb3, 0x2, 0x79, 0x74, 0x1, 0x19, 0xb3, + 0x2, 0x47, 0xe4, 0x19, 0xb3, 0x2, 0x51, 0x19, 0xb3, 0x2, 0x5b, 0xa, 0x38, + 0x19, 0xb3, 0x2, 0x65, 0xb, 0x90, 0x12, 0x85, 0xb, 0x28, 0x2, 0x21, 0x6c, + 0xda, 0x79, 0xda, 0xd8, 0x22, 0x7e, 0x70, 0x9, 0xac, 0x79, 0x2d, 0x3f, 0x22, + 0xa, 0x38, 0x9, 0xb3, 0x1, 0x0, 0x22, 0x7e, 0x34, 0x0, 0xa, 0x2, 0x0, 0x2e, + 0xa, 0x38, 0x19, 0xb3, 0x1, 0x0, 0x22, 0xa, 0x38, 0x9, 0xb3, 0x2, 0x47, + 0x22, 0x7e, 0x34, 0x0, 0xa, 0xe4, 0x2, 0x0, 0x2e, 0x7e, 0x50, 0x4, 0xac, + 0x58, 0x59, 0x32, 0x2, 0x1f, 0x22, 0x7e, 0x70, 0x9, 0xac, 0x79, 0x7f, 0x47, + 0x2d, 0x93, 0x22, 0x7e, 0x70, 0x4, 0xac, 0x78, 0x49, 0x33, 0x2, 0x21, 0x22, + 0x7e, 0x70, 0x8, 0xac, 0x78, 0x2d, 0x31, 0x7d, 0x20, 0x7e, 0x1b, 0xb0, 0x22, + 0x7e, 0x50, 0x9, 0xac, 0x59, 0x7f, 0x47, 0x2d, 0x92, 0x79, 0x34, 0x0, 0x2, + 0x22, 0xe4, 0x93, 0x7c, 0x5b, 0x74, 0x40, 0xac, 0x5b, 0x9e, 0x24, 0x0, 0x20, + 0xbd, 0xd2, 0x22, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbc, 0xb9, 0x22, 0x7e, 0x8, + 0x2e, 0x77, 0xca, 0x69, 0xca, 0xf8, 0x7f, 0x70, 0x7c, 0x86, 0x7c, 0xf7, + 0x7c, 0xab, 0x6c, 0x99, 0xa1, 0xd7, 0x7c, 0x3f, 0xa1, 0xcf, 0x7e, 0x10, 0x9, + 0xac, 0x19, 0x9, 0x20, 0x67, 0xd3, 0x7e, 0x10, 0x9, 0xac, 0x13, 0x9, 0xb0, + 0x67, 0x1f, 0xbc, 0xb2, 0x68, 0x2, 0xa1, 0xcd, 0xbe, 0x20, 0xff, 0x78, 0x2, + 0xa1, 0xcd, 0x7e, 0xd0, 0x8, 0xac, 0xd2, 0x9, 0xb6, 0x68, 0x29, 0x70, 0xa, + 0x7d, 0x30, 0x2e, 0x34, 0x67, 0x1b, 0x6d, 0x22, 0x80, 0xb, 0x7e, 0x70, 0x9, + 0xac, 0x79, 0x2e, 0x34, 0x67, 0xcf, 0x6d, 0x22, 0x29, 0x11, 0x0, 0x4, 0x12, + 0x85, 0xe5, 0x39, 0x16, 0x0, 0x4, 0xb, 0x1a, 0x0, 0x12, 0x85, 0xe5, 0x1b, + 0x6a, 0x0, 0x69, 0x1, 0x0, 0x2, 0x12, 0x85, 0xe5, 0x79, 0x6, 0x0, 0x2, 0x7e, + 0x10, 0x9, 0xac, 0x13, 0x9, 0x10, 0x67, 0x20, 0x12, 0x85, 0xe5, 0x39, 0x16, + 0x0, 0x5, 0x7e, 0x10, 0x9, 0xac, 0x13, 0x9, 0x10, 0x67, 0x21, 0x12, 0x85, + 0xe5, 0x39, 0x16, 0x0, 0x6, 0x7e, 0x10, 0x9, 0xac, 0x13, 0x9, 0x10, 0x67, + 0x22, 0x12, 0x85, 0xe5, 0x39, 0x16, 0x0, 0x7, 0x7e, 0x10, 0x9, 0xac, 0x13, + 0x9, 0x10, 0x67, 0x23, 0x12, 0x85, 0xe5, 0x39, 0x16, 0x0, 0x8, 0xb, 0xa0, + 0x80, 0x8, 0xb, 0x30, 0xbc, 0x83, 0x28, 0x2, 0xa1, 0x2b, 0xb, 0x90, 0x12, + 0x85, 0xb, 0x28, 0x2, 0xa1, 0x27, 0x7c, 0xba, 0xda, 0xf8, 0xda, 0x69, 0x22, + 0x7e, 0xd0, 0x9, 0xac, 0xda, 0x7f, 0x67, 0x2d, 0xd6, 0x22, 0xca, 0x79, 0x7c, + 0xeb, 0x90, 0xd, 0xe, 0xe4, 0x93, 0x7c, 0xfb, 0x7e, 0x70, 0x9, 0xac, 0x7f, + 0x7e, 0x8, 0x2e, 0x77, 0x74, 0xff, 0x12, 0x0, 0x2e, 0xe4, 0x6c, 0x77, 0x7c, + 0x6e, 0x12, 0x85, 0x13, 0x7c, 0x7e, 0x7c, 0x6f, 0x12, 0x85, 0x13, 0x7c, + 0x1b, 0x6c, 0x0, 0x80, 0x36, 0x6c, 0x99, 0x80, 0x17, 0x74, 0x9, 0xac, 0xb9, + 0x9, 0xa5, 0x2e, 0x7b, 0x7e, 0x30, 0x9, 0xac, 0x30, 0x9, 0x81, 0x67, 0x1f, + 0xbc, 0x8a, 0x68, 0x6, 0xb, 0x90, 0xbc, 0x19, 0x38, 0xe5, 0xbc, 0x19, 0x78, + 0x11, 0x7e, 0x70, 0x9, 0xac, 0x70, 0x12, 0xd1, 0xc9, 0xac, 0x31, 0x2e, 0x14, + 0x2e, 0x77, 0x12, 0x87, 0xe1, 0xb, 0x0, 0xbc, 0xf0, 0x38, 0xc6, 0x74, 0x9, + 0xac, 0xbf, 0xca, 0x59, 0x7e, 0x18, 0x2e, 0x77, 0x7e, 0x8, 0x67, 0xcf, 0x12, + 0x2b, 0x7, 0x1b, 0xfd, 0xda, 0x79, 0x22, 0xca, 0x79, 0x7e, 0xf3, 0x68, 0x79, + 0x7e, 0xe3, 0x68, 0x7a, 0x7c, 0xbf, 0x7c, 0x7e, 0x12, 0x86, 0xfe, 0x7c, + 0xbf, 0x12, 0x85, 0xef, 0x4c, 0xee, 0x78, 0x17, 0x12, 0x8f, 0xff, 0xca, + 0x59, 0x7e, 0x18, 0x67, 0x1b, 0x7e, 0x8, 0x67, 0xcf, 0x12, 0x2b, 0x7, 0x1b, + 0xfd, 0x12, 0x86, 0xb4, 0x80, 0xe, 0x7e, 0xb3, 0x68, 0x80, 0x70, 0x8, 0x12, + 0x86, 0xb4, 0x7c, 0xbf, 0x12, 0xb9, 0xe4, 0x7c, 0xbf, 0x12, 0xbc, 0xb0, + 0xda, 0x79, 0x22, 0x7e, 0xa3, 0x68, 0x79, 0x6c, 0x77, 0x80, 0x3d, 0x7e, + 0x90, 0x9, 0xac, 0x97, 0x9, 0x64, 0x67, 0xd3, 0x12, 0x87, 0xf2, 0x70, 0x2d, + 0x7e, 0x30, 0x1, 0x7e, 0x50, 0x9, 0xac, 0x56, 0x19, 0x32, 0x1, 0xd, 0x49, + 0x14, 0x67, 0x1b, 0x59, 0x12, 0x1, 0xe, 0x49, 0x14, 0x67, 0x1d, 0x59, 0x12, + 0x1, 0x10, 0xe4, 0x19, 0xb2, 0x1, 0x12, 0x19, 0xb2, 0x1, 0xa, 0x19, 0xb2, + 0x1, 0xb, 0x19, 0xb2, 0x1, 0xc, 0xb, 0x70, 0xbc, 0xa7, 0x38, 0xbf, 0x22, + 0x7c, 0x67, 0x7c, 0x7b, 0xa5, 0xbf, 0x0, 0xd, 0xbe, 0x60, 0x0, 0x28, 0x5, + 0xe4, 0x7a, 0xb3, 0x68, 0x80, 0x2, 0x87, 0x5c, 0xa5, 0xbe, 0x0, 0x16, 0x6c, + 0xaa, 0x80, 0x9, 0x12, 0x87, 0xe9, 0x19, 0x62, 0x67, 0xd3, 0xb, 0xa0, 0x90, + 0xd, 0xe, 0xe4, 0x93, 0xbc, 0xba, 0x38, 0xee, 0x6c, 0xaa, 0x80, 0x26, 0x7e, + 0x30, 0x9, 0xac, 0x3a, 0x2e, 0x14, 0x67, 0x1b, 0xb, 0x18, 0x20, 0x12, 0x5d, + 0x6f, 0x1b, 0x18, 0x20, 0x7e, 0x30, 0x9, 0xac, 0x3a, 0x2e, 0x14, 0x67, 0x1d, + 0xb, 0x18, 0x20, 0x12, 0x5d, 0x6f, 0x1b, 0x18, 0x20, 0xb, 0xa0, 0xbc, 0x7a, + 0x38, 0xd6, 0x22, 0x12, 0x87, 0x82, 0x74, 0x2, 0xac, 0x7b, 0x7e, 0x8, 0x1, + 0x8f, 0xe4, 0x12, 0x0, 0x2e, 0x90, 0xd, 0xe, 0x93, 0x7c, 0x7b, 0x74, 0x2, + 0xac, 0x7b, 0x7e, 0x8, 0x1, 0x6f, 0xe4, 0x2, 0x0, 0x2e, 0x74, 0xff, 0x12, + 0x0, 0x2e, 0x90, 0xd, 0xe, 0xe4, 0x93, 0x7c, 0x7b, 0x22, 0x12, 0x87, 0x82, + 0x74, 0x9, 0xac, 0x7b, 0x7e, 0x8, 0x67, 0x1b, 0x12, 0x87, 0x7d, 0x74, 0x9, + 0xac, 0x7b, 0x7e, 0x8, 0x67, 0xcf, 0x12, 0x87, 0x7d, 0x74, 0x9, 0xac, 0x7b, + 0x7e, 0x8, 0x67, 0x75, 0x74, 0xff, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x68, 0x29, + 0x12, 0xb7, 0xa5, 0x7e, 0x8, 0x68, 0x79, 0x7e, 0x34, 0x0, 0xc, 0xe4, 0x2, + 0x0, 0x2e, 0x12, 0x90, 0x1c, 0x12, 0x91, 0xb, 0x12, 0x90, 0xcd, 0x12, 0x91, + 0xc8, 0x12, 0x37, 0xad, 0x12, 0x32, 0xe7, 0x12, 0x91, 0xa9, 0x12, 0x87, + 0x8a, 0x12, 0x9f, 0xd7, 0x2, 0x5f, 0x4c, 0x74, 0x9, 0x12, 0x2a, 0xc1, 0xb, + 0x10, 0x22, 0x7e, 0x60, 0xff, 0x7e, 0x50, 0x9, 0xac, 0x5a, 0x22, 0x7e, 0x50, + 0x8, 0xac, 0x56, 0x9, 0xb2, 0x68, 0x29, 0x22, 0x7e, 0x37, 0x56, 0xa3, 0xb, + 0x34, 0x7a, 0x37, 0x56, 0xa3, 0x7e, 0x37, 0x56, 0xa5, 0xbe, 0x37, 0x56, + 0xa3, 0x28, 0x3, 0x2, 0x88, 0x14, 0x22, 0xe5, 0x9a, 0x60, 0x3, 0xa9, 0xd6, + 0xdf, 0x22, 0x2, 0x87, 0xfc, 0xca, 0x7b, 0xca, 0x6b, 0xca, 0x5b, 0xca, 0x4b, + 0xca, 0x2b, 0xca, 0x1b, 0xca, 0xb, 0xc0, 0xd0, 0xc0, 0x83, 0xc0, 0x82, 0xc2, + 0x8f, 0x12, 0x88, 0x1c, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xd0, 0xda, 0xb, 0xda, + 0x1b, 0xda, 0x2b, 0xda, 0x4b, 0xda, 0x5b, 0xda, 0x6b, 0xda, 0x7b, 0x32, + 0x7e, 0xa3, 0x52, 0x71, 0x7e, 0x70, 0x4, 0xac, 0x7a, 0xb, 0x34, 0xbe, 0x37, + 0x54, 0xc0, 0x40, 0x39, 0x7e, 0x37, 0x54, 0xc0, 0xb, 0x34, 0x7a, 0x37, 0x54, + 0xc0, 0xbe, 0x34, 0x0, 0x1, 0x78, 0x5, 0x7e, 0xb3, 0x54, 0x41, 0x22, 0xbe, + 0x34, 0x0, 0x2, 0x78, 0x3, 0x7c, 0xba, 0x22, 0xbe, 0x34, 0x0, 0x2, 0x50, + 0x9, 0x7d, 0x23, 0x1b, 0x25, 0x9, 0xb2, 0x56, 0x9c, 0x22, 0x9e, 0x34, 0x0, + 0x3, 0x2e, 0x37, 0x4e, 0x82, 0x7e, 0x39, 0xb0, 0x22, 0x74, 0xff, 0x22, 0x7e, + 0x73, 0x54, 0x60, 0x7c, 0xa7, 0x5e, 0xa0, 0xf, 0x7c, 0xb7, 0x23, 0x54, 0x1, + 0x3, 0x54, 0x80, 0x4e, 0xb3, 0x54, 0xc3, 0x4c, 0xba, 0x22, 0xca, 0x59, 0xca, + 0x1b, 0xca, 0xb, 0xc0, 0x83, 0xc0, 0x82, 0x12, 0x64, 0x20, 0xd0, 0x82, 0xd0, + 0x83, 0xda, 0xb, 0xda, 0x1b, 0xda, 0x59, 0x32, 0xca, 0xb8, 0xca, 0x78, 0xa9, + 0xc0, 0x93, 0xa9, 0xd3, 0xa7, 0x12, 0x88, 0xed, 0x75, 0x8, 0x0, 0x7e, 0x73, + 0x39, 0xb1, 0xbe, 0x70, 0x6, 0x40, 0x5, 0xe4, 0x7a, 0xb3, 0x39, 0xb1, 0xda, + 0x78, 0xda, 0xb8, 0x32, 0x75, 0x8, 0x0, 0xc2, 0x95, 0xa9, 0xc2, 0x93, 0x22, + 0xbe, 0xb0, 0xeb, 0x68, 0x3, 0xb4, 0xec, 0x33, 0x7e, 0x27, 0x54, 0xc4, 0x4d, + 0x22, 0x78, 0xe, 0xa5, 0xbf, 0xaa, 0xa, 0x7e, 0x24, 0x0, 0x1, 0x7a, 0x27, + 0x54, 0xc4, 0x15, 0xf, 0x7e, 0x27, 0x54, 0xc4, 0xbe, 0x24, 0x0, 0x1, 0x78, + 0x10, 0xa5, 0xbf, 0x9, 0x6, 0x7e, 0x34, 0x0, 0x2, 0x80, 0x2, 0x6d, 0x33, + 0x7a, 0x37, 0x54, 0xc4, 0x75, 0xf, 0xea, 0x22, 0xc4, 0x54, 0xf0, 0x7a, 0xb3, + 0x54, 0xc3, 0x22, 0x7c, 0x6b, 0x2e, 0x60, 0xdd, 0x68, 0x26, 0x2e, 0x60, + 0xfd, 0x68, 0x21, 0x1b, 0x61, 0x68, 0x1d, 0x2e, 0x60, 0xfa, 0x68, 0x18, + 0x1b, 0x60, 0x68, 0x14, 0x80, 0x0, 0xb4, 0x25, 0x7, 0xd2, 0x1e, 0x7a, 0x73, + 0x53, 0xec, 0x22, 0xa, 0x2b, 0x19, 0x72, 0x53, 0xee, 0xd2, 0x1d, 0x22, 0xca, + 0x79, 0x7c, 0xfb, 0x7f, 0x51, 0x7f, 0x40, 0x74, 0x9, 0xac, 0xbf, 0x9, 0xb5, + 0x67, 0x7a, 0xf5, 0x2f, 0x74, 0x9, 0xac, 0xbf, 0x9, 0xb5, 0x67, 0x7b, 0x1e, + 0xb0, 0xbe, 0xb0, 0xf, 0x28, 0x2, 0x74, 0xf, 0xc4, 0x54, 0xf0, 0xf5, 0x30, + 0x74, 0x9, 0xac, 0xbf, 0x9, 0xe5, 0x67, 0x79, 0x7e, 0x73, 0x68, 0x85, 0xbc, + 0x7e, 0x28, 0x53, 0x7e, 0xb3, 0x68, 0x80, 0x70, 0x28, 0x75, 0x31, 0xf, 0x7e, + 0x8, 0x0, 0x2f, 0xa, 0x3e, 0x2e, 0x34, 0x2, 0xde, 0x6d, 0x22, 0x74, 0x1, + 0x12, 0x8a, 0x1d, 0x75, 0x31, 0x20, 0x7e, 0x8, 0x0, 0x30, 0xa, 0x3e, 0x2e, + 0x34, 0x2, 0xe9, 0x74, 0x10, 0x12, 0x8a, 0x1d, 0x80, 0xe, 0xa, 0x3e, 0x9, + 0xb3, 0x2, 0xde, 0xf5, 0x2f, 0x9, 0xb3, 0x2, 0xe9, 0xf5, 0x30, 0x12, 0x8c, + 0xef, 0xb4, 0x1, 0x11, 0xe4, 0xa, 0x3e, 0x19, 0xb3, 0x2, 0xde, 0x19, 0xb3, + 0x2, 0xe9, 0x75, 0x2f, 0x0, 0x75, 0x30, 0x0, 0x7e, 0xb3, 0x68, 0x99, 0xb4, + 0xff, 0x16, 0x85, 0x2e, 0x2f, 0x75, 0x2f, 0x0, 0x74, 0x9, 0xac, 0xbf, 0x9, + 0xb5, 0x67, 0x79, 0xbe, 0xb0, 0xff, 0x68, 0x3, 0x75, 0x2f, 0x1, 0xe5, 0x2f, + 0x7a, 0x4b, 0xb0, 0xe5, 0x30, 0x7a, 0x5b, 0xb0, 0xda, 0x79, 0x22, 0x7c, + 0x9b, 0x7e, 0x1b, 0xa0, 0x4c, 0xaa, 0x78, 0x7, 0x7e, 0xb, 0xb0, 0x7a, 0x1b, + 0xb0, 0x22, 0xa, 0xda, 0x7e, 0xb, 0x80, 0xa, 0xe8, 0x7d, 0xfe, 0x9d, 0xfd, + 0xbe, 0xf4, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xed, 0x80, 0x4, 0x6d, 0xee, 0x9d, + 0xef, 0xe5, 0x31, 0xa, 0xfb, 0xbd, 0xef, 0x8, 0xf, 0xbc, 0x8a, 0x7c, 0xba, + 0x28, 0x4, 0x2c, 0xb9, 0x80, 0x2, 0x9c, 0xb9, 0x7a, 0x1b, 0xb0, 0x7e, 0x1b, + 0x70, 0x7a, 0xb, 0x70, 0x22, 0xca, 0x3b, 0x7c, 0xeb, 0x75, 0x27, 0x0, 0x6c, + 0xdd, 0x75, 0x28, 0x0, 0x75, 0x29, 0x0, 0x75, 0x2a, 0x0, 0x7e, 0x18, 0x68, + 0x29, 0x7a, 0x1f, 0x2e, 0x79, 0x75, 0x2d, 0x0, 0x7e, 0x18, 0x2, 0xf3, 0x7a, + 0x1f, 0x2e, 0x7d, 0x7e, 0xb3, 0x68, 0x82, 0x70, 0xe, 0x7e, 0xb3, 0x68, 0x7e, + 0x70, 0x8, 0x7e, 0xb3, 0x68, 0x7f, 0x70, 0x2, 0x81, 0x90, 0x30, 0x28, 0xa, + 0x7e, 0x8, 0x3, 0x4d, 0x7a, 0xf, 0x2e, 0x7d, 0x80, 0x4, 0x7a, 0x1f, 0x2e, + 0x7d, 0x7e, 0xf, 0x2e, 0x7d, 0x12, 0x8c, 0xe6, 0x7e, 0xf, 0x2e, 0x7d, 0x2e, + 0x14, 0x0, 0x3e, 0x7e, 0x34, 0x0, 0x1c, 0x12, 0x31, 0xec, 0x61, 0xb4, 0x74, + 0x9, 0xac, 0xbf, 0x49, 0xc5, 0x67, 0x75, 0x49, 0x45, 0x67, 0x77, 0x7a, 0x47, + 0x2e, 0x77, 0x9, 0xb5, 0x67, 0x79, 0xf5, 0x2b, 0x90, 0xd, 0xe, 0xe4, 0x93, + 0xbe, 0xb1, 0x2b, 0x38, 0x2, 0x61, 0xb2, 0x7e, 0xa1, 0x2b, 0x5e, 0xa0, 0xf, + 0x74, 0x8, 0xa4, 0x7e, 0x1f, 0x2e, 0x79, 0x2d, 0x35, 0x7e, 0x1b, 0xc0, 0xbe, + 0xc0, 0x3, 0x78, 0x2, 0x61, 0xb2, 0xbe, 0xc0, 0x1, 0x78, 0x31, 0x75, 0x2c, + 0x0, 0x80, 0x22, 0x7e, 0x71, 0x2c, 0x74, 0x9, 0xac, 0x7b, 0x9, 0xb3, 0x2, + 0x88, 0x54, 0xf, 0xbe, 0xb1, 0x2b, 0x78, 0xe, 0x49, 0xc3, 0x2, 0x84, 0x49, + 0xd3, 0x2, 0x86, 0x7a, 0xd7, 0x2e, 0x77, 0x80, 0xc, 0x5, 0x2c, 0x90, 0xd, + 0xe, 0xe4, 0x93, 0xbe, 0xb1, 0x2c, 0x38, 0xd4, 0x85, 0x27, 0x2e, 0x7e, 0x8, + 0x0, 0x28, 0x7e, 0x18, 0x0, 0x29, 0x7c, 0xbf, 0x12, 0x89, 0x68, 0x5e, 0xc4, + 0xf, 0xff, 0x7e, 0xd7, 0x2e, 0x77, 0x5e, 0xd4, 0xf, 0xff, 0x7a, 0xd7, 0x2e, + 0x77, 0x7e, 0x90, 0x9, 0xac, 0x9f, 0x9, 0x74, 0x67, 0x79, 0xa, 0x57, 0x12, + 0x6c, 0x33, 0x7d, 0xd5, 0x2e, 0xd7, 0x2e, 0x77, 0x7a, 0xd7, 0x2e, 0x77, + 0xbe, 0x70, 0xff, 0x68, 0x12, 0xbe, 0xc0, 0x1, 0x68, 0x2, 0x5, 0x27, 0x5, + 0x2a, 0xa, 0x5c, 0x12, 0x6f, 0xe6, 0x2d, 0xc5, 0x80, 0x4, 0x2e, 0xc4, 0xc0, + 0x0, 0x12, 0x8c, 0xca, 0x79, 0xc1, 0x0, 0x2, 0x7e, 0xd7, 0x2e, 0x77, 0x12, + 0x8c, 0xca, 0x79, 0xd1, 0x0, 0x4, 0x7e, 0xa1, 0x28, 0x12, 0x8c, 0xd5, 0x39, + 0xa1, 0x0, 0x6, 0x7e, 0xa1, 0x29, 0x12, 0x8c, 0xd5, 0x39, 0xa1, 0x0, 0x7, + 0xb, 0xd0, 0xb, 0xf0, 0x7e, 0x73, 0x68, 0x85, 0xbc, 0x7f, 0x28, 0x2, 0x41, + 0xc6, 0x7e, 0xb3, 0x54, 0x3e, 0xb4, 0x1, 0x58, 0x74, 0x1, 0x12, 0x8c, 0xc1, + 0x7e, 0x73, 0x54, 0x41, 0x7e, 0xf, 0x2e, 0x7d, 0x39, 0x70, 0x0, 0x40, 0x7e, + 0xb3, 0x68, 0x7f, 0xb4, 0x1, 0x44, 0x7e, 0x73, 0x52, 0x71, 0x7e, 0xf, 0x2e, + 0x7d, 0x39, 0x70, 0x0, 0x41, 0x6c, 0xff, 0x80, 0x26, 0x74, 0x4, 0xac, 0xbf, + 0x49, 0x35, 0x4e, 0x88, 0x7e, 0xf, 0x2e, 0x7d, 0x2d, 0x15, 0x79, 0x30, 0x0, + 0x42, 0x74, 0x4, 0xac, 0xbf, 0x49, 0x35, 0x4e, 0x8a, 0x7e, 0xf, 0x2e, 0x7d, + 0x2d, 0x15, 0x79, 0x30, 0x0, 0x44, 0xb, 0xf0, 0x7e, 0x73, 0x52, 0x71, 0xbc, + 0x7f, 0x38, 0xd2, 0x80, 0x4, 0xe4, 0x12, 0x8c, 0xc1, 0xe5, 0x27, 0x7e, 0x1f, + 0x2e, 0x7d, 0x39, 0xb1, 0x0, 0x1, 0x7e, 0x33, 0x68, 0x7b, 0x7e, 0x1f, 0x2e, + 0x7d, 0x7a, 0x1b, 0x30, 0x7e, 0xb3, 0x54, 0x3e, 0xb4, 0x1, 0x1c, 0x7e, 0xb3, + 0x68, 0x7f, 0xb4, 0x1, 0x2a, 0x74, 0x5, 0x7a, 0xb3, 0x55, 0xfc, 0xc2, 0x95, + 0x75, 0x2d, 0x1, 0x4c, 0xee, 0x68, 0x18, 0xb2, 0x28, 0xc2, 0x86, 0x80, 0x12, + 0xe5, 0x2a, 0xbe, 0xb0, 0x0, 0x28, 0xe, 0x75, 0x2d, 0x1, 0x4c, 0xee, 0x68, + 0x4, 0xb2, 0x28, 0xc2, 0x86, 0x12, 0x90, 0xa, 0x7e, 0xb3, 0x68, 0x7e, 0x60, + 0xd, 0x7e, 0xb3, 0x39, 0xa3, 0x70, 0x7, 0x7e, 0xf, 0x2e, 0x79, 0x12, 0xb7, + 0xa5, 0xe4, 0x7a, 0xb3, 0x68, 0x82, 0x7a, 0xb3, 0x68, 0x7e, 0x7a, 0xb3, + 0x68, 0x7f, 0x80, 0x6, 0x4c, 0xee, 0x68, 0x2, 0xd2, 0x86, 0x12, 0x8f, 0xff, + 0xca, 0x59, 0x7e, 0x18, 0x67, 0x75, 0x7e, 0x8, 0x2, 0x84, 0x12, 0x2b, 0x7, + 0x1b, 0xfd, 0xe5, 0x2a, 0x70, 0x10, 0x12, 0x87, 0x82, 0x74, 0x9, 0xac, 0x7b, + 0x7e, 0x8, 0x2, 0x84, 0x74, 0xff, 0x12, 0x0, 0x2e, 0xe5, 0x2d, 0xda, 0x3b, + 0x22, 0x7e, 0x1f, 0x2e, 0x7d, 0x39, 0xb1, 0x0, 0x3e, 0x22, 0x74, 0x6, 0xac, + 0xbd, 0x7e, 0x1f, 0x2e, 0x7d, 0x2d, 0x35, 0x22, 0x7e, 0x30, 0x6, 0xac, 0x3d, + 0x7e, 0x1f, 0x2e, 0x7d, 0x2d, 0x31, 0x22, 0x74, 0x1, 0x2, 0x8a, 0x64, 0x7e, + 0x34, 0x0, 0x3e, 0x74, 0xff, 0x2, 0x0, 0x2e, 0x74, 0x8, 0xac, 0xbe, 0x9, + 0xb5, 0x68, 0x29, 0x22, 0xca, 0xd8, 0xca, 0x79, 0x6d, 0x11, 0x7d, 0xf1, + 0x7e, 0x83, 0x68, 0x79, 0x7c, 0xd8, 0x7e, 0x57, 0x2, 0x13, 0xbe, 0x57, 0x56, + 0x22, 0x28, 0x12, 0x7e, 0x54, 0xff, 0xff, 0x9e, 0x57, 0x2, 0x13, 0x2e, 0x57, + 0x56, 0x22, 0xb, 0x54, 0x7c, 0xfb, 0x80, 0xa, 0x7e, 0x57, 0x56, 0x22, 0x9e, + 0x57, 0x2, 0x13, 0x7c, 0xfb, 0x7e, 0x57, 0x56, 0x22, 0x7a, 0x57, 0x2, 0x13, + 0x7e, 0xa3, 0x54, 0x13, 0x4c, 0xaa, 0x78, 0x19, 0xe5, 0x16, 0xb4, 0x1, 0x14, + 0x4c, 0x88, 0x68, 0x10, 0x7e, 0xb3, 0x68, 0x7a, 0x70, 0x2, 0xe1, 0xc4, 0xbe, + 0xb3, 0x68, 0x79, 0x78, 0x2, 0xe1, 0xc4, 0x7a, 0xa1, 0x16, 0xc2, 0x20, 0xc2, + 0x1f, 0x7e, 0xd4, 0x67, 0x1b, 0x4c, 0xdd, 0x68, 0x6, 0x7e, 0xb3, 0x68, 0x7a, + 0x70, 0x23, 0x6c, 0x11, 0x80, 0x1a, 0x74, 0x2, 0xac, 0xb1, 0x12, 0x8f, 0xe7, + 0x7e, 0x70, 0x9, 0xac, 0x71, 0x19, 0xa3, 0x1, 0xa9, 0x74, 0x1, 0xa, 0xe1, + 0x19, 0xbe, 0x2, 0x15, 0xb, 0x10, 0x12, 0x8f, 0xd7, 0x38, 0xe1, 0xe4, 0x7a, + 0xb3, 0x1, 0x6e, 0x6c, 0x11, 0xe1, 0x61, 0x74, 0x9, 0xac, 0xb1, 0x9, 0xe5, + 0x67, 0x1f, 0x5e, 0xe0, 0xf, 0x12, 0x8f, 0xdf, 0x38, 0x2, 0xe1, 0x5f, 0x12, + 0x8c, 0xef, 0xbe, 0xb0, 0x1, 0x78, 0x2, 0xe1, 0x45, 0x6c, 0x0, 0xe1, 0x38, + 0x74, 0x9, 0xac, 0xb0, 0x9, 0x85, 0x1, 0xa9, 0x7a, 0x81, 0x27, 0xbc, 0x8e, + 0x68, 0x2, 0xe1, 0x36, 0x49, 0x25, 0x1, 0xa7, 0x7e, 0x30, 0x9, 0xac, 0x31, + 0x2d, 0x1d, 0x49, 0xe1, 0x0, 0x2, 0x7d, 0x3e, 0x12, 0x37, 0x98, 0x8, 0x4, + 0x9d, 0xe2, 0x80, 0x4, 0x6d, 0xee, 0x9d, 0xe3, 0x74, 0x9, 0xac, 0xb0, 0x49, + 0x55, 0x1, 0xa5, 0xb, 0x18, 0x30, 0x12, 0xf1, 0x6f, 0x8, 0x6, 0x9d, 0x35, + 0x7d, 0xc3, 0x80, 0x4, 0x6d, 0xcc, 0x9d, 0xc2, 0x2d, 0xce, 0x12, 0x8f, 0xd0, + 0x49, 0xf5, 0x1, 0xff, 0x59, 0xc5, 0x1, 0xff, 0xe5, 0x27, 0xa, 0xeb, 0x9, + 0xbe, 0x2, 0x15, 0xbe, 0xb0, 0x0, 0x28, 0x12, 0x2e, 0xe4, 0x2, 0x15, 0x14, + 0x7a, 0xe9, 0xb0, 0x74, 0x3c, 0xac, 0xbf, 0xbd, 0x5c, 0x28, 0x2, 0xe1, 0x5f, + 0x7e, 0x50, 0x6, 0xac, 0x5f, 0x7d, 0x32, 0x2e, 0x34, 0x0, 0x14, 0xbd, 0x3f, + 0x50, 0x6, 0xbd, 0x3c, 0x50, 0x2, 0xd2, 0x20, 0x74, 0x2, 0xac, 0xbf, 0xbd, + 0x5f, 0x50, 0x6, 0xbd, 0x5c, 0x50, 0x2, 0xd2, 0x1f, 0x7e, 0x70, 0x6, 0xac, + 0x7f, 0xbd, 0x3f, 0x50, 0xc, 0x74, 0x3c, 0xac, 0xbf, 0x7d, 0xe5, 0x2d, 0xef, + 0xbd, 0xec, 0x40, 0x3f, 0xbd, 0x3f, 0x50, 0x13, 0xbd, 0x3c, 0x50, 0xf, 0x12, + 0x8f, 0xef, 0x50, 0x2, 0xe1, 0x5f, 0x3e, 0x24, 0xbd, 0x2f, 0x50, 0x2, 0xe1, + 0x5f, 0x7d, 0x23, 0x2d, 0x2f, 0xbd, 0x2c, 0x50, 0x20, 0xbd, 0x3f, 0x50, + 0x1c, 0x74, 0x6, 0xac, 0xbf, 0xbd, 0x5f, 0x50, 0x14, 0x12, 0x8f, 0xef, 0x50, + 0x2, 0xe1, 0x5f, 0x7e, 0x30, 0x6, 0xac, 0x3f, 0x3e, 0x14, 0xbd, 0x1f, 0x50, + 0x2, 0xe1, 0x5f, 0x7e, 0xb3, 0x1, 0x6e, 0xbe, 0xb0, 0x1, 0x78, 0x2, 0xe1, + 0x5f, 0x74, 0x14, 0xac, 0xbf, 0xbd, 0x5c, 0x50, 0x78, 0x7e, 0x30, 0x8, 0xac, + 0x3e, 0x9, 0xb1, 0x68, 0x29, 0x70, 0x8, 0x74, 0x3, 0x19, 0xb1, 0x68, 0x29, + 0x80, 0x26, 0x74, 0x1, 0x19, 0xb1, 0x68, 0x29, 0x6c, 0x99, 0x80, 0x17, 0x7e, + 0x30, 0x9, 0xac, 0x39, 0x9, 0x81, 0x67, 0xd3, 0xbc, 0x8e, 0x78, 0x8, 0x74, + 0xff, 0x19, 0xb1, 0x67, 0xd3, 0x80, 0x7, 0xb, 0x90, 0x12, 0x85, 0xb, 0x38, + 0xe4, 0x7e, 0xa0, 0x3, 0x7e, 0x31, 0x27, 0x74, 0x8, 0xac, 0x3b, 0x19, 0xa1, + 0x68, 0x2a, 0xbe, 0xd0, 0x0, 0x28, 0x2c, 0x1b, 0xd0, 0x7e, 0x70, 0x9, 0xac, + 0x71, 0x2e, 0x34, 0x67, 0x1b, 0x7e, 0x14, 0x2e, 0x77, 0x74, 0x9, 0x12, 0x2a, + 0xc1, 0x12, 0xd1, 0xc4, 0xac, 0x31, 0x12, 0x8f, 0xc9, 0x12, 0x8f, 0xf7, + 0x7e, 0x30, 0x9, 0xac, 0x3d, 0x12, 0x8f, 0xc9, 0x12, 0x2a, 0xc1, 0x1b, 0x10, + 0x12, 0x8f, 0xd0, 0x59, 0xc5, 0x1, 0xff, 0x80, 0x29, 0xb, 0x0, 0x90, 0xd, + 0xe, 0xe4, 0x93, 0xbc, 0xb0, 0x28, 0x2, 0xa1, 0xb6, 0x80, 0x1a, 0x6d, 0x11, + 0x74, 0x2, 0xac, 0xbe, 0x12, 0x8f, 0xe7, 0x7e, 0x30, 0x9, 0xac, 0x3e, 0x19, + 0xa1, 0x1, 0xa9, 0x74, 0x1, 0xa, 0x1e, 0x19, 0xb1, 0x2, 0x15, 0xb, 0x10, + 0xbc, 0xd1, 0x28, 0x2, 0xa1, 0x96, 0x12, 0x8f, 0xff, 0xca, 0x59, 0x7e, 0x18, + 0x67, 0x1b, 0x7e, 0x8, 0x1, 0xa5, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x6c, 0x11, + 0x80, 0x39, 0x7e, 0x70, 0x9, 0xac, 0x71, 0x9, 0xe3, 0x1, 0xa9, 0x12, 0x8f, + 0xdf, 0x28, 0x29, 0x7e, 0x50, 0x8, 0xac, 0x5e, 0x9, 0xb2, 0x68, 0x29, 0xbe, + 0xb0, 0x1, 0x68, 0x3, 0xb4, 0x3, 0x18, 0x6d, 0x22, 0x74, 0x2, 0xac, 0xbe, + 0x59, 0x25, 0x1, 0xff, 0x74, 0xff, 0x19, 0xb3, 0x1, 0xa9, 0x74, 0x1, 0xa, + 0xce, 0x19, 0xbc, 0x2, 0x15, 0xb, 0x10, 0x12, 0x8f, 0xd7, 0x38, 0xc2, 0x7a, + 0xd3, 0x68, 0x79, 0xe4, 0x7a, 0xb3, 0x1, 0x8e, 0xda, 0x79, 0xda, 0xd8, 0x22, + 0x2e, 0x14, 0x67, 0x1b, 0x74, 0x9, 0x22, 0x7e, 0xa1, 0x27, 0x74, 0x2, 0xa4, + 0x22, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbc, 0xb1, 0x22, 0x90, 0xd, 0xe, 0xe4, + 0x93, 0xbc, 0xbe, 0x22, 0x59, 0x15, 0x1, 0xff, 0x7e, 0xa0, 0xff, 0x22, 0x9, + 0x81, 0x0, 0x6, 0xbe, 0x80, 0x14, 0x22, 0x12, 0x2a, 0xc1, 0x7e, 0x34, 0x2e, + 0x77, 0x22, 0x90, 0xd, 0xe, 0xe4, 0x93, 0x7c, 0xab, 0x74, 0x9, 0xa4, 0x22, + 0x7e, 0xb3, 0x3, 0xab, 0x4, 0x7a, 0xb3, 0x3, 0xab, 0x7e, 0x73, 0x3, 0xab, + 0x7a, 0x73, 0x53, 0xfd, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x54, 0xbf, 0xe4, 0x7a, + 0xb3, 0x54, 0x60, 0x90, 0x1, 0x8a, 0x93, 0x7a, 0xb3, 0x54, 0x62, 0x90, 0x1, + 0x8b, 0xe4, 0x93, 0x7a, 0xb3, 0x54, 0x63, 0x90, 0xd, 0xe, 0xe4, 0x93, 0x7a, + 0xb3, 0x54, 0x65, 0xe4, 0x7a, 0xb3, 0x54, 0x66, 0x12, 0x77, 0xf4, 0x7a, + 0xb3, 0x54, 0x6e, 0x7a, 0xb3, 0x54, 0x74, 0x90, 0x1, 0x8e, 0x93, 0x7a, 0xb3, + 0x54, 0x7e, 0x90, 0x1, 0x8f, 0xe4, 0x93, 0x7a, 0xb3, 0x54, 0x7f, 0x7e, 0x73, + 0x3, 0xf1, 0x7a, 0x73, 0x54, 0x80, 0x7e, 0x73, 0x3, 0xf2, 0x7a, 0x73, 0x54, + 0x81, 0x7e, 0x73, 0x3, 0xf3, 0x7a, 0x73, 0x54, 0x82, 0x7e, 0x73, 0x3, 0xf4, + 0x7a, 0x73, 0x54, 0x83, 0x7e, 0x73, 0x3, 0xf5, 0x7a, 0x73, 0x54, 0x84, 0x74, + 0x1, 0x7a, 0xb3, 0x54, 0x90, 0x7e, 0x34, 0xd, 0xf5, 0x12, 0x32, 0xdf, 0x7a, + 0x37, 0x54, 0x9d, 0x7e, 0x34, 0x0, 0x5, 0xca, 0x39, 0x7e, 0x18, 0x3, 0xd1, + 0x7e, 0x8, 0x54, 0xa0, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x74, 0x2, 0x7a, 0xb3, + 0x54, 0x69, 0xe4, 0x7a, 0xb3, 0x54, 0x71, 0x74, 0x64, 0x7a, 0xb3, 0x54, + 0x72, 0xe4, 0x7a, 0xb3, 0x54, 0xa9, 0x12, 0x45, 0xfc, 0xe4, 0x7a, 0xb3, + 0x54, 0x8d, 0x22, 0x7e, 0x18, 0x1d, 0xa0, 0x7a, 0x1f, 0x2d, 0x2a, 0x7e, + 0x18, 0x4, 0x0, 0x7a, 0x1f, 0x2d, 0x2e, 0x7e, 0xf, 0x2d, 0x2a, 0x12, 0x91, + 0x3, 0x7e, 0xf, 0x2d, 0x2e, 0x7e, 0x34, 0x5, 0x20, 0x12, 0x0, 0x2e, 0x7e, + 0x8, 0x2d, 0x0, 0x7e, 0x34, 0x0, 0x26, 0x12, 0x0, 0x2e, 0x7a, 0xb3, 0x2e, + 0x74, 0x22, 0x7e, 0x8, 0x3a, 0x0, 0x7e, 0x34, 0x5, 0x20, 0xe4, 0x2, 0x0, + 0x2e, 0x7e, 0x34, 0xb, 0x65, 0xca, 0x39, 0x7e, 0x34, 0x1, 0x88, 0x7e, 0x24, + 0x0, 0xff, 0x7e, 0x8, 0x68, 0xa4, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x7e, 0x37, + 0x68, 0xaf, 0x2e, 0x37, 0x68, 0xad, 0x7a, 0x37, 0x74, 0xc, 0x90, 0x1, 0x8e, + 0xe4, 0x93, 0xca, 0xb8, 0x90, 0x1, 0x8f, 0xe4, 0x93, 0x7c, 0x7b, 0xda, 0xb8, + 0x12, 0x91, 0x5e, 0x90, 0xd, 0x98, 0xe4, 0x93, 0x70, 0x6, 0x7e, 0x63, 0x68, + 0xa7, 0x80, 0x4, 0x7e, 0x63, 0x68, 0xa6, 0x7e, 0x70, 0x40, 0xac, 0x67, 0x1b, + 0x34, 0x7a, 0x37, 0x74, 0xe, 0x22, 0xa, 0x27, 0x12, 0x5d, 0x71, 0xa, 0x3b, + 0x2d, 0x32, 0x7a, 0x73, 0x74, 0x10, 0xe4, 0x7a, 0xb3, 0x74, 0x11, 0x6c, + 0xaa, 0x7e, 0x73, 0x74, 0x10, 0x7c, 0xba, 0x60, 0x5, 0x1e, 0x70, 0x14, 0x78, + 0xfb, 0x7c, 0xb7, 0x30, 0xe0, 0x9, 0x7e, 0xb3, 0x74, 0x11, 0x4, 0x7a, 0xb3, + 0x74, 0x11, 0xb, 0xa0, 0xbe, 0xa0, 0x4, 0x40, 0xde, 0x22, 0x7e, 0xb3, 0x68, + 0xaa, 0x7e, 0x73, 0x68, 0xab, 0x12, 0x91, 0x5e, 0x7e, 0xb3, 0x68, 0xaa, + 0x7e, 0x73, 0x68, 0xab, 0x22, 0x7e, 0x8, 0x65, 0x60, 0x7e, 0x34, 0x1, 0xa1, + 0xe4, 0x12, 0x0, 0x2e, 0x90, 0xd, 0xf, 0x93, 0x7c, 0x7b, 0x74, 0x9, 0xac, + 0x7b, 0x7e, 0x8, 0x65, 0xdc, 0x74, 0xff, 0x2, 0x0, 0x2e, 0x7e, 0x34, 0x0, + 0x8, 0xca, 0x39, 0x7e, 0x34, 0xc, 0xed, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x8, + 0x3, 0xac, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x7e, 0x34, 0x0, 0x8, 0xca, 0x39, + 0x7e, 0x34, 0xc, 0xf5, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x8, 0x3, 0xb4, 0x12, + 0x2b, 0x7, 0x1b, 0xfd, 0x7e, 0x34, 0x0, 0x8, 0xca, 0x39, 0x7e, 0x34, 0xc, + 0xfd, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x8, 0x3, 0xbc, 0x12, 0x2b, 0x7, 0x1b, + 0xfd, 0x7e, 0x34, 0x0, 0x8, 0xca, 0x39, 0x7e, 0x34, 0xd, 0x5, 0x7e, 0x24, + 0x0, 0xff, 0x7e, 0x8, 0x3, 0xc4, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x6c, 0x33, + 0x7c, 0xb3, 0x12, 0x92, 0xc7, 0xb, 0x30, 0xbe, 0x30, 0x4, 0x40, 0xf4, 0x2, + 0x92, 0x35, 0x7e, 0x8, 0x54, 0xc7, 0x7e, 0x34, 0x0, 0x2c, 0xe4, 0x12, 0x0, + 0x2e, 0x7e, 0x34, 0x0, 0x1, 0x7a, 0x37, 0x54, 0xc7, 0x7a, 0xb3, 0x54, 0xc9, + 0x7a, 0xb3, 0x54, 0xca, 0x7a, 0xb3, 0x54, 0xcb, 0x7a, 0x37, 0x54, 0xdd, + 0x74, 0x1, 0x7a, 0xb3, 0x54, 0xdf, 0xe4, 0x7a, 0xb3, 0x54, 0xe0, 0x74, 0x2, + 0x7a, 0xb3, 0x54, 0xe1, 0x7a, 0x37, 0x54, 0xe8, 0x74, 0xb, 0x7a, 0xb3, 0x54, + 0xea, 0xe4, 0x7a, 0xb3, 0x54, 0xeb, 0x74, 0x3, 0x7a, 0xb3, 0x54, 0xec, 0x7e, + 0xb3, 0x55, 0xf8, 0x7e, 0x34, 0x0, 0x2, 0x7a, 0x37, 0x54, 0xd2, 0xb4, 0x1, + 0x18, 0x74, 0x1, 0x7a, 0xb3, 0x54, 0xd4, 0x7a, 0xb3, 0x54, 0xd5, 0x7a, 0xb3, + 0x54, 0xd6, 0x74, 0x6, 0x7a, 0xb3, 0x54, 0xd7, 0x74, 0x1, 0x80, 0x16, 0x74, + 0x1, 0x7a, 0xb3, 0x54, 0xd4, 0xe4, 0x7a, 0xb3, 0x54, 0xd5, 0x74, 0x1, 0x7a, + 0xb3, 0x54, 0xd6, 0x7a, 0xb3, 0x54, 0xd7, 0xe4, 0x7a, 0xb3, 0x54, 0xd8, + 0x74, 0x1, 0x7a, 0xb3, 0x54, 0xd9, 0x22, 0x7c, 0x5b, 0x7e, 0x70, 0x8, 0xac, + 0x75, 0x9, 0x43, 0x3, 0xb1, 0x74, 0x3, 0xac, 0xb5, 0x19, 0x45, 0x3, 0xe2, + 0x7c, 0xb4, 0x12, 0x93, 0x0, 0x7c, 0x4b, 0x74, 0x3, 0xac, 0xb5, 0x19, 0x45, + 0x3, 0xe0, 0x74, 0x8, 0xac, 0xb5, 0x9, 0xb5, 0x3, 0xb1, 0x12, 0x93, 0x0, + 0x7c, 0xab, 0x7e, 0x70, 0x3, 0xac, 0x75, 0x19, 0xa3, 0x3, 0xe1, 0x22, 0x7c, + 0xab, 0xe4, 0xa, 0x3a, 0x80, 0x3, 0x1e, 0x34, 0x4, 0xbe, 0x34, 0x0, 0x4, + 0x38, 0xf7, 0x22, 0x7f, 0x60, 0xa, 0xfb, 0x12, 0x93, 0x0, 0x7c, 0x7b, 0xa, + 0x57, 0x2e, 0x54, 0x0, 0xb, 0x7e, 0x18, 0x0, 0x1, 0x60, 0x5, 0x2f, 0x11, + 0x14, 0x78, 0xfb, 0x12, 0x96, 0xf4, 0xbe, 0xf4, 0x0, 0x4, 0x68, 0x38, 0x7e, + 0x33, 0x68, 0xa6, 0x7a, 0x33, 0x2e, 0x77, 0x7e, 0x33, 0x68, 0xa7, 0x7a, + 0x33, 0x2e, 0x78, 0x74, 0xb, 0x7a, 0xb3, 0x2e, 0x79, 0x7d, 0xed, 0x7a, 0xe7, + 0x2e, 0x7b, 0x7a, 0xe7, 0x2e, 0x7f, 0xbe, 0xf4, 0x0, 0x2, 0x38, 0xb, 0xe4, + 0x7a, 0xb3, 0x2e, 0x79, 0x7e, 0x34, 0x0, 0x4, 0x8d, 0x3f, 0x7e, 0x8, 0x2e, + 0x77, 0x2, 0x57, 0x86, 0x22, 0xca, 0xf8, 0x7c, 0xfb, 0x7a, 0x1d, 0x2f, 0x7a, + 0xd, 0x2b, 0x7e, 0x18, 0xe, 0x40, 0x7a, 0x1d, 0x33, 0x12, 0x46, 0xb3, 0x7e, + 0xb3, 0x54, 0xa9, 0xb4, 0x1, 0x7, 0x7e, 0x34, 0x0, 0x1, 0x12, 0x58, 0x3d, + 0x7e, 0xd, 0x2b, 0x7e, 0x1d, 0x33, 0x12, 0x93, 0xe0, 0x20, 0x1, 0xd, 0x7e, + 0xb3, 0x55, 0xf8, 0x70, 0x11, 0x7e, 0xb3, 0x56, 0x28, 0xb4, 0x1, 0xa, 0x7e, + 0x18, 0x13, 0x60, 0x7e, 0xd, 0x2f, 0x12, 0x93, 0xe0, 0x7e, 0xd, 0x2b, 0x12, + 0x93, 0xd7, 0x12, 0x93, 0x11, 0x20, 0x1, 0xd, 0x7e, 0xb3, 0x55, 0xf8, 0x70, + 0x10, 0x7e, 0xb3, 0x56, 0x28, 0xb4, 0x1, 0x9, 0x7e, 0xd, 0x2f, 0x12, 0x93, + 0xd7, 0x12, 0x93, 0x11, 0xda, 0xf8, 0x22, 0x74, 0x8, 0xac, 0xbf, 0x9, 0xb5, + 0x3, 0xb1, 0x22, 0x12, 0x97, 0xe5, 0x12, 0xe3, 0xca, 0x12, 0x97, 0xcd, 0x7d, + 0x3f, 0x7a, 0x37, 0x2e, 0x7f, 0x7e, 0x34, 0x0, 0x20, 0x12, 0x97, 0xba, 0x2, + 0x54, 0xe0, 0xca, 0x79, 0xd2, 0x0, 0x12, 0x7f, 0xbb, 0xc2, 0x2a, 0x7e, 0xe3, + 0x54, 0xff, 0xa, 0x3e, 0x9, 0xb3, 0x54, 0xf7, 0x60, 0x3c, 0xa, 0x3b, 0x1b, + 0x34, 0x7c, 0xa7, 0x7a, 0xa3, 0x54, 0x8b, 0xb4, 0x1, 0x4, 0x74, 0x1, 0x80, + 0x1, 0xe4, 0x7a, 0xb3, 0x2e, 0x74, 0xe4, 0xa, 0x3e, 0x19, 0xb3, 0x54, 0xf7, + 0x9, 0xf3, 0x54, 0xfa, 0x7a, 0xf3, 0x55, 0xfd, 0x7c, 0xbe, 0x7c, 0x7f, 0x12, + 0x97, 0x32, 0x7c, 0xbe, 0x7c, 0x7f, 0x12, 0xbf, 0xd5, 0x7e, 0xb3, 0x54, + 0xff, 0x4, 0x7a, 0xb3, 0x54, 0xff, 0x7e, 0xb3, 0x2e, 0x74, 0xbe, 0xb0, 0x1, + 0x68, 0x7, 0x7e, 0xb3, 0x56, 0xa7, 0xb4, 0x3, 0x34, 0x74, 0x3, 0xac, 0xbf, + 0x9, 0xb5, 0x3, 0xe2, 0x7e, 0xf, 0x2d, 0x26, 0x12, 0x93, 0x11, 0x7c, 0xbe, + 0x7c, 0x7f, 0x12, 0x98, 0xfe, 0x92, 0x0, 0x30, 0x0, 0x19, 0x7a, 0xe3, 0x2e, + 0x75, 0x7a, 0xe3, 0x54, 0x8c, 0x12, 0x96, 0xeb, 0x7a, 0x73, 0x56, 0x49, + 0x7a, 0xf3, 0x56, 0x27, 0x12, 0xe3, 0x43, 0x12, 0x97, 0x7, 0x12, 0x97, 0x5e, + 0x7e, 0x73, 0x54, 0xff, 0xa, 0x37, 0xbd, 0x32, 0x48, 0x15, 0x12, 0x96, 0xfd, + 0xd2, 0x2, 0x12, 0x46, 0xb8, 0x12, 0x2f, 0xb2, 0x7e, 0x34, 0x8, 0x0, 0x12, + 0x5b, 0x91, 0x12, 0x78, 0xae, 0x7c, 0xbe, 0x7c, 0x7f, 0x12, 0x94, 0xbd, + 0x12, 0xdf, 0xc8, 0xda, 0x79, 0x22, 0xca, 0xd8, 0xca, 0x79, 0x7c, 0xf7, + 0x7c, 0x7b, 0x74, 0x3, 0xac, 0xbf, 0x9, 0xb5, 0x3, 0xe1, 0xf5, 0x2a, 0x74, + 0x8, 0xac, 0xbf, 0x9, 0x65, 0x3, 0xb1, 0xa, 0xf6, 0x6d, 0xee, 0x7e, 0xb3, + 0x3, 0xca, 0xf5, 0x29, 0x7c, 0xbf, 0x12, 0x98, 0xe2, 0x92, 0x1, 0x20, 0x1, + 0xa, 0x6d, 0x22, 0x7a, 0x27, 0x56, 0x4a, 0x7a, 0x27, 0x56, 0x4c, 0x20, 0x1, + 0x2, 0xc1, 0x52, 0xa5, 0xbf, 0x0, 0x2, 0x80, 0x2, 0xc1, 0x52, 0x7e, 0xa3, + 0x68, 0xa9, 0x12, 0x97, 0x6e, 0x85, 0x29, 0x27, 0x12, 0x96, 0xd0, 0x7e, + 0x68, 0x18, 0x80, 0x7e, 0xd1, 0x27, 0xbe, 0xd0, 0x4, 0x28, 0x3, 0x7e, 0xd0, + 0x4, 0x7e, 0x70, 0x1, 0x80, 0x31, 0x6c, 0xee, 0x80, 0x20, 0x12, 0x96, 0xa7, + 0x28, 0x6, 0x49, 0x21, 0x2e, 0xbf, 0x80, 0x3, 0xb, 0x5a, 0x20, 0x12, 0x96, + 0x6b, 0x50, 0x5, 0x12, 0x96, 0x61, 0x80, 0x3, 0x12, 0x96, 0x7b, 0x12, 0x96, + 0x57, 0xb, 0xe0, 0xbc, 0xde, 0x38, 0xdc, 0x12, 0x96, 0x8d, 0x28, 0x2, 0x7d, + 0xe2, 0xb, 0x70, 0xbc, 0xa7, 0x38, 0xcb, 0xe5, 0x29, 0xa, 0xdb, 0x7e, 0xb3, + 0x68, 0xa4, 0xa, 0xcb, 0x9d, 0xcd, 0x12, 0x96, 0xc4, 0x7e, 0x70, 0x1, 0x80, + 0x33, 0x6c, 0xee, 0x80, 0x20, 0x12, 0x96, 0xa7, 0x28, 0x6, 0x49, 0x21, 0x2e, + 0xbf, 0x80, 0x3, 0xb, 0x5a, 0x20, 0x12, 0x96, 0x6b, 0x50, 0x5, 0x12, 0x96, + 0x61, 0x80, 0x3, 0x12, 0x96, 0x7b, 0x12, 0x96, 0x57, 0xb, 0xe0, 0xe5, 0x27, + 0xbc, 0xbe, 0x38, 0xda, 0x12, 0x96, 0x8d, 0x28, 0x2, 0x7d, 0xe2, 0xb, 0x70, + 0xbc, 0xa7, 0x38, 0xc9, 0xa, 0x4d, 0xe5, 0x28, 0xa, 0xcb, 0x9d, 0xc4, 0x12, + 0x96, 0xc4, 0x7e, 0x70, 0x1, 0x80, 0x31, 0x6c, 0xee, 0x80, 0x20, 0x12, 0x96, + 0xa7, 0x28, 0x6, 0x49, 0x21, 0x2e, 0xbf, 0x80, 0x3, 0xb, 0x5a, 0x20, 0x12, + 0x96, 0x6b, 0x50, 0x5, 0x12, 0x96, 0x61, 0x80, 0x3, 0x12, 0x96, 0x7b, 0x12, + 0x96, 0x57, 0xb, 0xe0, 0xbc, 0xde, 0x38, 0xdc, 0x12, 0x96, 0x8d, 0x28, 0x2, + 0x7d, 0xe2, 0xb, 0x70, 0xbc, 0xa7, 0x38, 0xcb, 0x7e, 0x73, 0x68, 0xa4, 0xac, + 0x7a, 0x7d, 0xd3, 0x12, 0x96, 0xc8, 0x7e, 0x70, 0x1, 0x80, 0x33, 0x6c, 0xee, + 0x80, 0x20, 0x12, 0x96, 0xa7, 0x28, 0x6, 0x49, 0x21, 0x2e, 0xbf, 0x80, 0x3, + 0xb, 0x5a, 0x20, 0x12, 0x96, 0x6b, 0x50, 0x5, 0x12, 0x96, 0x61, 0x80, 0x3, + 0x12, 0x96, 0x7b, 0x12, 0x96, 0x57, 0xb, 0xe0, 0xe5, 0x27, 0xbc, 0xbe, 0x38, + 0xda, 0x12, 0x96, 0x8d, 0x28, 0x2, 0x7d, 0xe2, 0xb, 0x70, 0xbc, 0xa7, 0x38, + 0xc9, 0x7e, 0x37, 0x56, 0x4a, 0x7a, 0x37, 0x56, 0x4c, 0x7d, 0x3e, 0x6d, + 0x22, 0xe5, 0x2a, 0x60, 0x5, 0x2f, 0x11, 0x14, 0x78, 0xfb, 0x12, 0x96, 0xf4, + 0x7a, 0x37, 0x56, 0x4a, 0x12, 0x96, 0xeb, 0x7a, 0x73, 0x56, 0x49, 0xda, + 0x79, 0xda, 0xd8, 0x22, 0x7e, 0x50, 0x2, 0xac, 0x57, 0x59, 0x42, 0x2f, 0x7, + 0x22, 0x7e, 0x50, 0x2, 0xac, 0x57, 0x49, 0x42, 0x2f, 0x7, 0x22, 0x59, 0x21, + 0x2e, 0xbf, 0x7e, 0x50, 0x2, 0xac, 0x57, 0x49, 0x22, 0x2f, 0x7, 0xbd, 0x24, + 0x22, 0x7c, 0x5e, 0xac, 0x5a, 0xa, 0x17, 0x2d, 0x21, 0x3e, 0x24, 0x7f, 0x6, + 0x2d, 0x12, 0xb, 0xa, 0x40, 0x22, 0x7e, 0x30, 0x2, 0xac, 0x37, 0x49, 0x21, + 0x2f, 0x7, 0x49, 0x1, 0x2e, 0xbf, 0x9d, 0x2, 0x59, 0x1, 0x2e, 0x77, 0x49, + 0x21, 0x2e, 0x77, 0xbd, 0x2e, 0x22, 0x7c, 0x5e, 0xac, 0x5a, 0xa, 0x17, 0x2d, + 0x21, 0x3e, 0x24, 0x7f, 0x56, 0x2d, 0xb2, 0xb, 0x5a, 0x40, 0x7e, 0x30, 0x2, + 0xac, 0x37, 0x49, 0x1, 0x2e, 0xbf, 0xbd, 0x4, 0x22, 0xa, 0xda, 0xad, 0xdc, + 0x3e, 0xd4, 0x2e, 0xd4, 0x18, 0x80, 0x6d, 0xcc, 0x7e, 0x70, 0x2, 0xac, 0x7a, + 0x7e, 0x8, 0x2e, 0xbf, 0xe4, 0x12, 0x0, 0x2e, 0x7e, 0x70, 0x2, 0xac, 0x7a, + 0x7e, 0x8, 0x2f, 0x7, 0x74, 0xff, 0x2, 0x0, 0x2e, 0x74, 0x8, 0xac, 0xbf, + 0x9, 0x75, 0x3, 0xac, 0x22, 0x2f, 0x11, 0x2f, 0x11, 0x7d, 0x1f, 0x2, 0x2a, + 0x3a, 0x30, 0x16, 0x6, 0x12, 0x5b, 0x7, 0x12, 0x97, 0x67, 0x22, 0x7e, 0x8, + 0x9, 0x20, 0x7e, 0x1f, 0x2d, 0x2e, 0x2, 0x93, 0xe0, 0xca, 0xf8, 0x6c, 0xff, + 0x12, 0x93, 0xf9, 0xb, 0xf0, 0x12, 0x97, 0x5e, 0xa, 0x3f, 0xbd, 0x32, 0x48, + 0xf2, 0x7e, 0xb3, 0x54, 0x8c, 0x7e, 0x73, 0x56, 0x21, 0x12, 0x97, 0x32, + 0xda, 0xf8, 0x22, 0x14, 0x68, 0x21, 0x14, 0x68, 0x25, 0xb, 0xb1, 0x78, 0x1a, + 0x7e, 0x8, 0xe, 0x40, 0x7a, 0xf, 0x2d, 0x26, 0x7e, 0x8, 0x1d, 0xa0, 0x7a, + 0xf, 0x2d, 0x2a, 0xa5, 0xbf, 0x2, 0xd, 0x7e, 0x18, 0x27, 0xe0, 0x80, 0x3, + 0x12, 0x97, 0xd8, 0x7a, 0x1f, 0x2d, 0x2a, 0x22, 0x7e, 0x73, 0x55, 0x0, 0xa, + 0x27, 0x1b, 0x24, 0x22, 0x4e, 0x70, 0x4, 0x1b, 0xa, 0x30, 0x22, 0x7e, 0xb3, + 0x68, 0xa8, 0xf5, 0x28, 0x22, 0xca, 0x3b, 0x6d, 0x77, 0x7e, 0xb3, 0x68, + 0xa7, 0xf5, 0x27, 0x12, 0x97, 0x6e, 0x7e, 0xd3, 0x68, 0xa9, 0x6c, 0xcc, + 0x80, 0x17, 0x7d, 0x17, 0x3e, 0x14, 0x2e, 0x14, 0x4, 0x0, 0x6d, 0x0, 0x7c, + 0xbd, 0x12, 0xbd, 0x5b, 0xe5, 0x27, 0xa, 0x3b, 0x2d, 0x73, 0xb, 0xc0, 0xe5, + 0x28, 0xbc, 0xbc, 0x38, 0xe3, 0xda, 0x3b, 0x22, 0x12, 0x97, 0xc3, 0x12, + 0x97, 0x75, 0x2, 0x97, 0xb3, 0x74, 0x1, 0x7a, 0xb3, 0x56, 0xc1, 0x22, 0x7a, + 0x37, 0x2e, 0x81, 0x7e, 0x8, 0x2e, 0x77, 0x22, 0xe4, 0x7a, 0xb3, 0x67, 0x12, + 0x7a, 0xb3, 0x67, 0x13, 0x22, 0x7a, 0xb3, 0x2e, 0x7a, 0x7d, 0x3d, 0x7a, + 0x37, 0x2e, 0x7b, 0x22, 0x7e, 0x18, 0x13, 0x60, 0x7a, 0x1f, 0x2d, 0x26, + 0x7e, 0x18, 0x22, 0xc0, 0x22, 0x7f, 0x61, 0x7f, 0x70, 0x7e, 0x8, 0x2e, 0x77, + 0x7e, 0x34, 0x0, 0x10, 0xe4, 0x2, 0x0, 0x2e, 0x12, 0x9f, 0xf0, 0x12, 0x9f, + 0xed, 0x2, 0x97, 0xfe, 0xca, 0xf8, 0x12, 0x98, 0x17, 0x12, 0x4d, 0x95, 0x6c, + 0xff, 0x7c, 0xbf, 0x12, 0x68, 0xdb, 0xb, 0xf0, 0xbe, 0xf0, 0x4, 0x40, 0xf4, + 0xda, 0xf8, 0x22, 0x6c, 0xaa, 0x7e, 0x30, 0x3c, 0xac, 0x3a, 0x12, 0x6b, + 0xa1, 0x7e, 0x34, 0x0, 0x3c, 0xe4, 0x12, 0x0, 0x2e, 0xb, 0xa0, 0xbe, 0xa0, + 0x4, 0x40, 0xe9, 0x22, 0xca, 0xd8, 0xca, 0x79, 0x7c, 0xf7, 0x7c, 0xeb, 0x6c, + 0xdd, 0x74, 0x8, 0xac, 0xbd, 0x19, 0xe5, 0x3, 0xae, 0x19, 0xf5, 0x3, 0xaf, + 0xb, 0xd0, 0xbe, 0xd0, 0x4, 0x78, 0xed, 0x6c, 0xdd, 0x74, 0xee, 0xac, 0xbd, + 0x12, 0x98, 0x9b, 0x7a, 0xf1, 0x29, 0x7e, 0x70, 0x3c, 0xac, 0x7d, 0x7d, + 0x13, 0x12, 0x6b, 0x95, 0x2e, 0x34, 0x34, 0xe7, 0x6d, 0x22, 0x7c, 0xbe, + 0x12, 0x98, 0xa2, 0x7d, 0x3f, 0xb, 0x34, 0x74, 0x3c, 0xac, 0xbd, 0x49, 0x25, + 0x34, 0xb7, 0x12, 0x98, 0x8f, 0xac, 0xbd, 0x12, 0x39, 0xa7, 0xb, 0xd0, 0xbe, + 0xd0, 0x4, 0x40, 0xc6, 0xda, 0x79, 0xda, 0xd8, 0x22, 0x12, 0x39, 0xab, 0x7d, + 0x3f, 0x2e, 0x34, 0x0, 0x19, 0x74, 0x3c, 0x22, 0x7d, 0xf5, 0x2e, 0xf4, 0x1, + 0x0, 0x22, 0xb, 0xa, 0x40, 0x5e, 0x80, 0xc7, 0x1b, 0xa, 0x40, 0x54, 0x7, + 0xa, 0x5b, 0x7d, 0x45, 0x7c, 0x89, 0x6c, 0x99, 0x3e, 0x44, 0x3e, 0x44, 0x3e, + 0x44, 0xb, 0xa, 0x50, 0x4d, 0x54, 0x12, 0x5f, 0xc1, 0x5e, 0x20, 0xe3, 0x1b, + 0x1a, 0x10, 0xe5, 0x29, 0x54, 0x7, 0xa, 0x1b, 0x7d, 0x1, 0x7c, 0x1, 0x6c, + 0x11, 0x3e, 0x4, 0x3e, 0x4, 0xb, 0x1a, 0x10, 0x4d, 0x10, 0x1b, 0x1a, 0x10, + 0x22, 0x7c, 0xab, 0xd2, 0x2, 0x7e, 0xb3, 0x55, 0xf8, 0x70, 0x4, 0xc2, 0x2, + 0x80, 0xb, 0x4c, 0xaa, 0x68, 0x5, 0xbe, 0xa0, 0x2, 0x78, 0x2, 0xc2, 0x2, + 0xa2, 0x2, 0x22, 0x7c, 0x67, 0x7c, 0x7b, 0xd2, 0x1, 0x7e, 0xb3, 0x56, 0xa7, + 0xb4, 0x3, 0x4b, 0x7c, 0xb6, 0x12, 0x98, 0xe2, 0x50, 0x44, 0x7e, 0xa3, 0x54, + 0x69, 0xbe, 0xa0, 0x2, 0x40, 0x31, 0x12, 0x51, 0x2d, 0x68, 0x28, 0x7e, 0x63, + 0x56, 0xbe, 0xa, 0x26, 0x2e, 0x24, 0x0, 0x4e, 0x12, 0x9f, 0x3a, 0x24, 0xff, + 0x92, 0x1, 0x7c, 0xb6, 0x4, 0x7a, 0xb3, 0x56, 0xbe, 0x7e, 0x63, 0x56, 0xbe, + 0xbe, 0x60, 0x8, 0x40, 0x15, 0xe4, 0x7a, 0xb3, 0x56, 0xbe, 0x80, 0xe, 0xd2, + 0x1, 0x80, 0xa, 0xbc, 0xa7, 0x78, 0x4, 0xd2, 0x1, 0x80, 0x2, 0xc2, 0x1, + 0xa2, 0x1, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x67, 0x1a, 0x7e, 0xb3, 0x67, 0xb, + 0xb4, 0x1, 0x5, 0xe4, 0x7a, 0xb3, 0x67, 0x1a, 0x12, 0x9f, 0x9c, 0x28, 0x5, + 0xe4, 0x7a, 0xb3, 0x67, 0x1a, 0x7e, 0xb3, 0x2e, 0x74, 0x70, 0x5, 0xe4, 0x7a, + 0xb3, 0x67, 0x1a, 0x7e, 0xb3, 0x56, 0x95, 0xb4, 0x1, 0x5, 0xe4, 0x7a, 0xb3, + 0x67, 0x1a, 0x7e, 0xb3, 0x56, 0x21, 0x12, 0x98, 0xe2, 0x7e, 0xb3, 0x55, + 0xf8, 0x70, 0x1c, 0x7e, 0xb3, 0x56, 0x28, 0xb4, 0x1, 0x15, 0x7e, 0xb3, 0x54, + 0x13, 0xb4, 0x1, 0xe, 0x7e, 0x73, 0x56, 0x8e, 0xbe, 0x70, 0x3a, 0x50, 0x5, + 0xe4, 0x7a, 0xb3, 0x67, 0x1a, 0x22, 0x12, 0x99, 0x59, 0x12, 0xbd, 0x21, + 0x12, 0x9a, 0x50, 0x2, 0x99, 0xc2, 0xc2, 0x0, 0x7e, 0xa3, 0x2e, 0x75, 0xbe, + 0xa0, 0x2, 0x50, 0x2e, 0x7e, 0xb3, 0x67, 0x14, 0x60, 0x21, 0xa, 0x4a, 0x9, + 0xb4, 0x56, 0xa9, 0xbe, 0xb3, 0x67, 0xa, 0x50, 0xc, 0x7d, 0x34, 0x2e, 0x34, + 0x56, 0xa9, 0x4, 0x7a, 0x39, 0xb0, 0x80, 0x10, 0xe4, 0x19, 0xb4, 0x56, 0xa9, + 0xd2, 0x0, 0x80, 0x7, 0xe4, 0xa, 0x3a, 0x19, 0xb3, 0x56, 0xa9, 0x20, 0x0, + 0x2a, 0x7e, 0xb3, 0x67, 0x14, 0xb4, 0x1, 0x1e, 0xe4, 0x7a, 0xb3, 0x67, 0x1a, + 0x7e, 0x73, 0x67, 0xa, 0xbe, 0x73, 0x56, 0xa8, 0x28, 0xc, 0xe4, 0x7a, 0xb3, + 0x67, 0x14, 0x7e, 0xb3, 0x56, 0xa8, 0x4, 0x80, 0x4, 0xe4, 0x80, 0x1, 0xe4, + 0x7a, 0xb3, 0x56, 0xa8, 0x7e, 0xb3, 0x67, 0x1a, 0xb4, 0x1, 0x1a, 0x7e, 0x73, + 0x67, 0x9, 0xbe, 0x73, 0x56, 0xac, 0x28, 0xc, 0xe4, 0x7a, 0xb3, 0x67, 0x1a, + 0x7e, 0xb3, 0x56, 0xac, 0x4, 0x80, 0x6, 0x74, 0x1, 0x80, 0x2, 0x74, 0x1, + 0x7a, 0xb3, 0x56, 0xac, 0x22, 0x7e, 0x47, 0x66, 0xf4, 0x7e, 0x7, 0x68, 0x8b, + 0x7e, 0x34, 0x0, 0x6, 0xad, 0x30, 0x7e, 0x14, 0x0, 0x4, 0x12, 0x9b, 0x10, + 0x8, 0x5, 0x7e, 0xa0, 0x4, 0x80, 0x1d, 0x7d, 0x30, 0x3e, 0x34, 0x12, 0x9b, + 0xe, 0x8, 0x5, 0x7e, 0xa0, 0x3, 0x80, 0xf, 0x7d, 0x30, 0x12, 0x9b, 0xe, 0x8, + 0x5, 0x7e, 0xa0, 0x2, 0x80, 0x3, 0x7e, 0xa0, 0x1, 0x7e, 0xb3, 0x67, 0x11, + 0x60, 0x3, 0x7e, 0xa0, 0x4, 0xa, 0x2a, 0x7e, 0x14, 0xd, 0xc8, 0x7e, 0x4, + 0x0, 0xff, 0xb, 0xa, 0x30, 0xad, 0x32, 0x12, 0x9f, 0xb7, 0x7e, 0xb3, 0x66, + 0xea, 0xbe, 0xb0, 0x0, 0x28, 0x28, 0x7e, 0xb3, 0x67, 0xb, 0x70, 0x22, 0x7e, + 0x37, 0x67, 0x7, 0xbe, 0x34, 0x0, 0x2, 0x48, 0x9, 0x12, 0x9f, 0x85, 0x7a, + 0x37, 0x67, 0x7, 0x80, 0xf, 0x7e, 0x63, 0x67, 0x9, 0x7e, 0x70, 0x2, 0xac, + 0x67, 0x7c, 0xb7, 0x7a, 0xb3, 0x67, 0x9, 0x7e, 0xb3, 0x54, 0x13, 0xb4, 0x1, + 0xe, 0x7e, 0x27, 0x67, 0x7, 0x7e, 0x34, 0x0, 0x5, 0xad, 0x32, 0x7a, 0x37, + 0x67, 0x7, 0x7e, 0xb3, 0x55, 0x73, 0xbe, 0xb0, 0x0, 0x28, 0x1a, 0xbe, 0xb0, + 0x4, 0x38, 0x15, 0x7e, 0xb3, 0x68, 0x9d, 0xb4, 0x1, 0xe, 0x7e, 0x34, 0x0, + 0x1, 0x7a, 0x37, 0x67, 0x7, 0x74, 0x1, 0x7a, 0xb3, 0x67, 0x9, 0x22, 0x3e, + 0x34, 0x7d, 0x21, 0x12, 0x29, 0xee, 0xbd, 0x34, 0x22, 0x12, 0x9b, 0x6e, + 0x12, 0x99, 0xb6, 0x12, 0x9b, 0x5a, 0x40, 0x5, 0xe4, 0x7a, 0xb3, 0x67, 0x14, + 0x7e, 0xb3, 0x67, 0x14, 0x60, 0x16, 0xe4, 0x7a, 0xb3, 0x56, 0xa8, 0x7e, 0x8, + 0x56, 0xa9, 0x7e, 0x34, 0x0, 0x2, 0x12, 0x0, 0x2e, 0x74, 0xf, 0x7a, 0xb3, + 0x74, 0xb, 0x12, 0x9b, 0x5a, 0x40, 0x6, 0x12, 0x9b, 0x9e, 0x12, 0x9f, 0xad, + 0x7e, 0xb3, 0x67, 0x1a, 0x60, 0x4, 0xe4, 0x2, 0xe3, 0xdb, 0x22, 0x7e, 0xb3, + 0x56, 0x28, 0x70, 0xc, 0x7e, 0x73, 0x56, 0x0, 0xbe, 0x73, 0x56, 0x29, 0x40, + 0x2, 0xc3, 0x22, 0xd3, 0x22, 0x12, 0x9c, 0x2, 0x12, 0xbe, 0xd0, 0x12, 0x9f, + 0x7f, 0x2, 0x9b, 0x7a, 0x7e, 0x27, 0x74, 0xc, 0x1e, 0x24, 0x1e, 0x24, 0xe4, + 0x7a, 0xb3, 0x67, 0x11, 0x7e, 0x37, 0x66, 0xec, 0xbd, 0x32, 0x38, 0x8, 0x7e, + 0x37, 0x66, 0xee, 0xbd, 0x32, 0x28, 0x6, 0x74, 0x1, 0x7a, 0xb3, 0x67, 0x11, + 0x22, 0x7e, 0x18, 0x9, 0x20, 0x7a, 0x1d, 0x27, 0x7e, 0x1f, 0x2d, 0x2a, 0x7f, + 0x1, 0xe4, 0x12, 0x9b, 0xce, 0x7e, 0xb3, 0x55, 0xf8, 0x70, 0x18, 0x7e, 0xb3, + 0x56, 0x28, 0xb4, 0x1, 0x11, 0x7e, 0x18, 0xe, 0x40, 0x7a, 0x1d, 0x27, 0x7e, + 0x18, 0x1d, 0xa0, 0x7f, 0x1, 0xe4, 0x2, 0x9b, 0xce, 0x22, 0x7c, 0xab, 0x12, + 0x97, 0xe5, 0x7e, 0xb3, 0x68, 0xa7, 0x7a, 0xb3, 0x2e, 0x78, 0x7e, 0xb3, + 0x68, 0xa6, 0x7a, 0xb3, 0x2e, 0x77, 0x7a, 0xa3, 0x2e, 0x79, 0xe4, 0x12, + 0x97, 0xcd, 0x7e, 0x1d, 0x27, 0x7a, 0x37, 0x2e, 0x7d, 0x7d, 0x3f, 0x7a, + 0x37, 0x2e, 0x7f, 0x7e, 0x34, 0x0, 0x10, 0x12, 0x97, 0xba, 0x2, 0x54, 0xe0, + 0xe4, 0x7a, 0xb3, 0x67, 0xb, 0x75, 0x27, 0x0, 0x75, 0x28, 0x0, 0x7e, 0xb3, + 0x68, 0xa6, 0xf5, 0x29, 0x7e, 0xb3, 0x68, 0xa7, 0xf5, 0x2a, 0x7e, 0x8, 0x0, + 0x27, 0x7e, 0x37, 0x68, 0x89, 0x12, 0x9c, 0x3d, 0xe4, 0x33, 0x7a, 0xb3, + 0x67, 0xb, 0x12, 0x9f, 0xc5, 0xe4, 0x33, 0x7a, 0xb3, 0x67, 0xf, 0x12, 0xbf, + 0x24, 0xe4, 0x33, 0x7a, 0xb3, 0x67, 0x10, 0x22, 0xca, 0xd8, 0xca, 0x79, + 0x7d, 0x43, 0x7f, 0x70, 0x12, 0x9f, 0x94, 0x28, 0x33, 0x6c, 0xff, 0x80, + 0x2a, 0x74, 0x2, 0xac, 0xbf, 0x9, 0xe5, 0x65, 0x60, 0x9, 0xd5, 0x65, 0x61, + 0x7c, 0xbe, 0x7c, 0x7d, 0x12, 0x36, 0x62, 0x7d, 0xd3, 0x7f, 0x7, 0x7c, 0x7d, + 0x12, 0xbf, 0xb0, 0x50, 0x7, 0xbd, 0x4d, 0x58, 0x6, 0xd3, 0x80, 0xb, 0xd3, + 0x80, 0x8, 0xb, 0xf0, 0x12, 0x9c, 0x83, 0x38, 0xd1, 0xc3, 0xda, 0x79, 0xda, + 0xd8, 0x22, 0x7e, 0x73, 0x66, 0xea, 0xbc, 0x7f, 0x22, 0xca, 0xf8, 0xc2, 0x0, + 0xc2, 0x1, 0x7e, 0xb3, 0x66, 0xea, 0x70, 0x5, 0x12, 0x9f, 0x65, 0x80, 0x6f, + 0x7e, 0xb3, 0x54, 0x3e, 0x70, 0x69, 0x7e, 0xb3, 0x54, 0x30, 0xbe, 0xb0, 0x1, + 0x68, 0x60, 0x12, 0x9d, 0x59, 0x92, 0x1, 0x12, 0xbe, 0xa2, 0x92, 0x0, 0x30, + 0x0, 0x13, 0x7e, 0x34, 0xd, 0xe7, 0x12, 0x32, 0xdf, 0x7a, 0x37, 0x56, 0x9a, + 0x74, 0x1, 0x7a, 0xb3, 0x56, 0x96, 0x80, 0x14, 0x30, 0x1, 0x17, 0x7e, 0x34, + 0xd, 0xe7, 0x12, 0x32, 0xdf, 0x7a, 0x37, 0x56, 0x9a, 0x74, 0x1, 0x7a, 0xb3, + 0x56, 0x97, 0x74, 0x1, 0x7a, 0xb3, 0x56, 0x95, 0x7e, 0xb3, 0x56, 0x96, 0x60, + 0xe, 0x6c, 0xff, 0x80, 0x3, 0x12, 0x9d, 0xd, 0x12, 0x9c, 0x83, 0x38, 0xf8, + 0x80, 0x12, 0x7e, 0xb3, 0x56, 0x97, 0x60, 0xc, 0x6c, 0xff, 0x80, 0x3, 0x12, + 0x9d, 0xd, 0x12, 0x9c, 0x83, 0x38, 0xf8, 0xda, 0xf8, 0x22, 0x7c, 0xbf, 0x6c, + 0x77, 0x12, 0x9d, 0x1b, 0xb, 0xf0, 0x22, 0x7c, 0xb1, 0x6c, 0x77, 0x7c, 0x67, + 0x7c, 0x7b, 0xc4, 0x23, 0x54, 0x1f, 0x7c, 0xab, 0x7c, 0xb7, 0x54, 0x7, 0xa, + 0x2b, 0x2e, 0x24, 0x0, 0x5e, 0x12, 0x9f, 0x3a, 0x7c, 0x7b, 0x4c, 0x66, 0x68, + 0xb, 0xa, 0x2a, 0x12, 0x9f, 0x8c, 0x4c, 0xb7, 0x7a, 0x29, 0xb0, 0x22, 0x7c, + 0xb7, 0x64, 0xff, 0xa, 0x2a, 0x2e, 0x24, 0x65, 0xd8, 0x2, 0x9d, 0x50, 0x7e, + 0x29, 0x70, 0x5c, 0x7b, 0x7a, 0x29, 0x70, 0x22, 0xca, 0x3b, 0x7e, 0xe3, + 0x68, 0xa6, 0x7e, 0xd3, 0x68, 0xa7, 0xc2, 0x2c, 0x7e, 0xd7, 0x66, 0xf0, 0xe, + 0xd4, 0x6c, 0xcc, 0xc1, 0xd2, 0x7e, 0x30, 0x2, 0xac, 0x3c, 0x9, 0xb1, 0x65, + 0x60, 0x7a, 0xb3, 0x2e, 0x77, 0x9, 0x71, 0x65, 0x61, 0x7a, 0x73, 0x2e, 0x78, + 0x12, 0x36, 0x62, 0x7d, 0xc3, 0xbd, 0xdc, 0x8, 0x2, 0xc1, 0xd0, 0xbe, 0xe3, + 0x2e, 0x77, 0x38, 0x2, 0xc1, 0xd0, 0xbe, 0xd3, 0x2e, 0x78, 0x38, 0x2, 0xc1, + 0xd0, 0x7d, 0x1c, 0xe, 0x14, 0x7d, 0xec, 0xe, 0xe4, 0xe, 0xe4, 0x2d, 0xe1, + 0x6d, 0xff, 0x12, 0x9f, 0x50, 0x12, 0x9f, 0x10, 0x80, 0x32, 0x6c, 0x99, + 0x7e, 0xf3, 0x2e, 0x77, 0x80, 0x1e, 0x7c, 0xbf, 0x7e, 0x73, 0x2e, 0x7c, + 0x12, 0x9e, 0xe5, 0x18, 0x9, 0xbd, 0xc0, 0x48, 0x5, 0x12, 0x9f, 0x7, 0x80, + 0x8, 0x7e, 0x73, 0x2e, 0x7b, 0xbc, 0x7f, 0x58, 0x7, 0x1b, 0xf0, 0xbe, 0xf0, + 0x0, 0x58, 0xdd, 0x4c, 0x99, 0x68, 0x8, 0x12, 0x9f, 0x23, 0x12, 0x9e, 0xed, + 0x58, 0xc9, 0x12, 0x9f, 0x43, 0x58, 0x38, 0x12, 0x9f, 0x10, 0x80, 0x2e, + 0x12, 0x9f, 0x2d, 0x80, 0x1e, 0x7c, 0xb8, 0x7e, 0x73, 0x2e, 0x7c, 0x12, + 0x9e, 0xe5, 0x18, 0x9, 0xbd, 0xc0, 0x48, 0x5, 0x12, 0x9e, 0xf5, 0x80, 0x8, + 0x7e, 0x73, 0x2e, 0x7a, 0xbc, 0x78, 0x28, 0x6, 0xb, 0x80, 0xbc, 0xe8, 0x38, + 0xde, 0x4c, 0x99, 0x68, 0x8, 0x12, 0x9f, 0x23, 0x12, 0x9e, 0xed, 0x58, 0xcd, + 0x12, 0x9f, 0x50, 0xa, 0x5d, 0x1b, 0x54, 0x7e, 0x73, 0x2e, 0x78, 0xa, 0x17, + 0xbd, 0x15, 0x58, 0x77, 0x12, 0x9e, 0xfe, 0x80, 0x2e, 0x6c, 0x99, 0x7e, + 0xf3, 0x2e, 0x77, 0x80, 0x1a, 0x7c, 0xbf, 0x12, 0x9e, 0xe1, 0x18, 0x9, 0xbd, + 0xc0, 0x48, 0x5, 0x12, 0x9f, 0x7, 0x80, 0x8, 0x7e, 0x73, 0x2e, 0x7b, 0xbc, + 0x7f, 0x58, 0x7, 0x1b, 0xf0, 0xbe, 0xf0, 0x0, 0x58, 0xe1, 0x4c, 0x99, 0x68, + 0x9, 0x12, 0x9f, 0x19, 0xbe, 0xd3, 0x2e, 0x79, 0x38, 0xcc, 0x12, 0x9f, 0x43, + 0x58, 0x39, 0x7e, 0x73, 0x2e, 0x78, 0x12, 0x9e, 0xfe, 0x80, 0x2a, 0x12, + 0x9f, 0x2d, 0x80, 0x1a, 0x7c, 0xb8, 0x12, 0x9e, 0xe1, 0x18, 0x9, 0xbd, 0xc0, + 0x48, 0x5, 0x12, 0x9e, 0xf5, 0x80, 0x8, 0x7e, 0x73, 0x2e, 0x7a, 0xbc, 0x78, + 0x28, 0x6, 0xb, 0x80, 0xbc, 0xe8, 0x38, 0xe2, 0x4c, 0x99, 0x68, 0x9, 0x12, + 0x9f, 0x19, 0xbe, 0xd3, 0x2e, 0x79, 0x38, 0xd0, 0x90, 0xd, 0xe2, 0xe4, 0x93, + 0xa, 0x1b, 0xbd, 0x1f, 0x38, 0x14, 0xd2, 0x2c, 0x7e, 0x73, 0x2e, 0x77, 0x7a, + 0x73, 0x56, 0x98, 0x7e, 0x73, 0x2e, 0x78, 0x7a, 0x73, 0x56, 0x99, 0x80, 0xc, + 0xb, 0xc0, 0x7e, 0x73, 0x66, 0xea, 0xbc, 0x7c, 0x28, 0x2, 0xa1, 0x6f, 0xa2, + 0x2c, 0xda, 0x3b, 0x22, 0x7e, 0x73, 0x2e, 0x79, 0x12, 0x36, 0x62, 0x7d, 0x3, + 0xbd, 0xe0, 0x22, 0x7e, 0x73, 0x2e, 0x7c, 0xbe, 0x70, 0x0, 0x22, 0xb, 0xf4, + 0xb, 0x90, 0x7a, 0x83, 0x2e, 0x7a, 0x22, 0xa, 0x37, 0xb, 0x34, 0x7a, 0x73, + 0x2e, 0x79, 0x22, 0xb, 0xf4, 0xb, 0x90, 0x7a, 0xf3, 0x2e, 0x7b, 0x22, 0x7e, + 0x73, 0x2e, 0x78, 0x7a, 0x73, 0x2e, 0x7c, 0x22, 0x7e, 0xb3, 0x2e, 0x79, 0x4, + 0x7a, 0xb3, 0x2e, 0x79, 0x22, 0x7e, 0xb3, 0x2e, 0x7c, 0x14, 0x7a, 0xb3, + 0x2e, 0x7c, 0x22, 0x6c, 0x99, 0x7e, 0x83, 0x2e, 0x77, 0xa, 0x18, 0xb, 0x14, + 0x7c, 0x83, 0x22, 0x7a, 0x51, 0x82, 0x7a, 0x41, 0x83, 0xe4, 0x93, 0x22, 0xa, + 0x5e, 0x1b, 0x54, 0x7e, 0x73, 0x2e, 0x77, 0xa, 0x17, 0xbd, 0x15, 0x22, 0x7e, + 0x73, 0x2e, 0x77, 0xa, 0x37, 0xb, 0x34, 0x7a, 0x73, 0x2e, 0x7a, 0x7e, 0x73, + 0x2e, 0x77, 0x7a, 0x73, 0x2e, 0x7b, 0x22, 0x7e, 0x37, 0x56, 0x9a, 0xbe, + 0x34, 0x0, 0x0, 0x28, 0x7, 0x1b, 0x34, 0x7a, 0x37, 0x56, 0x9a, 0x22, 0xe4, + 0x12, 0x9f, 0xa4, 0x7a, 0xb3, 0x56, 0x95, 0x22, 0xe4, 0x7a, 0xb3, 0x67, 0xe, + 0x22, 0x7e, 0x24, 0x0, 0x2, 0x2, 0x29, 0xee, 0x2e, 0x24, 0x65, 0xd8, 0x7e, + 0x29, 0xb0, 0x22, 0x7e, 0x73, 0x66, 0xea, 0xbe, 0x70, 0x0, 0x22, 0x7e, 0x73, + 0x68, 0x7a, 0xbe, 0x70, 0x0, 0x22, 0x7a, 0xb3, 0x56, 0x96, 0x7a, 0xb3, 0x56, + 0x97, 0x22, 0xe4, 0x7a, 0xb3, 0x66, 0xea, 0x7a, 0xb3, 0x66, 0xeb, 0x22, + 0x7a, 0x37, 0x67, 0x7, 0x90, 0xd, 0xca, 0xe4, 0x93, 0x7a, 0xb3, 0x67, 0x9, + 0x22, 0x7e, 0x37, 0x66, 0xee, 0x2e, 0x37, 0x66, 0xec, 0xbe, 0x37, 0x67, 0x5, + 0x28, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0x6d, 0x33, 0x7a, 0x37, 0x56, 0x9a, 0xe4, + 0x7a, 0xb3, 0x56, 0x98, 0x7a, 0xb3, 0x56, 0x99, 0x7a, 0xb3, 0x56, 0x95, 0x2, + 0x9f, 0xa4, 0x2, 0x40, 0x6d, 0x12, 0xe0, 0x9a, 0x90, 0x1, 0x90, 0xe4, 0x93, + 0x60, 0x6, 0x7e, 0x34, 0x9d, 0x2, 0x80, 0x4, 0x7e, 0x34, 0x9d, 0x0, 0x7a, + 0x37, 0x34, 0x83, 0x7e, 0x37, 0x68, 0xb7, 0x7a, 0x37, 0x34, 0x85, 0x7e, + 0x34, 0x43, 0x21, 0x7a, 0x37, 0x34, 0x87, 0x7e, 0x34, 0x23, 0x45, 0x7a, + 0x37, 0x34, 0x89, 0x7e, 0x34, 0x12, 0x5, 0x7a, 0x37, 0x34, 0x8b, 0xc2, 0xa, + 0x12, 0x5e, 0x72, 0x7e, 0xb3, 0x55, 0xf8, 0xb4, 0x1, 0xa, 0x12, 0x5f, 0x78, + 0x68, 0x5, 0xd2, 0xa, 0x12, 0x5d, 0xc8, 0x7e, 0x34, 0x0, 0x1e, 0x7e, 0x8, + 0x34, 0x3f, 0x7e, 0x24, 0x0, 0x22, 0x12, 0x40, 0xbe, 0x7e, 0x34, 0x0, 0x20, + 0x7e, 0x27, 0x34, 0x83, 0x12, 0x3f, 0x20, 0x7e, 0x34, 0x0, 0x21, 0x7e, 0x27, + 0x34, 0x85, 0x12, 0x3f, 0x20, 0x7e, 0x34, 0x0, 0x39, 0x7e, 0x8, 0x34, 0x87, + 0x7e, 0x24, 0x0, 0x3, 0x2, 0x40, 0x57, 0x7c, 0x7b, 0xc4, 0x23, 0x54, 0x1f, + 0xa, 0x2b, 0x9, 0xa2, 0x65, 0xd8, 0x7c, 0xb7, 0x54, 0x7, 0xa, 0x3b, 0x2e, + 0x34, 0x0, 0x5e, 0x12, 0x49, 0xe4, 0x5c, 0xba, 0x22, 0x6c, 0x33, 0x6c, 0x22, + 0x80, 0x20, 0x7c, 0xb2, 0x12, 0xa0, 0x72, 0x60, 0x17, 0x74, 0x2, 0xac, 0xb2, + 0x9, 0x15, 0x65, 0x60, 0x9, 0x5, 0x65, 0x61, 0x7c, 0xb1, 0x7c, 0x70, 0x12, + 0xa0, 0xc4, 0x50, 0x2, 0xb, 0x30, 0xb, 0x20, 0x7e, 0x73, 0x66, 0xea, 0xbc, + 0x72, 0x38, 0xd8, 0x7c, 0xb3, 0x22, 0xe5, 0x29, 0x7e, 0x71, 0x2a, 0x7c, + 0xab, 0x4c, 0x77, 0x68, 0x18, 0x7e, 0xb3, 0x68, 0xa9, 0x14, 0xbc, 0xb7, + 0x68, 0xf, 0x4c, 0xaa, 0x68, 0xb, 0x7e, 0xb3, 0x68, 0xa8, 0x14, 0xbc, 0xba, + 0x68, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0xca, 0x3b, 0x6c, 0xff, 0x75, 0x2d, 0x0, + 0x12, 0xa0, 0x8e, 0x7c, 0xdb, 0x6c, 0xee, 0x7e, 0xb3, 0x68, 0xa8, 0xf5, + 0x2b, 0x7e, 0xb3, 0x68, 0xa9, 0xf5, 0x2c, 0xe4, 0x7a, 0xb3, 0x56, 0xb7, + 0x7e, 0xb3, 0x2e, 0x74, 0xb4, 0x1, 0x2, 0x80, 0x2, 0x41, 0x2d, 0x75, 0x2d, + 0x0, 0x6c, 0xcc, 0x41, 0x1b, 0x7e, 0x70, 0x2, 0xac, 0x7c, 0x12, 0xa7, 0xa1, + 0x75, 0x27, 0x3, 0x75, 0x28, 0x3, 0x7e, 0xb3, 0x68, 0x9e, 0x60, 0x8, 0x75, + 0x27, 0x4, 0x75, 0x28, 0x4, 0x21, 0xe0, 0x7e, 0x63, 0x66, 0xea, 0xbe, 0x60, + 0x6, 0x40, 0x1e, 0x12, 0xa0, 0xbf, 0x50, 0x45, 0xbe, 0xd0, 0x1, 0x78, 0x2, + 0x80, 0x21, 0xbe, 0xd0, 0x2, 0x38, 0x2, 0x80, 0x27, 0xbe, 0xd0, 0x3, 0x38, + 0x32, 0x80, 0x28, 0x80, 0x2e, 0x80, 0x2c, 0xbe, 0x60, 0x4, 0x40, 0x2f, 0x12, + 0xa0, 0xbf, 0x50, 0x22, 0xbe, 0xd0, 0x1, 0x78, 0x8, 0x75, 0x27, 0x5, 0x75, + 0x28, 0x5, 0x80, 0x71, 0xbe, 0xd0, 0x2, 0x38, 0x8, 0x75, 0x27, 0x3, 0x75, + 0x28, 0x3, 0x80, 0x64, 0x75, 0x27, 0x2, 0x75, 0x28, 0x2, 0x80, 0x5c, 0x75, + 0x27, 0x1, 0x75, 0x28, 0x1, 0x80, 0x54, 0xe5, 0x29, 0xbe, 0xb0, 0x1, 0x28, + 0xe, 0xe5, 0x2b, 0xa, 0x2b, 0x1b, 0x25, 0xe5, 0x29, 0xa, 0x3b, 0xbd, 0x32, + 0x48, 0x3, 0x75, 0x27, 0x2, 0xe5, 0x2a, 0xbe, 0xb0, 0x1, 0x28, 0xe, 0xe5, + 0x2c, 0xa, 0x2b, 0x1b, 0x25, 0xe5, 0x2a, 0xa, 0x3b, 0xbd, 0x32, 0x48, 0x3, + 0x75, 0x28, 0x2, 0xc2, 0x0, 0xe5, 0x29, 0x7e, 0x71, 0x2a, 0x7c, 0x6c, 0x12, + 0xe2, 0xa0, 0xbe, 0xb0, 0xff, 0x68, 0x6, 0x75, 0x27, 0x2, 0x75, 0x28, 0x2, + 0x7c, 0xbc, 0x7e, 0x8, 0x0, 0x27, 0x7e, 0x18, 0x0, 0x28, 0x12, 0xa8, 0x36, + 0xe5, 0x27, 0x7e, 0x71, 0x28, 0x7c, 0x6c, 0x7c, 0x5e, 0x7e, 0x41, 0x2d, + 0x12, 0xa9, 0xa0, 0x7e, 0x70, 0x9, 0xac, 0x7e, 0x9, 0x53, 0x65, 0xe2, 0xbc, + 0x5f, 0x28, 0x2, 0x7c, 0xf5, 0x90, 0xd, 0x98, 0xe4, 0x93, 0xb4, 0x1, 0x11, + 0x7d, 0x13, 0x2e, 0x14, 0x65, 0xdc, 0x6d, 0x0, 0x2e, 0x34, 0x65, 0xde, 0x6d, + 0x22, 0x12, 0xa7, 0xae, 0xb, 0xe0, 0xb, 0xc0, 0x7e, 0x73, 0x66, 0xea, 0xbc, + 0x7c, 0x28, 0x2, 0x21, 0x15, 0x7a, 0xe3, 0x66, 0xea, 0x7a, 0xf3, 0x56, 0xb7, + 0xda, 0x3b, 0x22, 0xca, 0x3b, 0x6c, 0xdd, 0x12, 0x97, 0x6e, 0x7e, 0xb3, + 0x66, 0xea, 0xf5, 0x29, 0x12, 0xa5, 0x3, 0x92, 0x0, 0xe5, 0x29, 0x70, 0x14, + 0x6d, 0x33, 0x7a, 0x37, 0x53, 0x33, 0xe4, 0x7a, 0xb3, 0x53, 0x35, 0x7a, + 0xb3, 0x53, 0x72, 0x7a, 0x35, 0x12, 0x81, 0x22, 0x20, 0x0, 0x2, 0x61, 0xe7, + 0x75, 0x30, 0x0, 0x6d, 0x77, 0x7e, 0x35, 0x12, 0x4d, 0x33, 0x78, 0x3, 0xe4, + 0x80, 0x2, 0x74, 0x1, 0x7a, 0xb3, 0x2e, 0xb3, 0x6c, 0xcc, 0x61, 0xcc, 0x7c, + 0xbc, 0x12, 0xa0, 0x72, 0x70, 0x2, 0x61, 0xca, 0x7e, 0x70, 0x2, 0xac, 0x7c, + 0x9, 0xb3, 0x65, 0x60, 0xf5, 0x2a, 0x9, 0xb3, 0x65, 0x61, 0xf5, 0x2b, 0x7c, + 0xbc, 0x12, 0xa5, 0xe3, 0x7a, 0x35, 0x2c, 0x7e, 0xb3, 0x68, 0x7a, 0x70, 0x9, + 0x7c, 0xbc, 0x12, 0xa7, 0xbd, 0x50, 0x2, 0x61, 0xca, 0xc2, 0x1, 0x6d, 0x33, + 0x7a, 0x35, 0x2e, 0xe5, 0x2a, 0x7e, 0x71, 0x2b, 0x12, 0xa0, 0xc4, 0x50, + 0x62, 0xe5, 0x2a, 0xa, 0x5b, 0x1b, 0x54, 0xf5, 0x27, 0x80, 0x2f, 0xe5, 0x2b, + 0xa, 0xb, 0x1b, 0x4, 0x80, 0x19, 0xe5, 0x27, 0x7c, 0x71, 0x12, 0x36, 0x62, + 0x7d, 0x43, 0xbe, 0x44, 0x0, 0x0, 0x8, 0x8, 0x7d, 0x54, 0x2e, 0x55, 0x2e, + 0x7a, 0x55, 0x2e, 0xb, 0x10, 0xe5, 0x2b, 0xa, 0x3b, 0xb, 0x34, 0xa, 0x51, + 0xbd, 0x53, 0x8, 0xdb, 0x5, 0x27, 0xe5, 0x2a, 0xa, 0x2b, 0xb, 0x24, 0xe5, + 0x27, 0xa, 0x3b, 0xbd, 0x32, 0x8, 0xc3, 0x90, 0xd, 0xd9, 0xe4, 0x93, 0xa, + 0x2b, 0xb, 0x24, 0x7e, 0x35, 0x2c, 0xad, 0x32, 0xbe, 0x35, 0x2e, 0x8, 0x4, + 0xc2, 0x2, 0x80, 0x4, 0xd2, 0x2, 0x80, 0x0, 0xe5, 0x2a, 0x7e, 0x71, 0x2b, + 0x7e, 0x8, 0x0, 0x31, 0x12, 0xdc, 0xa9, 0x24, 0xff, 0x92, 0x1, 0x20, 0x2d, + 0x1a, 0xe5, 0x2a, 0x7e, 0x71, 0x2b, 0x12, 0xa4, 0x3b, 0x24, 0xff, 0x92, 0x3, + 0xe4, 0x33, 0xa, 0x3b, 0xbe, 0x34, 0x0, 0xff, 0x68, 0x4, 0xa2, 0x3, 0x92, + 0x1, 0x7e, 0xb3, 0x2e, 0xb3, 0xb4, 0x1, 0x52, 0x20, 0x1, 0x4f, 0xe5, 0x2a, + 0xbe, 0xb0, 0x4, 0x40, 0xe, 0xe5, 0x28, 0xa, 0x2b, 0x1b, 0x26, 0xe5, 0x2a, + 0xa, 0x3b, 0xbd, 0x32, 0x8, 0x1d, 0x7e, 0x25, 0x12, 0x7e, 0x34, 0x0, 0x5, + 0x12, 0xa4, 0x2d, 0x8, 0x2e, 0x7e, 0x17, 0x66, 0xf0, 0x3e, 0x14, 0x3e, 0x14, + 0x12, 0xa4, 0x25, 0x8, 0x21, 0xd2, 0x1, 0x80, 0x1d, 0x7e, 0x25, 0x12, 0x7e, + 0x34, 0x0, 0x7, 0x12, 0xa4, 0x2d, 0x8, 0x11, 0x7e, 0x7, 0x66, 0xf0, 0x7e, + 0x14, 0x0, 0x5, 0xad, 0x10, 0x12, 0xa4, 0x25, 0x8, 0x2, 0xd2, 0x1, 0x30, + 0x1, 0x7, 0x7e, 0x35, 0x31, 0x2d, 0x73, 0x5, 0x30, 0x20, 0x1, 0x1b, 0x7c, + 0xbc, 0x6c, 0x77, 0x12, 0x9d, 0x1b, 0x7e, 0xa1, 0x2a, 0x7e, 0x70, 0x2, 0xac, + 0x7d, 0x19, 0xa3, 0x2e, 0x77, 0xe5, 0x2b, 0x19, 0xb3, 0x2e, 0x78, 0xb, 0xd0, + 0xb, 0xc0, 0xe5, 0x29, 0xbc, 0xbc, 0x28, 0x2, 0x41, 0x78, 0xe5, 0x30, 0xbe, + 0xb0, 0x0, 0x28, 0xc, 0xe5, 0x30, 0xa, 0x2b, 0x7d, 0x37, 0x12, 0x29, 0xee, + 0x7a, 0x35, 0x12, 0x12, 0x36, 0x10, 0x7e, 0x73, 0x66, 0xea, 0xa, 0x37, 0x3e, + 0x34, 0xca, 0x39, 0x7e, 0x18, 0x65, 0x60, 0x7e, 0x8, 0x53, 0x36, 0x12, 0x2b, + 0x7, 0x1b, 0xfd, 0x7e, 0x73, 0x66, 0xea, 0x7a, 0x73, 0x53, 0x35, 0xa, 0x3d, + 0x3e, 0x34, 0xca, 0x39, 0x7e, 0x18, 0x2e, 0x77, 0x7e, 0x8, 0x52, 0xf7, 0x12, + 0x2b, 0x7, 0x1b, 0xfd, 0x7a, 0xd3, 0x53, 0x72, 0xc2, 0x2d, 0xda, 0x3b, 0x22, + 0x7e, 0x35, 0x2c, 0xad, 0x32, 0xbd, 0x31, 0x22, 0xad, 0x32, 0x7e, 0x15, + 0x31, 0x7e, 0x24, 0x0, 0xa, 0xad, 0x12, 0xbd, 0x13, 0x22, 0x7c, 0x17, 0x7c, + 0xb, 0x7c, 0x71, 0x12, 0x36, 0x62, 0x7d, 0x13, 0x6c, 0xaa, 0x80, 0x45, 0x7e, + 0x50, 0x2, 0xac, 0x5a, 0x9, 0x72, 0x53, 0x36, 0x9, 0x62, 0x53, 0x37, 0xa, + 0xf0, 0xa, 0x47, 0x12, 0xa4, 0xee, 0x8, 0x6, 0xa, 0x27, 0x9d, 0x2f, 0x80, + 0x4, 0x6d, 0x22, 0x9d, 0x24, 0xbe, 0x24, 0x0, 0x1, 0x18, 0x1d, 0x12, 0xa4, + 0xea, 0x8, 0x6, 0xa, 0x26, 0x9d, 0x2f, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x24, + 0xbe, 0x24, 0x0, 0x1, 0x18, 0x8, 0x12, 0xa4, 0xf5, 0x18, 0x3, 0x74, 0x1, + 0x22, 0xb, 0xa0, 0x7e, 0xb3, 0x53, 0x35, 0xbc, 0xba, 0x38, 0xb3, 0x6c, 0xaa, + 0x80, 0x44, 0x7e, 0x50, 0x2, 0xac, 0x5a, 0x9, 0x72, 0x52, 0xf7, 0x9, 0x62, + 0x52, 0xf8, 0xa, 0xf0, 0xa, 0x47, 0x12, 0xa4, 0xee, 0x8, 0x6, 0xa, 0x27, + 0x9d, 0x2f, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x24, 0xbe, 0x24, 0x0, 0x1, 0x18, + 0x1c, 0x12, 0xa4, 0xea, 0x8, 0x6, 0xa, 0x26, 0x9d, 0x2f, 0x80, 0x4, 0x6d, + 0x22, 0x9d, 0x24, 0xbe, 0x24, 0x0, 0x1, 0x18, 0x7, 0x12, 0xa4, 0xf5, 0x8, + 0x2, 0xe4, 0x22, 0xb, 0xa0, 0x7e, 0xb3, 0x53, 0x72, 0xbc, 0xba, 0x38, 0xb4, + 0x74, 0xff, 0x22, 0xa, 0xf1, 0xa, 0x46, 0x9d, 0x4f, 0xbe, 0x44, 0x0, 0x0, + 0x22, 0x7e, 0xf4, 0xd, 0xde, 0x7e, 0xe4, 0x0, 0xff, 0xb, 0x7a, 0x20, 0xbd, + 0x21, 0x22, 0xca, 0x79, 0xc2, 0x4, 0x7e, 0x73, 0x56, 0xb7, 0xbe, 0x70, 0x6, + 0x38, 0x3, 0xc3, 0xa1, 0xcf, 0x7e, 0xc7, 0x66, 0xf0, 0x7e, 0xe3, 0x66, 0xea, + 0x7e, 0xb3, 0x68, 0x9e, 0x60, 0x3, 0xc3, 0xa1, 0xcf, 0x90, 0xd, 0xd8, 0xe4, + 0x93, 0x7c, 0xab, 0xbc, 0xae, 0x90, 0xd, 0xd7, 0x28, 0x7, 0xe4, 0x93, 0xa4, + 0x7d, 0xb5, 0x80, 0x6, 0xe4, 0x93, 0xac, 0xbe, 0x7d, 0xb5, 0x7e, 0x1f, 0x2d, + 0x2e, 0x7e, 0x14, 0xd, 0xd3, 0x12, 0xa7, 0x99, 0x7e, 0x14, 0xd, 0xd5, 0x12, + 0x4f, 0x69, 0x12, 0xc0, 0x38, 0x7d, 0x3, 0x6c, 0xff, 0x6c, 0x99, 0x80, 0x22, + 0x7c, 0xb9, 0x12, 0xa5, 0xe3, 0x7d, 0xd3, 0x7d, 0x1d, 0x3e, 0x14, 0xbd, + 0x1c, 0x48, 0xf, 0x7e, 0x34, 0xd, 0xdc, 0x7e, 0x24, 0x0, 0xff, 0xb, 0x1a, + 0x10, 0xbd, 0x1d, 0x8, 0x2, 0xb, 0xf0, 0xb, 0x90, 0x7e, 0x83, 0x66, 0xea, + 0xbc, 0x89, 0x38, 0xd6, 0xbd, 0xb0, 0x50, 0x2c, 0x12, 0xa5, 0xda, 0x38, + 0x1c, 0x7e, 0x34, 0xd, 0xde, 0x12, 0xa5, 0xd2, 0xbd, 0xdc, 0x58, 0x5, 0xbe, + 0xe0, 0x1, 0x38, 0xc, 0x74, 0x2, 0xac, 0xbf, 0xa, 0x4e, 0x1b, 0x44, 0xbd, + 0x54, 0x48, 0xb, 0x7e, 0x34, 0xd, 0xda, 0x12, 0xa5, 0xd2, 0x7a, 0xd7, 0x53, + 0x33, 0x12, 0xa5, 0xda, 0x28, 0x2, 0xd2, 0x4, 0x7e, 0x34, 0xd, 0xe0, 0x12, + 0xa5, 0xd2, 0xbd, 0xdc, 0x58, 0x5, 0xe4, 0x7a, 0xb3, 0x66, 0xea, 0xa2, 0x4, + 0xda, 0x79, 0x22, 0x7e, 0x24, 0x0, 0xff, 0xb, 0x1a, 0xd0, 0x22, 0x7e, 0xd7, + 0x53, 0x33, 0xbe, 0xd4, 0x0, 0x0, 0x22, 0x7c, 0xab, 0x7e, 0x70, 0x2, 0xac, + 0x7a, 0x9, 0xb3, 0x65, 0x60, 0x9, 0x73, 0x65, 0x61, 0x2, 0x36, 0x62, 0xca, + 0x79, 0x6c, 0xff, 0xc2, 0x0, 0x7e, 0xb3, 0x68, 0x9e, 0x60, 0x6, 0x7e, 0xd4, + 0x2, 0xbc, 0x80, 0x4, 0x7e, 0xd4, 0x3, 0xe8, 0x7e, 0xb3, 0x68, 0xa3, 0xb4, + 0x1, 0x4, 0x7e, 0xd4, 0x0, 0xf0, 0x7e, 0xc7, 0x66, 0xf0, 0x6c, 0xee, 0x80, + 0x71, 0xc2, 0x0, 0x7c, 0xbe, 0x12, 0xa5, 0xe3, 0x7d, 0xb3, 0x74, 0x2, 0xac, + 0xbe, 0x9, 0xb5, 0x65, 0x60, 0x12, 0xa8, 0x14, 0xbd, 0x3b, 0x58, 0x4, 0xd2, + 0x0, 0x80, 0x26, 0x7e, 0x73, 0x68, 0x7a, 0xbe, 0x73, 0x66, 0xea, 0x78, 0x1c, + 0x7e, 0xa7, 0x56, 0xb8, 0x1e, 0xa4, 0xbd, 0xac, 0x50, 0x12, 0x7c, 0xbe, + 0x7e, 0x70, 0x1, 0x12, 0xa6, 0xa3, 0x7d, 0x1d, 0x6d, 0x0, 0xbf, 0x10, 0x8, + 0x2, 0xd2, 0x0, 0x30, 0x0, 0x2a, 0x7c, 0xbe, 0x12, 0xa0, 0x72, 0x60, 0x23, + 0x7e, 0xa4, 0x0, 0x9, 0xca, 0xa9, 0x7e, 0x70, 0x9, 0xac, 0x7e, 0x2e, 0x34, + 0x65, 0xdc, 0x6d, 0x22, 0x7e, 0x30, 0x9, 0xac, 0x3f, 0x2e, 0x14, 0x67, 0x1b, + 0x6d, 0x0, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0xb, 0xf0, 0xb, 0xe0, 0x12, 0xa7, + 0x7a, 0x38, 0x8a, 0x7a, 0x73, 0x66, 0xff, 0x7a, 0xf3, 0x68, 0x79, 0x7a, + 0xc7, 0x56, 0xb8, 0xda, 0x79, 0x22, 0x7c, 0x67, 0x7c, 0x7b, 0x7e, 0x50, 0x2, + 0xac, 0x57, 0x9, 0xa2, 0x65, 0x60, 0x9, 0x72, 0x65, 0x61, 0x90, 0xd, 0xb9, + 0xe4, 0x93, 0xbc, 0xba, 0x78, 0x3, 0x9f, 0x11, 0x22, 0x7c, 0xba, 0x2, 0xa6, + 0xc5, 0x7c, 0x16, 0x7c, 0x7, 0x7c, 0x9b, 0x7e, 0x83, 0x68, 0xa8, 0x7a, 0x83, + 0x2e, 0x77, 0x7e, 0x83, 0x68, 0xa9, 0x7a, 0x83, 0x2e, 0x78, 0x9f, 0x77, 0xa, + 0x31, 0xa, 0x19, 0x9d, 0x13, 0x7c, 0x83, 0x80, 0x7c, 0x7a, 0x81, 0x28, 0xbe, + 0x80, 0x0, 0x58, 0xc, 0x1a, 0x58, 0x1a, 0x19, 0x9d, 0x15, 0xa, 0x59, 0x2d, + 0x51, 0xf5, 0x28, 0x7e, 0x73, 0x2e, 0x77, 0xbc, 0x78, 0x18, 0xc, 0x1a, 0x59, + 0x1a, 0x18, 0x9d, 0x15, 0xa, 0x59, 0x9d, 0x51, 0xf5, 0x28, 0xa, 0x11, 0xa, + 0x50, 0x9d, 0x51, 0xf5, 0x27, 0x80, 0x3a, 0x85, 0x27, 0x29, 0xe5, 0x27, + 0xbe, 0xb0, 0x0, 0x58, 0xe, 0xe5, 0x27, 0x1a, 0x5b, 0x1a, 0x10, 0x9d, 0x15, + 0xa, 0x50, 0x2d, 0x51, 0xf5, 0x29, 0x7e, 0x73, 0x2e, 0x78, 0xbe, 0x71, 0x27, + 0x18, 0xe, 0x1a, 0x30, 0xe5, 0x27, 0x1a, 0x1b, 0x9d, 0x13, 0xa, 0x50, 0x9d, + 0x51, 0xf5, 0x29, 0x12, 0xa7, 0x81, 0x1a, 0x26, 0x1a, 0x24, 0x2f, 0x71, 0x5, + 0x27, 0xa, 0x21, 0xa, 0x30, 0x2d, 0x32, 0xe5, 0x27, 0x1a, 0x1b, 0xbd, 0x13, + 0x8, 0xb8, 0xb, 0x80, 0xa, 0x11, 0xa, 0x59, 0x2d, 0x51, 0x1a, 0x18, 0xbd, + 0x15, 0x18, 0x2, 0xc1, 0xe7, 0x7f, 0x17, 0x22, 0x2, 0xa0, 0xe4, 0x2, 0xa5, + 0xf5, 0x7e, 0x73, 0x66, 0xea, 0xbc, 0x7e, 0x22, 0xe5, 0x28, 0x7e, 0x71, + 0x29, 0x2, 0x36, 0x62, 0x7c, 0xbe, 0x12, 0xa5, 0xe3, 0x7e, 0x24, 0x0, 0x3, + 0x2, 0x29, 0xee, 0x7e, 0x14, 0xd, 0x18, 0x7e, 0x4, 0x0, 0xff, 0xb, 0xa, + 0x20, 0x22, 0x9, 0xb3, 0x65, 0x60, 0xf5, 0x29, 0x9, 0xb3, 0x65, 0x61, 0xf5, + 0x2a, 0x22, 0x7f, 0x20, 0xb, 0x2a, 0x10, 0xb, 0x1a, 0x0, 0x1b, 0x2a, 0x0, + 0x1b, 0x1a, 0x10, 0x22, 0x7c, 0x4b, 0x74, 0x2, 0xac, 0xb4, 0x9, 0x55, 0x65, + 0x60, 0x9, 0x65, 0x65, 0x61, 0x7e, 0x73, 0x66, 0xf2, 0xbc, 0x75, 0x78, 0xa, + 0x7e, 0x73, 0x66, 0xf3, 0xbc, 0x76, 0x78, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0x6c, + 0x11, 0x80, 0x28, 0x74, 0x2, 0xac, 0xb1, 0x9, 0x5, 0x65, 0x60, 0x9, 0x95, + 0x65, 0x61, 0x7c, 0xb0, 0x7c, 0x79, 0x12, 0x36, 0x62, 0xbe, 0x34, 0x2, 0x58, + 0x58, 0xd, 0x7e, 0x17, 0x66, 0xf4, 0xbe, 0x14, 0xff, 0x38, 0x58, 0x3, 0x12, + 0x9d, 0x17, 0xb, 0x10, 0x7e, 0x83, 0x66, 0xea, 0xbc, 0x81, 0x38, 0xd0, 0x22, + 0x7e, 0x37, 0x68, 0x87, 0x7e, 0x53, 0x68, 0xa8, 0xbc, 0x5b, 0x38, 0x15, + 0x7e, 0xb3, 0x53, 0xf2, 0xb4, 0xaa, 0xa, 0x7e, 0x63, 0x53, 0xf0, 0x7e, 0x70, + 0x20, 0xac, 0x67, 0x22, 0x7e, 0x37, 0x68, 0x8d, 0x22, 0xca, 0x79, 0x7c, + 0xab, 0x7e, 0xb3, 0x67, 0x0, 0x60, 0x43, 0xb4, 0x1, 0x9, 0x7e, 0xb3, 0x66, + 0xea, 0xbe, 0xb0, 0x2, 0x68, 0x37, 0x7e, 0x93, 0x66, 0xea, 0xbe, 0x90, 0x2, + 0x78, 0x15, 0x7e, 0xf0, 0x9, 0xac, 0xfa, 0x9, 0xb7, 0x65, 0xe2, 0xbe, 0xb0, + 0x14, 0x28, 0x7, 0x74, 0x4, 0x7a, 0xb, 0xb0, 0x80, 0x16, 0xbe, 0x90, 0x1, + 0x78, 0x14, 0x74, 0x9, 0xa4, 0x9, 0xb5, 0x65, 0xe2, 0xbe, 0xb0, 0x7, 0x28, + 0x8, 0x74, 0x7, 0x7a, 0xb, 0xb0, 0x7a, 0x1b, 0xb0, 0xda, 0x79, 0x22, 0xca, + 0x3b, 0x6c, 0xff, 0x6c, 0xee, 0x21, 0x41, 0x7e, 0x70, 0x2, 0xac, 0x7e, 0x9, + 0xb3, 0x65, 0x60, 0xf5, 0x32, 0x9, 0xb3, 0x65, 0x61, 0xf5, 0x33, 0x75, 0x2b, + 0x3, 0x75, 0x2c, 0x3, 0x12, 0xa7, 0x89, 0x7d, 0xe3, 0x7e, 0xf7, 0x68, 0x9b, + 0xbd, 0xfe, 0x28, 0x2, 0x7d, 0xef, 0x7e, 0x73, 0x68, 0xa6, 0x7a, 0x71, 0x27, + 0x7e, 0xb3, 0x68, 0xa7, 0xf5, 0x28, 0xe5, 0x32, 0x7e, 0x61, 0x2b, 0x7e, 0x8, + 0x0, 0x2d, 0x12, 0xa9, 0x4d, 0xf5, 0x29, 0xe5, 0x33, 0x7e, 0x71, 0x28, 0x7e, + 0x61, 0x2c, 0x7e, 0x8, 0x0, 0x2e, 0x12, 0xa9, 0x4d, 0x7c, 0xab, 0x7a, 0xa1, + 0x2a, 0xe5, 0x29, 0xa, 0x4b, 0xe5, 0x2d, 0xa, 0xfb, 0x2d, 0xf4, 0x7d, 0x3f, + 0x7c, 0xb7, 0xf5, 0x2f, 0xa, 0x4a, 0xe5, 0x2e, 0xa, 0x5b, 0x2d, 0x54, 0xf5, + 0x30, 0x75, 0x31, 0x0, 0x7e, 0xd1, 0x2d, 0x80, 0x2c, 0x7e, 0xc1, 0x2e, 0x80, + 0x1f, 0x7c, 0xbd, 0x7c, 0x7c, 0x12, 0x36, 0x62, 0x7e, 0x53, 0x68, 0x86, 0xa, + 0x25, 0x7d, 0xd3, 0x9d, 0xd2, 0xbe, 0xd4, 0x0, 0x0, 0x8, 0x6, 0xbd, 0xed, + 0x38, 0x2, 0x5, 0x31, 0xb, 0xc0, 0xe5, 0x30, 0xbc, 0xbc, 0x38, 0xdb, 0xb, + 0xd0, 0xe5, 0x2f, 0xbc, 0xbd, 0x38, 0xce, 0xbe, 0xf1, 0x31, 0x50, 0x3, 0x7e, + 0xf1, 0x31, 0xb, 0xe0, 0x12, 0xa7, 0x7a, 0x28, 0x2, 0x1, 0x8e, 0x7c, 0xbf, + 0xda, 0x3b, 0x22, 0xca, 0xf8, 0x7c, 0xf6, 0x7c, 0x87, 0x7c, 0x9b, 0xa, 0x2f, + 0x7d, 0x32, 0x3e, 0x34, 0xb, 0x34, 0x7c, 0xb7, 0xbc, 0xf9, 0x38, 0x14, 0xa, + 0xf8, 0x1b, 0xf4, 0xa, 0x3f, 0x9d, 0xf3, 0xa, 0x39, 0xbd, 0x3f, 0x18, 0x6, + 0x7c, 0xab, 0xa, 0x39, 0x80, 0x1d, 0xbc, 0xf9, 0x28, 0xd, 0xa, 0x39, 0xa, + 0x5f, 0x2d, 0x53, 0xb, 0x54, 0x7c, 0xab, 0xe4, 0x80, 0x10, 0xa, 0x3f, 0xa, + 0x58, 0x2d, 0x53, 0xa, 0x39, 0x9d, 0x53, 0x7c, 0xab, 0x9d, 0x32, 0x7c, 0xb7, + 0x7a, 0xb, 0xb0, 0x7c, 0xba, 0xda, 0xf8, 0x22, 0xca, 0x3b, 0x7c, 0xf5, 0x7c, + 0xe6, 0x7c, 0xd7, 0x7c, 0xcb, 0x9f, 0x55, 0x7f, 0x65, 0x7f, 0x45, 0x75, + 0x44, 0x0, 0x7e, 0x37, 0x68, 0x9b, 0x7a, 0x35, 0x45, 0x6c, 0xaa, 0x12, 0xab, + 0xf6, 0xe4, 0x19, 0xb3, 0x65, 0xe2, 0x12, 0xa7, 0x89, 0x7a, 0x35, 0x45, + 0x7e, 0x37, 0x68, 0x9b, 0xbe, 0x35, 0x45, 0x8, 0x3, 0x7a, 0x35, 0x45, 0x7e, + 0x73, 0x68, 0xa6, 0x7e, 0xb3, 0x68, 0xa7, 0xf5, 0x35, 0x74, 0x2, 0xac, 0xbe, + 0x9, 0x65, 0x65, 0x60, 0x7a, 0x61, 0x36, 0x9, 0xb5, 0x65, 0x61, 0xf5, 0x37, + 0x7c, 0xb6, 0x7c, 0x6c, 0x7e, 0x8, 0x0, 0x3a, 0x12, 0xa9, 0x4d, 0xf5, 0x38, + 0xe5, 0x37, 0x7e, 0x71, 0x35, 0x7c, 0x6d, 0x7e, 0x8, 0x0, 0x3b, 0x12, 0xa9, + 0x4d, 0xf5, 0x39, 0x85, 0x3a, 0x30, 0x85, 0x3b, 0x31, 0xe5, 0x35, 0x7e, + 0x71, 0x3a, 0xac, 0x7b, 0xe5, 0x3b, 0xa, 0x2b, 0x2d, 0x32, 0x7a, 0x35, 0x3c, + 0x75, 0x2e, 0x0, 0x61, 0x50, 0xe5, 0x36, 0xa, 0x2b, 0xe5, 0x30, 0xa, 0x3b, + 0x12, 0x37, 0x98, 0x8, 0xc, 0xe5, 0x36, 0xa, 0x2b, 0xe5, 0x30, 0xa, 0x5b, + 0x9d, 0x52, 0x80, 0x4, 0x6d, 0x55, 0x9d, 0x53, 0xf5, 0x33, 0x75, 0x2f, 0x0, + 0x61, 0x2e, 0x7e, 0x35, 0x3c, 0x3e, 0x34, 0x49, 0x33, 0x4, 0x0, 0x7a, 0x35, + 0x3e, 0x7e, 0x53, 0x68, 0x86, 0xa, 0x25, 0x9d, 0x32, 0x7a, 0x35, 0x3e, 0xbe, + 0x34, 0x0, 0x0, 0x18, 0x2, 0x61, 0x22, 0x7e, 0x35, 0x45, 0xbe, 0x35, 0x3e, + 0x18, 0x2, 0x5, 0x44, 0x75, 0x32, 0x0, 0xe5, 0x37, 0xa, 0x2b, 0xe5, 0x31, + 0xa, 0x3b, 0x12, 0x37, 0x98, 0x8, 0xc, 0xe5, 0x37, 0xa, 0x2b, 0xe5, 0x31, + 0xa, 0x5b, 0x9d, 0x52, 0x80, 0x4, 0x6d, 0x55, 0x9d, 0x53, 0xf5, 0x34, 0xe5, + 0x33, 0xbe, 0xb0, 0x1, 0x38, 0x7, 0xe5, 0x34, 0xbe, 0xb0, 0x1, 0x28, 0x37, + 0xbe, 0xc0, 0x3, 0x40, 0x9, 0xbe, 0xd0, 0x3, 0x40, 0x4, 0xd2, 0x0, 0x80, + 0x2, 0xc2, 0x0, 0xe5, 0x30, 0x7e, 0x71, 0x31, 0x7c, 0x6e, 0x12, 0xe2, 0xa0, + 0xf5, 0x32, 0xbe, 0xb0, 0x2, 0x68, 0x5, 0xe5, 0x32, 0xb4, 0x3, 0x7, 0x7e, + 0x35, 0x3e, 0xe, 0x34, 0x80, 0x7, 0xe5, 0x32, 0xb4, 0x1, 0x5, 0x6d, 0x33, + 0x7a, 0x35, 0x3e, 0x7e, 0x45, 0x3e, 0x7d, 0x34, 0x1a, 0x26, 0x1a, 0x24, + 0x2f, 0x61, 0x7e, 0xf5, 0x3c, 0x3e, 0xf4, 0x7d, 0x1f, 0x2e, 0x14, 0xe, 0x34, + 0x12, 0x4f, 0x69, 0x7a, 0x15, 0x40, 0x2e, 0xf4, 0x13, 0xd4, 0x7e, 0xe4, 0x0, + 0xff, 0xb, 0x7a, 0x0, 0x7a, 0x5, 0x42, 0x1a, 0x2, 0x1a, 0x0, 0x12, 0x2a, + 0x20, 0x2f, 0x41, 0x7e, 0x15, 0x42, 0x1a, 0x2, 0x1a, 0x0, 0x7d, 0x34, 0x1a, + 0x26, 0x1a, 0x24, 0x12, 0x2a, 0x20, 0x2f, 0x51, 0x7e, 0x35, 0x3c, 0xb, 0x34, + 0x7a, 0x35, 0x3c, 0x5, 0x31, 0x5, 0x2f, 0xe5, 0x39, 0xbe, 0xb1, 0x2f, 0x28, + 0x2, 0x41, 0x4d, 0xe5, 0x39, 0xa, 0x3b, 0x7e, 0x25, 0x3c, 0x9d, 0x23, 0xe5, + 0x35, 0xa, 0x3b, 0x2d, 0x32, 0x7a, 0x35, 0x3c, 0x85, 0x3b, 0x31, 0x5, 0x30, + 0x5, 0x2e, 0xe5, 0x38, 0xbe, 0xb1, 0x2e, 0x28, 0x2, 0x41, 0x29, 0xbe, 0x68, + 0x0, 0x0, 0x78, 0x4, 0x7e, 0x68, 0x0, 0x1, 0x7f, 0x14, 0x7f, 0x6, 0x12, + 0x2a, 0x8d, 0x7d, 0xf3, 0x12, 0xaf, 0x9b, 0x7d, 0x23, 0xbe, 0xf4, 0x0, 0x0, + 0x58, 0x2, 0x6d, 0xff, 0xbe, 0x24, 0x0, 0x0, 0x58, 0x2, 0x6d, 0x22, 0x7e, + 0x70, 0x9, 0xac, 0x7f, 0x59, 0xf3, 0x65, 0xdc, 0x59, 0x23, 0x65, 0xde, 0xe5, + 0x44, 0x19, 0xb3, 0x65, 0xe2, 0x9, 0x53, 0x65, 0xe2, 0xbe, 0x50, 0x2d, 0x28, + 0x6, 0x74, 0x2d, 0x19, 0xb3, 0x65, 0xe2, 0x7c, 0xbe, 0x12, 0xa5, 0xe3, 0x7d, + 0xf3, 0xbe, 0xf4, 0x0, 0x0, 0x18, 0x4, 0x7e, 0xf4, 0x0, 0x1, 0x7e, 0x73, + 0x68, 0x9a, 0xa, 0x17, 0x6d, 0x0, 0x7f, 0x16, 0x12, 0x2a, 0x8d, 0x12, 0xab, + 0xef, 0xbf, 0x10, 0x28, 0x6, 0x7d, 0x3f, 0x1a, 0x26, 0x1a, 0x24, 0x7e, 0x14, + 0x0, 0x7f, 0x12, 0x2a, 0x31, 0x12, 0xab, 0xef, 0x12, 0x2a, 0x3c, 0x7c, 0xa7, + 0x12, 0xab, 0xf6, 0xe5, 0x36, 0x19, 0xb3, 0x65, 0xe3, 0xe5, 0x37, 0x19, + 0xb3, 0x65, 0xe4, 0xda, 0x3b, 0x22, 0x7d, 0x1f, 0x1a, 0x2, 0x1a, 0x0, 0x22, + 0x7e, 0x70, 0x9, 0xac, 0x7f, 0x19, 0xa3, 0x65, 0xe1, 0x22, 0xca, 0xf8, 0x7e, + 0x45, 0x27, 0x7c, 0xb9, 0x7a, 0xb3, 0x55, 0x2f, 0x74, 0xff, 0x7a, 0xb3, + 0x55, 0x2e, 0x6d, 0x55, 0x80, 0x1f, 0x7d, 0xf5, 0x3e, 0xf4, 0x3e, 0xf4, + 0x7f, 0x60, 0x2d, 0xdf, 0xb, 0x6a, 0xf0, 0x7d, 0xe5, 0x3e, 0xe4, 0x59, 0xfe, + 0x2e, 0x77, 0x69, 0xf6, 0x0, 0x2, 0x59, 0xfe, 0x30, 0x57, 0xb, 0x54, 0xbd, + 0x45, 0x38, 0xdd, 0x7e, 0x33, 0x55, 0x2f, 0xbe, 0x30, 0x4, 0x38, 0x2, 0x81, + 0xc5, 0x69, 0xf1, 0x0, 0x1c, 0x69, 0x11, 0x0, 0x1e, 0xbd, 0x1f, 0x18, 0x19, + 0x4d, 0x11, 0x78, 0x4, 0x7e, 0x14, 0x0, 0x1, 0x7d, 0x3f, 0x7d, 0x21, 0x12, + 0x29, 0xee, 0x7c, 0xf7, 0x74, 0x40, 0x7a, 0xb3, 0x55, 0x32, 0x80, 0x40, + 0x4d, 0xff, 0x78, 0x4, 0x7e, 0xf4, 0x0, 0x1, 0x7d, 0x31, 0x7d, 0x2f, 0x12, + 0x29, 0xee, 0x7c, 0xf7, 0x74, 0x80, 0x7a, 0xb3, 0x55, 0x32, 0x7d, 0xf, 0x2d, + 0xf, 0xbd, 0x1, 0x8, 0x21, 0x1a, 0x2, 0x1a, 0x0, 0x7e, 0x73, 0x55, 0x32, + 0xa, 0x37, 0x6d, 0x22, 0x12, 0x2a, 0x20, 0x7d, 0x5f, 0x1a, 0x4a, 0x1a, 0x48, + 0x12, 0xab, 0xef, 0x2f, 0x2, 0x12, 0x2a, 0x3c, 0x7a, 0x73, 0x55, 0x32, 0xbe, + 0xf0, 0x5, 0x58, 0x14, 0x12, 0xac, 0xe4, 0x12, 0xeb, 0x69, 0x12, 0xac, 0xe4, + 0x12, 0xac, 0xed, 0x12, 0xac, 0xe4, 0x12, 0xec, 0x58, 0x80, 0xa, 0x74, 0x7d, + 0x80, 0x2, 0x74, 0x7f, 0x7a, 0xb3, 0x55, 0x2e, 0xe4, 0x7a, 0xb3, 0x55, 0x2f, + 0x7e, 0x73, 0x56, 0xa2, 0xbe, 0x73, 0x55, 0x2e, 0x48, 0x6, 0x7e, 0xb3, 0x55, + 0x30, 0x80, 0x1, 0xe4, 0xda, 0xf8, 0x22, 0x7e, 0x8, 0x2e, 0x77, 0x7e, 0x18, + 0x30, 0x57, 0x22, 0xca, 0x3b, 0x7f, 0x71, 0x7e, 0x60, 0x1, 0xb, 0xa, 0x20, + 0xb, 0x7a, 0x50, 0x7c, 0x4b, 0x7a, 0x53, 0x32, 0x37, 0x7a, 0x43, 0x33, 0x27, + 0x7e, 0x70, 0x1, 0x7e, 0xa0, 0x1, 0xc1, 0xe, 0x7e, 0x90, 0x2, 0xac, 0x9a, + 0x7f, 0x60, 0x2d, 0xd4, 0xb, 0x6a, 0xd0, 0x7d, 0x7d, 0x7c, 0xbf, 0xf5, 0x29, + 0x7f, 0x67, 0x2d, 0xd4, 0xb, 0x6a, 0x40, 0xa, 0xd5, 0xa, 0xbb, 0x7d, 0xab, + 0x9d, 0xad, 0x7d, 0x7a, 0x7c, 0x8f, 0xbe, 0x80, 0x0, 0x58, 0x5, 0x6e, 0x80, + 0xff, 0xb, 0x80, 0xa, 0xa4, 0xa, 0x79, 0x9d, 0x7a, 0xbe, 0xf0, 0x0, 0x58, + 0x5, 0x6e, 0xf0, 0xff, 0xb, 0xf0, 0xbe, 0x80, 0x2, 0x58, 0x7, 0xbe, 0xf0, + 0x2, 0x58, 0x2, 0xc1, 0xc, 0xbe, 0x60, 0x0, 0x18, 0x2, 0xa1, 0xf4, 0xbe, + 0x70, 0xec, 0x28, 0x2, 0xc1, 0x18, 0xbe, 0x80, 0x8, 0x58, 0x5, 0xbe, 0xf0, + 0x8, 0x48, 0x61, 0xa, 0xa7, 0xb, 0xa4, 0x7d, 0x6a, 0x7c, 0x7d, 0xa, 0xa5, + 0x2d, 0xab, 0x12, 0xae, 0x5c, 0x19, 0xba, 0x32, 0x37, 0xa, 0xd9, 0xa, 0xa4, + 0x2d, 0xad, 0x12, 0xae, 0x5c, 0x19, 0xba, 0x33, 0x27, 0x9, 0xba, 0x32, 0x37, + 0xa, 0xdb, 0xa, 0xc5, 0x2d, 0xcd, 0xe, 0xc4, 0x7d, 0x6c, 0x7c, 0xbd, 0xa, + 0xc7, 0x19, 0xbc, 0x32, 0x36, 0x9, 0xbc, 0x33, 0x27, 0xa, 0xcb, 0xa, 0xa4, + 0x2d, 0xac, 0x12, 0xae, 0x5c, 0x19, 0xba, 0x33, 0x26, 0x2d, 0xdb, 0x12, + 0xae, 0x53, 0x19, 0xbd, 0x32, 0x38, 0xa, 0xd9, 0x12, 0xae, 0x51, 0x19, 0xbd, + 0x33, 0x28, 0xb, 0xd5, 0x7d, 0x6d, 0x7c, 0x7d, 0x80, 0x24, 0xbe, 0x80, 0x4, + 0x58, 0x5, 0xbe, 0xf0, 0x4, 0x48, 0x1a, 0xe5, 0x29, 0xa, 0xcb, 0xa, 0xd5, + 0x12, 0xae, 0x51, 0x19, 0xbd, 0x32, 0x37, 0xa, 0xc9, 0xa, 0xd4, 0x12, 0xae, + 0x51, 0x19, 0xbd, 0x33, 0x27, 0xb, 0x70, 0xbe, 0x70, 0xf0, 0x50, 0x1f, 0x7e, + 0x51, 0x29, 0x7c, 0x49, 0xe5, 0x29, 0xa, 0xd7, 0x19, 0xbd, 0x32, 0x37, 0x19, + 0x9d, 0x33, 0x27, 0xb, 0x70, 0xb, 0xa0, 0x7e, 0xb3, 0x55, 0x2f, 0xbc, 0xba, + 0x28, 0x2, 0xa1, 0xc, 0x7a, 0x73, 0x55, 0x2f, 0x7e, 0xa0, 0x1, 0x80, 0x25, + 0xa, 0x3a, 0x9, 0xb3, 0x32, 0x37, 0xa, 0x2b, 0x7e, 0x70, 0x2, 0xac, 0x7a, + 0x7f, 0x60, 0x2d, 0xd3, 0x1b, 0x6a, 0x20, 0xa, 0x2a, 0x9, 0xb2, 0x33, 0x27, + 0xa, 0x4b, 0x2d, 0x3f, 0x7d, 0x2e, 0x1b, 0x1a, 0x40, 0xb, 0xa0, 0x7e, 0xb3, + 0x55, 0x2f, 0xbc, 0xba, 0x38, 0xd3, 0xda, 0x3b, 0x22, 0x2d, 0xdc, 0xe, 0xd4, + 0x7d, 0x6d, 0x7c, 0xbd, 0xa, 0xd7, 0x22, 0xe, 0xa4, 0x7d, 0x6a, 0x7c, 0xbd, + 0xa, 0xa7, 0x22, 0x12, 0xaf, 0xab, 0x58, 0x5, 0x12, 0xa8, 0x86, 0x80, 0x2, + 0x74, 0xff, 0x7a, 0xb3, 0x56, 0xb6, 0x22, 0x12, 0xaf, 0x13, 0x7a, 0x37, + 0x52, 0x65, 0x12, 0xae, 0x9e, 0x7a, 0x37, 0x52, 0x67, 0x12, 0xb6, 0xe, 0x60, + 0x1, 0x22, 0x7e, 0x73, 0x52, 0x71, 0xa, 0x37, 0x7a, 0x35, 0x27, 0x7e, 0x8, + 0x4e, 0x88, 0x7e, 0x18, 0x52, 0x49, 0x2, 0xac, 0x0, 0x7e, 0x37, 0x52, 0x5f, + 0x9e, 0x37, 0x52, 0x57, 0x22, 0x7e, 0x17, 0x52, 0x59, 0xbd, 0x13, 0x28, 0xa, + 0x7a, 0x37, 0x52, 0x59, 0x7a, 0x27, 0x52, 0x5b, 0x80, 0x10, 0x7e, 0x17, + 0x52, 0x51, 0xbd, 0x13, 0x50, 0x8, 0x7a, 0x37, 0x52, 0x51, 0x7a, 0x27, 0x52, + 0x53, 0x7e, 0x17, 0x52, 0x57, 0xbd, 0x12, 0x28, 0xa, 0x7a, 0x27, 0x52, 0x57, + 0x7a, 0x37, 0x52, 0x55, 0x80, 0x10, 0x7e, 0x17, 0x52, 0x5f, 0xbd, 0x12, + 0x50, 0x8, 0x7a, 0x27, 0x52, 0x5f, 0x7a, 0x37, 0x52, 0x5d, 0x7e, 0xb3, 0x52, + 0x71, 0xb4, 0xa, 0xf, 0x12, 0xaf, 0x13, 0x7a, 0x37, 0x52, 0x69, 0x12, 0xae, + 0x9e, 0x7a, 0x37, 0x52, 0x6b, 0x22, 0xb4, 0xf, 0xe, 0x12, 0xaf, 0x13, 0x7a, + 0x37, 0x52, 0x6d, 0x12, 0xae, 0x9e, 0x7a, 0x37, 0x52, 0x6f, 0x22, 0x7e, + 0x37, 0x52, 0x51, 0x9e, 0x37, 0x52, 0x59, 0x22, 0x7e, 0xb3, 0x68, 0x9d, + 0x70, 0x6, 0xe4, 0x7a, 0xb3, 0x68, 0x9e, 0x22, 0xe4, 0x7a, 0xb3, 0x66, 0xff, + 0x74, 0x1, 0x12, 0xca, 0x44, 0x12, 0xc0, 0xc1, 0x74, 0x1, 0x12, 0x0, 0x19, + 0x12, 0xae, 0x65, 0xc2, 0x0, 0x12, 0xc7, 0xc9, 0x7e, 0xb3, 0x2e, 0x74, 0xb4, + 0x1, 0x3, 0x12, 0xaf, 0xa2, 0x22, 0xca, 0xf8, 0x7e, 0xb3, 0x54, 0x3e, 0x70, + 0x8, 0x12, 0xaf, 0x8f, 0x12, 0xaf, 0x95, 0x80, 0x2f, 0x12, 0x7c, 0xc3, 0x12, + 0xaf, 0xb4, 0x50, 0xd, 0x12, 0xae, 0x76, 0x7c, 0xfb, 0x12, 0xe7, 0x37, 0x12, + 0xaf, 0x8f, 0x80, 0x5, 0x12, 0xe4, 0xc2, 0x7c, 0xfb, 0x4c, 0xff, 0x68, 0x11, + 0x7c, 0xbf, 0x12, 0xe6, 0x25, 0x60, 0xa, 0x7a, 0xf3, 0x54, 0x41, 0x74, 0x1, + 0x7a, 0xb3, 0x68, 0x7f, 0xda, 0xf8, 0x22, 0xe4, 0x7a, 0xb3, 0x52, 0x49, + 0x22, 0xe4, 0x7a, 0xb3, 0x39, 0xf1, 0x22, 0x7f, 0x15, 0x7f, 0x6, 0x2, 0x2a, + 0x8d, 0x7e, 0x73, 0x66, 0xea, 0x7a, 0x73, 0x66, 0xfe, 0x22, 0x7e, 0x37, + 0x66, 0xf0, 0xbe, 0x34, 0x2, 0x58, 0x22, 0x7e, 0xb3, 0x52, 0x49, 0xb4, 0x4, + 0x2, 0xd3, 0x22, 0xc3, 0x22, 0xe4, 0x7a, 0xb3, 0x66, 0xff, 0x12, 0xc0, 0xc1, + 0xe4, 0x12, 0x0, 0x19, 0x7e, 0xb3, 0x2e, 0x74, 0xb4, 0x1, 0x3, 0x12, 0xaf, + 0xa2, 0x22, 0xca, 0x69, 0xca, 0xf8, 0x7e, 0x68, 0x68, 0x29, 0x6c, 0xaa, + 0x80, 0x1a, 0x12, 0x87, 0xe9, 0x19, 0x62, 0x67, 0x1f, 0x74, 0xff, 0xa, 0x4a, + 0x19, 0xb4, 0x2e, 0x8b, 0xe4, 0x19, 0xb4, 0x2e, 0x77, 0x19, 0xb4, 0x2e, + 0x81, 0xb, 0xa0, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbc, 0xba, 0x38, 0xdd, 0x7e, + 0x63, 0x68, 0x79, 0xa5, 0xbe, 0x0, 0x32, 0x7e, 0xb3, 0x56, 0x64, 0x70, 0x2, + 0x41, 0xab, 0x6c, 0xaa, 0x80, 0x1b, 0x7e, 0x24, 0x7f, 0xff, 0x7e, 0x30, 0x8, + 0xac, 0x3a, 0x7f, 0x76, 0x2d, 0xf1, 0x79, 0x27, 0x0, 0x2, 0x2d, 0x1d, 0x7d, + 0xc, 0x79, 0x20, 0x0, 0x4, 0xb, 0xa0, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbc, + 0xba, 0x38, 0xdc, 0x41, 0xab, 0x7e, 0xb3, 0x56, 0x64, 0x70, 0x33, 0xbe, + 0x60, 0x0, 0x28, 0x2e, 0x6c, 0xaa, 0x80, 0x20, 0x12, 0xb2, 0xfa, 0xac, 0x3a, + 0x12, 0xb3, 0x7, 0xac, 0x5a, 0x12, 0xb2, 0xd1, 0x74, 0x1, 0xa, 0x4a, 0x19, + 0xb4, 0x2e, 0x77, 0x7e, 0x50, 0x9, 0xac, 0x5a, 0x19, 0xa2, 0x67, 0x1f, 0xb, + 0xa0, 0x7e, 0x63, 0x68, 0x79, 0xbc, 0x6a, 0x38, 0xd8, 0x41, 0xab, 0x6c, + 0xaa, 0x80, 0x19, 0x7e, 0x44, 0x7f, 0xff, 0x12, 0xb2, 0xc9, 0x59, 0x42, + 0x2d, 0x32, 0x59, 0x42, 0x2d, 0x34, 0x59, 0x42, 0x2d, 0x5a, 0x59, 0x42, + 0x2d, 0x5c, 0xb, 0xa0, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbc, 0xba, 0x38, 0xde, + 0x7e, 0x63, 0x56, 0x64, 0xbe, 0x63, 0x68, 0x79, 0x28, 0xa, 0xbe, 0x60, 0x2, + 0x40, 0x5, 0x7e, 0x70, 0x1, 0x80, 0x2, 0x6c, 0x77, 0x6c, 0xaa, 0x21, 0x71, + 0x6c, 0xff, 0x21, 0x68, 0x7e, 0x50, 0x8, 0xac, 0x5f, 0x7f, 0x56, 0x2d, 0xb2, + 0x69, 0x5, 0x0, 0x2, 0xbe, 0x4, 0x7f, 0xff, 0x78, 0x2, 0x21, 0x66, 0xa, + 0x1f, 0x9, 0xb1, 0x2e, 0x81, 0x60, 0x2, 0x21, 0x66, 0xa5, 0xbf, 0x1, 0x6a, + 0x7e, 0x50, 0x2, 0xac, 0x5f, 0x49, 0x42, 0x56, 0x79, 0xbe, 0x44, 0x7f, 0xff, + 0x68, 0x5b, 0x49, 0xe2, 0x56, 0x79, 0x69, 0xf5, 0x0, 0x2, 0x7d, 0x4f, 0x9d, + 0x4e, 0x2d, 0x4f, 0x49, 0xe2, 0x56, 0x65, 0x69, 0xf5, 0x0, 0x4, 0x7d, 0x2f, + 0x9d, 0x2e, 0x2d, 0x2f, 0xbe, 0x44, 0x0, 0x0, 0x58, 0x2, 0x6d, 0x44, 0xbe, + 0x24, 0x0, 0x0, 0x58, 0x2, 0x6d, 0x22, 0x7e, 0x63, 0x68, 0xa8, 0x12, 0xb2, + 0xee, 0xbd, 0xf4, 0x18, 0x6, 0x7d, 0x46, 0x9e, 0x44, 0x0, 0x21, 0x7e, 0x63, + 0x68, 0xa9, 0x12, 0xb2, 0xee, 0xbd, 0xf2, 0x18, 0x6, 0x7d, 0x26, 0x9e, 0x24, + 0x0, 0x21, 0x12, 0xb2, 0xe4, 0x59, 0x4f, 0x2d, 0x32, 0x59, 0x2f, 0x2d, 0x34, + 0x80, 0xf, 0x12, 0xb2, 0xe4, 0x59, 0xf, 0x2d, 0x32, 0x69, 0x5, 0x0, 0x4, + 0x59, 0xf, 0x2d, 0x34, 0xa, 0xa, 0x19, 0xf0, 0x2e, 0x8b, 0x74, 0x1, 0x19, + 0xb1, 0x2e, 0x81, 0x80, 0x9, 0xb, 0xf0, 0x12, 0xb2, 0xc1, 0x28, 0x2, 0x1, + 0xbc, 0xb, 0xa0, 0x7e, 0x63, 0x56, 0x64, 0xbc, 0x6a, 0x28, 0x2, 0x1, 0xb8, + 0x6c, 0xaa, 0x80, 0x1a, 0x12, 0xb2, 0xda, 0x69, 0x30, 0x0, 0x2, 0x7e, 0x50, + 0x2, 0xac, 0x5a, 0x59, 0x32, 0x56, 0x79, 0x69, 0x30, 0x0, 0x4, 0x59, 0x32, + 0x56, 0x65, 0xb, 0xa0, 0x12, 0x87, 0x82, 0xbc, 0x7a, 0x38, 0xdf, 0x6c, 0xaa, + 0x80, 0x2b, 0xa, 0x2a, 0x9, 0xb2, 0x2e, 0x8b, 0xb4, 0xff, 0x20, 0x6c, 0xff, + 0x80, 0x18, 0xa, 0x4f, 0x9, 0xb4, 0x2e, 0x81, 0x70, 0xe, 0xa, 0x2a, 0x19, + 0xf2, 0x2e, 0x8b, 0x74, 0x1, 0x19, 0xb4, 0x2e, 0x81, 0x80, 0x6, 0xb, 0xf0, + 0xbc, 0x7f, 0x38, 0xe4, 0xb, 0xa0, 0xbc, 0x7a, 0x38, 0xd1, 0x6c, 0xaa, 0x80, + 0x1a, 0x7e, 0x70, 0x9, 0xac, 0x7a, 0x49, 0x43, 0x67, 0x1b, 0x12, 0xb2, 0xc9, + 0x59, 0x42, 0x2d, 0x5a, 0x49, 0x33, 0x67, 0x1d, 0x59, 0x32, 0x2d, 0x5c, 0xb, + 0xa0, 0x7e, 0xb3, 0x68, 0x79, 0xbc, 0xba, 0x38, 0xde, 0x7e, 0x34, 0x2d, + 0x32, 0x7a, 0x37, 0x2e, 0x97, 0x7e, 0x34, 0x2d, 0x5a, 0x7a, 0x37, 0x2e, + 0x99, 0x7e, 0x34, 0x2d, 0x82, 0x7a, 0x37, 0x2e, 0x9b, 0x7e, 0x73, 0x56, + 0x64, 0x7a, 0x73, 0x2e, 0x95, 0x7e, 0x73, 0x68, 0x79, 0x7a, 0x73, 0x2e, + 0x96, 0x7e, 0x8, 0x2e, 0x95, 0x12, 0x55, 0x4f, 0x6c, 0xaa, 0x80, 0x4a, 0x7e, + 0x70, 0xff, 0x6c, 0xff, 0x80, 0x19, 0x7e, 0x50, 0x2, 0xac, 0x5f, 0x49, 0x12, + 0x2d, 0x82, 0xa, 0x2a, 0xbd, 0x21, 0x78, 0x8, 0xa, 0x3f, 0x9, 0x73, 0x2e, + 0x8b, 0x80, 0x7, 0xb, 0xf0, 0x12, 0xb2, 0xc1, 0x38, 0xe2, 0xbe, 0x70, 0xff, + 0x68, 0x1e, 0x7e, 0x50, 0x9, 0xac, 0x5a, 0x19, 0x72, 0x67, 0x1f, 0x74, 0x1, + 0xa, 0x47, 0x19, 0xb4, 0x2e, 0x77, 0x12, 0xb2, 0xfa, 0xac, 0x37, 0x12, 0xb3, + 0x7, 0xac, 0x57, 0x12, 0xb2, 0xd1, 0xb, 0xa0, 0x7e, 0x63, 0x68, 0x79, 0xbc, + 0x6a, 0x38, 0xae, 0x6c, 0xaa, 0x80, 0x20, 0xa, 0x3a, 0x9, 0xb3, 0x2e, 0x77, + 0xbe, 0xb0, 0x1, 0x68, 0x13, 0x7e, 0x44, 0x7f, 0xff, 0x12, 0xb2, 0xda, 0x79, + 0x40, 0x0, 0x2, 0x2d, 0x3d, 0x7d, 0x2c, 0x79, 0x41, 0x0, 0x4, 0xb, 0xa0, + 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbc, 0xba, 0x38, 0xd7, 0x7e, 0x73, 0x68, 0x79, + 0x7a, 0x73, 0x56, 0x64, 0x7f, 0x6, 0x7e, 0x18, 0x2e, 0x77, 0x12, 0xb3, 0x17, + 0xda, 0xf8, 0xda, 0x69, 0x22, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbc, 0xbf, 0x22, + 0x7e, 0x50, 0x2, 0xac, 0x5a, 0x3e, 0x24, 0x22, 0x7f, 0x6, 0x2d, 0x12, 0x79, + 0x40, 0x0, 0x4, 0x22, 0x7e, 0x70, 0x8, 0xac, 0x7a, 0x7f, 0x6, 0x2d, 0x13, + 0x22, 0x7e, 0xd0, 0x2, 0xac, 0xda, 0x7d, 0xf6, 0x3e, 0xf4, 0x22, 0x7e, 0xd0, + 0x40, 0xac, 0xd6, 0x7d, 0xf6, 0x9e, 0xf4, 0x0, 0x20, 0x22, 0x7e, 0x90, 0x9, + 0xac, 0x9a, 0x49, 0x24, 0x67, 0x1b, 0x7e, 0x30, 0x8, 0x22, 0x2d, 0x1d, 0x7d, + 0xc, 0x79, 0x20, 0x0, 0x2, 0x49, 0x44, 0x67, 0x1d, 0x7e, 0x50, 0x8, 0x22, + 0xca, 0x79, 0x7e, 0xa3, 0x68, 0x79, 0x6c, 0x99, 0x80, 0x6f, 0xa, 0xf9, 0x2d, + 0xf3, 0x7d, 0xe2, 0x7e, 0x7b, 0xb0, 0xb4, 0x1, 0x30, 0x12, 0xb3, 0x98, 0x29, + 0xb7, 0x0, 0x1, 0xb4, 0x1, 0x6, 0x74, 0x3, 0x39, 0xb7, 0x0, 0x1, 0x12, 0xb3, + 0x98, 0x29, 0x87, 0x0, 0x1, 0xbe, 0x80, 0x3, 0x78, 0x3, 0xe4, 0x80, 0x35, + 0x4c, 0x88, 0x78, 0x4, 0x74, 0x2, 0x80, 0x2d, 0xbe, 0x80, 0x2, 0x78, 0x2b, + 0x74, 0x2, 0x80, 0x24, 0x12, 0xb3, 0x98, 0x29, 0xb7, 0x0, 0x1, 0xbe, 0xb0, + 0x2, 0x68, 0x2, 0x70, 0x14, 0x74, 0x1, 0x7a, 0x7b, 0xb0, 0x7c, 0x8a, 0xb, + 0xa0, 0x7e, 0xf0, 0x9, 0xac, 0xf8, 0x19, 0x97, 0x67, 0x1f, 0x80, 0x5, 0x74, + 0x3, 0x7a, 0x7b, 0xb0, 0x12, 0xb3, 0x98, 0x7e, 0x7b, 0xb0, 0x39, 0xb7, 0x0, + 0x1, 0xb, 0x90, 0x12, 0x85, 0xb, 0x38, 0x8c, 0xda, 0x79, 0x22, 0x7e, 0xf0, + 0x8, 0xac, 0xf9, 0x7f, 0x70, 0x2d, 0xf7, 0x22, 0xca, 0xf8, 0x7e, 0xb3, 0x68, + 0x79, 0x70, 0x17, 0xe4, 0x7a, 0xb3, 0x68, 0x82, 0x12, 0x9f, 0x9c, 0x28, + 0x1f, 0x74, 0x1, 0x7a, 0xb3, 0x68, 0x7e, 0xe4, 0x7a, 0xb3, 0x68, 0x81, 0x80, + 0x12, 0x74, 0x1, 0x7a, 0xb3, 0x68, 0x82, 0x7e, 0xb3, 0x68, 0x7a, 0x70, 0x6, + 0x74, 0x1, 0x7a, 0xb3, 0x68, 0x7d, 0x12, 0x8f, 0xff, 0xca, 0x59, 0x7e, 0x18, + 0x67, 0x1b, 0x7e, 0x8, 0x67, 0x75, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x90, 0x1, + 0x74, 0xe4, 0x93, 0xbe, 0xb0, 0x0, 0x28, 0x2d, 0x6c, 0xff, 0x80, 0x24, 0x74, + 0x9, 0xac, 0xbf, 0x49, 0x35, 0x67, 0x1b, 0x12, 0xb5, 0x24, 0x74, 0x9, 0xac, + 0xbf, 0x59, 0x35, 0x67, 0x75, 0x49, 0x35, 0x67, 0x1d, 0x12, 0xb4, 0x1f, + 0x74, 0x9, 0xac, 0xbf, 0x59, 0x35, 0x67, 0x77, 0xb, 0xf0, 0x12, 0xb2, 0xc1, + 0x38, 0xd7, 0xda, 0xf8, 0x22, 0xca, 0x79, 0x7d, 0x13, 0x9f, 0x11, 0x7e, + 0xf4, 0xd, 0xad, 0x7e, 0xe4, 0x0, 0xff, 0xb, 0x7a, 0xe0, 0x7d, 0xe, 0x7e, + 0xd4, 0xd, 0xab, 0x7e, 0xc4, 0x0, 0xff, 0xb, 0x6a, 0xd0, 0x7d, 0xfd, 0x90, + 0x1, 0x74, 0xe4, 0x93, 0x70, 0x4, 0x7d, 0x31, 0xa1, 0xf, 0x90, 0xd, 0x98, + 0xe4, 0x93, 0xb4, 0x1, 0x9, 0x7e, 0x54, 0xd, 0x9d, 0x12, 0xb7, 0x89, 0x80, + 0x2, 0x7d, 0x4d, 0x90, 0xd, 0xaf, 0xe4, 0x93, 0x7c, 0xfb, 0xa, 0x5f, 0xbd, + 0x51, 0x28, 0x1d, 0x7d, 0x25, 0x9d, 0x21, 0x7e, 0x14, 0xd, 0xb1, 0x12, 0xb5, + 0x12, 0xa, 0x1f, 0x6d, 0x0, 0xbf, 0x10, 0x48, 0x4, 0x7f, 0x10, 0x1b, 0x1c, + 0x9f, 0x1, 0x7f, 0x10, 0xa1, 0xf, 0x90, 0xd, 0xb0, 0xe4, 0x93, 0x7c, 0xeb, + 0xa, 0x5e, 0x7d, 0xd4, 0x9d, 0xd5, 0xbd, 0xd1, 0x50, 0x25, 0xbd, 0x41, 0x40, + 0x73, 0x7d, 0x21, 0x9d, 0x2d, 0x7e, 0x14, 0xd, 0xb3, 0x12, 0xb5, 0x12, 0xa, + 0x1e, 0x6d, 0x0, 0xbf, 0x10, 0x48, 0x4, 0x7f, 0x10, 0x1b, 0x1c, 0x7d, 0x1f, + 0x9d, 0x15, 0x6d, 0x0, 0x2f, 0x10, 0x80, 0x52, 0xbd, 0x1, 0x28, 0x1d, 0x7d, + 0x30, 0x9d, 0x31, 0x6d, 0x22, 0x7e, 0x14, 0xd, 0xb5, 0x12, 0x4f, 0x69, 0x12, + 0x2a, 0x31, 0x12, 0xb5, 0x1d, 0x7d, 0x1e, 0x6d, 0x0, 0x9f, 0x1, 0x7f, 0x10, + 0x80, 0x19, 0x7d, 0x31, 0x9d, 0x30, 0x6d, 0x22, 0x7e, 0x14, 0xd, 0xb7, 0x12, + 0x4f, 0x69, 0x12, 0x2a, 0x31, 0x12, 0xb5, 0x1d, 0x7d, 0x1e, 0x6d, 0x0, 0x2f, + 0x10, 0xa, 0x1f, 0x6d, 0x0, 0xbf, 0x10, 0x58, 0x4, 0x7f, 0x10, 0x80, 0xc, + 0x7d, 0x1f, 0x9d, 0x15, 0x6d, 0x0, 0xbf, 0x10, 0x8, 0x2, 0x7f, 0x10, 0xda, + 0x79, 0x22, 0x7e, 0x4, 0x0, 0xff, 0xb, 0xa, 0x30, 0xad, 0x32, 0x6d, 0x22, + 0x7c, 0x76, 0x7c, 0x65, 0x1a, 0x24, 0x22, 0xca, 0xf8, 0x7e, 0x14, 0xd, 0x9f, + 0x12, 0xb7, 0x9d, 0x7d, 0x2c, 0x7e, 0x14, 0xd, 0x9d, 0x7e, 0x4, 0x0, 0xff, + 0xb, 0xa, 0xd0, 0x90, 0x1, 0x74, 0xe4, 0x93, 0x70, 0x2, 0xc1, 0x3, 0x90, + 0xd, 0x98, 0xe4, 0x93, 0xb4, 0x1, 0xb, 0x7e, 0x54, 0xd, 0xab, 0x12, 0xb7, + 0x89, 0x1b, 0x44, 0x80, 0x5, 0xb, 0xa, 0x40, 0x1b, 0x44, 0x90, 0xd, 0xa1, + 0xe4, 0x93, 0x7c, 0xfb, 0xa, 0x5f, 0xbd, 0x53, 0x28, 0x20, 0x7d, 0xe5, 0x9d, + 0xe3, 0x7e, 0x34, 0xd, 0xa3, 0x12, 0xb6, 0x6, 0x12, 0xb7, 0x61, 0xa, 0x3f, + 0xbf, 0x71, 0x40, 0x4, 0x7f, 0x71, 0x1b, 0x7c, 0x1b, 0x1c, 0x9f, 0x17, 0x7f, + 0x71, 0x80, 0x79, 0x90, 0xd, 0xa2, 0xe4, 0x93, 0x7c, 0x3b, 0xa, 0x53, 0x7d, + 0x4, 0x9d, 0x5, 0xbd, 0x3, 0x50, 0x22, 0x7d, 0xe3, 0x9d, 0xe0, 0x7e, 0x34, + 0xd, 0xa5, 0x12, 0xb6, 0x6, 0x12, 0xb7, 0x61, 0xa, 0x33, 0xbf, 0x71, 0x40, + 0x4, 0x7f, 0x71, 0x1b, 0x7c, 0x7d, 0x3d, 0x9d, 0x35, 0x6d, 0x22, 0x2f, 0x71, + 0x80, 0x46, 0xbd, 0x23, 0x28, 0x19, 0x7d, 0xf2, 0x1b, 0xf4, 0x9d, 0xf3, + 0x6d, 0xee, 0x7e, 0x34, 0xd, 0xa7, 0x12, 0xb7, 0x70, 0x1b, 0x34, 0x6d, 0x22, + 0x9f, 0x17, 0x7f, 0x71, 0x80, 0x11, 0x7d, 0xf3, 0x9d, 0xf2, 0x6d, 0xee, + 0x7e, 0x34, 0xd, 0xa9, 0x12, 0xb7, 0x70, 0x6d, 0x22, 0x2f, 0x71, 0xa, 0x3f, + 0x6d, 0x22, 0xbf, 0x71, 0x50, 0x4, 0x7f, 0x71, 0x80, 0xc, 0x7d, 0x3d, 0x9d, + 0x35, 0x6d, 0x22, 0xbf, 0x71, 0x28, 0x2, 0x7f, 0x71, 0x7d, 0x3f, 0xda, 0xf8, + 0x22, 0x7e, 0x24, 0x0, 0xff, 0xb, 0x1a, 0xf0, 0x22, 0xca, 0xf8, 0x6c, 0xff, + 0x7e, 0xb7, 0x52, 0x65, 0x7e, 0xc7, 0x52, 0x67, 0x7e, 0x97, 0x52, 0x4d, + 0x7e, 0xd7, 0x52, 0x4f, 0x7e, 0xa7, 0x52, 0x61, 0x7e, 0xe7, 0x52, 0x63, + 0xe4, 0x7e, 0x73, 0x52, 0x71, 0x1b, 0x70, 0x7d, 0x2b, 0x7d, 0x1c, 0x12, + 0xed, 0x14, 0x40, 0x2, 0xe1, 0x5c, 0x7e, 0x73, 0x52, 0x71, 0xbe, 0x70, 0xa, + 0x28, 0x13, 0xe4, 0x7e, 0x70, 0x9, 0x7e, 0x27, 0x52, 0x69, 0x7e, 0x17, 0x52, + 0x6b, 0x12, 0xed, 0x14, 0x40, 0x2, 0xe1, 0x5c, 0x7e, 0x73, 0x52, 0x71, 0xbe, + 0x70, 0xf, 0x28, 0x13, 0xe4, 0x7e, 0x70, 0xe, 0x7e, 0x27, 0x52, 0x6d, 0x7e, + 0x17, 0x52, 0x6f, 0x12, 0xed, 0x14, 0x40, 0x2, 0xe1, 0x5c, 0x7e, 0x34, 0xe, + 0x14, 0x12, 0xb6, 0x6, 0xbd, 0xfc, 0x28, 0x50, 0x7e, 0x34, 0xe, 0x12, 0x12, + 0xb6, 0x6, 0xbd, 0xfb, 0x50, 0x45, 0x7e, 0x34, 0xe, 0x18, 0x12, 0x32, 0xdf, + 0x12, 0xb7, 0x91, 0x7d, 0x8f, 0x9d, 0x83, 0xbe, 0x87, 0x52, 0x4b, 0x50, + 0x31, 0x7e, 0x34, 0xe, 0x16, 0x7e, 0x24, 0x0, 0xff, 0xb, 0x1a, 0x80, 0x9d, + 0xf8, 0xbe, 0xf7, 0x52, 0x4b, 0x28, 0x1e, 0x7e, 0x34, 0x0, 0x3, 0xad, 0x3c, + 0x7d, 0xfb, 0x3e, 0xf4, 0xbd, 0xf3, 0x38, 0x2, 0xe1, 0x5c, 0xbd, 0xa9, 0x50, + 0x5, 0x7e, 0xf0, 0x20, 0xe1, 0x5c, 0x7e, 0xf0, 0x21, 0xe1, 0x5c, 0x7e, 0x34, + 0xe, 0x1c, 0x12, 0xb6, 0x6, 0xbd, 0xfb, 0x38, 0x2, 0xe1, 0x5c, 0x7e, 0x34, + 0xe, 0x1a, 0x12, 0xb6, 0x6, 0xbd, 0xfc, 0x50, 0x75, 0x7e, 0xb3, 0x52, 0x4a, + 0x70, 0x6f, 0x7e, 0x34, 0xe, 0x20, 0x12, 0x32, 0xdf, 0x12, 0xb7, 0x91, 0x7d, + 0xaf, 0x9d, 0xa3, 0xbe, 0xa7, 0x52, 0x4b, 0x50, 0x5b, 0x7e, 0x34, 0xe, 0x1e, + 0x7e, 0x24, 0x0, 0xff, 0xb, 0x1a, 0xa0, 0x9d, 0xfa, 0xbe, 0xf7, 0x52, 0x4b, + 0x28, 0x48, 0x7d, 0xfb, 0x3e, 0xf4, 0x7e, 0x34, 0x0, 0x3, 0xad, 0x3c, 0xbd, + 0x3f, 0x28, 0x3a, 0xbd, 0xed, 0x50, 0x5, 0x7e, 0xf0, 0x22, 0x80, 0x31, 0x7e, + 0xa3, 0x52, 0x71, 0x7e, 0x10, 0x4, 0xac, 0x1a, 0x49, 0x30, 0x4e, 0x84, 0x49, + 0x10, 0x4e, 0x86, 0x49, 0x20, 0x4e, 0x74, 0x49, 0x0, 0x4e, 0x76, 0x9d, 0x10, + 0xbe, 0x14, 0x0, 0x20, 0x18, 0xd, 0x9d, 0x32, 0xbe, 0x34, 0x0, 0x10, 0x48, + 0x5, 0xbe, 0xa0, 0x6, 0x50, 0x3, 0x7e, 0xf0, 0x23, 0x7c, 0xbf, 0xda, 0xf8, + 0x22, 0xad, 0xfe, 0x6d, 0xee, 0x7d, 0x3f, 0x7d, 0x2e, 0x7c, 0x76, 0x7c, + 0x65, 0x7f, 0x71, 0x22, 0x7e, 0x24, 0x0, 0xff, 0xb, 0x1a, 0x10, 0x7f, 0x17, + 0x12, 0x2a, 0x31, 0x7f, 0x71, 0x7c, 0x76, 0x7c, 0x65, 0xa, 0x24, 0x7f, 0x71, + 0x7d, 0x3c, 0x22, 0x7e, 0x44, 0x0, 0xff, 0xb, 0x2a, 0x40, 0x22, 0x7e, 0x14, + 0xe, 0x30, 0x7e, 0x4, 0x0, 0xff, 0xb, 0xa, 0xf0, 0x22, 0x7e, 0x4, 0x0, 0xff, + 0xb, 0xa, 0xc0, 0x22, 0xca, 0xf8, 0x6c, 0xaa, 0x80, 0x40, 0x7e, 0xf0, 0x3, + 0x7e, 0x90, 0x8, 0xac, 0x9a, 0x7f, 0x10, 0x2d, 0x34, 0x7a, 0x1b, 0xf0, 0x74, + 0x3, 0x7f, 0x10, 0x2d, 0x34, 0x39, 0xb1, 0x0, 0x1, 0x7e, 0x34, 0x7f, 0xff, + 0x7f, 0x70, 0x2d, 0xf4, 0x79, 0x37, 0x0, 0x2, 0x7f, 0x70, 0x2d, 0xf4, 0x79, + 0x37, 0x0, 0x4, 0xe4, 0x7f, 0x10, 0x2d, 0x34, 0x39, 0xb1, 0x0, 0x6, 0x7f, + 0x10, 0x2d, 0x34, 0x39, 0xb1, 0x0, 0x7, 0xb, 0xa0, 0x90, 0xd, 0xe, 0xe4, + 0x93, 0xbc, 0xba, 0x38, 0xb7, 0xda, 0xf8, 0x22, 0x7e, 0xb3, 0x54, 0x13, + 0xbe, 0xb0, 0x1, 0x68, 0x28, 0x12, 0xb8, 0x29, 0x38, 0x23, 0xbe, 0xa3, 0x68, + 0x79, 0x50, 0x18, 0x7e, 0xb3, 0x68, 0x83, 0xbe, 0xb3, 0x1, 0xa4, 0x28, 0x13, + 0x7e, 0xb3, 0x1, 0xa4, 0x4, 0x7a, 0xb3, 0x1, 0xa4, 0x7a, 0xa3, 0x68, 0x79, + 0x22, 0xe4, 0x7a, 0xb3, 0x1, 0xa4, 0x22, 0x7e, 0xa3, 0x68, 0x7a, 0xbe, 0xa0, + 0x0, 0x22, 0x7e, 0xb3, 0x68, 0x79, 0x70, 0x22, 0x12, 0xb8, 0x29, 0x28, 0x1d, + 0x7e, 0xb3, 0x1, 0xa3, 0x70, 0x11, 0x7a, 0xa3, 0x68, 0x79, 0x74, 0x1, 0x7a, + 0xb3, 0x68, 0x80, 0x7e, 0xb3, 0x1, 0xa3, 0x4, 0x80, 0x1, 0xe4, 0x7a, 0xb3, + 0x1, 0xa3, 0x22, 0xe4, 0x7a, 0xb3, 0x1, 0xa3, 0x7a, 0xb3, 0x68, 0x80, 0x22, + 0x2, 0xb8, 0x66, 0xca, 0x3b, 0x7c, 0xc4, 0x7c, 0xd5, 0x7c, 0xeb, 0x7d, 0xf3, + 0x7e, 0x17, 0x68, 0x97, 0xbd, 0x13, 0x38, 0x6, 0x7e, 0xd4, 0x1, 0x0, 0x80, + 0x17, 0x6d, 0x22, 0x7c, 0x56, 0x7c, 0x67, 0x6c, 0x77, 0x12, 0x2a, 0x3a, + 0x7d, 0xd3, 0xbe, 0xd4, 0x0, 0x10, 0x50, 0x4, 0x7e, 0xd4, 0x0, 0x10, 0x74, + 0x2, 0xac, 0xbc, 0x49, 0x45, 0x1, 0x8f, 0xbd, 0x4f, 0x28, 0x6, 0x49, 0xd5, + 0x1, 0x6f, 0x80, 0x4, 0x59, 0xd5, 0x1, 0x6f, 0x59, 0xf5, 0x1, 0x8f, 0xa, + 0xcc, 0x9, 0xac, 0x1, 0x83, 0x4c, 0xaa, 0x68, 0x3c, 0xbe, 0xa0, 0xff, 0x78, + 0xa, 0x7e, 0xf0, 0xff, 0xe4, 0x19, 0xbc, 0x1, 0x83, 0x80, 0x25, 0xa, 0x2a, + 0x7e, 0x34, 0x0, 0x8, 0x9d, 0x32, 0x7c, 0xb7, 0x7e, 0x34, 0x0, 0x2, 0x60, + 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x2e, 0x34, 0x0, 0x23, 0x7c, 0xf7, 0x2e, + 0xc4, 0x1, 0x83, 0x7c, 0xba, 0x14, 0x7a, 0xc9, 0xb0, 0xa, 0xcf, 0xbd, 0xcd, + 0x50, 0x2, 0x7d, 0xdc, 0xbe, 0xd4, 0x1, 0x0, 0x28, 0x4, 0x7e, 0xd4, 0x1, + 0x0, 0x7e, 0x73, 0x68, 0x79, 0xbe, 0x70, 0x5, 0x28, 0x4, 0x1e, 0xd4, 0x1e, + 0xd4, 0xbe, 0xd4, 0x0, 0x20, 0x50, 0x11, 0x7e, 0x70, 0x9, 0xac, 0x7c, 0x9, + 0xb3, 0x1, 0x12, 0xb4, 0x1, 0x5, 0xe4, 0x19, 0xb3, 0x1, 0x12, 0xbe, 0xd4, + 0x0, 0x40, 0x28, 0xc, 0x7e, 0xa0, 0x1, 0x7e, 0x70, 0x9, 0xac, 0x7c, 0x19, + 0xa3, 0x1, 0x12, 0x7c, 0xbd, 0x7c, 0x7c, 0x12, 0xbb, 0x9f, 0x7d, 0xe3, 0x7e, + 0x90, 0x9, 0xac, 0x9e, 0x49, 0xc4, 0x67, 0xcf, 0x74, 0x9, 0xac, 0xbd, 0x49, + 0x35, 0x67, 0x1b, 0x7d, 0x23, 0x9d, 0x2c, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x6, + 0x7d, 0xf3, 0x9d, 0xfc, 0x80, 0x4, 0x6d, 0xff, 0x9d, 0xf2, 0x12, 0xb9, 0xd5, + 0xbd, 0x3c, 0x7e, 0x70, 0x9, 0x28, 0xd, 0xac, 0x7e, 0x2e, 0x34, 0x67, 0xcf, + 0x2d, 0xfc, 0x1b, 0x38, 0xf0, 0x80, 0xb, 0xac, 0x7e, 0x2e, 0x34, 0x67, 0xcf, + 0x9d, 0xcf, 0x1b, 0x38, 0xc0, 0x7e, 0x90, 0x9, 0xac, 0x9e, 0x49, 0x34, 0x67, + 0xd1, 0x74, 0x9, 0xac, 0xbd, 0x49, 0x25, 0x67, 0x1d, 0x7d, 0xc2, 0x9d, 0xc3, + 0xbe, 0xc4, 0x0, 0x0, 0x8, 0x6, 0x7d, 0xf2, 0x9d, 0xf3, 0x80, 0x4, 0x6d, + 0xff, 0x9d, 0xfc, 0x12, 0xb9, 0xd5, 0xbd, 0x23, 0x28, 0x13, 0x74, 0x9, 0xac, + 0xbe, 0x7d, 0xe5, 0x2e, 0xe4, 0x67, 0xd1, 0x7d, 0x23, 0x2d, 0x2f, 0x1b, + 0xe8, 0x20, 0x80, 0xe, 0x7e, 0x50, 0x9, 0xac, 0x5e, 0x2e, 0x24, 0x67, 0xd1, + 0x9d, 0x3f, 0x1b, 0x28, 0x30, 0xda, 0x3b, 0x22, 0x7d, 0x1d, 0xad, 0x1f, + 0x7c, 0x32, 0x7c, 0x21, 0xa, 0x0, 0x7d, 0xf1, 0x5d, 0xfe, 0x22, 0xca, 0x3b, + 0x7c, 0xfb, 0x6c, 0xee, 0x41, 0x7e, 0x6c, 0xdd, 0x80, 0x16, 0x74, 0x9, 0xac, + 0xbd, 0x9, 0x65, 0x67, 0xd3, 0x74, 0x9, 0xac, 0xbe, 0x9, 0x75, 0x67, 0x1f, + 0xbc, 0x67, 0x68, 0x7, 0xb, 0xd0, 0x12, 0xba, 0x87, 0x38, 0xe5, 0x12, 0xba, + 0x87, 0x28, 0x74, 0x7e, 0x50, 0x9, 0xac, 0x5d, 0x9, 0xc2, 0x67, 0xd3, 0x49, + 0x42, 0x67, 0xd1, 0x74, 0x9, 0xac, 0xbe, 0x49, 0xa5, 0x67, 0x1d, 0x7d, 0x3a, + 0x9d, 0x34, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xa4, 0x80, 0x4, 0x6d, + 0xaa, 0x9d, 0xa3, 0x49, 0x42, 0x67, 0xcf, 0x49, 0xb5, 0x67, 0x1b, 0x7d, + 0x3b, 0x9d, 0x34, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xb4, 0x80, 0x4, + 0x6d, 0xbb, 0x9d, 0xb3, 0x2d, 0xba, 0x74, 0x8, 0xac, 0xbc, 0x9, 0xb5, 0x68, + 0x29, 0xb4, 0x1, 0xe, 0x6d, 0xaa, 0x74, 0x2, 0xac, 0xbc, 0x59, 0xa5, 0x1, + 0x6f, 0x59, 0xa5, 0x1, 0x8f, 0x7d, 0x3b, 0x7c, 0xbd, 0x7c, 0x5e, 0x7c, 0x4c, + 0x12, 0xba, 0x8f, 0x7c, 0xbd, 0x12, 0xb8, 0x63, 0xb, 0xe0, 0xbc, 0xfe, 0x28, + 0x2, 0x21, 0xec, 0xda, 0x3b, 0x22, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbc, 0xbd, + 0x22, 0xca, 0x3b, 0x7c, 0xab, 0x7d, 0x3, 0x7e, 0x20, 0x10, 0x7d, 0x30, 0x7e, + 0x90, 0x9, 0xac, 0x95, 0x9, 0x34, 0x67, 0x21, 0xbe, 0x30, 0x10, 0x28, 0x2, + 0x7c, 0x23, 0xbe, 0x20, 0x20, 0x28, 0x3, 0x7e, 0x20, 0x20, 0x49, 0xe4, 0x67, + 0x1b, 0xbe, 0xe4, 0x6, 0x50, 0x40, 0x20, 0x7e, 0x33, 0x68, 0xa8, 0x12, 0xbb, + 0x8b, 0xbd, 0xef, 0x38, 0x15, 0x49, 0xe4, 0x67, 0x1d, 0xbe, 0xe4, 0x6, 0x50, + 0x40, 0xb, 0x7e, 0x33, 0x68, 0xa9, 0x12, 0xbb, 0x8b, 0xbd, 0xef, 0x28, 0x3, + 0x7e, 0x20, 0x8, 0x7e, 0xf0, 0x10, 0xac, 0xf2, 0xbd, 0x70, 0x40, 0x5d, 0x7e, + 0xf0, 0x9, 0xac, 0xf4, 0x9, 0xb7, 0x1, 0x12, 0x70, 0x52, 0x7e, 0xd0, 0x8, + 0xac, 0xd2, 0xbd, 0x60, 0x50, 0x3c, 0x9, 0xb7, 0x1, 0xb, 0x70, 0x1f, 0x9, + 0xb7, 0x1, 0xc, 0xbe, 0xb0, 0x0, 0x28, 0xc, 0x7d, 0x37, 0x2e, 0x34, 0x1, + 0xc, 0x14, 0x7a, 0x39, 0xb0, 0x80, 0x6, 0x74, 0x1, 0x19, 0xb7, 0x1, 0xb, + 0x6d, 0x33, 0x80, 0x34, 0x9, 0xb7, 0x1, 0xc, 0xbe, 0xb0, 0x14, 0x50, 0x2b, + 0x7d, 0x37, 0x2e, 0x34, 0x1, 0xc, 0x4, 0x7a, 0x39, 0xb0, 0x6d, 0x33, 0x80, + 0x1d, 0xe4, 0x19, 0xb7, 0x1, 0xc, 0x19, 0xb7, 0x1, 0xb, 0x6d, 0x33, 0x80, + 0x10, 0x6c, 0x33, 0x7e, 0xf0, 0x9, 0xac, 0xf4, 0x19, 0x37, 0x1, 0xc, 0xe4, + 0x19, 0xb7, 0x1, 0xb, 0x7e, 0x30, 0x8, 0xac, 0x23, 0xbd, 0x10, 0x40, 0x2a, + 0x7e, 0x70, 0x9, 0xac, 0x7a, 0x49, 0x33, 0x67, 0xcf, 0x59, 0x34, 0x67, 0x1b, + 0x74, 0x9, 0xa4, 0x49, 0x35, 0x67, 0xd1, 0x74, 0x9, 0xac, 0xb5, 0x59, 0x35, + 0x67, 0x1d, 0x7e, 0xa0, 0x1, 0x7e, 0x70, 0x9, 0xac, 0x74, 0x19, 0xa3, 0x1, + 0xa, 0x6d, 0x33, 0xda, 0x3b, 0x22, 0x7e, 0xf0, 0x40, 0xac, 0xf3, 0x7d, 0xf7, + 0x9e, 0xf4, 0x0, 0x65, 0x3e, 0xf4, 0x3e, 0xf4, 0x3e, 0xf4, 0x3e, 0xf4, 0x22, + 0xca, 0x3b, 0x7c, 0x37, 0x7c, 0xab, 0x7e, 0x24, 0xff, 0xfc, 0x7d, 0x32, + 0x7e, 0x23, 0x68, 0x79, 0x7e, 0xf0, 0x9, 0xac, 0xf3, 0x9, 0xb7, 0x1, 0xd, + 0xb4, 0x1, 0x63, 0xa5, 0xba, 0x1, 0xc, 0xbe, 0x34, 0xff, 0x0, 0x28, 0x10, + 0x7e, 0x34, 0xff, 0x0, 0x80, 0xa, 0xbe, 0x34, 0xff, 0xe0, 0x28, 0x4, 0x7e, + 0x34, 0xff, 0xe0, 0x49, 0x7, 0x1, 0xe, 0x7e, 0xd0, 0x9, 0xac, 0xda, 0x49, + 0xf6, 0x67, 0x1b, 0x7d, 0x40, 0x12, 0xa4, 0xee, 0x8, 0x4, 0x9d, 0xf, 0x80, + 0x4, 0x6d, 0x0, 0x9d, 0x4, 0xbe, 0x4, 0x1, 0x0, 0x28, 0x5, 0xe4, 0x19, 0xb7, + 0x1, 0xd, 0x49, 0x7, 0x1, 0x10, 0x49, 0xf6, 0x67, 0x1d, 0x7d, 0x40, 0x12, + 0xa4, 0xee, 0x8, 0x4, 0x9d, 0xf, 0x80, 0x4, 0x6d, 0x0, 0x9d, 0x4, 0xbe, 0x4, + 0x1, 0x0, 0x28, 0x5, 0xe4, 0x19, 0xb7, 0x1, 0xd, 0x49, 0xe7, 0x1, 0xe, 0x7e, + 0xd0, 0x9, 0xac, 0xda, 0x49, 0x46, 0x67, 0x1b, 0x7d, 0xf4, 0x9d, 0xfe, 0xbe, + 0xf4, 0x0, 0x0, 0x8, 0x6, 0x7d, 0x4, 0x9d, 0xe, 0x80, 0x4, 0x6d, 0x0, 0x9d, + 0xf, 0xbe, 0x4, 0x4, 0x0, 0x38, 0x29, 0x74, 0x9, 0xac, 0x3b, 0x49, 0xf1, + 0x1, 0x10, 0x7e, 0x30, 0x9, 0xac, 0x3a, 0x49, 0x11, 0x67, 0x1d, 0x7d, 0x1, + 0x9d, 0xf, 0xbe, 0x4, 0x0, 0x0, 0x8, 0x4, 0x9d, 0x1f, 0x80, 0x4, 0x6d, 0x11, + 0x9d, 0x10, 0xbe, 0x14, 0x4, 0x0, 0x28, 0x2, 0x7d, 0x32, 0xbe, 0x44, 0x6, + 0x50, 0x40, 0x29, 0x7e, 0x43, 0x68, 0xa8, 0x12, 0xbc, 0xa6, 0x12, 0x5d, + 0x6f, 0xbd, 0x42, 0x38, 0x1b, 0x74, 0x9, 0xa4, 0x49, 0x15, 0x67, 0x1d, 0xbe, + 0x14, 0x6, 0x50, 0x40, 0xe, 0x7e, 0x43, 0x68, 0xa9, 0x12, 0xbc, 0xa6, 0x12, + 0x5d, 0x6f, 0xbd, 0x12, 0x28, 0x4, 0x7e, 0x34, 0xff, 0xff, 0xda, 0x3b, 0x22, + 0x7e, 0x50, 0x40, 0xac, 0x45, 0x9e, 0x24, 0x0, 0x65, 0x22, 0x6c, 0xaa, 0x80, + 0x63, 0x7e, 0x50, 0x9, 0xac, 0x5a, 0x49, 0x32, 0x67, 0xcf, 0x12, 0x4b, 0x9b, + 0x59, 0x32, 0x67, 0x1b, 0x7e, 0x50, 0x9, 0xac, 0x5a, 0x49, 0x32, 0x67, 0xd1, + 0x12, 0x4b, 0x9b, 0x59, 0x32, 0x67, 0x1d, 0x7e, 0x90, 0x9, 0xac, 0x9a, 0x9, + 0xb4, 0x67, 0xd3, 0x19, 0xb4, 0x67, 0x1f, 0x7e, 0x90, 0x9, 0xac, 0x9a, 0x9, + 0xb4, 0x67, 0xd4, 0x19, 0xb4, 0x67, 0x20, 0x7e, 0x90, 0x9, 0xac, 0x9a, 0x9, + 0xb4, 0x67, 0xd5, 0x19, 0xb4, 0x67, 0x21, 0x7e, 0x90, 0x9, 0xac, 0x9a, 0x9, + 0xb4, 0x67, 0xd6, 0x19, 0xb4, 0x67, 0x22, 0x7e, 0x90, 0x9, 0xac, 0x9a, 0x9, + 0xb4, 0x67, 0xd7, 0x19, 0xb4, 0x67, 0x23, 0xb, 0xa0, 0x90, 0xd, 0xe, 0xe4, + 0x93, 0xbc, 0xba, 0x38, 0x94, 0x22, 0xd2, 0x0, 0xe4, 0x7a, 0xb3, 0x67, 0x14, + 0x7a, 0xb3, 0x67, 0x17, 0x7e, 0xb3, 0x67, 0xc, 0xb4, 0x1, 0x6, 0x74, 0x1, + 0x7a, 0xb3, 0x67, 0x14, 0x7e, 0xb3, 0x67, 0x10, 0x70, 0x2, 0xc2, 0x0, 0x7e, + 0xb3, 0x2e, 0x74, 0x70, 0x2, 0xc2, 0x0, 0x7e, 0xb3, 0x67, 0x12, 0xb4, 0x1, + 0x2, 0xc2, 0x0, 0x20, 0x0, 0x5, 0xe4, 0x7a, 0xb3, 0x67, 0x14, 0x22, 0xca, + 0x3b, 0x7c, 0xfb, 0x7f, 0x60, 0x75, 0x29, 0x0, 0x9f, 0x44, 0x6d, 0x11, 0x7d, + 0xb1, 0x7d, 0x61, 0x7f, 0x76, 0x6c, 0xee, 0x80, 0x18, 0xb, 0x7a, 0x30, 0x12, + 0x2b, 0x2c, 0x7d, 0xa3, 0xb, 0xf5, 0xbd, 0xba, 0x50, 0x2, 0x7d, 0xba, 0x7d, + 0x3a, 0x6d, 0x22, 0x2f, 0x41, 0xb, 0xe0, 0xbc, 0xfe, 0x38, 0xe4, 0xbe, 0xb4, + 0x0, 0x1e, 0x58, 0xb, 0x7e, 0xb3, 0x54, 0x15, 0xb4, 0x1, 0x4, 0x6d, 0x33, + 0xc1, 0x8d, 0xbe, 0xb4, 0x4, 0xb0, 0x8, 0x6, 0x7e, 0xb4, 0x1, 0xf4, 0x80, + 0x1c, 0xbe, 0xb4, 0x3, 0x20, 0x8, 0x6, 0x7e, 0xb4, 0x1, 0xc2, 0x80, 0x10, + 0xbe, 0xb4, 0x0, 0x0, 0x8, 0x6, 0x7e, 0xb4, 0x1, 0x90, 0x80, 0x4, 0x6d, + 0x33, 0xc1, 0x8d, 0x7e, 0xb3, 0x56, 0x28, 0x70, 0x4, 0x7e, 0xb4, 0x1, 0x90, + 0xa, 0x1f, 0x12, 0xbe, 0x98, 0x9f, 0x44, 0x7f, 0x76, 0x6c, 0xee, 0x80, 0x1c, + 0xb, 0x7a, 0x60, 0xb, 0xf5, 0x7d, 0x36, 0x12, 0x2b, 0x2c, 0x7d, 0xa3, 0xbd, + 0x1a, 0x28, 0xa, 0x7d, 0x36, 0x1a, 0x26, 0x1a, 0x24, 0x2f, 0x41, 0x5, 0x29, + 0xb, 0xe0, 0xbc, 0xfe, 0x38, 0xe0, 0x6d, 0x11, 0xe5, 0x29, 0xbe, 0xb0, 0x0, + 0x28, 0x7, 0xe5, 0x29, 0xa, 0x1b, 0x12, 0xbe, 0x98, 0xbd, 0x1b, 0x8, 0x4, + 0x7d, 0x1b, 0x80, 0xa, 0x6d, 0x0, 0x9d, 0xb, 0xbd, 0x1, 0x8, 0x2, 0x7d, + 0x10, 0x7f, 0x76, 0xbe, 0x14, 0x0, 0x0, 0x8, 0x20, 0x6c, 0xee, 0x80, 0x16, + 0x12, 0xbe, 0x90, 0x8, 0xd, 0x7d, 0x31, 0xe, 0x34, 0xbd, 0x30, 0x58, 0x5, + 0x9d, 0x1, 0x1b, 0x7a, 0x0, 0xb, 0xf5, 0xb, 0xe0, 0xbc, 0xfe, 0x38, 0xe6, + 0x80, 0x43, 0xbe, 0x14, 0x0, 0x0, 0x58, 0x3d, 0x6c, 0xee, 0x80, 0x35, 0x12, + 0xbe, 0x90, 0x58, 0x2c, 0xbe, 0x4, 0x0, 0x0, 0x8, 0x5, 0xb, 0x7a, 0x20, + 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x20, 0x7d, 0x51, 0xe, 0x54, 0xbe, 0x54, 0x0, + 0x0, 0x8, 0x6, 0x7d, 0x31, 0xe, 0x34, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x35, + 0xbd, 0x32, 0x58, 0x5, 0x9d, 0x1, 0x1b, 0x7a, 0x0, 0xb, 0xf5, 0xb, 0xe0, + 0xbc, 0xfe, 0x38, 0xc7, 0x7d, 0x31, 0xda, 0x3b, 0x22, 0xb, 0x7a, 0x0, 0xbe, + 0x4, 0x0, 0x0, 0x22, 0x6d, 0x0, 0x7f, 0x14, 0x12, 0x2a, 0x8d, 0x7d, 0x13, + 0x22, 0x7e, 0x63, 0x68, 0xa7, 0x7e, 0x73, 0x68, 0xa6, 0xac, 0x76, 0x7d, + 0x13, 0x1e, 0x14, 0x7e, 0x27, 0x66, 0xee, 0x2e, 0x27, 0x66, 0xec, 0xbd, + 0x21, 0x38, 0x10, 0x1e, 0x34, 0x1e, 0x34, 0xbe, 0x37, 0x66, 0xec, 0x40, 0x6, + 0xbe, 0x37, 0x66, 0xee, 0x50, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0xe4, 0x7a, 0xb3, + 0x67, 0xc, 0x7e, 0xa3, 0x66, 0xeb, 0xbe, 0xa0, 0x0, 0x28, 0x1d, 0x7e, 0x27, + 0x68, 0x8b, 0x7e, 0x34, 0x0, 0x6, 0xad, 0x32, 0x7e, 0x24, 0x0, 0x4, 0x12, + 0x29, 0xee, 0xbe, 0x37, 0x66, 0xf4, 0x8, 0x6, 0x74, 0x1, 0x7a, 0xb3, 0x67, + 0xc, 0x7e, 0xb3, 0x67, 0xc, 0xb4, 0x1, 0x21, 0xbe, 0xa0, 0x0, 0x28, 0x1c, + 0xbe, 0xa0, 0x3, 0x50, 0x17, 0x7e, 0xb3, 0x66, 0xea, 0xb4, 0x1, 0x10, 0x90, + 0xd, 0xb9, 0xe4, 0x93, 0xbe, 0xb3, 0x65, 0x60, 0x68, 0x5, 0xe4, 0x7a, 0xb3, + 0x67, 0xc, 0x22, 0xd2, 0x0, 0x6c, 0x99, 0x80, 0x35, 0x74, 0x2, 0xac, 0xb9, + 0x9, 0x5, 0x53, 0xb0, 0x9, 0x15, 0x53, 0xb1, 0x12, 0xbf, 0xa9, 0x74, 0x2, + 0xac, 0xb9, 0x49, 0x25, 0x53, 0x73, 0x7d, 0xf3, 0x9d, 0xf2, 0xbe, 0xf4, 0x0, + 0x0, 0x8, 0x4, 0x7d, 0x1f, 0x80, 0x4, 0x6d, 0x11, 0x9d, 0x1f, 0xbe, 0x17, + 0x67, 0x3, 0x28, 0x4, 0xc2, 0x0, 0x80, 0xa, 0xb, 0x90, 0x7e, 0x83, 0x53, + 0xaf, 0xbc, 0x89, 0x38, 0xc3, 0x20, 0x0, 0x31, 0x6c, 0x99, 0x80, 0x21, 0x74, + 0x2, 0xac, 0xb9, 0x9, 0x5, 0x65, 0x60, 0x9, 0x15, 0x65, 0x61, 0x12, 0xbf, + 0xa9, 0x74, 0x2, 0xac, 0xb9, 0x59, 0x35, 0x53, 0x73, 0x19, 0x5, 0x53, 0xb0, + 0x19, 0x15, 0x53, 0xb1, 0xb, 0x90, 0x7e, 0x73, 0x66, 0xea, 0xbc, 0x79, 0x38, + 0xd7, 0x7a, 0x73, 0x53, 0xaf, 0x7e, 0xb3, 0x66, 0xea, 0x70, 0x5, 0xe4, 0x7a, + 0xb3, 0x53, 0xaf, 0xa2, 0x0, 0x22, 0x7c, 0xb0, 0x7c, 0x71, 0x2, 0x36, 0x62, + 0x7c, 0x67, 0x7e, 0xb, 0x70, 0xbc, 0x7b, 0x38, 0x1a, 0x29, 0x70, 0x0, 0x2, + 0xbc, 0x7b, 0x28, 0x12, 0x29, 0x70, 0x0, 0x1, 0xbc, 0x76, 0x38, 0xa, 0x29, + 0x70, 0x0, 0x3, 0xbc, 0x76, 0x28, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0x7c, 0xab, + 0x6d, 0x33, 0x6c, 0x55, 0x12, 0xf0, 0xaa, 0x49, 0x11, 0x34, 0x8d, 0x59, + 0x10, 0x56, 0x50, 0x12, 0xf0, 0xaa, 0x49, 0x41, 0x34, 0x8d, 0xbd, 0x43, + 0x28, 0x2, 0x7d, 0x34, 0x49, 0x11, 0x34, 0x97, 0x59, 0x10, 0x56, 0x5a, 0x7e, + 0x30, 0x2, 0xac, 0x35, 0x7e, 0x10, 0x14, 0xac, 0x1a, 0x2d, 0x1, 0x49, 0x10, + 0x34, 0x97, 0xbd, 0x13, 0x28, 0x2, 0x7d, 0x31, 0xb, 0x50, 0xbe, 0x50, 0x5, + 0x40, 0xc3, 0x7a, 0x37, 0x56, 0x4e, 0x22, 0x7e, 0x37, 0x55, 0xf0, 0xbe, + 0x37, 0x53, 0x33, 0x50, 0xa, 0x7e, 0x37, 0x53, 0x33, 0x9e, 0x37, 0x55, 0xf0, + 0x80, 0x2, 0x6d, 0x33, 0x7a, 0x37, 0x53, 0x33, 0x22, 0x7d, 0xf1, 0x7d, 0xe2, + 0x7d, 0xd3, 0x7e, 0x8, 0x2e, 0xb4, 0x12, 0x97, 0xed, 0x12, 0xc0, 0xb8, 0x7e, + 0x73, 0x68, 0xa6, 0x7a, 0x73, 0x2e, 0xb4, 0x7d, 0x3d, 0x7a, 0x37, 0x2e, + 0xb8, 0x7e, 0x8, 0x2e, 0xb4, 0x7d, 0x3e, 0x7d, 0x2f, 0x2, 0xc0, 0x61, 0x7f, + 0x20, 0xa9, 0xd6, 0xcb, 0x69, 0x12, 0x0, 0x4, 0x7e, 0x7, 0x56, 0xba, 0x59, + 0x10, 0x0, 0x4, 0x69, 0x12, 0x0, 0x8, 0x7e, 0x7, 0x56, 0xba, 0x59, 0x10, + 0x0, 0x8, 0x7e, 0x2b, 0x30, 0x7c, 0x3, 0x6c, 0x11, 0x29, 0x32, 0x0, 0x1, + 0xa, 0x13, 0x2d, 0x10, 0x7e, 0x7, 0x56, 0xba, 0x59, 0x10, 0x0, 0xc, 0x12, + 0xc0, 0xaf, 0x12, 0x57, 0xe3, 0x6d, 0x22, 0x12, 0x55, 0x27, 0x7e, 0x34, + 0x80, 0x40, 0x12, 0x54, 0x57, 0x49, 0x33, 0x0, 0x3a, 0xa9, 0xc6, 0xcb, 0x22, + 0x7e, 0x17, 0x56, 0xba, 0x59, 0x21, 0x0, 0xe, 0x22, 0x7e, 0x73, 0x68, 0xa7, + 0x7a, 0x73, 0x2e, 0xb5, 0x22, 0x6c, 0xaa, 0x80, 0x9, 0xe4, 0xa, 0x4a, 0x19, + 0xb4, 0x65, 0xd8, 0xb, 0xa0, 0x90, 0xd, 0xf, 0xe4, 0x93, 0xc4, 0x23, 0x54, + 0x1f, 0xa, 0x2b, 0xb, 0x24, 0xa, 0x3a, 0xbd, 0x32, 0x48, 0xe4, 0x12, 0x9f, + 0xad, 0x6d, 0x33, 0x7a, 0x37, 0x66, 0xec, 0x7a, 0x37, 0x66, 0xee, 0x7a, + 0x37, 0x66, 0xf0, 0x7a, 0x37, 0x66, 0xf4, 0x7e, 0xd4, 0x2e, 0x79, 0x1e, + 0xd4, 0x3e, 0xd4, 0x6d, 0xcc, 0x7e, 0x1f, 0x2d, 0x2e, 0x7a, 0x37, 0x2e, + 0xb9, 0x7d, 0x3d, 0x7a, 0x37, 0x2e, 0xbd, 0x7e, 0x34, 0x2d, 0x82, 0x7a, + 0x37, 0x2e, 0xbb, 0x7e, 0x73, 0x68, 0xa6, 0x7a, 0x73, 0x2e, 0xb6, 0x12, + 0xc0, 0xb8, 0x7e, 0x37, 0x68, 0x89, 0x7a, 0x37, 0x2e, 0xbf, 0x7e, 0x37, + 0x68, 0x8b, 0x7a, 0x37, 0x2e, 0xc1, 0x7e, 0x37, 0x68, 0x93, 0x7a, 0x37, + 0x2e, 0xc3, 0x7e, 0x37, 0x68, 0x95, 0x7a, 0x37, 0x2e, 0xc5, 0x12, 0xc2, + 0x1e, 0x1b, 0x34, 0x7a, 0x73, 0x2e, 0xb7, 0x7e, 0x73, 0x56, 0xc1, 0x7a, + 0x73, 0x2e, 0xb8, 0x7e, 0x8, 0x2e, 0xb5, 0x7e, 0x18, 0x2e, 0xc7, 0x12, 0x56, + 0xd3, 0x7e, 0x73, 0x2e, 0xc7, 0x7a, 0x73, 0x66, 0xea, 0x7e, 0x73, 0x2e, + 0xc8, 0x7a, 0x73, 0x66, 0xeb, 0x7e, 0x37, 0x2e, 0xc9, 0x7a, 0x37, 0x66, + 0xec, 0x7e, 0x37, 0x2e, 0xcb, 0x7a, 0x37, 0x66, 0xee, 0x7e, 0x37, 0x2e, + 0xd1, 0x7a, 0x37, 0x66, 0xf0, 0x7e, 0x37, 0x2e, 0xd3, 0x7d, 0x23, 0x7a, + 0x53, 0x66, 0xf2, 0xa, 0x36, 0x7a, 0x73, 0x66, 0xf3, 0x7e, 0x37, 0x2e, 0xcd, + 0x7a, 0x37, 0x66, 0xf4, 0x7e, 0x37, 0x2e, 0xcf, 0x7d, 0x23, 0x7a, 0x53, + 0x66, 0xf6, 0xa, 0x36, 0x7a, 0x73, 0x66, 0xf7, 0x6c, 0xaa, 0x80, 0x3c, 0x7c, + 0xba, 0xc4, 0x23, 0x54, 0x1f, 0x7c, 0x7b, 0x7c, 0xba, 0x54, 0x7, 0x7e, 0x44, + 0x0, 0x1, 0x60, 0x5, 0x3e, 0x44, 0x14, 0x78, 0xfb, 0x7c, 0x69, 0xa, 0x27, + 0x12, 0x9f, 0x8c, 0x4c, 0xb6, 0x7a, 0x29, 0xb0, 0x7e, 0x50, 0x2, 0xac, 0x5a, + 0x49, 0x12, 0x2d, 0x82, 0xa, 0x2, 0x7c, 0xb1, 0x19, 0xb2, 0x65, 0x60, 0x7c, + 0xb3, 0x19, 0xb2, 0x65, 0x61, 0xb, 0xa0, 0x7e, 0xb3, 0x66, 0xea, 0xbc, 0xba, + 0x38, 0xbc, 0x6c, 0xaa, 0x80, 0x1c, 0x7e, 0x90, 0x2, 0xac, 0x9a, 0x7f, 0x16, + 0x2d, 0x34, 0xb, 0x1a, 0x30, 0xa, 0x26, 0x7c, 0xb5, 0x19, 0xb4, 0x65, 0x9c, + 0x7c, 0xb7, 0x19, 0xb4, 0x65, 0x9d, 0xb, 0xa0, 0x7e, 0xb3, 0x66, 0xeb, 0xbc, + 0xba, 0x38, 0xdc, 0x22, 0x90, 0xd, 0xf, 0x93, 0xa, 0x3b, 0x22, 0xca, 0x3b, + 0x7c, 0xfb, 0xc2, 0x2, 0xc2, 0x3, 0xc2, 0x4, 0xd2, 0x5, 0x7e, 0x94, 0x0, + 0x51, 0x7e, 0xe3, 0x66, 0xea, 0xe4, 0x7a, 0xb3, 0x52, 0xb2, 0x7a, 0xb3, + 0x52, 0xb3, 0x7a, 0xb3, 0x52, 0x74, 0x7a, 0xb3, 0x52, 0xf4, 0x7e, 0x8, 0x52, + 0xb4, 0x12, 0xc2, 0x1e, 0xe4, 0x12, 0x0, 0x2e, 0x12, 0xc2, 0x1e, 0x3e, 0x34, + 0x7e, 0x8, 0x52, 0x75, 0xe4, 0x12, 0x0, 0x2e, 0xbe, 0xe0, 0x2, 0x50, 0x2, + 0x81, 0xfe, 0x6c, 0xdd, 0x81, 0xf8, 0x74, 0x2, 0x7c, 0x7d, 0xac, 0x7b, 0x12, + 0xa7, 0xa1, 0x4c, 0xdd, 0x68, 0x8, 0xa, 0x8d, 0x9, 0xb8, 0x52, 0xb4, 0x70, + 0xa, 0xa, 0x3d, 0xb, 0x34, 0xa, 0x8d, 0x19, 0x78, 0x52, 0xb4, 0xa, 0x5d, + 0xb, 0x54, 0xf5, 0x27, 0x81, 0xef, 0x7e, 0xa1, 0x27, 0x74, 0x2, 0x7c, 0x7a, + 0xac, 0x7b, 0x9, 0xa3, 0x65, 0x60, 0x7a, 0xa1, 0x2b, 0x9, 0xb3, 0x65, 0x61, + 0xf5, 0x2c, 0xa, 0x2a, 0xe5, 0x29, 0xa, 0xb, 0x7d, 0x30, 0x12, 0x37, 0x98, + 0x8, 0x6, 0x7d, 0x50, 0x9d, 0x52, 0x80, 0x4, 0x6d, 0x55, 0x9d, 0x53, 0xf5, + 0x2d, 0xe5, 0x2c, 0xa, 0x2b, 0xe5, 0x2a, 0xa, 0xb, 0x7d, 0x30, 0x12, 0x37, + 0x98, 0x8, 0x6, 0x7d, 0x80, 0x9d, 0x82, 0x80, 0x4, 0x6d, 0x88, 0x9d, 0x83, + 0x7d, 0x38, 0x7c, 0xc7, 0xe5, 0x2d, 0xbe, 0xb0, 0x6, 0x40, 0x2, 0x81, 0xed, + 0xbe, 0xc0, 0x6, 0x40, 0x2, 0x81, 0xed, 0xe5, 0x29, 0x7e, 0x71, 0x2a, 0x12, + 0x36, 0x62, 0x7a, 0x35, 0x2f, 0xe5, 0x2b, 0x7e, 0x71, 0x2c, 0x12, 0x36, + 0x62, 0x7d, 0x83, 0x7e, 0x25, 0x2f, 0xbd, 0x28, 0x8, 0x4, 0x7d, 0x38, 0x80, + 0x3, 0x7e, 0x35, 0x2f, 0x7a, 0x35, 0x33, 0xbd, 0x28, 0x58, 0x4, 0x7d, 0x38, + 0x80, 0x3, 0x7e, 0x35, 0x2f, 0x7a, 0x35, 0x35, 0x7e, 0x35, 0x33, 0xe, 0x34, + 0x7a, 0x35, 0x31, 0x75, 0x2e, 0x0, 0xe5, 0x2d, 0xbe, 0xb0, 0x1, 0x38, 0x21, + 0xbe, 0xc0, 0x1, 0x38, 0x1c, 0x7c, 0xbf, 0x30, 0xe0, 0x17, 0x7e, 0xb3, 0x52, + 0x74, 0x4, 0x7a, 0xb3, 0x52, 0x74, 0x75, 0x2e, 0x1, 0x7e, 0xb3, 0x52, 0xb2, + 0x4, 0x7a, 0xb3, 0x52, 0xb2, 0x81, 0x91, 0xe5, 0x2d, 0xbe, 0xb0, 0x1, 0x38, + 0x7, 0xbe, 0xc0, 0x1, 0x38, 0x2, 0x81, 0x91, 0xe5, 0x2d, 0xbe, 0xb0, 0x6, + 0x40, 0x2, 0x81, 0x91, 0xbe, 0xc0, 0x6, 0x40, 0x2, 0x81, 0x91, 0x7c, 0xbf, + 0x20, 0xe1, 0x2, 0x81, 0x91, 0xc2, 0x3, 0xe5, 0x2d, 0xbe, 0xb0, 0x2, 0x28, + 0x5, 0xbe, 0xc0, 0x2, 0x38, 0x2, 0xd2, 0x3, 0x12, 0xc5, 0x17, 0x12, 0xd8, + 0x24, 0x12, 0xc7, 0x12, 0x7a, 0xd, 0x3d, 0x7d, 0x38, 0x2e, 0x35, 0x2f, 0x12, + 0x9f, 0x85, 0x7a, 0x35, 0x37, 0xc2, 0x2, 0xbe, 0x8, 0x7f, 0xff, 0x78, 0x5, + 0x9f, 0x11, 0x7a, 0x1d, 0x3d, 0x7e, 0x35, 0x37, 0x7a, 0x35, 0x46, 0x12, + 0xc5, 0x17, 0x7e, 0xd, 0x3d, 0x12, 0xd7, 0xbd, 0x92, 0x4, 0x12, 0xdc, 0x1f, + 0x92, 0x1, 0x7e, 0x35, 0x35, 0x12, 0xc5, 0x4, 0x20, 0x1, 0x1a, 0xe5, 0x2d, + 0xbe, 0xb0, 0x4, 0x38, 0x13, 0xbe, 0xc0, 0x4, 0x38, 0xe, 0xa, 0x2c, 0xe5, + 0x2d, 0xa, 0x3b, 0x12, 0xc5, 0x10, 0x18, 0x3, 0x12, 0xc5, 0x1, 0x85, 0x2a, + 0x46, 0x85, 0x2b, 0x47, 0x85, 0x2c, 0x48, 0x7e, 0x8, 0x0, 0x41, 0x7e, 0x18, + 0x0, 0x43, 0xe5, 0x29, 0x12, 0xc7, 0x4c, 0xe5, 0x2d, 0xa, 0x4b, 0xbe, 0x45, + 0x43, 0x8, 0x7, 0xa, 0x3c, 0xbe, 0x35, 0x43, 0x18, 0x8, 0x12, 0xc5, 0xc, + 0x18, 0x3, 0x7e, 0x95, 0x41, 0x7e, 0x5, 0x43, 0xbe, 0x4, 0x0, 0x3, 0x78, + 0x5, 0x7e, 0x35, 0x35, 0x80, 0x14, 0xbe, 0x4, 0x0, 0x4, 0x78, 0x5, 0x7e, + 0x35, 0x37, 0x80, 0x9, 0xbe, 0x4, 0x0, 0x5, 0x78, 0x6, 0x7e, 0x35, 0x33, + 0x12, 0xc5, 0x4, 0x7e, 0xb3, 0x54, 0x3e, 0xb4, 0x1, 0x4, 0x7e, 0x94, 0x0, + 0x3c, 0x7e, 0xb3, 0x68, 0x9e, 0x60, 0x18, 0x12, 0xc5, 0x1, 0xe5, 0x2d, 0xbe, + 0xb0, 0x2, 0x38, 0xe, 0xbe, 0xc0, 0x2, 0x38, 0x9, 0x12, 0xc5, 0xc, 0x18, + 0x4, 0x7e, 0x94, 0x0, 0x32, 0x7d, 0x19, 0x1a, 0x2, 0x1a, 0x0, 0x7e, 0x1d, + 0x39, 0x12, 0x2a, 0x20, 0x7e, 0x8, 0x0, 0x64, 0x12, 0x2a, 0x8d, 0x7f, 0x1, + 0x7e, 0x1d, 0x3d, 0xbf, 0x10, 0x8, 0x2, 0xd2, 0x2, 0x30, 0x4, 0x5, 0x20, + 0x3, 0x2, 0xc2, 0x2, 0x30, 0x2, 0x3, 0x75, 0x2e, 0x2, 0xe5, 0x2e, 0xbe, + 0xb0, 0x0, 0x28, 0x55, 0xe5, 0x27, 0xa, 0x4b, 0x9, 0x14, 0x52, 0xb4, 0xa5, + 0xb9, 0x0, 0xc, 0xa, 0x3d, 0x9, 0xa3, 0x52, 0xb4, 0x19, 0xa4, 0x52, 0xb4, + 0x80, 0x3d, 0xa, 0x3d, 0x9, 0x53, 0x52, 0xb4, 0x7a, 0x51, 0x45, 0xbc, 0x51, + 0x28, 0x3, 0x7a, 0x11, 0x45, 0x75, 0x28, 0x0, 0x80, 0x23, 0x9, 0x64, 0x52, + 0xb4, 0xe5, 0x28, 0xa, 0xb, 0x9, 0x30, 0x52, 0xb4, 0xbc, 0x36, 0x68, 0xa, + 0xa, 0x3d, 0x9, 0x63, 0x52, 0xb4, 0xbc, 0x36, 0x78, 0x7, 0x7e, 0xa1, 0x45, + 0x19, 0xa0, 0x52, 0xb4, 0x5, 0x28, 0xbe, 0xe1, 0x28, 0x38, 0xd8, 0x5, 0x27, + 0xbe, 0xe1, 0x27, 0x28, 0x2, 0x41, 0x94, 0xb, 0xd0, 0xbc, 0xed, 0x28, 0x2, + 0x41, 0x6d, 0xda, 0x3b, 0x22, 0x7e, 0x35, 0x33, 0x1a, 0x26, 0x1a, 0x24, + 0x7a, 0x1d, 0x39, 0x22, 0xa, 0x2c, 0x7d, 0x34, 0x2d, 0x32, 0xbe, 0x34, 0x0, + 0x6, 0x22, 0xe5, 0x29, 0x7e, 0x71, 0x2a, 0x7e, 0x61, 0x2b, 0x7e, 0x51, 0x2c, + 0x22, 0xca, 0xd8, 0xca, 0x79, 0xc2, 0x0, 0x7e, 0xe0, 0x3, 0xe4, 0x7a, 0xb3, + 0x52, 0xb1, 0x7e, 0xd3, 0x68, 0x7a, 0x12, 0xda, 0xe9, 0x7e, 0xf3, 0x66, + 0xea, 0xbe, 0xf0, 0x1, 0x38, 0x2, 0xa1, 0xed, 0x7c, 0xbe, 0x12, 0xc2, 0x25, + 0x4c, 0xdd, 0x78, 0x4, 0xc2, 0x0, 0x80, 0x5f, 0xbe, 0xd0, 0x1, 0x28, 0xd, + 0x7e, 0x73, 0x52, 0xf5, 0xbe, 0x70, 0x6, 0x28, 0x4, 0xc2, 0x0, 0x80, 0x4d, + 0xc2, 0x0, 0x7e, 0x53, 0x66, 0xea, 0xbc, 0x5d, 0x78, 0x11, 0x12, 0xc7, 0x2c, + 0x50, 0x5, 0x7e, 0xe0, 0x3, 0x80, 0x3, 0x7e, 0xe0, 0x1, 0xd2, 0x0, 0x80, + 0x32, 0x7e, 0x43, 0x52, 0xb2, 0xa, 0x34, 0xa, 0x25, 0x7d, 0x12, 0x9d, 0x13, + 0xb, 0x14, 0xa, 0x3d, 0xbd, 0x31, 0x78, 0x7, 0x7e, 0xe0, 0x1, 0xd2, 0x0, + 0x80, 0x17, 0x7e, 0x73, 0x52, 0x74, 0xa, 0x37, 0x9d, 0x23, 0xb, 0x24, 0x7e, + 0x73, 0x52, 0xf6, 0xbd, 0x32, 0x78, 0x5, 0x7e, 0xe0, 0x3, 0xd2, 0x0, 0x30, + 0x0, 0x5, 0x7c, 0xbe, 0x12, 0xc2, 0x25, 0x7e, 0x8, 0x52, 0xb4, 0x12, 0xc5, + 0xfc, 0x7a, 0xb3, 0x52, 0xb1, 0x7e, 0xa3, 0x52, 0xb1, 0x7a, 0xa3, 0x66, + 0xea, 0x74, 0x2, 0xa4, 0xca, 0x59, 0x7e, 0x18, 0x52, 0x75, 0x7e, 0x8, 0x65, + 0x60, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x7e, 0x73, 0x66, 0xea, 0x7a, 0x73, 0x52, + 0xf6, 0x12, 0xcf, 0x7b, 0x7a, 0xb3, 0x52, 0xf5, 0x80, 0xa, 0x74, 0x64, 0x7a, + 0xb3, 0x52, 0xf5, 0x7a, 0xf3, 0x52, 0xf6, 0xda, 0x79, 0xda, 0xd8, 0x22, + 0xca, 0x79, 0x7f, 0x70, 0x75, 0x2a, 0xff, 0x7e, 0xb3, 0x66, 0xea, 0xf5, + 0x2b, 0x6c, 0x99, 0x6c, 0xff, 0x6c, 0xee, 0x80, 0xd, 0xa, 0x1e, 0x12, 0xc7, + 0xa, 0xbc, 0x7f, 0x40, 0x2, 0x7c, 0xf7, 0xb, 0xe0, 0xe5, 0x2b, 0xbc, 0xbe, + 0x38, 0xed, 0x7e, 0xe0, 0x1, 0xc1, 0xde, 0x75, 0x2c, 0x0, 0x6d, 0xdd, 0x75, + 0x27, 0x0, 0xc1, 0xba, 0x12, 0xc7, 0x19, 0x9, 0xb1, 0x65, 0x60, 0xf5, 0x28, + 0x9, 0xb1, 0x65, 0x61, 0xf5, 0x29, 0xe5, 0x27, 0xa, 0x1b, 0x12, 0xc7, 0xa, + 0xbc, 0x7e, 0x78, 0x6b, 0x5, 0x2c, 0xe5, 0x2c, 0xb4, 0x1, 0x3, 0x12, 0xc7, + 0x3, 0xbe, 0xf0, 0x1, 0x78, 0x4e, 0x7e, 0xa3, 0x52, 0xf1, 0xbe, 0xa0, 0xff, + 0x68, 0x45, 0x7e, 0xb3, 0x52, 0xf0, 0xa, 0x3b, 0xe5, 0x29, 0xa, 0xcb, 0x7d, + 0x1c, 0x9d, 0x13, 0xbe, 0x14, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xc3, 0x80, 0x4, + 0x6d, 0xcc, 0x9d, 0xc1, 0xa, 0x3a, 0xe5, 0x28, 0xa, 0x1b, 0x7d, 0x51, 0x9d, + 0x53, 0xbe, 0x54, 0x0, 0x0, 0x8, 0x4, 0x9d, 0x13, 0x80, 0x4, 0x6d, 0x11, + 0x9d, 0x15, 0x2d, 0x1c, 0x7c, 0x83, 0xbe, 0x81, 0x2a, 0x50, 0x16, 0x12, + 0xc7, 0x3, 0x7a, 0x81, 0x2a, 0x80, 0xe, 0x12, 0xa7, 0x81, 0x7d, 0xc3, 0xbd, + 0xdc, 0x58, 0x5, 0x7d, 0xdc, 0x12, 0xc7, 0x3, 0x5, 0x27, 0xe5, 0x2b, 0xbe, + 0xb1, 0x27, 0x28, 0x2, 0xc1, 0x33, 0xe5, 0x2c, 0xbe, 0xb0, 0x0, 0x28, 0x12, + 0x74, 0x2, 0xac, 0xb9, 0x19, 0x5, 0x52, 0x75, 0x74, 0x2, 0xac, 0xb9, 0x19, + 0x15, 0x52, 0x76, 0xb, 0x90, 0xb, 0xe0, 0xbc, 0xfe, 0x40, 0x2, 0xc1, 0x29, + 0xbe, 0x90, 0x1, 0x78, 0x12, 0x7e, 0x83, 0x52, 0x75, 0x7a, 0x83, 0x52, 0xf1, + 0x7e, 0x83, 0x52, 0x76, 0x7a, 0x83, 0x52, 0xf0, 0x80, 0x3, 0x12, 0xc7, 0x21, + 0x7c, 0xb9, 0xda, 0x79, 0x22, 0x7e, 0x1, 0x28, 0x7e, 0x11, 0x29, 0x22, 0x7f, + 0x17, 0x2d, 0x31, 0x7e, 0x1b, 0x70, 0x22, 0x7d, 0x13, 0x1a, 0x2, 0x1a, 0x0, + 0x22, 0x7e, 0x31, 0x27, 0x74, 0x2, 0xac, 0x3b, 0x22, 0x74, 0xff, 0x7a, 0xb3, + 0x52, 0xf1, 0x7a, 0xb3, 0x52, 0xf0, 0x22, 0x6c, 0xaa, 0x80, 0x12, 0x7e, + 0x70, 0x9, 0xac, 0x7a, 0x9, 0xb3, 0x65, 0xe2, 0xbe, 0xb0, 0x10, 0x28, 0x2, + 0xd3, 0x22, 0xb, 0xa0, 0x7e, 0xb3, 0x67, 0x0, 0xbc, 0xba, 0x38, 0xe6, 0xc3, + 0x22, 0x7c, 0x9b, 0x7f, 0x71, 0x7f, 0x60, 0x7e, 0x34, 0x2d, 0x6c, 0x7e, + 0x24, 0x0, 0xff, 0x7e, 0x14, 0x2e, 0x77, 0x74, 0x30, 0x12, 0x2a, 0xe2, 0x7e, + 0x58, 0x2e, 0x77, 0x7c, 0xb9, 0x7e, 0x71, 0x46, 0x12, 0x36, 0x62, 0x7d, 0x3, + 0xe5, 0x47, 0x7e, 0x71, 0x48, 0x12, 0x36, 0x62, 0x2d, 0x30, 0xe, 0x34, 0x7f, + 0x5, 0x7e, 0x50, 0x8, 0xb, 0xa, 0x50, 0xbd, 0x53, 0x58, 0xf, 0x69, 0x30, + 0x0, 0x2, 0x1b, 0x6a, 0x30, 0x69, 0x30, 0x0, 0x4, 0x1b, 0x7a, 0x30, 0x22, + 0x2e, 0x14, 0x0, 0x6, 0x1b, 0x50, 0x78, 0xe2, 0x22, 0xca, 0xf8, 0xd2, 0x7, + 0x6c, 0xff, 0x80, 0x13, 0x7c, 0xbf, 0x7e, 0x70, 0x1, 0x12, 0xa6, 0xa3, 0xbe, + 0x18, 0x2, 0xee, 0x58, 0x3, 0xc3, 0x80, 0xc, 0xb, 0xf0, 0x7e, 0x33, 0x66, + 0xea, 0xbc, 0x3f, 0x38, 0xe5, 0xa2, 0x7, 0xda, 0xf8, 0x22, 0xca, 0xf8, 0xc2, + 0x4, 0xc2, 0x5, 0xc2, 0x6, 0x7e, 0xb3, 0x66, 0xea, 0x70, 0x3, 0x12, 0xc9, + 0x5f, 0x7e, 0x34, 0x2, 0x58, 0x12, 0xcf, 0xfc, 0x7a, 0xb3, 0x55, 0x73, 0x7e, + 0x34, 0x0, 0x5, 0x12, 0xcb, 0x80, 0x92, 0x2, 0x7e, 0xb3, 0x68, 0x9e, 0x70, + 0x63, 0x7e, 0xa3, 0x55, 0x73, 0xbe, 0xa0, 0x0, 0x38, 0x3, 0x2, 0xc8, 0x9c, + 0xbe, 0xa0, 0x4, 0x28, 0x2, 0x1, 0x9c, 0xd2, 0x1, 0x20, 0x1, 0x2, 0x1, 0x9c, + 0xbe, 0xa0, 0x4, 0x78, 0x5, 0x7e, 0xf0, 0x2, 0x80, 0x17, 0xbe, 0xa0, 0x3, + 0x78, 0x5, 0x7e, 0xf0, 0x3, 0x80, 0xd, 0xbe, 0xa0, 0x2, 0x78, 0x5, 0x7e, + 0xf0, 0x5, 0x80, 0x3, 0x7e, 0xf0, 0x8, 0x7c, 0xbf, 0x12, 0xc8, 0xa6, 0x92, + 0x3, 0x12, 0xc7, 0xa1, 0x92, 0x5, 0xd2, 0x6, 0x30, 0x3, 0x9, 0x30, 0x5, 0x6, + 0x30, 0x6, 0x3, 0x12, 0xc8, 0x9f, 0x30, 0x2, 0x50, 0x30, 0x5, 0x4d, 0x30, + 0x6, 0x4a, 0x12, 0xc8, 0x9f, 0x80, 0x45, 0x7e, 0x73, 0x55, 0x73, 0xbe, 0x70, + 0x0, 0x28, 0x7, 0x12, 0xc8, 0x9f, 0x6d, 0x33, 0x80, 0x12, 0x7e, 0xb3, 0x66, + 0xea, 0x70, 0x12, 0x74, 0x1, 0x7a, 0xb3, 0x68, 0x9e, 0x7e, 0x37, 0x55, 0x74, + 0xb, 0x34, 0x7a, 0x37, 0x55, 0x74, 0x80, 0x2, 0xd2, 0x4, 0x20, 0x4, 0xd, + 0x7e, 0x37, 0x55, 0x74, 0xbe, 0x34, 0xe, 0x10, 0x50, 0x3, 0x30, 0x0, 0xb, + 0xe4, 0x7a, 0xb3, 0x68, 0x9e, 0x6d, 0x33, 0x7a, 0x37, 0x55, 0x74, 0xda, + 0xf8, 0x22, 0x74, 0x2, 0x7a, 0xb3, 0x68, 0x9e, 0x22, 0x7c, 0x9b, 0x7e, 0x73, + 0x55, 0x77, 0xa5, 0xbf, 0x0, 0xe, 0x7e, 0x63, 0x66, 0xf2, 0xa, 0x27, 0x19, + 0x62, 0x55, 0x9c, 0x74, 0x1, 0x80, 0x20, 0x7e, 0xb3, 0x66, 0xf2, 0x7e, 0x8, + 0x55, 0x9c, 0x12, 0xc9, 0x44, 0x40, 0x17, 0x7e, 0x83, 0x66, 0xf2, 0x7e, + 0x73, 0x55, 0x77, 0xa, 0x57, 0x19, 0x85, 0x55, 0x9c, 0x7e, 0xb3, 0x55, 0x77, + 0x4, 0x7a, 0xb3, 0x55, 0x77, 0x7e, 0x73, 0x55, 0x76, 0xa5, 0xbf, 0x0, 0xe, + 0x7e, 0x63, 0x66, 0xf3, 0xa, 0x27, 0x19, 0x62, 0x55, 0x78, 0x74, 0x1, 0x80, + 0x20, 0x7e, 0xb3, 0x66, 0xf3, 0x7e, 0x8, 0x55, 0x78, 0x12, 0xc9, 0x44, 0x40, + 0x17, 0x7e, 0x83, 0x66, 0xf3, 0x7e, 0x73, 0x55, 0x76, 0xa, 0x57, 0x19, 0x85, + 0x55, 0x78, 0x7e, 0xb3, 0x55, 0x76, 0x4, 0x7a, 0xb3, 0x55, 0x76, 0x7e, 0xa3, + 0x55, 0x77, 0xbc, 0xa9, 0x50, 0x19, 0x7e, 0x73, 0x55, 0x76, 0xbc, 0x79, + 0x50, 0x11, 0x7e, 0x50, 0x3, 0xac, 0x59, 0xe, 0x24, 0xa, 0x17, 0xa, 0x3a, + 0x2d, 0x31, 0xbd, 0x32, 0x48, 0x5, 0x12, 0xc9, 0x5f, 0xd3, 0x22, 0xc3, 0x22, + 0x6c, 0x66, 0x80, 0x11, 0xa, 0x26, 0x7f, 0x70, 0x2d, 0xf2, 0x7e, 0x7b, 0xa0, + 0xbc, 0xab, 0x78, 0x2, 0xd3, 0x22, 0xb, 0x60, 0xbc, 0x76, 0x38, 0xeb, 0xc3, + 0x22, 0xe4, 0x7a, 0xb3, 0x55, 0x77, 0x7a, 0xb3, 0x55, 0x76, 0x7e, 0x8, 0x55, + 0x9c, 0x7e, 0x34, 0x0, 0x12, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x55, 0x78, 0x7e, + 0x34, 0x0, 0x24, 0x2, 0x0, 0x2e, 0xca, 0x79, 0x7e, 0xf4, 0x2d, 0x9c, 0x7e, + 0xe4, 0x0, 0xff, 0x69, 0x37, 0x0, 0x4, 0x69, 0x27, 0x0, 0x2, 0xb, 0x7a, + 0x10, 0x7a, 0x1f, 0x2e, 0x79, 0x7a, 0x17, 0x2e, 0x77, 0x7e, 0xb3, 0x68, + 0x9d, 0x70, 0x2, 0x41, 0x41, 0x7e, 0xb3, 0x68, 0x9e, 0x70, 0x2, 0x41, 0x41, + 0x7e, 0xb3, 0x66, 0xea, 0xbe, 0xb0, 0x1, 0x78, 0x2, 0x41, 0x41, 0x7e, 0x0, + 0x8, 0xe4, 0x7a, 0xb3, 0x55, 0xae, 0x7e, 0xb3, 0x56, 0xb6, 0xbe, 0xb0, 0xff, + 0x68, 0x24, 0x6c, 0x11, 0x7e, 0x30, 0x2, 0xac, 0x31, 0x9, 0x71, 0x2e, 0x77, + 0xbe, 0x73, 0x56, 0xb6, 0x38, 0xc, 0x74, 0x1, 0x7a, 0xb3, 0x55, 0xae, 0x9, + 0x1, 0x2e, 0x78, 0x80, 0x7, 0xb, 0x10, 0xbe, 0x10, 0x3, 0x40, 0xde, 0xa, + 0x30, 0x7e, 0xf7, 0x66, 0xf0, 0xad, 0x3f, 0x7e, 0x14, 0x0, 0x14, 0x7d, 0x21, + 0x12, 0x29, 0xee, 0x7d, 0x53, 0x7e, 0xe7, 0x68, 0x87, 0xbd, 0xe5, 0x50, 0x4, + 0x7a, 0x57, 0x68, 0x87, 0x7e, 0x34, 0x0, 0x7, 0xad, 0x3f, 0x7d, 0x21, 0x12, + 0x29, 0xee, 0x7d, 0x43, 0x6c, 0x11, 0x80, 0x1e, 0x74, 0x2, 0xac, 0xb1, 0x9, + 0xf5, 0x65, 0x60, 0x9, 0xe5, 0x65, 0x61, 0x7c, 0xbf, 0x7c, 0x7e, 0x12, 0x36, + 0x62, 0x7d, 0xf3, 0xbd, 0x4f, 0x8, 0x3, 0x12, 0x9d, 0x17, 0xb, 0x10, 0x7e, + 0x73, 0x66, 0xea, 0xbc, 0x71, 0x38, 0xda, 0xda, 0x79, 0x22, 0xb4, 0x1, 0x2, + 0x80, 0x2, 0x41, 0xcb, 0x7e, 0xb3, 0x53, 0xf9, 0xb4, 0x1, 0x2f, 0x12, 0xca, + 0xd5, 0x7e, 0x34, 0x0, 0xc8, 0x7a, 0x37, 0x68, 0x87, 0x7a, 0x37, 0x68, 0x89, + 0x7e, 0x34, 0xff, 0x38, 0x12, 0xca, 0xcc, 0x7a, 0x37, 0x68, 0x93, 0x7e, + 0x24, 0xfe, 0xd4, 0x7a, 0x27, 0x68, 0x95, 0x7e, 0x24, 0x1, 0x2c, 0x7a, 0x27, + 0x68, 0x8d, 0x7a, 0x37, 0x68, 0x8f, 0x22, 0x12, 0xca, 0xd5, 0x7e, 0x34, + 0xff, 0x9c, 0x12, 0xca, 0xcc, 0x7a, 0x37, 0x68, 0x8d, 0x7a, 0x37, 0x68, + 0x8f, 0x7a, 0x37, 0x68, 0x93, 0x7e, 0x34, 0xfe, 0xd4, 0x7a, 0x37, 0x68, + 0x95, 0x7e, 0xb3, 0x68, 0x7a, 0x70, 0x16, 0x7e, 0x37, 0x55, 0x74, 0xbe, + 0x34, 0x0, 0x0, 0x28, 0x6, 0x7e, 0x34, 0x0, 0x78, 0x80, 0xa, 0x7e, 0x34, + 0x0, 0xaa, 0x80, 0x4, 0x7e, 0x34, 0x0, 0x64, 0x7a, 0x37, 0x68, 0x87, 0x7e, + 0x34, 0x0, 0x64, 0x7a, 0x37, 0x68, 0x89, 0x22, 0x7a, 0x37, 0x68, 0x8b, 0x7e, + 0x34, 0x1, 0x2c, 0x22, 0x90, 0xd, 0x10, 0xe4, 0x93, 0x7a, 0xb3, 0x68, 0x86, + 0x22, 0x7e, 0x34, 0x0, 0xaa, 0x7a, 0x37, 0x68, 0x87, 0x12, 0xca, 0xd5, 0x7e, + 0x34, 0x0, 0x64, 0x12, 0x4b, 0x68, 0x12, 0x4f, 0xb6, 0x7a, 0x73, 0x53, 0xef, + 0x22, 0x7e, 0xb3, 0x53, 0xf9, 0xb4, 0x1, 0x5, 0x12, 0xcb, 0x57, 0x80, 0x37, + 0x7e, 0xb3, 0x54, 0x3e, 0x60, 0x5, 0x12, 0x4f, 0xc9, 0x80, 0x2c, 0x7e, 0xb3, + 0x68, 0xa3, 0xb4, 0x1, 0x5, 0x12, 0xca, 0xdf, 0x80, 0x20, 0x12, 0x4f, 0x63, + 0x7e, 0xb3, 0x56, 0xbf, 0x70, 0x17, 0x7e, 0xb3, 0x68, 0xa3, 0x70, 0x11, + 0x7e, 0xb3, 0x68, 0x7a, 0x70, 0xb, 0x7e, 0x34, 0xd, 0x2c, 0x12, 0x32, 0xdf, + 0x7a, 0x37, 0x68, 0x87, 0x7e, 0x34, 0xd, 0x20, 0x12, 0x32, 0xdf, 0x12, 0xcb, + 0x4e, 0x12, 0x32, 0xdf, 0x7a, 0x37, 0x68, 0x8f, 0x22, 0x7a, 0x37, 0x68, + 0x8d, 0x7e, 0x34, 0xd, 0x22, 0x22, 0x7e, 0xb3, 0x66, 0xea, 0x70, 0x6, 0x7e, + 0x34, 0xd, 0x2c, 0x80, 0x4, 0x7e, 0x34, 0xd, 0x18, 0x12, 0x32, 0xdf, 0x2e, + 0x34, 0x0, 0x78, 0x12, 0x32, 0xce, 0x2e, 0x34, 0x0, 0x78, 0x12, 0x4b, 0x68, + 0x12, 0x4f, 0xb6, 0x7a, 0x73, 0x53, 0xef, 0x22, 0x7c, 0x3b, 0x7d, 0x23, + 0xc2, 0x7, 0x7e, 0x23, 0x55, 0xaf, 0xa, 0x42, 0x7e, 0xa3, 0x66, 0xf2, 0xa, + 0x3a, 0x12, 0xcc, 0x19, 0x8, 0x4, 0x9d, 0x34, 0x80, 0x4, 0x6d, 0x33, 0x9d, + 0x30, 0xbe, 0x34, 0x0, 0x1, 0x18, 0x5f, 0x7e, 0x23, 0x55, 0xb0, 0xa, 0x2, + 0x7e, 0xb3, 0x66, 0xf3, 0xa, 0x3b, 0x7d, 0x43, 0x9d, 0x40, 0xbe, 0x44, 0x0, + 0x0, 0x8, 0x4, 0x9d, 0x30, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x34, 0xbe, 0x34, + 0x0, 0x1, 0x18, 0x3b, 0x60, 0x39, 0x7e, 0xb3, 0x68, 0xa9, 0x14, 0xbe, 0xb3, + 0x66, 0xf3, 0x68, 0x2e, 0x4c, 0xaa, 0x68, 0x2a, 0x7e, 0xb3, 0x68, 0xa8, + 0x14, 0xbe, 0xb3, 0x66, 0xf2, 0x68, 0x1f, 0xbe, 0x30, 0x0, 0x28, 0x1a, 0x7e, + 0x37, 0x55, 0xb1, 0xb, 0x34, 0x7a, 0x37, 0x55, 0xb1, 0xbd, 0x32, 0x40, 0x12, + 0x6d, 0x33, 0x7a, 0x37, 0x55, 0xb1, 0xd2, 0x7, 0x80, 0x8, 0x80, 0x0, 0x6d, + 0x33, 0x7a, 0x37, 0x55, 0xb1, 0x7a, 0xa3, 0x55, 0xaf, 0x7e, 0x73, 0x66, + 0xf3, 0x7a, 0x73, 0x55, 0xb0, 0xa2, 0x7, 0x22, 0x7d, 0x3, 0x9d, 0x4, 0xbe, + 0x4, 0x0, 0x0, 0x22, 0xca, 0x3b, 0x7c, 0xd7, 0x7c, 0xcb, 0xc2, 0x0, 0x75, + 0x31, 0x0, 0x6d, 0x33, 0x7a, 0x35, 0x32, 0x7a, 0x35, 0x34, 0x7e, 0x74, 0x0, + 0xd, 0x7a, 0x35, 0x36, 0xa, 0x3d, 0x9, 0xb3, 0x38, 0x8b, 0x30, 0xe7, 0x3, + 0x12, 0xcd, 0x3c, 0x7c, 0xbc, 0x7c, 0x7d, 0x12, 0xd5, 0x9, 0xf5, 0x31, 0xb4, + 0x2, 0x7, 0x12, 0xcd, 0x3c, 0x3e, 0x74, 0x80, 0x2f, 0xe5, 0x31, 0x70, 0x29, + 0x12, 0xcd, 0x3c, 0x7e, 0x70, 0x9, 0xac, 0x7d, 0x9, 0xb3, 0x39, 0x50, 0x9, + 0x73, 0x39, 0x51, 0x12, 0x36, 0x62, 0x7a, 0x35, 0x36, 0x74, 0x2, 0xac, 0xbd, + 0x49, 0x35, 0x38, 0xdb, 0xe, 0x34, 0xbe, 0x35, 0x36, 0x8, 0x6, 0x1e, 0x74, + 0x80, 0x2, 0x1e, 0x74, 0x7e, 0x10, 0x9, 0xac, 0x1d, 0x49, 0x40, 0x38, 0xef, + 0x74, 0x9, 0xac, 0xbc, 0x49, 0x25, 0x67, 0x1b, 0x7d, 0x12, 0x9d, 0x14, 0xbe, + 0x14, 0x0, 0x0, 0x8, 0x6, 0x7d, 0x32, 0x9d, 0x34, 0x80, 0x4, 0x6d, 0x33, + 0x9d, 0x31, 0x7a, 0x35, 0x32, 0x74, 0x9, 0xac, 0xbd, 0x49, 0x45, 0x38, 0xf1, + 0x74, 0x9, 0xac, 0xbc, 0x49, 0x35, 0x67, 0x1d, 0x12, 0xcc, 0x19, 0x8, 0x6, + 0x7d, 0x13, 0x9d, 0x14, 0x80, 0x4, 0x6d, 0x11, 0x9d, 0x10, 0x2e, 0x15, 0x32, + 0x7a, 0x15, 0x32, 0x74, 0x9, 0xac, 0xbd, 0x49, 0x5, 0x39, 0x49, 0x12, 0xcf, + 0x72, 0x8, 0x4, 0x9d, 0x20, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x21, 0x7a, 0x25, + 0x34, 0x74, 0x9, 0xac, 0xbd, 0x49, 0x15, 0x39, 0x4b, 0x12, 0xf1, 0xae, 0x8, + 0x4, 0x9d, 0x31, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x32, 0x2e, 0x35, 0x34, 0x7a, + 0x35, 0x34, 0xbe, 0x75, 0x32, 0x50, 0x4, 0xd2, 0x0, 0x80, 0xb, 0x7d, 0x37, + 0x3e, 0x34, 0xbe, 0x35, 0x34, 0x50, 0x2, 0xd2, 0x0, 0x7e, 0x35, 0x34, 0xbe, + 0x35, 0x32, 0x50, 0x2, 0xc2, 0x0, 0xe5, 0x31, 0x70, 0xb, 0x7e, 0x35, 0x32, + 0xbe, 0x34, 0x0, 0x41, 0x28, 0x2, 0xc2, 0x0, 0xa2, 0x0, 0xda, 0x3b, 0x22, + 0x3e, 0x74, 0x3e, 0x74, 0x3e, 0x74, 0x22, 0xca, 0xd8, 0xca, 0x79, 0x7c, + 0xe7, 0x7c, 0xdb, 0x6c, 0xff, 0xa, 0x3e, 0x9, 0xb3, 0x38, 0x95, 0xbe, 0xb0, + 0xff, 0x50, 0xa, 0x7d, 0x23, 0x2e, 0x24, 0x38, 0x95, 0x4, 0x7a, 0x29, 0xb0, + 0x74, 0x2, 0xac, 0xbe, 0x49, 0x25, 0x38, 0x9f, 0x4d, 0x22, 0x78, 0x13, 0x9, + 0x53, 0x38, 0x8b, 0xbe, 0x50, 0x0, 0x28, 0x3, 0x4e, 0xf0, 0x2, 0xe4, 0x19, + 0xb3, 0x38, 0x8b, 0x80, 0x52, 0x7c, 0xbd, 0x7c, 0x7e, 0x12, 0xcc, 0x22, + 0x50, 0xe, 0x4e, 0xf0, 0x2, 0xe4, 0xa, 0x3e, 0x19, 0xb3, 0x38, 0x8b, 0x6d, + 0x33, 0x80, 0x38, 0xa, 0x3e, 0x9, 0xb3, 0x38, 0x8b, 0x30, 0xe2, 0x11, 0x7c, + 0xbd, 0x7c, 0x7e, 0x12, 0x36, 0x73, 0x50, 0x8, 0x12, 0xcd, 0xfc, 0x44, 0x10, + 0x12, 0xce, 0x6, 0xa, 0x3e, 0x9, 0xb3, 0x38, 0x8b, 0x30, 0xe3, 0x18, 0x7c, + 0xbd, 0x7c, 0x7e, 0x12, 0xce, 0xaa, 0x50, 0xf, 0x12, 0xcd, 0xfc, 0x44, 0x20, + 0x7a, 0x39, 0xb0, 0x7e, 0x34, 0xff, 0xff, 0x12, 0xce, 0xd, 0x74, 0x2, 0xac, + 0xbe, 0x49, 0x35, 0x38, 0x9f, 0xbe, 0x34, 0x0, 0x0, 0x28, 0x14, 0x4e, 0xf0, + 0x1, 0x7c, 0xbd, 0x7c, 0x7e, 0x12, 0xce, 0xc4, 0x50, 0x8, 0x12, 0xcd, 0xfc, + 0x44, 0x80, 0x12, 0xce, 0x6, 0x7c, 0xbf, 0xda, 0x79, 0xda, 0xd8, 0x22, 0xa, + 0x3e, 0x2e, 0x34, 0x38, 0x8b, 0x7e, 0x39, 0xb0, 0x22, 0x7a, 0x39, 0xb0, + 0x7e, 0x34, 0xff, 0xff, 0x74, 0x2, 0xac, 0xbe, 0x59, 0x35, 0x38, 0x9f, 0x22, + 0xca, 0x3b, 0x7c, 0xe7, 0x7c, 0xdb, 0x6c, 0xff, 0x7c, 0xbd, 0x7c, 0x7e, + 0x12, 0xd2, 0xe5, 0x7c, 0xcb, 0x30, 0xe0, 0x9, 0x4e, 0xf0, 0x1, 0x7e, 0x34, + 0xb, 0xb8, 0x80, 0x35, 0x7c, 0xbc, 0x30, 0xe1, 0x20, 0x4e, 0xf0, 0x1, 0x7e, + 0x34, 0x0, 0x2, 0x12, 0xce, 0xd, 0x7c, 0xbd, 0x7c, 0x7e, 0x12, 0xd4, 0x7f, + 0x50, 0x20, 0x12, 0xce, 0x9, 0x12, 0xcd, 0xfc, 0x44, 0x80, 0x7a, 0x39, 0xb0, + 0x80, 0x13, 0x7c, 0xbc, 0x30, 0xe3, 0x9, 0x4e, 0xf0, 0x1, 0x7e, 0x34, 0x0, + 0xc, 0x80, 0x2, 0x6d, 0x33, 0x12, 0xce, 0xd, 0x7c, 0xbf, 0x30, 0xe0, 0x15, + 0xe4, 0xa, 0x3e, 0x19, 0xb3, 0x38, 0x95, 0x12, 0xd1, 0xc4, 0xac, 0x3e, 0x2e, + 0x14, 0x39, 0x49, 0x74, 0x9, 0x12, 0x2a, 0xc1, 0x6d, 0x33, 0x74, 0x2, 0xac, + 0xbe, 0x59, 0x35, 0x38, 0xb3, 0x7e, 0x70, 0x9, 0xac, 0x7d, 0x12, 0x36, 0x5a, + 0x74, 0x2, 0xac, 0xbe, 0x59, 0x35, 0x38, 0xdb, 0x6d, 0x33, 0x59, 0x35, 0x38, + 0xc7, 0x7c, 0xbf, 0xda, 0x3b, 0x22, 0x7c, 0x37, 0x7c, 0x2b, 0x7c, 0x73, + 0x12, 0xcf, 0x3d, 0x50, 0x2, 0xd3, 0x22, 0x7c, 0xb2, 0x7c, 0x73, 0x12, 0xce, + 0xc4, 0x50, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0x7c, 0xab, 0xc2, 0x0, 0x6c, 0x77, + 0x80, 0x5d, 0xbc, 0x7a, 0x68, 0x57, 0x7e, 0x10, 0x9, 0xac, 0x17, 0x9, 0x60, + 0x67, 0x1f, 0x12, 0xcf, 0x68, 0x70, 0x49, 0x12, 0x87, 0xf2, 0xb4, 0x2, 0x43, + 0x7e, 0x90, 0x9, 0xac, 0x96, 0x49, 0xf4, 0x38, 0xef, 0x49, 0x20, 0x67, 0x1b, + 0x12, 0xcf, 0x34, 0x8, 0x4, 0x9d, 0x2f, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x21, + 0xbe, 0x24, 0x0, 0xd, 0x28, 0x4, 0xd2, 0x0, 0x80, 0x29, 0x49, 0xf4, 0x38, + 0xf1, 0x49, 0x20, 0x67, 0x1d, 0x12, 0xcf, 0x34, 0x8, 0x4, 0x9d, 0x2f, 0x80, + 0x4, 0x6d, 0x22, 0x9d, 0x21, 0xbe, 0x24, 0x0, 0xd, 0x28, 0x4, 0xd2, 0x0, + 0x80, 0xa, 0xb, 0x70, 0x7e, 0xb3, 0x68, 0x79, 0xbc, 0xb7, 0x38, 0x9b, 0xa2, + 0x0, 0x22, 0x7d, 0x12, 0x9d, 0x1f, 0xbe, 0x14, 0x0, 0x0, 0x22, 0x7c, 0xab, + 0xc2, 0x0, 0x6c, 0x77, 0x80, 0x18, 0xbc, 0x7a, 0x68, 0x12, 0x7e, 0x50, 0x9, + 0xac, 0x57, 0x9, 0x62, 0x67, 0x1f, 0x12, 0xcf, 0x68, 0x70, 0x4, 0xd2, 0x0, + 0x80, 0xa, 0xb, 0x70, 0x7e, 0xb3, 0x68, 0x79, 0xbc, 0xb7, 0x38, 0xe0, 0xa2, + 0x0, 0x22, 0x5e, 0x60, 0xf, 0xa, 0x26, 0x9, 0xb2, 0x38, 0x8b, 0x22, 0x7d, + 0x12, 0x9d, 0x10, 0xbe, 0x14, 0x0, 0x0, 0x22, 0xca, 0x3b, 0x7e, 0xa0, 0x64, + 0x6c, 0x77, 0x80, 0x64, 0xa, 0x27, 0xb, 0x24, 0x7c, 0x65, 0x80, 0x52, 0x7e, + 0xf0, 0x2, 0xac, 0xf6, 0x9, 0xb7, 0x65, 0x60, 0xa, 0xb, 0x7e, 0xd0, 0x2, + 0xac, 0xd7, 0x9, 0xb6, 0x65, 0x60, 0xa, 0x2b, 0x12, 0xcf, 0x72, 0x8, 0x4, + 0x9d, 0x20, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x21, 0x9, 0x47, 0x65, 0x61, 0xa, + 0x44, 0x9, 0x46, 0x65, 0x61, 0xa, 0x14, 0x7d, 0x1, 0x12, 0xcc, 0x1b, 0x8, + 0x4, 0x9d, 0x14, 0x80, 0x4, 0x6d, 0x11, 0x9d, 0x10, 0x7c, 0x43, 0xbc, 0x45, + 0x50, 0x4, 0x7c, 0x35, 0x80, 0x2, 0x7c, 0x34, 0xbc, 0xa3, 0x28, 0x2, 0x7c, + 0xa3, 0xb, 0x60, 0x7e, 0x23, 0x66, 0xea, 0xbc, 0x26, 0x38, 0xa6, 0xb, 0x70, + 0x7e, 0xb3, 0x66, 0xea, 0xbc, 0xb7, 0x38, 0x94, 0xbe, 0xa0, 0x64, 0x78, 0x2, + 0x6c, 0xaa, 0x7c, 0xba, 0xda, 0x3b, 0x22, 0x7d, 0x23, 0x12, 0x9f, 0x94, + 0x28, 0x4c, 0x7e, 0x37, 0x66, 0xf0, 0xbd, 0x32, 0x8, 0x2, 0xe4, 0x22, 0x7e, + 0xb3, 0x66, 0xf2, 0x7e, 0x73, 0x66, 0xf3, 0x12, 0xa0, 0xc4, 0x50, 0x32, + 0x7e, 0x27, 0x68, 0x89, 0x7d, 0x32, 0x3e, 0x34, 0xbe, 0x37, 0x66, 0xf0, + 0x48, 0x3, 0x74, 0x1, 0x22, 0x7d, 0x32, 0x3e, 0x34, 0x3e, 0x34, 0xbe, 0x37, + 0x66, 0xf0, 0x48, 0x3, 0x74, 0x2, 0x22, 0x7e, 0x34, 0x0, 0x6, 0xad, 0x32, + 0xbe, 0x37, 0x66, 0xf0, 0x48, 0x3, 0x74, 0x3, 0x22, 0x74, 0x4, 0x22, 0x74, + 0xff, 0x22, 0xe4, 0x22, 0x7c, 0x1b, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xa, 0x3b, + 0x1b, 0x34, 0x7c, 0x7, 0x80, 0x12, 0xbc, 0x10, 0x68, 0xc, 0x12, 0xd0, 0xd2, + 0x9, 0xb1, 0x68, 0x29, 0xbe, 0xb0, 0x3, 0x68, 0x7, 0x1b, 0x0, 0xbe, 0x0, + 0x0, 0x58, 0xe9, 0xbe, 0x0, 0x0, 0x58, 0x2, 0x7c, 0x1, 0x6c, 0x99, 0x80, + 0x4a, 0x1a, 0xe9, 0x7e, 0xf4, 0x0, 0x9, 0xad, 0xfe, 0x9, 0x8f, 0x67, 0x1f, + 0xbc, 0x81, 0x78, 0x2e, 0x12, 0xd1, 0x17, 0x7d, 0x1f, 0x12, 0x8f, 0xc9, + 0x12, 0x2a, 0xc1, 0x1a, 0x29, 0x7e, 0x34, 0x0, 0x9, 0xad, 0x32, 0x19, 0x3, + 0x67, 0x1f, 0xe4, 0x12, 0xd0, 0xd2, 0x19, 0xb1, 0x68, 0x2a, 0x19, 0xb1, + 0x68, 0x29, 0x7e, 0xb3, 0x68, 0x79, 0x4, 0x7a, 0xb3, 0x68, 0x79, 0x80, 0xa, + 0xbc, 0x80, 0x78, 0x6, 0x74, 0xff, 0x19, 0xbf, 0x67, 0x1f, 0xb, 0x90, 0x12, + 0x85, 0xb, 0x18, 0xb1, 0x22, 0x1a, 0x10, 0x3e, 0x14, 0x3e, 0x14, 0x3e, 0x14, + 0x22, 0xca, 0xf8, 0x7f, 0x60, 0x6c, 0xff, 0x12, 0xd1, 0xd, 0x30, 0xe2, 0x5, + 0x7c, 0xbf, 0x12, 0xd0, 0x51, 0xb, 0xf0, 0xbe, 0xf0, 0xa, 0x78, 0xee, 0x6c, + 0xff, 0x12, 0xd1, 0xd, 0x30, 0xe3, 0x5, 0x7c, 0xbf, 0x12, 0xd1, 0xd1, 0xb, + 0xf0, 0xbe, 0xf0, 0xa, 0x40, 0xee, 0x12, 0xd2, 0x55, 0xda, 0xf8, 0x22, 0xa, + 0x3f, 0x2d, 0x3d, 0x7d, 0x2c, 0x7e, 0x1b, 0xb0, 0x22, 0x7e, 0x70, 0x9, 0xac, + 0x71, 0x2e, 0x34, 0x39, 0x49, 0x22, 0x7c, 0x17, 0x7c, 0x3b, 0x12, 0xd1, + 0x17, 0x74, 0x9, 0xac, 0x3b, 0x2e, 0x14, 0x67, 0x1b, 0x12, 0x2a, 0xc1, 0x6c, + 0x0, 0x7e, 0x70, 0x8, 0xac, 0x71, 0x19, 0x3, 0x68, 0x2a, 0xe4, 0x19, 0xb3, + 0x68, 0x29, 0x74, 0x8, 0xa, 0x31, 0x19, 0xb3, 0x1, 0x83, 0x22, 0xca, 0xf8, + 0x7f, 0x70, 0x7e, 0x93, 0x68, 0x79, 0x6c, 0x88, 0x80, 0x5d, 0x7e, 0x70, 0x9, + 0xac, 0x78, 0x12, 0xd1, 0xbc, 0x12, 0xd1, 0xc9, 0xac, 0x3f, 0x2e, 0x14, + 0x38, 0xef, 0x74, 0x9, 0x12, 0x2a, 0xc1, 0x12, 0x36, 0x55, 0x7d, 0x23, 0x74, + 0x2, 0xac, 0xbf, 0x49, 0x35, 0x38, 0xc7, 0xbd, 0x32, 0x28, 0x6, 0x49, 0x35, + 0x38, 0xc7, 0x80, 0x3, 0x12, 0x36, 0x55, 0x74, 0x2, 0xac, 0xbf, 0x59, 0x35, + 0x38, 0xc7, 0xa, 0x58, 0x7f, 0x17, 0x2d, 0x35, 0x7e, 0x1b, 0x30, 0x7c, 0xb3, + 0x30, 0xe0, 0x9, 0x7c, 0xb8, 0x7c, 0x7f, 0x12, 0xd2, 0xa, 0x80, 0xc, 0x7c, + 0xb3, 0x30, 0xe1, 0x7, 0x7c, 0xb8, 0x7c, 0x7f, 0x12, 0xd1, 0x21, 0xb, 0x80, + 0xbc, 0x98, 0x38, 0x9f, 0xda, 0xf8, 0x22, 0x9, 0xf3, 0x67, 0x1f, 0x5e, 0xf0, + 0xf, 0x22, 0x7e, 0x70, 0x9, 0xac, 0x7d, 0x2e, 0x34, 0x67, 0x1b, 0x7e, 0x30, + 0x9, 0x22, 0x7c, 0x7b, 0x74, 0x8, 0xac, 0xb7, 0x9, 0xb5, 0x68, 0x29, 0xb4, + 0x1, 0x2b, 0x7e, 0x63, 0x68, 0x79, 0x80, 0x15, 0x7e, 0x50, 0x9, 0xac, 0x56, + 0x9, 0x32, 0x67, 0x1f, 0xbc, 0x37, 0x78, 0x6, 0x74, 0xff, 0x19, 0xb2, 0x67, + 0x1f, 0xb, 0x60, 0xbe, 0x60, 0xa, 0x40, 0xe6, 0x7e, 0xa0, 0x3, 0x74, 0x8, + 0xac, 0x7b, 0x19, 0xa3, 0x68, 0x29, 0x22, 0x7c, 0xa7, 0x7c, 0x5b, 0x7e, + 0xb3, 0x68, 0x79, 0xbe, 0xb0, 0x0, 0x28, 0x3d, 0x14, 0x7a, 0xb3, 0x68, 0x79, + 0x7e, 0x70, 0xff, 0x74, 0x9, 0xac, 0x5b, 0x19, 0x72, 0x67, 0x1f, 0x7e, 0x70, + 0x3, 0x7e, 0x50, 0x8, 0xac, 0x5a, 0x19, 0x72, 0x68, 0x29, 0x7e, 0x50, 0x2, + 0xac, 0x5a, 0x49, 0x32, 0x38, 0x9f, 0xbe, 0x34, 0x0, 0x0, 0x28, 0x9, 0x2e, + 0x24, 0x38, 0x9f, 0x1b, 0x34, 0x1b, 0x28, 0x30, 0x7e, 0xb3, 0x39, 0xa3, 0x4, + 0x7a, 0xb3, 0x39, 0xa3, 0x22, 0xca, 0x3b, 0x6c, 0xff, 0x6c, 0xee, 0x6c, + 0x11, 0x7e, 0x30, 0x9, 0xac, 0x31, 0x7d, 0x31, 0x2e, 0x34, 0x67, 0x1b, 0x2e, + 0x14, 0x2e, 0x81, 0x12, 0x87, 0xe1, 0xa5, 0xb9, 0xa, 0xea, 0x7e, 0x8, 0x67, + 0x1b, 0x7e, 0x34, 0x0, 0x5a, 0x74, 0xff, 0x12, 0x0, 0x2e, 0x6c, 0x11, 0x7e, + 0x90, 0x9, 0xac, 0x91, 0x9, 0xd4, 0x2e, 0x85, 0xbe, 0xd0, 0xff, 0x68, 0x4b, + 0x74, 0x8, 0xac, 0xbd, 0x9, 0xc5, 0x68, 0x29, 0xbe, 0xc0, 0x2, 0x68, 0x4, + 0x4c, 0xcc, 0x78, 0x15, 0x7d, 0x34, 0x2e, 0x34, 0x2e, 0x81, 0x7e, 0x30, 0x9, + 0xac, 0x3f, 0x12, 0x8f, 0xc9, 0x12, 0x2a, 0xc1, 0xb, 0xf0, 0x80, 0x25, 0xbe, + 0xc0, 0x1, 0x78, 0x20, 0x7d, 0x34, 0x2e, 0x34, 0x2e, 0x81, 0xa, 0x2e, 0x7e, + 0x3, 0x68, 0x79, 0xa, 0x40, 0x2d, 0x42, 0x7e, 0x54, 0x0, 0x9, 0xad, 0x54, + 0x7d, 0x15, 0x12, 0x8f, 0xc9, 0x12, 0x2a, 0xc1, 0xb, 0xe0, 0xb, 0x10, 0xbe, + 0x10, 0xa, 0x40, 0xa0, 0xda, 0x3b, 0x22, 0x7c, 0xa7, 0x7c, 0x5b, 0x7e, 0x70, + 0x9, 0xac, 0x75, 0x49, 0x43, 0x67, 0x1b, 0x49, 0x23, 0x67, 0x1d, 0xe4, 0xa, + 0x3a, 0x19, 0xb3, 0x38, 0x8b, 0xbe, 0x44, 0x0, 0x0, 0x40, 0x14, 0xbe, 0x44, + 0x0, 0x0, 0x50, 0xe, 0xbe, 0x24, 0x0, 0x0, 0x40, 0x8, 0xbe, 0x24, 0x8, 0xe8, + 0x38, 0x2, 0x80, 0x18, 0xbe, 0x44, 0x4, 0x38, 0x28, 0x19, 0xbe, 0x44, 0x4, + 0x38, 0x38, 0x13, 0xbe, 0x24, 0x0, 0x0, 0x40, 0xd, 0xbe, 0x24, 0x8, 0xe8, + 0x38, 0x7, 0x12, 0xd4, 0x75, 0x44, 0x1, 0x80, 0x3c, 0xbe, 0x44, 0x0, 0x0, + 0x40, 0x19, 0xbe, 0x44, 0x0, 0x28, 0x38, 0x13, 0xbe, 0x24, 0x0, 0x0, 0x40, + 0xd, 0xbe, 0x24, 0x8, 0xe8, 0x38, 0x7, 0x12, 0xd4, 0x75, 0x44, 0x2, 0x80, + 0x1d, 0xbe, 0x44, 0x4, 0x10, 0x40, 0x1a, 0xbe, 0x44, 0x4, 0x38, 0x38, 0x14, + 0xbe, 0x24, 0x0, 0x0, 0x40, 0xe, 0xbe, 0x24, 0x8, 0xe8, 0x38, 0x8, 0x12, + 0xd4, 0x75, 0x44, 0x2, 0x7a, 0x19, 0xb0, 0xbe, 0x44, 0x0, 0x0, 0x40, 0x14, + 0xbe, 0x44, 0x0, 0x28, 0x38, 0xe, 0xbe, 0x24, 0x0, 0x0, 0x40, 0x8, 0xbe, + 0x24, 0x8, 0xe8, 0x38, 0x2, 0x80, 0x18, 0xbe, 0x44, 0x4, 0x10, 0x40, 0x1a, + 0xbe, 0x44, 0x4, 0x38, 0x38, 0x14, 0xbe, 0x24, 0x0, 0x0, 0x40, 0xe, 0xbe, + 0x24, 0x8, 0xe8, 0x38, 0x8, 0x12, 0xd4, 0x75, 0x44, 0x4, 0x7a, 0x19, 0xb0, + 0x7e, 0x33, 0x53, 0xfa, 0xa5, 0xbb, 0x0, 0x3c, 0xbe, 0x44, 0x0, 0x0, 0x40, + 0x14, 0xbe, 0x44, 0x0, 0x0, 0x38, 0xe, 0xbe, 0x24, 0x8, 0xe8, 0x40, 0x8, + 0xbe, 0x24, 0x8, 0xe8, 0x38, 0x2, 0x81, 0x5d, 0xbe, 0x44, 0x4, 0x38, 0x50, + 0x2, 0x81, 0x70, 0xbe, 0x44, 0x4, 0x38, 0x28, 0x2, 0x81, 0x70, 0xbe, 0x24, + 0x8, 0xe8, 0x50, 0x2, 0x81, 0x70, 0xbe, 0x24, 0x8, 0xe8, 0x28, 0x2, 0x81, + 0x70, 0x80, 0x6a, 0xa5, 0xbb, 0x1, 0x34, 0xbe, 0x44, 0x0, 0x0, 0x40, 0x14, + 0xbe, 0x44, 0x0, 0xa0, 0x38, 0xe, 0xbe, 0x24, 0x0, 0x0, 0x40, 0x8, 0xbe, + 0x24, 0x0, 0x78, 0x38, 0x2, 0x80, 0x4c, 0xbe, 0x44, 0x0, 0x0, 0x40, 0x59, + 0xbe, 0x44, 0x0, 0xa0, 0x38, 0x53, 0xbe, 0x24, 0x8, 0x70, 0x40, 0x4d, 0xbe, + 0x24, 0x8, 0xe8, 0x38, 0x47, 0x80, 0x32, 0xbe, 0x44, 0x3, 0x98, 0x40, 0x14, + 0xbe, 0x44, 0x4, 0x38, 0x38, 0xe, 0xbe, 0x24, 0x0, 0x0, 0x40, 0x8, 0xbe, + 0x24, 0x0, 0x78, 0x38, 0x2, 0x80, 0x18, 0xbe, 0x44, 0x3, 0x98, 0x40, 0x25, + 0xbe, 0x44, 0x4, 0x38, 0x38, 0x1f, 0xbe, 0x24, 0x8, 0x70, 0x40, 0x19, 0xbe, + 0x24, 0x8, 0xe8, 0x38, 0x13, 0xe4, 0x19, 0xb3, 0x38, 0x8b, 0x7d, 0x23, 0x2e, + 0x24, 0x38, 0x8b, 0x7e, 0x29, 0xb0, 0x44, 0x8, 0x7a, 0x29, 0xb0, 0x9, 0xb3, + 0x38, 0x8b, 0x22, 0x7d, 0x13, 0x2e, 0x14, 0x38, 0x8b, 0x7e, 0x19, 0xb0, + 0x22, 0xca, 0x3b, 0x7c, 0x17, 0x7c, 0xb, 0xc2, 0x0, 0x6c, 0xdd, 0x20, 0x0, + 0x78, 0xbc, 0x1d, 0x68, 0x6d, 0xa, 0x1d, 0x9, 0xb1, 0x38, 0x8b, 0x60, 0x65, + 0x74, 0x9, 0xac, 0xbd, 0x9, 0x95, 0x38, 0xf6, 0x9, 0x85, 0x38, 0xf7, 0x74, + 0x9, 0xac, 0xb0, 0x9, 0xf5, 0x67, 0x22, 0x9, 0xe5, 0x67, 0x23, 0xbc, 0xf9, + 0x78, 0x49, 0xbc, 0xe8, 0x28, 0x4, 0xa, 0x58, 0x80, 0x2, 0xa, 0x5e, 0xbc, + 0xe8, 0x50, 0x4, 0xa, 0x18, 0x80, 0x2, 0xa, 0x1e, 0x9d, 0x15, 0xbe, 0x14, + 0x0, 0x5, 0x18, 0x2d, 0xd2, 0x0, 0xbc, 0xe8, 0x28, 0x4, 0x7c, 0xc8, 0x80, + 0x13, 0x7c, 0xce, 0x80, 0xf, 0x7c, 0xb9, 0x7c, 0x7c, 0x12, 0x37, 0x81, 0x58, + 0x4, 0xc2, 0x0, 0x80, 0x12, 0xb, 0xc0, 0xbc, 0xe8, 0x50, 0x4, 0xa, 0x58, + 0x80, 0x2, 0xa, 0x5e, 0xa, 0x1c, 0xbd, 0x15, 0x8, 0xe1, 0xb, 0xd0, 0xbe, + 0xd0, 0xa, 0x40, 0x85, 0xa2, 0x0, 0xda, 0x3b, 0x22, 0xca, 0x79, 0x7c, 0xf7, + 0x7c, 0xeb, 0x75, 0x38, 0x1, 0x75, 0x42, 0x1, 0x6d, 0xff, 0x7d, 0xdf, 0x7e, + 0x8, 0x2e, 0x89, 0x7e, 0x34, 0x0, 0x51, 0xe4, 0x12, 0x0, 0x2e, 0x7e, 0x8, + 0x2e, 0x81, 0x7e, 0x34, 0x0, 0x8, 0x12, 0x0, 0x2e, 0x74, 0x9, 0xac, 0xbe, + 0x9, 0x15, 0x67, 0x22, 0x9, 0x5, 0x67, 0x23, 0x74, 0x1, 0x7a, 0xb3, 0x2e, + 0xb1, 0x7a, 0x11, 0x3c, 0x7a, 0x11, 0x3d, 0x7a, 0x1, 0x41, 0x7a, 0x1, 0x40, + 0x75, 0x45, 0x1, 0xe5, 0x45, 0x1a, 0xcb, 0x1a, 0x11, 0x9d, 0x1c, 0xbe, 0x14, + 0x0, 0x0, 0x58, 0x3, 0xe4, 0x80, 0x2, 0x7c, 0xb3, 0xf5, 0x3a, 0x1a, 0x11, + 0x2d, 0x1c, 0x90, 0x1, 0x8a, 0x12, 0xd7, 0x9c, 0x58, 0x2, 0x80, 0x2, 0x7c, + 0xb3, 0xf5, 0x3b, 0x1a, 0x10, 0x9d, 0x1c, 0xbe, 0x14, 0x0, 0x0, 0x58, 0x3, + 0xe4, 0x80, 0x2, 0x7c, 0xb3, 0xf5, 0x3e, 0x1a, 0x10, 0x2d, 0x1c, 0x90, 0x1, + 0x8b, 0x12, 0xd7, 0x9c, 0x58, 0x2, 0x80, 0x2, 0x7c, 0xb3, 0xf5, 0x3f, 0x85, + 0x3a, 0x39, 0xc1, 0xe2, 0x7e, 0x91, 0x3e, 0xc1, 0xd8, 0x12, 0xd7, 0x85, 0x9, + 0xb1, 0x2e, 0xb1, 0xbe, 0xb0, 0x1, 0x78, 0x2, 0xc1, 0xd6, 0xe5, 0x39, 0x7c, + 0x79, 0x12, 0x36, 0x62, 0xbe, 0x34, 0x0, 0x0, 0xe5, 0x39, 0x7c, 0x79, 0x8, + 0x7, 0x12, 0x36, 0x62, 0x7d, 0xe3, 0x80, 0x7, 0x12, 0x36, 0x62, 0x6d, 0xee, + 0x9d, 0xe3, 0xbe, 0xe4, 0x0, 0x32, 0x50, 0x2, 0xc1, 0xd6, 0xe5, 0x45, 0xb4, + 0x1, 0xc, 0x7e, 0xa0, 0x1, 0x12, 0xd7, 0x85, 0x19, 0xa1, 0x2e, 0xb1, 0x80, + 0x2b, 0x12, 0xd7, 0x85, 0x9, 0xb1, 0x2e, 0xa8, 0xb4, 0x1, 0x2, 0x80, 0x19, + 0x9, 0xb1, 0x2e, 0xba, 0xb4, 0x1, 0x2, 0x80, 0x10, 0x9, 0xb1, 0x2e, 0xb0, + 0xb4, 0x1, 0x2, 0x80, 0x7, 0x9, 0xb1, 0x2e, 0xb2, 0xb4, 0x1, 0x6, 0x74, 0x1, + 0x19, 0xb1, 0x2e, 0xb1, 0x1a, 0xc1, 0xe5, 0x39, 0x1a, 0x1b, 0x9d, 0x1c, + 0x7e, 0x34, 0x0, 0x9, 0xad, 0x31, 0x1a, 0x20, 0x1a, 0xc9, 0x9d, 0xc2, 0x2d, + 0x3c, 0x9, 0xb3, 0x2e, 0xb1, 0xb4, 0x1, 0x2, 0x80, 0x2, 0xc1, 0xd6, 0xe5, + 0x39, 0xbe, 0xb1, 0x3c, 0x8, 0x4, 0xe5, 0x3c, 0x80, 0x2, 0xe5, 0x39, 0xf5, + 0x3c, 0xe5, 0x39, 0xbe, 0xb1, 0x3d, 0x58, 0x4, 0xe5, 0x3d, 0x80, 0x2, 0xe5, + 0x39, 0xf5, 0x3d, 0xbe, 0x91, 0x40, 0x8, 0x4, 0xe5, 0x40, 0x80, 0x2, 0x7c, + 0xb9, 0xf5, 0x40, 0xbe, 0x91, 0x41, 0x58, 0x4, 0xe5, 0x41, 0x80, 0x2, 0x7c, + 0xb9, 0xf5, 0x41, 0xbe, 0x14, 0x0, 0x0, 0x8, 0xa, 0x1a, 0x31, 0xe5, 0x39, + 0x1a, 0x5b, 0x9d, 0x53, 0x80, 0x4, 0x6d, 0x55, 0x9d, 0x51, 0x7e, 0x14, 0x0, + 0x1, 0x7d, 0x31, 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x7c, 0xb7, 0xf5, + 0x43, 0xbe, 0xc4, 0x0, 0x0, 0x8, 0x8, 0x1a, 0x30, 0x1a, 0x59, 0x9d, 0x53, + 0x80, 0x4, 0x6d, 0x55, 0x9d, 0x5c, 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, + 0x7c, 0x83, 0x7a, 0x81, 0x44, 0xa, 0x38, 0x12, 0xd7, 0xa5, 0x2d, 0xd1, 0xe5, + 0x43, 0xa, 0x3b, 0x12, 0xd7, 0xa5, 0x2d, 0xf1, 0x5, 0x42, 0xe5, 0x45, 0x1a, + 0xcb, 0x3e, 0xc4, 0x2e, 0xc4, 0x2e, 0x7f, 0xb, 0xc8, 0x10, 0x2d, 0x1e, 0x1b, + 0xc8, 0x10, 0xb, 0x90, 0xe5, 0x3f, 0xbc, 0xb9, 0x48, 0x2, 0xa1, 0xa5, 0x5, + 0x39, 0xe5, 0x3b, 0xbe, 0xb1, 0x39, 0x48, 0x2, 0xa1, 0xa0, 0x5, 0x45, 0xe5, + 0x45, 0xb4, 0x4, 0x2, 0x80, 0x2, 0xa1, 0x51, 0xe5, 0x40, 0x1a, 0xeb, 0xe5, + 0x41, 0x1a, 0xcb, 0x9d, 0xce, 0xb, 0xc4, 0x1e, 0xd4, 0x1e, 0xd4, 0x1e, 0xd4, + 0x1e, 0xd4, 0xad, 0xdc, 0xe5, 0x3c, 0x1a, 0xcb, 0xe5, 0x3d, 0x1a, 0xeb, + 0x9d, 0xec, 0xb, 0xe4, 0x1e, 0xf4, 0x1e, 0xf4, 0x1e, 0xf4, 0x1e, 0xf4, 0xad, + 0xfe, 0x7e, 0x50, 0x2, 0xac, 0x5f, 0x49, 0x32, 0x38, 0xb3, 0x7d, 0xef, 0x3e, + 0xe4, 0x3e, 0xe4, 0xbd, 0x3e, 0x28, 0x5, 0x75, 0x38, 0x2, 0x80, 0x36, 0x7d, + 0xef, 0x3e, 0xe4, 0xbd, 0xed, 0x38, 0x2, 0x80, 0x29, 0xe5, 0x42, 0xbe, 0xb0, + 0x19, 0x8, 0x2, 0x80, 0x20, 0xe5, 0x42, 0xbe, 0xb0, 0x5, 0x58, 0xd, 0x4c, + 0x11, 0x68, 0x15, 0x12, 0x37, 0xef, 0xbc, 0xb1, 0x78, 0x2, 0x80, 0xc, 0x7e, + 0xe7, 0x2e, 0x85, 0x3e, 0xe4, 0xbe, 0xe7, 0x2e, 0x87, 0x28, 0x3, 0x75, 0x38, + 0x0, 0xbd, 0x3f, 0x28, 0x6, 0x49, 0x32, 0x38, 0xb3, 0x80, 0x2, 0x7d, 0x3f, + 0x59, 0x32, 0x38, 0xb3, 0xe5, 0x38, 0xda, 0x79, 0x22, 0x1a, 0x31, 0xe5, + 0x39, 0x1a, 0x2b, 0x9d, 0x23, 0x7e, 0x34, 0x0, 0x9, 0xad, 0x32, 0x1a, 0x20, + 0x1a, 0x19, 0x9d, 0x12, 0x2d, 0x13, 0x22, 0xe4, 0x93, 0xa, 0x5b, 0x1b, 0x54, + 0xbd, 0x51, 0x22, 0xad, 0x3e, 0x7d, 0x13, 0x1e, 0x14, 0x1e, 0x14, 0x1e, + 0x14, 0x22, 0x7e, 0x8, 0x56, 0xbf, 0x7e, 0x34, 0x0, 0x1, 0x74, 0xff, 0x2, + 0x0, 0x2e, 0xca, 0x79, 0x7f, 0x60, 0x7c, 0xf5, 0x7c, 0xe6, 0x12, 0xda, 0x39, + 0x7d, 0xb3, 0x7c, 0xbe, 0x7c, 0x7f, 0x12, 0xda, 0x39, 0x2d, 0x3b, 0x12, + 0x9f, 0x85, 0x7d, 0xa3, 0x7e, 0x25, 0x46, 0x7d, 0x12, 0x9d, 0x1a, 0xbe, + 0x14, 0x0, 0x0, 0x8, 0x6, 0x7d, 0x32, 0x9d, 0x3a, 0x80, 0x4, 0x6d, 0x33, + 0x9d, 0x31, 0x7d, 0x12, 0x1a, 0x2, 0x1a, 0x0, 0x9f, 0x6, 0xbe, 0x14, 0x0, + 0x0, 0x8, 0x6, 0x7d, 0xd, 0x9d, 0x20, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x21, + 0x7e, 0x14, 0x0, 0x3, 0xad, 0x13, 0xbd, 0x12, 0x58, 0xf, 0xbe, 0x24, 0x0, + 0x64, 0x8, 0x9, 0xbe, 0x34, 0x0, 0x46, 0x8, 0x3, 0xd3, 0x80, 0x1, 0xc3, + 0xda, 0x79, 0x22, 0xca, 0x3b, 0x7c, 0x45, 0x7c, 0x57, 0x7c, 0x7b, 0x75, + 0x46, 0x0, 0x7e, 0xe0, 0xff, 0x75, 0x4c, 0x0, 0x7e, 0xf4, 0x7f, 0xff, 0xbc, + 0x67, 0x28, 0x4, 0x7c, 0xd7, 0x80, 0x2, 0x7c, 0xd6, 0xbc, 0x67, 0x50, 0x4, + 0x7c, 0xa7, 0x80, 0x2, 0x7c, 0xa6, 0xbc, 0x45, 0x28, 0x4, 0x7c, 0xc5, 0x80, + 0x2, 0x7c, 0xc4, 0xbc, 0x45, 0x50, 0x4, 0x7c, 0xb5, 0x80, 0x2, 0x7c, 0xb4, + 0xf5, 0x47, 0x7a, 0xd1, 0x48, 0x7a, 0xc1, 0x49, 0x7a, 0xa1, 0x4a, 0x85, + 0x47, 0x4b, 0x75, 0x4c, 0x1, 0xbe, 0x51, 0x49, 0x78, 0x8, 0xe5, 0x48, 0xbc, + 0xb7, 0x50, 0xb, 0x80, 0x6, 0xe5, 0x48, 0xbc, 0xb6, 0x50, 0x3, 0x75, 0x4c, + 0x0, 0xe5, 0x4c, 0x60, 0x2, 0x21, 0xa8, 0x7c, 0xda, 0x21, 0xa8, 0x7e, 0x8, + 0x0, 0x4d, 0x7e, 0x34, 0x0, 0xc, 0x74, 0xff, 0x12, 0x0, 0x2e, 0xe5, 0x4c, + 0x60, 0x7a, 0x12, 0xda, 0x1, 0x18, 0x3, 0x12, 0xd9, 0xec, 0xa, 0xd, 0xb, + 0x4, 0xe5, 0x4a, 0xa, 0x1b, 0xbd, 0x1, 0x18, 0x9, 0xa, 0x5d, 0xb, 0x54, + 0xf5, 0x51, 0x7a, 0xc1, 0x52, 0xbd, 0x1, 0x18, 0xb, 0xbd, 0x23, 0x18, 0x7, + 0xa, 0x5d, 0xb, 0x54, 0x12, 0xd9, 0xe3, 0x7e, 0xe4, 0x80, 0x1, 0x6c, 0xff, + 0x12, 0xd9, 0xd5, 0x7c, 0x6b, 0xbe, 0x60, 0xff, 0x68, 0xe, 0x12, 0xd9, 0xf6, + 0x68, 0x9, 0x12, 0xda, 0x1f, 0x8, 0x4, 0x7d, 0xe3, 0x7c, 0xef, 0xb, 0xf0, + 0xbe, 0xf0, 0x3, 0x78, 0xe1, 0x12, 0xda, 0xc, 0x78, 0xa, 0x12, 0xd9, 0xdb, + 0xbe, 0xb1, 0x4a, 0x78, 0x2, 0x21, 0xb6, 0xe5, 0x4b, 0xbe, 0xb1, 0x49, 0x78, + 0xa, 0x12, 0xd9, 0xdb, 0xbe, 0xb1, 0x4a, 0x78, 0x2, 0x21, 0xb6, 0xbe, 0xe0, + 0xff, 0x78, 0x2, 0x21, 0xa8, 0x80, 0x72, 0x12, 0xda, 0x1, 0x18, 0x3, 0x12, + 0xd9, 0xec, 0xa, 0xd, 0x1b, 0x4, 0xe5, 0x48, 0xa, 0x1b, 0xbd, 0x1, 0x48, + 0x9, 0xa, 0x5d, 0x1b, 0x54, 0xf5, 0x51, 0x7a, 0xc1, 0x52, 0xbd, 0x1, 0x48, + 0xb, 0xbd, 0x23, 0x18, 0x7, 0xa, 0x5d, 0x1b, 0x54, 0x12, 0xd9, 0xe3, 0x7e, + 0xe4, 0x80, 0x1, 0x6c, 0xff, 0x12, 0xd9, 0xd5, 0x7c, 0x6b, 0xbe, 0x60, 0xff, + 0x68, 0xe, 0x12, 0xd9, 0xf6, 0x68, 0x9, 0x12, 0xda, 0x1f, 0x8, 0x4, 0x7d, + 0xe3, 0x7c, 0xef, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x78, 0xe1, 0x12, 0xda, 0xc, + 0x78, 0x8, 0x12, 0xd9, 0xdb, 0xbe, 0xb1, 0x48, 0x68, 0x3b, 0xe5, 0x4b, 0xbe, + 0xb1, 0x49, 0x78, 0x8, 0x12, 0xd9, 0xdb, 0xbe, 0xb1, 0x48, 0x68, 0x2c, 0xbe, + 0xe0, 0xff, 0x68, 0x19, 0x7e, 0x71, 0x46, 0x74, 0x2, 0xac, 0x7b, 0x59, 0xe3, + 0x52, 0xd2, 0x2e, 0x10, 0x4d, 0xa5, 0xe7, 0x7c, 0xdb, 0x7c, 0xca, 0x5, 0x46, + 0x7e, 0xe0, 0xff, 0xe5, 0x47, 0xa, 0x2b, 0xb, 0x24, 0xa, 0x3c, 0xbd, 0x32, + 0x68, 0x2, 0x1, 0x92, 0x6c, 0xff, 0x80, 0x10, 0x74, 0x2, 0xac, 0xbf, 0x49, + 0xe5, 0x52, 0xd2, 0xbd, 0xef, 0x58, 0x2, 0x7d, 0xfe, 0xb, 0xf0, 0xe5, 0x46, + 0xbc, 0xbf, 0x38, 0xea, 0x7d, 0x3f, 0xda, 0x3b, 0x22, 0x7c, 0x1f, 0x3e, + 0x10, 0x3e, 0x10, 0x7c, 0x1, 0x2e, 0x0, 0x4d, 0xa5, 0xe6, 0x22, 0xf5, 0x55, + 0xa, 0x5c, 0xb, 0x54, 0xf5, 0x56, 0x22, 0x7a, 0xd1, 0x4d, 0xa, 0x5c, 0xb, + 0x54, 0xf5, 0x4e, 0x22, 0x2e, 0x10, 0x4e, 0xa5, 0xe7, 0x7c, 0x7b, 0xbe, + 0x70, 0xff, 0x22, 0xa, 0x2c, 0xb, 0x24, 0xe5, 0x4b, 0xa, 0x3b, 0xbd, 0x23, + 0x22, 0x7c, 0x1e, 0x3e, 0x10, 0x3e, 0x10, 0x7c, 0x1, 0x2e, 0x0, 0x4e, 0xa5, + 0xe6, 0x7c, 0xab, 0xbe, 0xa1, 0x4b, 0x22, 0x7c, 0xb6, 0x12, 0x36, 0x62, + 0x7d, 0x23, 0x7c, 0xbf, 0x3e, 0xb0, 0x3e, 0xb0, 0x24, 0x4f, 0xa, 0x3b, 0x1b, + 0x38, 0x20, 0xb, 0x38, 0x30, 0xbd, 0x3e, 0x22, 0xca, 0x79, 0x7c, 0x8b, 0x7e, + 0xb3, 0x68, 0xa8, 0xf5, 0x4b, 0x7e, 0x93, 0x68, 0xa9, 0x7e, 0x4, 0x80, 0x1, + 0x7c, 0xf7, 0x1a, 0x18, 0x1b, 0x14, 0x7c, 0xe3, 0x41, 0xd8, 0x7a, 0xe1, + 0x49, 0xbe, 0xe0, 0x0, 0x58, 0xc, 0x1a, 0x5e, 0x1a, 0x18, 0x9d, 0x15, 0x1a, + 0x58, 0x2d, 0x51, 0xf5, 0x49, 0xe5, 0x4b, 0xbc, 0xbe, 0x18, 0xc, 0x1a, 0x58, + 0x1a, 0x1e, 0x9d, 0x15, 0x1a, 0x58, 0x9d, 0x51, 0xf5, 0x49, 0x1a, 0x5f, + 0x1b, 0x54, 0xf5, 0x48, 0x80, 0x47, 0x85, 0x48, 0x4a, 0xe5, 0x48, 0xbe, + 0xb0, 0x0, 0x58, 0xe, 0xe5, 0x48, 0x1a, 0x5b, 0x1a, 0x1f, 0x9d, 0x15, 0x1a, + 0x5f, 0x2d, 0x51, 0xf5, 0x4a, 0xbe, 0x91, 0x48, 0x18, 0xe, 0x1a, 0x3f, 0xe5, + 0x48, 0x1a, 0x1b, 0x9d, 0x13, 0x1a, 0x5f, 0x9d, 0x51, 0xf5, 0x4a, 0xbe, + 0x81, 0x49, 0x78, 0x5, 0xbe, 0xf1, 0x4a, 0x68, 0x10, 0xe5, 0x49, 0x7e, 0x71, + 0x4a, 0x12, 0x36, 0x62, 0x7d, 0xf3, 0xbd, 0xf0, 0x8, 0x2, 0x7d, 0xf, 0x5, + 0x48, 0x1a, 0xef, 0xb, 0xe4, 0xe5, 0x48, 0x1a, 0x1b, 0xbd, 0x1e, 0x8, 0xad, + 0xb, 0xe0, 0x1a, 0x58, 0xb, 0x54, 0x1a, 0x1e, 0xbd, 0x15, 0x18, 0x2, 0x41, + 0x55, 0x7d, 0x30, 0xda, 0x79, 0x22, 0xca, 0x3b, 0x75, 0x29, 0xff, 0x6c, + 0xff, 0x7e, 0xc0, 0xff, 0x6c, 0xee, 0x6c, 0x99, 0x6c, 0x88, 0x7e, 0xf4, + 0x7f, 0xff, 0x6c, 0xdd, 0x80, 0x68, 0x7e, 0x70, 0x2, 0xac, 0x7d, 0x9, 0xb3, + 0x65, 0x60, 0xf5, 0x27, 0x9, 0x73, 0x65, 0x61, 0x7a, 0x71, 0x28, 0x12, 0x36, + 0x62, 0x7d, 0x3, 0xbd, 0xf, 0x58, 0x2, 0x7d, 0xf0, 0xe5, 0x27, 0xbe, 0xb1, + 0x29, 0x50, 0x3, 0x85, 0x27, 0x29, 0xe5, 0x27, 0xbc, 0xbf, 0x28, 0x3, 0x7e, + 0xf1, 0x27, 0xe5, 0x28, 0xbc, 0xbc, 0x50, 0x3, 0x7e, 0xc1, 0x28, 0xe5, 0x28, + 0xbc, 0xbe, 0x28, 0x3, 0x7e, 0xe1, 0x28, 0xe5, 0x29, 0xa, 0x5b, 0xa, 0x1f, + 0x9d, 0x15, 0xbe, 0x14, 0x0, 0x7, 0x18, 0xc, 0xa, 0x5c, 0xa, 0x1e, 0x9d, + 0x15, 0xbe, 0x14, 0x0, 0x7, 0x8, 0xa, 0x7e, 0x14, 0x1, 0xf4, 0x7a, 0x17, + 0x52, 0xf2, 0x81, 0xa, 0xb, 0xd0, 0x7e, 0x73, 0x66, 0xea, 0xbc, 0x7d, 0x38, + 0x90, 0x7d, 0x3f, 0x3e, 0x34, 0x12, 0xa7, 0x8e, 0x7d, 0x3, 0x7c, 0xdc, 0x80, + 0x1c, 0x7e, 0xc1, 0x29, 0x80, 0x11, 0x7c, 0xbc, 0x7c, 0x7d, 0x12, 0x36, + 0x62, 0xbd, 0x30, 0x8, 0x2, 0xb, 0x90, 0xb, 0x80, 0xb, 0xc0, 0xbc, 0xfc, + 0x50, 0xeb, 0xb, 0xd0, 0xbc, 0xed, 0x50, 0xe0, 0x7e, 0x73, 0x68, 0x7a, 0xbe, + 0x70, 0x3, 0x40, 0xd, 0x12, 0xdc, 0xd, 0x50, 0x28, 0xb, 0x14, 0x7a, 0x17, + 0x52, 0xf2, 0x80, 0x20, 0xbe, 0x70, 0x1, 0x38, 0x1b, 0x7e, 0x17, 0x52, 0xf2, + 0xbe, 0x14, 0x0, 0x2, 0x28, 0x6, 0x1b, 0x15, 0x7a, 0x17, 0x52, 0xf2, 0x12, + 0xdc, 0x16, 0x50, 0x6, 0xb, 0x14, 0x7a, 0x17, 0x52, 0x72, 0x7e, 0x73, 0x66, + 0xea, 0xbe, 0x70, 0x1, 0x40, 0x2d, 0x7e, 0x30, 0x2, 0xac, 0x38, 0x74, 0x3, + 0xac, 0xb9, 0xbd, 0x51, 0x8, 0xf, 0x6d, 0x11, 0x7a, 0x17, 0x52, 0xf2, 0x12, + 0xdc, 0x16, 0x50, 0x15, 0xb, 0x14, 0x80, 0xd, 0x12, 0xdc, 0xd, 0x50, 0x6, + 0xb, 0x15, 0x7a, 0x17, 0x52, 0xf2, 0x6d, 0x11, 0x7a, 0x17, 0x52, 0x72, 0xda, + 0x3b, 0x22, 0x7e, 0x17, 0x52, 0xf2, 0xbe, 0x14, 0x3, 0xe8, 0x22, 0x7e, 0x17, + 0x52, 0x72, 0xbe, 0x14, 0x1, 0xf4, 0x22, 0xd2, 0x6, 0x7e, 0x34, 0x2d, 0x30, + 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x14, 0x2e, 0x77, 0x74, 0x3c, 0x12, 0x2a, 0xe2, + 0x12, 0xdc, 0x97, 0x50, 0x2, 0xc3, 0x22, 0x6c, 0xaa, 0x80, 0x11, 0x12, 0xdc, + 0x9f, 0x19, 0xb4, 0x2e, 0x77, 0x9, 0xb4, 0x65, 0x61, 0x19, 0xb4, 0x2e, 0x78, + 0xb, 0xa0, 0x7e, 0x73, 0x66, 0xea, 0xbc, 0x7a, 0x38, 0xe7, 0x6c, 0xaa, 0x80, + 0x36, 0xa, 0x2a, 0xb, 0x24, 0x7c, 0x65, 0x80, 0x28, 0x7e, 0x50, 0x2, 0xac, + 0x56, 0x9, 0x12, 0x2e, 0x77, 0x7e, 0x30, 0x2, 0xac, 0x3a, 0x9, 0xb1, 0x2e, + 0x77, 0xbc, 0xb1, 0x78, 0x2, 0xc2, 0x6, 0x9, 0x52, 0x2e, 0x78, 0x9, 0xb1, + 0x2e, 0x78, 0xbc, 0xb5, 0x78, 0x2, 0xc2, 0x6, 0xb, 0x60, 0xbc, 0x76, 0x38, + 0xd4, 0xb, 0xa0, 0xbc, 0x7a, 0x38, 0xc6, 0xa2, 0x6, 0x22, 0x7e, 0x73, 0x66, + 0xea, 0xbe, 0x70, 0x3, 0x22, 0x7e, 0x90, 0x2, 0xac, 0x9a, 0x9, 0xb4, 0x65, + 0x60, 0x22, 0xca, 0x3b, 0x7f, 0x70, 0x7c, 0x17, 0x7c, 0xb, 0x75, 0x33, 0x1, + 0x7e, 0x73, 0x68, 0xa8, 0x7c, 0xc7, 0x7e, 0x73, 0x68, 0xa9, 0x7c, 0xd7, + 0x6d, 0x11, 0x7d, 0x91, 0x7d, 0xa1, 0x7e, 0x24, 0x7f, 0xff, 0x7d, 0xb2, + 0x7d, 0xc1, 0x7d, 0xd2, 0x12, 0xbf, 0xa9, 0x7a, 0x35, 0x34, 0xa, 0x50, 0x1b, + 0x55, 0x7c, 0xfb, 0xa1, 0x83, 0x7a, 0xf1, 0x36, 0xbe, 0xf0, 0x0, 0x58, 0xc, + 0x1a, 0x3f, 0x1a, 0x40, 0x9d, 0x43, 0xa, 0x50, 0x2d, 0x54, 0xf5, 0x36, 0xbc, + 0xcf, 0x18, 0xc, 0x1a, 0x30, 0x1a, 0x4f, 0x9d, 0x43, 0xa, 0x50, 0x9d, 0x54, + 0xf5, 0x36, 0xa, 0x51, 0x1b, 0x55, 0x7c, 0xeb, 0x80, 0x72, 0x7a, 0xe1, 0x37, + 0xbe, 0xe0, 0x0, 0x58, 0xc, 0x1a, 0x3e, 0x1a, 0x41, 0x9d, 0x43, 0xa, 0x51, + 0x2d, 0x54, 0xf5, 0x37, 0xbc, 0xde, 0x18, 0xc, 0x1a, 0x31, 0x1a, 0x4e, 0x9d, + 0x43, 0xa, 0x51, 0x9d, 0x54, 0xf5, 0x37, 0xe5, 0x36, 0x7e, 0x71, 0x37, 0x12, + 0x36, 0x62, 0x7d, 0x83, 0x7c, 0xb0, 0x24, 0xfe, 0xbc, 0xbf, 0x68, 0x12, + 0x12, 0xdd, 0xf4, 0x68, 0xd, 0x7c, 0xb1, 0x24, 0xfe, 0xbc, 0xbe, 0x68, 0x5, + 0x12, 0xdd, 0xfd, 0x78, 0xe, 0x7d, 0x38, 0x2d, 0x3a, 0x7d, 0xa3, 0xbd, 0x8d, + 0x58, 0x1e, 0x7d, 0xd8, 0x80, 0x1a, 0xbc, 0xf, 0x78, 0x4, 0xbc, 0x1e, 0x68, + 0x12, 0x7d, 0x38, 0x2d, 0x39, 0x7d, 0x93, 0xbd, 0x8b, 0x58, 0x2, 0x7d, 0xb8, + 0xbd, 0x8c, 0x8, 0x2, 0x7d, 0xc8, 0xb, 0xe0, 0x12, 0xdd, 0xfd, 0x8, 0x89, + 0xb, 0xf0, 0x12, 0xdd, 0xf4, 0x18, 0x2, 0x81, 0xde, 0x7d, 0x3a, 0x12, 0x4f, + 0xc0, 0x7d, 0x83, 0x7e, 0x75, 0x34, 0x7d, 0x37, 0x9d, 0x38, 0x7d, 0xa3, + 0x7e, 0x14, 0x0, 0x9, 0xad, 0x18, 0x7d, 0x39, 0x9d, 0x31, 0x7d, 0x93, 0x7d, + 0x2c, 0x9d, 0x2b, 0x7e, 0x44, 0x0, 0xa, 0x7d, 0x32, 0xad, 0x34, 0x7d, 0x27, + 0x9d, 0x2b, 0x12, 0x29, 0xee, 0x7d, 0xb3, 0x7d, 0x2c, 0x9d, 0x2d, 0x7d, + 0x32, 0xad, 0x34, 0x7d, 0x27, 0x9d, 0x2d, 0x12, 0x29, 0xee, 0x7d, 0x23, + 0xbe, 0xa4, 0x0, 0x96, 0x8, 0x17, 0xbe, 0x94, 0x1, 0x2c, 0x8, 0x11, 0xbe, + 0xb4, 0x0, 0x5, 0x28, 0xb, 0xbe, 0x24, 0x0, 0x5, 0x28, 0x5, 0x75, 0x33, 0x1, + 0x80, 0x3, 0x75, 0x33, 0x0, 0x1b, 0x7a, 0xa0, 0xe5, 0x33, 0xda, 0x3b, 0x22, + 0xa, 0x20, 0xb, 0x25, 0x1a, 0x3f, 0xbd, 0x32, 0x22, 0xa, 0x21, 0xb, 0x25, + 0x1a, 0x3e, 0xbd, 0x32, 0x22, 0xa2, 0x93, 0xe4, 0x33, 0x22, 0x12, 0xde, 0x6, + 0x70, 0x2e, 0x12, 0x7f, 0x9f, 0x7e, 0xb3, 0x56, 0x24, 0xb4, 0x1, 0xd, 0x7e, + 0x34, 0xf, 0xa0, 0x7a, 0x37, 0x56, 0x91, 0xe4, 0x7a, 0xb3, 0x56, 0x24, 0x7e, + 0x37, 0x56, 0x91, 0x4d, 0x33, 0x78, 0x4, 0x74, 0x1, 0x80, 0x5, 0x12, 0xde, + 0x93, 0x74, 0x2, 0x7e, 0x70, 0x3, 0x2, 0xde, 0x3f, 0x22, 0x7c, 0x6b, 0x7e, + 0xb3, 0x55, 0xf6, 0xb4, 0x81, 0x45, 0xa5, 0xbe, 0x0, 0x2, 0x80, 0x39, 0xa5, + 0xbe, 0x1, 0x1c, 0xc2, 0xaf, 0xa, 0x27, 0x5e, 0x24, 0x0, 0x2, 0x68, 0x2, + 0xd2, 0x95, 0x7a, 0x71, 0xcd, 0xa9, 0xd0, 0xce, 0xa9, 0xc6, 0xc9, 0xa9, + 0xd1, 0x87, 0xd2, 0xaf, 0x80, 0x19, 0xa5, 0xbe, 0x2, 0x1b, 0xc2, 0xaf, 0x12, + 0xde, 0x6, 0x70, 0xc, 0x7a, 0x71, 0xcd, 0xa9, 0xd0, 0xce, 0xa9, 0xd6, 0xc9, + 0xa9, 0xd1, 0x87, 0xd2, 0xaf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4, 0x7a, + 0xb3, 0x55, 0xf6, 0x22, 0xa9, 0xd5, 0xea, 0xa9, 0xc5, 0xea, 0x22, 0xd2, 0x2, + 0x12, 0x46, 0xb8, 0x12, 0xde, 0x6, 0x70, 0xfb, 0x22, 0xca, 0xb8, 0xa9, 0x31, + 0xcd, 0x10, 0xa9, 0x31, 0xe5, 0xc, 0x12, 0xde, 0x93, 0x74, 0x1, 0x7a, 0xb3, + 0x56, 0x24, 0xa9, 0xc1, 0xcd, 0xa9, 0x37, 0xcd, 0x7, 0xa9, 0x37, 0xe5, 0x3, + 0xa9, 0xc7, 0xcd, 0x75, 0xcd, 0x0, 0xda, 0xb8, 0x32, 0xc2, 0x8c, 0xc2, 0xa9, + 0x32, 0x12, 0xde, 0xdb, 0x20, 0x25, 0x3, 0x2, 0xde, 0xfb, 0x22, 0x30, 0x26, + 0x3, 0x12, 0xde, 0xe2, 0x22, 0xa9, 0xd2, 0xea, 0xa9, 0xc2, 0xea, 0xc2, 0x26, + 0xc2, 0x25, 0x22, 0x12, 0x5f, 0x74, 0x68, 0x8, 0xe4, 0x7a, 0xb3, 0x55, 0xf3, + 0x2, 0xde, 0xd1, 0x22, 0x20, 0xf, 0x3, 0x12, 0x76, 0x9c, 0xe4, 0x7a, 0xb3, + 0x55, 0xfb, 0x74, 0x3, 0x7a, 0xb3, 0x54, 0xf6, 0x74, 0x2, 0x7a, 0xb3, 0x54, + 0xf7, 0x7a, 0xb3, 0x54, 0xf8, 0x22, 0xca, 0xb8, 0xca, 0x39, 0x12, 0x70, + 0xe4, 0x7e, 0x37, 0x55, 0xf0, 0xb, 0x34, 0x7a, 0x37, 0x55, 0xf0, 0x7e, 0x37, + 0x56, 0x22, 0xb, 0x34, 0x7a, 0x37, 0x56, 0x22, 0x7e, 0x37, 0x56, 0x91, 0x4d, + 0x33, 0x68, 0x6, 0x1b, 0x34, 0x7a, 0x37, 0x56, 0x91, 0x7e, 0xb3, 0x55, 0xf2, + 0x60, 0x5, 0x14, 0x7a, 0xb3, 0x55, 0xf2, 0x7e, 0xb3, 0x55, 0xf2, 0x70, 0x2, + 0xd2, 0x14, 0x7e, 0x37, 0x56, 0x8f, 0xb, 0x34, 0x7a, 0x37, 0x56, 0x8f, 0x7e, + 0x37, 0x55, 0xfe, 0xbe, 0x34, 0x0, 0x0, 0x28, 0x6, 0x1b, 0x34, 0x7a, 0x37, + 0x55, 0xfe, 0x7e, 0xb3, 0x56, 0x2a, 0xbe, 0xb0, 0xff, 0x50, 0x5, 0x4, 0x7a, + 0xb3, 0x56, 0x2a, 0xda, 0x39, 0xda, 0xb8, 0x32, 0x7e, 0x14, 0xf7, 0xf0, + 0x7e, 0x4, 0x0, 0xff, 0x7e, 0x34, 0x47, 0x52, 0x7e, 0x24, 0x55, 0x50, 0x79, + 0x30, 0x0, 0x2, 0x1b, 0xa, 0x20, 0x7e, 0x34, 0x45, 0x20, 0x7e, 0x24, 0x41, + 0x44, 0x79, 0x30, 0x0, 0x6, 0x79, 0x20, 0x0, 0x4, 0x7e, 0x34, 0x99, 0x33, + 0x7e, 0x24, 0x66, 0xcc, 0x79, 0x30, 0x0, 0xa, 0x79, 0x20, 0x0, 0x8, 0x7e, + 0x34, 0x41, 0x47, 0x7e, 0x24, 0x46, 0x4c, 0x79, 0x30, 0x0, 0xe, 0x79, 0x20, + 0x0, 0xc, 0x22, 0x7e, 0xb3, 0x56, 0x29, 0x4, 0x7a, 0xb3, 0x56, 0x29, 0x7e, + 0x73, 0x56, 0x29, 0xbe, 0x70, 0xc8, 0x28, 0x6, 0x74, 0xc8, 0x7a, 0xb3, 0x56, + 0x29, 0x22, 0x75, 0xec, 0xff, 0x75, 0xee, 0xff, 0x75, 0xeb, 0x3, 0x75, 0xac, + 0xc0, 0xa9, 0xd0, 0xea, 0x75, 0xe1, 0x2, 0x22, 0x75, 0x9a, 0x2f, 0xa9, 0xd1, + 0x99, 0xa9, 0xd6, 0xdf, 0x22, 0xd2, 0xcb, 0xc2, 0x8c, 0x43, 0x89, 0x1, 0x75, + 0x8c, 0x1, 0x75, 0x8a, 0x0, 0xd2, 0xa9, 0x22, 0xd2, 0xcb, 0xc2, 0x8e, 0x43, + 0x89, 0x20, 0x75, 0x8d, 0x1, 0x75, 0x8b, 0x0, 0xd2, 0x8e, 0xd2, 0xab, 0x22, + 0x75, 0xb7, 0x0, 0x75, 0xb8, 0x0, 0x75, 0xf7, 0x0, 0x75, 0xf8, 0x0, 0xa9, + 0xd0, 0xb7, 0xd2, 0xb8, 0xa9, 0xd5, 0xb7, 0xd2, 0xbd, 0xa9, 0xd0, 0xf7, + 0xd2, 0xf8, 0xa9, 0xd6, 0xf7, 0xd2, 0xfe, 0xa9, 0xd1, 0xf7, 0xc2, 0xf9, + 0xa9, 0xc4, 0xb7, 0xd2, 0xbc, 0xa9, 0xc2, 0xb7, 0xc2, 0xba, 0xa9, 0xc1, + 0xb7, 0xc2, 0xb9, 0xa9, 0xc3, 0xb7, 0xc2, 0xbb, 0xa9, 0xc3, 0xf7, 0xc2, + 0xfb, 0x22, 0xca, 0x39, 0xca, 0xb, 0x7e, 0xf, 0x56, 0xad, 0x69, 0x30, 0x0, + 0x2, 0x5e, 0x34, 0x0, 0x1, 0x68, 0x22, 0x69, 0x30, 0x0, 0x4, 0x5e, 0x34, + 0x0, 0x1, 0x68, 0x18, 0xd2, 0xcc, 0x7e, 0x34, 0x0, 0x1, 0x79, 0x30, 0x0, + 0x4, 0xd2, 0xcc, 0x7e, 0xf, 0x56, 0xad, 0xb, 0xa, 0x30, 0x12, 0x97, 0x67, + 0xc2, 0xcc, 0xc2, 0xc3, 0xda, 0xb, 0xda, 0x39, 0x32, 0x7e, 0x8, 0x34, 0x3f, + 0x7e, 0x34, 0x0, 0x44, 0xe4, 0x12, 0x0, 0x2e, 0x7e, 0x34, 0x32, 0x3, 0x7a, + 0x37, 0x34, 0x3f, 0x6d, 0x33, 0x7a, 0x37, 0x34, 0x41, 0x90, 0x1, 0x90, 0x93, + 0x60, 0x6, 0x7e, 0x34, 0x9d, 0x0, 0x80, 0x4, 0x7e, 0x34, 0x9d, 0x2, 0x7a, + 0x37, 0x34, 0x43, 0x7e, 0x37, 0x68, 0xb5, 0x7a, 0x37, 0x34, 0x45, 0x6d, + 0x33, 0x7a, 0x37, 0x34, 0x47, 0x7a, 0x37, 0x34, 0x49, 0x7e, 0x34, 0x2, 0x0, + 0x7a, 0x37, 0x34, 0x4b, 0x7e, 0x34, 0x44, 0x60, 0x7a, 0x37, 0x34, 0x4d, + 0x7e, 0x34, 0x29, 0x1, 0x7a, 0x37, 0x34, 0x4f, 0x7e, 0x34, 0xf, 0x70, 0x7a, + 0x37, 0x34, 0x51, 0x7e, 0x34, 0x8, 0xa, 0x7a, 0x37, 0x34, 0x53, 0x7e, 0x34, + 0x70, 0x0, 0x7a, 0x37, 0x34, 0x55, 0x7e, 0x34, 0x5, 0x80, 0x7a, 0x37, 0x34, + 0x57, 0x7e, 0x34, 0x80, 0x0, 0x7a, 0x37, 0x34, 0x59, 0x6d, 0x33, 0x7a, 0x37, + 0x34, 0x5b, 0x7e, 0x34, 0x0, 0xf0, 0x7a, 0x37, 0x34, 0x5d, 0x7e, 0x34, 0x0, + 0x30, 0x7a, 0x37, 0x34, 0x5f, 0x6d, 0x33, 0x7a, 0x37, 0x34, 0x61, 0x7e, + 0x34, 0x0, 0x2a, 0x7a, 0x37, 0x34, 0x63, 0x7e, 0x34, 0x2d, 0x2d, 0x7a, 0x37, + 0x34, 0x65, 0x7e, 0x34, 0x11, 0x11, 0x7a, 0x37, 0x34, 0x67, 0x7e, 0x34, + 0x11, 0x0, 0x7a, 0x37, 0x34, 0x69, 0x7e, 0x34, 0x1, 0x23, 0x7a, 0x37, 0x34, + 0x6b, 0x7e, 0x34, 0x45, 0x67, 0x7a, 0x37, 0x34, 0x6d, 0x7e, 0x34, 0x89, + 0xab, 0x7a, 0x37, 0x34, 0x6f, 0x7e, 0x34, 0xcd, 0xef, 0x7a, 0x37, 0x34, + 0x71, 0x6d, 0x33, 0x7a, 0x37, 0x34, 0x73, 0x7e, 0x34, 0x43, 0x21, 0x7a, + 0x37, 0x34, 0x75, 0x7e, 0x34, 0x23, 0x45, 0x7a, 0x37, 0x34, 0x77, 0x7e, + 0x34, 0x12, 0x5, 0x7a, 0x37, 0x34, 0x79, 0x7e, 0x34, 0xfe, 0xdc, 0x7a, 0x37, + 0x34, 0x7b, 0x7e, 0x34, 0xba, 0x98, 0x7a, 0x37, 0x34, 0x7d, 0x7e, 0x34, + 0x76, 0x54, 0x7a, 0x37, 0x34, 0x7f, 0x7e, 0x34, 0x32, 0x10, 0x7a, 0x37, + 0x34, 0x81, 0x22, 0xa9, 0xd5, 0xcb, 0xa9, 0xd1, 0xcb, 0xa9, 0xd2, 0xca, + 0xa9, 0xd2, 0xcb, 0x22, 0x2, 0x5f, 0xfa, 0xc2, 0xed, 0xc2, 0xc5, 0x32, 0x7e, + 0xb3, 0x54, 0xf6, 0xb4, 0x1, 0x51, 0x7e, 0xa3, 0x54, 0xf4, 0x7a, 0xa3, 0x54, + 0xf5, 0x7e, 0xb3, 0x54, 0xfe, 0x4, 0x7a, 0xb3, 0x54, 0xfe, 0x6c, 0x77, 0x6c, + 0x66, 0x80, 0xd, 0x7e, 0x50, 0x9, 0xac, 0x56, 0x9, 0xb2, 0x55, 0x9, 0x2c, + 0x7b, 0xb, 0x60, 0xbc, 0xa6, 0x50, 0xef, 0xa, 0x27, 0x1b, 0x24, 0x7e, 0xb3, + 0x54, 0xfe, 0xa, 0x3b, 0xbd, 0x32, 0x48, 0x1b, 0x7c, 0xba, 0x4, 0x7a, 0xb3, + 0x54, 0xf4, 0x12, 0xe2, 0x41, 0x28, 0xf, 0x12, 0xe2, 0x23, 0x50, 0x4, 0x74, + 0x1, 0x80, 0x2, 0x74, 0x3, 0x7a, 0xb3, 0x54, 0xf6, 0x22, 0xc2, 0x8, 0x12, + 0xe2, 0x41, 0x38, 0x4, 0xc2, 0x8, 0x80, 0x10, 0x7e, 0xa3, 0x54, 0xf4, 0x74, + 0x9, 0xa4, 0x49, 0x55, 0x55, 0x1, 0x12, 0x5b, 0xfc, 0x92, 0x8, 0xa2, 0x8, + 0x22, 0x7e, 0x73, 0x54, 0xf3, 0xbe, 0x73, 0x54, 0xf4, 0x22, 0x12, 0x5f, + 0x78, 0x78, 0x50, 0x7e, 0x37, 0x55, 0xfe, 0x4d, 0x33, 0x78, 0xf8, 0x12, + 0x7f, 0xfd, 0x7e, 0xb3, 0x54, 0x13, 0xb4, 0x1, 0x8, 0x7e, 0x73, 0x53, 0xf7, + 0xa, 0x37, 0x80, 0xc, 0x7e, 0x73, 0x53, 0xf6, 0xa, 0x27, 0x7e, 0x34, 0x0, + 0x64, 0x8d, 0x32, 0x1b, 0x34, 0x7a, 0x37, 0x55, 0xfe, 0x7e, 0x73, 0x54, + 0x1a, 0xa, 0x27, 0x7e, 0x37, 0x55, 0xfe, 0xad, 0x32, 0x7e, 0x24, 0x0, 0x18, + 0x8d, 0x32, 0x7a, 0x37, 0x55, 0xfe, 0x7e, 0x37, 0x55, 0xf9, 0xbe, 0x37, + 0x55, 0xfe, 0x50, 0x4, 0x7a, 0x37, 0x55, 0xfe, 0x22, 0xca, 0x79, 0x7c, 0x5b, + 0x7e, 0x40, 0xff, 0x7e, 0xa0, 0xff, 0x6c, 0x33, 0x61, 0x34, 0xbc, 0x63, + 0x78, 0x2, 0x61, 0x32, 0x7e, 0x90, 0x2, 0xac, 0x93, 0x9, 0x24, 0x65, 0x60, + 0xa, 0xf2, 0xa, 0x5, 0x9d, 0xf, 0xbe, 0x4, 0x0, 0x0, 0x8, 0xc, 0xa, 0xe2, + 0xa, 0xf5, 0x9d, 0xfe, 0x7d, 0x7f, 0x7c, 0x2f, 0x80, 0x8, 0x6e, 0x4, 0xff, + 0xff, 0xb, 0x4, 0x7c, 0x21, 0x7e, 0x10, 0x2, 0xac, 0x13, 0x9, 0xb0, 0x65, + 0x61, 0xa, 0xb, 0xa, 0x47, 0x9d, 0x40, 0xbe, 0x44, 0x0, 0x0, 0x8, 0x8, 0xa, + 0xfb, 0xa, 0x7, 0x9d, 0xf, 0x80, 0x4, 0x6d, 0x0, 0x9d, 0x4, 0xbe, 0x20, 0x1, + 0x38, 0xa, 0xbe, 0x10, 0x1, 0x38, 0x5, 0x7e, 0xa0, 0x1, 0x80, 0x31, 0xbe, + 0x20, 0x2, 0x38, 0xa, 0xbe, 0x10, 0x2, 0x38, 0x5, 0x7e, 0x40, 0x2, 0x80, + 0x10, 0x30, 0x0, 0xd, 0xbe, 0x20, 0x3, 0x38, 0x8, 0xbe, 0x10, 0x3, 0x38, + 0x3, 0x7e, 0x40, 0x3, 0xbc, 0x4a, 0x50, 0x2, 0x7c, 0xa4, 0xb, 0x30, 0x7e, + 0x3, 0x66, 0xea, 0xbc, 0x3, 0x28, 0x2, 0x41, 0xae, 0x7c, 0xba, 0xda, 0x79, + 0x22, 0x12, 0xe3, 0xca, 0xe4, 0x7a, 0xb3, 0x2e, 0x79, 0x7e, 0x1f, 0x2d, + 0x26, 0x7a, 0x37, 0x2e, 0x7b, 0x7e, 0x1f, 0x2d, 0x2e, 0x7a, 0x37, 0x2e, + 0x7f, 0x7e, 0xb3, 0x74, 0x9, 0x70, 0xb, 0xe4, 0x7a, 0xb3, 0x2e, 0x7a, 0x7e, + 0x34, 0x0, 0x20, 0x80, 0xd, 0x12, 0x54, 0x1, 0x7e, 0x1f, 0x2d, 0x2a, 0x7a, + 0x37, 0x2e, 0x7d, 0x6d, 0x33, 0x12, 0x97, 0xba, 0x12, 0x54, 0xe0, 0x12, + 0xe3, 0xc3, 0x7e, 0xb3, 0x74, 0x9, 0xa, 0x4a, 0xb4, 0x1, 0x1a, 0x2d, 0x43, + 0x3e, 0x44, 0x7e, 0xf, 0x2d, 0x2a, 0x2d, 0x14, 0xb, 0xa, 0x10, 0x7e, 0x7f, + 0x2d, 0x26, 0x2d, 0xf4, 0xb, 0x7a, 0x20, 0x9d, 0x21, 0x80, 0xd, 0x2d, 0x43, + 0x3e, 0x44, 0x7e, 0xf, 0x2d, 0x26, 0x2d, 0x14, 0xb, 0xa, 0x20, 0x7e, 0xf, + 0x2d, 0x2e, 0x2d, 0x14, 0x1b, 0xa, 0x20, 0xb, 0xa0, 0xbe, 0xa0, 0x4, 0x40, + 0xc0, 0x22, 0x7e, 0x37, 0x74, 0xc, 0x6c, 0xaa, 0x22, 0x7e, 0x73, 0x68, 0xa7, + 0x7a, 0x73, 0x2e, 0x78, 0x7e, 0x73, 0x68, 0xa6, 0x7a, 0x73, 0x2e, 0x77, + 0x22, 0xca, 0xf8, 0x7c, 0xfb, 0x12, 0x97, 0xe9, 0x7e, 0x8, 0x2e, 0x87, 0x7e, + 0x34, 0x0, 0x5, 0x12, 0x0, 0x2e, 0x7e, 0xa3, 0x68, 0xa6, 0x7e, 0x73, 0x68, + 0xa7, 0x7e, 0xa7, 0x67, 0x7, 0x7d, 0xca, 0x3e, 0xc4, 0x3e, 0xc4, 0x4c, 0xff, + 0x78, 0x76, 0x7e, 0xb7, 0x74, 0xc, 0x7a, 0x73, 0x2e, 0x78, 0x7a, 0xa3, 0x2e, + 0x77, 0x7e, 0xd4, 0x9, 0x20, 0x7a, 0xd7, 0x2e, 0x7b, 0x7e, 0x1f, 0x2d, 0x2a, + 0x7d, 0xd3, 0x7a, 0xd7, 0x2e, 0x7d, 0x7e, 0x1f, 0x2d, 0x2a, 0x7d, 0xd3, + 0x7a, 0xd7, 0x2e, 0x7f, 0x7d, 0x3a, 0x7c, 0xb7, 0xf5, 0x27, 0x7e, 0x8, 0x2e, + 0x77, 0x7e, 0x18, 0x2e, 0x87, 0x7d, 0x5a, 0x12, 0x56, 0x7f, 0x7e, 0x70, 0x4, + 0x7d, 0xab, 0x3e, 0xa4, 0x49, 0xda, 0x9, 0x20, 0xbd, 0xcd, 0x58, 0x10, 0x7e, + 0xf, 0x2d, 0x2a, 0x2d, 0x1a, 0xb, 0xa, 0x20, 0x2d, 0x2c, 0x1b, 0xa, 0x20, + 0x80, 0x16, 0x6d, 0x22, 0x9d, 0x2c, 0xbd, 0x2d, 0x8, 0xe, 0x7e, 0xf, 0x2d, + 0x2a, 0x2d, 0x1a, 0xb, 0xa, 0xa0, 0x9d, 0xac, 0x1b, 0xa, 0xa0, 0xb, 0xb4, + 0x1b, 0x70, 0x78, 0xc8, 0xda, 0xf8, 0x22, 0x7d, 0x23, 0x12, 0x5d, 0x71, + 0x7e, 0x37, 0x39, 0xf6, 0x7d, 0x13, 0x9e, 0x17, 0x39, 0xf2, 0xbe, 0x14, 0x0, + 0x0, 0x8, 0x6, 0x9e, 0x37, 0x39, 0xf2, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x31, + 0xbd, 0x32, 0x38, 0x21, 0x7e, 0x37, 0x39, 0xf8, 0x7d, 0x13, 0x9e, 0x17, + 0x39, 0xf4, 0xbe, 0x14, 0x0, 0x0, 0x8, 0x6, 0x9e, 0x37, 0x39, 0xf4, 0x80, + 0x4, 0x6d, 0x33, 0x9d, 0x31, 0xbd, 0x32, 0x38, 0x3, 0x74, 0x1, 0x22, 0xe4, + 0x22, 0xca, 0xd8, 0xca, 0x79, 0x6c, 0xff, 0x6d, 0xdd, 0x7d, 0xed, 0x7d, + 0xfd, 0x7e, 0xd3, 0x68, 0x79, 0x7e, 0xe3, 0x68, 0x7a, 0x7e, 0xb3, 0x39, + 0xf1, 0x60, 0x11, 0x7e, 0xc7, 0x39, 0xfa, 0x4d, 0xcc, 0x78, 0x2, 0xa1, 0xb2, + 0xbe, 0xd0, 0x1, 0x28, 0x2, 0xa1, 0xb2, 0xbe, 0xd0, 0x1, 0x78, 0x1d, 0xbe, + 0xb0, 0x4, 0x78, 0x2, 0xa1, 0xb2, 0x7e, 0xe7, 0x67, 0x75, 0x7e, 0xf7, 0x67, + 0x77, 0x7d, 0x3e, 0x7d, 0x2f, 0x12, 0xe5, 0xe6, 0xbe, 0xb0, 0x1, 0x78, 0x2, + 0xa1, 0xb2, 0x7e, 0xa3, 0x39, 0xf1, 0x7c, 0xba, 0x14, 0x68, 0x29, 0x14, + 0x68, 0x54, 0x14, 0x68, 0x23, 0x14, 0x78, 0x2, 0xa1, 0xaf, 0xb, 0xb2, 0x68, + 0x2, 0xa1, 0xb2, 0xbe, 0xd0, 0x1, 0x68, 0x2, 0xa1, 0xc1, 0x4c, 0xee, 0x68, + 0x2, 0xa1, 0xc1, 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xf1, 0x12, 0xe5, 0xd4, 0x80, + 0x61, 0x4c, 0xdd, 0x78, 0x1d, 0xbe, 0xa0, 0x1, 0x78, 0xc, 0x74, 0x2, 0x7a, + 0xb3, 0x39, 0xf1, 0x7e, 0x34, 0xe, 0x6, 0x80, 0x50, 0x74, 0x4, 0x7a, 0xb3, + 0x39, 0xf1, 0x7e, 0x34, 0xe, 0xa, 0x80, 0x44, 0x12, 0xe5, 0xdd, 0x90, 0xd, + 0xf9, 0x12, 0xe5, 0xc8, 0x68, 0x45, 0x80, 0x52, 0xbe, 0xd0, 0x1, 0x78, 0x4d, + 0x4c, 0xee, 0x78, 0x49, 0x12, 0xe5, 0xdd, 0x7e, 0x34, 0xe, 0x2, 0x12, 0x32, + 0xdf, 0x7e, 0x14, 0xe, 0x6, 0x12, 0xb7, 0x9d, 0x9d, 0xc3, 0xbe, 0xc7, 0x39, + 0xfa, 0x40, 0x21, 0x90, 0xd, 0xf8, 0x12, 0xe5, 0xc8, 0x68, 0x19, 0x12, 0xe5, + 0xd4, 0x74, 0x3, 0x7a, 0xb3, 0x39, 0xf1, 0x7e, 0x34, 0xe, 0x6, 0x12, 0x32, + 0xdf, 0x7a, 0x37, 0x39, 0xfa, 0x80, 0x12, 0x7e, 0xf0, 0x24, 0xe4, 0x7a, + 0xb3, 0x39, 0xf1, 0x6d, 0x33, 0x7a, 0x37, 0x39, 0xfa, 0x7c, 0xbf, 0x80, 0x2, + 0x7c, 0xbf, 0xda, 0x79, 0xda, 0xd8, 0x22, 0xe4, 0x93, 0xa, 0x3b, 0x12, 0xe4, + 0x7c, 0xa, 0xdb, 0x4d, 0xdd, 0x22, 0x7a, 0xe7, 0x39, 0xf2, 0x7a, 0xf7, 0x39, + 0xf4, 0x22, 0x7a, 0xe7, 0x39, 0xf6, 0x7a, 0xf7, 0x39, 0xf8, 0x22, 0x7d, + 0x13, 0x7e, 0x54, 0xd, 0xfa, 0x12, 0xe6, 0x1b, 0x50, 0x1d, 0x7e, 0x54, 0xd, + 0xfc, 0x12, 0xe6, 0x1b, 0x28, 0x14, 0x7e, 0x14, 0xd, 0xfe, 0x12, 0xe6, 0x11, + 0x50, 0xb, 0x7e, 0x14, 0xe, 0x0, 0x12, 0xe6, 0x11, 0x28, 0x2, 0xe4, 0x22, + 0x74, 0x1, 0x22, 0x7e, 0x4, 0x0, 0xff, 0xb, 0xa, 0x30, 0xbd, 0x32, 0x22, + 0x7e, 0x44, 0x0, 0xff, 0xb, 0x2a, 0x30, 0xbd, 0x31, 0x22, 0x7c, 0x7b, 0xa, + 0x57, 0x9e, 0x54, 0x0, 0x20, 0xe, 0x54, 0xe, 0x54, 0xe, 0x54, 0xe, 0x54, + 0x7c, 0xab, 0x7c, 0x67, 0x5e, 0x60, 0xf0, 0xa5, 0xbe, 0x20, 0x1d, 0x7c, + 0xb7, 0x54, 0xf, 0x7e, 0x24, 0x0, 0x1, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, + 0xfb, 0x7e, 0x73, 0x56, 0x9c, 0xa, 0x47, 0x5d, 0x42, 0x7e, 0x73, 0x54, 0x3f, + 0x80, 0x36, 0xa5, 0xbe, 0x30, 0x18, 0x12, 0xe6, 0x98, 0x60, 0x5, 0x3e, 0x34, + 0x14, 0x78, 0xfb, 0x7e, 0x53, 0x56, 0x9d, 0xa, 0x45, 0x5d, 0x43, 0x7e, 0x73, + 0x54, 0x40, 0x80, 0x1a, 0x12, 0xe6, 0x98, 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, + 0xfb, 0xa, 0x2a, 0x9, 0xb2, 0x56, 0x9c, 0xa, 0x4b, 0x5d, 0x43, 0xa, 0x5a, + 0x9, 0x75, 0x54, 0x41, 0xa, 0x57, 0x5d, 0x54, 0x22, 0x7c, 0xb7, 0x54, 0xf, + 0x7e, 0x34, 0x0, 0x1, 0x22, 0x7e, 0xa3, 0x52, 0x71, 0xbe, 0xa0, 0xf0, 0x50, + 0x1b, 0x74, 0x4, 0xa4, 0x59, 0x35, 0x4e, 0x88, 0x7e, 0xa3, 0x52, 0x71, 0x74, + 0x4, 0xa4, 0x59, 0x25, 0x4e, 0x8a, 0x7e, 0xb3, 0x52, 0x71, 0x4, 0x7a, 0xb3, + 0x52, 0x71, 0x22, 0x7d, 0xf2, 0x7d, 0xe3, 0x7e, 0x8, 0x52, 0x49, 0x7e, 0x34, + 0x0, 0x28, 0xe4, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x4e, 0x88, 0x7e, 0x34, 0x3, + 0xc0, 0x12, 0x0, 0x2e, 0x7a, 0xb3, 0x54, 0x41, 0x7e, 0x34, 0xe, 0x30, 0x12, + 0x32, 0xdf, 0x7a, 0x37, 0x4e, 0x80, 0x7a, 0xe7, 0x52, 0x4d, 0x7a, 0xf7, + 0x52, 0x4f, 0x7a, 0xe7, 0x52, 0x51, 0x7a, 0xe7, 0x52, 0x55, 0x7a, 0xe7, + 0x52, 0x59, 0x7a, 0xe7, 0x52, 0x5d, 0x7a, 0xf7, 0x52, 0x53, 0x7a, 0xf7, + 0x52, 0x57, 0x7a, 0xf7, 0x52, 0x5b, 0x7a, 0xf7, 0x52, 0x5f, 0x7a, 0xe7, + 0x4e, 0x84, 0x7a, 0xf7, 0x4e, 0x86, 0x7a, 0xb3, 0x52, 0x71, 0x74, 0x2, 0x7a, + 0xb3, 0x52, 0x48, 0x22, 0x74, 0xfe, 0x7a, 0xb3, 0x54, 0x41, 0xe4, 0x7a, + 0xb3, 0x52, 0x49, 0x22, 0x7e, 0x18, 0x52, 0x49, 0xbe, 0xb0, 0x23, 0x38, + 0x2c, 0xbe, 0xb0, 0x20, 0x40, 0x27, 0x74, 0x2, 0x7a, 0xb3, 0x52, 0x71, 0x7e, + 0x37, 0x52, 0x4d, 0x7a, 0x37, 0x4e, 0x88, 0x7e, 0x37, 0x52, 0x4f, 0x7a, + 0x37, 0x4e, 0x8a, 0x7e, 0x37, 0x52, 0x61, 0x7a, 0x37, 0x4e, 0x8c, 0x7e, + 0x37, 0x52, 0x63, 0x7a, 0x37, 0x4e, 0x8e, 0x22, 0x60, 0x2a, 0x74, 0x6, 0x7a, + 0xb3, 0x52, 0x71, 0x6c, 0xaa, 0x80, 0x18, 0x12, 0xe7, 0x99, 0x69, 0x17, 0x0, + 0x4, 0x59, 0x10, 0x4e, 0x88, 0x12, 0xe7, 0x99, 0x69, 0x17, 0x0, 0x6, 0x59, + 0x10, 0x4e, 0x8a, 0xb, 0xa0, 0x7e, 0xb3, 0x52, 0x71, 0xbc, 0xba, 0x38, 0xe0, + 0x22, 0x7e, 0x10, 0x4, 0xac, 0x1a, 0x7f, 0x71, 0x2d, 0xf0, 0x22, 0xca, 0x3b, + 0xf5, 0x2d, 0x7f, 0x31, 0x7a, 0xd, 0x29, 0x75, 0x35, 0x0, 0x75, 0x36, 0x0, + 0x75, 0x37, 0x0, 0x7e, 0x34, 0x3, 0xe8, 0x7a, 0x35, 0x40, 0x75, 0x33, 0x3c, + 0x75, 0x34, 0x46, 0x75, 0x2e, 0x0, 0x2, 0xe9, 0xc2, 0x12, 0xeb, 0x61, 0x28, + 0x1e, 0x7e, 0x34, 0x0, 0x44, 0xca, 0x39, 0x7e, 0x71, 0x2e, 0x74, 0x44, 0xac, + 0x7b, 0x2e, 0x34, 0x19, 0x74, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x8, 0x32, 0x41, + 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x6d, 0x33, 0x7a, 0x37, 0x32, 0x37, 0x7a, 0x37, + 0x32, 0x39, 0x7a, 0x37, 0x32, 0x3b, 0x7a, 0x37, 0x32, 0x3d, 0x7a, 0x37, + 0x32, 0x3f, 0x7e, 0x18, 0x32, 0x41, 0x7a, 0x1d, 0x38, 0x7e, 0x18, 0x32, + 0x61, 0x7a, 0x1d, 0x3c, 0x75, 0x2f, 0x0, 0x1, 0xa8, 0xe5, 0x2f, 0xa, 0x5b, + 0x7e, 0x1d, 0x29, 0x2d, 0x35, 0x7e, 0x1b, 0x60, 0xa, 0x26, 0x7e, 0xd, 0x38, + 0x2d, 0x15, 0x7e, 0xb, 0x70, 0xa, 0xd7, 0x7d, 0xcd, 0x9d, 0xc2, 0xbe, 0xc4, + 0x0, 0x0, 0x8, 0x4, 0x9d, 0xd2, 0x80, 0xa, 0xa, 0x26, 0xa, 0x37, 0x9d, 0x32, + 0x6d, 0xdd, 0x9d, 0xd3, 0x7e, 0xc7, 0x32, 0x3b, 0xbd, 0xcd, 0x58, 0x4, 0x7a, + 0xd7, 0x32, 0x3b, 0xe5, 0x2f, 0xa, 0xcb, 0x7f, 0x13, 0x2d, 0x3c, 0x7e, 0x1b, + 0x70, 0xa, 0x27, 0xe5, 0x2f, 0xa, 0x3b, 0x7e, 0xd, 0x3c, 0x2d, 0x13, 0x7e, + 0xb, 0x70, 0xa, 0xc7, 0x12, 0x37, 0x98, 0x8, 0x4, 0x9d, 0xc2, 0x80, 0x4, + 0x6d, 0xcc, 0x9d, 0xc3, 0x7e, 0x37, 0x32, 0x3d, 0xbd, 0x3c, 0x58, 0x4, 0x7a, + 0xc7, 0x32, 0x3d, 0x7e, 0x37, 0x32, 0x37, 0x2d, 0x3d, 0x7a, 0x37, 0x32, + 0x37, 0x7e, 0x37, 0x32, 0x39, 0x2d, 0x3c, 0x7a, 0x37, 0x32, 0x39, 0x2d, + 0xcd, 0x7e, 0x37, 0x32, 0x3f, 0xbd, 0x3c, 0x58, 0x4, 0x7a, 0xc7, 0x32, 0x3f, + 0x5, 0x2f, 0xe5, 0x2d, 0xbe, 0xb1, 0x2f, 0x28, 0x2, 0x1, 0x14, 0xe5, 0x2d, + 0xb4, 0xa, 0x2c, 0x7e, 0x37, 0x32, 0x3b, 0xbe, 0x34, 0x0, 0x40, 0x48, 0xc, + 0x7e, 0x27, 0x32, 0x3d, 0xbe, 0x24, 0x0, 0x40, 0x48, 0x2, 0x21, 0xc0, 0xbe, + 0x34, 0x0, 0x60, 0x8, 0x2, 0x21, 0xc0, 0x7e, 0x37, 0x32, 0x3d, 0xbe, 0x34, + 0x0, 0x60, 0x8, 0x2, 0x21, 0xc0, 0x80, 0x2a, 0x7e, 0x37, 0x32, 0x3b, 0xbe, + 0x34, 0x0, 0x20, 0x8, 0xc, 0x7e, 0x27, 0x32, 0x3d, 0xbe, 0x24, 0x0, 0x20, + 0x8, 0x2, 0x21, 0xc0, 0xbe, 0x34, 0x0, 0x30, 0x8, 0x2, 0x21, 0xc0, 0x7e, + 0x37, 0x32, 0x3d, 0xbe, 0x34, 0x0, 0x30, 0x8, 0x2, 0x21, 0xc0, 0x7e, 0xa3, + 0x55, 0x31, 0x74, 0xc, 0xa4, 0xbe, 0x57, 0x32, 0x37, 0x58, 0x2, 0x21, 0xc0, + 0x7e, 0xa3, 0x55, 0x32, 0x74, 0xc, 0xa4, 0xbe, 0x57, 0x32, 0x39, 0x58, 0x2, + 0x21, 0xc0, 0x7e, 0xd, 0x38, 0x7e, 0x1d, 0x29, 0xe5, 0x2d, 0x12, 0xe9, 0xfc, + 0xf5, 0x30, 0x7e, 0xd, 0x3c, 0x7f, 0x13, 0xe5, 0x2d, 0x12, 0xe9, 0xfc, 0xf5, + 0x31, 0xe5, 0x33, 0xbe, 0xb1, 0x30, 0x38, 0x76, 0xe5, 0x33, 0xbe, 0xb1, + 0x31, 0x38, 0x6f, 0xe5, 0x31, 0x7e, 0x31, 0x31, 0xac, 0x3b, 0x1a, 0x2, 0x1a, + 0x0, 0xe5, 0x30, 0x7e, 0x71, 0x30, 0xac, 0x7b, 0x1a, 0x26, 0x1a, 0x24, 0x2f, + 0x10, 0xe5, 0x31, 0xa, 0xfb, 0x6d, 0xee, 0xe5, 0x30, 0xa, 0x1b, 0x6d, 0x0, + 0x2f, 0x7, 0x12, 0x2a, 0x3c, 0x7c, 0xb7, 0xf5, 0x32, 0xe5, 0x34, 0xbe, 0xb1, + 0x32, 0x38, 0x3b, 0x7e, 0x37, 0x32, 0x3d, 0x2e, 0x37, 0x32, 0x3b, 0x2e, + 0x37, 0x32, 0x3f, 0x7a, 0x35, 0x42, 0xe5, 0x32, 0xa, 0x2b, 0x7e, 0x34, 0x0, + 0x64, 0x9d, 0x32, 0x3e, 0x34, 0x2e, 0x35, 0x42, 0x7a, 0x35, 0x42, 0x7e, + 0x35, 0x40, 0xbe, 0x35, 0x42, 0x8, 0x12, 0x7e, 0x35, 0x42, 0x7a, 0x35, 0x40, + 0x85, 0x32, 0x36, 0x7e, 0xb3, 0x32, 0x83, 0xf5, 0x37, 0x85, 0x2e, 0x35, 0x5, + 0x2e, 0x12, 0xeb, 0x61, 0x28, 0x3, 0x2, 0xe7, 0xc8, 0xe5, 0x34, 0xbe, 0xb1, + 0x36, 0x38, 0x20, 0xe5, 0x37, 0xbe, 0xb0, 0x0, 0x28, 0x19, 0xe5, 0x37, 0xbe, + 0xb0, 0xff, 0x50, 0x12, 0xe5, 0x35, 0xa, 0x3b, 0xb, 0x34, 0x7a, 0x73, 0x55, + 0x2e, 0xe5, 0x37, 0x7a, 0xb3, 0x55, 0x30, 0x80, 0x6, 0x74, 0x7c, 0x7a, 0xb3, + 0x55, 0x2e, 0xe5, 0x36, 0xda, 0x3b, 0x22, 0xca, 0x3b, 0x7c, 0xfb, 0x7f, + 0x61, 0x7f, 0x40, 0x9f, 0x11, 0x7f, 0x51, 0x7f, 0x71, 0x7a, 0x1f, 0x32, + 0x85, 0x7a, 0x1f, 0x32, 0x89, 0x7a, 0x1f, 0x32, 0x8d, 0xbe, 0xf0, 0xa, 0x78, + 0x6, 0x7e, 0x54, 0x1, 0x3c, 0x80, 0x4, 0x7e, 0x54, 0x2, 0x35, 0x7a, 0x55, + 0x48, 0x6c, 0xee, 0x80, 0x66, 0xa, 0x5e, 0x7f, 0x14, 0x12, 0xeb, 0x59, 0x7a, + 0x55, 0x46, 0xa, 0x5e, 0x7f, 0x16, 0x12, 0xeb, 0x59, 0x7a, 0x55, 0x44, 0x7e, + 0x35, 0x44, 0x12, 0xc7, 0x12, 0x2f, 0x50, 0x7e, 0x65, 0x46, 0x7d, 0x16, + 0x1a, 0x2, 0x1a, 0x0, 0x2f, 0x70, 0x12, 0xc7, 0x12, 0x12, 0xeb, 0x4f, 0x7e, + 0x1f, 0x32, 0x85, 0x2f, 0x10, 0x7a, 0x1f, 0x32, 0x85, 0x7d, 0x16, 0x1a, 0x2, + 0x1a, 0x0, 0x7e, 0x35, 0x46, 0x12, 0xeb, 0x4f, 0x7e, 0x1f, 0x32, 0x89, 0x2f, + 0x10, 0x7a, 0x1f, 0x32, 0x89, 0x7e, 0x15, 0x46, 0x1a, 0x2, 0x1a, 0x0, 0x7e, + 0x35, 0x44, 0x12, 0xeb, 0x4f, 0x7e, 0x1f, 0x32, 0x8d, 0x2f, 0x10, 0x7a, + 0x1f, 0x32, 0x8d, 0xb, 0xe0, 0xbc, 0xfe, 0x38, 0x96, 0xa, 0xdf, 0x6d, 0xcc, + 0x12, 0xaf, 0x9b, 0x7f, 0x51, 0x7f, 0x17, 0x7f, 0x6, 0x12, 0x2a, 0x8d, 0x7f, + 0x71, 0x7e, 0x94, 0x0, 0x64, 0x7e, 0x1f, 0x32, 0x85, 0x7d, 0x19, 0x12, 0x2a, + 0x31, 0x7e, 0x85, 0x48, 0x7d, 0x18, 0x7d, 0xd8, 0x1a, 0x12, 0x1a, 0xc2, + 0x7f, 0x6, 0x12, 0x2a, 0x8d, 0x7a, 0x1f, 0x32, 0x85, 0x7e, 0x1f, 0x32, 0x89, + 0x7d, 0x19, 0x12, 0x2a, 0x31, 0x7f, 0x6, 0x12, 0x2a, 0x8d, 0x7a, 0x1f, 0x32, + 0x89, 0x7e, 0x1f, 0x32, 0x8d, 0x7d, 0x19, 0x12, 0x2a, 0x31, 0x7d, 0x18, + 0x1a, 0x2, 0x1a, 0x0, 0x12, 0x2a, 0x8d, 0x7a, 0x1f, 0x32, 0x8d, 0x7f, 0x15, + 0x7f, 0x7, 0x12, 0x2a, 0x20, 0x7e, 0x6f, 0x32, 0x8d, 0x9f, 0x61, 0x7f, 0x15, + 0x7f, 0x5, 0x12, 0x2a, 0x20, 0x7e, 0x5f, 0x32, 0x85, 0x9f, 0x51, 0x7f, 0x17, + 0x7f, 0x7, 0x12, 0x2a, 0x20, 0x7e, 0x7f, 0x32, 0x89, 0x9f, 0x71, 0xbe, 0x58, + 0x0, 0x0, 0x68, 0x6, 0xbe, 0x78, 0x0, 0x0, 0x78, 0x6, 0x7e, 0x44, 0x0, 0x64, + 0x80, 0x18, 0x7f, 0x16, 0x7d, 0x19, 0x12, 0x2a, 0x31, 0x7f, 0x5, 0x12, 0x2a, + 0x8d, 0x7f, 0x6, 0x12, 0x2a, 0x20, 0x7f, 0x7, 0x12, 0x2a, 0x8d, 0x7d, 0x43, + 0xbe, 0x44, 0x0, 0x0, 0x18, 0x2, 0x6d, 0x44, 0x7c, 0xb9, 0xda, 0x3b, 0x22, + 0x1a, 0x26, 0x1a, 0x24, 0x12, 0x2a, 0x20, 0x7f, 0x1, 0x22, 0x2d, 0x35, 0x7e, + 0x1b, 0x70, 0xa, 0x57, 0x22, 0x7e, 0x73, 0x56, 0xa2, 0xbe, 0x71, 0x2e, 0x22, + 0xca, 0xf8, 0x7f, 0x51, 0x7f, 0x40, 0x7e, 0x37, 0x52, 0x59, 0x7a, 0x37, + 0x32, 0x3b, 0x7e, 0x37, 0x52, 0x57, 0x7a, 0x37, 0x32, 0x3d, 0x7e, 0x37, + 0x52, 0x65, 0x7a, 0x37, 0x32, 0x37, 0x7e, 0x37, 0x52, 0x67, 0x7a, 0x37, + 0x32, 0x39, 0x6c, 0xff, 0x80, 0x1e, 0x7e, 0x34, 0x32, 0x37, 0x7e, 0x14, 0x0, + 0x29, 0x74, 0x9, 0x12, 0x2a, 0xc1, 0x74, 0x2, 0xac, 0xbf, 0x7f, 0x4, 0x2d, + 0x15, 0x7f, 0x15, 0x2d, 0x35, 0x12, 0xeb, 0xbc, 0xb, 0xf0, 0x7e, 0x73, 0x55, + 0x2f, 0xbc, 0x7f, 0x38, 0xda, 0xda, 0xf8, 0x22, 0x7f, 0x71, 0x7f, 0x60, + 0x7e, 0x35, 0x29, 0xbe, 0x34, 0x0, 0x0, 0x38, 0x7, 0x7e, 0x34, 0x0, 0x1, + 0x7a, 0x35, 0x29, 0x7e, 0x35, 0x2b, 0xbe, 0x34, 0x0, 0x0, 0x38, 0x7, 0x7e, + 0x34, 0x0, 0x1, 0x7a, 0x35, 0x2b, 0xb, 0x6a, 0x30, 0x9e, 0x35, 0x2d, 0x6d, + 0x22, 0x7e, 0x33, 0x55, 0x31, 0x12, 0xec, 0x11, 0x7e, 0x15, 0x29, 0x12, + 0x2a, 0x3a, 0x1b, 0x6a, 0x30, 0xb, 0x7a, 0x30, 0x9e, 0x35, 0x2f, 0x6d, 0x22, + 0x7e, 0x33, 0x55, 0x32, 0x12, 0xec, 0x11, 0x7e, 0x15, 0x2b, 0x12, 0x2a, + 0x3a, 0x1b, 0x7a, 0x30, 0x22, 0xa, 0x13, 0x6d, 0x0, 0x2, 0x2a, 0x20, 0xca, + 0x79, 0x6c, 0xaa, 0x7e, 0x90, 0x2, 0xac, 0x9a, 0x7f, 0x70, 0x2d, 0xf4, 0xb, + 0x7a, 0xf0, 0x7d, 0x7f, 0x7c, 0xbf, 0xa, 0xfa, 0x19, 0xbf, 0x55, 0x33, 0x7f, + 0x71, 0x2d, 0xf4, 0xb, 0x7a, 0x40, 0x7c, 0xb9, 0xa, 0x4a, 0x19, 0xb4, 0x55, + 0x53, 0xb, 0xa0, 0xbe, 0xa0, 0x20, 0x40, 0xd4, 0x7e, 0x8, 0x55, 0x33, 0x7e, + 0x18, 0x55, 0x53, 0x74, 0x20, 0x12, 0xe7, 0xa3, 0xda, 0x79, 0x22, 0xca, + 0x3b, 0x7f, 0x61, 0x7f, 0x50, 0x7e, 0x73, 0x55, 0x2f, 0xbe, 0x70, 0x20, + 0x40, 0x52, 0x7e, 0xf0, 0x2, 0x80, 0x3c, 0xa, 0x3f, 0x6d, 0x22, 0x74, 0x5, + 0x2f, 0x11, 0x14, 0x78, 0xfb, 0x7e, 0x33, 0x55, 0x2f, 0xa, 0x13, 0x6d, 0x0, + 0x12, 0x2a, 0x3c, 0x7c, 0xe7, 0xbe, 0xe0, 0x2, 0x50, 0x3, 0x7e, 0xe0, 0x2, + 0xa, 0x6f, 0x1b, 0x64, 0xa, 0x3e, 0x1b, 0x34, 0x7c, 0xc7, 0x7f, 0x5, 0x7c, + 0xbd, 0x12, 0xec, 0xc2, 0x7f, 0x6, 0x7c, 0xbd, 0x7c, 0x7c, 0x12, 0xec, 0xc2, + 0xb, 0xf0, 0x7e, 0x73, 0x55, 0x2f, 0xbc, 0x7f, 0x50, 0xbc, 0x7f, 0x5, 0x7f, + 0x16, 0x12, 0xec, 0x18, 0x80, 0x6, 0x74, 0x7e, 0x7a, 0xb3, 0x55, 0x2e, 0xda, + 0x3b, 0x22, 0x7c, 0x97, 0x7c, 0xab, 0x7f, 0x10, 0x7e, 0x30, 0x2, 0xac, 0x3a, + 0x2d, 0x13, 0x7d, 0x2, 0xb, 0xa, 0x10, 0x7e, 0x10, 0x2, 0xac, 0x19, 0x7f, + 0x71, 0x2d, 0xf0, 0xb, 0x7a, 0x0, 0x7c, 0x21, 0xa5, 0xba, 0x0, 0x14, 0xa, + 0x3, 0x1b, 0x7a, 0x0, 0xbc, 0x9a, 0x68, 0x24, 0x6d, 0x44, 0x74, 0x2, 0xa4, + 0x2d, 0x35, 0x1b, 0x1a, 0x40, 0x22, 0xbc, 0x9a, 0x68, 0x15, 0xa, 0x2, 0xa, + 0x13, 0x2d, 0x10, 0xe, 0x14, 0x1b, 0x7a, 0x10, 0x6d, 0x11, 0x74, 0x2, 0xa4, + 0x2d, 0x35, 0x1b, 0x1a, 0x10, 0x22, 0x7d, 0x41, 0x7d, 0x2, 0x7c, 0x6b, 0x74, + 0x4, 0xac, 0xb6, 0x49, 0x15, 0x4e, 0x88, 0x49, 0x25, 0x4e, 0x8a, 0x74, 0x4, + 0xac, 0xb7, 0x49, 0xf5, 0x4e, 0x88, 0x49, 0x55, 0x4e, 0x8a, 0x7d, 0x31, + 0x9d, 0x3f, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x4, 0x9d, 0x1f, 0x80, 0x4, 0x6d, + 0x11, 0x9d, 0x13, 0x7d, 0x32, 0x9d, 0x35, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x4, + 0x9d, 0x25, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x23, 0x9d, 0x24, 0x9d, 0x10, 0xbe, + 0x24, 0x0, 0x0, 0x8, 0x4, 0x7d, 0x32, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x32, + 0x7e, 0x54, 0xe, 0xc, 0x7e, 0x44, 0x0, 0xff, 0xb, 0x2a, 0x20, 0xbd, 0x32, + 0x50, 0x14, 0xbe, 0x14, 0x0, 0x0, 0x8, 0x4, 0x7d, 0x31, 0x80, 0x4, 0x6d, + 0x33, 0x9d, 0x31, 0xbd, 0x32, 0x50, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0xb, 0xa, + 0x30, 0x6c, 0x77, 0x1b, 0xa, 0x30, 0xa, 0x2b, 0xb, 0x24, 0x2, 0x5d, 0x59, + 0xb, 0xa, 0x30, 0x30, 0x2, 0x5, 0x5e, 0x60, 0xf7, 0x80, 0x3, 0x4e, 0x60, + 0x8, 0x1b, 0xa, 0x30, 0x22, 0x2d, 0x23, 0x3e, 0x24, 0xa, 0x3b, 0x9d, 0x23, + 0xe5, 0x29, 0xa, 0x3b, 0x9d, 0x23, 0xbe, 0x24, 0x0, 0x0, 0x28, 0x3, 0x12, + 0x6b, 0x5f, 0x22, 0xb, 0xa, 0x30, 0x5e, 0x70, 0x3, 0xb4, 0x3, 0x5, 0x4e, + 0x70, 0xc, 0x80, 0x6, 0xb4, 0x4, 0x3, 0x4e, 0x70, 0x10, 0x1b, 0xa, 0x30, + 0x22, 0xb, 0xa, 0x30, 0x5e, 0x60, 0xdf, 0x1b, 0xa, 0x30, 0x30, 0x1, 0x9, + 0xb, 0xa, 0x30, 0x4e, 0x60, 0x20, 0x1b, 0xa, 0x30, 0x22, 0xb, 0xa, 0x30, + 0x12, 0x5f, 0xf3, 0xa2, 0x1, 0xe4, 0x33, 0xa, 0x2b, 0x3e, 0x24, 0x2, 0x5d, + 0x59, 0x74, 0x8, 0xac, 0xbe, 0x9, 0xb5, 0x3, 0xb2, 0x12, 0x6b, 0xf0, 0x79, + 0x50, 0x0, 0x4, 0x22, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x34, 0xcb, + 0x6d, 0x0, 0x7e, 0x70, 0x5, 0xac, 0x7e, 0x2e, 0x34, 0x3, 0xcc, 0x6d, 0x22, + 0x74, 0x8, 0xac, 0xbe, 0x9, 0xb5, 0x3, 0xb2, 0x12, 0x6f, 0xa9, 0x7e, 0x30, + 0x6, 0xac, 0x3f, 0x2e, 0x14, 0x34, 0x27, 0x6d, 0x0, 0x7e, 0x70, 0x5, 0xac, + 0x7e, 0x2e, 0x34, 0x3, 0xcc, 0x22, 0xa9, 0xd6, 0xcb, 0x69, 0x30, 0x0, 0x4, + 0x7e, 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, 0x4, 0x69, 0x30, 0x0, 0x6, 0x7e, + 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, 0x6, 0x69, 0x30, 0x0, 0x8, 0x7e, 0x27, + 0x56, 0xba, 0x59, 0x32, 0x0, 0x8, 0x22, 0x7e, 0x2f, 0x56, 0xb2, 0xb, 0x2a, + 0x30, 0x5e, 0x70, 0xfd, 0x1b, 0x2a, 0x30, 0x7e, 0x34, 0x0, 0x1, 0x7e, 0x2f, + 0x56, 0xb2, 0x79, 0x32, 0x0, 0x4, 0x7e, 0x2f, 0x56, 0xb2, 0xb, 0x2a, 0x30, + 0x4e, 0x70, 0x1, 0x1b, 0x2a, 0x30, 0xe4, 0x7a, 0xb3, 0x56, 0xb1, 0x22, 0x7e, + 0xf, 0x56, 0xb2, 0xb, 0xa, 0x30, 0x5e, 0x70, 0xfd, 0x1b, 0xa, 0x30, 0x7e, + 0x34, 0x0, 0x1, 0x7e, 0xf, 0x56, 0xb2, 0x79, 0x30, 0x0, 0x4, 0x7e, 0xf, + 0x56, 0xb2, 0xb, 0xa, 0x30, 0x4e, 0x70, 0x1, 0x1b, 0xa, 0x30, 0xe4, 0x7a, + 0xb3, 0x56, 0xb1, 0x22, 0x12, 0x6f, 0xee, 0x7e, 0x30, 0x3c, 0xac, 0x3f, + 0x7d, 0x31, 0x2e, 0x34, 0x34, 0xe1, 0x6d, 0x22, 0x7a, 0x1d, 0x29, 0x7e, 0x4, + 0x0, 0x12, 0x7a, 0x5, 0x2d, 0x2e, 0x14, 0x34, 0xe5, 0x6d, 0x0, 0x22, 0x7d, + 0xf3, 0x3e, 0xf4, 0x2d, 0xf1, 0x7d, 0xe0, 0xb, 0x7a, 0xd0, 0x7d, 0xc3, 0x3e, + 0xc4, 0x7f, 0x72, 0x2d, 0xfc, 0x1b, 0x7a, 0xd0, 0xb, 0x34, 0x22, 0x12, 0x0, + 0x26, 0x7d, 0x3e, 0x2e, 0x34, 0x0, 0x7, 0x74, 0x3c, 0xac, 0xbf, 0x49, 0x25, + 0x34, 0xc3, 0x12, 0x39, 0xab, 0xb, 0xf0, 0xbe, 0xf0, 0x4, 0x22, 0x7f, 0x70, + 0x7d, 0x12, 0xd2, 0xcc, 0x7e, 0x4, 0x0, 0x3, 0x7e, 0x2f, 0x56, 0xad, 0x1b, + 0x2a, 0x0, 0x7e, 0x2f, 0x56, 0xad, 0x79, 0x32, 0x0, 0x6, 0x22, 0x7a, 0xb3, + 0x54, 0xf7, 0x7a, 0xb3, 0x54, 0xf8, 0x7a, 0xb3, 0x54, 0xf9, 0x7a, 0xb3, + 0x54, 0xfd, 0x74, 0xff, 0x7a, 0xb3, 0x54, 0xfe, 0xe4, 0x22, 0x7e, 0xf, 0x56, + 0xad, 0x69, 0x30, 0x0, 0x4, 0x5e, 0x34, 0x0, 0x2, 0x22, 0x7e, 0x2f, 0x56, + 0xad, 0x69, 0x32, 0x0, 0x4, 0x5e, 0x34, 0x0, 0x2, 0x22, 0x7e, 0x34, 0x0, + 0x2, 0x7e, 0xf, 0x56, 0xad, 0x79, 0x30, 0x0, 0x4, 0x22, 0xd2, 0xcc, 0x7e, + 0x24, 0x0, 0x3, 0x7e, 0xf, 0x56, 0xad, 0x1b, 0xa, 0x20, 0x7e, 0xf, 0x56, + 0xad, 0x79, 0x30, 0x0, 0x6, 0x22, 0x7e, 0x27, 0x34, 0x83, 0x12, 0x3f, 0x20, + 0x7e, 0x34, 0x0, 0x27, 0x7e, 0x27, 0x34, 0x51, 0x22, 0x6d, 0x33, 0x7e, 0xf, + 0x39, 0xfc, 0x79, 0x30, 0x0, 0x12, 0x22, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, + 0x2a, 0x7e, 0x34, 0x0, 0x20, 0x7e, 0x27, 0x3f, 0x2a, 0x22, 0x7e, 0xb, 0x70, + 0x7c, 0x47, 0x6c, 0x55, 0x29, 0x70, 0x0, 0x1, 0xa, 0x37, 0x2d, 0x32, 0x7e, + 0x27, 0x56, 0xba, 0x22, 0x12, 0x40, 0xbe, 0x7d, 0x3b, 0x2e, 0x34, 0x0, 0xb, + 0x7e, 0x30, 0x6, 0xac, 0x3f, 0x2e, 0x14, 0x34, 0x27, 0x22, 0xe4, 0x7a, 0xb3, + 0x56, 0xb1, 0x7e, 0x2f, 0x56, 0xb2, 0x69, 0x32, 0x0, 0x4, 0x5e, 0x34, 0x0, + 0x1, 0x22, 0xe4, 0x7a, 0xb3, 0x56, 0xb1, 0x7e, 0x1f, 0x56, 0xb2, 0x69, 0x31, + 0x0, 0x4, 0x5e, 0x34, 0x0, 0x1, 0x22, 0x74, 0x8, 0xa4, 0x7d, 0xf5, 0xb, + 0xf6, 0x74, 0xee, 0xac, 0xbf, 0x7d, 0xe5, 0x2e, 0xe4, 0x1, 0x0, 0x22, 0xe5, + 0xc3, 0x7a, 0xb3, 0x39, 0xb5, 0xe5, 0xc3, 0x54, 0xf8, 0x4e, 0xb3, 0x39, + 0xb4, 0xf5, 0xc3, 0x22, 0x7d, 0x27, 0x3e, 0x24, 0x49, 0x62, 0x68, 0xc9, + 0x90, 0x1, 0x90, 0xe4, 0x93, 0x7f, 0x7, 0x22, 0x74, 0x3, 0x12, 0x3f, 0xc8, + 0x90, 0x1, 0x90, 0xe4, 0x93, 0x22, 0x7d, 0x3f, 0x2e, 0x34, 0x0, 0x18, 0x74, + 0x3c, 0xac, 0xbf, 0x49, 0x25, 0x34, 0xe5, 0x22, 0x7d, 0x3f, 0x2e, 0x34, 0x0, + 0x16, 0x74, 0x3c, 0xac, 0xbf, 0x49, 0x25, 0x34, 0xe1, 0x22, 0x7e, 0xb, 0xa0, + 0x7c, 0x4a, 0x6c, 0x55, 0x29, 0xa0, 0x0, 0x1, 0xa, 0x3a, 0x22, 0x7d, 0x2a, + 0x12, 0x40, 0xbe, 0x7e, 0x34, 0x1, 0x0, 0x7d, 0x1a, 0x3e, 0x14, 0x22, 0x7e, + 0x34, 0x0, 0x2, 0x7e, 0x2f, 0x56, 0xad, 0x79, 0x32, 0x0, 0x4, 0x22, 0x74, + 0x1, 0x7a, 0xb3, 0x56, 0xb1, 0x22, 0x7e, 0x1f, 0x56, 0xad, 0x69, 0x31, 0x0, + 0x4, 0x5e, 0x34, 0x0, 0x2, 0x22, 0x74, 0xee, 0xac, 0xbf, 0x7d, 0xb5, 0x2e, + 0xb4, 0x1, 0x0, 0x7d, 0x3b, 0x22, 0x7e, 0x10, 0x2, 0xac, 0x15, 0x7e, 0x30, + 0x14, 0xac, 0x3a, 0x2d, 0x10, 0x22, 0x12, 0x3f, 0xaa, 0x7a, 0x37, 0x3f, + 0x2c, 0x7e, 0x34, 0x0, 0x20, 0x22, 0x54, 0x1, 0xa, 0x5b, 0xc4, 0x23, 0x54, + 0xe0, 0x7c, 0xab, 0xe4, 0x22, 0xb, 0x16, 0xb, 0xa, 0x30, 0x4e, 0x60, 0x10, + 0x22, 0x3e, 0x34, 0x3e, 0x34, 0x3e, 0x34, 0x3e, 0x34, 0x22, 0x7e, 0x30, + 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x34, 0xe1, 0x6d, 0x0, 0x22, 0x7e, 0x24, 0x0, + 0x4, 0x12, 0x40, 0xbe, 0x7e, 0x34, 0x1, 0x4, 0x22, 0xc2, 0x19, 0xc2, 0x18, + 0x7e, 0xb3, 0x56, 0x21, 0xbe, 0xb0, 0x1, 0x22, 0x7a, 0xb3, 0x54, 0xf4, 0x74, + 0xff, 0x7a, 0xb3, 0x54, 0xf5, 0xe4, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x54, 0x15, + 0x7a, 0xb3, 0x56, 0xa7, 0x22, 0x7e, 0xb3, 0x54, 0x60, 0x44, 0x80, 0x7a, + 0xb3, 0x54, 0x60, 0x22, 0x5e, 0x60, 0xbf, 0x1b, 0x28, 0x30, 0x22, 0x7e, 0xf, + 0x2d, 0x2a, 0x2d, 0x12, 0xb, 0xa, 0x20, 0x22, 0x7e, 0xa4, 0x0, 0x9, 0x90, + 0x1, 0x90, 0xe4, 0x93, 0x22, 0x2e, 0x14, 0x34, 0xc1, 0x6d, 0x0, 0x22, 0x7d, + 0x36, 0x12, 0x3f, 0xaa, 0x7d, 0x27, 0x3e, 0x24, 0x22, 0x74, 0x1, 0x12, 0x6a, + 0xf9, 0x7e, 0x8, 0x3f, 0x26, 0x22, 0x7a, 0xb3, 0x54, 0xf6, 0xd2, 0x26, 0xd2, + 0x25, 0x22, 0x3e, 0x34, 0x2e, 0x34, 0xa0, 0x0, 0x6d, 0x22, 0x22, 0x7d, 0x23, + 0x9d, 0x25, 0xbe, 0x24, 0x0, 0x0, 0x22, 0x7e, 0x8, 0x34, 0x83, 0x7e, 0x18, + 0x34, 0x51, 0x22, 0x7e, 0x8, 0x34, 0x43, 0x7e, 0x18, 0x34, 0x51, 0x22, 0x74, + 0x8, 0xac, 0xbe, 0x9, 0xf5, 0x3, 0xb0, 0x22, 0x7e, 0x34, 0x1, 0x0, 0x7e, + 0x8, 0x68, 0xb9, 0x22, 0x7e, 0xa7, 0x68, 0xad, 0x7e, 0xb7, 0x68, 0xaf, 0x22, + 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x1a, 0x22, 0x7d, 0x23, 0x9d, 0x21, + 0xbe, 0x24, 0x0, 0x0, 0x22, 0x74, 0x2, 0xac, 0xbf, 0x9, 0x5, 0x2e, 0x77, + 0x22, 0x7e, 0x34, 0x3a, 0x0, 0x7a, 0x37, 0x39, 0xe6, 0x22, 0x7e, 0x1f, 0x2d, + 0x2e, 0x7a, 0x37, 0x39, 0xe4, 0x22, 0x7e, 0x73, 0x54, 0x66, 0x7a, 0x73, + 0x74, 0x9, 0x22, 0x7e, 0x34, 0x0, 0x19, 0x7e, 0x27, 0x3f, 0x5a, 0x22, 0x7e, + 0x34, 0x0, 0x18, 0x7e, 0x27, 0x3f, 0x58, 0x22, 0x7e, 0x34, 0x0, 0x16, 0x7e, + 0x27, 0x3f, 0x52, 0x22, 0x7e, 0x34, 0x0, 0x14, 0x7e, 0x27, 0x3f, 0x46, 0x22, + 0x7e, 0x34, 0x0, 0x21, 0x7e, 0x27, 0x3f, 0x4e, 0x22, 0x7e, 0x34, 0x0, 0x21, + 0x7e, 0x27, 0x3f, 0x4c, 0x22, 0x7e, 0x34, 0x0, 0x26, 0x7e, 0x27, 0x3f, 0x30, + 0x22, 0x7e, 0x34, 0x0, 0x1b, 0x7e, 0x27, 0x3f, 0x44, 0x22, 0x7e, 0x34, 0x0, + 0x28, 0x7e, 0x27, 0x3f, 0x34, 0x22, 0x7e, 0x34, 0x0, 0x2a, 0x7e, 0x27, 0x3f, + 0x38, 0x22, 0x7e, 0x34, 0x0, 0x1, 0x7e, 0x27, 0x3f, 0x36, 0x22, 0x7e, 0x34, + 0x0, 0x27, 0x7e, 0x27, 0x3f, 0x32, 0x22, 0x7e, 0x34, 0x0, 0x25, 0x7e, 0x27, + 0x3f, 0x2e, 0x22, 0x7e, 0x34, 0x0, 0x1f, 0x7e, 0x27, 0x3f, 0x76, 0x22, 0x7e, + 0x34, 0x1, 0x35, 0x7e, 0x8, 0x2e, 0x77, 0x22, 0xc2, 0xa, 0x12, 0x5e, 0x72, + 0xc2, 0x0, 0x22, 0x7e, 0x73, 0x56, 0x2a, 0xbe, 0x70, 0x64, 0x22, 0x90, 0x1, + 0x8a, 0xe4, 0x93, 0x24, 0xfe, 0x22, 0x49, 0x25, 0x34, 0xc1, 0x2, 0x39, 0xab, + 0x7e, 0xa3, 0x56, 0x21, 0x74, 0x8, 0xa4, 0x22, 0x12, 0x3f, 0x10, 0x7e, 0x34, + 0x0, 0x2, 0x22, 0x12, 0x3f, 0x10, 0x7e, 0x34, 0x0, 0x17, 0x22, 0x7e, 0x24, + 0x43, 0x21, 0x2, 0x39, 0xab, 0x5e, 0x24, 0x7d, 0xfd, 0x4e, 0x40, 0x58, 0x22, diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_sample.i b/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_sample.i new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_sample.i diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/include/pramboot/FT8719_Pramboot_V0.5_20171221.i b/drivers/input/touchscreen/focal_ft8719_d2t/include/pramboot/FT8719_Pramboot_V0.5_20171221.i new file mode 100644 index 000000000000..d4594a30959e --- /dev/null +++ b/drivers/input/touchscreen/focal_ft8719_d2t/include/pramboot/FT8719_Pramboot_V0.5_20171221.i @@ -0,0 +1,233 @@ +0x2, 0x8, 0x69, 0x22, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2, 0xb, 0x5a, + 0x6d, 0x11, 0x7e, 0x18, 0xc6, 0x6, 0x1b, 0x1a, 0x10, 0x7e, 0x18, 0xc6, 0xe, + 0xb, 0x1a, 0x30, 0x4d, 0x33, 0x78, 0xf5, 0x7e, 0x18, 0xc6, 0x8, 0xb, 0x1a, + 0x50, 0x22, 0xff, 0x2, 0x7, 0xd8, 0x7e, 0x8, 0xc6, 0x0, 0xb, 0xa, 0x30, + 0x70, 0x5, 0x5e, 0x70, 0xef, 0x80, 0x3, 0x4e, 0x70, 0x10, 0x1b, 0xa, 0x30, + 0x22, 0x2, 0xb, 0x8a, 0xca, 0xf8, 0xe4, 0x7a, 0xb3, 0x2, 0xeb, 0x7e, 0x34, + 0xf0, 0x0, 0x7e, 0x24, 0x0, 0x1, 0x7a, 0x1f, 0x2, 0x55, 0x74, 0x1f, 0x12, + 0xa, 0x34, 0x7e, 0x34, 0xf0, 0x0, 0x7e, 0x24, 0x0, 0x1, 0x12, 0x9, 0xb5, + 0xe4, 0x33, 0x7c, 0xfb, 0xbe, 0xf0, 0x1, 0x78, 0xa, 0x7e, 0xb3, 0x2, 0xeb, + 0x44, 0x2, 0x7a, 0xb3, 0x2, 0xeb, 0x6c, 0xaa, 0xa, 0x3a, 0x19, 0xa3, 0x2, + 0xe3, 0xb, 0xa0, 0xbe, 0xa0, 0x8, 0x78, 0xf3, 0x7e, 0x34, 0x0, 0x8, 0x7a, + 0x37, 0x2, 0x59, 0x7e, 0x1f, 0x2, 0x55, 0x7e, 0x8, 0x2, 0xe3, 0x12, 0x3, + 0x71, 0x6c, 0xaa, 0x6c, 0x77, 0xa, 0x2a, 0x19, 0x72, 0x2, 0xe3, 0xb, 0xa0, + 0xbe, 0xa0, 0x8, 0x78, 0xf3, 0x7e, 0x34, 0x0, 0x8, 0x7a, 0x37, 0x2, 0xde, + 0x7e, 0x1f, 0x2, 0x55, 0x7e, 0x8, 0x2, 0xe3, 0x12, 0xb, 0x6b, 0x7e, 0xf0, + 0x1, 0x6c, 0xaa, 0xa, 0x3a, 0x9, 0xb3, 0x2, 0xe3, 0xbc, 0xba, 0x68, 0x4, + 0x6c, 0xff, 0x80, 0x7, 0xb, 0xa0, 0xbe, 0xa0, 0x8, 0x40, 0xeb, 0xbe, 0xf0, + 0x1, 0x78, 0xa, 0x7e, 0xb3, 0x2, 0xeb, 0x44, 0x4, 0x7a, 0xb3, 0x2, 0xeb, + 0x7e, 0xb3, 0x2, 0xeb, 0x44, 0x1, 0x7a, 0xb3, 0x2, 0xeb, 0xda, 0xf8, 0x22, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb, 0xe0, 0xf4, 0x1f, 0xeb, + 0x43, 0x14, 0xbc, 0xcd, 0xe3, 0x32, 0x1c, 0xff, 0x0, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7c, 0x6b, 0xc2, 0x2, 0x7e, 0xb3, 0x2, 0x39, 0x14, 0x78, 0x3, + 0x2, 0x3, 0x6e, 0x1b, 0xb1, 0x78, 0x3, 0x2, 0x2, 0x56, 0x1b, 0xb1, 0x78, + 0x3, 0x2, 0x3, 0x6e, 0x14, 0x78, 0x3, 0x2, 0x3, 0x6e, 0x14, 0x78, 0x3, 0x2, + 0x2, 0xa6, 0x1b, 0xb1, 0x78, 0x3, 0x2, 0x2, 0xcd, 0x24, 0xf9, 0x78, 0x3, + 0x2, 0x2, 0xe4, 0x24, 0xaf, 0x78, 0x3, 0x2, 0x3, 0x52, 0x24, 0xfd, 0x68, + 0x41, 0x14, 0x78, 0x3, 0x2, 0x2, 0xe9, 0x14, 0x78, 0x3, 0x2, 0x3, 0x6e, + 0x1b, 0xb2, 0x78, 0x3, 0x2, 0x3, 0x6e, 0x24, 0xda, 0x68, 0x2d, 0x24, 0xe6, + 0x68, 0x26, 0x24, 0xeb, 0x68, 0x41, 0x24, 0xf3, 0x78, 0x3, 0x2, 0x3, 0x6e, + 0x24, 0xe4, 0x78, 0x3, 0x2, 0x3, 0x60, 0x14, 0x78, 0x3, 0x2, 0x3, 0x6e, + 0x24, 0xf4, 0x78, 0x3, 0x2, 0x3, 0x6e, 0x24, 0xa0, 0x68, 0x3, 0x2, 0x3, + 0x70, 0x2, 0x3, 0x5a, 0xbe, 0x60, 0x4, 0x50, 0xb, 0xe4, 0x7a, 0xb3, 0x2, + 0xf1, 0xa, 0x26, 0x19, 0x72, 0x2, 0x3b, 0xa5, 0xbe, 0x0, 0x2, 0x80, 0x3, + 0x2, 0x3, 0x70, 0xd2, 0x2, 0x22, 0x7c, 0xb6, 0x24, 0x0, 0x78, 0x3, 0x2, 0x3, + 0x70, 0x1b, 0xb1, 0x68, 0x1e, 0x14, 0x68, 0x1e, 0x14, 0x68, 0x1e, 0x14, + 0x68, 0x1e, 0xb, 0xb2, 0x78, 0x35, 0x30, 0x1, 0x7, 0x7e, 0x8, 0x0, 0x21, + 0x2, 0x2, 0x73, 0x7e, 0x8, 0x1, 0x2d, 0x2, 0x2, 0x73, 0x2, 0x3, 0xf, 0x2, + 0x3, 0x16, 0x2, 0x3, 0x2f, 0xa, 0x27, 0x7e, 0xf, 0x2, 0x50, 0xb, 0x16, 0xb, + 0xa, 0x30, 0x2d, 0x32, 0x1b, 0xa, 0x30, 0x6d, 0x33, 0x7e, 0xf, 0x2, 0x50, + 0x79, 0x30, 0x0, 0x6, 0x22, 0x7c, 0x57, 0x6e, 0x53, 0x2, 0xf1, 0x7a, 0x53, + 0x2, 0xf1, 0x7e, 0x2f, 0x2, 0x50, 0x2e, 0x54, 0x0, 0x6, 0xb, 0x2a, 0x20, + 0x7d, 0x12, 0xb, 0x14, 0x1b, 0x2a, 0x10, 0x7e, 0xf, 0x2, 0x50, 0x2d, 0x12, + 0x39, 0x70, 0x0, 0x8, 0x7e, 0xf, 0x2, 0x50, 0x69, 0x50, 0x0, 0x4, 0x69, + 0x20, 0x0, 0x6, 0xbd, 0x25, 0x50, 0x3, 0x2, 0x3, 0x70, 0xb2, 0x1, 0x7a, 0xf, + 0x2, 0x4a, 0x7e, 0x34, 0x0, 0x2, 0x2, 0x3, 0x69, 0x7c, 0xb6, 0x1b, 0xb1, + 0x68, 0x1e, 0x14, 0x68, 0x1e, 0xb, 0xb1, 0x68, 0x3, 0x2, 0x3, 0x70, 0x30, + 0x1, 0x6, 0x7e, 0x8, 0x0, 0x21, 0x80, 0x4, 0x7e, 0x8, 0x1, 0x2d, 0x7a, 0xf, + 0x2, 0x50, 0x2, 0x2, 0xfd, 0x2, 0x3, 0xf, 0xa, 0x57, 0x6d, 0x44, 0x7e, 0xf, + 0x2, 0x50, 0x69, 0x30, 0x0, 0x2, 0xb, 0xa, 0x20, 0x2f, 0x12, 0x79, 0x30, + 0x0, 0x2, 0x1b, 0xa, 0x20, 0x7e, 0x1f, 0x2, 0x50, 0x7a, 0x1f, 0x2, 0x4a, + 0xd2, 0x2, 0x7e, 0x34, 0x0, 0x1, 0x2, 0x3, 0x69, 0x75, 0xe6, 0x0, 0xe4, + 0x7e, 0x34, 0x1, 0x4, 0x7e, 0x24, 0x0, 0xff, 0x7a, 0x1b, 0xb0, 0x7e, 0x34, + 0x1, 0x5, 0x7a, 0x1b, 0xb0, 0x7e, 0x34, 0x1, 0x8, 0x7a, 0x1b, 0xb0, 0x7e, + 0x34, 0x1, 0x9, 0x7a, 0x1b, 0xb0, 0xd2, 0x3, 0x22, 0xa5, 0xbe, 0x1, 0x5, + 0x7a, 0x73, 0x2, 0x4e, 0x22, 0xa5, 0xbe, 0x2, 0x2, 0x80, 0x3, 0x2, 0x3, + 0x70, 0x7a, 0x73, 0x2, 0x3a, 0x22, 0x7a, 0x73, 0x2, 0x47, 0x22, 0x1b, 0x61, + 0x68, 0x22, 0x1b, 0x60, 0x68, 0x25, 0x1b, 0x60, 0x68, 0x3a, 0x1b, 0x60, + 0x68, 0x43, 0xb, 0x62, 0x78, 0x73, 0xa, 0x37, 0x7d, 0x3, 0x6d, 0x11, 0x7e, + 0x1f, 0x2, 0x50, 0x79, 0x11, 0x0, 0x2, 0x1b, 0x1a, 0x0, 0x22, 0xa, 0x57, + 0x7c, 0xab, 0xe4, 0x80, 0x2, 0xa, 0x57, 0x6d, 0x44, 0x7e, 0xf, 0x2, 0x50, + 0x69, 0x30, 0x0, 0x2, 0xb, 0xa, 0x20, 0x2f, 0x12, 0x79, 0x30, 0x0, 0x2, + 0x1b, 0xa, 0x20, 0x22, 0x7c, 0x67, 0x6c, 0x77, 0x7e, 0xf, 0x2, 0x50, 0x79, + 0x30, 0x0, 0x4, 0x22, 0xa, 0x27, 0x7e, 0xf, 0x2, 0x50, 0xb, 0x16, 0xb, 0xa, + 0x30, 0x2d, 0x32, 0x1b, 0xa, 0x30, 0x7e, 0x34, 0x0, 0x3, 0x80, 0x17, 0x7e, + 0x34, 0x0, 0x4, 0x7a, 0x37, 0x2, 0x45, 0xe4, 0x7a, 0xb3, 0x2, 0xf1, 0x22, + 0xe4, 0x7a, 0xb3, 0x2, 0xeb, 0x7e, 0x34, 0x0, 0x5, 0x7a, 0x37, 0x2, 0x45, + 0x22, 0xd2, 0x2, 0x22, 0xca, 0x79, 0x7f, 0x50, 0x7f, 0x41, 0x7e, 0x47, 0x2, + 0x59, 0x7e, 0x18, 0xc6, 0x0, 0xb, 0x1a, 0x50, 0x54, 0x1f, 0x1b, 0x1a, 0x50, + 0x7f, 0x14, 0x5e, 0x34, 0x0, 0x7f, 0x7d, 0x53, 0x7e, 0x74, 0x0, 0x80, 0x9d, + 0x75, 0xbd, 0x47, 0x38, 0x2, 0x80, 0x3c, 0x7a, 0x77, 0x2, 0x5b, 0x7f, 0x14, + 0x7f, 0x5, 0x12, 0x8, 0xf6, 0x9d, 0x47, 0x7d, 0x37, 0x6d, 0x22, 0x2f, 0x41, + 0x2d, 0xb7, 0x80, 0x1b, 0x7e, 0x54, 0x0, 0x80, 0x7a, 0x57, 0x2, 0x5b, 0x7f, + 0x14, 0x7f, 0x5, 0x12, 0x8, 0xf6, 0x9e, 0x44, 0x0, 0x80, 0x2e, 0xb4, 0x0, + 0x80, 0x2e, 0x48, 0x0, 0x80, 0xbe, 0x44, 0x0, 0x80, 0x50, 0xdf, 0x4d, 0x44, + 0x68, 0xb, 0x7a, 0x47, 0x2, 0x5b, 0x7f, 0x14, 0x7f, 0x5, 0x12, 0x8, 0xf6, + 0xd3, 0xda, 0x79, 0x22, 0xd2, 0x5, 0x12, 0xb, 0x45, 0xe4, 0x12, 0x0, 0x2e, + 0x74, 0x60, 0x12, 0xb, 0x4, 0x74, 0x1, 0x12, 0x0, 0x2e, 0x12, 0xa, 0xb9, + 0x40, 0xfb, 0x22, 0xff, 0x56, 0x30, 0x2e, 0x32, 0x44, 0x65, 0x63, 0x20, + 0x32, 0x31, 0x20, 0x32, 0x30, 0x31, 0x37, 0x0, 0x46, 0x54, 0x53, 0x38, 0x37, + 0x31, 0x39, 0x5f, 0x70, 0x72, 0x61, 0x6d, 0x62, 0x6f, 0x6f, 0x74, 0x0, 0x0, + 0x12, 0xb, 0x7b, 0x7e, 0x37, 0x2, 0x45, 0x1b, 0x34, 0x68, 0x65, 0x1b, 0x35, + 0x78, 0x3, 0x2, 0x4, 0xc5, 0x1b, 0x34, 0x78, 0x3, 0x2, 0x4, 0xf3, 0x1b, + 0x34, 0x78, 0x3, 0x2, 0x5, 0x8b, 0x2e, 0x34, 0x0, 0x3, 0x68, 0x3, 0x2, 0x5, + 0xa3, 0x6d, 0x33, 0x7a, 0x37, 0x2, 0x45, 0x7a, 0x37, 0x2, 0x48, 0x30, 0x4, + 0x5, 0x12, 0xa, 0xed, 0xc2, 0x4, 0x7e, 0xf, 0x2, 0x4a, 0x69, 0x30, 0x0, 0x4, + 0x7a, 0x37, 0x2, 0x59, 0x69, 0x30, 0x0, 0x2, 0xb, 0xa, 0x20, 0x2e, 0x14, + 0x0, 0x8, 0x12, 0x3, 0x71, 0xd2, 0x4, 0x7e, 0x2f, 0x2, 0x4a, 0x69, 0x12, + 0x0, 0x4, 0x69, 0x32, 0x0, 0x2, 0xb, 0x2a, 0x20, 0x12, 0x7, 0x85, 0x2e, + 0x34, 0x10, 0x0, 0x2, 0x5, 0x85, 0x6d, 0x33, 0x7a, 0x37, 0x2, 0x45, 0x7e, + 0x34, 0x1, 0x0, 0x7a, 0x37, 0x2, 0xde, 0x7e, 0xf, 0x2, 0x4a, 0x69, 0x30, + 0x0, 0x2, 0xb, 0xa, 0x20, 0x2e, 0x14, 0x0, 0x8, 0x12, 0xb, 0x6b, 0x20, 0x0, + 0x3, 0x2, 0x5, 0xa3, 0x7e, 0x1f, 0x2, 0x4a, 0x29, 0xb1, 0x0, 0x8, 0xf5, + 0x91, 0x2, 0x5, 0xa3, 0x6d, 0x33, 0x7a, 0x37, 0x2, 0x45, 0x7a, 0x37, 0x2, + 0x48, 0x7e, 0x18, 0x2, 0xf1, 0x7a, 0x1f, 0x2, 0x57, 0x7e, 0xf, 0x2, 0x4a, + 0x69, 0x30, 0x0, 0x2, 0xb, 0xa, 0x20, 0x69, 0x10, 0x0, 0x4, 0x12, 0x5, 0xbd, + 0x12, 0xa, 0xed, 0x7e, 0x34, 0xf0, 0x55, 0x2, 0x5, 0x85, 0x6d, 0x33, 0x7a, + 0x37, 0x2, 0x45, 0x7a, 0x37, 0x2, 0x48, 0x7e, 0xd3, 0x2, 0x4e, 0xbe, 0xd0, + 0xa, 0x78, 0x15, 0xe4, 0x12, 0x8, 0xb0, 0x7e, 0xf0, 0x10, 0x7c, 0xbf, 0x12, + 0xa, 0x34, 0xb, 0xf0, 0xbe, 0xf0, 0x17, 0x78, 0xf4, 0x80, 0x63, 0xbe, 0xd0, + 0xb, 0x78, 0x11, 0x7e, 0xe0, 0x2, 0x7c, 0xbe, 0x12, 0xa, 0x34, 0xb, 0xe0, + 0xbe, 0xe0, 0x17, 0x78, 0xf4, 0x80, 0x4d, 0xbe, 0xd0, 0xc, 0x78, 0x6, 0xe4, + 0x12, 0xa, 0x34, 0x80, 0x42, 0xbe, 0xd0, 0xd, 0x78, 0x11, 0x7e, 0xd0, 0x12, + 0x7c, 0xbd, 0x12, 0xa, 0x34, 0xb, 0xd0, 0xbe, 0xd0, 0x15, 0x78, 0xf4, 0x80, + 0x2c, 0x7e, 0x73, 0x2, 0x4e, 0xa, 0x37, 0x9e, 0x34, 0x0, 0x80, 0x7a, 0x73, + 0x2, 0x54, 0x6c, 0xcc, 0x80, 0x12, 0x7e, 0xb3, 0x2, 0x54, 0x12, 0xa, 0x34, + 0x7e, 0xb3, 0x2, 0x54, 0x4, 0x7a, 0xb3, 0x2, 0x54, 0xb, 0xc0, 0x7e, 0x73, + 0x2, 0x3a, 0xbc, 0x7c, 0x38, 0xe6, 0x12, 0xa, 0xed, 0x7e, 0x34, 0xf0, 0xaa, + 0x7a, 0x37, 0x2, 0x48, 0x80, 0x18, 0x6d, 0x33, 0x7a, 0x37, 0x2, 0x45, 0x7a, + 0x37, 0x2, 0x48, 0x12, 0x0, 0x46, 0x7e, 0x34, 0xf0, 0xaa, 0x7a, 0x37, 0x2, + 0x48, 0x12, 0xa, 0xed, 0x20, 0x3, 0x3, 0x2, 0x4, 0x25, 0x7e, 0x34, 0x13, + 0x88, 0x12, 0xa, 0x9a, 0x7e, 0x34, 0x13, 0x88, 0x12, 0xa, 0x9a, 0x75, 0xe9, + 0xff, 0x2, 0x4, 0x25, 0xca, 0x3b, 0x7a, 0x17, 0x2, 0x55, 0x7f, 0x31, 0xe4, + 0x7a, 0xb3, 0x2, 0x5b, 0x7e, 0x37, 0x2, 0x55, 0xbe, 0x34, 0x0, 0x0, 0x38, + 0x5b, 0x7e, 0x34, 0xff, 0xff, 0x7a, 0x37, 0x2, 0x55, 0x74, 0x1, 0x7a, 0xb3, + 0x2, 0x5b, 0x80, 0x4b, 0x7e, 0x34, 0x0, 0x80, 0x7a, 0x37, 0x2, 0xde, 0x7f, + 0x13, 0x7e, 0x8, 0x2, 0x5c, 0x12, 0xb, 0x6b, 0x7e, 0x37, 0x2, 0x55, 0x9e, + 0x34, 0x0, 0x80, 0x7a, 0x37, 0x2, 0x55, 0x2e, 0x38, 0x0, 0x80, 0x6d, 0x33, + 0x7a, 0x37, 0x2, 0xdc, 0x7e, 0x37, 0x2, 0xdc, 0x9, 0x63, 0x2, 0x5c, 0x7e, + 0xf, 0x2, 0x57, 0x7e, 0xb, 0x70, 0x6c, 0x76, 0x7a, 0xb, 0x70, 0x7e, 0x37, + 0x2, 0xdc, 0xb, 0x34, 0x7a, 0x37, 0x2, 0xdc, 0xbe, 0x34, 0x0, 0x80, 0x78, + 0xdc, 0x7e, 0x37, 0x2, 0x55, 0xbe, 0x34, 0x0, 0x80, 0x38, 0xab, 0x7e, 0xb3, + 0x2, 0x5b, 0x60, 0x6, 0xb, 0x34, 0x7a, 0x37, 0x2, 0x55, 0x7e, 0x37, 0x2, + 0x55, 0x7a, 0x37, 0x2, 0xde, 0x7f, 0x13, 0x7e, 0x8, 0x2, 0x5c, 0x12, 0xb, + 0x6b, 0x6d, 0x33, 0x80, 0x1a, 0x7e, 0x37, 0x2, 0xdc, 0x9, 0x63, 0x2, 0x5c, + 0x7e, 0xf, 0x2, 0x57, 0x7e, 0xb, 0x70, 0x6c, 0x76, 0x7a, 0xb, 0x70, 0x7e, + 0x37, 0x2, 0xdc, 0xb, 0x34, 0x7a, 0x37, 0x2, 0xdc, 0x7e, 0x37, 0x2, 0x55, + 0xbe, 0x37, 0x2, 0xdc, 0x38, 0xd8, 0xda, 0x3b, 0x22, 0x7c, 0x7b, 0x7e, 0xa0, + 0xef, 0x7e, 0xb3, 0x2, 0x39, 0x24, 0xfd, 0x68, 0x31, 0x1b, 0xb1, 0x68, 0x75, + 0x14, 0x68, 0x77, 0x24, 0xa0, 0x68, 0x34, 0x1b, 0xb2, 0x68, 0x36, 0x24, + 0x9e, 0x68, 0x2c, 0x24, 0xe3, 0x68, 0x48, 0x24, 0xf4, 0x68, 0x4a, 0x24, + 0x65, 0x78, 0x63, 0xa5, 0xbf, 0x0, 0x5, 0x7e, 0xa0, 0x87, 0x80, 0x5a, 0xa5, + 0xbf, 0x1, 0x56, 0x7e, 0xa0, 0xa9, 0x80, 0x51, 0xa, 0x17, 0x7e, 0x1f, 0x2, + 0x50, 0x2d, 0x31, 0x29, 0xa1, 0x0, 0x8, 0x80, 0x43, 0x7e, 0xa3, 0x2, 0xf1, + 0x80, 0x3d, 0xa5, 0xbf, 0x0, 0xa, 0x7e, 0x37, 0x2, 0x48, 0xa, 0x56, 0x7c, + 0xab, 0x80, 0x2f, 0xa5, 0xbf, 0x1, 0x2b, 0x7e, 0x57, 0x2, 0x48, 0x7c, 0xab, + 0x80, 0x23, 0x7e, 0xa3, 0x2, 0xeb, 0x80, 0x1d, 0xa5, 0xbf, 0x0, 0x5, 0x7e, + 0xb3, 0x2, 0xec, 0x22, 0xa5, 0xbf, 0x1, 0x7, 0x7e, 0xb3, 0x2, 0xec, 0x64, + 0xff, 0x22, 0x7e, 0xa0, 0x5, 0x80, 0x4, 0x7e, 0xa3, 0x2, 0xf4, 0x7c, 0xba, + 0x22, 0x9f, 0x22, 0x7d, 0x23, 0x1b, 0x24, 0x7e, 0x78, 0xc6, 0xa, 0x1b, 0x7a, + 0x20, 0x7e, 0x78, 0xc6, 0x0, 0xb, 0x7a, 0x20, 0x4e, 0x50, 0x20, 0x1b, 0x7a, + 0x20, 0x6d, 0x22, 0x7e, 0x78, 0xc6, 0x6, 0x1b, 0x7a, 0x20, 0x80, 0x23, 0x7e, + 0x78, 0xc6, 0xc, 0xb, 0x7a, 0x20, 0x5e, 0x24, 0x0, 0xff, 0xbe, 0x24, 0x0, + 0x0, 0x28, 0x12, 0x7e, 0x78, 0xc6, 0x8, 0xb, 0x7a, 0x20, 0x7d, 0xf5, 0x2d, + 0xf1, 0x7d, 0xe0, 0x7a, 0x7b, 0x50, 0xb, 0x2c, 0x7d, 0xf3, 0x6d, 0xee, 0xbf, + 0x27, 0x40, 0xd5, 0x7e, 0x14, 0x0, 0x1, 0x7e, 0x18, 0xc6, 0x4, 0x1b, 0x1a, + 0x10, 0x74, 0x1, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0xc6, 0x0, 0xb, 0xa, 0x30, + 0x5e, 0x70, 0x1f, 0x1b, 0xa, 0x30, 0x22, 0x6d, 0x0, 0x74, 0x10, 0x4d, 0x0, + 0x78, 0xb, 0x4d, 0x22, 0x78, 0x27, 0x8d, 0x31, 0x7d, 0x12, 0x6d, 0x22, 0x22, + 0x7d, 0x43, 0x7d, 0x32, 0x6d, 0x22, 0x2f, 0x11, 0x2d, 0x44, 0x50, 0x2, 0xa5, + 0xf, 0xbf, 0x10, 0x40, 0x4, 0x9f, 0x10, 0xb, 0x90, 0x14, 0x78, 0xed, 0x7f, + 0x1, 0x6d, 0x22, 0x7d, 0x34, 0x22, 0x7d, 0x41, 0x7d, 0x13, 0x8d, 0x24, 0x7d, + 0x2, 0x2f, 0x0, 0x40, 0x4, 0xbd, 0x4, 0x40, 0x4, 0x9d, 0x4, 0xb, 0x14, 0x14, + 0x78, 0xf1, 0x7d, 0x23, 0x7d, 0x31, 0x7d, 0x10, 0x6d, 0x0, 0x22, 0xca, 0x2b, + 0xca, 0x1b, 0xca, 0xb, 0xd2, 0x0, 0x30, 0x90, 0x24, 0xc2, 0x90, 0x7e, 0x71, + 0x91, 0x7e, 0xb3, 0x2, 0x4f, 0x70, 0x4, 0x7a, 0x73, 0x2, 0x39, 0x12, 0x1, + 0x20, 0x7e, 0xb3, 0x2, 0x4f, 0x4, 0x7a, 0xb3, 0x2, 0x4f, 0x30, 0x2, 0x6, + 0xe4, 0x12, 0x6, 0x85, 0xf5, 0x91, 0x30, 0x91, 0x10, 0xc2, 0x91, 0x7e, 0xb3, + 0x2, 0x4f, 0x4, 0x7a, 0xb3, 0x2, 0x4f, 0x12, 0x6, 0x85, 0xf5, 0x91, 0xda, + 0xb, 0xda, 0x1b, 0xda, 0x2b, 0x32, 0xd2, 0x5, 0x12, 0xb, 0x45, 0xe4, 0x12, + 0x0, 0x2e, 0x74, 0x5, 0x12, 0xb, 0x4, 0x12, 0x0, 0xe, 0x7c, 0xab, 0x74, 0x1, + 0x12, 0x0, 0x2e, 0x5e, 0xa0, 0xc3, 0xe4, 0x12, 0x0, 0x2e, 0x74, 0x1, 0x12, + 0xb, 0x4, 0x7c, 0xba, 0x12, 0xb, 0x4, 0x74, 0x1, 0x12, 0x0, 0x2e, 0x12, 0xa, + 0xb9, 0x40, 0xfb, 0xe4, 0x12, 0x0, 0x2e, 0x74, 0x5, 0x12, 0xb, 0x4, 0x12, + 0x0, 0xe, 0x7a, 0xb3, 0x2, 0xf4, 0x74, 0x1, 0x2, 0x0, 0x2e, 0x75, 0x84, 0x1, + 0x7e, 0x44, 0x1f, 0xff, 0xe4, 0x7a, 0x49, 0xb0, 0x1b, 0x44, 0x78, 0xf9, + 0x7e, 0xf8, 0x2, 0xf5, 0xd2, 0x4, 0xd2, 0x0, 0xc2, 0x2, 0xc2, 0x3, 0x7e, + 0x4, 0x0, 0xff, 0x7e, 0x14, 0xb, 0x97, 0xb, 0xa, 0x40, 0x5d, 0x44, 0x68, + 0x1a, 0x69, 0x20, 0x0, 0x2, 0xb, 0xe, 0xb, 0x44, 0x80, 0xa, 0x7e, 0xb, 0xb0, + 0x7a, 0x29, 0xb0, 0xb, 0x24, 0xb, 0xc, 0x1b, 0x44, 0x78, 0xf2, 0x80, 0xdf, + 0x2, 0x4, 0x22, 0x7c, 0xab, 0xd2, 0x5, 0x12, 0xb, 0x45, 0x74, 0xd8, 0xa, + 0x3a, 0x7d, 0x23, 0x6d, 0x33, 0x12, 0x9, 0x3a, 0x74, 0x1, 0x12, 0x0, 0x2e, + 0x6d, 0x33, 0x7a, 0x37, 0x2, 0xf2, 0x12, 0xa, 0xb9, 0x50, 0xa, 0x7e, 0x37, + 0x2, 0xf2, 0xbe, 0x34, 0xf, 0xa0, 0x28, 0xf1, 0x7e, 0x37, 0x2, 0xf2, 0xbe, + 0x34, 0xf, 0xa0, 0x28, 0xf, 0xc2, 0x86, 0xc2, 0x87, 0x7e, 0x34, 0x13, 0x88, + 0x12, 0xa, 0x9a, 0xd2, 0x86, 0xd2, 0x87, 0x22, 0x7f, 0x70, 0x7f, 0x61, 0xd2, + 0x5, 0x12, 0xb, 0x45, 0x74, 0x2, 0x7f, 0x16, 0x12, 0x9, 0x3a, 0x6d, 0x33, + 0x80, 0x1d, 0x7f, 0x7, 0x2d, 0x13, 0x7e, 0xb, 0x50, 0xa, 0x25, 0x7e, 0x8, + 0xc6, 0x6, 0x1b, 0xa, 0x20, 0x7e, 0x8, 0xc6, 0xe, 0xb, 0xa, 0x20, 0x4d, + 0x22, 0x78, 0xf5, 0xb, 0x34, 0x7e, 0x27, 0x2, 0x5b, 0xbd, 0x23, 0x38, 0xdb, + 0x74, 0x1, 0x12, 0x0, 0x2e, 0x12, 0xa, 0xb9, 0x40, 0xfb, 0x22, 0x7c, 0xab, + 0x7d, 0x12, 0x7c, 0xb3, 0x7a, 0xb3, 0x2, 0x5f, 0x7c, 0x36, 0x7c, 0x25, 0xa, + 0x4, 0x6c, 0x22, 0x7c, 0xb3, 0x7a, 0xb3, 0x2, 0x5e, 0x6d, 0x22, 0x7c, 0xb7, + 0x7a, 0xb3, 0x2, 0x5d, 0xe4, 0x12, 0x0, 0x2e, 0x7c, 0xba, 0x12, 0xb, 0x4, + 0x7e, 0xb3, 0x2, 0x5f, 0x12, 0xb, 0x4, 0x7e, 0xb3, 0x2, 0x5e, 0x12, 0xb, + 0x4, 0x7e, 0xb3, 0x2, 0x5d, 0x2, 0xb, 0x4, 0x7d, 0x12, 0x7a, 0x33, 0x2, + 0xe2, 0x7c, 0x36, 0x7c, 0x25, 0xa, 0x4, 0x7a, 0x33, 0x2, 0xe1, 0x7a, 0x73, + 0x2, 0xe0, 0x7e, 0x14, 0x0, 0xb, 0x7e, 0x18, 0xc6, 0x0, 0x1b, 0x1a, 0x10, + 0xe4, 0x12, 0x0, 0x2e, 0x74, 0x3, 0x12, 0xb, 0x30, 0x7e, 0xb3, 0x2, 0xe2, + 0x12, 0xb, 0x30, 0x7e, 0xb3, 0x2, 0xe1, 0x12, 0xb, 0x30, 0x7e, 0xb3, 0x2, + 0xe0, 0x2, 0xb, 0x30, 0xd2, 0x5, 0x7e, 0x14, 0x0, 0x8, 0x7a, 0x17, 0x2, + 0xde, 0x7e, 0x8, 0x2, 0xe3, 0x12, 0xb, 0x6b, 0x6c, 0xaa, 0xa, 0x3a, 0x9, + 0xb3, 0x2, 0xe3, 0xbe, 0xb0, 0xff, 0x68, 0x4, 0xc2, 0x5, 0x80, 0x7, 0xb, + 0xa0, 0xbe, 0xa0, 0x8, 0x40, 0xea, 0xa2, 0x5, 0x22, 0x7a, 0xb3, 0x2, 0xf5, + 0x7e, 0x34, 0x0, 0x28, 0x12, 0xa, 0x9a, 0x6c, 0x33, 0x80, 0x14, 0xd2, 0x86, + 0x7e, 0x34, 0x0, 0xa, 0x12, 0xa, 0x9a, 0xc2, 0x86, 0x7e, 0x34, 0x0, 0xa, + 0x12, 0xa, 0x9a, 0xb, 0x30, 0x7e, 0x23, 0x2, 0xf5, 0xbc, 0x23, 0x38, 0xe4, + 0x22, 0x6d, 0x22, 0x80, 0x1d, 0x7f, 0x20, 0xb, 0x14, 0x7e, 0x2b, 0xb0, 0xa, + 0xfb, 0x7e, 0x28, 0xc6, 0x6, 0x1b, 0x2a, 0xf0, 0x7e, 0x28, 0xc6, 0xe, 0xb, + 0x2a, 0x50, 0x4d, 0x55, 0x78, 0xf5, 0xb, 0x24, 0xbd, 0x32, 0x38, 0xdf, 0xd3, + 0x22, 0x7c, 0xab, 0xd2, 0x5, 0x12, 0xb, 0x45, 0x74, 0x20, 0xca, 0xb8, 0xa, + 0x3a, 0x6d, 0x22, 0x74, 0xc, 0x2f, 0x11, 0x14, 0x78, 0xfb, 0xda, 0xb8, 0x12, + 0x9, 0x3a, 0x74, 0x1, 0x12, 0x0, 0x2e, 0x12, 0xa, 0xb9, 0x40, 0xfb, 0x22, + 0xd2, 0xcf, 0x75, 0xcc, 0x0, 0x75, 0xec, 0xff, 0x75, 0xee, 0xff, 0x75, 0xeb, + 0x3, 0x75, 0xac, 0xc0, 0xa9, 0xc5, 0xca, 0x75, 0xed, 0xf, 0x75, 0xad, 0xb0, + 0xa9, 0xd7, 0x94, 0xa9, 0xd4, 0x94, 0x22, 0xd2, 0xc8, 0x75, 0xb3, 0x3, 0x7e, + 0x8, 0xc6, 0x0, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0xd3, 0x1b, 0xa, 0x30, 0xb, + 0xa, 0x30, 0x4e, 0x70, 0x8, 0x1b, 0xa, 0x30, 0x2, 0x8, 0x21, 0x80, 0x14, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, 0x23, 0x1b, 0x34, 0x4d, 0x22, 0x78, 0xe4, + 0x22, 0xe4, 0x12, 0x0, 0x2e, 0x74, 0x5, 0x12, 0xb, 0x4, 0x12, 0x0, 0xe, + 0x7c, 0xab, 0x74, 0x1, 0x12, 0x0, 0x2e, 0x7c, 0xba, 0x30, 0xe0, 0x2, 0xd3, + 0x22, 0xc3, 0x22, 0x6d, 0x33, 0x7a, 0x37, 0x2, 0xf2, 0xc2, 0x8c, 0xc2, 0x8d, + 0x43, 0x89, 0x2, 0x75, 0x8c, 0x1, 0x75, 0x8a, 0x0, 0xd2, 0x8c, 0xd2, 0xa9, + 0x22, 0x7e, 0xb3, 0x2, 0x47, 0xb4, 0xc, 0xf, 0xc2, 0x86, 0xc2, 0x87, 0x7e, + 0x34, 0x0, 0x64, 0x12, 0xa, 0x9a, 0xd2, 0x86, 0xd2, 0x87, 0x22, 0xa, 0x1b, + 0x7e, 0x18, 0xc6, 0x6, 0x1b, 0x1a, 0x10, 0x7e, 0x18, 0xc6, 0xe, 0xb, 0x1a, + 0x30, 0x4d, 0x33, 0x78, 0xf5, 0xd3, 0x22, 0x75, 0x91, 0x0, 0xc2, 0x90, 0xc2, + 0x91, 0x75, 0x92, 0x70, 0xd2, 0xe8, 0xc2, 0xc0, 0xa9, 0xd5, 0xb7, 0xd2, + 0xbd, 0xd2, 0xad, 0x22, 0x1a, 0x1b, 0x7e, 0x18, 0xc6, 0x6, 0x1b, 0x1a, 0x10, + 0x7e, 0x18, 0xc6, 0xe, 0xb, 0x1a, 0x30, 0x4d, 0x33, 0x78, 0xf5, 0x22, 0xe4, + 0x12, 0x0, 0x2e, 0x30, 0x5, 0x4, 0x74, 0x6, 0x80, 0x2, 0x74, 0x4, 0x12, 0xb, + 0x4, 0x74, 0x1, 0x2, 0x0, 0x2e, 0xca, 0x39, 0xc2, 0x8d, 0x7e, 0x37, 0x2, + 0xf2, 0xb, 0x34, 0x7a, 0x37, 0x2, 0xf2, 0xda, 0x39, 0x32, 0x7f, 0x70, 0x12, + 0x9, 0x78, 0x7f, 0x7, 0x7e, 0x37, 0x2, 0xde, 0x12, 0x7, 0x17, 0xd3, 0x22, + 0x12, 0xa, 0x5a, 0x12, 0xa, 0x7b, 0x12, 0xb, 0x1a, 0x12, 0xa, 0xd5, 0xd2, + 0xaf, 0x22, 0xca, 0xb8, 0xa9, 0xc0, 0x93, 0xe4, 0x7a, 0xb3, 0x2, 0x4f, 0xda, + 0xb8, 0x32, 0x0, 0x1, 0x2, 0xeb, 0x0, 0x0, 0x1, 0x2, 0xf4, 0x0, 0x0, 0x1, + 0x2, 0xec, 0x0, 0x0, 0x4, 0x2, 0xed, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x1, 0x2, + 0xf1, 0x0, 0x0, 0x2, 0x2, 0xf2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x39, 0x0, 0x0, + 0x1, 0x2, 0x3a, 0x0, 0x0, 0x2, 0x2, 0x45, 0x0, 0x0, 0x0, 0x1, 0x2, 0x47, + 0x0, 0x0, 0x2, 0x2, 0x48, 0x0, 0x0, 0x0, 0x1, 0x2, 0x4e, 0xb, 0x0, 0x1, 0x2, + 0x4f, 0x0, 0x0, 0x0, diff --git a/drivers/input/touchscreen/nvt_touch_d2t/Makefile b/drivers/input/touchscreen/nvt_touch_d2t/Makefile new file mode 100644 index 000000000000..240d960724e5 --- /dev/null +++ b/drivers/input/touchscreen/nvt_touch_d2t/Makefile @@ -0,0 +1,7 @@ +# +# Makefile for the Novatek NT36xxx touchscreen driver. +# + +# Each configuration option enables a list of files. + +obj-y += nt36xxx.o nt36xxx_fw_update.o nt36xxx_ext_proc.o nt36xxx_mp_ctrlram.o diff --git a/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx.c b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx.c new file mode 100644 index 000000000000..8b6264f329f1 --- /dev/null +++ b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx.c @@ -0,0 +1,2626 @@ +/* + * Copyright (C) 2010 - 2017 Novatek, Inc. + * Copyright (C) 2020 XiaoMi, Inc. + * + * $Revision: 20544 $ + * $Date: 2017-12-20 11:08:15 +0800 (週三, 20 å二月 2017) $ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + */ +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/delay.h> +#include <linux/interrupt.h> +#include <linux/irq.h> +#include <linux/gpio.h> +#include <linux/proc_fs.h> +#include <asm/uaccess.h> +#include <linux/input/mt.h> +#include <linux/of_gpio.h> +#include <linux/of_irq.h> +#include <linux/slab.h> +#include <linux/regulator/consumer.h> + +#ifdef CONFIG_DRM +#include <drm/drm_notifier.h> +#include <drm/drm_panel.h> +#else +#include <linux/fb.h> +#endif +#include <linux/debugfs.h> + +#include "nt36xxx.h" +#if NVT_TOUCH_ESD_PROTECT +#include <linux/jiffies.h> +#endif /* #if NVT_TOUCH_ESD_PROTECT */ +#ifdef CONFIG_FB +extern void mdss_panel_reset_skip_enable(bool enable); +extern bool mdss_panel_is_prim(void *fbinfo); +#endif + +#if NVT_TOUCH_ESD_PROTECT +static struct delayed_work nvt_esd_check_work; +static struct workqueue_struct *nvt_esd_check_wq; +static unsigned long irq_timer; +uint8_t esd_check; +uint8_t esd_retry; +uint8_t esd_retry_max = 5; +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + +#if NVT_TOUCH_EXT_PROC +extern int32_t nvt_extra_proc_init(void); +#endif + +#if NVT_TOUCH_MP +extern int32_t nvt_mp_proc_init(void); +#endif + +struct nvt_ts_data *ts; + +static struct workqueue_struct *nvt_wq; + +#if BOOT_UPDATE_FIRMWARE_INWORK +static struct workqueue_struct *nvt_fwu_wq; + +#endif +extern void Boot_Update_Firmware(void); + +static void nvt_resume_work(struct work_struct *work); + +#if defined(CONFIG_DRM) +static int drm_notifier_callback(struct notifier_block *self, unsigned long event, void *data); +#elif defined(CONFIG_FB) +static int fb_notifier_callback(struct notifier_block *self, unsigned long event, void *data); +#elif defined(CONFIG_HAS_EARLYSUSPEND) +static void nvt_ts_early_suspend(struct early_suspend *h); +static void nvt_ts_late_resume(struct early_suspend *h); +#endif + +#define INPUT_EVENT_START 0 +#define INPUT_EVENT_SENSITIVE_MODE_OFF 0 +#define INPUT_EVENT_SENSITIVE_MODE_ON 1 +#define INPUT_EVENT_STYLUS_MODE_OFF 2 +#define INPUT_EVENT_STYLUS_MODE_ON 3 +#define INPUT_EVENT_WAKUP_MODE_OFF 4 +#define INPUT_EVENT_WAKUP_MODE_ON 5 +#define INPUT_EVENT_COVER_MODE_OFF 6 +#define INPUT_EVENT_COVER_MODE_ON 7 +#define INPUT_EVENT_SLIDE_FOR_VOLUME 8 +#define INPUT_EVENT_DOUBLE_TAP_FOR_VOLUME 9 +#define INPUT_EVENT_SINGLE_TAP_FOR_VOLUME 10 +#define INPUT_EVENT_LONG_SINGLE_TAP_FOR_VOLUME 11 +#define INPUT_EVENT_PALM_OFF 12 +#define INPUT_EVENT_PALM_ON 13 +#define INPUT_EVENT_END 13 + +#if TOUCH_KEY_NUM > 0 +const uint16_t touch_key_array[TOUCH_KEY_NUM] = { + KEY_BACK, + KEY_HOME, + KEY_MENU +}; +#endif + +#if WAKEUP_GESTURE +const uint16_t gesture_key_array[] = { + KEY_POWER, /*GESTURE_WORD_C*/ + KEY_POWER, /*GESTURE_WORD_W*/ + KEY_POWER, /*GESTURE_WORD_V*/ + KEY_WAKEUP, /*GESTURE_DOUBLE_CLICK*/ + KEY_POWER, /*GESTURE_WORD_Z*/ + KEY_POWER, /*GESTURE_WORD_M*/ + KEY_POWER, /*GESTURE_WORD_O*/ + KEY_POWER, /*GESTURE_WORD_e*/ + KEY_POWER, /*GESTURE_WORD_S*/ + KEY_POWER, /*GESTURE_SLIDE_UP*/ + KEY_POWER, /*GESTURE_SLIDE_DOWN*/ + KEY_POWER, /*GESTURE_SLIDE_LEFT*/ + KEY_POWER, /*GESTURE_SLIDE_RIGHT*/ +}; +#endif + +static uint8_t bTouchIsAwake; + +/******************************************************* +Description: + Novatek touchscreen i2c read function. + +return: + Executive outcomes. 2---succeed. -5---I/O error +*******************************************************/ +int32_t CTP_I2C_READ(struct i2c_client *client, uint16_t address, uint8_t *buf, uint16_t len) +{ + struct i2c_msg msgs[2]; + int32_t ret = -1; + int32_t retries = 0; + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = address; + msgs[0].len = 1; + msgs[0].buf = &buf[0]; + msgs[1].flags = I2C_M_RD; + msgs[1].addr = address; + msgs[1].len = len - 1; + msgs[1].buf = &buf[1]; + + while (retries < 5) { + ret = i2c_transfer(client->adapter, msgs, 2); + + if (ret == 2) + break; + + retries++; + msleep(20); + NVT_ERR("error, retry=%d\n", retries); + } + + if (unlikely(retries == 5)) { + NVT_ERR("error, ret=%d\n", ret); + ret = -EIO; + } + + return ret; +} + +/******************************************************* +Description: + Novatek touchscreen i2c write function. + +return: + Executive outcomes. 1---succeed. -5---I/O error +*******************************************************/ +int32_t CTP_I2C_WRITE(struct i2c_client *client, uint16_t address, uint8_t *buf, uint16_t len) +{ + struct i2c_msg msg; + int32_t ret = -1; + int32_t retries = 0; + msg.flags = !I2C_M_RD; + msg.addr = address; + msg.len = len; + msg.buf = buf; + + while (retries < 5) { + ret = i2c_transfer(client->adapter, &msg, 1); + + if (ret == 1) + break; + + retries++; + msleep(20); + NVT_ERR("error, retry=%d\n", retries); + } + + if (unlikely(retries == 5)) { + NVT_ERR("error, ret=%d\n", ret); + ret = -EIO; + } + + return ret; +} + + +/******************************************************* +Description: + Novatek touchscreen reset MCU then into idle mode + function. + +return: + n.a. +*******************************************************/ +void nvt_sw_reset_idle(void) +{ + uint8_t buf[4] = {0}; + /*---write i2c cmds to reset idle---*/ + buf[0] = 0x00; + buf[1] = 0xA5; + CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + msleep(15); +} + +/******************************************************* +Description: + Novatek touchscreen reset MCU (boot) function. + +return: + n.a. +*******************************************************/ +int nvt_bootloader_reset(void) +{ + int ret = 0; + + uint8_t buf[8] = {0}; + /*write i2c cmds to reset*/ + buf[0] = 0x00; + buf[1] = 0x69; + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + + /*need 35ms delay after bootloader reset*/ + msleep(35); + + return ret; +} + +/******************************************************* +Description: + Novatek touchscreen clear FW status function. + +return: + Executive outcomes. 0---succeed. -1---fail. +*******************************************************/ +int32_t nvt_clear_fw_status(void) +{ + uint8_t buf[8] = {0}; + int32_t i = 0; + const int32_t retry = 20; + + for (i = 0; i < retry; i++) { + /*---set xdata index to EVENT BUF ADDR---*/ + buf[0] = 0xFF; + buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---clear fw status---*/ + buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE; + buf[1] = 0x00; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 2); + /*---read fw status---*/ + buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE; + buf[1] = 0xFF; + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 2); + + if (buf[1] == 0x00) + break; + + msleep(10); + } + + if (i >= retry) { + NVT_ERR("failed, i=%d, buf[1]=0x%02X\n", i, buf[1]); + return -EPERM; + } else { + return 0; + } +} + +/******************************************************* +Description: + Novatek touchscreen check FW status function. + +return: + Executive outcomes. 0---succeed. -1---failed. +*******************************************************/ +int32_t nvt_check_fw_status(void) +{ + uint8_t buf[8] = {0}; + int32_t i = 0; + const int32_t retry = 50; + + for (i = 0; i < retry; i++) { + /*---set xdata index to EVENT BUF ADDR---*/ + buf[0] = 0xFF; + buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---read fw status---*/ + buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE; + buf[1] = 0x00; + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 2); + + if ((buf[1] & 0xF0) == 0xA0) + break; + + msleep(10); + } + + if (i >= retry) { + NVT_ERR("failed, i=%d, buf[1]=0x%02X\n", i, buf[1]); + return -EPERM; + } else { + return 0; + } +} + +/******************************************************* +Description: + Novatek touchscreen check FW reset state function. + +return: + Executive outcomes. 0---succeed. -1---failed. +*******************************************************/ +int32_t nvt_check_fw_reset_state(RST_COMPLETE_STATE check_reset_state) +{ + uint8_t buf[8] = {0}; + int32_t ret = 0; + int32_t retry = 0; + + while (1) { + msleep(10); + /*---read reset state---*/ + buf[0] = EVENT_MAP_RESET_COMPLETE; + buf[1] = 0x00; + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 6); + + if ((buf[1] >= check_reset_state) && (buf[1] <= RESET_STATE_MAX)) { + ret = 0; + break; + } + + retry++; + + if (unlikely(retry > 100)) { + NVT_ERR("error, retry=%d, buf[1]=0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X\n", retry, buf[1], buf[2], buf[3], buf[4], buf[5]); + ret = -EPERM; + break; + } + } + + return ret; +} + +/******************************************************* +Description: + Novatek touchscreen get novatek project id information + function. + +return: + Executive outcomes. 0---success. -1---fail. +*******************************************************/ +int32_t nvt_read_pid(void) +{ + uint8_t buf[3] = {0}; + int32_t ret = 0; + /*---set xdata index to EVENT BUF ADDR---*/ + buf[0] = 0xFF; + buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---read project id---*/ + buf[0] = EVENT_MAP_PROJECTID; + buf[1] = 0x00; + buf[2] = 0x00; + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 3); + ts->nvt_pid = (buf[2] << 8) + buf[1]; + NVT_LOG("PID=%04X\n", ts->nvt_pid); + return ret; +} + +/******************************************************* +Description: + Novatek touchscreen get firmware related information + function. + +return: + Executive outcomes. 0---success. -1---fail. +*******************************************************/ +int32_t nvt_get_fw_info(void) +{ + uint8_t buf[64] = {0}; + uint32_t retry_count = 0; + int32_t ret = 0; +info_retry: + /*---set xdata index to EVENT BUF ADDR---*/ + buf[0] = 0xFF; + buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---read fw info---*/ + buf[0] = EVENT_MAP_FWINFO; + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 17); + ts->fw_ver = buf[1]; + ts->x_num = buf[3]; + ts->y_num = buf[4]; + ts->max_button_num = buf[11]; + + /*---clear x_num, y_num if fw info is broken---*/ + if ((buf[1] + buf[2]) != 0xFF) { + NVT_ERR("FW info is broken! fw_ver=0x%02X, ~fw_ver=0x%02X\n", buf[1], buf[2]); + ts->fw_ver = 0; + ts->x_num = 18; + ts->y_num = 32; + ts->max_button_num = TOUCH_KEY_NUM; + + if (retry_count < 3) { + retry_count++; + NVT_ERR("retry_count=%d\n", retry_count); + goto info_retry; + } else { + NVT_ERR("Set default fw_ver=%d, x_num=%d, y_num=%d, \ + max_button_num=%d!\n", + ts->fw_ver, ts->x_num, ts->y_num, ts->max_button_num); + ret = -EPERM; + } + } else { + ret = 0; + } + + /*---Get Novatek PID---*/ + nvt_read_pid(); + return ret; +} + +/******************************************************* + Create Device Node (Proc Entry) +*******************************************************/ +#if NVT_TOUCH_PROC +static struct proc_dir_entry *NVT_proc_entry; +#define DEVICE_NAME "NVTflash" + +/******************************************************* +Description: + Novatek touchscreen /proc/NVTflash read function. + +return: + Executive outcomes. 2---succeed. -5,-14---failed. +*******************************************************/ +static ssize_t nvt_flash_read(struct file *file, char __user *buff, size_t count, loff_t *offp) +{ + uint8_t str[68] = {0}; + int32_t ret = -1; + int32_t retries = 0; + int8_t i2c_wr = 0; + + if (count > sizeof(str)) { + NVT_ERR("error count=%zu\n", count); + return -EFAULT; + } + + if (copy_from_user(str, buff, count)) { + NVT_ERR("copy from user error\n"); + return -EFAULT; + } + +#if NVT_TOUCH_ESD_PROTECT + cancel_delayed_work_sync(&nvt_esd_check_work); + nvt_esd_check_enable(false); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + i2c_wr = str[0] >> 7; + + if (i2c_wr == 0) { /*I2C write*/ + while (retries < 20) { + ret = CTP_I2C_WRITE(ts->client, (str[0] & 0x7F), &str[2], str[1]); + + if (ret == 1) + break; + else + NVT_ERR("error, retries=%d, ret=%d\n", retries, ret); + + retries++; + } + + if (unlikely(retries == 20)) { + NVT_ERR("error, ret = %d\n", ret); + return -EIO; + } + + return ret; + } else if (i2c_wr == 1) { /*I2C read*/ + while (retries < 20) { + ret = CTP_I2C_READ(ts->client, (str[0] & 0x7F), &str[2], str[1]); + + if (ret == 2) + break; + else + NVT_ERR("error, retries=%d, ret=%d\n", retries, ret); + + retries++; + } + + /* copy buff to user if i2c transfer */ + if (retries < 20) { + if (copy_to_user(buff, str, count)) + return -EFAULT; + } + + if (unlikely(retries == 20)) { + NVT_ERR("error, ret = %d\n", ret); + return -EIO; + } + + return ret; + } else { + NVT_ERR("Call error, str[0]=%d\n", str[0]); + return -EFAULT; + } +} + +/******************************************************* +Description: + Novatek touchscreen /proc/NVTflash open function. + +return: + Executive outcomes. 0---succeed. -12---failed. +*******************************************************/ +static int32_t nvt_flash_open(struct inode *inode, struct file *file) +{ + struct nvt_flash_data *dev; + dev = (struct nvt_flash_data *)kmalloc(sizeof(struct nvt_flash_data), GFP_KERNEL); + + if (dev == NULL) { + NVT_ERR("Failed to allocate memory for nvt flash data\n"); + return -ENOMEM; + } + + rwlock_init(&dev->lock); + file->private_data = dev; + return 0; +} + +/******************************************************* +Description: + Novatek touchscreen /proc/NVTflash close function. + +return: + Executive outcomes. 0---succeed. +*******************************************************/ +static int32_t nvt_flash_close(struct inode *inode, struct file *file) +{ + struct nvt_flash_data *dev = file->private_data; + + if (dev) + kfree(dev); + + return 0; +} + +static const struct file_operations nvt_flash_fops = { + .owner = THIS_MODULE, + .open = nvt_flash_open, + .release = nvt_flash_close, + .read = nvt_flash_read, +}; + +/******************************************************* +Description: + Novatek touchscreen /proc/NVTflash initial function. + +return: + Executive outcomes. 0---succeed. -12---failed. +*******************************************************/ +static int32_t nvt_flash_proc_init(void) +{ + NVT_proc_entry = proc_create(DEVICE_NAME, 0444, NULL, &nvt_flash_fops); + + if (NVT_proc_entry == NULL) { + NVT_ERR("Failed!\n"); + return -ENOMEM; + } else { + NVT_LOG("Succeeded!\n"); + } + + NVT_LOG("============================================================\n"); + NVT_LOG("Create /proc/NVTflash\n"); + NVT_LOG("============================================================\n"); + return 0; +} +#endif + +#if WAKEUP_GESTURE +#define GESTURE_WORD_C 12 +#define GESTURE_WORD_W 13 +#define GESTURE_WORD_V 14 +#define GESTURE_DOUBLE_CLICK 15 +#define GESTURE_WORD_Z 16 +#define GESTURE_WORD_M 17 +#define GESTURE_WORD_O 18 +#define GESTURE_WORD_e 19 +#define GESTURE_WORD_S 20 +#define GESTURE_SLIDE_UP 21 +#define GESTURE_SLIDE_DOWN 22 +#define GESTURE_SLIDE_LEFT 23 +#define GESTURE_SLIDE_RIGHT 24 +/* customized gesture id */ +#define DATA_PROTOCOL 30 + +/* function page definition */ +#define FUNCPAGE_GESTURE 1 + + +/******************************************************* +Description: + Novatek touchscreen wake up gesture key report function. + +return: + n.a. +*******************************************************/ +void nvt_ts_wakeup_gesture_report(uint8_t gesture_id, uint8_t *data) +{ + uint32_t keycode = 0; + uint8_t func_type = data[2]; + uint8_t func_id = data[3]; + + /* support fw specifal data protocol */ + if ((gesture_id == DATA_PROTOCOL) && (func_type == FUNCPAGE_GESTURE)) { + gesture_id = func_id; + } else if (gesture_id > DATA_PROTOCOL) { + NVT_ERR("gesture_id %d is invalid, func_type=%d, func_id=%d\n", gesture_id, func_type, func_id); + return; + } + + NVT_LOG("gesture_id = %d\n", gesture_id); + + switch (gesture_id) { + case GESTURE_WORD_C: + NVT_LOG("Gesture : Word-C.\n"); + keycode = gesture_key_array[0]; + break; + + case GESTURE_WORD_W: + NVT_LOG("Gesture : Word-W.\n"); + keycode = gesture_key_array[1]; + break; + + case GESTURE_WORD_V: + NVT_LOG("Gesture : Word-V.\n"); + keycode = gesture_key_array[2]; + break; + + case GESTURE_DOUBLE_CLICK: + NVT_LOG("Gesture : Double Click.\n"); + keycode = gesture_key_array[3]; + ts->dbclick_count++; + break; + + case GESTURE_WORD_Z: + NVT_LOG("Gesture : Word-Z.\n"); + keycode = gesture_key_array[4]; + break; + + case GESTURE_WORD_M: + NVT_LOG("Gesture : Word-M.\n"); + keycode = gesture_key_array[5]; + break; + + case GESTURE_WORD_O: + NVT_LOG("Gesture : Word-O.\n"); + keycode = gesture_key_array[6]; + break; + + case GESTURE_WORD_e: + NVT_LOG("Gesture : Word-e.\n"); + keycode = gesture_key_array[7]; + break; + + case GESTURE_WORD_S: + NVT_LOG("Gesture : Word-S.\n"); + keycode = gesture_key_array[8]; + break; + + case GESTURE_SLIDE_UP: + NVT_LOG("Gesture : Slide UP.\n"); + keycode = gesture_key_array[9]; + break; + + case GESTURE_SLIDE_DOWN: + NVT_LOG("Gesture : Slide DOWN.\n"); + keycode = gesture_key_array[10]; + break; + + case GESTURE_SLIDE_LEFT: + NVT_LOG("Gesture : Slide LEFT.\n"); + keycode = gesture_key_array[11]; + break; + + case GESTURE_SLIDE_RIGHT: + NVT_LOG("Gesture : Slide RIGHT.\n"); + keycode = gesture_key_array[12]; + break; + + default: + break; + } + + if (keycode > 0) { + input_report_key(ts->input_dev, keycode, 1); + input_sync(ts->input_dev); + input_report_key(ts->input_dev, keycode, 0); + input_sync(ts->input_dev); + } +} +#endif + +static int nvt_get_dt_coords(struct device *dev, char *name) +{ + int ret = 0; + u32 coords[NVT_COORDS_ARR_SIZE] = { 0 }; + struct property *prop; + struct device_node *np = dev->of_node; + int coords_size; + + prop = of_find_property(np, name, NULL); + if (!prop) + return -EINVAL; + if (!prop->value) + return -ENODATA; + + coords_size = prop->length / sizeof(u32); + if (coords_size != NVT_COORDS_ARR_SIZE) { + NVT_ERR("invalid:%s, size:%d\n", name, coords_size); + return -EINVAL; + } + + ret = of_property_read_u32_array(np, name, coords, coords_size); + if (ret && (ret != -EINVAL)) { + NVT_ERR("Unable to read %s\n", name); + return -ENODATA; + } + + if (!strcmp(name, "novatek,display-coords")) { + ts->abs_x_max = coords[0]; + ts->abs_y_max = coords[1]; + } else { + NVT_ERR("unsupported property %s\n", name); + return -EINVAL; + } + + NVT_LOG("display x %d y %d\n", ts->abs_x_max, ts->abs_y_max); + return 0; +} + +/******************************************************* +Description: + Novatek touchscreen parse device tree function. + +return: + n.a. +*******************************************************/ +#ifdef CONFIG_OF +static int nvt_parse_dt(struct device *dev) +{ + struct device_node *temp, *np = dev->of_node; + struct nvt_config_info *config_info; + int retval; + u32 temp_val; + const char *name; + + retval = nvt_get_dt_coords(dev, "novatek,display-coords"); + if (retval < 0) + NVT_ERR("Unable to get display-coords\n"); + + ts->irq_gpio = of_get_named_gpio_flags(np, "novatek,irq-gpio", 0, &ts->irq_flags); + NVT_LOG("novatek,irq-gpio=%d\n", ts->irq_gpio); + ts->reset_gpio = of_get_named_gpio_flags(np, "novatek,reset-gpio", 0, NULL); + NVT_LOG("novatek,reset-gpio=%d\n", ts->reset_gpio); + ts->tddi_tp_hw_reset = of_property_read_bool(np, "novatek,tddi-tp-hw-reset"); + ts->reset_tddi = of_get_named_gpio_flags(np, "novatek,reset-tddi", 0, NULL); + NVT_LOG("novatek,reset-tddi=%d\n", ts->reset_tddi); + retval = of_property_read_string(np, "novatek,vddio-reg-name", &name); + + if (retval == -EINVAL) + ts->vddio_reg_name = NULL; + else if (retval < 0) + return -EINVAL; + else { + ts->vddio_reg_name = name; + NVT_LOG("vddio_reg_name = %s\n", name); + } + + retval = of_property_read_string(np, "novatek,lab-reg-name", &name); + + if (retval == -EINVAL) + ts->lab_reg_name = NULL; + else if (retval < 0) + return -EINVAL; + else { + ts->lab_reg_name = name; + NVT_LOG("lab_reg_name = %s\n", name); + } + + retval = of_property_read_string(np, "novatek,ibb-reg-name", &name); + + if (retval == -EINVAL) + ts->ibb_reg_name = NULL; + else if (retval < 0) + return -EINVAL; + else { + ts->ibb_reg_name = name; + NVT_LOG("ibb_reg_name = %s\n", name); + } + +#ifdef NVT_TOUCH_COUNT_DUMP + ts->dump_click_count = + of_property_read_bool(np, "novatek,dump-click-count"); +#endif + retval = of_property_read_u32(np, "novatek,config-array-size", + (u32 *)&ts->config_array_size); + + if (retval) { + NVT_LOG("Unable to get array size\n"); + return retval; + } + + ts->config_array = devm_kzalloc(dev, ts->config_array_size * + sizeof(struct nvt_config_info), + GFP_KERNEL); + + if (!ts->config_array) { + NVT_LOG("Unable to allocate memory\n"); + return -ENOMEM; + } + + config_info = ts->config_array; + for_each_child_of_node(np, temp) { + retval = of_property_read_u32(temp, "novatek,tp-vendor", &temp_val); + + if (retval) { + NVT_LOG("Unable to read tp vendor\n"); + } else { + config_info->tp_vendor = (u8) temp_val; + NVT_LOG("tp vendor: %u", config_info->tp_vendor); + } + + retval = of_property_read_string(temp, "novatek,fw-name", + &config_info->nvt_cfg_name); + + if (retval && (retval != -EINVAL)) { + NVT_LOG("Unable to read cfg name\n"); + } else { + NVT_LOG("fw_name: %s", config_info->nvt_cfg_name); + } + + retval = of_property_read_string(temp, "novatek,limit-name", + &config_info->nvt_limit_name); + + if (retval && (retval != -EINVAL)) { + NVT_LOG("Unable to read limit name\n"); + } else { + NVT_LOG("limit_name: %s", config_info->nvt_limit_name); + } + +#ifdef NVT_TOUCH_COUNT_DUMP + + if (ts->dump_click_count) { + retval = + of_property_read_string(temp, + "novatek,clicknum-file-name", + &config_info->clicknum_file_name); + + if (retval && (retval != -EINVAL)) { + dev_err(dev, + "Unable to read click count file name\n"); + } else + dev_err(dev, "%s\n", + config_info->clicknum_file_name); + } + +#endif + config_info++; + } + return 0; +} +#else +static int nvt_parse_dt(struct device *dev) +{ + ts->irq_gpio = NVTTOUCH_INT_PIN; + return 0; +} +#endif + +static const char *nvt_get_config(struct nvt_ts_data *ts) +{ + int i; + + for (i = 0; i < ts->config_array_size; i++) { + if ((ts->lockdown_info[0] == + ts->config_array[i].tp_vendor)) + break; + } + + if (i >= ts->config_array_size) { + NVT_LOG("can't find right config\n"); + return BOOT_UPDATE_FIRMWARE_NAME; + } + + NVT_LOG("Choose config %d: %s", i, + ts->config_array[i].nvt_cfg_name); + ts->current_index = i; +#ifdef NVT_TOUCH_COUNT_DUMP + + if (ts->dump_click_count) { + ts->current_clicknum_file = + kzalloc(TOUCH_COUNT_FILE_MAXSIZE, GFP_KERNEL); + strlcpy(ts->current_clicknum_file, + ts->config_array[i].clicknum_file_name, + TOUCH_COUNT_FILE_MAXSIZE); + } + +#endif + return ts->config_array[i].nvt_cfg_name; +} + +static int nvt_get_reg(struct nvt_ts_data *ts, bool get) +{ + int retval; + + if (!get) { + retval = 0; + goto regulator_put; + } + + if ((ts->vddio_reg_name != NULL) && (*ts->vddio_reg_name != 0)) { + ts->vddio_reg = regulator_get(&ts->client->dev, + ts->vddio_reg_name); + + if (IS_ERR(ts->vddio_reg)) { + NVT_ERR("Failed to get power regulator\n"); + retval = PTR_ERR(ts->vddio_reg); + goto regulator_put; + } + } + + if ((ts->lab_reg_name != NULL) && (*ts->lab_reg_name != 0)) { + ts->lab_reg = regulator_get(&ts->client->dev, + ts->lab_reg_name); + + if (IS_ERR(ts->lab_reg)) { + NVT_ERR("Failed to get lab regulator\n"); + retval = PTR_ERR(ts->lab_reg); + goto regulator_put; + } + } + + if ((ts->ibb_reg_name != NULL) && (*ts->ibb_reg_name != 0)) { + ts->ibb_reg = regulator_get(&ts->client->dev, + ts->ibb_reg_name); + + if (IS_ERR(ts->ibb_reg)) { + NVT_ERR("Failed to get ibb regulator\n"); + retval = PTR_ERR(ts->ibb_reg); + goto regulator_put; + } + } + + return 0; +regulator_put: + + if (ts->vddio_reg) { + regulator_put(ts->vddio_reg); + ts->vddio_reg = NULL; + } + + if (ts->lab_reg) { + regulator_put(ts->lab_reg); + ts->lab_reg = NULL; + } + + if (ts->ibb_reg) { + regulator_put(ts->ibb_reg); + ts->ibb_reg = NULL; + } + + return retval; +} + +static int nvt_enable_reg(struct nvt_ts_data *ts, bool enable) +{ + int retval; + + if (!enable) { + retval = 0; + goto disable_ibb_reg; + } + + if (ts->vddio_reg) { + retval = regulator_enable(ts->vddio_reg); + + if (retval < 0) { + NVT_ERR("Failed to enable vddio regulator\n"); + goto exit; + } + } + + if (ts->lab_reg && ts->lab_reg) { + retval = regulator_enable(ts->lab_reg); + + if (retval < 0) { + NVT_ERR("Failed to enable lab regulator\n"); + goto disable_vddio_reg; + } + } + + if (ts->ibb_reg) { + retval = regulator_enable(ts->ibb_reg); + + if (retval < 0) { + NVT_ERR("Failed to enable ibb regulator\n"); + goto disable_lab_reg; + } + } + + return 0; +disable_ibb_reg: + + if (ts->ibb_reg) + regulator_disable(ts->ibb_reg); + +disable_lab_reg: + + if (ts->lab_reg) + regulator_disable(ts->lab_reg); + +disable_vddio_reg: + + if (ts->vddio_reg) + regulator_disable(ts->vddio_reg); + +exit: + return retval; +} + +/******************************************************* +Description: + Novatek touchscreen config and request gpio + +return: + Executive outcomes. 0---succeed. not 0---failed. +*******************************************************/ +static int nvt_gpio_config(struct nvt_ts_data *ts) +{ + int32_t ret = 0; + + /* request INT-pin (Input) */ + if (gpio_is_valid(ts->irq_gpio)) { + ret = gpio_request_one(ts->irq_gpio, GPIOF_IN, "NVT-int"); + + if (ret) { + NVT_ERR("Failed to request NVT-int GPIO\n"); + goto err_request_irq_gpio; + } + } + + if (gpio_is_valid(ts->reset_gpio)) { + ret = gpio_request_one(ts->reset_gpio, GPIOF_OUT_INIT_HIGH, "NVT-reset"); + + if (ret) { + NVT_ERR("Failed to request reset-int GPIO\n"); + goto err_request_reset_gpio; + } + + gpio_direction_output(ts->reset_gpio, 1); + } + + return ret; +err_request_reset_gpio: +err_request_irq_gpio: + return ret; +} + +#if NVT_TOUCH_ESD_PROTECT +void nvt_esd_check_enable(uint8_t enable) +{ + /* enable/disable esd check flag */ + esd_check = enable; + /* update interrupt timer */ + irq_timer = jiffies; + /* clear esd_retry counter, if protect function is enabled */ + esd_retry = enable ? 0 : esd_retry; +} + +static uint8_t nvt_fw_recovery(uint8_t *point_data) +{ + uint8_t i = 0; + uint8_t detected = true; + + /* check pattern */ + for (i = 1; i < 7; i++) { + if (point_data[i] != 0x77) { + detected = false; + break; + } + } + + return detected; +} + +static void nvt_esd_check_func(struct work_struct *work) +{ + unsigned int timer = jiffies_to_msecs(jiffies - irq_timer); + + /* + *NVT_ERR("esd_check = %d (retry %d/%d)\n", esd_check, esd_retry, esd_retry_max); //DEBUG + */ + if (esd_retry >= esd_retry_max) + nvt_esd_check_enable(false); + + if ((timer > NVT_TOUCH_ESD_CHECK_PERIOD) && esd_check) { + NVT_ERR("do ESD recovery, timer = %d, retry = %d\n", timer, esd_retry); + /* do esd recovery, bootloader reset */ + nvt_bootloader_reset(); + /* update interrupt timer */ + irq_timer = jiffies; + /* update esd_retry counter */ + esd_retry++; + } + + queue_delayed_work(nvt_esd_check_wq, &nvt_esd_check_work, + msecs_to_jiffies(NVT_TOUCH_ESD_CHECK_PERIOD)); +} +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + +static void nvt_switch_mode_work(struct work_struct *work) +{ + struct nvt_mode_switch *ms = container_of(work, struct nvt_mode_switch, switch_mode_work); + struct nvt_ts_data *data = ms->nvt_data; + unsigned char value = ms->mode; + + if (value >= INPUT_EVENT_WAKUP_MODE_OFF && value <= INPUT_EVENT_WAKUP_MODE_ON) { + data->gesture_enabled = value - INPUT_EVENT_WAKUP_MODE_OFF; + } else { + NVT_ERR("Does not support touch mode %d\n", value); + } + + if (ms != NULL) { + kfree(ms); + ms = NULL; + } +} + +static int nvt_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) +{ + struct nvt_ts_data *data = input_get_drvdata(dev); + struct nvt_mode_switch *ms; + + if (type == EV_SYN && code == SYN_CONFIG) { + NVT_LOG("set input event value = %d\n", value); + + if (value >= INPUT_EVENT_START && value <= INPUT_EVENT_END) { + ms = (struct nvt_mode_switch *)kmalloc(sizeof(struct nvt_mode_switch), GFP_ATOMIC); + + if (ms != NULL) { + ms->nvt_data = data; + ms->mode = (unsigned char)value; + INIT_WORK(&ms->switch_mode_work, nvt_switch_mode_work); + schedule_work(&ms->switch_mode_work); + } else { + NVT_ERR("failed in allocating memory for switching mode\n"); + return -ENOMEM; + } + } else { + NVT_ERR("Invalid event value\n"); + return -EINVAL; + } + } + + return 0; +} + +#define POINT_DATA_LEN 65 +/******************************************************* +Description: + Novatek touchscreen work function. + +return: + n.a. +*******************************************************/ +static void nvt_ts_work_func(void) +{ + int32_t ret = -1; + uint8_t point_data[POINT_DATA_LEN + 1] = {0}; + uint32_t position = 0; + uint32_t input_x = 0; + uint32_t input_y = 0; + uint32_t input_w = 0; + uint32_t input_p = 0; + uint8_t input_id = 0; +#if MT_PROTOCOL_B + uint8_t press_id[TOUCH_MAX_FINGER_NUM] = {0}; +#endif /* MT_PROTOCOL_B */ + int32_t i = 0; + int32_t finger_cnt = 0; + mutex_lock(&ts->lock); + + if (ts->dev_pm_suspend) { + ret = wait_for_completion_timeout(&ts->dev_pm_suspend_completion, msecs_to_jiffies(500)); + if (!ret) { + NVT_ERR("system(i2c) can't finished resuming procedure, skip it\n"); + goto XFER_ERROR; + } + } + + ret = CTP_I2C_READ(ts->client, I2C_FW_Address, point_data, POINT_DATA_LEN + 1); + if (ret < 0) { + NVT_ERR("CTP_I2C_READ failed.(%d)\n", ret); + goto XFER_ERROR; + } + + /* + //--- dump I2C buf --- + for (i = 0; i < 10; i++) { + printk("%02X %02X %02X %02X %02X %02X ", point_data[1+i*6], point_data[2+i*6], point_data[3+i*6], point_data[4+i*6], point_data[5+i*6], point_data[6+i*6]); + } + printk("\n"); + */ +#if NVT_TOUCH_ESD_PROTECT + + if (nvt_fw_recovery(point_data)) { + nvt_esd_check_enable(true); + goto XFER_ERROR; + } + +#endif /* #if NVT_TOUCH_ESD_PROTECT */ +#if WAKEUP_GESTURE + + if (bTouchIsAwake == 0) { + input_id = (uint8_t)(point_data[1] >> 3); + nvt_ts_wakeup_gesture_report(input_id, point_data); + mutex_unlock(&ts->lock); + return; + } + +#endif + finger_cnt = 0; + + for (i = 0; i < ts->max_touch_num; i++) { + position = 1 + 6 * i; + input_id = (uint8_t)(point_data[position + 0] >> 3); + + if ((input_id == 0) || (input_id > ts->max_touch_num)) + continue; + + if (((point_data[position] & 0x07) == 0x01) || ((point_data[position] & 0x07) == 0x02)) { /*finger down (enter & moving)*/ +#if NVT_TOUCH_ESD_PROTECT + /* update interrupt timer */ + irq_timer = jiffies; +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + input_x = (uint32_t)(point_data[position + 1] << 4) + (uint32_t)(point_data[position + 3] >> 4); + input_y = (uint32_t)(point_data[position + 2] << 4) + (uint32_t)(point_data[position + 3] & 0x0F); + + if ((input_x < 0) || (input_y < 0)) + continue; + + if ((input_x > ts->abs_x_max) || (input_y > ts->abs_y_max)) + continue; + + input_w = (uint32_t)(point_data[position + 4]); + + if (input_w == 0) + input_w = 1; + + if (i < 2) { + input_p = (uint32_t)(point_data[position + 5]) + (uint32_t)(point_data[i + 63] << 8); + + if (input_p > TOUCH_FORCE_NUM) + input_p = TOUCH_FORCE_NUM; + } else { + input_p = (uint32_t)(point_data[position + 5]); + } + + if (input_p == 0) + input_p = 1; + +#if MT_PROTOCOL_B + press_id[input_id - 1] = 1; + input_mt_slot(ts->input_dev, input_id - 1); + input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true); +#else /* MT_PROTOCOL_B */ + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, input_id - 1); + input_report_key(ts->input_dev, BTN_TOUCH, 1); +#endif /* MT_PROTOCOL_B */ + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, input_x); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, input_y); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, input_w); + input_report_abs(ts->input_dev, ABS_MT_PRESSURE, input_p); +#if MT_PROTOCOL_B +#else /* MT_PROTOCOL_B */ + input_mt_sync(ts->input_dev); +#endif /* MT_PROTOCOL_B */ + finger_cnt++; + } + } + +#if MT_PROTOCOL_B + + for (i = 0; i < ts->max_touch_num; i++) { + if (press_id[i] != 1) { + input_mt_slot(ts->input_dev, i); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0); + input_report_abs(ts->input_dev, ABS_MT_PRESSURE, 0); + input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false); + } + } + + input_report_key(ts->input_dev, BTN_TOUCH, (finger_cnt > 0)); +#else /* MT_PROTOCOL_B */ + + if (finger_cnt == 0) { + input_report_key(ts->input_dev, BTN_TOUCH, 0); + input_mt_sync(ts->input_dev); + } + +#endif /* MT_PROTOCOL_B */ +#if TOUCH_KEY_NUM > 0 + + if (point_data[61] == 0xF8) { + for (i = 0; i < ts->max_button_num; i++) { + input_report_key(ts->input_dev, touch_key_array[i], ((point_data[62] >> i) & 0x01)); + } + } else { + for (i = 0; i < ts->max_button_num; i++) { + input_report_key(ts->input_dev, touch_key_array[i], 0); + } + } + +#endif + input_sync(ts->input_dev); +XFER_ERROR: + mutex_unlock(&ts->lock); +} + +/******************************************************* +Description: + External interrupt service routine. + +return: + irq execute status. +*******************************************************/ +static irqreturn_t nvt_ts_irq_handler(int32_t irq, void *dev_id) +{ + if (bTouchIsAwake == 0) { + dev_dbg(&ts->client->dev, "%s gesture wakeup\n", __func__); + } + nvt_ts_work_func(); + + return IRQ_HANDLED; +} + +/******************************************************* +Description: + Novatek touchscreen check and stop crc reboot loop. + +return: + n.a. +*******************************************************/ +void nvt_stop_crc_reboot(void) +{ + uint8_t buf[8] = {0}; + int32_t retry = 0; + /*read dummy buffer to check CRC fail reboot is happening or not*/ + /*---change I2C index to prevent geting 0xFF, but not 0xFC---*/ + buf[0] = 0xFF; + buf[1] = 0x01; + buf[2] = 0xF6; + CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3); + /*---read to check if buf is 0xFC which means IC is in CRC reboot ---*/ + buf[0] = 0x4E; + CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 4); + + if (((buf[1] == 0xFC) && (buf[2] == 0xFC) && (buf[3] == 0xFC)) || + ((buf[1] == 0xFF) && (buf[2] == 0xFF) && (buf[3] == 0xFF))) { + /*IC is in CRC fail reboot loop, needs to be stopped!*/ + for (retry = 5; retry > 0; retry--) { + /*---write i2c cmds to reset idle : 1st---*/ + buf[0] = 0x00; + buf[1] = 0xA5; + CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + /*---write i2c cmds to reset idle : 2rd---*/ + buf[0] = 0x00; + buf[1] = 0xA5; + CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + msleep(1); + /*---clear CRC_ERR_FLAG---*/ + buf[0] = 0xFF; + buf[1] = 0x03; + buf[2] = 0xF1; + CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3); + buf[0] = 0x35; + buf[1] = 0xA5; + CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 2); + /*---check CRC_ERR_FLAG---*/ + buf[0] = 0xFF; + buf[1] = 0x03; + buf[2] = 0xF1; + CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3); + buf[0] = 0x35; + buf[1] = 0x00; + CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 2); + + if (buf[1] == 0xA5) + break; + } + + if (retry == 0) + NVT_ERR("CRC auto reboot is not able to be stopped! buf[1]=0x%02X\n", buf[1]); + } + + return; +} + +/******************************************************* +Description: + Novatek touchscreen check chip version trim function. + +return: + Executive outcomes. 0---NVT IC. -1---not NVT IC. +*******************************************************/ +static int8_t nvt_ts_check_chip_ver_trim(void) +{ + uint8_t buf[8] = {0}; + int32_t retry = 0; + int32_t list = 0; + int32_t i = 0; + int32_t found_nvt_chip = 0; + int32_t ret = -1; + ret = nvt_bootloader_reset(); /* NOT in retry loop */ + if (ret < 0) { + NVT_ERR("Can't reset the nvt ic\n"); + goto out; + } + + /*---Check for 5 times---*/ + for (retry = 5; retry > 0; retry--) { + nvt_sw_reset_idle(); + buf[0] = 0x00; + buf[1] = 0x35; + CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + msleep(10); + buf[0] = 0xFF; + buf[1] = 0x01; + buf[2] = 0xF6; + CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3); + buf[0] = 0x4E; + buf[1] = 0x00; + buf[2] = 0x00; + buf[3] = 0x00; + buf[4] = 0x00; + buf[5] = 0x00; + buf[6] = 0x00; + CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 7); + NVT_LOG("buf[1]=0x%02X, buf[2]=0x%02X, buf[3]=0x%02X, buf[4]=0x%02X, buf[5]=0x%02X, buf[6]=0x%02X\n", + buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]); + + /* compare read chip id on supported list */ + for (list = 0; list < (sizeof(trim_id_table) / sizeof(struct nvt_ts_trim_id_table)); list++) { + found_nvt_chip = 0; + + /* compare each byte */ + for (i = 0; i < NVT_ID_BYTE_MAX; i++) { + if (trim_id_table[list].mask[i]) { + if (buf[i + 1] != trim_id_table[list].id[i]) + break; + } + } + + if (i == NVT_ID_BYTE_MAX) { + found_nvt_chip = 1; + } + + if (found_nvt_chip) { + NVT_LOG("This is NVT touch IC\n"); + ts->mmap = trim_id_table[list].mmap; + ts->carrier_system = trim_id_table[list].carrier_system; + ret = 0; + goto out; + } else { + ts->mmap = NULL; + ret = -1; + } + } + + /*---Stop CRC check to prevent IC auto reboot---*/ + if (((buf[1] == 0xFC) && (buf[2] == 0xFC) && (buf[3] == 0xFC)) || + ((buf[1] == 0xFF) && (buf[2] == 0xFF) && (buf[3] == 0xFF))) { + nvt_stop_crc_reboot(); + } + + msleep(10); + } + +out: + return ret; +} + +#ifdef NVT_TOUCH_COUNT_DUMP +static ssize_t nvt_touch_suspend_notify_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%d\n", !bTouchIsAwake); +} +static DEVICE_ATTR(touch_suspend_notify, (S_IRUGO | S_IRGRP), nvt_touch_suspend_notify_show, NULL); +#endif +static int32_t nvt_ts_suspend(struct device *dev); +static int32_t nvt_ts_resume(struct device *dev); + +static void tpdbg_suspend(struct nvt_ts_data *nvt_data, bool enable) +{ + if (enable) + nvt_ts_suspend(&nvt_data->client->dev); + else + nvt_ts_resume(&nvt_data->client->dev); +} + +static int tpdbg_open(struct inode *inode, struct file *file) +{ + file->private_data = inode->i_private; + return 0; +} + +static ssize_t tpdbg_read(struct file *file, char __user *buf, size_t size, loff_t *ppos) +{ + const char *str = "cmd support as below:\n \ + \necho \"irq-disable\" or \"irq-enable\" to ctrl irq\n \ + \necho \"tp-sd-en\" of \"tp-sd-off\" to ctrl panel in or off sleep mode\n \ + \necho \"tp-suspend-en\" or \"tp-suspend-off\" to ctrl panel in or off suspend status\n"; + loff_t pos = *ppos; + int len = strlen(str); + + if (pos < 0) + return -EINVAL; + + if (pos >= len) + return 0; + + if (copy_to_user(buf, str, len)) + return -EFAULT; + + *ppos = pos + len; + return len; +} + +static ssize_t tpdbg_write(struct file *file, const char __user *buf, size_t size, loff_t *ppos) +{ + char *cmd = kzalloc(size + 1, GFP_KERNEL); + int ret = size; + + if (!cmd) + return -ENOMEM; + + if (copy_from_user(cmd, buf, size)) { + ret = -EFAULT; + goto out; + } + + cmd[size] = '\0'; + + if (!strncmp(cmd, "irq-disable", 11)) + disable_irq_nosync(ts->client->irq); + else if (!strncmp(cmd, "irq-enable", 10)) + enable_irq(ts->client->irq); + else if (!strncmp(cmd, "tp-sd-en", 8)) + tpdbg_suspend(ts, true); + else if (!strncmp(cmd, "tp-sd-off", 9)) + tpdbg_suspend(ts, false); + else if (!strncmp(cmd, "tp-suspend-en", 13)) + tpdbg_suspend(ts, true); + else if (!strncmp(cmd, "tp-suspend-off", 14)) + tpdbg_suspend(ts, false); + +out: + kfree(cmd); + return ret; +} + +static int tpdbg_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + return 0; +} + +static const struct file_operations tpdbg_operations = { + .owner = THIS_MODULE, + .open = tpdbg_open, + .read = tpdbg_read, + .write = tpdbg_write, + .release = tpdbg_release, +}; + +static int nvt_pinctrl_init(struct nvt_ts_data *nvt_data) +{ + int retval = 0; + /* Get pinctrl if target uses pinctrl */ + nvt_data->ts_pinctrl = devm_pinctrl_get(&nvt_data->client->dev); + + if (IS_ERR_OR_NULL(nvt_data->ts_pinctrl)) { + retval = PTR_ERR(nvt_data->ts_pinctrl); + NVT_ERR("Target does not use pinctrl %d\n", retval); + goto err_pinctrl_get; + } + + nvt_data->pinctrl_state_active + = pinctrl_lookup_state(nvt_data->ts_pinctrl, PINCTRL_STATE_ACTIVE); + + if (IS_ERR_OR_NULL(nvt_data->pinctrl_state_active)) { + retval = PTR_ERR(nvt_data->pinctrl_state_active); + NVT_ERR("Can not lookup %s pinstate %d\n", + PINCTRL_STATE_ACTIVE, retval); + goto err_pinctrl_lookup; + } + + nvt_data->pinctrl_state_suspend + = pinctrl_lookup_state(nvt_data->ts_pinctrl, PINCTRL_STATE_SUSPEND); + + if (IS_ERR_OR_NULL(nvt_data->pinctrl_state_suspend)) { + retval = PTR_ERR(nvt_data->pinctrl_state_suspend); + NVT_ERR("Can not lookup %s pinstate %d\n", + PINCTRL_STATE_SUSPEND, retval); + goto err_pinctrl_lookup; + } + + return 0; +err_pinctrl_lookup: + devm_pinctrl_put(nvt_data->ts_pinctrl); +err_pinctrl_get: + nvt_data->ts_pinctrl = NULL; + return retval; +} + +static ssize_t nvt_panel_color_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%c\n", ts->lockdown_info[2]); +} + +static ssize_t nvt_panel_vendor_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%c\n", ts->lockdown_info[6]); +} + +static ssize_t nvt_panel_display_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%c\n", ts->lockdown_info[1]); +} + + +static ssize_t nt36xxx_grip_area_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + uint8_t tmp[8] = {0}; + int32_t ret = 0; + uint8_t edge_reject_switch; + + NVT_LOG("++\n"); + + msleep(35); + + tmp[0] = 0xFF; + tmp[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + tmp[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + ret = CTP_I2C_WRITE(ts->client, I2C_FW_Address, tmp, 3); + if (ret < 0) { + NVT_ERR("Set event buffer index fail!\n"); + goto nvt_get_edge_reject_switch_out; + } + + tmp[0] = 0x5C; + tmp[1] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_FW_Address, tmp, 2); + if (ret < 0) { + NVT_ERR("Read edge reject switch status fail!\n"); + goto nvt_get_edge_reject_switch_out; + } + + edge_reject_switch = ((tmp[1] >> 5) & 0x03); + NVT_LOG("edge_reject_switch = %d\n", edge_reject_switch); + +nvt_get_edge_reject_switch_out: + NVT_LOG("--\n"); + return ret; +} + +static ssize_t nt36xxx_grip_area_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int mode; + uint8_t tmp[3]; + int ret = -EIO; + + if (!bTouchIsAwake) { + NVT_ERR("tp is suspended, no need to set\n"); + return ret; + } + tmp[0] = 0XFF; + tmp[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + tmp[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + ret = CTP_I2C_WRITE(ts->client, I2C_FW_Address, tmp, 3); + if (ret < 0) { + NVT_LOG("%s error\n", __func__); + return ret; + } + sscanf(buf, "%u", &mode); + pr_info("%s,mode:%d\n", __func__, mode); + tmp[0] = EVENT_MAP_HOST_CMD; + if (mode == 90) { + tmp[1] = 0xBB; + } else if (mode == 270) { + tmp[1] = 0xBC; + } else { + tmp[1] = 0xBA; + } + ret = CTP_I2C_WRITE(ts->client, I2C_FW_Address, tmp, 2); + if (ret < 0) { + NVT_LOG("%s error\n", __func__); + return ret; + } else + return count; +} + +static DEVICE_ATTR(panel_vendor, (S_IRUGO), nvt_panel_vendor_show, NULL); +static DEVICE_ATTR(panel_color, (S_IRUGO), nvt_panel_color_show, NULL); +static DEVICE_ATTR(panel_display, (S_IRUGO), nvt_panel_display_show, NULL); +static DEVICE_ATTR(grip_area, (S_IRUGO | S_IWUSR | S_IWGRP), + nt36xxx_grip_area_show, nt36xxx_grip_area_store); + +static struct attribute *nvt_attr_group[] = { + &dev_attr_panel_vendor.attr, + &dev_attr_panel_color.attr, + &dev_attr_panel_display.attr, + &dev_attr_grip_area.attr, +}; + +static int grip_area_open(struct inode *inode, struct file *file) +{ + file->private_data = inode->i_private; + return 0; +} + +static ssize_t grip_area_write(struct file *file, const char __user *buf, size_t size, loff_t *ppos) +{ + char *cmd = kzalloc(size + 1, GFP_KERNEL); + int ret = -EIO; + + if (!cmd) + return ret; + + if (copy_from_user(cmd, buf, size)) { + goto out; + } + + cmd[size] = '\0'; + ret = nt36xxx_grip_area_store(&ts->client->dev, NULL, cmd, strlen(cmd)); +out: + kfree(cmd); + return ret; +} + +static int grip_area_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + return 0; +} + +static const struct file_operations grip_area_operations = { + .owner = THIS_MODULE, + .open = grip_area_open, + .write = grip_area_write, + .release = grip_area_release, +}; + +/******************************************************* +Description: + Novatek touchscreen driver probe function. + +return: + Executive outcomes. 0---succeed. negative---failed +*******************************************************/ +static int32_t nvt_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + int32_t ret = 0; +#if ((TOUCH_KEY_NUM > 0) || WAKEUP_GESTURE) + int32_t retry = 0; +#endif + char *tp_maker = NULL; + NVT_LOG("start\n"); + ts = kzalloc(sizeof(struct nvt_ts_data), GFP_KERNEL); + + if (ts == NULL) { + NVT_ERR("failed to allocated memory for nvt ts data\n"); + return -ENOMEM; + } + + ts->client = client; + i2c_set_clientdata(client, ts); + /*---parse dts---*/ + nvt_parse_dt(&client->dev); + ret = nvt_pinctrl_init(ts); + + if (!ret && ts->ts_pinctrl) { + ret = pinctrl_select_state(ts->ts_pinctrl, ts->pinctrl_state_active); + + if (ret < 0) { + NVT_ERR("Failed to select %s pinstate %d\n", + PINCTRL_STATE_ACTIVE, ret); + } else + NVT_ERR("select %s pinstate\n", PINCTRL_STATE_ACTIVE); + } else { + NVT_ERR("Failed to init pinctrl\n"); + } + + /*---request and config GPIOs---*/ + ret = nvt_gpio_config(ts); + + if (ret) { + NVT_ERR("gpio config error!\n"); + goto err_gpio_config_failed; + } + + /*---check i2c func.---*/ + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + NVT_ERR("i2c_check_functionality failed. (no I2C_FUNC_I2C)\n"); + ret = -ENODEV; + goto err_check_functionality_failed; + } + + /* need 10ms delay after POR(power on reset) */ + msleep(10); + /*---check chip version trim---*/ + ret = nvt_ts_check_chip_ver_trim(); + + if (ret) { + NVT_ERR("chip is not identified\n"); + ret = -EINVAL; + goto err_chipvertrim_failed; + } + + mutex_init(&ts->mdata_lock); + mutex_init(&ts->lock); + mutex_lock(&ts->lock); + nvt_bootloader_reset(); + nvt_check_fw_reset_state(RESET_STATE_INIT); + nvt_get_fw_info(); + mutex_unlock(&ts->lock); + /*---create workqueue---*/ + nvt_wq = create_workqueue("nvt_wq"); + + if (!nvt_wq) { + NVT_ERR("nvt_wq create workqueue failed\n"); + ret = -ENOMEM; + goto err_create_nvt_wq_failed; + } + + /*---allocate input device---*/ + ts->input_dev = input_allocate_device(); + + if (ts->input_dev == NULL) { + NVT_ERR("allocate input device failed\n"); + ret = -ENOMEM; + goto err_input_dev_alloc_failed; + } + + ts->max_touch_num = TOUCH_MAX_FINGER_NUM; +#if TOUCH_KEY_NUM > 0 + ts->max_button_num = TOUCH_KEY_NUM; +#endif + ts->int_trigger_type = INT_TRIGGER_TYPE; + /*---set input device info.---*/ + ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ; + ts->input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + ts->input_dev->propbit[0] = BIT(INPUT_PROP_DIRECT); +#if MT_PROTOCOL_B + input_mt_init_slots(ts->input_dev, ts->max_touch_num, 0); +#endif + input_set_abs_params(ts->input_dev, ABS_MT_PRESSURE, 0, TOUCH_FORCE_NUM, 0, 0); /*pressure = TOUCH_FORCE_NUM*/ +#if TOUCH_MAX_FINGER_NUM > 1 + input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); /*area = 255*/ + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max - 1, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, ts->abs_y_max - 1, 0, 0); +#if MT_PROTOCOL_B + /* no need to set ABS_MT_TRACKING_ID, input_mt_init_slots() already set it */ +#else + input_set_abs_params(ts->input_dev, ABS_MT_TRACKING_ID, 0, ts->max_touch_num, 0, 0); +#endif /*MT_PROTOCOL_B*/ +#endif /*TOUCH_MAX_FINGER_NUM > 1*/ +#if TOUCH_KEY_NUM > 0 + + for (retry = 0; retry < ts->max_button_num; retry++) { + input_set_capability(ts->input_dev, EV_KEY, touch_key_array[retry]); + } + +#endif +#if WAKEUP_GESTURE + + for (retry = 0; retry < (sizeof(gesture_key_array) / sizeof(gesture_key_array[0])); retry++) { + input_set_capability(ts->input_dev, EV_KEY, gesture_key_array[retry]); + } + +#endif + snprintf(ts->phys, strlen("input/ts"), "input/ts"); + ts->input_dev->name = NVT_TS_NAME; + ts->input_dev->phys = ts->phys; + ts->input_dev->id.bustype = BUS_I2C; + ts->input_dev->event = nvt_input_event; + input_set_drvdata(ts->input_dev, ts); + /*---register input device---*/ + ret = input_register_device(ts->input_dev); + + if (ret) { + NVT_ERR("register input device (%s) failed. ret=%d\n", ts->input_dev->name, ret); + goto err_input_register_device_failed; + } + + /*--- request regulator---*/ + nvt_get_reg(ts, true); + /* we should enable the reg for lpwg mode */ + /*nvt_enable_reg(ts, true);*/ + /*---set int-pin & request irq---*/ + client->irq = gpio_to_irq(ts->irq_gpio); + + if (client->irq) { + NVT_LOG("int_trigger_type=%d\n", ts->int_trigger_type); +#if WAKEUP_GESTURE + ret = request_threaded_irq(client->irq, NULL, nvt_ts_irq_handler, ts->int_trigger_type | IRQF_ONESHOT, client->name, ts); +#else + ret = request_irq(client->irq, nvt_ts_irq_handler, ts->int_trigger_type, client->name, ts); +#endif + + if (ret != 0) { + NVT_ERR("request irq failed. ret=%d\n", ret); + goto err_int_request_failed; + } else { + disable_irq_nosync(client->irq); + NVT_LOG("request irq %d succeed\n", client->irq); + } + } + + ret = nvt_get_lockdown_info(ts->lockdown_info); + + if (ret < 0) + NVT_ERR("can't get lockdown info"); + else { + NVT_ERR("Lockdown:0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x\n", + ts->lockdown_info[0], ts->lockdown_info[1], ts->lockdown_info[2], ts->lockdown_info[3], + ts->lockdown_info[4], ts->lockdown_info[5], ts->lockdown_info[6], ts->lockdown_info[7]); + } + + ts->fw_name = nvt_get_config(ts); + tp_maker = kzalloc(20, GFP_KERNEL); + + if (tp_maker == NULL) + NVT_ERR("fail to alloc vendor name memory\n"); + else { + kfree(tp_maker); + tp_maker = NULL; + } + + ts->dbclick_count = 0; + device_init_wakeup(&client->dev, 1); + ts->dev_pm_suspend = false; + init_completion(&ts->dev_pm_suspend_completion); +#if BOOT_UPDATE_FIRMWARE_INWORK + nvt_fwu_wq = create_singlethread_workqueue("nvt_fwu_wq"); + + if (!nvt_fwu_wq) { + NVT_ERR("nvt_fwu_wq create workqueue failed\n"); + ret = -ENOMEM; + goto err_create_nvt_fwu_wq_failed; + } + + INIT_DELAYED_WORK(&ts->nvt_fwu_work, Boot_Update_Firmware); + /*please make sure boot update start after display reset(RESX) sequence*/ + queue_delayed_work(nvt_fwu_wq, &ts->nvt_fwu_work, msecs_to_jiffies(14000)); +#else + Boot_Update_Firmware(); +#endif +#if NVT_TOUCH_ESD_PROTECT + INIT_DELAYED_WORK(&nvt_esd_check_work, nvt_esd_check_func); + nvt_esd_check_wq = create_workqueue("nvt_esd_check_wq"); + queue_delayed_work(nvt_esd_check_wq, &nvt_esd_check_work, + msecs_to_jiffies(NVT_TOUCH_ESD_CHECK_PERIOD)); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + /*---set device node---*/ +#if NVT_TOUCH_PROC + ret = nvt_flash_proc_init(); + + if (ret != 0) { + NVT_ERR("nvt flash proc init failed. ret=%d\n", ret); + goto err_init_NVT_ts; + } + +#endif +#if NVT_TOUCH_EXT_PROC + ret = nvt_extra_proc_init(); + + if (ret != 0) { + NVT_ERR("nvt extra proc init failed. ret=%d\n", ret); + goto err_init_NVT_ts; + } + +#endif +#if NVT_TOUCH_MP + ret = nvt_mp_proc_init(); + + if (ret != 0) { + NVT_ERR("nvt mp proc init failed. ret=%d\n", ret); + goto err_init_NVT_ts; + } + +#endif +#if defined(CONFIG_DRM) + ts->notifier.notifier_call = drm_notifier_callback; + ret = drm_register_client(&ts->notifier); + + if (ret) { + NVT_ERR("register drm_notifier failed. ret=%d\n", ret); + goto err_register_drm_notif_failed; + } +#elif defined(CONFIG_FB) + ts->notifier.notifier_call = fb_notifier_callback; + ret = fb_register_client(&ts->notifier); + + if (ret) { + NVT_ERR("register drm_notifier failed. ret=%d\n", ret); + goto fb_register_drm_notif_failed; + } + + +#elif defined(CONFIG_HAS_EARLYSUSPEND) + ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + ts->early_suspend.suspend = nvt_ts_early_suspend; + ts->early_suspend.resume = nvt_ts_late_resume; + ret = register_early_suspend(&ts->early_suspend); + + if (ret) { + NVT_ERR("register early suspend failed. ret=%d\n", ret); + goto err_register_early_suspend_failed; + } + +#endif + ts->attrs.attrs = nvt_attr_group; + ret = sysfs_create_group(&client->dev.kobj, &ts->attrs); + + if (ret) { + NVT_ERR("Cannot create sysfs structure!\n"); + } + +#ifdef NVT_TOUCH_COUNT_DUMP + + if (ts->nvt_tp_class == NULL) + ts->nvt_tp_class = class_create(THIS_MODULE, "touch"); + + ts->nvt_touch_dev = device_create(ts->nvt_tp_class, NULL, 0x62, ts, "touch_suspend_notify"); + + if (IS_ERR(ts->nvt_touch_dev)) { + NVT_ERR("ERROR: Failed to create device for the sysfs!\n"); + goto err_register_tp_class; + } + + dev_set_drvdata(ts->nvt_touch_dev, ts); + ret = sysfs_create_file(&ts->nvt_touch_dev->kobj, &dev_attr_touch_suspend_notify.attr); + + if (ret) { + NVT_ERR("ERROR: Failed to create sysfs group!\n"); + goto err_register_tp_class; + } + +#endif + ts->event_wq = alloc_workqueue("nvt-event-queue", + WQ_UNBOUND | WQ_HIGHPRI | WQ_CPU_INTENSIVE, 1); + if (!ts->event_wq) { + NVT_ERR("ERROR: Cannot create work thread\n"); + goto err_register_tp_class; + } + INIT_WORK(&ts->resume_work, nvt_resume_work); + + ts->debugfs = debugfs_create_dir("tp_debug", NULL); + + if (ts->debugfs) { + debugfs_create_file("switch_state", 0660, ts->debugfs, ts, &tpdbg_operations); + debugfs_create_file("grip_area", 0660, ts->debugfs, ts, &grip_area_operations); + } else { + NVT_ERR("ERROR:Cannot create tp_debug\n"); + goto err_pm_workqueue; + } + + bTouchIsAwake = 1; + NVT_LOG("end\n"); + enable_irq(client->irq); + return 0; +err_pm_workqueue: + destroy_workqueue(ts->event_wq); +#ifdef NVT_TOUCH_COUNT_DUMP +err_register_tp_class: + device_destroy(ts->nvt_tp_class, 0x62); + class_destroy(ts->nvt_tp_class); + ts->nvt_tp_class = NULL; +#endif +#if defined(CONFIG_DRM) +err_register_drm_notif_failed: + drm_unregister_client(&ts->notifier); +#elif defined(CONFIG_FB) +fb_register_drm_notif_failed: + fb_unregister_client(&ts->notifier); +#elif defined(CONFIG_HAS_EARLYSUSPEND) +err_register_early_suspend_failed: +#endif +#if (NVT_TOUCH_PROC || NVT_TOUCH_EXT_PROC || NVT_TOUCH_MP) +err_init_NVT_ts: +#endif + free_irq(client->irq, ts); +#if BOOT_UPDATE_FIRMWARE_INWORK +err_create_nvt_fwu_wq_failed: +#endif +err_int_request_failed: +err_input_register_device_failed: + input_free_device(ts->input_dev); +err_input_dev_alloc_failed: +err_create_nvt_wq_failed: + mutex_destroy(&ts->lock); +err_chipvertrim_failed: +err_check_functionality_failed: + gpio_free(ts->irq_gpio); + + if (gpio_is_valid(ts->reset_gpio)) + gpio_free(ts->reset_gpio); + +err_gpio_config_failed: + i2c_set_clientdata(client, NULL); + kfree(ts); + return ret; +} + +/******************************************************* +Description: + Novatek touchscreen driver release function. + +return: + Executive outcomes. 0---succeed. +*******************************************************/ +static int32_t nvt_ts_remove(struct i2c_client *client) +{ + /*struct nvt_ts_data *ts = i2c_get_clientdata(client);*/ +#if defined(CONFIG_DRM) + if (drm_unregister_client(&ts->notifier)) + NVT_ERR("Error occurred while unregistering drm_notifier.\n"); +#elif defined(CONFIG_FB) + if (fb_unregister_client(&ts->notifier)) + NVT_ERR("Error occurred while unregistering drm_notifier.\n"); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + unregister_early_suspend(&ts->early_suspend); +#endif +#ifdef NVT_TOUCH_COUNT_DUMP + + if (ts->dump_click_count && !ts->current_clicknum_file) { + kfree(ts->current_clicknum_file); + ts->current_clicknum_file = NULL; + } + + sysfs_remove_file(&ts->nvt_touch_dev->kobj, + &dev_attr_touch_suspend_notify.attr); + device_destroy(ts->nvt_tp_class, 0x62); + class_destroy(ts->nvt_tp_class); + ts->nvt_tp_class = NULL; +#endif + destroy_workqueue(ts->event_wq); + + nvt_get_reg(ts, false); + /*nvt_enable_reg(ts, false);*/ + mutex_destroy(&ts->lock); + NVT_LOG("Removing driver...\n"); + free_irq(client->irq, ts); + input_unregister_device(ts->input_dev); + i2c_set_clientdata(client, NULL); + kfree(ts); + return 0; +} + +/******************************************************* +Description: + Novatek touchscreen driver suspend function. + +return: + Executive outcomes. 0---succeed. +*******************************************************/ +static int32_t nvt_ts_suspend(struct device *dev) +{ + uint8_t buf[4] = {0}; + int ret = 0; +#if MT_PROTOCOL_B + uint32_t i = 0; +#endif + + if (!bTouchIsAwake) { + NVT_LOG("Touch is already suspend\n"); + return 0; + } + + mutex_lock(&ts->lock); + NVT_LOG("start\n"); + bTouchIsAwake = 0; +#if NVT_TOUCH_ESD_PROTECT + cancel_delayed_work_sync(&nvt_esd_check_work); + nvt_esd_check_enable(false); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + + if (ts->gesture_enabled) { + /*---write i2c command to enter "wakeup gesture mode"---*/ + buf[0] = EVENT_MAP_HOST_CMD; + buf[1] = 0x13; +#if 0 /* Do not set 0xFF first, ToDo */ + buf[2] = 0xFF; + buf[3] = 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 4); +#else + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 2); +#endif + NVT_LOG("Enabled touch wakeup gesture\n"); + } else { + disable_irq_nosync(ts->client->irq); + /*---write i2c command to enter "deep sleep mode"---*/ + buf[0] = EVENT_MAP_HOST_CMD; + buf[1] = 0x11; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 2); + + if (ts->ts_pinctrl) { + ret = pinctrl_select_state(ts->ts_pinctrl, ts->pinctrl_state_suspend); + + if (ret < 0) { + NVT_ERR("Failed to select %s pinstate %d\n", + PINCTRL_STATE_SUSPEND, ret); + } else + NVT_ERR("select %s pinstate\n", PINCTRL_STATE_SUSPEND); + + } else { + NVT_ERR("Failed to init pinctrl\n"); + } + } + + /* release all touches */ +#if MT_PROTOCOL_B + + for (i = 0; i < ts->max_touch_num; i++) { + input_mt_slot(ts->input_dev, i); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0); + input_report_abs(ts->input_dev, ABS_MT_PRESSURE, 0); + input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 0); + } + +#endif + input_report_key(ts->input_dev, BTN_TOUCH, 0); +#if !MT_PROTOCOL_B + input_mt_sync(ts->input_dev); +#endif + input_sync(ts->input_dev); + msleep(50); + mutex_unlock(&ts->lock); + NVT_LOG("end\n"); + return 0; +} + +/******************************************************* +Description: + Novatek touchscreen driver resume function. + +return: + Executive outcomes. 0---succeed. +*******************************************************/ +static int32_t nvt_ts_resume(struct device *dev) +{ + int ret = 0; + + if (bTouchIsAwake) { + NVT_LOG("Touch is already resume\n"); + return 0; + } + + mutex_lock(&ts->lock); + NVT_LOG("start\n"); + /* please make sure display reset(RESX) sequence and mipi dsi cmds sent before this */ + nvt_bootloader_reset(); + nvt_check_fw_reset_state(RESET_STATE_REK); + + if ((ts->gesture_enabled && ts->gesture_disabled_when_resume) || !ts->gesture_enabled_when_resume) { + enable_irq(ts->client->irq); + + if (ts->ts_pinctrl) { + ret = pinctrl_select_state(ts->ts_pinctrl, ts->pinctrl_state_active); + + if (ret < 0) { + NVT_ERR("Failed to select %s pinstate %d\n", + PINCTRL_STATE_ACTIVE, ret); + } + } else { + NVT_ERR("Failed to init pinctrl\n"); + } + } + +#if NVT_TOUCH_ESD_PROTECT + queue_delayed_work(nvt_esd_check_wq, &nvt_esd_check_work, + msecs_to_jiffies(NVT_TOUCH_ESD_CHECK_PERIOD)); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + bTouchIsAwake = 1; + mutex_unlock(&ts->lock); + NVT_LOG("end\n"); + return 0; +} +static void nvt_resume_work(struct work_struct *work) +{ + struct nvt_ts_data *ts = + container_of(work, struct nvt_ts_data, resume_work); + nvt_ts_resume(&ts->client->dev); + ts->gesture_enabled_when_resume = false; + ts->gesture_disabled_when_resume = true; +} + +#if defined(CONFIG_DRM) +static int drm_notifier_callback(struct notifier_block *self, unsigned long event, void *data) +{ + struct fb_event *evdata = data; + int *blank; + struct nvt_ts_data *ts = + container_of(self, struct nvt_ts_data, notifier); + + if (evdata && evdata->data && event == DRM_EARLY_EVENT_BLANK) { + blank = evdata->data; + + if (*blank == DRM_BLANK_POWERDOWN) { + if (ts->gesture_enabled) { + nvt_enable_reg(ts, true); + drm_panel_reset_skip_enable(true); + /*drm_dsi_ulps_enable(true);*/ + /*drm_dsi_ulps_suspend_enable(true);*/ + } + nvt_ts_suspend(&ts->client->dev); + if (ts->tddi_tp_hw_reset && !ts->gesture_enabled) { + NVT_ERR("set tp reset low\n"); + gpio_direction_output(ts->reset_gpio, 0); + } + +#ifdef NVT_TOUCH_COUNT_DUMP + sysfs_notify(&ts->nvt_touch_dev->kobj, NULL, + "touch_suspend_notify"); +#endif + } else if (*blank == DRM_BLANK_UNBLANK) { + if (ts->gesture_enabled) { + if (ts->tddi_tp_hw_reset) + gpio_direction_output(ts->reset_gpio, 0); + gpio_direction_output(ts->reset_tddi, 0); + msleep(15); + gpio_direction_output(ts->reset_tddi, 1); + if (ts->tddi_tp_hw_reset) + gpio_direction_output(ts->reset_gpio, 1); + msleep(20); + } + } + } else if (evdata && evdata->data && event == DRM_EVENT_BLANK) { + blank = evdata->data; + + if (*blank == DRM_BLANK_UNBLANK) { + if (ts->gesture_enabled) { + drm_panel_reset_skip_enable(false); + /*drm_dsi_ulps_enable(false);*/ + /*drm_dsi_ulps_suspend_enable(false);*/ + nvt_enable_reg(ts, false); + } + if (ts->tddi_tp_hw_reset && !ts->gesture_enabled) { + NVT_ERR("set tp reset high\n"); + gpio_direction_output(ts->reset_gpio, 1); + } + nvt_ts_resume(&ts->client->dev); +#ifdef NVT_TOUCH_COUNT_DUMP + sysfs_notify(&ts->nvt_touch_dev->kobj, NULL, + "touch_suspend_notify"); +#endif + } + } + + return 0; +} + +#elif defined(CONFIG_FB) +static int fb_notifier_callback(struct notifier_block *self, unsigned long event, void *data) +{ + struct fb_event *evdata = data; + int *blank; + struct nvt_ts_data *ts = + container_of(self, struct nvt_ts_data, notifier); + + if (evdata && evdata->data && mdss_panel_is_prim(evdata->info)) { + blank = evdata->data; + if (event == FB_EARLY_EVENT_BLANK) { + if (*blank == FB_BLANK_POWERDOWN) { + flush_workqueue(ts->event_wq); + if (ts->gesture_enabled) { + nvt_enable_reg(ts, true); + ts->gesture_enabled_when_resume = true; + ts->gesture_disabled_when_resume = false; + mdss_panel_reset_skip_enable(true); + /*drm_dsi_ulps_enable(true);*/ + /*drm_dsi_ulps_suspend_enable(true);*/ + } + nvt_ts_suspend(&ts->client->dev); + if (ts->tddi_tp_hw_reset && !ts->gesture_enabled) { + NVT_ERR("set tp reset low\n"); + gpio_direction_output(ts->reset_gpio, 0); + } +#ifdef NVT_TOUCH_COUNT_DUMP + sysfs_notify(&ts->nvt_touch_dev->kobj, NULL, + "touch_suspend_notify"); +#endif + } else if (*blank == FB_BLANK_UNBLANK) { + if ((ts->gesture_enabled || !ts->gesture_disabled_when_resume) && ts->gesture_enabled_when_resume) { + if (ts->tddi_tp_hw_reset) + gpio_direction_output(ts->reset_gpio, 0); + gpio_direction_output(ts->reset_tddi, 0); + msleep(15); + gpio_direction_output(ts->reset_tddi, 1); + if (ts->tddi_tp_hw_reset) + gpio_direction_output(ts->reset_gpio, 1); + msleep(20); + } + } + } else if (event == FB_EVENT_BLANK) { + if (*blank == FB_BLANK_UNBLANK) { + if ((ts->gesture_enabled || !ts->gesture_disabled_when_resume) && ts->gesture_enabled_when_resume) { + mdss_panel_reset_skip_enable(false); + /*drm_dsi_ulps_enable(false);*/ + /*drm_dsi_ulps_suspend_enable(false);*/ + nvt_enable_reg(ts, false); + } + if (ts->tddi_tp_hw_reset && !ts->gesture_enabled) { + NVT_ERR("set tp reset high\n"); + gpio_direction_output(ts->reset_gpio, 1); + } + + flush_workqueue(ts->event_wq); + queue_work(ts->event_wq, &ts->resume_work); +#ifdef NVT_TOUCH_COUNT_DUMP + sysfs_notify(&ts->nvt_touch_dev->kobj, NULL, + "touch_suspend_notify"); +#endif + } + } + } + + return 0; +} + +#elif defined(CONFIG_HAS_EARLYSUSPEND) +/******************************************************* +Description: + Novatek touchscreen driver early suspend function. + +return: + n.a. +*******************************************************/ +static void nvt_ts_early_suspend(struct early_suspend *h) +{ + nvt_ts_suspend(ts->client, PMSG_SUSPEND); +} + +/******************************************************* +Description: + Novatek touchscreen driver late resume function. + +return: + n.a. +*******************************************************/ +static void nvt_ts_late_resume(struct early_suspend *h) +{ + nvt_ts_resume(ts->client); +} +#endif + +static const struct i2c_device_id nvt_ts_id[] = { + { NVT_I2C_NAME, 0 }, + { } +}; + +#ifdef CONFIG_OF +static struct of_device_id nvt_match_table[] = { + { .compatible = "novatek,NVT-ts",}, + { }, +}; +#endif +/* +static struct i2c_board_info __initdata nvt_i2c_boardinfo[] = { + { + I2C_BOARD_INFO(NVT_I2C_NAME, I2C_FW_Address), + }, +}; +*/ +#ifdef CONFIG_PM +static int nvt_pm_suspend(struct device *dev) +{ + if (device_may_wakeup(dev) && ts->gesture_enabled) { + NVT_LOG("enable touch irq wake\n"); + enable_irq_wake(ts->client->irq); + } + ts->dev_pm_suspend = true; + reinit_completion(&ts->dev_pm_suspend_completion); + + return 0; + +} + +static int nvt_pm_resume(struct device *dev) +{ + if (device_may_wakeup(dev) && ts->gesture_enabled) { + NVT_LOG("disable touch irq wake\n"); + disable_irq_wake(ts->client->irq); + } + ts->dev_pm_suspend = false; + complete(&ts->dev_pm_suspend_completion); + + return 0; +} +static const struct dev_pm_ops nvt_dev_pm_ops = { + .suspend = nvt_pm_suspend, + .resume = nvt_pm_resume, +}; +#endif + +static struct i2c_driver nvt_i2c_driver = { + .probe = nvt_ts_probe, + .remove = nvt_ts_remove, + /* .suspend = nvt_ts_suspend, */ + /* .resume = nvt_ts_resume, */ + .id_table = nvt_ts_id, + .driver = { + .name = NVT_I2C_NAME, + .owner = THIS_MODULE, +#ifdef CONFIG_PM + .pm = &nvt_dev_pm_ops, +#endif +#ifdef CONFIG_OF + .of_match_table = nvt_match_table, +#endif + }, +}; + +/******************************************************* +Description: + Driver Install function. + +return: + Executive Outcomes. 0---succeed. not 0---failed. +********************************************************/ +static int32_t __init nvt_driver_init(void) +{ + int32_t ret = 0; + NVT_LOG("start\n"); + /*---add i2c driver---*/ + ret = i2c_add_driver(&nvt_i2c_driver); + + if (ret) { + pr_err("%s: failed to add i2c driver", __func__); + goto err_driver; + } + + pr_info("%s: finished\n", __func__); +err_driver: + return ret; +} + +/******************************************************* +Description: + Driver uninstall function. + +return: + n.a. +********************************************************/ +static void __exit nvt_driver_exit(void) +{ + i2c_del_driver(&nvt_i2c_driver); + + if (nvt_wq) + destroy_workqueue(nvt_wq); + +#if BOOT_UPDATE_FIRMWARE_INWORK + + if (nvt_fwu_wq) + destroy_workqueue(nvt_fwu_wq); + +#endif +#if NVT_TOUCH_ESD_PROTECT + + if (nvt_esd_check_wq) + destroy_workqueue(nvt_esd_check_wq); + +#endif /* #if NVT_TOUCH_ESD_PROTECT */ +} + +/*late_initcall(nvt_driver_init);*/ +module_init(nvt_driver_init); +module_exit(nvt_driver_exit); + +MODULE_DESCRIPTION("Novatek Touchscreen Driver"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx.h b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx.h new file mode 100644 index 000000000000..12f7e18b58d4 --- /dev/null +++ b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx.h @@ -0,0 +1,225 @@ +/* + * Copyright (C) 2010 - 2017 Novatek, Inc. + * Copyright (C) 2020 XiaoMi, Inc. + * + * $Revision: 21600 $ + * $Date: 2018-01-12 15:21:45 +0800 (週五, 12 一月 2018) $ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + */ +#ifndef _LINUX_NVT_TOUCH_H +#define _LINUX_NVT_TOUCH_H + +#include <linux/i2c.h> +#include <linux/input.h> + +#ifdef CONFIG_HAS_EARLYSUSPEND +#include <linux/earlysuspend.h> +#endif + +#include "nt36xxx_mem_map.h" + +#define PINCTRL_STATE_ACTIVE "pmx_ts_active" +#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend" +#define PINCTRL_STATE_RELEASE "pmx_ts_release" +#define NVT_COORDS_ARR_SIZE 2 +#define NVT_DEBUG 1 + +/*---GPIO number---*/ +#define NVTTOUCH_INT_PIN 943 + + +/*---INT trigger mode---*/ +/*#define IRQ_TYPE_EDGE_RISING 1*/ +/*#define IRQ_TYPE_EDGE_FALLING 2*/ +#define INT_TRIGGER_TYPE IRQ_TYPE_EDGE_RISING + + +/*---I2C driver info.---*/ +#define NVT_I2C_NAME "NVT-ts" +#define I2C_BLDR_Address 0x01 +#define I2C_FW_Address 0x01 +#define I2C_HW_Address 0x62 + +#if NVT_DEBUG +#define NVT_LOG(fmt, args...) pr_err("[%s] %s %d: " fmt, NVT_I2C_NAME, __func__, __LINE__, ##args) +#else +#define NVT_LOG(fmt, args...) pr_info("[%s] %s %d: " fmt, NVT_I2C_NAME, __func__, __LINE__, ##args) +#endif +#define NVT_ERR(fmt, args...) pr_err("[%s] %s %d: " fmt, NVT_I2C_NAME, __func__, __LINE__, ##args) + +/*---Input device info.---*/ +#define NVT_TS_NAME "NVTCapacitiveTouchScreen" + + +/*---Touch info.---*/ +#define TOUCH_DEFAULT_MAX_WIDTH 1080 +#define TOUCH_DEFAULT_MAX_HEIGHT 2246 +#define TOUCH_MAX_FINGER_NUM 10 +#define TOUCH_KEY_NUM 0 +#if TOUCH_KEY_NUM > 0 +extern const uint16_t touch_key_array[TOUCH_KEY_NUM]; +#endif +#define TOUCH_FORCE_NUM 1000 + +/*---Customerized func.---*/ +#define NVT_TOUCH_PROC 1 +#define NVT_TOUCH_EXT_PROC 1 +#define NVT_TOUCH_MP 1 +#define MT_PROTOCOL_B 1 +#define WAKEUP_GESTURE 1 +#if WAKEUP_GESTURE +extern const uint16_t gesture_key_array[]; +#endif +#define BOOT_UPDATE_FIRMWARE_INWORK 0 +#define BOOT_UPDATE_FIRMWARE_NAME "novatek_nt36672_d2t.fw" + +/*---ESD Protect.---*/ +#define NVT_TOUCH_ESD_PROTECT 0 +#define NVT_TOUCH_ESD_CHECK_PERIOD 1500 /* ms */ +#define NVT_LOCKDOWN_SIZE 8 + +#define NVT_TOUCH_COUNT_DUMP +#ifdef NVT_TOUCH_COUNT_DUMP +#define TOUCH_COUNT_FILE_MAXSIZE 50 +#endif + +struct nvt_config_info { + u8 tp_vendor; + u8 tp_color; + u8 tp_hw_version; + const char *nvt_cfg_name; + const char *nvt_limit_name; +#ifdef NVT_TOUCH_COUNT_DUMP + const char *clicknum_file_name; +#endif +}; + +struct nvt_ts_data { + struct i2c_client *client; + struct input_dev *input_dev; + struct delayed_work nvt_fwu_work; + struct regulator *vddio_reg; + struct regulator *lab_reg; + struct regulator *ibb_reg; + struct nvt_config_info *config_array; + struct attribute_group attrs; + struct proc_dir_entry *tp_selftest_proc; + struct dentry *debugfs; + struct pinctrl *ts_pinctrl; + struct pinctrl_state *pinctrl_state_active; + struct pinctrl_state *pinctrl_state_suspend; + const char *vddio_reg_name; + const char *lab_reg_name; + const char *ibb_reg_name; + const char *fw_name; + + int result_type; + u8 lockdown_info[NVT_LOCKDOWN_SIZE]; + uint16_t addr; + int8_t phys[32]; +#if defined(CONFIG_DRM) || defined(CONFIG_FB) + struct notifier_block notifier; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif + uint8_t fw_ver; + uint8_t x_num; + uint8_t y_num; + uint16_t abs_x_max; + uint16_t abs_y_max; + uint8_t max_touch_num; + uint8_t max_button_num; + uint32_t int_trigger_type; + int32_t irq_gpio; + uint32_t irq_flags; + int32_t reset_gpio; + uint32_t reset_flags; + int32_t reset_tddi; + struct mutex lock; + struct mutex mdata_lock; + const struct nvt_ts_mem_map *mmap; + uint8_t carrier_system; + uint16_t nvt_pid; + + int gesture_enabled; + int glove_enabled; + int charger_enabled; + int stylus_enabled; + int cover_enabled; + int grip_enabled; + int dbclick_count; + size_t config_array_size; + int current_index; + bool dev_pm_suspend; + struct completion dev_pm_suspend_completion; + struct work_struct resume_work; + struct workqueue_struct *event_wq; +#ifdef NVT_TOUCH_COUNT_DUMP + struct class *nvt_tp_class; + struct device *nvt_touch_dev; + bool dump_click_count; + char *current_clicknum_file; +#endif + bool tddi_tp_hw_reset; + bool gesture_enabled_when_resume; + bool gesture_disabled_when_resume; +}; + +struct nvt_mode_switch { + struct nvt_ts_data *nvt_data; + unsigned char mode; + struct work_struct switch_mode_work; +}; + +#if NVT_TOUCH_PROC +struct nvt_flash_data { + rwlock_t lock; + struct i2c_client *client; +}; +#endif + +typedef enum { + RESET_STATE_INIT = 0xA0,/* IC reset */ + RESET_STATE_REK, /* ReK baseline */ + RESET_STATE_REK_FINISH, /* baseline is ready */ + RESET_STATE_NORMAL_RUN, /* normal run */ + RESET_STATE_MAX = 0xAF +} RST_COMPLETE_STATE; + +typedef enum { + EVENT_MAP_HOST_CMD = 0x50, + EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE = 0x51, + EVENT_MAP_RESET_COMPLETE = 0x60, + EVENT_MAP_FWINFO = 0x78, + EVENT_MAP_PROJECTID = 0x9A, +} I2C_EVENT_MAP; + +/*---extern structures---*/ +extern struct nvt_ts_data *ts; + +/*---extern functions---*/ +extern int32_t CTP_I2C_READ(struct i2c_client *client, uint16_t address, uint8_t *buf, uint16_t len); +extern int32_t CTP_I2C_WRITE(struct i2c_client *client, uint16_t address, uint8_t *buf, uint16_t len); +extern int nvt_bootloader_reset(void); +extern void nvt_sw_reset_idle(void); +extern int32_t nvt_check_fw_reset_state(RST_COMPLETE_STATE check_reset_state); +extern int32_t nvt_get_fw_info(void); +extern int32_t nvt_clear_fw_status(void); +extern int32_t nvt_check_fw_status(void); +#if NVT_TOUCH_ESD_PROTECT +extern void nvt_esd_check_enable(uint8_t enable); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ +extern void nvt_stop_crc_reboot(void); +extern int32_t nvt_get_lockdown_info(char *lockdata); + +#endif /* _LINUX_NVT_TOUCH_H */ diff --git a/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_ext_proc.c b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_ext_proc.c new file mode 100644 index 000000000000..e4fa3eb6c810 --- /dev/null +++ b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_ext_proc.c @@ -0,0 +1,1070 @@ +/* + * Copyright (C) 2010 - 2017 Novatek, Inc. + * Copyright (C) 2020 XiaoMi, Inc. + * + * $Revision: 21600 $ + * $Date: 2018-01-12 15:21:45 +0800 (週五, 12 一月 2018) $ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + */ + + +#include <linux/proc_fs.h> +#include <linux/seq_file.h> +#include <linux/delay.h> + +#include "nt36xxx.h" + +#if NVT_TOUCH_EXT_PROC +#define NVT_FW_VERSION "nvt_fw_version" +#define NVT_BASELINE "nvt_baseline" +#define NVT_RAW "nvt_raw" +#define NVT_DIFF "nvt_diff" +#define NVT_TP_DATADUMP "tp_data_dump" +#define NVT_XIAOMI_CONFIG_INFO "nvt_xiaomi_config_info" +#define NVT_XIAOMI_LOCKDOWN_INFO "tp_lockdown_info" +#define TP_FW_VERSION "tp_fw_version" +#define I2C_TANSFER_LENGTH 64 + +#define NORMAL_MODE 0x00 +#define TEST_MODE_1 0x21 +#define TEST_MODE_2 0x22 +#define HANDSHAKING_HOST_READY 0xBB + +#define XDATA_SECTOR_SIZE 256 + +extern int32_t Init_BootLoader(void); +extern int32_t Resume_PD(void); + +static uint8_t xdata_tmp[2048] = {0}; +static int32_t xdata[2048] = {0}; +static uint8_t xdata_i[2048] = {0}; +static int32_t xdata_q[2048] = {0}; + +static struct proc_dir_entry *NVT_tp_fw_version_entry; +static struct proc_dir_entry *NVT_proc_fw_version_entry; +static struct proc_dir_entry *NVT_proc_baseline_entry; +static struct proc_dir_entry *NVT_proc_raw_entry; +static struct proc_dir_entry *NVT_proc_diff_entry; +static struct proc_dir_entry *NVT_proc_datadump_entry; +static struct proc_dir_entry *NVT_proc_xiaomi_config_info_entry; +static struct proc_dir_entry *NVT_proc_xiaomi_lockdown_info_entry; + +/* Xiaomi Config Info. */ +static uint8_t nvt_xiaomi_conf_info_fw_ver; +static uint8_t nvt_xiaomi_conf_info_fae_id; +static uint64_t nvt_xiaomi_conf_info_reservation; + +/******************************************************* +Description: + Novatek touchscreen change mode function. + +return: + n.a. +*******************************************************/ +void nvt_change_mode(uint8_t mode) +{ + uint8_t buf[8] = {0}; + /*---set xdata index to EVENT BUF ADDR---*/ + buf[0] = 0xFF; + buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---set mode---*/ + buf[0] = EVENT_MAP_HOST_CMD; + buf[1] = mode; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 2); + + if (mode == NORMAL_MODE) { + buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE; + buf[1] = HANDSHAKING_HOST_READY; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 2); + msleep(20); + } +} + +/******************************************************* +Description: + Novatek touchscreen get firmware pipe function. + +return: + Executive outcomes. 0---pipe 0. 1---pipe 1. +*******************************************************/ +uint8_t nvt_get_fw_pipe(void) +{ + uint8_t buf[8] = {0}; + /*---set xdata index to EVENT BUF ADDR---*/ + buf[0] = 0xFF; + buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---read fw status---*/ + buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE; + buf[1] = 0x00; + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 2); + /*NVT_LOG("FW pipe=%d, buf[1]=0x%02X\n", (buf[1]&0x01), buf[1]);*/ + return (buf[1] & 0x01); +} + +/******************************************************* +Description: + Novatek touchscreen read meta data function. + +return: + n.a. +*******************************************************/ +void nvt_read_mdata(uint32_t xdata_addr, uint32_t xdata_btn_addr) +{ + int32_t i = 0; + int32_t j = 0; + int32_t k = 0; + uint8_t buf[I2C_TANSFER_LENGTH + 1] = {0}; + uint32_t head_addr = 0; + int32_t dummy_len = 0; + int32_t data_len = 0; + int32_t residual_len = 0; + /*---set xdata sector address & length---*/ + head_addr = xdata_addr - (xdata_addr % XDATA_SECTOR_SIZE); + dummy_len = xdata_addr - head_addr; + data_len = ts->x_num * ts->y_num * 2; + residual_len = (head_addr + dummy_len + data_len) % XDATA_SECTOR_SIZE; + mutex_lock(&ts->mdata_lock); + + /*printk("head_addr=0x%05X, dummy_len=0x%05X, data_len=0x%05X, residual_len=0x%05X\n", head_addr, dummy_len, data_len, residual_len);*/ + + /*read xdata : step 1*/ + for (i = 0; i < ((dummy_len + data_len) / XDATA_SECTOR_SIZE); i++) { + /*---change xdata index---*/ + buf[0] = 0xFF; + buf[1] = ((head_addr + XDATA_SECTOR_SIZE * i) >> 16) & 0xFF; + buf[2] = ((head_addr + XDATA_SECTOR_SIZE * i) >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + + /*---read xdata by I2C_TANSFER_LENGTH---*/ + for (j = 0; j < (XDATA_SECTOR_SIZE / I2C_TANSFER_LENGTH); j++) { + /*---read data---*/ + msleep(15); + buf[0] = I2C_TANSFER_LENGTH * j; + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, I2C_TANSFER_LENGTH + 1); + + /*---copy buf to xdata_tmp---*/ + for (k = 0; k < I2C_TANSFER_LENGTH; k++) { + xdata_tmp[XDATA_SECTOR_SIZE * i + I2C_TANSFER_LENGTH * j + k] = buf[k + 1]; + /*printk("0x%02X, 0x%04X\n", buf[k+1], (XDATA_SECTOR_SIZE*i + I2C_TANSFER_LENGTH*j + k));*/ + } + } + + /*printk("addr=0x%05X\n", (head_addr+XDATA_SECTOR_SIZE*i));*/ + } + + /*read xdata : step2*/ + if (residual_len != 0) { + /*---change xdata index---*/ + buf[0] = 0xFF; + buf[1] = ((xdata_addr + data_len - residual_len) >> 16) & 0xFF; + buf[2] = ((xdata_addr + data_len - residual_len) >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + + /*---read xdata by I2C_TANSFER_LENGTH---*/ + for (j = 0; j < (residual_len / I2C_TANSFER_LENGTH + 1); j++) { + /*---read data---*/ + msleep(15); + buf[0] = I2C_TANSFER_LENGTH * j; + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, I2C_TANSFER_LENGTH + 1); + + /*---copy buf to xdata_tmp---*/ + for (k = 0; k < I2C_TANSFER_LENGTH; k++) { + xdata_tmp[(dummy_len + data_len - residual_len) + I2C_TANSFER_LENGTH * j + k] = buf[k + 1]; + /*printk("0x%02X, 0x%04x\n", buf[k+1], ((dummy_len+data_len-residual_len) + I2C_TANSFER_LENGTH*j + k));*/ + } + } + + /*printk("addr=0x%05X\n", (xdata_addr+data_len-residual_len));*/ + } + + /*---remove dummy data and 2bytes-to-1data---*/ + for (i = 0; i < (data_len / 2); i++) { + xdata[i] = (int16_t)(xdata_tmp[dummy_len + i * 2] + 256 * xdata_tmp[dummy_len + i * 2 + 1]); + } + +#if TOUCH_KEY_NUM > 0 + /*read button xdata : step3*/ + /*---change xdata index---*/ + buf[0] = 0xFF; + buf[1] = (xdata_btn_addr >> 16) & 0xFF; + buf[2] = ((xdata_btn_addr >> 8) & 0xFF); + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---read data---*/ + buf[0] = (xdata_btn_addr & 0xFF); + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, (TOUCH_KEY_NUM * 2 + 1)); + + /*---2bytes-to-1data---*/ + for (i = 0; i < TOUCH_KEY_NUM; i++) { + xdata[ts->x_num * ts->y_num + i] = (int16_t)(buf[1 + i * 2] + 256 * buf[1 + i * 2 + 1]); + } + +#endif + mutex_unlock(&ts->mdata_lock); + /*---set xdata index to EVENT BUF ADDR---*/ + buf[0] = 0xFF; + buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); +} + +/******************************************************* +Description: + Novatek touchscreen read meta data from IQ to rss function. + +return: + n.a. +*******************************************************/ +void nvt_read_mdata_rss(uint32_t xdata_i_addr, uint32_t xdata_q_addr, uint32_t xdata_btn_i_addr, uint32_t xdata_btn_q_addr) +{ + int i = 0; + mutex_lock(&ts->mdata_lock); + nvt_read_mdata(xdata_i_addr, xdata_btn_i_addr); + memcpy(xdata_i, xdata, ((ts->x_num * ts->y_num + TOUCH_KEY_NUM) * sizeof(int32_t))); + nvt_read_mdata(xdata_q_addr, xdata_btn_q_addr); + memcpy(xdata_q, xdata, ((ts->x_num * ts->y_num + TOUCH_KEY_NUM) * sizeof(int32_t))); + + for (i = 0; i < (ts->x_num * ts->y_num + TOUCH_KEY_NUM); i++) { + xdata[i] = (uint8_t)int_sqrt((unsigned long)(xdata_i[i] * xdata_i[i]) + (unsigned long)(xdata_q[i] * xdata_q[i])); + } + + mutex_unlock(&ts->mdata_lock); +} + +/******************************************************* +Description: + Novatek touchscreen get meta data function. + +return: + n.a. +*******************************************************/ +void nvt_get_mdata(int32_t *buf, uint8_t *m_x_num, uint8_t *m_y_num) +{ + *m_x_num = ts->x_num; + *m_y_num = ts->y_num; + mutex_lock(&ts->mdata_lock); + memcpy(buf, xdata, ((ts->x_num * ts->y_num + TOUCH_KEY_NUM) * sizeof(int32_t))); + mutex_unlock(&ts->mdata_lock); +} + +/******************************************************* +Description: + Novatek touchscreen firmware version show function. + +return: + Executive outcomes. 0---succeed. +*******************************************************/ +static int32_t c_fw_version_show(struct seq_file *m, void *v) +{ + seq_printf(m, "fw_ver=%d, x_num=%d, y_num=%d, button_num=%d\n", ts->fw_ver, ts->x_num, ts->y_num, ts->max_button_num); + return 0; +} +static int32_t c_tp_fw_version_show(struct seq_file *m, void *v) +{ + seq_printf(m, "fw_ver=%d\n", ts->fw_ver); + return 0; +} +/******************************************************* +Description: + Novatek touchscreen xdata sequence print show + function. + +return: + Executive outcomes. 0---succeed. +*******************************************************/ +static int32_t c_show(struct seq_file *m, void *v) +{ + int32_t i = 0; + int32_t j = 0; + + for (i = 0; i < ts->y_num; i++) { + for (j = 0; j < ts->x_num; j++) { + seq_printf(m, "%5d, ", xdata[i * ts->x_num + j]); + } + + seq_puts(m, "\n"); + } + +#if TOUCH_KEY_NUM > 0 + + for (i = 0; i < TOUCH_KEY_NUM; i++) { + seq_printf(m, "%5d, ", xdata[ts->x_num * ts->y_num + i]); + } + + seq_puts(m, "\n"); +#endif + seq_printf(m, "\n\n"); + return 0; +} + +/******************************************************* +Description: + Novatek touchscreen xdata sequence print start + function. + +return: + Executive outcomes. 1---call next function. + NULL---not call next function and sequence loop + stop. +*******************************************************/ +static void *c_start(struct seq_file *m, loff_t *pos) +{ + return *pos < 1 ? (void *)1 : NULL; +} + +/******************************************************* +Description: + Novatek touchscreen xdata sequence print next + function. + +return: + Executive outcomes. NULL---no next and call sequence + stop function. +*******************************************************/ +static void *c_next(struct seq_file *m, void *v, loff_t *pos) +{ + ++*pos; + return NULL; +} + +/******************************************************* +Description: + Novatek touchscreen xdata sequence print stop + function. + +return: + n.a. +*******************************************************/ +static void c_stop(struct seq_file *m, void *v) +{ + return; +} + +const struct seq_operations nvt_fw_version_seq_ops = { + .start = c_start, + .next = c_next, + .stop = c_stop, + .show = c_fw_version_show +}; +const struct seq_operations tp_fw_version_seq_ops = { + .start = c_start, + .next = c_next, + .stop = c_stop, + .show = c_tp_fw_version_show +}; +const struct seq_operations nvt_seq_ops = { + .start = c_start, + .next = c_next, + .stop = c_stop, + .show = c_show +}; + +/******************************************************* +Description: + Novatek touchscreen /proc/nvt_fw_version open + function. + +return: + n.a. +*******************************************************/ +static int32_t nvt_fw_version_open(struct inode *inode, struct file *file) +{ + if (mutex_lock_interruptible(&ts->lock)) { + return -ERESTARTSYS; + } + + NVT_LOG("++\n"); +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + + if (nvt_get_fw_info()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + mutex_unlock(&ts->lock); + NVT_LOG("--\n"); + return seq_open(file, &nvt_fw_version_seq_ops); +} + +static const struct file_operations nvt_fw_version_fops = { + .owner = THIS_MODULE, + .open = nvt_fw_version_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; +/******************************************************* +Description: + Novatek touchscreen /proc/tp_fw_version open function. + +return: + Executive outcomes. 0---succeed. +*******************************************************/ +static int32_t tp_fw_version_open(struct inode *inode, struct file *file) +{ + if (mutex_lock_interruptible(&ts->lock)) { + return -ERESTARTSYS; + } + + NVT_LOG("++\n"); +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + + if (nvt_get_fw_info()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + mutex_unlock(&ts->lock); + NVT_LOG("--\n"); + return seq_open(file, &tp_fw_version_seq_ops); +} + +static const struct file_operations tp_fw_version_fops = { + .owner = THIS_MODULE, + .open = tp_fw_version_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +/******************************************************* +Description: + Novatek touchscreen /proc/nvt_baseline open function. + +return: + Executive outcomes. 0---succeed. +*******************************************************/ +static int32_t nvt_baseline_open(struct inode *inode, struct file *file) +{ + if (mutex_lock_interruptible(&ts->lock)) { + return -ERESTARTSYS; + } + + NVT_LOG("++\n"); +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + + if (nvt_clear_fw_status()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + nvt_change_mode(TEST_MODE_2); + + if (nvt_check_fw_status()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + if (nvt_get_fw_info()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + if (ts->carrier_system) { + nvt_read_mdata_rss(ts->mmap->BASELINE_ADDR, ts->mmap->BASELINE_Q_ADDR, + ts->mmap->BASELINE_BTN_ADDR, ts->mmap->BASELINE_BTN_Q_ADDR); + } else { + nvt_read_mdata(ts->mmap->BASELINE_ADDR, ts->mmap->BASELINE_BTN_ADDR); + } + + nvt_change_mode(NORMAL_MODE); + mutex_unlock(&ts->lock); + NVT_LOG("--\n"); + return seq_open(file, &nvt_seq_ops); +} + +static const struct file_operations nvt_baseline_fops = { + .owner = THIS_MODULE, + .open = nvt_baseline_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +/******************************************************* +Description: + Novatek touchscreen /proc/nvt_raw open function. + +return: + Executive outcomes. 0---succeed. +*******************************************************/ +static int32_t nvt_raw_open(struct inode *inode, struct file *file) +{ + if (mutex_lock_interruptible(&ts->lock)) { + return -ERESTARTSYS; + } + + NVT_LOG("++\n"); +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + + if (nvt_clear_fw_status()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + nvt_change_mode(TEST_MODE_2); + + if (nvt_check_fw_status()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + if (nvt_get_fw_info()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + if (ts->carrier_system) { + if (nvt_get_fw_pipe() == 0) + nvt_read_mdata_rss(ts->mmap->RAW_PIPE0_ADDR, ts->mmap->RAW_PIPE0_Q_ADDR, + ts->mmap->RAW_BTN_PIPE0_ADDR, ts->mmap->RAW_BTN_PIPE0_Q_ADDR); + else + nvt_read_mdata_rss(ts->mmap->RAW_PIPE1_ADDR, ts->mmap->RAW_PIPE1_Q_ADDR, + ts->mmap->RAW_BTN_PIPE1_ADDR, ts->mmap->RAW_BTN_PIPE1_Q_ADDR); + } else { + if (nvt_get_fw_pipe() == 0) + nvt_read_mdata(ts->mmap->RAW_PIPE0_ADDR, ts->mmap->RAW_BTN_PIPE0_ADDR); + else + nvt_read_mdata(ts->mmap->RAW_PIPE1_ADDR, ts->mmap->RAW_BTN_PIPE1_ADDR); + } + + nvt_change_mode(NORMAL_MODE); + mutex_unlock(&ts->lock); + NVT_LOG("--\n"); + return seq_open(file, &nvt_seq_ops); +} + +static const struct file_operations nvt_raw_fops = { + .owner = THIS_MODULE, + .open = nvt_raw_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +/******************************************************* +Description: + Novatek touchscreen /proc/nvt_diff open function. + +return: + Executive outcomes. 0---succeed. negative---failed. +*******************************************************/ +static int32_t nvt_diff_open(struct inode *inode, struct file *file) +{ + if (mutex_lock_interruptible(&ts->lock)) { + return -ERESTARTSYS; + } + + NVT_LOG("++\n"); +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + + if (nvt_clear_fw_status()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + nvt_change_mode(TEST_MODE_2); + + if (nvt_check_fw_status()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + if (nvt_get_fw_info()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + if (ts->carrier_system) { + if (nvt_get_fw_pipe() == 0) + nvt_read_mdata_rss(ts->mmap->DIFF_PIPE0_ADDR, ts->mmap->DIFF_PIPE0_Q_ADDR, + ts->mmap->DIFF_BTN_PIPE0_ADDR, ts->mmap->DIFF_BTN_PIPE0_Q_ADDR); + else + nvt_read_mdata_rss(ts->mmap->DIFF_PIPE1_ADDR, ts->mmap->DIFF_PIPE1_Q_ADDR, + ts->mmap->DIFF_BTN_PIPE1_ADDR, ts->mmap->DIFF_BTN_PIPE1_Q_ADDR); + } else { + if (nvt_get_fw_pipe() == 0) + nvt_read_mdata(ts->mmap->DIFF_PIPE0_ADDR, ts->mmap->DIFF_BTN_PIPE0_ADDR); + else + nvt_read_mdata(ts->mmap->DIFF_PIPE1_ADDR, ts->mmap->DIFF_BTN_PIPE1_ADDR); + } + + nvt_change_mode(NORMAL_MODE); + mutex_unlock(&ts->lock); + NVT_LOG("--\n"); + return seq_open(file, &nvt_seq_ops); +} + +static const struct file_operations nvt_diff_fops = { + .owner = THIS_MODULE, + .open = nvt_diff_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +static int nvt_datadump_msg_show(struct seq_file *m, void *v) +{ + int i, j; + seq_printf(m, "NVT_raw\n"); + if (mutex_lock_interruptible(&ts->lock)) { + return -ERESTARTSYS; + } + + NVT_LOG("++\n"); +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + + if (nvt_clear_fw_status()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + nvt_change_mode(TEST_MODE_2); + + if (nvt_check_fw_status()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + if (nvt_get_fw_info()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + if (ts->carrier_system) { + if (nvt_get_fw_pipe() == 0) + nvt_read_mdata_rss(ts->mmap->RAW_PIPE0_ADDR, ts->mmap->RAW_PIPE0_Q_ADDR, + ts->mmap->RAW_BTN_PIPE0_ADDR, ts->mmap->RAW_BTN_PIPE0_Q_ADDR); + else + nvt_read_mdata_rss(ts->mmap->RAW_PIPE1_ADDR, ts->mmap->RAW_PIPE1_Q_ADDR, + ts->mmap->RAW_BTN_PIPE1_ADDR, ts->mmap->RAW_BTN_PIPE1_Q_ADDR); + } else { + if (nvt_get_fw_pipe() == 0) + nvt_read_mdata(ts->mmap->RAW_PIPE0_ADDR, ts->mmap->RAW_BTN_PIPE0_ADDR); + else + nvt_read_mdata(ts->mmap->RAW_PIPE1_ADDR, ts->mmap->RAW_BTN_PIPE1_ADDR); + } + + nvt_change_mode(NORMAL_MODE); + mutex_unlock(&ts->lock); + NVT_LOG("--\n"); + for (i = 0; i < ts->y_num; i++) { + for (j = 0; j < ts->x_num; j++) { + seq_printf(m, "%5d, ", xdata[i * ts->x_num + j]); + } + + seq_puts(m, "\n"); + } + NVT_LOG("start geting NVT_diff data\n"); + seq_printf(m, "NVT_diff\n"); + if (mutex_lock_interruptible(&ts->lock)) { + return -ERESTARTSYS; + } + + NVT_LOG("++\n"); +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + + if (nvt_clear_fw_status()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + nvt_change_mode(TEST_MODE_2); + + if (nvt_check_fw_status()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + if (nvt_get_fw_info()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + if (ts->carrier_system) { + if (nvt_get_fw_pipe() == 0) + nvt_read_mdata_rss(ts->mmap->DIFF_PIPE0_ADDR, ts->mmap->DIFF_PIPE0_Q_ADDR, + ts->mmap->DIFF_BTN_PIPE0_ADDR, ts->mmap->DIFF_BTN_PIPE0_Q_ADDR); + else + nvt_read_mdata_rss(ts->mmap->DIFF_PIPE1_ADDR, ts->mmap->DIFF_PIPE1_Q_ADDR, + ts->mmap->DIFF_BTN_PIPE1_ADDR, ts->mmap->DIFF_BTN_PIPE1_Q_ADDR); + } else { + if (nvt_get_fw_pipe() == 0) + nvt_read_mdata(ts->mmap->DIFF_PIPE0_ADDR, ts->mmap->DIFF_BTN_PIPE0_ADDR); + else + nvt_read_mdata(ts->mmap->DIFF_PIPE1_ADDR, ts->mmap->DIFF_BTN_PIPE1_ADDR); + } + + nvt_change_mode(NORMAL_MODE); + mutex_unlock(&ts->lock); + NVT_LOG("--\n"); + for (i = 0; i < ts->y_num; i++) { + for (j = 0; j < ts->x_num; j++) { + seq_printf(m, "%5d, ", xdata[i * ts->x_num + j]); + } + + seq_puts(m, "\n"); + } + return 0; +} + + +static int32_t nvt_datadump_open(struct inode *inode, struct file *file) +{ + return single_open(file, &nvt_datadump_msg_show, NULL); +} + + +static const struct file_operations nvt_tp_data_dump_ops = { + .owner = THIS_MODULE, + .open = nvt_datadump_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +static int nvt_xiaomi_config_info_show(struct seq_file *m, void *v) +{ + seq_printf(m, "FW version/Config version, Debug version: 0x%02X\n", nvt_xiaomi_conf_info_fw_ver); + seq_printf(m, "FAE ID: 0x%02X\n", nvt_xiaomi_conf_info_fae_id); + seq_printf(m, "Reservation byte: 0x%012llX\n", nvt_xiaomi_conf_info_reservation); + return 0; +} + +static int32_t nvt_xiaomi_config_info_open(struct inode *inode, struct file *file) +{ + uint8_t buf[16] = {0}; + + if (mutex_lock_interruptible(&ts->lock)) { + return -ERESTARTSYS; + } + + NVT_LOG("++\n"); +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + /*---set xdata index to EVENT BUF ADDR---*/ + buf[0] = 0xFF; + buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + buf[0] = 0x9C; + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 9); + nvt_xiaomi_conf_info_fw_ver = buf[1]; + nvt_xiaomi_conf_info_fae_id = buf[2]; + nvt_xiaomi_conf_info_reservation = (((uint64_t)buf[3] << 40) | ((uint64_t)buf[4] << 32) | ((uint64_t)buf[5] << 24) | ((uint64_t)buf[6] << 16) | ((uint64_t)buf[7] << 8) | (uint64_t)buf[8]); + mutex_unlock(&ts->lock); + NVT_LOG("--\n"); + return single_open(file, nvt_xiaomi_config_info_show, NULL); +} + +static const struct file_operations nvt_xiaomi_config_info_fops = { + .owner = THIS_MODULE, + .open = nvt_xiaomi_config_info_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int32_t nvt_get_oem_data(uint8_t *data, uint32_t flash_address, int32_t size) +{ + uint8_t buf[64] = {0}; + uint8_t tmp_data[512] = {0}; + int32_t count_256 = 0; + uint32_t cur_flash_addr = 0; + uint32_t cur_sram_addr = 0; + uint16_t checksum_get = 0; + uint16_t checksum_cal = 0; + int32_t i = 0; + int32_t j = 0; + int32_t ret = 0; + int32_t retry = 0; + NVT_LOG("++\n"); + + /* maximum 256 bytes each read */ + if (size % 256) + count_256 = size / 256 + 1; + else + count_256 = size / 256; + +get_oem_data_retry: + nvt_sw_reset_idle(); + + /* check and stop crc reboot loop*/ + nvt_stop_crc_reboot(); + + /* Step 1: Initial BootLoader */ + ret = Init_BootLoader(); + + if (ret < 0) { + goto get_oem_data_out; + } + + /* Step 2: Resume PD */ + ret = Resume_PD(); + + if (ret < 0) { + goto get_oem_data_out; + } + + /* Step 3: Unlock */ + buf[0] = 0x00; + buf[1] = 0x35; + CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + msleep(10); + + for (i = 0; i < count_256; i++) { + cur_flash_addr = flash_address + i * 256; + /* Step 4: Flash Read Command */ + buf[0] = 0x00; + buf[1] = 0x03; + buf[2] = ((cur_flash_addr >> 16) & 0xFF); + buf[3] = ((cur_flash_addr >> 8) & 0xFF); + buf[4] = (cur_flash_addr & 0xFF); + buf[5] = 0x00; + buf[6] = 0xFF; + CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 7); + msleep(10); + /* Check 0xAA (Read Command) */ + buf[0] = 0x00; + buf[2] = 0x00; + CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2); + + if (buf[1] != 0xAA) { + NVT_ERR("Check 0xAA (Read Command) error!! status=0x%02X\n", buf[1]); + ret = -1; + goto get_oem_data_out; + } + + msleep(10); + + /* Step 5: Read Data and Checksum */ + for (j = 0; j < ((256 / 32) + 1); j++) { + cur_sram_addr = ts->mmap->READ_FLASH_CHECKSUM_ADDR + j * 32; + buf[0] = 0xFF; + buf[1] = (cur_sram_addr >> 16) & 0xFF; + buf[2] = (cur_sram_addr >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3); + buf[0] = cur_sram_addr & 0xFF; + CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 33); + memcpy(tmp_data + j * 32, buf + 1, 32); + } + + /* get checksum of the 256 bytes data read */ + checksum_get = (uint16_t)((tmp_data[1] << 8) | tmp_data[0]); + /* calculate checksum of of the 256 bytes data read */ + checksum_cal = (uint16_t)((cur_flash_addr >> 16) & 0xFF) + (uint16_t)((cur_flash_addr >> 8) & 0xFF) + (cur_flash_addr & 0xFF) + 0x00 + 0xFF; + + for (j = 0; j < 256; j++) { + checksum_cal += tmp_data[j + 2]; + } + + checksum_cal = 65535 - checksum_cal + 1; + + /*NVT_LOG("checksum_get = 0x%04X, checksum_cal = 0x%04X\n", checksum_get, checksum_cal);*/ + /* compare the checksum got and calculated */ + if (checksum_get != checksum_cal) { + if (retry < 3) { + retry++; + goto get_oem_data_retry; + } else { + NVT_ERR("Checksum not match error! checksum_get=0x%04X, checksum_cal=0x%04X, i=%d\n", checksum_get, checksum_cal, i); + ret = -2; + goto get_oem_data_out; + } + } + + /* Step 6: Remapping (Remove 2 Bytes Checksum) */ + if ((i + 1) * 256 > size) { + memcpy(data + i * 256, tmp_data + 2, size - i * 256); + } else { + memcpy(data + i * 256, tmp_data + 2, 256); + } + } + +#if 0 /* for debug */ + + for (i = 0; i < size; i++) { + if (i % 16 == 0) + printk("\n"); + + printk("%02X ", data[i]); + } + + printk("\n"); +#endif +get_oem_data_out: + nvt_bootloader_reset(); + nvt_check_fw_reset_state(RESET_STATE_INIT); + NVT_LOG("--\n"); + return ret; +} + +static int nvt_xiaomi_lockdown_info_show(struct seq_file *m, void *v) +{ + seq_printf(m, "0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x\n", + ts->lockdown_info[0], + ts->lockdown_info[1], + ts->lockdown_info[2], + ts->lockdown_info[3], + ts->lockdown_info[4], + ts->lockdown_info[5], + ts->lockdown_info[6], + ts->lockdown_info[7]); + return 0; +} + +static int32_t nvt_xiaomi_lockdown_info_open(struct inode *inode, struct file *file) +{ + return single_open(file, nvt_xiaomi_lockdown_info_show, NULL); +} + +static const struct file_operations nvt_xiaomi_lockdown_info_fops = { + .owner = THIS_MODULE, + .open = nvt_xiaomi_lockdown_info_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +int32_t nvt_get_lockdown_info(char *lockdata) +{ + uint8_t data_buf[NVT_LOCKDOWN_SIZE] = {0}; + int ret = 0; + NVT_LOG("++\n"); + + if (!lockdata) + return -ENOMEM; + + if (mutex_lock_interruptible(&ts->lock)) { + return -ERESTARTSYS; + } + +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + ret = nvt_get_oem_data(data_buf, 0x1E000, 8); + + if (ret < 0) { + NVT_ERR("get oem data failed!\n"); + ret = -EINVAL; + goto end; + } + + memcpy(lockdata, data_buf, NVT_LOCKDOWN_SIZE); +end: + mutex_unlock(&ts->lock); + NVT_LOG("--\n"); + return ret; +} + +/******************************************************* +Description: + Novatek touchscreen extra function proc. file node + initial function. + +return: + Executive outcomes. 0---succeed. -12---failed. +*******************************************************/ +int32_t nvt_extra_proc_init(void) +{ + NVT_proc_fw_version_entry = proc_create(NVT_FW_VERSION, 0444, NULL, &nvt_fw_version_fops); + + if (NVT_proc_fw_version_entry == NULL) { + NVT_ERR("create proc/nvt_fw_version Failed!\n"); + return -ENOMEM; + } else { + NVT_LOG("create proc/nvt_fw_version Succeeded!\n"); + } + + NVT_tp_fw_version_entry = proc_create(TP_FW_VERSION, 0444, NULL, &tp_fw_version_fops); + if (NVT_tp_fw_version_entry == NULL) { + NVT_ERR("create proc/tp_fw_version Failed!\n"); + return -ENOMEM; + } else + NVT_LOG("create proc/tp_fw_version Succeeded!\n"); + + NVT_proc_baseline_entry = proc_create(NVT_BASELINE, 0444, NULL, &nvt_baseline_fops); + + if (NVT_proc_baseline_entry == NULL) { + NVT_ERR("create proc/nvt_baseline Failed!\n"); + return -ENOMEM; + } else { + NVT_LOG("create proc/nvt_baseline Succeeded!\n"); + } + + NVT_proc_raw_entry = proc_create(NVT_RAW, 0444, NULL, &nvt_raw_fops); + + if (NVT_proc_raw_entry == NULL) { + NVT_ERR("create proc/nvt_raw Failed!\n"); + return -ENOMEM; + } else { + NVT_LOG("create proc/nvt_raw Succeeded!\n"); + } + + NVT_proc_diff_entry = proc_create(NVT_DIFF, 0444, NULL, &nvt_diff_fops); + + if (NVT_proc_diff_entry == NULL) { + NVT_ERR("create proc/nvt_diff Failed!\n"); + return -ENOMEM; + } else { + NVT_LOG("create proc/nvt_diff Succeeded!\n"); + } + + NVT_proc_datadump_entry = proc_create(NVT_TP_DATADUMP, 0444, NULL, &nvt_tp_data_dump_ops); + + if (NVT_proc_datadump_entry == NULL) { + NVT_ERR("create proc/tp_data_dump Failed!\n"); + return -ENOMEM; + } else { + NVT_LOG("create proc/tp_data_dump Succeeded!\n"); + } + + NVT_proc_xiaomi_config_info_entry = proc_create(NVT_XIAOMI_CONFIG_INFO, 0444, NULL, &nvt_xiaomi_config_info_fops); + + if (NVT_proc_xiaomi_config_info_entry == NULL) { + NVT_ERR("create proc/%s Failed!\n", NVT_XIAOMI_CONFIG_INFO); + return -ENOMEM; + } else { + NVT_LOG("create proc/%s Succeeded!\n", NVT_XIAOMI_CONFIG_INFO); + } + + NVT_proc_xiaomi_lockdown_info_entry = proc_create(NVT_XIAOMI_LOCKDOWN_INFO, 0444, NULL, &nvt_xiaomi_lockdown_info_fops); + + if (NVT_proc_xiaomi_lockdown_info_entry == NULL) { + NVT_ERR("create proc/%s Failed!\n", NVT_XIAOMI_LOCKDOWN_INFO); + return -ENOMEM; + } else { + NVT_LOG("create proc/%s Succeeded!\n", NVT_XIAOMI_LOCKDOWN_INFO); + } + + return 0; +} +#endif diff --git a/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_fw_update.c b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_fw_update.c new file mode 100644 index 000000000000..6779f3f8bc3b --- /dev/null +++ b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_fw_update.c @@ -0,0 +1,1136 @@ +/* + * Copyright (C) 2010 - 2017 Novatek, Inc. + * Copyright (C) 2020 XiaoMi, Inc. + * + * $Revision: 21600 $ + * $Date: 2018-01-12 15:21:45 +0800 (週五, 12 一月 2018) $ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + */ + +#include <linux/delay.h> +#include <linux/firmware.h> + +#include "nt36xxx.h" + + +#define FW_BIN_SIZE_116KB 118784 +#define FW_BIN_SIZE FW_BIN_SIZE_116KB +#define FW_BIN_VER_OFFSET 0x1A000 +#define FW_BIN_VER_BAR_OFFSET 0x1A001 +#define FLASH_SECTOR_SIZE 4096 +#define SIZE_64KB 65536 +#define BLOCK_64KB_NUM 4 + +const struct firmware *fw_entry; + +/******************************************************* +Description: + Novatek touchscreen request update firmware function. + +return: + Executive outcomes. 0---succeed. -EPERM,-22---failed. +*******************************************************/ +int32_t update_firmware_request(char *filename) +{ + int32_t ret = 0; + + if (NULL == filename) { + return -EPERM; + } + + NVT_LOG("filename is %s\n", filename); + ret = request_firmware(&fw_entry, filename, &ts->client->dev); + + if (ret) { + NVT_ERR("firmware load failed, ret=%d\n", ret); + return ret; + } + + /* check bin file size (116kb) */ + if (fw_entry->size != FW_BIN_SIZE) { + NVT_ERR("bin file size not match. (%zu)\n", fw_entry->size); + return -EINVAL; + } + + /* check if FW version add FW version bar equals 0xFF */ + if (*(fw_entry->data + FW_BIN_VER_OFFSET) + *(fw_entry->data + FW_BIN_VER_BAR_OFFSET) != 0xFF) { + NVT_ERR("bin file FW_VER + FW_VER_BAR should be 0xFF!\n"); + NVT_ERR("FW_VER=0x%02X, FW_VER_BAR=0x%02X\n", *(fw_entry->data + FW_BIN_VER_OFFSET), *(fw_entry->data + FW_BIN_VER_BAR_OFFSET)); + return -EINVAL; + } + + return 0; +} + +/******************************************************* +Description: + Novatek touchscreen release update firmware function. + +return: + n.a. +*******************************************************/ +void update_firmware_release(void) +{ + if (fw_entry) { + release_firmware(fw_entry); + } + + fw_entry = NULL; +} + +/******************************************************* +Description: + Novatek touchscreen check firmware version function. + +return: + Executive outcomes. 0---need update. 1---need not + update. +*******************************************************/ +int32_t Check_FW_Ver(void) +{ + uint8_t buf[16] = {0}; + int32_t ret = 0; + /* write i2c index to EVENT BUF ADDR */ + buf[0] = 0xFF; + buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + ret = CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3); + + if (ret < 0) { + NVT_ERR("i2c write error!(%d)\n", ret); + return ret; + } + + /* read Firmware Version */ + buf[0] = EVENT_MAP_FWINFO; + buf[1] = 0x00; + buf[2] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 3); + + if (ret < 0) { + NVT_ERR("i2c read error!(%d)\n", ret); + return ret; + } + + NVT_LOG("IC FW Ver = 0x%02X, FW Ver Bar = 0x%02X\n", buf[1], buf[2]); + NVT_LOG("Bin FW Ver = 0x%02X, FW ver Bar = 0x%02X\n", + fw_entry->data[FW_BIN_VER_OFFSET], fw_entry->data[FW_BIN_VER_BAR_OFFSET]); + + /* check IC FW_VER + FW_VER_BAR equals 0xFF or not, need to update if not */ + if ((buf[1] + buf[2]) != 0xFF) { + NVT_ERR("IC FW_VER + FW_VER_BAR not equals to 0xFF!\n"); + return 0; + } + + /* compare IC and binary FW version */ + if (buf[1] == fw_entry->data[FW_BIN_VER_OFFSET]) + return 1; + else + return 0; +} + + +/******************************************************* +Description: + Novatek touchscreen resume from deep power down function. + +return: + Executive outcomes. 0---succeed. negative---failed. +*******************************************************/ +int32_t Resume_PD(void) +{ + uint8_t buf[8] = {0}; + int32_t ret = 0; + int32_t retry = 0; + /* Resume Command */ + buf[0] = 0x00; + buf[1] = 0xAB; + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Write Enable error!!(%d)\n", ret); + return ret; + } + + /* Check 0xAA (Resume Command) */ + retry = 0; + + while (1) { + msleep(1); + buf[0] = 0x00; + buf[1] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Check 0xAA (Resume Command) error!!(%d)\n", ret); + return ret; + } + + if (buf[1] == 0xAA) { + break; + } + + retry++; + + if (unlikely(retry > 20)) { + NVT_ERR("Check 0xAA (Resume Command) error!! status=0x%02X\n", buf[1]); + return -EPERM; + } + } + + msleep(10); + NVT_LOG("Resume PD OK\n"); + return 0; +} + + +/******************************************************* +Description: + Novatek touchscreen check firmware checksum function. + +return: + Executive outcomes. 0---checksum not match. + 1---checksum match. -EPERM--- checksum read failed. +*******************************************************/ +int32_t Check_CheckSum(void) +{ + uint8_t buf[64] = {0}; + uint32_t XDATA_Addr = ts->mmap->READ_FLASH_CHECKSUM_ADDR; + int32_t ret = 0; + int32_t i = 0; + int32_t k = 0; + uint16_t WR_Filechksum[BLOCK_64KB_NUM] = {0}; + uint16_t RD_Filechksum[BLOCK_64KB_NUM] = {0}; + size_t fw_bin_size = 0; + size_t len_in_blk = 0; + int32_t retry = 0; + + if (Resume_PD()) { + NVT_ERR("Resume PD error!!\n"); + return -EPERM; + } + + fw_bin_size = fw_entry->size; + + for (i = 0; i < BLOCK_64KB_NUM; i++) { + if (fw_bin_size > (i * SIZE_64KB)) { + /* Calculate WR_Filechksum of each 64KB block */ + len_in_blk = min(fw_bin_size - i * SIZE_64KB, (size_t)SIZE_64KB); + WR_Filechksum[i] = i + 0x00 + 0x00 + (((len_in_blk - 1) >> 8) & 0xFF) + ((len_in_blk - 1) & 0xFF); + + for (k = 0; k < len_in_blk; k++) { + WR_Filechksum[i] += fw_entry->data[k + i * SIZE_64KB]; + } + + WR_Filechksum[i] = 65535 - WR_Filechksum[i] + 1; + /* Fast Read Command */ + buf[0] = 0x00; + buf[1] = 0x07; + buf[2] = i; + buf[3] = 0x00; + buf[4] = 0x00; + buf[5] = ((len_in_blk - 1) >> 8) & 0xFF; + buf[6] = (len_in_blk - 1) & 0xFF; + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 7); + + if (ret < 0) { + NVT_ERR("Fast Read Command error!!(%d)\n", ret); + return ret; + } + + /* Check 0xAA (Fast Read Command) */ + retry = 0; + + while (1) { + msleep(80); + buf[0] = 0x00; + buf[1] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Check 0xAA (Fast Read Command) error!!(%d)\n", ret); + return ret; + } + + if (buf[1] == 0xAA) { + break; + } + + retry++; + + if (unlikely(retry > 5)) { + NVT_ERR("Check 0xAA (Fast Read Command) failed, buf[1]=0x%02X, retry=%d\n", buf[1], retry); + return -EPERM; + } + } + + /* Read Checksum (write addr high byte & middle byte) */ + buf[0] = 0xFF; + buf[1] = XDATA_Addr >> 16; + buf[2] = (XDATA_Addr >> 8) & 0xFF; + ret = CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3); + + if (ret < 0) { + NVT_ERR("Read Checksum (write addr high byte & middle byte) error!!(%d)\n", ret); + return ret; + } + + /* Read Checksum */ + buf[0] = (XDATA_Addr) & 0xFF; + buf[1] = 0x00; + buf[2] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 3); + + if (ret < 0) { + NVT_ERR("Read Checksum error!!(%d)\n", ret); + return ret; + } + + RD_Filechksum[i] = (uint16_t)((buf[2] << 8) | buf[1]); + + if (WR_Filechksum[i] != RD_Filechksum[i]) { + NVT_ERR("RD_Filechksum[%d]=0x%04X, WR_Filechksum[%d]=0x%04X\n", i, RD_Filechksum[i], i, WR_Filechksum[i]); + NVT_ERR("firmware checksum not match!!\n"); + return 0; + } + } + } + + NVT_LOG("firmware checksum match\n"); + return 1; +} + + +/******************************************************* +Description: + Novatek touchscreen initial bootloader and flash + block function. + +return: + Executive outcomes. 0---succeed. negative---failed. +*******************************************************/ +int32_t Init_BootLoader(void) +{ + uint8_t buf[64] = {0}; + int32_t ret = 0; + int32_t retry = 0; + /* SW Reset & Idle */ + nvt_sw_reset_idle(); + /* Initiate Flash Block */ + buf[0] = 0x00; + buf[1] = 0x00; + buf[2] = I2C_FW_Address; + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 3); + + if (ret < 0) { + NVT_ERR("Inittial Flash Block error!!(%d)\n", ret); + return ret; + } + + /* Check 0xAA (Initiate Flash Block) */ + retry = 0; + + while (1) { + msleep(1); + buf[0] = 0x00; + buf[1] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Check 0xAA (Inittial Flash Block) error!!(%d)\n", ret); + return ret; + } + + if (buf[1] == 0xAA) { + break; + } + + retry++; + + if (unlikely(retry > 20)) { + NVT_ERR("Check 0xAA (Inittial Flash Block) error!! status=0x%02X\n", buf[1]); + return -EPERM; + } + } + + NVT_LOG("Init OK \n"); + msleep(20); + return 0; +} + +/******************************************************* +Description: + Novatek touchscreen erase flash sectors function. + +return: + Executive outcomes. 0---succeed. negative---failed. +*******************************************************/ +int32_t Erase_Flash(void) +{ + uint8_t buf[64] = {0}; + int32_t ret = 0; + int32_t count = 0; + int32_t i = 0; + int32_t Flash_Address = 0; + int32_t retry = 0; + /* Write Enable */ + buf[0] = 0x00; + buf[1] = 0x06; + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Write Enable (for Write Status Register) error!!(%d)\n", ret); + return ret; + } + + /* Check 0xAA (Write Enable) */ + retry = 0; + + while (1) { + mdelay(1); + buf[0] = 0x00; + buf[1] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Check 0xAA (Write Enable for Write Status Register) error!!(%d)\n", ret); + return ret; + } + + if (buf[1] == 0xAA) { + break; + } + + retry++; + + if (unlikely(retry > 20)) { + NVT_ERR("Check 0xAA (Write Enable for Write Status Register) error!! status=0x%02X\n", buf[1]); + return -EPERM; + } + } + + /* Write Status Register */ + buf[0] = 0x00; + buf[1] = 0x01; + buf[2] = 0x00; + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 3); + + if (ret < 0) { + NVT_ERR("Write Status Register error!!(%d)\n", ret); + return ret; + } + + /* Check 0xAA (Write Status Register) */ + retry = 0; + + while (1) { + mdelay(1); + buf[0] = 0x00; + buf[1] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Check 0xAA (Write Status Register) error!!(%d)\n", ret); + return ret; + } + + if (buf[1] == 0xAA) { + break; + } + + retry++; + + if (unlikely(retry > 20)) { + NVT_ERR("Check 0xAA (Write Status Register) error!! status=0x%02X\n", buf[1]); + return -EPERM; + } + } + + /* Read Status */ + retry = 0; + + while (1) { + mdelay(5); + buf[0] = 0x00; + buf[1] = 0x05; + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Read Status (for Write Status Register) error!!(%d)\n", ret); + return ret; + } + + /* Check 0xAA (Read Status) */ + buf[0] = 0x00; + buf[1] = 0x00; + buf[2] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 3); + + if (ret < 0) { + NVT_ERR("Check 0xAA (Read Status for Write Status Register) error!!(%d)\n", ret); + return ret; + } + + if ((buf[1] == 0xAA) && (buf[2] == 0x00)) { + break; + } + + retry++; + + if (unlikely(retry > 100)) { + NVT_ERR("Check 0xAA (Read Status for Write Status Register) failed, buf[1]=0x%02X, buf[2]=0x%02X, retry=%d\n", buf[1], buf[2], retry); + return -EPERM; + } + } + + if (fw_entry->size % FLASH_SECTOR_SIZE) + count = fw_entry->size / FLASH_SECTOR_SIZE + 1; + else + count = fw_entry->size / FLASH_SECTOR_SIZE; + + for (i = 0; i < count; i++) { + /* Write Enable */ + buf[0] = 0x00; + buf[1] = 0x06; + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Write Enable error!!(%d,%d)\n", ret, i); + return ret; + } + + /* Check 0xAA (Write Enable) */ + retry = 0; + + while (1) { + mdelay(1); + buf[0] = 0x00; + buf[1] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Check 0xAA (Write Enable) error!!(%d,%d)\n", ret, i); + return ret; + } + + if (buf[1] == 0xAA) { + break; + } + + retry++; + + if (unlikely(retry > 20)) { + NVT_ERR("Check 0xAA (Write Enable) error!! status=0x%02X\n", buf[1]); + return -EPERM; + } + } + + Flash_Address = i * FLASH_SECTOR_SIZE; + /* Sector Erase */ + buf[0] = 0x00; + buf[1] = 0x20; /* Command : Sector Erase */ + buf[2] = ((Flash_Address >> 16) & 0xFF); + buf[3] = ((Flash_Address >> 8) & 0xFF); + buf[4] = (Flash_Address & 0xFF); + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 5); + + if (ret < 0) { + NVT_ERR("Sector Erase error!!(%d,%d)\n", ret, i); + return ret; + } + + /* Check 0xAA (Sector Erase) */ + retry = 0; + + while (1) { + mdelay(1); + buf[0] = 0x00; + buf[1] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Check 0xAA (Sector Erase) error!!(%d,%d)\n", ret, i); + return ret; + } + + if (buf[1] == 0xAA) { + break; + } + + retry++; + + if (unlikely(retry > 20)) { + NVT_ERR("Check 0xAA (Sector Erase) failed, buf[1]=0x%02X, retry=%d\n", buf[1], retry); + return -EPERM; + } + } + + /* Read Status */ + retry = 0; + + while (1) { + mdelay(5); + buf[0] = 0x00; + buf[1] = 0x05; + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Read Status error!!(%d,%d)\n", ret, i); + return ret; + } + + /* Check 0xAA (Read Status) */ + buf[0] = 0x00; + buf[1] = 0x00; + buf[2] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 3); + + if (ret < 0) { + NVT_ERR("Check 0xAA (Read Status) error!!(%d,%d)\n", ret, i); + return ret; + } + + if ((buf[1] == 0xAA) && (buf[2] == 0x00)) { + break; + } + + retry++; + + if (unlikely(retry > 100)) { + NVT_ERR("Check 0xAA (Read Status) failed, buf[1]=0x%02X, buf[2]=0x%02X, retry=%d\n", buf[1], buf[2], retry); + return -EPERM; + } + } + } + + NVT_LOG("Erase OK \n"); + return 0; +} + +/******************************************************* +Description: + Novatek touchscreen write flash sectors function. + +return: + Executive outcomes. 0---succeed. negative---failed. +*******************************************************/ +int32_t Write_Flash(void) +{ + uint8_t buf[64] = {0}; + uint32_t XDATA_Addr = ts->mmap->RW_FLASH_DATA_ADDR; + uint32_t Flash_Address = 0; + int32_t i = 0, j = 0, k = 0; + uint8_t tmpvalue = 0; + int32_t count = 0; + int32_t ret = 0; + int32_t retry = 0; + /* change I2C buffer index */ + buf[0] = 0xFF; + buf[1] = XDATA_Addr >> 16; + buf[2] = (XDATA_Addr >> 8) & 0xFF; + ret = CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3); + + if (ret < 0) { + NVT_ERR("change I2C buffer index error!!(%d)\n", ret); + return ret; + } + + if (fw_entry->size % 256) + count = fw_entry->size / 256 + 1; + else + count = fw_entry->size / 256; + + for (i = 0; i < count; i++) { + Flash_Address = i * 256; + /* Write Enable */ + buf[0] = 0x00; + buf[1] = 0x06; + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Write Enable error!!(%d)\n", ret); + return ret; + } + + /* Check 0xAA (Write Enable) */ + retry = 0; + + while (1) { + udelay(100); + buf[0] = 0x00; + buf[1] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Check 0xAA (Write Enable) error!!(%d,%d)\n", ret, i); + return ret; + } + + if (buf[1] == 0xAA) { + break; + } + + retry++; + + if (unlikely(retry > 20)) { + NVT_ERR("Check 0xAA (Write Enable) error!! status=0x%02X\n", buf[1]); + return -EPERM; + } + } + + /* Write Page : 256 bytes */ + for (j = 0; j < min(fw_entry->size - i * 256, (size_t)256); j += 32) { + buf[0] = (XDATA_Addr + j) & 0xFF; + + for (k = 0; k < 32; k++) { + buf[1 + k] = fw_entry->data[Flash_Address + j + k]; + } + + ret = CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 33); + + if (ret < 0) { + NVT_ERR("Write Page error!!(%d), j=%d\n", ret, j); + return ret; + } + } + + if (fw_entry->size - Flash_Address >= 256) + tmpvalue = (Flash_Address >> 16) + ((Flash_Address >> 8) & 0xFF) + (Flash_Address & 0xFF) + 0x00 + (255); + else + tmpvalue = (Flash_Address >> 16) + ((Flash_Address >> 8) & 0xFF) + (Flash_Address & 0xFF) + 0x00 + (fw_entry->size - Flash_Address - 1); + + for (k = 0; k < min(fw_entry->size - Flash_Address, (size_t)256); k++) + tmpvalue += fw_entry->data[Flash_Address + k]; + + tmpvalue = 255 - tmpvalue + 1; + /* Page Program */ + buf[0] = 0x00; + buf[1] = 0x02; + buf[2] = ((Flash_Address >> 16) & 0xFF); + buf[3] = ((Flash_Address >> 8) & 0xFF); + buf[4] = (Flash_Address & 0xFF); + buf[5] = 0x00; + buf[6] = min(fw_entry->size - Flash_Address, (size_t)256) - 1; + buf[7] = tmpvalue; + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 8); + + if (ret < 0) { + NVT_ERR("Page Program error!!(%d), i=%d\n", ret, i); + return ret; + } + + /* Check 0xAA (Page Program) */ + retry = 0; + + while (1) { + mdelay(1); + buf[0] = 0x00; + buf[1] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Page Program error!!(%d)\n", ret); + return ret; + } + + if (buf[1] == 0xAA || buf[1] == 0xEA) { + break; + } + + retry++; + + if (unlikely(retry > 20)) { + NVT_ERR("Check 0xAA (Page Program) failed, buf[1]=0x%02X, retry=%d\n", buf[1], retry); + return -EPERM; + } + } + + if (buf[1] == 0xEA) { + NVT_ERR("Page Program error!! i=%d\n", i); + return -ESRCH; + } + + /* Read Status */ + retry = 0; + + while (1) { + mdelay(5); + buf[0] = 0x00; + buf[1] = 0x05; + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Read Status error!!(%d)\n", ret); + return ret; + } + + /* Check 0xAA (Read Status) */ + buf[0] = 0x00; + buf[1] = 0x00; + buf[2] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 3); + + if (ret < 0) { + NVT_ERR("Check 0xAA (Read Status) error!!(%d)\n", ret); + return ret; + } + + if (((buf[1] == 0xAA) && (buf[2] == 0x00)) || (buf[1] == 0xEA)) { + break; + } + + retry++; + + if (unlikely(retry > 100)) { + NVT_ERR("Check 0xAA (Read Status) failed, buf[1]=0x%02X, buf[2]=0x%02X, retry=%d\n", buf[1], buf[2], retry); + return -EPERM; + } + } + + if (buf[1] == 0xEA) { + NVT_ERR("Page Program error!! i=%d\n", i); + return -EINTR; + } + + NVT_LOG("Programming...%2d%%\n", ((i * 100) / count)); + } + + NVT_LOG("Programming...%2d%%\n", 100); + NVT_LOG("Program OK \n"); + return 0; +} + +/******************************************************* +Description: + Novatek touchscreen verify checksum of written + flash function. + +return: + Executive outcomes. 0---succeed. negative---failed. +*******************************************************/ +int32_t Verify_Flash(void) +{ + uint8_t buf[64] = {0}; + uint32_t XDATA_Addr = ts->mmap->READ_FLASH_CHECKSUM_ADDR; + int32_t ret = 0; + int32_t i = 0; + int32_t k = 0; + uint16_t WR_Filechksum[BLOCK_64KB_NUM] = {0}; + uint16_t RD_Filechksum[BLOCK_64KB_NUM] = {0}; + size_t fw_bin_size = 0; + size_t len_in_blk = 0; + int32_t retry = 0; + fw_bin_size = fw_entry->size; + + for (i = 0; i < BLOCK_64KB_NUM; i++) { + if (fw_bin_size > (i * SIZE_64KB)) { + /* Calculate WR_Filechksum of each 64KB block */ + len_in_blk = min(fw_bin_size - i * SIZE_64KB, (size_t)SIZE_64KB); + WR_Filechksum[i] = i + 0x00 + 0x00 + (((len_in_blk - 1) >> 8) & 0xFF) + ((len_in_blk - 1) & 0xFF); + + for (k = 0; k < len_in_blk; k++) { + WR_Filechksum[i] += fw_entry->data[k + i * SIZE_64KB]; + } + + WR_Filechksum[i] = 65535 - WR_Filechksum[i] + 1; + /* Fast Read Command */ + buf[0] = 0x00; + buf[1] = 0x07; + buf[2] = i; + buf[3] = 0x00; + buf[4] = 0x00; + buf[5] = ((len_in_blk - 1) >> 8) & 0xFF; + buf[6] = (len_in_blk - 1) & 0xFF; + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 7); + + if (ret < 0) { + NVT_ERR("Fast Read Command error!!(%d)\n", ret); + return ret; + } + + /* Check 0xAA (Fast Read Command) */ + retry = 0; + + while (1) { + msleep(80); + buf[0] = 0x00; + buf[1] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Check 0xAA (Fast Read Command) error!!(%d)\n", ret); + return ret; + } + + if (buf[1] == 0xAA) { + break; + } + + retry++; + + if (unlikely(retry > 5)) { + NVT_ERR("Check 0xAA (Fast Read Command) failed, buf[1]=0x%02X, retry=%d\n", buf[1], retry); + return -EPERM; + } + } + + /* Read Checksum (write addr high byte & middle byte) */ + buf[0] = 0xFF; + buf[1] = XDATA_Addr >> 16; + buf[2] = (XDATA_Addr >> 8) & 0xFF; + ret = CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3); + + if (ret < 0) { + NVT_ERR("Read Checksum (write addr high byte & middle byte) error!!(%d)\n", ret); + return ret; + } + + /* Read Checksum */ + buf[0] = (XDATA_Addr) & 0xFF; + buf[1] = 0x00; + buf[2] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 3); + + if (ret < 0) { + NVT_ERR("Read Checksum error!!(%d)\n", ret); + return ret; + } + + RD_Filechksum[i] = (uint16_t)((buf[2] << 8) | buf[1]); + + if (WR_Filechksum[i] != RD_Filechksum[i]) { + NVT_ERR("Verify Fail%d!!\n", i); + NVT_ERR("RD_Filechksum[%d]=0x%04X, WR_Filechksum[%d]=0x%04X\n", i, RD_Filechksum[i], i, WR_Filechksum[i]); + return -EPERM; + } + } + } + + NVT_LOG("Verify OK \n"); + return 0; +} + +/******************************************************* +Description: + Novatek touchscreen update firmware function. + +return: + Executive outcomes. 0---succeed. negative---failed. +*******************************************************/ +int32_t Update_Firmware(void) +{ + int32_t ret = 0; + /*---Stop CRC check to prevent IC auto reboot---*/ + nvt_stop_crc_reboot(); + /* Step 1 : initial bootloader */ + ret = Init_BootLoader(); + + if (ret) { + return ret; + } + + /* Step 2 : Resume PD */ + ret = Resume_PD(); + + if (ret) { + return ret; + } + + /* Step 3 : Erase */ + ret = Erase_Flash(); + + if (ret) { + return ret; + } + + /* Step 4 : Program */ + ret = Write_Flash(); + + if (ret) { + return ret; + } + + /* Step 5 : Verify */ + ret = Verify_Flash(); + + if (ret) { + return ret; + } + + /* Step 6 : Bootloader Reset */ + nvt_bootloader_reset(); + nvt_check_fw_reset_state(RESET_STATE_INIT); + return ret; +} + +/******************************************************* +Description: + Novatek touchscreen check flash end flag function. + +return: + Executive outcomes. 0---succeed. 1,negative---failed. +*******************************************************/ +#define NVT_FLASH_END_FLAG_LEN 3 +#define NVT_FLASH_END_FLAG_ADDR 0x1AFFD +int32_t nvt_check_flash_end_flag(void) +{ + uint8_t buf[8] = {0}; + uint8_t nvt_end_flag[NVT_FLASH_END_FLAG_LEN + 1] = {0}; + int32_t ret = 0; + /* Step 1 : initial bootloader */ + ret = Init_BootLoader(); + + if (ret) { + return ret; + } + + /* Step 2 : Resume PD */ + ret = Resume_PD(); + + if (ret) { + return ret; + } + + /* Step 3 : unlock */ + buf[0] = 0x00; + buf[1] = 0x35; + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("write unlock error!!(%d)\n", ret); + return ret; + } + + msleep(10); + /* Step 4 : Flash Read Command */ + buf[0] = 0x00; + buf[1] = 0x03; + buf[2] = (NVT_FLASH_END_FLAG_ADDR >> 16) & 0xFF; /*Addr_H*/ + buf[3] = (NVT_FLASH_END_FLAG_ADDR >> 8) & 0xFF; /*Addr_M*/ + buf[4] = NVT_FLASH_END_FLAG_ADDR & 0xFF; /*Addr_L*/ + buf[5] = (NVT_FLASH_END_FLAG_LEN >> 8) & 0xFF; /*Len_H*/ + buf[6] = NVT_FLASH_END_FLAG_LEN & 0xFF; /*Len_L*/ + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 7); + + if (ret < 0) { + NVT_ERR("write Read Command error!!(%d)\n", ret); + return ret; + } + + msleep(10); + /* Check 0xAA (Read Command) */ + buf[0] = 0x00; + buf[1] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2); + + if (ret < 0) { + NVT_ERR("Check 0xAA (Read Command) error!!(%d)\n", ret); + return ret; + } + + if (buf[1] != 0xAA) { + NVT_ERR("Check 0xAA (Read Command) error!! status=0x%02X\n", buf[1]); + return -EPERM; + } + + msleep(10); + /* Step 5 : Read Flash Data*/ + buf[0] = 0xFF; + buf[1] = (ts->mmap->READ_FLASH_CHECKSUM_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->READ_FLASH_CHECKSUM_ADDR >> 8) & 0xFF; + ret = CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3); + + if (ret < 0) { + NVT_ERR("change index error!! (%d)\n", ret); + return ret; + } + + msleep(10); + /* Read Back */ + buf[0] = ts->mmap->READ_FLASH_CHECKSUM_ADDR & 0xFF; + ret = CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 6); + + if (ret < 0) { + NVT_ERR("Read Back error!! (%d)\n", ret); + return ret; + } + + /* buf[3:5] => NVT End Flag */ + strlcpy(nvt_end_flag, &buf[3], NVT_FLASH_END_FLAG_LEN + 1); + NVT_LOG("nvt_end_flag=%s (%02X %02X %02X)\n", nvt_end_flag, buf[3], buf[4], buf[5]); + + if (strncmp(nvt_end_flag, "NVT", 3) == 0) { + return 0; + } else { + NVT_ERR("\"NVT\" end flag not found!\n"); + return 1; + } +} + +/******************************************************* +Description: + Novatek touchscreen update firmware when booting + function. + +return: + n.a. +*******************************************************/ +void Boot_Update_Firmware(void) +{ + int32_t ret = 0; + char firmware_name[256] = ""; + + if (ts->fw_name) + snprintf(firmware_name, strlen(ts->fw_name) + 1, ts->fw_name); + else + snprintf(firmware_name, strlen(BOOT_UPDATE_FIRMWARE_NAME), BOOT_UPDATE_FIRMWARE_NAME); + + /* request bin file in "/etc/firmware" */ + ret = update_firmware_request(firmware_name); + + if (ret) { + NVT_ERR("update_firmware_request failed. (%d)\n", ret); + return; + } + + mutex_lock(&ts->lock); +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + nvt_sw_reset_idle(); + ret = Check_CheckSum(); + + if (ret < 0) { /* read firmware checksum failed */ + NVT_ERR("read firmware checksum failed\n"); + Update_Firmware(); + } else if ((ret == 0) && (Check_FW_Ver() == 0)) { /* (fw checksum not match) && (bin fw version >= ic fw version) */ + NVT_LOG("firmware version not match\n"); + Update_Firmware(); + } else if (nvt_check_flash_end_flag()) { + NVT_LOG("check flash end flag failed\n"); + Update_Firmware(); + } else { + /* Bootloader Reset */ + nvt_bootloader_reset(); + ret = nvt_check_fw_reset_state(RESET_STATE_INIT); + + if (ret) { + NVT_LOG("check fw reset state failed\n"); + Update_Firmware(); + } + } + + mutex_unlock(&ts->lock); + update_firmware_release(); +} + diff --git a/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mem_map.h b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mem_map.h new file mode 100644 index 000000000000..afdf30cf9ddc --- /dev/null +++ b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mem_map.h @@ -0,0 +1,233 @@ +/* + * Copyright (C) 2010 - 2017 Novatek, Inc. + * Copyright (C) 2020 XiaoMi, Inc. + * + * $Revision: 20544 $ + * $Date: 2017-12-20 11:08:15 +0800 (週三, 20 å二月 2017) $ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + */ + +struct nvt_ts_mem_map { + uint32_t EVENT_BUF_ADDR; + uint32_t RAW_PIPE0_ADDR; + uint32_t RAW_PIPE0_Q_ADDR; + uint32_t RAW_PIPE1_ADDR; + uint32_t RAW_PIPE1_Q_ADDR; + uint32_t BASELINE_ADDR; + uint32_t BASELINE_Q_ADDR; + uint32_t BASELINE_BTN_ADDR; + uint32_t BASELINE_BTN_Q_ADDR; + uint32_t DIFF_PIPE0_ADDR; + uint32_t DIFF_PIPE0_Q_ADDR; + uint32_t DIFF_PIPE1_ADDR; + uint32_t DIFF_PIPE1_Q_ADDR; + uint32_t RAW_BTN_PIPE0_ADDR; + uint32_t RAW_BTN_PIPE0_Q_ADDR; + uint32_t RAW_BTN_PIPE1_ADDR; + uint32_t RAW_BTN_PIPE1_Q_ADDR; + uint32_t DIFF_BTN_PIPE0_ADDR; + uint32_t DIFF_BTN_PIPE0_Q_ADDR; + uint32_t DIFF_BTN_PIPE1_ADDR; + uint32_t DIFF_BTN_PIPE1_Q_ADDR; + uint32_t READ_FLASH_CHECKSUM_ADDR; + uint32_t RW_FLASH_DATA_ADDR; +}; + +static const struct nvt_ts_mem_map NT36672A_memory_map = { + .EVENT_BUF_ADDR = 0x21C00, + .RAW_PIPE0_ADDR = 0x20000, + .RAW_PIPE0_Q_ADDR = 0, + .RAW_PIPE1_ADDR = 0x23000, + .RAW_PIPE1_Q_ADDR = 0, + .BASELINE_ADDR = 0x20BFC, + .BASELINE_Q_ADDR = 0, + .BASELINE_BTN_ADDR = 0x23BFC, + .BASELINE_BTN_Q_ADDR = 0, + .DIFF_PIPE0_ADDR = 0x206DC, + .DIFF_PIPE0_Q_ADDR = 0, + .DIFF_PIPE1_ADDR = 0x236DC, + .DIFF_PIPE1_Q_ADDR = 0, + .RAW_BTN_PIPE0_ADDR = 0x20510, + .RAW_BTN_PIPE0_Q_ADDR = 0, + .RAW_BTN_PIPE1_ADDR = 0x23510, + .RAW_BTN_PIPE1_Q_ADDR = 0, + .DIFF_BTN_PIPE0_ADDR = 0x20BF0, + .DIFF_BTN_PIPE0_Q_ADDR = 0, + .DIFF_BTN_PIPE1_ADDR = 0x23BF0, + .DIFF_BTN_PIPE1_Q_ADDR = 0, + .READ_FLASH_CHECKSUM_ADDR = 0x24000, + .RW_FLASH_DATA_ADDR = 0x24002, +}; + +static const struct nvt_ts_mem_map NT36772_memory_map = { + .EVENT_BUF_ADDR = 0x11E00, + .RAW_PIPE0_ADDR = 0x10000, + .RAW_PIPE0_Q_ADDR = 0, + .RAW_PIPE1_ADDR = 0x12000, + .RAW_PIPE1_Q_ADDR = 0, + .BASELINE_ADDR = 0x10E70, + .BASELINE_Q_ADDR = 0, + .BASELINE_BTN_ADDR = 0x12E70, + .BASELINE_BTN_Q_ADDR = 0, + .DIFF_PIPE0_ADDR = 0x10830, + .DIFF_PIPE0_Q_ADDR = 0, + .DIFF_PIPE1_ADDR = 0x12830, + .DIFF_PIPE1_Q_ADDR = 0, + .RAW_BTN_PIPE0_ADDR = 0x10E60, + .RAW_BTN_PIPE0_Q_ADDR = 0, + .RAW_BTN_PIPE1_ADDR = 0x12E60, + .RAW_BTN_PIPE1_Q_ADDR = 0, + .DIFF_BTN_PIPE0_ADDR = 0x10E68, + .DIFF_BTN_PIPE0_Q_ADDR = 0, + .DIFF_BTN_PIPE1_ADDR = 0x12E68, + .DIFF_BTN_PIPE1_Q_ADDR = 0, + .READ_FLASH_CHECKSUM_ADDR = 0x14000, + .RW_FLASH_DATA_ADDR = 0x14002, +}; + +static const struct nvt_ts_mem_map NT36525_memory_map = { + .EVENT_BUF_ADDR = 0x11A00, + .RAW_PIPE0_ADDR = 0x10000, + .RAW_PIPE0_Q_ADDR = 0, + .RAW_PIPE1_ADDR = 0x12000, + .RAW_PIPE1_Q_ADDR = 0, + .BASELINE_ADDR = 0x10B08, + .BASELINE_Q_ADDR = 0, + .BASELINE_BTN_ADDR = 0x12B08, + .BASELINE_BTN_Q_ADDR = 0, + .DIFF_PIPE0_ADDR = 0x1064C, + .DIFF_PIPE0_Q_ADDR = 0, + .DIFF_PIPE1_ADDR = 0x1264C, + .DIFF_PIPE1_Q_ADDR = 0, + .RAW_BTN_PIPE0_ADDR = 0x10634, + .RAW_BTN_PIPE0_Q_ADDR = 0, + .RAW_BTN_PIPE1_ADDR = 0x12634, + .RAW_BTN_PIPE1_Q_ADDR = 0, + .DIFF_BTN_PIPE0_ADDR = 0x10AFC, + .DIFF_BTN_PIPE0_Q_ADDR = 0, + .DIFF_BTN_PIPE1_ADDR = 0x12AFC, + .DIFF_BTN_PIPE1_Q_ADDR = 0, + .READ_FLASH_CHECKSUM_ADDR = 0x14000, + .RW_FLASH_DATA_ADDR = 0x14002, +}; + +static const struct nvt_ts_mem_map NT36870_memory_map = { + .EVENT_BUF_ADDR = 0x25000, + .RAW_PIPE0_ADDR = 0x20000, + .RAW_PIPE0_Q_ADDR = 0x204C8, + .RAW_PIPE1_ADDR = 0x23000, + .RAW_PIPE1_Q_ADDR = 0x234C8, + .BASELINE_ADDR = 0x21350, + .BASELINE_Q_ADDR = 0x21818, + .BASELINE_BTN_ADDR = 0x24350, + .BASELINE_BTN_Q_ADDR = 0x24358, + .DIFF_PIPE0_ADDR = 0x209B0, + .DIFF_PIPE0_Q_ADDR = 0x20E78, + .DIFF_PIPE1_ADDR = 0x239B0, + .DIFF_PIPE1_Q_ADDR = 0x23E78, + .RAW_BTN_PIPE0_ADDR = 0x20990, + .RAW_BTN_PIPE0_Q_ADDR = 0x20998, + .RAW_BTN_PIPE1_ADDR = 0x23990, + .RAW_BTN_PIPE1_Q_ADDR = 0x23998, + .DIFF_BTN_PIPE0_ADDR = 0x21340, + .DIFF_BTN_PIPE0_Q_ADDR = 0x21348, + .DIFF_BTN_PIPE1_ADDR = 0x24340, + .DIFF_BTN_PIPE1_Q_ADDR = 0x24348, + .READ_FLASH_CHECKSUM_ADDR = 0x24000, + .RW_FLASH_DATA_ADDR = 0x24002, +}; + +static const struct nvt_ts_mem_map NT36676F_memory_map = { + .EVENT_BUF_ADDR = 0x11A00, + .RAW_PIPE0_ADDR = 0x10000, + .RAW_PIPE0_Q_ADDR = 0, + .RAW_PIPE1_ADDR = 0x12000, + .RAW_PIPE1_Q_ADDR = 0, + .BASELINE_ADDR = 0x10B08, + .BASELINE_Q_ADDR = 0, + .BASELINE_BTN_ADDR = 0x12B08, + .BASELINE_BTN_Q_ADDR = 0, + .DIFF_PIPE0_ADDR = 0x1064C, + .DIFF_PIPE0_Q_ADDR = 0, + .DIFF_PIPE1_ADDR = 0x1264C, + .DIFF_PIPE1_Q_ADDR = 0, + .RAW_BTN_PIPE0_ADDR = 0x10634, + .RAW_BTN_PIPE0_Q_ADDR = 0, + .RAW_BTN_PIPE1_ADDR = 0x12634, + .RAW_BTN_PIPE1_Q_ADDR = 0, + .DIFF_BTN_PIPE0_ADDR = 0x10AFC, + .DIFF_BTN_PIPE0_Q_ADDR = 0, + .DIFF_BTN_PIPE1_ADDR = 0x12AFC, + .DIFF_BTN_PIPE1_Q_ADDR = 0, + .READ_FLASH_CHECKSUM_ADDR = 0x14000, + .RW_FLASH_DATA_ADDR = 0x14002, +}; + +#define NVT_ID_BYTE_MAX 6 +struct nvt_ts_trim_id_table { + uint8_t id[NVT_ID_BYTE_MAX]; + uint8_t mask[NVT_ID_BYTE_MAX]; + const struct nvt_ts_mem_map *mmap; + uint8_t carrier_system; +}; + +static const struct nvt_ts_trim_id_table trim_id_table[] = { + { + .id = {0x0A, 0xFF, 0xFF, 0x72, 0x66, 0x03}, .mask = {1, 0, 0, 1, 1, 1}, + .mmap = &NT36672A_memory_map, .carrier_system = 0 + }, + { + .id = {0x55, 0x00, 0xFF, 0x00, 0x00, 0x00}, .mask = {1, 1, 0, 1, 1, 1}, + .mmap = &NT36772_memory_map, .carrier_system = 0 + }, + { + .id = {0x55, 0x72, 0xFF, 0x00, 0x00, 0x00}, .mask = {1, 1, 0, 1, 1, 1}, + .mmap = &NT36772_memory_map, .carrier_system = 0 + }, + { + .id = {0xAA, 0x00, 0xFF, 0x00, 0x00, 0x00}, .mask = {1, 1, 0, 1, 1, 1}, + .mmap = &NT36772_memory_map, .carrier_system = 0 + }, + { + .id = {0xAA, 0x72, 0xFF, 0x00, 0x00, 0x00}, .mask = {1, 1, 0, 1, 1, 1}, + .mmap = &NT36772_memory_map, .carrier_system = 0 + }, + { + .id = {0xFF, 0xFF, 0xFF, 0x72, 0x67, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, + .mmap = &NT36772_memory_map, .carrier_system = 0 + }, + { + .id = {0xFF, 0xFF, 0xFF, 0x70, 0x66, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, + .mmap = &NT36772_memory_map, .carrier_system = 0 + }, + { + .id = {0xFF, 0xFF, 0xFF, 0x70, 0x67, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, + .mmap = &NT36772_memory_map, .carrier_system = 0 + }, + { + .id = {0xFF, 0xFF, 0xFF, 0x72, 0x66, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, + .mmap = &NT36772_memory_map, .carrier_system = 0 + }, + { + .id = {0xFF, 0xFF, 0xFF, 0x25, 0x65, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, + .mmap = &NT36525_memory_map, .carrier_system = 0 + }, + { + .id = {0xFF, 0xFF, 0xFF, 0x70, 0x68, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, + .mmap = &NT36870_memory_map, .carrier_system = 1 + }, + { + .id = {0xFF, 0xFF, 0xFF, 0x76, 0x66, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, + .mmap = &NT36676F_memory_map, .carrier_system = 0 + } +}; diff --git a/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mp_ctrlram.c b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mp_ctrlram.c new file mode 100644 index 000000000000..65f023e73e44 --- /dev/null +++ b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mp_ctrlram.c @@ -0,0 +1,1882 @@ +/* + * Copyright (C) 2010 - 2017 Novatek, Inc. + * Copyright (C) 2020 XiaoMi, Inc. + * + * $Revision: 21288 $ + * $Date: 2018-01-05 11:38:47 +0800 (週五, 05 一月 2018) $ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + */ + +#include <linux/proc_fs.h> +#include <linux/seq_file.h> +#include <linux/delay.h> +#include <linux/slab.h> +#include <asm/uaccess.h> + +#include "nt36xxx.h" +#include "nt36xxx_mp_ctrlram.h" + +#if NVT_TOUCH_MP + +#define NORMAL_MODE 0x00 +#define TEST_MODE_1 0x21 +#define TEST_MODE_2 0x22 +#define MP_MODE_CC 0x41 +#define FREQ_HOP_DISABLE 0x66 +#define FREQ_HOP_ENABLE 0x65 + +#define SHORT_TEST_CSV_FILE "/data/local/tmp/ShortTest.csv" +#define OPEN_TEST_CSV_FILE "/data/local/tmp/OpenTest.csv" +#define FW_RAWDATA_CSV_FILE "/data/local/tmp/FWMutualTest.csv" +#define FW_CC_CSV_FILE "/data/local/tmp/FWCCTest.csv" +#define NOISE_TEST_CSV_FILE "/data/local/tmp/NoiseTest.csv" + +#define nvt_mp_seq_printf(m, fmt, args...) do { \ + seq_printf(m, fmt, ##args); \ + if (!nvt_mp_test_result_printed) \ + printk(fmt, ##args); \ +} while (0) + +static uint8_t *RecordResult_Short; +static uint8_t *RecordResult_Short_Diff; +static uint8_t *RecordResult_Short_Base; +static uint8_t *RecordResult_Open; +static uint8_t *RecordResult_FWMutual; +static uint8_t *RecordResult_FW_CC; +static uint8_t *RecordResult_FW_CC_I; +static uint8_t *RecordResult_FW_CC_Q; +static uint8_t *RecordResult_FW_DiffMax; +static uint8_t *RecordResult_FW_DiffMin; + +static int32_t TestResult_Short; +static int32_t TestResult_Short_Diff; +static int32_t TestResult_Short_Base; +static int32_t TestResult_Open; +static int32_t TestResult_FW_Rawdata; +static int32_t TestResult_FWMutual; +static int32_t TestResult_FW_CC; +static int32_t TestResult_FW_CC_I; +static int32_t TestResult_FW_CC_Q; +static int32_t TestResult_Noise; +static int32_t TestResult_FW_DiffMax; +static int32_t TestResult_FW_DiffMin; + +static int32_t *RawData_Short; +static int32_t *RawData_Short_Diff; +static int32_t *RawData_Short_Base; +static int32_t *RawData_Open; +static int32_t *RawData_Diff; +static int32_t *RawData_Diff_Min; +static int32_t *RawData_Diff_Max; +static int32_t *RawData_FWMutual; +static int32_t *RawData_FW_CC; +static int32_t *RawData_FW_CC_I; +static int32_t *RawData_FW_CC_Q; + +static struct proc_dir_entry *NVT_proc_selftest_entry; +static int8_t nvt_mp_test_result_printed; + +extern void nvt_change_mode(uint8_t mode); +extern uint8_t nvt_get_fw_pipe(void); +extern void nvt_read_mdata(uint32_t xdata_addr, uint32_t xdata_btn_addr); +extern void nvt_get_mdata(int32_t *buf, uint8_t *m_x_num, uint8_t *m_y_num); +void nvt_mp_parse_dt(struct device_node *root, const char *node_compatible); + +/******************************************************* +Description: + Novatek touchscreen allocate buffer for mp selftest. + +return: + Executive outcomes. 0---succeed. -12---Out of memory +*******************************************************/ +static int nvt_mp_buffer_init(void) +{ + size_t RecordResult_BufSize = IC_X_CFG_SIZE * IC_Y_CFG_SIZE + IC_KEY_CFG_SIZE; + size_t RawData_BufSize = (IC_X_CFG_SIZE * IC_Y_CFG_SIZE + IC_KEY_CFG_SIZE) * sizeof(int32_t); + RecordResult_Short = (uint8_t *)kzalloc(RecordResult_BufSize, GFP_KERNEL); + + if (!RecordResult_Short) { + NVT_ERR("kzalloc for RecordResult_Short failed!\n"); + return -ENOMEM; + } + + RecordResult_Short_Diff = RecordResult_Short; + RecordResult_Short_Base = (uint8_t *)kzalloc(RecordResult_BufSize, GFP_KERNEL); + + if (!RecordResult_Short_Base) { + NVT_ERR("kzalloc for RecordResult_Short_Base failed!\n"); + return -ENOMEM; + } + + RecordResult_Open = (uint8_t *)kzalloc(RecordResult_BufSize, GFP_KERNEL); + + if (!RecordResult_Open) { + NVT_ERR("kzalloc for RecordResult_Open failed!\n"); + return -ENOMEM; + } + + RecordResult_FWMutual = (uint8_t *)kzalloc(RecordResult_BufSize, GFP_KERNEL); + + if (!RecordResult_FWMutual) { + NVT_ERR("kzalloc for RecordResult_FWMutual failed!\n"); + return -ENOMEM; + } + + RecordResult_FW_CC = (uint8_t *)kzalloc(RecordResult_BufSize, GFP_KERNEL); + + if (!RecordResult_FW_CC) { + NVT_ERR("kzalloc for RecordResult_FW_CC failed!\n"); + return -ENOMEM; + } + + RecordResult_FW_CC_I = RecordResult_FW_CC; + RecordResult_FW_CC_Q = (uint8_t *)kzalloc(RecordResult_BufSize, GFP_KERNEL); + + if (!RecordResult_FW_CC_Q) { + NVT_ERR("kzalloc for RecordResult_FW_CC_Q failed!\n"); + return -ENOMEM; + } + + RecordResult_FW_DiffMax = (uint8_t *)kzalloc(RecordResult_BufSize, GFP_KERNEL); + + if (!RecordResult_FW_DiffMax) { + NVT_ERR("kzalloc for RecordResult_FW_DiffMax failed!\n"); + return -ENOMEM; + } + + RecordResult_FW_DiffMin = (uint8_t *)kzalloc(RecordResult_BufSize, GFP_KERNEL); + + if (!RecordResult_FW_DiffMin) { + NVT_ERR("kzalloc for RecordResult_FW_DiffMin failed!\n"); + return -ENOMEM; + } + + RawData_Short = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL); + + if (!RawData_Short) { + NVT_ERR("kzalloc for RawData_Short failed!\n"); + return -ENOMEM; + } + + RawData_Short_Diff = RawData_Short; + RawData_Short_Base = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL); + + if (!RawData_Short_Base) { + NVT_ERR("kzalloc for RawData_Short_Base failed!\n"); + return -ENOMEM; + } + + RawData_Open = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL); + + if (!RawData_Open) { + NVT_ERR("kzalloc for RawData_Open failed!\n"); + return -ENOMEM; + } + + RawData_Diff = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL); + + if (!RawData_Diff) { + NVT_ERR("kzalloc for RawData_Diff failed!\n"); + return -ENOMEM; + } + + RawData_Diff_Min = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL); + + if (!RawData_Diff_Min) { + NVT_ERR("kzalloc for RawData_Diff_Min failed!\n"); + return -ENOMEM; + } + + RawData_Diff_Max = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL); + + if (!RawData_Diff_Max) { + NVT_ERR("kzalloc for RawData_Diff_Max failed!\n"); + return -ENOMEM; + } + + RawData_FWMutual = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL); + + if (!RawData_FWMutual) { + NVT_ERR("kzalloc for RawData_FWMutual failed!\n"); + return -ENOMEM; + } + + RawData_FW_CC = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL); + + if (!RawData_FW_CC) { + NVT_ERR("kzalloc for RawData_FW_CC failed!\n"); + return -ENOMEM; + } + + RawData_FW_CC_I = RawData_FW_CC; + RawData_FW_CC_Q = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL); + + if (!RawData_FW_CC_Q) { + NVT_ERR("kzalloc for RawData_FW_CC_Q failed!\n"); + return -ENOMEM; + } + + return 0; +} + +/******************************************************* +Description: + Novatek touchscreen self-test criteria print function. + +return: + n.a. +*******************************************************/ +static void nvt_print_lmt_array(int32_t *array, int32_t x_ch, int32_t y_ch) +{ + int32_t i = 0; + int32_t j = 0; +#if TOUCH_KEY_NUM > 0 + int32_t k = 0; +#endif /* #if TOUCH_KEY_NUM > 0 */ + char *buf = NULL; + ssize_t ret = 0; + buf = (char *)kzalloc(PAGE_SIZE * 2, GFP_KERNEL); + + if (!buf) { + NVT_ERR("kzalloc for temp buffer failed!\n"); + return; + } + + for (j = 0; j < y_ch; j++) { + ret = 0; + + for (i = 0; i < x_ch; i++) { + ret += snprintf(buf + ret, 8, "%5d, ", array[j * x_ch + i]); + } + + buf[ret] = '\0'; + printk("%s\n", buf); + } + +#if TOUCH_KEY_NUM > 0 + + for (k = 0; k < Key_Channel; k++) { + printk("%5d, ", array[y_ch * x_ch + k]); + } + + printk("\n"); +#endif /* #if TOUCH_KEY_NUM > 0 */ + + if (buf) { + kfree(buf); + buf = NULL; + } +} + +static void nvt_print_criteria(void) +{ + NVT_LOG("++\n"); + + if (ts->carrier_system) { + /*---PS_Config_Lmt_Short_Diff---*/ + printk("PS_Config_Lmt_Short_Diff_P:\n"); + nvt_print_lmt_array(PS_Config_Lmt_Short_Diff_P, X_Channel, Y_Channel); + printk("PS_Config_Lmt_Short_Diff_N:\n"); + nvt_print_lmt_array(PS_Config_Lmt_Short_Diff_N, X_Channel, Y_Channel); + /*---PS_Config_Lmt_Short_Base---*/ + printk("PS_Config_Lmt_Short_Base_P:\n"); + nvt_print_lmt_array(PS_Config_Lmt_Short_Base_P, X_Channel, Y_Channel); + printk("PS_Config_Lmt_Short_Base_N:\n"); + nvt_print_lmt_array(PS_Config_Lmt_Short_Base_N, X_Channel, Y_Channel); + } else { + /*---PS_Config_Lmt_Short_Rawdata---*/ + printk("PS_Config_Lmt_Short_Rawdata_P:\n"); + nvt_print_lmt_array(PS_Config_Lmt_Short_Rawdata_P, X_Channel, Y_Channel); + printk("PS_Config_Lmt_Short_Rawdata_N:\n"); + nvt_print_lmt_array(PS_Config_Lmt_Short_Rawdata_N, X_Channel, Y_Channel); + } + + /*---PS_Config_Lmt_Open_Rawdata---*/ + printk("PS_Config_Lmt_Open_Rawdata_P:\n"); + nvt_print_lmt_array(PS_Config_Lmt_Open_Rawdata_P, X_Channel, Y_Channel); + printk("PS_Config_Lmt_Open_Rawdata_N:\n"); + nvt_print_lmt_array(PS_Config_Lmt_Open_Rawdata_N, X_Channel, Y_Channel); + /*---PS_Config_Lmt_FW_Rawdata---*/ + printk("PS_Config_Lmt_FW_Rawdata_P:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_Rawdata_P, X_Channel, Y_Channel); + printk("PS_Config_Lmt_FW_Rawdata_N:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_Rawdata_N, X_Channel, Y_Channel); + + if (ts->carrier_system) { + /*---PS_Config_Lmt_FW_CC_I---*/ + printk("PS_Config_Lmt_FW_CC_I_P:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_CC_I_P, X_Channel, Y_Channel); + printk("PS_Config_Lmt_FW_CC_I_N:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_CC_I_N, X_Channel, Y_Channel); + /*---PS_Config_Lmt_FW_CC_Q---*/ + printk("PS_Config_Lmt_FW_CC_Q_P:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_CC_Q_P, X_Channel, Y_Channel); + printk("PS_Config_Lmt_FW_CC_Q_N:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_CC_Q_N, X_Channel, Y_Channel); + } else { + /*---PS_Config_Lmt_FW_CC---*/ + printk("PS_Config_Lmt_FW_CC_P:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_CC_P, X_Channel, Y_Channel); + printk("PS_Config_Lmt_FW_CC_N:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_CC_N, X_Channel, Y_Channel); + } + + /*---PS_Config_Lmt_FW_Diff---*/ + printk("PS_Config_Lmt_FW_Diff_P:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_Diff_P, X_Channel, Y_Channel); + printk("PS_Config_Lmt_FW_Diff_N:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_Diff_N, X_Channel, Y_Channel); + NVT_LOG("--\n"); +} + +static int32_t nvt_polling_hand_shake_status(void) +{ + uint8_t buf[8] = {0}; + int32_t i = 0; + const int32_t retry = 50; + + for (i = 0; i < retry; i++) { + /*---set xdata index to EVENT BUF ADDR---*/ + buf[0] = 0xFF; + buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---read fw status---*/ + buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE; + buf[1] = 0x00; + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 2); + + if ((buf[1] == 0xA0) || (buf[1] == 0xA1)) + break; + + msleep(10); + } + + if (i >= retry) { + NVT_ERR("polling hand shake status failed, buf[1]=0x%02X\n", buf[1]); + /* Read back 5 bytes from offset EVENT_MAP_HOST_CMD for debug check */ + buf[0] = 0xFF; + buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + buf[0] = EVENT_MAP_HOST_CMD; + buf[1] = 0x00; + buf[2] = 0x00; + buf[3] = 0x00; + buf[4] = 0x00; + buf[5] = 0x00; + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 6); + NVT_ERR("Read back 5 bytes from offset EVENT_MAP_HOST_CMD: 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X\n", buf[1], buf[2], buf[3], buf[4], buf[5]); + return -EPERM; + } else { + return 0; + } +} + +static int8_t nvt_switch_FreqHopEnDis(uint8_t FreqHopEnDis) +{ + uint8_t buf[8] = {0}; + uint8_t retry = 0; + int8_t ret = 0; + NVT_LOG("++\n"); + + for (retry = 0; retry < 20; retry++) { + /*---set xdata index to EVENT BUF ADDR---*/ + buf[0] = 0xFF; + buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---switch FreqHopEnDis---*/ + buf[0] = EVENT_MAP_HOST_CMD; + buf[1] = FreqHopEnDis; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 2); + msleep(35); + buf[0] = EVENT_MAP_HOST_CMD; + buf[1] = 0xFF; + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 2); + + if (buf[1] == 0x00) + break; + } + + if (unlikely(retry == 20)) { + NVT_ERR("switch FreqHopEnDis 0x%02X failed, buf[1]=0x%02X\n", FreqHopEnDis, buf[1]); + ret = -EPERM; + } + + NVT_LOG("--\n"); + return ret; +} + +static int32_t nvt_read_baseline(int32_t *xdata) +{ + uint8_t x_num = 0; + uint8_t y_num = 0; + uint32_t x = 0; + uint32_t y = 0; + int32_t iArrayIndex = 0; +#if TOUCH_KEY_NUM > 0 + int32_t k = 0; +#endif /* #if TOUCH_KEY_NUM > 0 */ + NVT_LOG("++\n"); + nvt_read_mdata(ts->mmap->BASELINE_ADDR, ts->mmap->BASELINE_BTN_ADDR); + nvt_get_mdata(xdata, &x_num, &y_num); + + for (y = 0; y < y_num; y++) { + for (x = 0; x < x_num; x++) { + iArrayIndex = y * x_num + x; + + if (ts->carrier_system) { + xdata[iArrayIndex] = (uint16_t)xdata[iArrayIndex]; + } else { + xdata[iArrayIndex] = (int16_t)xdata[iArrayIndex]; + } + } + } + +#if TOUCH_KEY_NUM > 0 + + for (k = 0; k < Key_Channel; k++) { + iArrayIndex = Y_Channel * X_Channel + k; + + if (ts->carrier_system) { + xdata[iArrayIndex] = (uint16_t)xdata[iArrayIndex]; + } else { + xdata[iArrayIndex] = (int16_t)xdata[iArrayIndex]; + } + } + +#endif /* #if TOUCH_KEY_NUM > 0 */ + printk("%s:\n", __func__); + + NVT_LOG("--\n"); + return 0; +} + +static int32_t nvt_read_CC(int32_t *xdata) +{ + uint8_t x_num = 0; + uint8_t y_num = 0; + uint32_t x = 0; + uint32_t y = 0; + int32_t iArrayIndex = 0; + int32_t xdata_tmp = 0; +#if TOUCH_KEY_NUM > 0 + int32_t k = 0; +#endif /* #if TOUCH_KEY_NUM > 0 */ + uint32_t rawdata_cc_q_offset = 0; + NVT_LOG("++\n"); + + if (nvt_get_fw_pipe() == 0) + nvt_read_mdata(ts->mmap->DIFF_PIPE1_ADDR, ts->mmap->DIFF_BTN_PIPE1_ADDR); + else + nvt_read_mdata(ts->mmap->DIFF_PIPE0_ADDR, ts->mmap->DIFF_BTN_PIPE0_ADDR); + + nvt_get_mdata(xdata, &x_num, &y_num); + + for (y = 0; y < y_num; y++) { + for (x = 0; x < x_num; x++) { + iArrayIndex = y * x_num + x; + + if (ts->carrier_system) { + xdata_tmp = xdata[iArrayIndex]; + RawData_FW_CC_I[iArrayIndex] = (uint8_t)(xdata_tmp & 0xFF); + RawData_FW_CC_Q[iArrayIndex] = (uint8_t)((xdata_tmp >> 8) & 0xFF); + } else { + xdata[iArrayIndex] = (int16_t)xdata[iArrayIndex]; + } + } + } + +#if TOUCH_KEY_NUM > 0 + + for (k = 0; k < Key_Channel; k++) { + iArrayIndex = Y_Channel * X_Channel + k; + + if (ts->carrier_system) { + xdata_tmp = xdata[iArrayIndex]; + RawData_FW_CC_I[iArrayIndex] = (uint8_t)(xdata_tmp & 0xFF); + RawData_FW_CC_Q[iArrayIndex] = (uint8_t)((xdata_tmp >> 8) & 0xFF); + } else { + xdata[iArrayIndex] = (int16_t)xdata[iArrayIndex]; + } + } + +#endif /* #if TOUCH_KEY_NUM > 0 */ + printk("%s:\n", __func__); + + if (ts->carrier_system) { + printk("%s:RawData_CC_I:\n", __func__); + +#if TOUCH_KEY_NUM > 0 + rawdata_cc_q_offset = Y_Channel * X_Channel * 7 + Y_Channel * 2 + Key_Channel * 7 + 2; +#else + rawdata_cc_q_offset = Y_Channel * X_Channel * 7 + Y_Channel * 2; +#endif /* #if TOUCH_KEY_NUM > 0 */ + } + + NVT_LOG("--\n"); + return 0; +} + +static void nvt_enable_noise_collect(int32_t frame_num) +{ + uint8_t buf[8] = {0}; + /*---set xdata index to EVENT BUF ADDR---*/ + buf[0] = 0xFF; + buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---enable noise collect---*/ + buf[0] = EVENT_MAP_HOST_CMD; + buf[1] = 0x47; + buf[2] = 0xAA; + buf[3] = frame_num; + buf[4] = 0x00; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 5); +} + +static int32_t nvt_read_fw_noise(int32_t *xdata) +{ + uint8_t x_num = 0; + uint8_t y_num = 0; + uint32_t x = 0; + uint32_t y = 0; + int32_t iArrayIndex = 0; + int32_t frame_num = 0; + uint32_t rawdata_diff_min_offset = 0; +#if TOUCH_KEY_NUM > 0 + int32_t k = 0; +#endif /* #if TOUCH_KEY_NUM > 0 */ + NVT_LOG("++\n"); + + /*---Enter Test Mode---*/ + if (nvt_clear_fw_status()) { + return -EAGAIN; + } + + frame_num = PS_Config_Diff_Test_Frame / 10; + + if (frame_num <= 0) + frame_num = 1; + + printk("%s: frame_num=%d\n", __func__, frame_num); + nvt_enable_noise_collect(frame_num); + /* need wait PS_Config_Diff_Test_Frame * 8.3ms */ + msleep(frame_num * 83); + + if (nvt_polling_hand_shake_status()) { + return -EAGAIN; + } + + if (nvt_get_fw_info()) { + return -EAGAIN; + } + + if (nvt_get_fw_pipe() == 0) + nvt_read_mdata(ts->mmap->DIFF_PIPE0_ADDR, ts->mmap->DIFF_BTN_PIPE0_ADDR); + else + nvt_read_mdata(ts->mmap->DIFF_PIPE1_ADDR, ts->mmap->DIFF_BTN_PIPE1_ADDR); + + nvt_get_mdata(xdata, &x_num, &y_num); + + for (y = 0; y < y_num; y++) { + for (x = 0; x < x_num; x++) { + iArrayIndex = y * x_num + x; + + if (ts->carrier_system) { + RawData_Diff_Max[iArrayIndex] = (uint16_t)xdata[iArrayIndex]; + RawData_Diff_Min[iArrayIndex] = 0; + } else { + RawData_Diff_Max[iArrayIndex] = (int8_t)((xdata[iArrayIndex] >> 8) & 0xFF); + RawData_Diff_Min[iArrayIndex] = (int8_t)(xdata[iArrayIndex] & 0xFF); + } + } + } + +#if TOUCH_KEY_NUM > 0 + + for (k = 0; k < Key_Channel; k++) { + iArrayIndex = Y_Channel * X_Channel + k; + + if (ts->carrier_system) { + RawData_Diff_Max[iArrayIndex] = (uint16_t)xdata[iArrayIndex]; + RawData_Diff_Min[iArrayIndex] = 0; + } else { + RawData_Diff_Max[iArrayIndex] = (int8_t)((xdata[iArrayIndex] >> 8) & 0xFF); + RawData_Diff_Min[iArrayIndex] = (int8_t)(xdata[iArrayIndex] & 0xFF); + } + } + +#endif /* #if TOUCH_KEY_NUM > 0 */ + /*---Leave Test Mode---*/ + nvt_change_mode(NORMAL_MODE); + printk("%s:RawData_Diff_Max:\n", __func__); + + if (!ts->carrier_system) { +#if TOUCH_KEY_NUM > 0 + rawdata_diff_min_offset = Y_Channel * X_Channel * 7 + Y_Channel * 2 + Key_Channel * 7 + 2; +#else + rawdata_diff_min_offset = Y_Channel * X_Channel * 7 + Y_Channel * 2; +#endif /* #if TOUCH_KEY_NUM > 0 */ + printk("%s:RawData_Diff_Min:\n", __func__); + + } + + NVT_LOG("--\n"); + return 0; +} + +static void nvt_enable_open_test(void) +{ + uint8_t buf[8] = {0}; + /*---set xdata index to EVENT BUF ADDR---*/ + buf[0] = 0xFF; + buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---enable open test---*/ + buf[0] = EVENT_MAP_HOST_CMD; + buf[1] = 0x45; + buf[2] = 0xAA; + buf[3] = 0x02; + buf[4] = 0x00; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 5); +} + +static void nvt_enable_short_test(void) +{ + uint8_t buf[8] = {0}; + /*---set xdata index to EVENT BUF ADDR---*/ + buf[0] = 0xFF; + buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---enable short test---*/ + buf[0] = EVENT_MAP_HOST_CMD; + buf[1] = 0x43; + buf[2] = 0xAA; + buf[3] = 0x02; + buf[4] = 0x00; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 5); +} + +static int32_t nvt_read_fw_open(int32_t *xdata) +{ + uint32_t raw_pipe_addr = 0; + uint8_t *rawdata_buf = NULL; + uint32_t x = 0; + uint32_t y = 0; + uint8_t buf[128] = {0}; +#if TOUCH_KEY_NUM > 0 + uint32_t raw_btn_pipe_addr = 0; + int32_t k = 0; +#endif /* #if TOUCH_KEY_NUM > 0 */ + NVT_LOG("++\n"); + + /*---Enter Test Mode---*/ + if (nvt_clear_fw_status()) { + return -EAGAIN; + } + + nvt_enable_open_test(); + + if (nvt_polling_hand_shake_status()) { + return -EAGAIN; + } + +#if TOUCH_KEY_NUM > 0 + rawdata_buf = (uint8_t *)kzalloc((IC_X_CFG_SIZE * IC_Y_CFG_SIZE + IC_KEY_CFG_SIZE) * 2, GFP_KERNEL); +#else + rawdata_buf = (uint8_t *)kzalloc(IC_X_CFG_SIZE * IC_Y_CFG_SIZE * 2, GFP_KERNEL); +#endif /* #if TOUCH_KEY_NUM > 0 */ + + if (!rawdata_buf) { + NVT_ERR("kzalloc for rawdata_buf failed!\n"); + return -ENOMEM; + } + + if (nvt_get_fw_pipe() == 0) + raw_pipe_addr = ts->mmap->RAW_PIPE0_ADDR; + else + raw_pipe_addr = ts->mmap->RAW_PIPE1_ADDR; + + for (y = 0; y < IC_Y_CFG_SIZE; y++) { + /*---change xdata index---*/ + buf[0] = 0xFF; + buf[1] = (uint8_t)(((raw_pipe_addr + y * IC_X_CFG_SIZE * 2) >> 16) & 0xFF); + buf[2] = (uint8_t)(((raw_pipe_addr + y * IC_X_CFG_SIZE * 2) >> 8) & 0xFF); + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + buf[0] = (uint8_t)((raw_pipe_addr + y * IC_X_CFG_SIZE * 2) & 0xFF); + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, IC_X_CFG_SIZE * 2 + 1); + memcpy(rawdata_buf + y * IC_X_CFG_SIZE * 2, buf + 1, IC_X_CFG_SIZE * 2); + } + +#if TOUCH_KEY_NUM > 0 + + if (nvt_get_fw_pipe() == 0) + raw_btn_pipe_addr = ts->mmap->RAW_BTN_PIPE0_ADDR; + else + raw_btn_pipe_addr = ts->mmap->RAW_BTN_PIPE1_ADDR; + + /*---change xdata index---*/ + buf[0] = 0xFF; + buf[1] = (uint8_t)((raw_btn_pipe_addr >> 16) & 0xFF); + buf[2] = (uint8_t)((raw_btn_pipe_addr >> 8) & 0xFF); + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + buf[0] = (uint8_t)(raw_btn_pipe_addr & 0xFF); + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, IC_KEY_CFG_SIZE * 2 + 1); + memcpy(rawdata_buf + IC_Y_CFG_SIZE * IC_X_CFG_SIZE * 2, buf + 1, IC_KEY_CFG_SIZE * 2); +#endif /* #if TOUCH_KEY_NUM > 0 */ + + for (y = 0; y < IC_Y_CFG_SIZE; y++) { + for (x = 0; x < IC_X_CFG_SIZE; x++) { + if ((AIN_Y[y] != 0xFF) && (AIN_X[x] != 0xFF)) { + xdata[AIN_Y[y] * X_Channel + AIN_X[x]] = (int16_t)((rawdata_buf[(y * IC_X_CFG_SIZE + x) * 2] + 256 * rawdata_buf[(y * IC_X_CFG_SIZE + x) * 2 + 1])); + } + } + } + +#if TOUCH_KEY_NUM > 0 + + for (k = 0; k < IC_KEY_CFG_SIZE; k++) { + if (AIN_KEY[k] != 0xFF) + xdata[Y_Channel * X_Channel + AIN_KEY[k]] = (int16_t)(rawdata_buf[(IC_Y_CFG_SIZE * IC_X_CFG_SIZE + k) * 2] + 256 * rawdata_buf[(IC_Y_CFG_SIZE * IC_X_CFG_SIZE + k) * 2 + 1]); + } + +#endif /* #if TOUCH_KEY_NUM > 0 */ + + if (rawdata_buf) { + kfree(rawdata_buf); + rawdata_buf = NULL; + } + + /*---Leave Test Mode---*/ + nvt_change_mode(NORMAL_MODE); + printk("%s:RawData_Open\n", __func__); + + NVT_LOG("--\n"); + return 0; +} + +static int32_t nvt_read_fw_short(int32_t *xdata) +{ + uint32_t raw_pipe_addr = 0; + uint8_t *rawdata_buf = NULL; + uint32_t x = 0; + uint32_t y = 0; + uint8_t buf[128] = {0}; + int32_t iArrayIndex = 0; +#if TOUCH_KEY_NUM > 0 + uint32_t raw_btn_pipe_addr = 0; + int32_t k = 0; +#endif /* #if TOUCH_KEY_NUM > 0 */ + uint32_t rawdata_short_base_offset = 0; + NVT_LOG("++\n"); + + /*---Enter Test Mode---*/ + if (nvt_clear_fw_status()) { + return -EAGAIN; + } + + nvt_enable_short_test(); + + if (nvt_polling_hand_shake_status()) { + return -EAGAIN; + } + +#if TOUCH_KEY_NUM > 0 + rawdata_buf = (uint8_t *)kzalloc((X_Channel * Y_Channel + Key_Channel) * 2, GFP_KERNEL); +#else + rawdata_buf = (uint8_t *)kzalloc(X_Channel * Y_Channel * 2, GFP_KERNEL); +#endif /* #if TOUCH_KEY_NUM > 0 */ + + if (!rawdata_buf) { + NVT_ERR("kzalloc for rawdata_buf failed!\n"); + return -ENOMEM; + } + + if (ts->carrier_system) { + /* to get short diff rawdata at pipe0 */ + raw_pipe_addr = ts->mmap->RAW_PIPE0_ADDR; + } else { + if (nvt_get_fw_pipe() == 0) + raw_pipe_addr = ts->mmap->RAW_PIPE0_ADDR; + else + raw_pipe_addr = ts->mmap->RAW_PIPE1_ADDR; + } + + for (y = 0; y < Y_Channel; y++) { + /*---change xdata index---*/ + buf[0] = 0xFF; + buf[1] = (uint8_t)(((raw_pipe_addr + y * X_Channel * 2) >> 16) & 0xFF); + buf[2] = (uint8_t)(((raw_pipe_addr + y * X_Channel * 2) >> 8) & 0xFF); + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + buf[0] = (uint8_t)((raw_pipe_addr + y * X_Channel * 2) & 0xFF); + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, X_Channel * 2 + 1); + memcpy(rawdata_buf + y * X_Channel * 2, buf + 1, X_Channel * 2); + } + +#if TOUCH_KEY_NUM > 0 + + if (ts->carrier_system) { + /* to get button short diff rawdata at pipe0 */ + raw_btn_pipe_addr = ts->mmap->RAW_BTN_PIPE0_ADDR; + } else { + if (nvt_get_fw_pipe() == 0) + raw_btn_pipe_addr = ts->mmap->RAW_BTN_PIPE0_ADDR; + else + raw_btn_pipe_addr = ts->mmap->RAW_BTN_PIPE1_ADDR; + } + + /*---change xdata index---*/ + buf[0] = 0xFF; + buf[1] = (uint8_t)((raw_btn_pipe_addr >> 16) & 0xFF); + buf[2] = (uint8_t)((raw_btn_pipe_addr >> 8) & 0xFF); + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + buf[0] = (uint8_t)(raw_btn_pipe_addr & 0xFF); + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, Key_Channel * 2 + 1); + memcpy(rawdata_buf + Y_Channel * X_Channel * 2, buf + 1, Key_Channel * 2); +#endif /* #if TOUCH_KEY_NUM > 0 */ + + for (y = 0; y < Y_Channel; y++) { + for (x = 0; x < X_Channel; x++) { + iArrayIndex = y * X_Channel + x; + xdata[iArrayIndex] = (int16_t)(rawdata_buf[iArrayIndex * 2] + 256 * rawdata_buf[iArrayIndex * 2 + 1]); + } + } + +#if TOUCH_KEY_NUM > 0 + + for (k = 0; k < Key_Channel; k++) { + iArrayIndex = Y_Channel * X_Channel + k; + xdata[iArrayIndex] = (int16_t)(rawdata_buf[iArrayIndex * 2] + 256 * rawdata_buf[iArrayIndex * 2 + 1]); + } + +#endif /* #if TOUCH_KEY_NUM > 0 */ + + /* for carrier sensing system to get short baseline rawdata */ + if (ts->carrier_system) { + /* to get short baseline rawdata at pipe1 */ + raw_pipe_addr = ts->mmap->RAW_PIPE1_ADDR; + + for (y = 0; y < Y_Channel; y++) { + /*---change xdata index---*/ + buf[0] = 0xFF; + buf[1] = (uint8_t)(((raw_pipe_addr + y * X_Channel * 2) >> 16) & 0xFF); + buf[2] = (uint8_t)(((raw_pipe_addr + y * X_Channel * 2) >> 8) & 0xFF); + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + buf[0] = (uint8_t)((raw_pipe_addr + y * X_Channel * 2) & 0xFF); + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, X_Channel * 2 + 1); + memcpy(rawdata_buf + y * X_Channel * 2, buf + 1, X_Channel * 2); + } + +#if TOUCH_KEY_NUM > 0 + /* to get button short baseline rawdata at pipe1 */ + raw_btn_pipe_addr = ts->mmap->RAW_BTN_PIPE1_ADDR; + /*---change xdata index---*/ + buf[0] = 0xFF; + buf[1] = (uint8_t)((raw_btn_pipe_addr >> 16) & 0xFF); + buf[2] = (uint8_t)((raw_btn_pipe_addr >> 8) & 0xFF); + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + buf[0] = (uint8_t)(raw_btn_pipe_addr & 0xFF); + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, Key_Channel * 2 + 1); + memcpy(rawdata_buf + Y_Channel * X_Channel * 2, buf + 1, Key_Channel * 2); +#endif /* #if TOUCH_KEY_NUM > 0 */ + + for (y = 0; y < Y_Channel; y++) { + for (x = 0; x < X_Channel; x++) { + iArrayIndex = y * X_Channel + x; + RawData_Short_Base[iArrayIndex] = (int16_t)(rawdata_buf[iArrayIndex * 2] + 256 * rawdata_buf[iArrayIndex * 2 + 1]); + } + } + +#if TOUCH_KEY_NUM > 0 + + for (k = 0; k < Key_Channel; k++) { + iArrayIndex = Y_Channel * X_Channel + k; + RawData_Short_Base[iArrayIndex] = (int16_t)(rawdata_buf[iArrayIndex * 2] + 256 * rawdata_buf[iArrayIndex * 2 + 1]); + } + +#endif /* #if TOUCH_KEY_NUM > 0 */ + } + + if (rawdata_buf) { + kfree(rawdata_buf); + rawdata_buf = NULL; + } + + /*---Leave Test Mode---*/ + nvt_change_mode(NORMAL_MODE); + + if (ts->carrier_system) + printk("%s:RawData_Short_Diff:\n", __func__); + else + printk("%s:RawData_Short\n", __func__); + + if (ts->carrier_system) { +#if TOUCH_KEY_NUM > 0 + rawdata_short_base_offset = Y_Channel * X_Channel * 7 + Y_Channel * 2 + Key_Channel * 7 + 2; +#else + rawdata_short_base_offset = Y_Channel * X_Channel * 7 + Y_Channel * 2; +#endif /* #if TOUCH_KEY_NUM > 0 */ + printk("%s:RawData_Short_Base:\n", __func__); + + } + + NVT_LOG("--\n"); + return 0; +} + +/******************************************************* +Description: + Novatek touchscreen raw data test for each single point function. + +return: + Executive outcomes. 0---passed. negative---failed. +*******************************************************/ +static int32_t RawDataTest_SinglePoint_Sub(int32_t rawdata[], uint8_t RecordResult[], uint8_t x_ch, uint8_t y_ch, int32_t Rawdata_Limit_Postive[], int32_t Rawdata_Limit_Negative[]) +{ + int32_t i = 0; + int32_t j = 0; +#if TOUCH_KEY_NUM > 0 + int32_t k = 0; +#endif /* #if TOUCH_KEY_NUM > 0 */ + int32_t iArrayIndex = 0; + bool isPass = true; + + for (j = 0; j < y_ch; j++) { + for (i = 0; i < x_ch; i++) { + iArrayIndex = j * x_ch + i; + RecordResult[iArrayIndex] = 0x00; /* default value for PASS */ + + if (rawdata[iArrayIndex] > Rawdata_Limit_Postive[iArrayIndex]) + RecordResult[iArrayIndex] |= 0x01; + + if (rawdata[iArrayIndex] < Rawdata_Limit_Negative[iArrayIndex]) + RecordResult[iArrayIndex] |= 0x02; + } + } + +#if TOUCH_KEY_NUM > 0 + + for (k = 0; k < Key_Channel; k++) { + iArrayIndex = y_ch * x_ch + k; + RecordResult[iArrayIndex] = 0x00; /* default value for PASS */ + + if (rawdata[iArrayIndex] > Rawdata_Limit_Postive[iArrayIndex]) + RecordResult[iArrayIndex] |= 0x01; + + if (rawdata[iArrayIndex] < Rawdata_Limit_Negative[iArrayIndex]) + RecordResult[iArrayIndex] |= 0x02; + } + +#endif /* #if TOUCH_KEY_NUM > 0 */ + + /*---Check RecordResult---*/ + for (j = 0; j < y_ch; j++) { + for (i = 0; i < x_ch; i++) { + if (RecordResult[j * x_ch + i] != 0) { + isPass = false; + break; + } + } + } + +#if TOUCH_KEY_NUM > 0 + + for (k = 0; k < Key_Channel; k++) { + iArrayIndex = y_ch * x_ch + k; + + if (RecordResult[iArrayIndex] != 0) { + isPass = false; + break; + } + } + +#endif /* #if TOUCH_KEY_NUM > 0 */ + + if (isPass == false) { + return -EPERM; /* FAIL */ + } else { + return 0; /* PASS */ + } +} + +/******************************************************* +Description: + Novatek touchscreen print self-test result function. + +return: + n.a. +*******************************************************/ +void print_selftest_result(struct seq_file *m, int32_t TestResult, uint8_t RecordResult[], int32_t rawdata[], uint8_t x_len, uint8_t y_len) +{ + int32_t i = 0; + int32_t j = 0; + int32_t iArrayIndex = 0; +#if TOUCH_KEY_NUM > 0 + int32_t k = 0; +#endif /* #if TOUCH_KEY_NUM > 0 */ + + switch (TestResult) { + case 0: + nvt_mp_seq_printf(m, " PASS!\n"); + break; + + case 1: + nvt_mp_seq_printf(m, " ERROR! Read Data FAIL!\n"); + break; + + case -EPERM: + nvt_mp_seq_printf(m, " FAIL!\n"); + nvt_mp_seq_printf(m, "RecordResult:\n"); + + for (i = 0; i < y_len; i++) { + for (j = 0; j < x_len; j++) { + iArrayIndex = i * x_len + j; + nvt_mp_seq_printf(m, "0x%02X, ", RecordResult[iArrayIndex]); + } + + nvt_mp_seq_printf(m, "\n"); + } + +#if TOUCH_KEY_NUM > 0 + + for (k = 0; k < Key_Channel; k++) { + iArrayIndex = y_len * x_len + k; + nvt_mp_seq_printf(m, "0x%02X, ", RecordResult[iArrayIndex]); + } + + nvt_mp_seq_printf(m, "\n"); +#endif /* #if TOUCH_KEY_NUM > 0 */ + nvt_mp_seq_printf(m, "ReadData:\n"); + + for (i = 0; i < y_len; i++) { + for (j = 0; j < x_len; j++) { + iArrayIndex = i * x_len + j; + nvt_mp_seq_printf(m, "%5d, ", rawdata[iArrayIndex]); + } + + nvt_mp_seq_printf(m, "\n"); + } + +#if TOUCH_KEY_NUM > 0 + + for (k = 0; k < Key_Channel; k++) { + iArrayIndex = y_len * x_len + k; + nvt_mp_seq_printf(m, "%5d, ", rawdata[iArrayIndex]); + } + + nvt_mp_seq_printf(m, "\n"); +#endif /* #if TOUCH_KEY_NUM > 0 */ + break; + } + + nvt_mp_seq_printf(m, "\n"); +} + +/******************************************************* +Description: + Novatek touchscreen self-test sequence print show + function. + +return: + Executive outcomes. 0---succeed. +*******************************************************/ +static int32_t c_show_selftest(struct seq_file *m, void *v) +{ + NVT_LOG("++\n"); + nvt_mp_seq_printf(m, "FW Version: %d\n", ts->fw_ver); + nvt_mp_seq_printf(m, "Short Test"); + + if ((TestResult_Short == 0) || (TestResult_Short == 1)) { + print_selftest_result(m, TestResult_Short, RecordResult_Short, RawData_Short, X_Channel, Y_Channel); + } else { /* TestResult_Short is -EPERM */ + if (ts->carrier_system) { + nvt_mp_seq_printf(m, " FAIL!\n"); + + if (TestResult_Short_Diff == -EPERM) { + nvt_mp_seq_printf(m, "Short Diff"); + print_selftest_result(m, TestResult_Short_Diff, RecordResult_Short_Diff, RawData_Short_Diff, X_Channel, Y_Channel); + } + + if (TestResult_Short_Base == -EPERM) { + nvt_mp_seq_printf(m, "Short Base"); + print_selftest_result(m, TestResult_Short_Base, RecordResult_Short_Base, RawData_Short_Base, X_Channel, Y_Channel); + } + } else { + print_selftest_result(m, TestResult_Short, RecordResult_Short, RawData_Short, X_Channel, Y_Channel); + } + } + + nvt_mp_seq_printf(m, "Open Test"); + print_selftest_result(m, TestResult_Open, RecordResult_Open, RawData_Open, X_Channel, Y_Channel); + nvt_mp_seq_printf(m, "FW Rawdata Test"); + + if ((TestResult_FW_Rawdata == 0) || (TestResult_FW_Rawdata == 1)) { + print_selftest_result(m, TestResult_FWMutual, RecordResult_FWMutual, RawData_FWMutual, X_Channel, Y_Channel); + } else { /* TestResult_FW_Rawdata is -EPERM */ + nvt_mp_seq_printf(m, " FAIL!\n"); + + if (TestResult_FWMutual == -EPERM) { + nvt_mp_seq_printf(m, "FW Mutual"); + print_selftest_result(m, TestResult_FWMutual, RecordResult_FWMutual, RawData_FWMutual, X_Channel, Y_Channel); + } + + if (TestResult_FW_CC == -EPERM) { + if (ts->carrier_system) { + if (TestResult_FW_CC_I == -EPERM) { + nvt_mp_seq_printf(m, "FW CC_I"); + print_selftest_result(m, TestResult_FW_CC_I, RecordResult_FW_CC_I, RawData_FW_CC_I, X_Channel, Y_Channel); + } + + if (TestResult_FW_CC_Q == -EPERM) { + nvt_mp_seq_printf(m, "FW CC_Q"); + print_selftest_result(m, TestResult_FW_CC_Q, RecordResult_FW_CC_Q, RawData_FW_CC_Q, X_Channel, Y_Channel); + } + } else { + nvt_mp_seq_printf(m, "FW CC"); + print_selftest_result(m, TestResult_FW_CC, RecordResult_FW_CC, RawData_FW_CC, X_Channel, Y_Channel); + } + } + } + + nvt_mp_seq_printf(m, "Noise Test"); + + if ((TestResult_Noise == 0) || (TestResult_Noise == 1)) { + print_selftest_result(m, TestResult_FW_DiffMax, RecordResult_FW_DiffMax, RawData_Diff_Max, X_Channel, Y_Channel); + } else { /* TestResult_Noise is -EPERM */ + nvt_mp_seq_printf(m, " FAIL!\n"); + + if (TestResult_FW_DiffMax == -EPERM) { + nvt_mp_seq_printf(m, "FW Diff Max"); + print_selftest_result(m, TestResult_FW_DiffMax, RecordResult_FW_DiffMax, RawData_Diff_Max, X_Channel, Y_Channel); + } + + if (TestResult_FW_DiffMin == -EPERM) { + nvt_mp_seq_printf(m, "FW Diff Min"); + print_selftest_result(m, TestResult_FW_DiffMin, RecordResult_FW_DiffMin, RawData_Diff_Min, X_Channel, Y_Channel); + } + } + + nvt_mp_test_result_printed = 1; + NVT_LOG("--\n"); + return 0; +} + +/******************************************************* +Description: + Novatek touchscreen self-test sequence print start + function. + +return: + Executive outcomes. 1---call next function. + NULL---not call next function and sequence loop + stop. +*******************************************************/ +static void *c_start(struct seq_file *m, loff_t *pos) +{ + return *pos < 1 ? (void *)1 : NULL; +} + +/******************************************************* +Description: + Novatek touchscreen self-test sequence print next + function. + +return: + Executive outcomes. NULL---no next and call sequence + stop function. +*******************************************************/ +static void *c_next(struct seq_file *m, void *v, loff_t *pos) +{ + ++*pos; + return NULL; +} + +/******************************************************* +Description: + Novatek touchscreen self-test sequence print stop + function. + +return: + n.a. +*******************************************************/ +static void c_stop(struct seq_file *m, void *v) +{ + return; +} + +const struct seq_operations nvt_selftest_seq_ops = { + .start = c_start, + .next = c_next, + .stop = c_stop, + .show = c_show_selftest +}; + +/******************************************************* +Description: + Novatek touchscreen /proc/nvt_selftest open function. + +return: + Executive outcomes. 0---succeed. negative---failed. +*******************************************************/ +static int32_t nvt_selftest_open(struct inode *inode, struct file *file) +{ + struct device_node *np = ts->client->dev.of_node; + unsigned char mpcriteria[32] = {0}; /*novatek-mp-criteria-default*/ + TestResult_Short = 0; + TestResult_Short_Diff = 0; + TestResult_Short_Base = 0; + TestResult_Open = 0; + TestResult_FW_Rawdata = 0; + TestResult_FWMutual = 0; + TestResult_FW_CC = 0; + TestResult_FW_CC_I = 0; + TestResult_FW_CC_Q = 0; + TestResult_Noise = 0; + TestResult_FW_DiffMax = 0; + TestResult_FW_DiffMin = 0; + NVT_LOG("++\n"); + + if (mutex_lock_interruptible(&ts->lock)) { + return -ERESTARTSYS; + } + +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + + if (nvt_get_fw_info()) { + mutex_unlock(&ts->lock); + NVT_ERR("get fw info failed!\n"); + return -EAGAIN; + } + + /* Parsing criteria from dts */ + if (of_property_read_bool(np, "novatek,mp-support-dt")) { + /* + * Parsing Criteria by Novatek PID + * The string rule is "novatek-mp-criteria-<nvt_pid>" + * nvt_pid is 2 bytes (show hex). + * + * Ex. nvt_pid = 500A + * mpcriteria = "novatek-mp-criteria-500A" + */ + snprintf(mpcriteria, PAGE_SIZE, "novatek-mp-criteria-%04X", ts->nvt_pid); + nvt_mp_parse_dt(np, mpcriteria); + } else { + NVT_LOG("Not found novatek,mp-support-dt, use default setting\n"); + /*---Print Test Criteria---*/ + nvt_print_criteria(); + } + + if (nvt_switch_FreqHopEnDis(FREQ_HOP_DISABLE)) { + mutex_unlock(&ts->lock); + NVT_ERR("switch frequency hopping disable failed!\n"); + return -EAGAIN; + } + + if (nvt_check_fw_reset_state(RESET_STATE_NORMAL_RUN)) { + mutex_unlock(&ts->lock); + NVT_ERR("check fw reset state failed!\n"); + return -EAGAIN; + } + + msleep(100); + + /*---Enter Test Mode---*/ + if (nvt_clear_fw_status()) { + mutex_unlock(&ts->lock); + NVT_ERR("clear fw status failed!\n"); + return -EAGAIN; + } + + nvt_change_mode(MP_MODE_CC); + + if (nvt_check_fw_status()) { + mutex_unlock(&ts->lock); + NVT_ERR("check fw status failed!\n"); + return -EAGAIN; + } + + /*---FW Rawdata Test---*/ + if (nvt_read_baseline(RawData_FWMutual) != 0) { + TestResult_FWMutual = 1; + } else { + TestResult_FWMutual = RawDataTest_SinglePoint_Sub(RawData_FWMutual, RecordResult_FWMutual, X_Channel, Y_Channel, + PS_Config_Lmt_FW_Rawdata_P, PS_Config_Lmt_FW_Rawdata_N); + } + + if (nvt_read_CC(RawData_FW_CC) != 0) { + TestResult_FW_CC = 1; + + if (ts->carrier_system) { + TestResult_FW_CC_I = 1; + TestResult_FW_CC_Q = 1; + } + } else { + if (ts->carrier_system) { + TestResult_FW_CC_I = RawDataTest_SinglePoint_Sub(RawData_FW_CC_I, RecordResult_FW_CC_I, X_Channel, Y_Channel, + PS_Config_Lmt_FW_CC_I_P, PS_Config_Lmt_FW_CC_I_N); + TestResult_FW_CC_Q = RawDataTest_SinglePoint_Sub(RawData_FW_CC_Q, RecordResult_FW_CC_Q, X_Channel, Y_Channel, + PS_Config_Lmt_FW_CC_Q_P, PS_Config_Lmt_FW_CC_Q_N); + + if ((TestResult_FW_CC_I == -EPERM) || (TestResult_FW_CC_Q == -EPERM)) + TestResult_FW_CC = -EPERM; + else + TestResult_FW_CC = 0; + } else { + TestResult_FW_CC = RawDataTest_SinglePoint_Sub(RawData_FW_CC, RecordResult_FW_CC, X_Channel, Y_Channel, + PS_Config_Lmt_FW_CC_P, PS_Config_Lmt_FW_CC_N); + } + } + + if ((TestResult_FWMutual == 1) || (TestResult_FW_CC == 1)) { + TestResult_FW_Rawdata = 1; + } else { + if ((TestResult_FWMutual == -EPERM) || (TestResult_FW_CC == -EPERM)) + TestResult_FW_Rawdata = -EPERM; + else + TestResult_FW_Rawdata = 0; + } + + /*---Leave Test Mode---*/ + nvt_change_mode(NORMAL_MODE); + + /*---Noise Test---*/ + if (nvt_read_fw_noise(RawData_Diff) != 0) { + TestResult_Noise = 1; /* 1: ERROR */ + TestResult_FW_DiffMax = 1; + TestResult_FW_DiffMin = 1; + } else { + TestResult_FW_DiffMax = RawDataTest_SinglePoint_Sub(RawData_Diff_Max, RecordResult_FW_DiffMax, X_Channel, Y_Channel, + PS_Config_Lmt_FW_Diff_P, PS_Config_Lmt_FW_Diff_N); + + /* for carrier sensing system, only positive noise data */ + if (ts->carrier_system) { + TestResult_FW_DiffMin = 0; + } else { + TestResult_FW_DiffMin = RawDataTest_SinglePoint_Sub(RawData_Diff_Min, RecordResult_FW_DiffMin, X_Channel, Y_Channel, + PS_Config_Lmt_FW_Diff_P, PS_Config_Lmt_FW_Diff_N); + } + + if ((TestResult_FW_DiffMax == -EPERM) || (TestResult_FW_DiffMin == -EPERM)) + TestResult_Noise = -EPERM; + else + TestResult_Noise = 0; + } + + /*--Short Test---*/ + if (nvt_read_fw_short(RawData_Short) != 0) { + TestResult_Short = 1; /* 1:ERROR */ + + if (ts->carrier_system) { + TestResult_Short_Diff = 1; + TestResult_Short_Base = 1; + } + } else { + /*---Self Test Check --- 0:PASS, -EPERM:FAIL*/ + if (ts->carrier_system) { + TestResult_Short_Diff = RawDataTest_SinglePoint_Sub(RawData_Short_Diff, RecordResult_Short_Diff, X_Channel, Y_Channel, + PS_Config_Lmt_Short_Diff_P, PS_Config_Lmt_Short_Diff_N); + TestResult_Short_Base = RawDataTest_SinglePoint_Sub(RawData_Short_Base, RecordResult_Short_Base, X_Channel, Y_Channel, + PS_Config_Lmt_Short_Base_P, PS_Config_Lmt_Short_Base_N); + + if ((TestResult_Short_Diff == -EPERM) || (TestResult_Short_Base == -EPERM)) + TestResult_Short = -EPERM; + else + TestResult_Short = 0; + } else { + TestResult_Short = RawDataTest_SinglePoint_Sub(RawData_Short, RecordResult_Short, X_Channel, Y_Channel, + PS_Config_Lmt_Short_Rawdata_P, PS_Config_Lmt_Short_Rawdata_N); + } + } + + /*---Open Test---*/ + if (nvt_read_fw_open(RawData_Open) != 0) { + TestResult_Open = 1; /* 1:ERROR */ + } else { + /*---Self Test Check --- 0:PASS, -EPERM:FAIL */ + TestResult_Open = RawDataTest_SinglePoint_Sub(RawData_Open, RecordResult_Open, X_Channel, Y_Channel, + PS_Config_Lmt_Open_Rawdata_P, PS_Config_Lmt_Open_Rawdata_N); + } + + /*---Reset IC---*/ + nvt_bootloader_reset(); + mutex_unlock(&ts->lock); + NVT_LOG("--\n"); + nvt_mp_test_result_printed = 0; + return seq_open(file, &nvt_selftest_seq_ops); +} + +static const struct file_operations nvt_selftest_fops = { + .owner = THIS_MODULE, + .open = nvt_selftest_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +#ifdef CONFIG_OF +/******************************************************* +Description: + Novatek touchscreen parse AIN setting for array type. + +return: + n.a. +*******************************************************/ +void nvt_mp_parse_ain(struct device_node *np, const char *name, uint8_t *array, int32_t size) +{ + struct property *data; + int32_t len, ret; + int32_t tmp[40]; + int32_t i; + data = of_find_property(np, name, &len); + len /= sizeof(u32); + + if ((!data) || (!len) || (len != size)) { + NVT_ERR("error find %s. len=%d\n", name, len); + } else { + NVT_LOG("%s. len=%d\n", name, len); + ret = of_property_read_u32_array(np, name, tmp, len); + + if (ret) { + NVT_ERR("error reading %s. ret=%d\n", name, ret); + return; + } + + for (i = 0; i < len; i++) + array[i] = tmp[i]; + +#if NVT_DEBUG + printk("[NVT-ts] %s = ", name); + + for (i = 0; i < len; i++) { + printk("%02d ", array[i]); + } + + printk("\n"); +#endif + } +} + +/******************************************************* +Description: + Novatek touchscreen parse criterion for u32 type. + +return: + n.a. +*******************************************************/ +void nvt_mp_parse_u32(struct device_node *np, const char *name, int32_t *para) +{ + int32_t ret; + ret = of_property_read_u32(np, name, para); + + if (ret) + NVT_ERR("error reading %s. ret=%d\n", name, ret); + else { +#if NVT_DEBUG + NVT_LOG("%s=%d\n", name, *para); +#endif + } +} + +/******************************************************* +Description: + Novatek touchscreen parse criterion for array type. + +return: + n.a. +*******************************************************/ +void nvt_mp_parse_array(struct device_node *np, const char *name, int32_t *array, + int32_t size) +{ + struct property *data; + int32_t len, ret; +#if NVT_DEBUG + int32_t i, j, iArrayIndex = 0; +#endif + data = of_find_property(np, name, &len); + len /= sizeof(u32); + + if ((!data) || (!len) || (len < size)) { + NVT_ERR("error find %s. len=%d\n", name, len); + } else { + NVT_LOG("%s. len=%d\n", name, len); + ret = of_property_read_u32_array(np, name, array, len); + + if (ret) { + NVT_ERR("error reading %s. ret=%d\n", name, ret); + return; + } + +#if NVT_DEBUG + NVT_LOG("%s =\n", name); + + for (j = 0; j < Y_Channel; j++) { + printk("[NVT-ts] "); + + for (i = 0; i < X_Channel; i++) { + iArrayIndex = j * X_Channel + i; + printk("%5d, ", array[iArrayIndex]); + } + + printk("\n"); + } + +#if TOUCH_KEY_NUM > 0 + printk("[NVT-ts] "); + + for (i = 0; i < Key_Channel; i++) { + iArrayIndex++; + printk("%5d, ", array[iArrayIndex]); + } + + printk("\n"); +#endif +#endif + } +} + +/******************************************************* +Description: + Novatek touchscreen parse device tree mp function. + +return: + n.a. +*******************************************************/ +void nvt_mp_parse_dt(struct device_node *root, const char *node_compatible) +{ + struct device_node *np = root; + struct device_node *child = NULL; + NVT_LOG("Parse mp criteria for node %s\n", node_compatible); + /* find each MP sub-nodes */ + for_each_child_of_node(root, child) { + /* find the specified node */ + if (of_device_is_compatible(child, node_compatible)) { + NVT_LOG("found child node %s\n", node_compatible); + np = child; + break; + } + } + + if (child == NULL) { + NVT_ERR("Not found compatible node %s, use default setting!\n", node_compatible); + return; + } + + /* MP Config*/ + nvt_mp_parse_u32(np, "IC_X_CFG_SIZE", &IC_X_CFG_SIZE); + nvt_mp_parse_u32(np, "IC_Y_CFG_SIZE", &IC_Y_CFG_SIZE); +#if TOUCH_KEY_NUM > 0 + nvt_mp_parse_u32(np, "IC_KEY_CFG_SIZE", &IC_KEY_CFG_SIZE); +#endif + nvt_mp_parse_u32(np, "X_Channel", &X_Channel); + nvt_mp_parse_u32(np, "Y_Channel", &Y_Channel); + nvt_mp_parse_ain(np, "AIN_X", AIN_X, IC_X_CFG_SIZE); + nvt_mp_parse_ain(np, "AIN_Y", AIN_Y, IC_Y_CFG_SIZE); +#if TOUCH_KEY_NUM > 0 + nvt_mp_parse_ain(np, "AIN_KEY", AIN_KEY, IC_KEY_CFG_SIZE); +#endif + + /* MP Criteria */ + if (ts->carrier_system) { + nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Diff_P", PS_Config_Lmt_Short_Diff_P, + X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Diff_N", PS_Config_Lmt_Short_Diff_N, + X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Base_P", PS_Config_Lmt_Short_Base_P, + X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Base_N", PS_Config_Lmt_Short_Base_N, + X_Channel * Y_Channel + Key_Channel); + } else { + nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Rawdata_P", PS_Config_Lmt_Short_Rawdata_P, + X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Rawdata_N", PS_Config_Lmt_Short_Rawdata_N, + X_Channel * Y_Channel + Key_Channel); + } + + nvt_mp_parse_array(np, "PS_Config_Lmt_Open_Rawdata_P", PS_Config_Lmt_Open_Rawdata_P, + X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_array(np, "PS_Config_Lmt_Open_Rawdata_N", PS_Config_Lmt_Open_Rawdata_N, + X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Rawdata_P", PS_Config_Lmt_FW_Rawdata_P, + X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Rawdata_N", PS_Config_Lmt_FW_Rawdata_N, + X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_P", PS_Config_Lmt_FW_CC_P, + X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_N", PS_Config_Lmt_FW_CC_N, + X_Channel * Y_Channel + Key_Channel); + + if (ts->carrier_system) { + nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_I_P", PS_Config_Lmt_FW_CC_I_P, + X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_I_N", PS_Config_Lmt_FW_CC_I_N, + X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_Q_P", PS_Config_Lmt_FW_CC_Q_P, + X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_Q_N", PS_Config_Lmt_FW_CC_Q_N, + X_Channel * Y_Channel + Key_Channel); + } + + nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Diff_P", PS_Config_Lmt_FW_Diff_P, + X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Diff_N", PS_Config_Lmt_FW_Diff_N, + X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_u32(np, "PS_Config_Diff_Test_Frame", &PS_Config_Diff_Test_Frame); + NVT_LOG("Parse mp criteria done!\n"); +} +#endif /* #ifdef CONFIG_OF */ + +#define NVT_RESULT_INVALID 0 +#define NVT_RESULT_PASS 2 +#define NVT_RESULT_FAIL 1 + +static int nvt_short_test(void) +{ + TestResult_Short = 0; + NVT_LOG("++\n"); + + if (mutex_lock_interruptible(&ts->lock)) { + return -ERESTARTSYS; + } + +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + + if (nvt_get_fw_info()) { + mutex_unlock(&ts->lock); + NVT_ERR("get fw info failed!\n"); + return -EAGAIN; + } + + if (nvt_switch_FreqHopEnDis(FREQ_HOP_DISABLE)) { + mutex_unlock(&ts->lock); + NVT_ERR("switch frequency hopping disable failed!\n"); + return -EAGAIN; + } + + if (nvt_check_fw_reset_state(RESET_STATE_NORMAL_RUN)) { + mutex_unlock(&ts->lock); + NVT_ERR("check fw reset state failed!\n"); + return -EAGAIN; + } + + msleep(100); + + /*---Enter Test Mode---*/ + if (nvt_clear_fw_status()) { + mutex_unlock(&ts->lock); + NVT_ERR("clear fw status failed!\n"); + return -EAGAIN; + } + + nvt_change_mode(MP_MODE_CC); + + if (nvt_check_fw_status()) { + mutex_unlock(&ts->lock); + NVT_ERR("check fw status failed!\n"); + return -EAGAIN; + } + + /*---Leave Test Mode---*/ + nvt_change_mode(NORMAL_MODE); + + /*--Short Test---*/ + if (nvt_read_fw_short(RawData_Short) != 0) { + TestResult_Short = 1; /* 1:ERROR */ + + if (ts->carrier_system) { + TestResult_Short_Diff = 1; + TestResult_Short_Base = 1; + } + } else { + /*---Self Test Check --- 0:PASS, -EPERM:FAIL*/ + if (ts->carrier_system) { + TestResult_Short_Diff = RawDataTest_SinglePoint_Sub(RawData_Short_Diff, RecordResult_Short_Diff, X_Channel, Y_Channel, + PS_Config_Lmt_Short_Diff_P, PS_Config_Lmt_Short_Diff_N); + TestResult_Short_Base = RawDataTest_SinglePoint_Sub(RawData_Short_Base, RecordResult_Short_Base, X_Channel, Y_Channel, + PS_Config_Lmt_Short_Base_P, PS_Config_Lmt_Short_Base_N); + + if ((TestResult_Short_Diff == -EPERM) || (TestResult_Short_Base == -EPERM)) + TestResult_Short = -EPERM; + else + TestResult_Short = 0; + } else { + TestResult_Short = RawDataTest_SinglePoint_Sub(RawData_Short, RecordResult_Short, X_Channel, Y_Channel, + PS_Config_Lmt_Short_Rawdata_P, PS_Config_Lmt_Short_Rawdata_N); + } + } + + /*---Reset IC---*/ + nvt_bootloader_reset(); + mutex_unlock(&ts->lock); + NVT_LOG("--\n"); + return TestResult_Short; +} + +static int nvt_open_test(void) +{ + TestResult_Open = 0; + NVT_LOG("++\n"); + + if (mutex_lock_interruptible(&ts->lock)) { + return -ERESTARTSYS; + } + +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + + if (nvt_get_fw_info()) { + mutex_unlock(&ts->lock); + NVT_ERR("get fw info failed!\n"); + return -EAGAIN; + } + + if (nvt_switch_FreqHopEnDis(FREQ_HOP_DISABLE)) { + mutex_unlock(&ts->lock); + NVT_ERR("switch frequency hopping disable failed!\n"); + return -EAGAIN; + } + + if (nvt_check_fw_reset_state(RESET_STATE_NORMAL_RUN)) { + mutex_unlock(&ts->lock); + NVT_ERR("check fw reset state failed!\n"); + return -EAGAIN; + } + + msleep(100); + + /*---Enter Test Mode---*/ + if (nvt_clear_fw_status()) { + mutex_unlock(&ts->lock); + NVT_ERR("clear fw status failed!\n"); + return -EAGAIN; + } + + nvt_change_mode(MP_MODE_CC); + + if (nvt_check_fw_status()) { + mutex_unlock(&ts->lock); + NVT_ERR("check fw status failed!\n"); + return -EAGAIN; + } + + /*---Leave Test Mode---*/ + nvt_change_mode(NORMAL_MODE); + + /*---Open Test---*/ + if (nvt_read_fw_open(RawData_Open) != 0) { + TestResult_Open = 1; /* 1:ERROR */ + } else { + /*---Self Test Check --- 0:PASS, -EPERM:FAIL */ + TestResult_Open = RawDataTest_SinglePoint_Sub(RawData_Open, RecordResult_Open, X_Channel, Y_Channel, + PS_Config_Lmt_Open_Rawdata_P, PS_Config_Lmt_Open_Rawdata_N); + } + + /*---Reset IC---*/ + nvt_bootloader_reset(); + mutex_unlock(&ts->lock); + NVT_LOG("--\n"); + return TestResult_Open; +} + +static ssize_t nvt_selftest_read(struct file *file, char __user *buf, size_t count, loff_t *pos) +{ + char tmp[5] = {0}; + int cnt; + + if (*pos != 0) + return 0; + + cnt = snprintf(tmp, sizeof(ts->result_type), "%d\n", ts->result_type); + + if (copy_to_user(buf, tmp, strlen(tmp))) { + return -EFAULT; + } + + *pos += cnt; + return cnt; +} + +static ssize_t nvt_selftest_write(struct file *file, const char __user *buf, size_t count, loff_t *pos) +{ + int retval = 0; + char tmp[6]; + + if (copy_from_user(tmp, buf, count)) { + retval = -EFAULT; + goto out; + } + + if (!strncmp("short", tmp, 5)) { + retval = nvt_short_test(); + } else if (!strncmp("open", tmp, 4)) { + retval = nvt_open_test(); + } else if (!strncmp("i2c", tmp, 3)) + retval = nvt_get_fw_info(); + + if (retval < 0) + ts->result_type = NVT_RESULT_INVALID; + else if (retval == 0) + ts->result_type = NVT_RESULT_PASS; + else + ts->result_type = NVT_RESULT_FAIL; + +out: + + if (retval >= 0) + retval = count; + + return retval; +} + +static const struct file_operations nvt_selftest_ops = { + .read = nvt_selftest_read, + .write = nvt_selftest_write, +}; + +/******************************************************* +Description: + Novatek touchscreen MP function proc. file node + initial function. + +return: + Executive outcomes. 0---succeed. -EPERM---failed. +*******************************************************/ +int32_t nvt_mp_proc_init(void) +{ + NVT_proc_selftest_entry = proc_create("nvt_selftest", 0444, NULL, &nvt_selftest_fops); + + if (NVT_proc_selftest_entry == NULL) { + NVT_ERR("create /proc/nvt_selftest Failed!\n"); + return -EPERM; + } else { + if (nvt_mp_buffer_init()) { + NVT_ERR("Allocate mp memory failed\n"); + return -EPERM; + } else { + NVT_LOG("create /proc/nvt_selftest Succeeded!\n"); + } + } + + ts->tp_selftest_proc = proc_create("tp_selftest", 0644, NULL, &nvt_selftest_ops); + return 0; +} + +#endif /* #if NVT_TOUCH_MP */ diff --git a/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mp_ctrlram.h b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mp_ctrlram.h new file mode 100644 index 000000000000..bc1fdba9952c --- /dev/null +++ b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mp_ctrlram.h @@ -0,0 +1,1154 @@ +/* + * Copyright (C) 2010 - 2017 Novatek, Inc. + * Copyright (C) 2020 XiaoMi, Inc. + * + * $Revision: 28670 $ + * $Date: 2018-05-25 15:59:17 +0800 (週五, 25 五月 2018) $ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + */ + +#if NVT_TOUCH_MP + +static uint32_t IC_X_CFG_SIZE = 18; +static uint32_t IC_Y_CFG_SIZE = 36; +static uint32_t IC_KEY_CFG_SIZE = 4; +static uint32_t X_Channel = 18; +static uint32_t Y_Channel = 36; +static uint32_t Key_Channel = TOUCH_KEY_NUM; + +static uint8_t AIN_X[40] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 +}; + +static uint8_t AIN_Y[40] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 +}; + +#if TOUCH_KEY_NUM > 0 +static uint8_t AIN_KEY[8] = { + 0, 1, 2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}; +#endif /* #if TOUCH_KEY_NUM > 0 */ + +static int32_t PS_Config_Lmt_Short_Rawdata_P[40 * 40] = { + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, + 14000, 14000, 14000, 14000, 14000, 14000, 14000, +#if TOUCH_KEY_NUM > 0 + 20000, 20000, 20000, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_Short_Rawdata_N[40 * 40] = { + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, + 11000, 11000, 11000, 11000, 11000, 11000, 11000, +#if TOUCH_KEY_NUM > 0 + 11550, 11550, 11550, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_Short_Diff_P[40 * 40] = { + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, +#if TOUCH_KEY_NUM > 0 + 6300, 6300, 6300, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_Short_Diff_N[40 * 40] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +#if TOUCH_KEY_NUM > 0 + 0, 0, 0, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_Short_Base_P[40 * 40] = { + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, +#if TOUCH_KEY_NUM > 0 + 2000, 2000, 2000, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_Short_Base_N[40 * 40] = { + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, +#if TOUCH_KEY_NUM > 0 + -2000, -2000, -2000, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_Open_Rawdata_P[40 * 40] = { + 2857, 3296, 3307, 3308, 3294, 3532, 5120, 5120, 5120, 5120, 5120, 5120, + 3262, 3071, 3081, 3095, 3102, 2936, + 3030, 3023, 3011, 3018, 3017, 3008, 2978, 2566, 2531, 2552, 2585, 3008, + 3347, 3352, 3349, 3321, 3311, 3299, + 2948, 2935, 2924, 2929, 2927, 2923, 2923, 2906, 2892, 2936, 2942, 2965, + 2965, 2968, 2977, 2993, 2999, 3022, + 2954, 2940, 2931, 2934, 2933, 2928, 2928, 2908, 2897, 2934, 2941, 2960, + 2965, 2965, 2978, 2990, 2997, 3016, + 2969, 2958, 2950, 2954, 2948, 2943, 2943, 2925, 2912, 2950, 2957, 2975, + 2982, 2981, 2996, 3006, 3013, 3027, + 2958, 2946, 2940, 2942, 2936, 2931, 2930, 2909, 2901, 2933, 2940, 2957, + 2966, 2964, 2980, 2989, 2998, 3007, + 2959, 2947, 2940, 2940, 2936, 2932, 2930, 2908, 2904, 2944, 2949, 2965, + 2976, 2976, 2988, 2997, 3005, 3017, + 2964, 2951, 2946, 2945, 2942, 2936, 2933, 2911, 2908, 2949, 2955, 2970, + 2981, 2983, 2993, 3001, 3011, 3021, + 2961, 2950, 2944, 2943, 2940, 2935, 2932, 2908, 2906, 2951, 2957, 2971, + 2985, 2986, 2995, 3004, 3011, 3020, + 2960, 2950, 2945, 2942, 2939, 2934, 2930, 2910, 2905, 2935, 2940, 2947, + 2955, 2965, 2974, 2981, 2990, 2996, + 2969, 2962, 2960, 2954, 2951, 2947, 2942, 2921, 2916, 2953, 2957, 2966, + 2974, 2983, 2994, 3000, 3007, 3013, + 2982, 2977, 2975, 2970, 2967, 2963, 2955, 2935, 2932, 2944, 2946, 2955, + 2964, 2972, 2982, 2988, 2995, 2999, + 2944, 2941, 2938, 2933, 2931, 2926, 2918, 2898, 2896, 2953, 2950, 2961, + 2972, 2981, 2988, 2994, 3001, 3005, + 2975, 2971, 2969, 2963, 2961, 2956, 2947, 2933, 2928, 2962, 2959, 2970, + 2982, 2990, 2996, 3001, 3008, 3010, + 2963, 2956, 2959, 2953, 2950, 2945, 2938, 2927, 2919, 2971, 2968, 2980, + 2989, 2997, 3004, 3010, 3013, 3016, + 2958, 2952, 2955, 2948, 2946, 2940, 2936, 2923, 2916, 2971, 2967, 2980, + 2989, 2997, 3003, 3009, 3010, 3014, + 2939, 2933, 2936, 2928, 2927, 2921, 2917, 2911, 2895, 2931, 2928, 2942, + 2951, 2958, 2965, 2970, 2970, 2970, + 2949, 2946, 2949, 2943, 2939, 2933, 2930, 2922, 2910, 2961, 2957, 2972, + 2980, 2989, 2993, 2999, 2999, 3000, + 2932, 2929, 2929, 2922, 2921, 2915, 2910, 2903, 2894, 2932, 2926, 2941, + 2952, 2959, 2962, 2968, 2968, 2969, + 2924, 2919, 2921, 2915, 2911, 2906, 2904, 2895, 2889, 2937, 2935, 2948, + 2957, 2963, 2965, 2971, 2971, 2976, + 2935, 2930, 2932, 2924, 2922, 2917, 2913, 2904, 2904, 2927, 2923, 2941, + 2943, 2950, 2954, 2960, 2957, 2965, + 2912, 2907, 2908, 2901, 2897, 2893, 2891, 2880, 2878, 2918, 2914, 2933, + 2934, 2941, 2942, 2950, 2946, 2955, + 2903, 2896, 2897, 2889, 2886, 2881, 2880, 2872, 2869, 2914, 2909, 2927, + 2929, 2935, 2936, 2943, 2943, 2950, + 2653, 2648, 2652, 2647, 2640, 2633, 2636, 2631, 2626, 2659, 2654, 2666, + 2671, 2680, 2683, 2689, 2684, 2693, + 2663, 2658, 2663, 2659, 2653, 2647, 2651, 2645, 2639, 2644, 2640, 2655, + 2658, 2666, 2670, 2672, 2668, 2676, + 2645, 2639, 2644, 2640, 2635, 2628, 2633, 2627, 2622, 2653, 2652, 2668, + 2670, 2678, 2679, 2683, 2680, 2689, + 2656, 2650, 2652, 2647, 2642, 2637, 2642, 2638, 2632, 2635, 2635, 2652, + 2653, 2660, 2664, 2666, 2666, 2673, + 2641, 2633, 2635, 2630, 2626, 2623, 2627, 2622, 2616, 2637, 2637, 2655, + 2654, 2661, 2665, 2668, 2668, 2677, + 2625, 2618, 2619, 2614, 2609, 2607, 2612, 2605, 2599, 2624, 2624, 2642, + 2641, 2649, 2652, 2656, 2656, 2664, + 2628, 2618, 2620, 2615, 2610, 2608, 2613, 2606, 2600, 2618, 2618, 2637, + 2636, 2643, 2646, 2649, 2651, 2660, + 2624, 2615, 2614, 2609, 2606, 2603, 2607, 2600, 2595, 2592, 2593, 2611, + 2610, 2616, 2619, 2623, 2625, 2635, + 2598, 2588, 2587, 2582, 2579, 2575, 2581, 2573, 2569, 2598, 2599, 2616, + 2615, 2623, 2625, 2630, 2632, 2642, + 2583, 2573, 2572, 2568, 2564, 2560, 2568, 2560, 2554, 2578, 2581, 2596, + 2596, 2602, 2604, 2609, 2612, 2622, + 2555, 2544, 2544, 2541, 2538, 2534, 2543, 2533, 2528, 2576, 2577, 2592, + 2593, 2602, 2602, 2606, 2610, 2620, + 2652, 2654, 2654, 2653, 2651, 2645, 2657, 2643, 2637, 2652, 2654, 2669, + 2672, 2681, 2681, 2683, 2687, 2698, + 2436, 2635, 2630, 2630, 2631, 2621, 2624, 2615, 2610, 2656, 2665, 2686, + 2664, 2674, 2670, 2674, 2678, 2260, +#if TOUCH_KEY_NUM > 0 + 13000, 13000, 13000, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_Open_Rawdata_N[40 * 40] = { + 1642, 1894, 1901, 1901, 1893, 2030, 50, 50, 50, 50, 50, 50, 1875, 1765, + 1771, 1779, 1783, 1688, + 1741, 1738, 1731, 1735, 1734, 1729, 1712, 1475, 1455, 1467, 1486, 1729, + 1924, 1927, 1925, 1909, 1903, 1896, + 1694, 1687, 1681, 1683, 1682, 1680, 1680, 1670, 1662, 1688, 1691, 1704, + 1704, 1706, 1711, 1720, 1724, 1737, + 1698, 1690, 1685, 1686, 1686, 1683, 1683, 1672, 1665, 1686, 1691, 1701, + 1704, 1704, 1712, 1718, 1723, 1733, + 1707, 1700, 1696, 1698, 1694, 1692, 1692, 1681, 1674, 1696, 1699, 1710, + 1714, 1713, 1722, 1728, 1732, 1740, + 1700, 1693, 1690, 1691, 1688, 1685, 1684, 1672, 1667, 1686, 1690, 1700, + 1705, 1704, 1713, 1718, 1723, 1729, + 1701, 1694, 1690, 1690, 1688, 1685, 1684, 1672, 1669, 1692, 1695, 1704, + 1710, 1710, 1717, 1723, 1727, 1734, + 1704, 1696, 1693, 1693, 1691, 1688, 1686, 1673, 1672, 1695, 1699, 1707, + 1714, 1715, 1720, 1725, 1731, 1737, + 1702, 1696, 1692, 1691, 1690, 1687, 1685, 1671, 1670, 1696, 1699, 1708, + 1716, 1716, 1722, 1727, 1731, 1736, + 1701, 1696, 1693, 1691, 1689, 1687, 1684, 1673, 1670, 1687, 1690, 1694, + 1699, 1704, 1709, 1713, 1718, 1722, + 1707, 1703, 1702, 1698, 1696, 1694, 1691, 1679, 1676, 1697, 1699, 1705, + 1710, 1715, 1721, 1724, 1729, 1732, + 1714, 1711, 1710, 1707, 1705, 1703, 1699, 1687, 1685, 1692, 1693, 1699, + 1704, 1709, 1714, 1717, 1722, 1724, + 1692, 1690, 1689, 1686, 1685, 1682, 1677, 1666, 1664, 1697, 1696, 1702, + 1708, 1714, 1717, 1721, 1725, 1727, + 1710, 1708, 1706, 1703, 1702, 1699, 1694, 1686, 1683, 1703, 1701, 1707, + 1714, 1718, 1722, 1725, 1729, 1730, + 1703, 1699, 1701, 1697, 1696, 1693, 1689, 1682, 1678, 1708, 1706, 1713, + 1718, 1723, 1727, 1730, 1732, 1734, + 1700, 1697, 1698, 1695, 1693, 1690, 1688, 1680, 1676, 1708, 1706, 1713, + 1718, 1723, 1726, 1729, 1730, 1732, + 1689, 1686, 1688, 1683, 1682, 1679, 1677, 1673, 1664, 1685, 1683, 1691, + 1696, 1700, 1704, 1707, 1707, 1707, + 1695, 1694, 1695, 1691, 1689, 1686, 1684, 1679, 1673, 1702, 1700, 1708, + 1713, 1718, 1720, 1724, 1724, 1724, + 1685, 1683, 1684, 1680, 1679, 1676, 1673, 1668, 1664, 1685, 1682, 1691, + 1697, 1701, 1703, 1706, 1706, 1706, + 1680, 1678, 1679, 1676, 1673, 1670, 1669, 1664, 1661, 1688, 1687, 1695, + 1700, 1703, 1704, 1708, 1708, 1711, + 1687, 1684, 1686, 1681, 1680, 1676, 1675, 1669, 1669, 1682, 1680, 1690, + 1691, 1696, 1698, 1702, 1700, 1704, + 1674, 1671, 1672, 1668, 1665, 1663, 1662, 1656, 1655, 1677, 1675, 1686, + 1686, 1690, 1691, 1695, 1694, 1699, + 1669, 1665, 1665, 1661, 1659, 1656, 1656, 1651, 1649, 1675, 1672, 1683, + 1684, 1687, 1688, 1692, 1692, 1696, + 1525, 1522, 1525, 1521, 1517, 1514, 1515, 1512, 1510, 1528, 1525, 1533, + 1535, 1540, 1542, 1546, 1543, 1548, + 1531, 1528, 1531, 1529, 1525, 1521, 1524, 1520, 1517, 1520, 1518, 1526, + 1528, 1532, 1535, 1536, 1533, 1538, + 1521, 1517, 1520, 1517, 1514, 1510, 1514, 1510, 1507, 1525, 1524, 1533, + 1534, 1539, 1540, 1542, 1540, 1546, + 1527, 1523, 1524, 1522, 1519, 1516, 1519, 1516, 1513, 1515, 1515, 1525, + 1525, 1529, 1531, 1532, 1532, 1536, + 1518, 1514, 1515, 1512, 1509, 1508, 1510, 1507, 1504, 1515, 1516, 1526, + 1526, 1530, 1532, 1533, 1534, 1539, + 1509, 1505, 1505, 1503, 1500, 1498, 1501, 1497, 1494, 1508, 1508, 1519, + 1518, 1522, 1525, 1527, 1527, 1531, + 1510, 1505, 1506, 1503, 1500, 1499, 1502, 1498, 1495, 1505, 1505, 1516, + 1515, 1519, 1521, 1523, 1524, 1529, + 1509, 1503, 1502, 1500, 1498, 1496, 1498, 1495, 1492, 1490, 1490, 1501, + 1500, 1504, 1505, 1508, 1509, 1514, + 1494, 1488, 1487, 1484, 1482, 1480, 1484, 1479, 1477, 1493, 1494, 1504, + 1503, 1508, 1509, 1512, 1513, 1519, + 1485, 1479, 1478, 1476, 1474, 1472, 1476, 1472, 1468, 1482, 1483, 1492, + 1492, 1496, 1497, 1499, 1502, 1507, + 1469, 1462, 1462, 1460, 1459, 1456, 1462, 1456, 1453, 1481, 1481, 1490, + 1490, 1496, 1496, 1498, 1500, 1506, + 1524, 1526, 1526, 1525, 1524, 1520, 1527, 1519, 1516, 1524, 1526, 1534, + 1536, 1541, 1541, 1542, 1545, 1551, + 1400, 1515, 1512, 1512, 1512, 1507, 1508, 1503, 1501, 1527, 1532, 1544, + 1531, 1537, 1535, 1537, 1539, 1299, +#if TOUCH_KEY_NUM > 0 + 6500, 6500, 6500, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_FW_Rawdata_P[40 * 40] = { + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, +#if TOUCH_KEY_NUM > 0 + 2000, 2000, 2000, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_FW_Rawdata_N[40 * 40] = { + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, + 650, 650, 650, +#if TOUCH_KEY_NUM > 0 + 400, 400, 400, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_FW_CC_P[40 * 40] = { + 116, 113, 112, 112, 112, 114, 512, 512, 512, 512, 512, 512, 112, 110, 111, + 110, 112, 113, + 121, 113, 112, 111, 111, 111, 110, 110, 109, 111, 116, 116, 111, 112, 112, + 113, 115, 124, + 119, 112, 111, 110, 109, 109, 108, 108, 107, 108, 112, 112, 110, 110, 110, + 110, 111, 114, + 119, 113, 111, 110, 110, 110, 109, 109, 108, 110, 114, 113, 112, 112, 112, + 112, 113, 116, + 118, 112, 111, 110, 110, 109, 108, 108, 108, 108, 112, 111, 111, 110, 111, + 111, 111, 115, + 119, 112, 111, 111, 110, 110, 109, 108, 108, 109, 113, 112, 111, 111, 111, + 112, 113, 116, + 117, 111, 109, 109, 108, 108, 107, 106, 106, 108, 111, 111, 111, 110, 111, + 111, 111, 114, + 119, 113, 112, 111, 111, 110, 110, 109, 109, 109, 112, 111, 111, 111, 111, + 111, 111, 115, + 117, 112, 110, 110, 109, 109, 109, 107, 107, 110, 114, 113, 113, 112, 113, + 113, 113, 116, + 120, 114, 113, 113, 112, 112, 112, 111, 110, 113, 114, 113, 113, 112, 113, + 113, 113, 117, + 117, 111, 110, 110, 110, 109, 109, 108, 108, 115, 112, 112, 111, 111, 111, + 112, 112, 115, + 117, 112, 111, 111, 110, 110, 109, 109, 109, 115, 111, 111, 111, 110, 111, + 111, 111, 115, + 117, 112, 111, 111, 110, 110, 110, 109, 108, 117, 110, 112, 111, 110, 112, + 112, 112, 115, + 119, 114, 113, 113, 112, 112, 112, 112, 110, 121, 114, 114, 114, 114, 115, + 115, 115, 119, + 116, 111, 111, 110, 110, 110, 109, 111, 108, 117, 111, 111, 111, 111, 111, + 112, 112, 116, + 116, 112, 112, 111, 110, 110, 111, 112, 109, 119, 112, 112, 112, 112, 113, + 113, 113, 117, + 118, 113, 113, 113, 112, 112, 112, 113, 110, 117, 111, 111, 111, 111, 112, + 112, 112, 116, + 119, 114, 114, 114, 113, 112, 113, 113, 111, 119, 114, 113, 113, 113, 114, + 114, 114, 119, + 115, 111, 110, 110, 110, 110, 109, 110, 107, 115, 110, 110, 110, 110, 111, + 111, 111, 115, + 115, 111, 111, 111, 110, 110, 110, 110, 110, 117, 113, 112, 112, 111, 112, + 112, 113, 117, + 116, 112, 111, 111, 111, 111, 111, 110, 109, 117, 113, 111, 111, 111, 113, + 113, 113, 117, + 117, 114, 113, 113, 112, 113, 112, 112, 111, 118, 113, 113, 113, 113, 114, + 114, 115, 120, + 115, 112, 111, 111, 110, 111, 110, 110, 108, 117, 113, 112, 112, 112, 113, + 113, 113, 118, + 115, 112, 111, 111, 110, 111, 111, 111, 109, 116, 111, 111, 111, 112, 112, + 112, 113, 118, + 116, 113, 112, 112, 111, 112, 112, 112, 110, 115, 111, 112, 112, 112, 113, + 113, 113, 119, + 117, 114, 114, 113, 113, 113, 113, 114, 111, 115, 112, 113, 113, 114, 114, + 115, 115, 121, + 115, 112, 112, 111, 111, 112, 112, 112, 109, 112, 109, 111, 111, 111, 112, + 112, 113, 118, + 116, 113, 113, 112, 112, 112, 112, 115, 110, 113, 111, 112, 112, 113, 113, + 114, 115, 120, + 115, 113, 112, 112, 111, 112, 112, 113, 109, 112, 111, 112, 112, 112, 114, + 114, 115, 121, + 117, 114, 114, 114, 114, 114, 114, 115, 112, 113, 112, 113, 114, 114, 115, + 115, 117, 123, + 116, 113, 112, 112, 112, 112, 112, 113, 109, 110, 109, 110, 111, 112, 112, + 113, 114, 120, + 116, 113, 113, 113, 112, 113, 113, 113, 110, 112, 110, 111, 112, 113, 114, + 114, 116, 122, + 115, 113, 112, 112, 112, 112, 113, 113, 110, 111, 111, 112, 112, 113, 114, + 114, 116, 122, + 117, 114, 114, 114, 115, 114, 116, 115, 112, 114, 114, 114, 115, 116, 116, + 117, 118, 125, + 118, 112, 112, 112, 112, 112, 115, 113, 110, 111, 110, 110, 112, 113, 113, + 115, 115, 122, + 113, 112, 109, 108, 109, 108, 107, 108, 106, 108, 113, 114, 114, 114, 115, + 115, 115, 116, +#if TOUCH_KEY_NUM > 0 + 38, 38, 38, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_FW_CC_N[40 * 40] = { + 71, 69, 69, 69, 68, 70, 10, 10, 10, 10, 10, 10, 69, 68, 68, 68, 68, 69, + 74, 70, 68, 68, 68, 68, 67, 67, 67, 68, 71, 71, 68, 69, 69, 69, 71, 76, + 73, 69, 68, 67, 67, 67, 66, 66, 66, 66, 69, 69, 67, 67, 68, 68, 68, 70, + 73, 69, 68, 68, 68, 68, 67, 67, 66, 67, 70, 69, 68, 68, 69, 69, 69, 71, + 72, 69, 68, 68, 67, 67, 66, 66, 66, 66, 69, 68, 68, 68, 68, 68, 68, 70, + 73, 69, 68, 68, 67, 67, 67, 66, 66, 67, 69, 69, 68, 68, 68, 69, 69, 71, + 71, 68, 67, 67, 66, 66, 66, 65, 65, 66, 68, 68, 68, 68, 68, 68, 68, 70, + 73, 69, 68, 68, 68, 67, 67, 67, 67, 67, 69, 68, 68, 68, 68, 68, 68, 70, + 72, 68, 67, 67, 67, 67, 67, 66, 66, 68, 70, 69, 69, 69, 69, 69, 69, 71, + 73, 70, 69, 69, 69, 68, 68, 68, 68, 70, 70, 69, 69, 69, 69, 69, 70, 72, + 72, 68, 68, 68, 67, 67, 67, 66, 66, 70, 69, 68, 68, 68, 68, 69, 69, 71, + 72, 69, 68, 68, 68, 67, 67, 67, 67, 71, 68, 68, 68, 68, 68, 68, 68, 71, + 72, 69, 68, 68, 68, 67, 67, 67, 66, 71, 68, 68, 68, 68, 68, 69, 69, 71, + 73, 70, 69, 69, 69, 69, 69, 69, 68, 74, 70, 70, 70, 70, 70, 70, 71, 73, + 71, 68, 68, 68, 67, 67, 67, 68, 66, 72, 68, 68, 68, 68, 68, 69, 69, 71, + 71, 69, 68, 68, 68, 68, 68, 68, 67, 73, 69, 69, 69, 69, 69, 69, 69, 72, + 72, 69, 69, 69, 69, 69, 69, 69, 68, 72, 68, 68, 68, 68, 68, 69, 69, 71, + 73, 70, 70, 70, 69, 69, 69, 69, 68, 73, 70, 69, 69, 69, 70, 70, 70, 73, + 70, 68, 68, 67, 67, 67, 67, 67, 66, 71, 68, 67, 67, 67, 68, 68, 68, 71, + 71, 68, 68, 68, 68, 68, 67, 68, 67, 72, 69, 68, 68, 68, 69, 69, 69, 72, + 71, 69, 68, 68, 68, 68, 68, 68, 67, 72, 69, 68, 68, 68, 69, 69, 69, 72, + 72, 70, 69, 69, 69, 69, 69, 69, 68, 72, 70, 69, 69, 69, 70, 70, 70, 73, + 70, 68, 68, 68, 67, 68, 67, 67, 66, 72, 69, 69, 69, 69, 69, 69, 69, 72, + 71, 68, 68, 68, 68, 68, 68, 68, 67, 71, 68, 68, 68, 69, 69, 69, 69, 72, + 71, 69, 69, 69, 68, 69, 69, 69, 67, 71, 68, 68, 68, 69, 69, 69, 70, 73, + 72, 70, 70, 69, 69, 69, 69, 70, 68, 71, 69, 69, 69, 70, 70, 70, 70, 74, + 70, 69, 68, 68, 68, 68, 68, 69, 67, 69, 67, 68, 68, 68, 69, 69, 69, 72, + 71, 69, 69, 69, 69, 69, 69, 70, 68, 69, 68, 69, 69, 69, 69, 70, 70, 74, + 71, 69, 68, 68, 68, 68, 69, 69, 67, 69, 68, 69, 69, 69, 70, 70, 70, 74, + 72, 70, 70, 70, 70, 70, 70, 70, 68, 69, 69, 69, 70, 70, 70, 71, 72, 75, + 71, 69, 69, 69, 69, 69, 69, 69, 67, 67, 67, 67, 68, 68, 69, 69, 70, 74, + 71, 69, 69, 69, 69, 69, 69, 69, 68, 69, 68, 68, 69, 69, 70, 70, 71, 75, + 71, 69, 69, 69, 69, 69, 69, 69, 67, 68, 68, 69, 69, 69, 70, 70, 71, 75, + 72, 70, 70, 70, 70, 70, 71, 71, 69, 70, 70, 70, 70, 71, 71, 72, 72, 76, + 73, 69, 69, 69, 69, 69, 71, 69, 67, 68, 68, 68, 69, 69, 69, 70, 71, 75, + 69, 68, 67, 66, 67, 66, 66, 66, 65, 66, 69, 70, 70, 70, 70, 70, 71, 71, +#if TOUCH_KEY_NUM > 0 + 9, 9, 9, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_FW_CC_I_P[40 * 40] = { + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +#if TOUCH_KEY_NUM > 0 + 25, 25, 25, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_FW_CC_I_N[40 * 40] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +#if TOUCH_KEY_NUM > 0 + 0, 0, 0, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_FW_CC_Q_P[40 * 40] = { + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +#if TOUCH_KEY_NUM > 0 + 25, 25, 25, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_FW_CC_Q_N[40 * 40] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +#if TOUCH_KEY_NUM > 0 + 0, 0, 0, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_FW_Diff_P[40 * 40] = { + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, +#if TOUCH_KEY_NUM > 0 + 35, 35, 35, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_FW_Diff_N[40 * 40] = { + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, +#if TOUCH_KEY_NUM > 0 + -35, -35, -35, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Diff_Test_Frame = 50; + +#endif /* #if NVT_TOUCH_MP */ diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/Kconfig b/drivers/input/touchscreen/synaptics_tcm_d2t/Kconfig new file mode 100644 index 000000000000..4fdc8da19f93 --- /dev/null +++ b/drivers/input/touchscreen/synaptics_tcm_d2t/Kconfig @@ -0,0 +1,113 @@ +# +# Synaptics TCM touchscreen driver configuration +# +menuconfig TOUCHSCREEN_SYNAPTICS_TCM + bool "Synaptics TCM touchscreen" + default y + help + Say Y here if you have a Synaptics TCM touchscreen connected + to your system. + + If unsure, say N. + +if TOUCHSCREEN_SYNAPTICS_TCM + +choice + default TOUCHSCREEN_SYNAPTICS_TCM_I2C + prompt "Synaptics TCM bus module" +config TOUCHSCREEN_SYNAPTICS_TCM_I2C + bool "I2C" + depends on I2C +config TOUCHSCREEN_SYNAPTICS_TCM_SPI + bool "SPI" + depends on SPI_MASTER +endchoice + +config TOUCHSCREEN_SYNAPTICS_TCM_CORE + tristate "Synaptics TCM core module" + depends on I2C || SPI_MASTER + help + Say Y here to enable core functionality. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called synaptics_tcm_core. + +config TOUCHSCREEN_SYNAPTICS_TCM_TOUCH + tristate "Synaptics TCM touch module" + depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE + help + Say Y here to enable support for touch reporting. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called synaptics_tcm_touch. + +config TOUCHSCREEN_SYNAPTICS_TCM_DEVICE + tristate "Synaptics TCM device module" + depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE + help + Say Y here to enable support for TCM device functionality. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called synaptics_tcm_device. + +config TOUCHSCREEN_SYNAPTICS_TCM_TESTING + tristate "Synaptics TCM testing module" + depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE + help + Say Y here to enable support for testing functionality. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called synaptics_tcm_testing. + +config TOUCHSCREEN_SYNAPTICS_TCM_REFLASH + tristate "Synaptics TCM reflash module" + depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE + help + Say Y here to enable support for reflash functionality. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called synaptics_tcm_reflash. + +config TOUCHSCREEN_SYNAPTICS_TCM_RECOVERY + tristate "Synaptics TCM recovery module" + depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE + help + Say Y here to enable support for recovery functionality. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called synaptics_tcm_recovery. + +config TOUCHSCREEN_SYNAPTICS_TCM_ZEROFLASH + tristate "Synaptics TCM zeroflash module" + depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE + help + Say Y here to enable support for ZeroFlash functionality. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called synaptics_tcm_zeroflash. + +config TOUCHSCREEN_SYNAPTICS_TCM_DIAGNOSTICS + tristate "Synaptics TCM diagnostics module" + depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE + help + Say Y here to enable support for diagnostics functionality. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called synaptics_tcm_diagnostics. +endif diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/Makefile b/drivers/input/touchscreen/synaptics_tcm_d2t/Makefile new file mode 100644 index 000000000000..de2953771690 --- /dev/null +++ b/drivers/input/touchscreen/synaptics_tcm_d2t/Makefile @@ -0,0 +1,17 @@ +# +# Makefile for the Synaptics TCM touchscreen driver. +# + +# Each configuration option enables a list of files. + +obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_SPI) += synaptics_tcm_spi.o +obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_I2C) += synaptics_tcm_i2c.o +obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_CORE) += synaptics_tcm_core.o +obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_TOUCH) += synaptics_tcm_touch.o +obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_DEVICE) += synaptics_tcm_device.o +obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_TESTING) += synaptics_tcm_testing.o +obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_REFLASH) += synaptics_tcm_reflash.o +obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_RECOVERY) += synaptics_tcm_recovery.o +obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_ZEROFLASH) += synaptics_tcm_zeroflash.o +obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_DIAGNOSTICS) += synaptics_tcm_diagnostics.o +obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_DIAGNOSTICS) += synaptics_tcm_interface.o diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_core.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_core.c new file mode 100644 index 000000000000..23cbb59938ff --- /dev/null +++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_core.c @@ -0,0 +1,3878 @@ +/* + * Synaptics TCM touchscreen driver + * + * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved. + * + * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS + * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, + * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS. + * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION + * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED + * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES + * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' + * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. + * DOLLARS. + */ + +#include <linux/gpio.h> +#include <linux/kthread.h> +#include <linux/interrupt.h> +#include <linux/regulator/consumer.h> +#include <linux/pinctrl/consumer.h> +#include "synaptics_tcm_core.h" +#include <linux/uaccess.h> +#include <linux/debugfs.h> +/*#define RESET_ON_RESUME*/ +#define RESET_ON_RESUME_DELAY_MS 20 + +#define PREDICTIVE_READING + +#define MIN_READ_LENGTH 9 + +#define KEEP_DRIVER_ON_ERROR + +/*#define FORCE_RUN_APPLICATION_FIRMWARE*/ + +#define NOTIFIER_PRIORITY 2 + +#define NOTIFIER_TIMEOUT_MS 500 + +#define RESPONSE_TIMEOUT_MS 3000 + +#define APP_STATUS_POLL_TIMEOUT_MS 1000 + +#define APP_STATUS_POLL_MS 100 + +#define ENABLE_IRQ_DELAY_MS 20 + +#define FALL_BACK_ON_POLLING + +#define POLLING_DELAY_MS 5 + +#define RUN_WATCHDOG true + +#define WATCHDOG_TRIGGER_COUNT 2 + +#define WATCHDOG_DELAY_MS 1000 + +#define MODE_SWITCH_DELAY_MS 100 + +#define READ_RETRY_US_MIN 5000 + +#define READ_RETRY_US_MAX 10000 + +#define WRITE_DELAY_US_MIN 500 + +#define WRITE_DELAY_US_MAX 1000 + +#define HOST_DOWNLOAD_WAIT_MS 100 + +#define HOST_DOWNLOAD_TIMEOUT_MS 1000 + +#define DYNAMIC_CONFIG_SYSFS_DIR_NAME "dynamic_config" + +#define dynamic_config_sysfs(c_name, id) \ +static ssize_t syna_tcm_sysfs_##c_name##_show(struct device *dev, \ + struct device_attribute *attr, char *buf) \ +{ \ + int retval; \ + unsigned short value; \ + struct device *p_dev; \ + struct kobject *p_kobj; \ + struct syna_tcm_hcd *tcm_hcd; \ +\ + p_kobj = sysfs_dir->parent; \ + p_dev = container_of(p_kobj, struct device, kobj); \ + tcm_hcd = dev_get_drvdata(p_dev); \ +\ + mutex_lock(&tcm_hcd->extif_mutex); \ +\ + retval = tcm_hcd->get_dynamic_config(tcm_hcd, id, &value); \ + if (retval < 0) { \ + LOGE(tcm_hcd->pdev->dev.parent, \ + "Failed to get dynamic config\n"); \ + goto exit; \ + } \ +\ + retval = snprintf(buf, PAGE_SIZE, "%u\n", value); \ +\ +exit: \ + mutex_unlock(&tcm_hcd->extif_mutex); \ +\ + return retval; \ +} \ +\ +static ssize_t syna_tcm_sysfs_##c_name##_store(struct device *dev, \ + struct device_attribute *attr, const char *buf, size_t count) \ +{ \ + int retval; \ + unsigned int input; \ + struct device *p_dev; \ + struct kobject *p_kobj; \ + struct syna_tcm_hcd *tcm_hcd; \ +\ + p_kobj = sysfs_dir->parent; \ + p_dev = container_of(p_kobj, struct device, kobj); \ + tcm_hcd = dev_get_drvdata(p_dev); \ +\ + if (sscanf(buf, "%u", &input) != 1) \ + return -EINVAL; \ +\ + mutex_lock(&tcm_hcd->extif_mutex); \ +\ + retval = tcm_hcd->set_dynamic_config(tcm_hcd, id, input); \ + if (retval < 0) { \ + LOGE(tcm_hcd->pdev->dev.parent, \ + "Failed to set dynamic config\n"); \ + goto exit; \ + } \ +\ + retval = count; \ +\ +exit: \ + mutex_unlock(&tcm_hcd->extif_mutex); \ +\ + return retval; \ +} + +DECLARE_COMPLETION(response_complete); + +static struct kobject *sysfs_dir; +struct syna_tcm_hcd *tcm_hcd; +static struct syna_tcm_module_pool mod_pool; +extern void mdss_panel_reset_skip_enable(bool enable); +extern bool mdss_panel_is_prim(void *fbinfo); + +static void syna_tcm_resume_work(struct work_struct *work); + +SHOW_PROTOTYPE(syna_tcm, info) +STORE_PROTOTYPE(syna_tcm, irq_en) +STORE_PROTOTYPE(syna_tcm, reset) +STORE_PROTOTYPE(syna_tcm, watchdog) +SHOW_STORE_PROTOTYPE(syna_tcm, no_doze) +SHOW_STORE_PROTOTYPE(syna_tcm, disable_noise_mitigation) +SHOW_STORE_PROTOTYPE(syna_tcm, inhibit_frequency_shift) +SHOW_STORE_PROTOTYPE(syna_tcm, requested_frequency) +SHOW_STORE_PROTOTYPE(syna_tcm, disable_hsync) +SHOW_STORE_PROTOTYPE(syna_tcm, rezero_on_exit_deep_sleep) +SHOW_STORE_PROTOTYPE(syna_tcm, charger_connected) +SHOW_STORE_PROTOTYPE(syna_tcm, no_baseline_relaxation) +SHOW_STORE_PROTOTYPE(syna_tcm, in_wakeup_gesture_mode) +SHOW_STORE_PROTOTYPE(syna_tcm, stimulus_fingers) +SHOW_STORE_PROTOTYPE(syna_tcm, grip_suppression_enabled) +SHOW_STORE_PROTOTYPE(syna_tcm, enable_thick_glove) +SHOW_STORE_PROTOTYPE(syna_tcm, enable_glove) +SHOW_STORE_PROTOTYPE(syna_tcm, grip_enable) + +static struct device_attribute *attrs[] = { + ATTRIFY(info), + ATTRIFY(irq_en), + ATTRIFY(reset), + ATTRIFY(watchdog), +}; + +static struct device_attribute *dynamic_config_attrs[] = { + ATTRIFY(no_doze), + ATTRIFY(disable_noise_mitigation), + ATTRIFY(inhibit_frequency_shift), + ATTRIFY(requested_frequency), + ATTRIFY(disable_hsync), + ATTRIFY(rezero_on_exit_deep_sleep), + ATTRIFY(charger_connected), + ATTRIFY(no_baseline_relaxation), + ATTRIFY(in_wakeup_gesture_mode), + ATTRIFY(stimulus_fingers), + ATTRIFY(grip_suppression_enabled), + ATTRIFY(enable_thick_glove), + ATTRIFY(enable_glove), + ATTRIFY(grip_enable), +}; + +static ssize_t syna_tcm_sysfs_panel_color_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct syna_tcm_hcd *tcm_hcd = dev_get_drvdata(dev); + + if (tcm_hcd == NULL) + return 0; + return snprintf(buf, PAGE_SIZE, "%c\n", tcm_hcd->lockdown[2]); +} + +static ssize_t syna_tcm_sysfs_panel_vendor_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct syna_tcm_hcd *tcm_hcd = dev_get_drvdata(dev); + + if (tcm_hcd == NULL) + return 0; + return snprintf(buf, PAGE_SIZE, "%c\n", tcm_hcd->lockdown[0]); +} + +static ssize_t syna_tcm_sysfs_panel_display_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct syna_tcm_hcd *tcm_hcd = dev_get_drvdata(dev); + + if (tcm_hcd == NULL) + return 0; + return snprintf(buf, PAGE_SIZE, "%c\n", tcm_hcd->lockdown[1]); +} + +static DEVICE_ATTR(panel_color, S_IRUSR, syna_tcm_sysfs_panel_color_show, NULL); +static DEVICE_ATTR(panel_vendor, S_IRUSR, syna_tcm_sysfs_panel_vendor_show, NULL); +static DEVICE_ATTR(panel_display, S_IRUSR, syna_tcm_sysfs_panel_display_show, NULL); + +static ssize_t syna_tcm_sysfs_info_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int retval; + unsigned int count; + struct device *p_dev; + struct kobject *p_kobj; + struct syna_tcm_hcd *tcm_hcd; + + p_kobj = sysfs_dir->parent; + p_dev = container_of(p_kobj, struct device, kobj); + tcm_hcd = dev_get_drvdata(p_dev); + + mutex_lock(&tcm_hcd->extif_mutex); + + retval = tcm_hcd->identify(tcm_hcd, true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do identification\n"); + goto exit; + } + + count = 0; + + retval = snprintf(buf, PAGE_SIZE - count, + "TouchComm version: %d\n", + tcm_hcd->id_info.version); + if (retval < 0) + goto exit; + + buf += retval; + count += retval; + + if (SYNAPTICS_TCM_ID_SUBVERSION == 0) { + retval = snprintf(buf, PAGE_SIZE - count, + "Driver version: %d.%d\n", + (unsigned char)(SYNAPTICS_TCM_ID_VERSION >> 8), + (unsigned char)SYNAPTICS_TCM_ID_VERSION); + } else { + retval = snprintf(buf, PAGE_SIZE - count, + "Driver version: %d.%d.%d\n", + (unsigned char)(SYNAPTICS_TCM_ID_VERSION >> 8), + (unsigned char)SYNAPTICS_TCM_ID_VERSION, + SYNAPTICS_TCM_ID_SUBVERSION); + } + if (retval < 0) + goto exit; + + buf += retval; + count += retval; + + switch (tcm_hcd->id_info.mode) { + case MODE_APPLICATION: + retval = snprintf(buf, PAGE_SIZE - count, + "Firmware mode: Application\n"); + if (retval < 0) + goto exit; + break; + case MODE_HOST_DOWNLOAD: + retval = snprintf(buf, PAGE_SIZE - count, + "Firmware mode: Host Download\n"); + if (retval < 0) + goto exit; + break; + case MODE_BOOTLOADER: + retval = snprintf(buf, PAGE_SIZE - count, + "Firmware mode: Bootloader\n"); + if (retval < 0) + goto exit; + break; + case MODE_TDDI_BOOTLOADER: + retval = snprintf(buf, PAGE_SIZE - count, + "Firmware mode: TDDI Bootloader\n"); + if (retval < 0) + goto exit; + break; + default: + retval = snprintf(buf, PAGE_SIZE - count, + "Firmware mode: Unknown (%d)\n", + tcm_hcd->id_info.mode); + if (retval < 0) + goto exit; + break; + } + buf += retval; + count += retval; + + retval = snprintf(buf, PAGE_SIZE - count, + "Part number: "); + if (retval < 0) + goto exit; + + buf += retval; + count += retval; + + retval = secure_memcpy(buf, + PAGE_SIZE - count, + tcm_hcd->id_info.part_number, + sizeof(tcm_hcd->id_info.part_number), + sizeof(tcm_hcd->id_info.part_number)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy part number string\n"); + goto exit; + } + buf += sizeof(tcm_hcd->id_info.part_number); + count += sizeof(tcm_hcd->id_info.part_number); + + retval = snprintf(buf, PAGE_SIZE - count, + "\n"); + if (retval < 0) + goto exit; + + buf += retval; + count += retval; + + retval = snprintf(buf, PAGE_SIZE - count, + "Packrat number: %d\n", + tcm_hcd->packrat_number); + if (retval < 0) + goto exit; + + count += retval; + + retval = count; + +exit: + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t syna_tcm_sysfs_irq_en_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int retval; + unsigned int input; + struct device *p_dev; + struct kobject *p_kobj; + struct syna_tcm_hcd *tcm_hcd; + + p_kobj = sysfs_dir->parent; + p_dev = container_of(p_kobj, struct device, kobj); + tcm_hcd = dev_get_drvdata(p_dev); + + if (sscanf(buf, "%u", &input) != 1) + return -EINVAL; + + mutex_lock(&tcm_hcd->extif_mutex); + + if (input == 0) { + retval = tcm_hcd->enable_irq(tcm_hcd, false, true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to disable interrupt\n"); + goto exit; + } + } else if (input == 1) { + retval = tcm_hcd->enable_irq(tcm_hcd, true, NULL); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enable interrupt\n"); + goto exit; + } + } else { + retval = -EINVAL; + goto exit; + } + + retval = count; + +exit: + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t syna_tcm_sysfs_reset_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int retval; + bool hw_reset; + unsigned int input; + struct device *p_dev; + struct kobject *p_kobj; + struct syna_tcm_hcd *tcm_hcd; + + p_kobj = sysfs_dir->parent; + p_dev = container_of(p_kobj, struct device, kobj); + tcm_hcd = dev_get_drvdata(p_dev); + + if (sscanf(buf, "%u", &input) != 1) + return -EINVAL; + + if (input == 1) + hw_reset = false; + else if (input == 2) + hw_reset = true; + else + return -EINVAL; + + mutex_lock(&tcm_hcd->extif_mutex); + + retval = tcm_hcd->reset(tcm_hcd, hw_reset, true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reset\n"); + goto exit; + } + + retval = count; + +exit: + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t syna_tcm_sysfs_watchdog_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + unsigned int input; + struct device *p_dev; + struct kobject *p_kobj; + struct syna_tcm_hcd *tcm_hcd; + + p_kobj = sysfs_dir->parent; + p_dev = container_of(p_kobj, struct device, kobj); + tcm_hcd = dev_get_drvdata(p_dev); + + if (sscanf(buf, "%u", &input) != 1) + return -EINVAL; + + if (input != 0 && input != 1) + return -EINVAL; + + mutex_lock(&tcm_hcd->extif_mutex); + + tcm_hcd->watchdog.run = input; + tcm_hcd->update_watchdog(tcm_hcd, input); + + mutex_unlock(&tcm_hcd->extif_mutex); + + return count; +} + +dynamic_config_sysfs(no_doze, DC_NO_DOZE) + +dynamic_config_sysfs(disable_noise_mitigation, DC_DISABLE_NOISE_MITIGATION) + +dynamic_config_sysfs(inhibit_frequency_shift, DC_INHIBIT_FREQUENCY_SHIFT) + +dynamic_config_sysfs(requested_frequency, DC_REQUESTED_FREQUENCY) + +dynamic_config_sysfs(disable_hsync, DC_DISABLE_HSYNC) + +dynamic_config_sysfs(rezero_on_exit_deep_sleep, DC_REZERO_ON_EXIT_DEEP_SLEEP) + +dynamic_config_sysfs(charger_connected, DC_CHARGER_CONNECTED) + +dynamic_config_sysfs(no_baseline_relaxation, DC_NO_BASELINE_RELAXATION) + +dynamic_config_sysfs(in_wakeup_gesture_mode, DC_IN_WAKEUP_GESTURE_MODE) + +dynamic_config_sysfs(stimulus_fingers, DC_STIMULUS_FINGERS) + +dynamic_config_sysfs(grip_suppression_enabled, DC_GRIP_SUPPRESSION_ENABLED) + +dynamic_config_sysfs(enable_thick_glove, DC_ENABLE_THICK_GLOVE) + +dynamic_config_sysfs(enable_glove, DC_ENABLE_GLOVE) + +dynamic_config_sysfs(grip_enable, DC_DYNAMIC_GRIP) + +int syna_tcm_add_module(struct syna_tcm_module_cb *mod_cb, bool insert) +{ + struct syna_tcm_module_handler *mod_handler; + + if (!mod_pool.initialized) { + mutex_init(&mod_pool.mutex); + INIT_LIST_HEAD(&mod_pool.list); + mod_pool.initialized = true; + } + + mutex_lock(&mod_pool.mutex); + + if (insert) { + mod_handler = kzalloc(sizeof(*mod_handler), GFP_KERNEL); + if (!mod_handler) { + pr_err("%s: Failed to allocate memory for mod_handler\n", + __func__); + mutex_unlock(&mod_pool.mutex); + return -ENOMEM; + } + mod_handler->mod_cb = mod_cb; + mod_handler->insert = true; + mod_handler->detach = false; + list_add_tail(&mod_handler->link, &mod_pool.list); + } else if (!list_empty(&mod_pool.list)) { + list_for_each_entry(mod_handler, &mod_pool.list, link) { + if (mod_handler->mod_cb->type == mod_cb->type) { + mod_handler->insert = false; + mod_handler->detach = true; + goto exit; + } + } + } + +exit: + mutex_unlock(&mod_pool.mutex); + + if (mod_pool.queue_work) + queue_work(mod_pool.workqueue, &mod_pool.work); + + return 0; +} +EXPORT_SYMBOL(syna_tcm_add_module); + +static void syna_tcm_module_work(struct work_struct *work) +{ + struct syna_tcm_module_handler *mod_handler; + struct syna_tcm_module_handler *tmp_handler; + struct syna_tcm_hcd *tcm_hcd = mod_pool.tcm_hcd; + + mutex_lock(&mod_pool.mutex); + + if (!list_empty(&mod_pool.list)) { + list_for_each_entry_safe(mod_handler, + tmp_handler, + &mod_pool.list, + link) { + if (mod_handler->insert) { + if (mod_handler->mod_cb->init) + mod_handler->mod_cb->init(tcm_hcd); + mod_handler->insert = false; + } + if (mod_handler->detach) { + if (mod_handler->mod_cb->remove) + mod_handler->mod_cb->remove(tcm_hcd); + list_del(&mod_handler->link); + kfree(mod_handler); + } + } + } + + mutex_unlock(&mod_pool.mutex); + + return; +} + +/** + * syna_tcm_report_notifier() - notify occurrence of report received from device + * + * @data: handle of core module + * + * The occurrence of the report generated by the device is forwarded to the + * asynchronous inbox of each registered application module. + */ +static int syna_tcm_report_notifier(void *data) +{ + struct sched_param param = { .sched_priority = NOTIFIER_PRIORITY }; + struct syna_tcm_module_handler *mod_handler; + struct syna_tcm_hcd *tcm_hcd = data; + + sched_setscheduler(current, SCHED_RR, ¶m); + + set_current_state(TASK_INTERRUPTIBLE); + + while (!kthread_should_stop()) { + schedule(); + + if (kthread_should_stop()) + break; + + set_current_state(TASK_RUNNING); + + mutex_lock(&mod_pool.mutex); + + if (!list_empty(&mod_pool.list)) { + list_for_each_entry(mod_handler, &mod_pool.list, link) { + if (!mod_handler->insert && + !mod_handler->detach && + (mod_handler->mod_cb->asyncbox)) + mod_handler->mod_cb->asyncbox(tcm_hcd); + } + } + + mutex_unlock(&mod_pool.mutex); + + set_current_state(TASK_INTERRUPTIBLE); + }; + + return 0; +} + +/** + * syna_tcm_dispatch_report() - dispatch report received from device + * + * @tcm_hcd: handle of core module + * + * The report generated by the device is forwarded to the synchronous inbox of + * each registered application module for further processing. In addition, the + * report notifier thread is woken up for asynchronous notification of the + * report occurrence. + */ +static void syna_tcm_dispatch_report(struct syna_tcm_hcd *tcm_hcd) +{ + struct syna_tcm_module_handler *mod_handler; + + LOCK_BUFFER(tcm_hcd->in); + LOCK_BUFFER(tcm_hcd->report.buffer); + + tcm_hcd->report.buffer.buf = &tcm_hcd->in.buf[MESSAGE_HEADER_SIZE]; + + tcm_hcd->report.buffer.buf_size = tcm_hcd->in.buf_size; + tcm_hcd->report.buffer.buf_size -= MESSAGE_HEADER_SIZE; + + tcm_hcd->report.buffer.data_length = tcm_hcd->payload_length; + + tcm_hcd->report.id = tcm_hcd->status_report_code; + + + if (!list_empty(&mod_pool.list)) { + list_for_each_entry(mod_handler, &mod_pool.list, link) { + if (!mod_handler->insert && + !mod_handler->detach && + (mod_handler->mod_cb->syncbox)) + mod_handler->mod_cb->syncbox(tcm_hcd); + } + } + + + tcm_hcd->async_report_id = tcm_hcd->status_report_code; + + + UNLOCK_BUFFER(tcm_hcd->report.buffer); + UNLOCK_BUFFER(tcm_hcd->in); + + wake_up_process(tcm_hcd->notifier_thread); + + return; +} + +/** + * syna_tcm_dispatch_response() - dispatch response received from device + * + * @tcm_hcd: handle of core module + * + * The response to a command is forwarded to the sender of the command. + */ +static void syna_tcm_dispatch_response(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + + if (atomic_read(&tcm_hcd->command_status) != CMD_BUSY) + return; + + tcm_hcd->response_code = tcm_hcd->status_report_code; + + if (tcm_hcd->payload_length == 0) { + atomic_set(&tcm_hcd->command_status, CMD_IDLE); + goto exit; + } + + LOCK_BUFFER(tcm_hcd->resp); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &tcm_hcd->resp, + tcm_hcd->payload_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for tcm_hcd->resp.buf\n"); + UNLOCK_BUFFER(tcm_hcd->resp); + atomic_set(&tcm_hcd->command_status, CMD_ERROR); + goto exit; + } + + LOCK_BUFFER(tcm_hcd->in); + + retval = secure_memcpy(tcm_hcd->resp.buf, + tcm_hcd->resp.buf_size, + &tcm_hcd->in.buf[MESSAGE_HEADER_SIZE], + tcm_hcd->in.buf_size - MESSAGE_HEADER_SIZE, + tcm_hcd->payload_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy payload\n"); + UNLOCK_BUFFER(tcm_hcd->in); + UNLOCK_BUFFER(tcm_hcd->resp); + atomic_set(&tcm_hcd->command_status, CMD_ERROR); + goto exit; + } + + tcm_hcd->resp.data_length = tcm_hcd->payload_length; + + UNLOCK_BUFFER(tcm_hcd->in); + UNLOCK_BUFFER(tcm_hcd->resp); + + atomic_set(&tcm_hcd->command_status, CMD_IDLE); + +exit: + complete(&response_complete); + + return; +} + +/** + * syna_tcm_dispatch_message() - dispatch message received from device + * + * @tcm_hcd: handle of core module + * + * The information received in the message read in from the device is dispatched + * to the appropriate destination based on whether the information represents a + * report or a response to a command. + */ +static void syna_tcm_dispatch_message(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + unsigned char *build_id; + unsigned int payload_length; + unsigned int max_write_size; + + if (tcm_hcd->status_report_code == REPORT_IDENTIFY) { + payload_length = tcm_hcd->payload_length; + + LOCK_BUFFER(tcm_hcd->in); + + retval = secure_memcpy((unsigned char *)&tcm_hcd->id_info, + sizeof(tcm_hcd->id_info), + &tcm_hcd->in.buf[MESSAGE_HEADER_SIZE], + tcm_hcd->in.buf_size - MESSAGE_HEADER_SIZE, + MIN(sizeof(tcm_hcd->id_info), payload_length)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy identification info\n"); + UNLOCK_BUFFER(tcm_hcd->in); + return; + } + + UNLOCK_BUFFER(tcm_hcd->in); + + build_id = tcm_hcd->id_info.build_id; + tcm_hcd->packrat_number = le4_to_uint(build_id); + + max_write_size = le2_to_uint(tcm_hcd->id_info.max_write_size); + tcm_hcd->wr_chunk_size = MIN(max_write_size, WR_CHUNK_SIZE); + if (tcm_hcd->wr_chunk_size == 0) + tcm_hcd->wr_chunk_size = max_write_size; + + LOGN(tcm_hcd->pdev->dev.parent, + "Received identify report (firmware mode = 0x%02x)\n", + tcm_hcd->id_info.mode); + + if (atomic_read(&tcm_hcd->command_status) == CMD_BUSY) { + switch (tcm_hcd->command) { + case CMD_RESET: + case CMD_RUN_BOOTLOADER_FIRMWARE: + case CMD_RUN_APPLICATION_FIRMWARE: + case CMD_ENTER_PRODUCTION_TEST_MODE: + tcm_hcd->response_code = STATUS_OK; + atomic_set(&tcm_hcd->command_status, CMD_IDLE); + complete(&response_complete); + break; + default: + LOGN(tcm_hcd->pdev->dev.parent, + "Device has been reset\n"); + atomic_set(&tcm_hcd->command_status, CMD_ERROR); + complete(&response_complete); + break; + } + } + + if (tcm_hcd->id_info.mode == MODE_HOST_DOWNLOAD) { + tcm_hcd->host_download_mode = true; + return; + } + LOGE(tcm_hcd->pdev->dev.parent, + "%s:No force run applications modet\n", __func__); + +#ifdef FORCE_RUN_APPLICATION_FIRMWARE + if (tcm_hcd->id_info.mode != MODE_APPLICATION && + !mutex_is_locked(&tcm_hcd->reset_mutex)) { + if (atomic_read(&tcm_hcd->helper.task) == HELP_NONE) { + atomic_set(&tcm_hcd->helper.task, + HELP_RUN_APPLICATION_FIRMWARE); + queue_work(tcm_hcd->helper.workqueue, + &tcm_hcd->helper.work); + return; + } + } +#endif + } + + + if (tcm_hcd->status_report_code >= REPORT_IDENTIFY) + syna_tcm_dispatch_report(tcm_hcd); + else + syna_tcm_dispatch_response(tcm_hcd); + + return; +} + +/** + * syna_tcm_continued_read() - retrieve entire payload from device + * + * @tcm_hcd: handle of core module + * + * Read transactions are carried out until the entire payload is retrieved from + * the device and stored in the handle of the core module. + */ +static int syna_tcm_continued_read(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + unsigned char marker; + unsigned char code; + unsigned int idx; + unsigned int offset; + unsigned int chunks; + unsigned int chunk_space; + unsigned int xfer_length; + unsigned int total_length; + unsigned int remaining_length; + + total_length = MESSAGE_HEADER_SIZE + tcm_hcd->payload_length + 1; + + remaining_length = total_length - tcm_hcd->read_length; + + LOCK_BUFFER(tcm_hcd->in); + + retval = syna_tcm_realloc_mem(tcm_hcd, + &tcm_hcd->in, + total_length + 1); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to reallocate memory for tcm_hcd->in.buf\n"); + UNLOCK_BUFFER(tcm_hcd->in); + return retval; + } + + /* available chunk space for payload = total chunk size minus header + * marker byte and header code byte */ + if (tcm_hcd->rd_chunk_size == 0) + chunk_space = remaining_length; + else + chunk_space = tcm_hcd->rd_chunk_size - 2; + + chunks = ceil_div(remaining_length, chunk_space); + + chunks = chunks == 0 ? 1 : chunks; + + offset = tcm_hcd->read_length; + + LOCK_BUFFER(tcm_hcd->temp); + + for (idx = 0; idx < chunks; idx++) { + if (remaining_length > chunk_space) + xfer_length = chunk_space; + else + xfer_length = remaining_length; + + if (xfer_length == 1) { + tcm_hcd->in.buf[offset] = MESSAGE_PADDING; + offset += xfer_length; + remaining_length -= xfer_length; + continue; + } + + retval = syna_tcm_alloc_mem(tcm_hcd, + &tcm_hcd->temp, + xfer_length + 2); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for tcm_hcd->temp.buf\n"); + UNLOCK_BUFFER(tcm_hcd->temp); + UNLOCK_BUFFER(tcm_hcd->in); + return retval; + } + + retval = syna_tcm_read(tcm_hcd, + tcm_hcd->temp.buf, + xfer_length + 2); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read from device\n"); + UNLOCK_BUFFER(tcm_hcd->temp); + UNLOCK_BUFFER(tcm_hcd->in); + return retval; + } + + marker = tcm_hcd->temp.buf[0]; + code = tcm_hcd->temp.buf[1]; + + if (marker != MESSAGE_MARKER) { + LOGE(tcm_hcd->pdev->dev.parent, + "Incorrect header marker (0x%02x)\n", + marker); + UNLOCK_BUFFER(tcm_hcd->temp); + UNLOCK_BUFFER(tcm_hcd->in); + return -EIO; + } + + if (code != STATUS_CONTINUED_READ) { + LOGE(tcm_hcd->pdev->dev.parent, + "Incorrect header code (0x%02x)\n", + code); + UNLOCK_BUFFER(tcm_hcd->temp); + UNLOCK_BUFFER(tcm_hcd->in); + return -EIO; + } + + retval = secure_memcpy(&tcm_hcd->in.buf[offset], + tcm_hcd->in.buf_size - offset, + &tcm_hcd->temp.buf[2], + tcm_hcd->temp.buf_size - 2, + xfer_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy payload\n"); + UNLOCK_BUFFER(tcm_hcd->temp); + UNLOCK_BUFFER(tcm_hcd->in); + return retval; + } + + offset += xfer_length; + + remaining_length -= xfer_length; + } + + UNLOCK_BUFFER(tcm_hcd->temp); + UNLOCK_BUFFER(tcm_hcd->in); + + return 0; +} + +/** + * syna_tcm_raw_read() - retrieve specific number of data bytes from device + * + * @tcm_hcd: handle of core module + * @in_buf: buffer for storing data retrieved from device + * @length: number of bytes to retrieve from device + * + * Read transactions are carried out until the specific number of data bytes are + * retrieved from the device and stored in in_buf. + */ +static int syna_tcm_raw_read(struct syna_tcm_hcd *tcm_hcd, + unsigned char *in_buf, unsigned int length) +{ + int retval; + unsigned char code; + unsigned int idx; + unsigned int offset; + unsigned int chunks; + unsigned int chunk_space; + unsigned int xfer_length; + unsigned int remaining_length; + + if (length < 2) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid length information\n"); + return -EINVAL; + } + + /* minus header marker byte and header code byte */ + remaining_length = length - 2; + + /* available chunk space for data = total chunk size minus header marker + * byte and header code byte */ + if (tcm_hcd->rd_chunk_size == 0) + chunk_space = remaining_length; + else + chunk_space = tcm_hcd->rd_chunk_size - 2; + + chunks = ceil_div(remaining_length, chunk_space); + + chunks = chunks == 0 ? 1 : chunks; + + offset = 0; + + LOCK_BUFFER(tcm_hcd->temp); + + for (idx = 0; idx < chunks; idx++) { + if (remaining_length > chunk_space) + xfer_length = chunk_space; + else + xfer_length = remaining_length; + + if (xfer_length == 1) { + in_buf[offset] = MESSAGE_PADDING; + offset += xfer_length; + remaining_length -= xfer_length; + continue; + } + + retval = syna_tcm_alloc_mem(tcm_hcd, + &tcm_hcd->temp, + xfer_length + 2); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for tcm_hcd->temp.buf\n"); + UNLOCK_BUFFER(tcm_hcd->temp); + return retval; + } + + retval = syna_tcm_read(tcm_hcd, + tcm_hcd->temp.buf, + xfer_length + 2); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read from device\n"); + UNLOCK_BUFFER(tcm_hcd->temp); + return retval; + } + + code = tcm_hcd->temp.buf[1]; + + if (idx == 0) { + retval = secure_memcpy(&in_buf[0], + length, + &tcm_hcd->temp.buf[0], + tcm_hcd->temp.buf_size, + xfer_length + 2); + } else { + if (code != STATUS_CONTINUED_READ) { + LOGE(tcm_hcd->pdev->dev.parent, + "Incorrect header code (0x%02x)\n", + code); + UNLOCK_BUFFER(tcm_hcd->temp); + return -EIO; + } + + retval = secure_memcpy(&in_buf[offset], + length - offset, + &tcm_hcd->temp.buf[2], + tcm_hcd->temp.buf_size - 2, + xfer_length); + } + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy data\n"); + UNLOCK_BUFFER(tcm_hcd->temp); + return retval; + } + + if (idx == 0) + offset += (xfer_length + 2); + else + offset += xfer_length; + + remaining_length -= xfer_length; + } + + UNLOCK_BUFFER(tcm_hcd->temp); + + return 0; +} + +/** + * syna_tcm_raw_write() - write command/data to device without receiving + * response + * + * @tcm_hcd: handle of core module + * @command: command to send to device + * @data: data to send to device + * @length: length of data in bytes + * + * A command and its data, if any, are sent to the device. + */ +static int syna_tcm_raw_write(struct syna_tcm_hcd *tcm_hcd, + unsigned char command, unsigned char *data, unsigned int length) +{ + int retval; + unsigned int idx; + unsigned int chunks; + unsigned int chunk_space; + unsigned int xfer_length; + unsigned int remaining_length; + + remaining_length = length; + + /* available chunk space for data = total chunk size minus command + * byte */ + if (tcm_hcd->wr_chunk_size == 0) + chunk_space = remaining_length; + else + chunk_space = tcm_hcd->wr_chunk_size - 1; + + chunks = ceil_div(remaining_length, chunk_space); + + chunks = chunks == 0 ? 1 : chunks; + + LOCK_BUFFER(tcm_hcd->out); + + for (idx = 0; idx < chunks; idx++) { + if (remaining_length > chunk_space) + xfer_length = chunk_space; + else + xfer_length = remaining_length; + + retval = syna_tcm_alloc_mem(tcm_hcd, + &tcm_hcd->out, + xfer_length + 1); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for tcm_hcd->out.buf\n"); + UNLOCK_BUFFER(tcm_hcd->out); + return retval; + } + + if (idx == 0) + tcm_hcd->out.buf[0] = command; + else + tcm_hcd->out.buf[0] = CMD_CONTINUE_WRITE; + + if (xfer_length) { + retval = secure_memcpy(&tcm_hcd->out.buf[1], + tcm_hcd->out.buf_size - 1, + &data[idx * chunk_space], + remaining_length, + xfer_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy data\n"); + UNLOCK_BUFFER(tcm_hcd->out); + return retval; + } + } + + retval = syna_tcm_write(tcm_hcd, + tcm_hcd->out.buf, + xfer_length + 1); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write to device\n"); + UNLOCK_BUFFER(tcm_hcd->out); + return retval; + } + + remaining_length -= xfer_length; + } + + UNLOCK_BUFFER(tcm_hcd->out); + + return 0; +} + +/** + * syna_tcm_read_message() - read message from device + * + * @tcm_hcd: handle of core module + * @in_buf: buffer for storing data in raw read mode + * @length: length of data in bytes in raw read mode + * + * If in_buf is not NULL, raw read mode is used and syna_tcm_raw_read() is + * called. Otherwise, a message including its entire payload is retrieved from + * the device and dispatched to the appropriate destination. + */ +static int syna_tcm_read_message(struct syna_tcm_hcd *tcm_hcd, + unsigned char *in_buf, unsigned int length) +{ + int retval; + bool retry; + unsigned int total_length; + struct syna_tcm_message_header *header; + + mutex_lock(&tcm_hcd->rw_ctrl_mutex); + + if (in_buf != NULL) { + retval = syna_tcm_raw_read(tcm_hcd, in_buf, length); + goto exit; + } + + retry = true; + +retry: + LOCK_BUFFER(tcm_hcd->in); + + retval = syna_tcm_read(tcm_hcd, + tcm_hcd->in.buf, + tcm_hcd->read_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read from device\n"); + UNLOCK_BUFFER(tcm_hcd->in); + if (retry) { + usleep_range(READ_RETRY_US_MIN, READ_RETRY_US_MAX); + retry = false; + goto retry; + } + goto exit; + } + + header = (struct syna_tcm_message_header *)tcm_hcd->in.buf; + + if (header->marker != MESSAGE_MARKER) { + LOGE(tcm_hcd->pdev->dev.parent, + "Incorrect header marker (0x%02x)\n", + header->marker); + UNLOCK_BUFFER(tcm_hcd->in); + retval = -ENXIO; + if (retry) { + usleep_range(READ_RETRY_US_MIN, READ_RETRY_US_MAX); + retry = false; + goto retry; + } + goto exit; + } + + tcm_hcd->status_report_code = header->code; + + tcm_hcd->payload_length = le2_to_uint(header->length); + + LOGD(tcm_hcd->pdev->dev.parent, + "Header code = 0x%02x\n", + tcm_hcd->status_report_code); + + LOGD(tcm_hcd->pdev->dev.parent, + "Payload length = %d\n", + tcm_hcd->payload_length); + + if (tcm_hcd->status_report_code <= STATUS_ERROR || + tcm_hcd->status_report_code == STATUS_INVALID) { + switch (tcm_hcd->status_report_code) { + case STATUS_OK: + break; + case STATUS_CONTINUED_READ: + LOGD(tcm_hcd->pdev->dev.parent, + "Out-of-sync continued read\n"); + case STATUS_IDLE: + case STATUS_BUSY: + tcm_hcd->payload_length = 0; + UNLOCK_BUFFER(tcm_hcd->in); + retval = 0; + goto exit; + default: + LOGE(tcm_hcd->pdev->dev.parent, + "Incorrect header code (0x%02x)\n", + tcm_hcd->status_report_code); + if (tcm_hcd->status_report_code == STATUS_INVALID) { + if (retry) { + usleep_range(READ_RETRY_US_MIN, + READ_RETRY_US_MAX); + retry = false; + goto retry; + } else { + tcm_hcd->payload_length = 0; + } + } + } + } + + total_length = MESSAGE_HEADER_SIZE + tcm_hcd->payload_length + 1; + +#ifdef PREDICTIVE_READING + if (total_length <= tcm_hcd->read_length) { + goto check_padding; + } else if (total_length - 1 == tcm_hcd->read_length) { + tcm_hcd->in.buf[total_length - 1] = MESSAGE_PADDING; + goto check_padding; + } +#else + if (tcm_hcd->payload_length == 0) { + tcm_hcd->in.buf[total_length - 1] = MESSAGE_PADDING; + goto check_padding; + } +#endif + + UNLOCK_BUFFER(tcm_hcd->in); + + retval = syna_tcm_continued_read(tcm_hcd); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do continued read\n"); + goto exit; + }; + + LOCK_BUFFER(tcm_hcd->in); + + tcm_hcd->in.buf[0] = MESSAGE_MARKER; + tcm_hcd->in.buf[1] = tcm_hcd->status_report_code; + tcm_hcd->in.buf[2] = (unsigned char)tcm_hcd->payload_length; + tcm_hcd->in.buf[3] = (unsigned char)(tcm_hcd->payload_length >> 8); + +check_padding: + if (tcm_hcd->in.buf[total_length - 1] != MESSAGE_PADDING) { + LOGE(tcm_hcd->pdev->dev.parent, + "Incorrect message padding byte (0x%02x)\n", + tcm_hcd->in.buf[total_length - 1]); + UNLOCK_BUFFER(tcm_hcd->in); + retval = -EIO; + goto exit; + } + + UNLOCK_BUFFER(tcm_hcd->in); + +#ifdef PREDICTIVE_READING + total_length = MAX(total_length, MIN_READ_LENGTH); + tcm_hcd->read_length = MIN(total_length, tcm_hcd->rd_chunk_size); + if (tcm_hcd->rd_chunk_size == 0) + tcm_hcd->read_length = total_length; +#endif + + syna_tcm_dispatch_message(tcm_hcd); + + retval = 0; + +exit: + if (retval < 0) { + if (atomic_read(&tcm_hcd->command_status) == CMD_BUSY) { + atomic_set(&tcm_hcd->command_status, CMD_ERROR); + complete(&response_complete); + } + } + + mutex_unlock(&tcm_hcd->rw_ctrl_mutex); + + return retval; +} + +/** + * syna_tcm_write_message() - write message to device and receive response + * + * @tcm_hcd: handle of core module + * @command: command to send to device + * @payload: payload of command + * @length: length of payload in bytes + * @resp_buf: buffer for storing command response + * @resp_buf_size: size of response buffer in bytes + * @resp_length: length of command response in bytes + * @response_code: status code returned in command response + * @polling_delay_ms: delay time after sending command before resuming polling + * + * If resp_buf is NULL, raw write mode is used and syna_tcm_raw_write() is + * called. Otherwise, a command and its payload, if any, are sent to the device + * and the response to the command generated by the device is read in. + */ +static int syna_tcm_write_message(struct syna_tcm_hcd *tcm_hcd, + unsigned char command, unsigned char *payload, + unsigned int length, unsigned char **resp_buf, + unsigned int *resp_buf_size, unsigned int *resp_length, + unsigned char *response_code, unsigned int polling_delay_ms) +{ + int retval; + unsigned int idx; + unsigned int chunks; + unsigned int chunk_space; + unsigned int xfer_length; + unsigned int remaining_length; + unsigned int command_status; + + if (response_code != NULL) + *response_code = STATUS_INVALID; + + if (!tcm_hcd->do_polling && current->pid == tcm_hcd->isr_pid) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid execution context\n"); + return -EINVAL; + } + + mutex_lock(&tcm_hcd->command_mutex); + + mutex_lock(&tcm_hcd->rw_ctrl_mutex); + + if (resp_buf == NULL) { + retval = syna_tcm_raw_write(tcm_hcd, command, payload, length); + mutex_unlock(&tcm_hcd->rw_ctrl_mutex); + goto exit; + } + + if (tcm_hcd->do_polling && polling_delay_ms) { + cancel_delayed_work_sync(&tcm_hcd->polling_work); + flush_workqueue(tcm_hcd->polling_workqueue); + } + + atomic_set(&tcm_hcd->command_status, CMD_BUSY); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)) + reinit_completion(&response_complete); +#else + INIT_COMPLETION(response_complete); +#endif + + tcm_hcd->command = command; + + LOCK_BUFFER(tcm_hcd->resp); + + tcm_hcd->resp.buf = *resp_buf; + tcm_hcd->resp.buf_size = *resp_buf_size; + tcm_hcd->resp.data_length = 0; + + UNLOCK_BUFFER(tcm_hcd->resp); + + /* adding two length bytes as part of payload */ + remaining_length = length + 2; + + /* available chunk space for payload = total chunk size minus command + * byte */ + if (tcm_hcd->wr_chunk_size == 0) + chunk_space = remaining_length; + else + chunk_space = tcm_hcd->wr_chunk_size - 1; + + chunks = ceil_div(remaining_length, chunk_space); + + chunks = chunks == 0 ? 1 : chunks; + + LOGD(tcm_hcd->pdev->dev.parent, + "Command = 0x%02x\n", + command); + + LOCK_BUFFER(tcm_hcd->out); + + for (idx = 0; idx < chunks; idx++) { + if (remaining_length > chunk_space) + xfer_length = chunk_space; + else + xfer_length = remaining_length; + + retval = syna_tcm_alloc_mem(tcm_hcd, + &tcm_hcd->out, + xfer_length + 1); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for tcm_hcd->out.buf\n"); + UNLOCK_BUFFER(tcm_hcd->out); + mutex_unlock(&tcm_hcd->rw_ctrl_mutex); + goto exit; + } + + if (idx == 0) { + tcm_hcd->out.buf[0] = command; + tcm_hcd->out.buf[1] = (unsigned char)length; + tcm_hcd->out.buf[2] = (unsigned char)(length >> 8); + + if (xfer_length > 2) { + retval = secure_memcpy(&tcm_hcd->out.buf[3], + tcm_hcd->out.buf_size - 3, + payload, + remaining_length - 2, + xfer_length - 2); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy payload\n"); + UNLOCK_BUFFER(tcm_hcd->out); + mutex_unlock(&tcm_hcd->rw_ctrl_mutex); + goto exit; + } + } + } else { + tcm_hcd->out.buf[0] = CMD_CONTINUE_WRITE; + + retval = secure_memcpy(&tcm_hcd->out.buf[1], + tcm_hcd->out.buf_size - 1, + &payload[idx * chunk_space - 2], + remaining_length, + xfer_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy payload\n"); + UNLOCK_BUFFER(tcm_hcd->out); + mutex_unlock(&tcm_hcd->rw_ctrl_mutex); + goto exit; + } + } + + retval = syna_tcm_write(tcm_hcd, + tcm_hcd->out.buf, + xfer_length + 1); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write to device\n"); + UNLOCK_BUFFER(tcm_hcd->out); + mutex_unlock(&tcm_hcd->rw_ctrl_mutex); + goto exit; + } + + remaining_length -= xfer_length; + + if (chunks > 1) + usleep_range(WRITE_DELAY_US_MIN, WRITE_DELAY_US_MAX); + } + + UNLOCK_BUFFER(tcm_hcd->out); + + mutex_unlock(&tcm_hcd->rw_ctrl_mutex); + + if (tcm_hcd->do_polling && polling_delay_ms) { + queue_delayed_work(tcm_hcd->polling_workqueue, + &tcm_hcd->polling_work, + msecs_to_jiffies(polling_delay_ms)); + } + + retval = wait_for_completion_timeout(&response_complete, + msecs_to_jiffies(RESPONSE_TIMEOUT_MS)); + if (retval == 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Timed out waiting for response (command 0x%02x)\n", + tcm_hcd->command); + retval = -EIO; + goto exit; + } + + command_status = atomic_read(&tcm_hcd->command_status); + if (command_status != CMD_IDLE) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get valid response (command 0x%02x)\n", + tcm_hcd->command); + retval = -EIO; + goto exit; + } + + LOCK_BUFFER(tcm_hcd->resp); + + if (tcm_hcd->response_code != STATUS_OK) { + if (tcm_hcd->resp.data_length) { + LOGE(tcm_hcd->pdev->dev.parent, + "Error code = 0x%02x (command 0x%02x)\n", + tcm_hcd->resp.buf[0], tcm_hcd->command); + } + retval = -EIO; + } else { + retval = 0; + } + + *resp_buf = tcm_hcd->resp.buf; + *resp_buf_size = tcm_hcd->resp.buf_size; + *resp_length = tcm_hcd->resp.data_length; + + if (response_code != NULL) + *response_code = tcm_hcd->response_code; + + UNLOCK_BUFFER(tcm_hcd->resp); + +exit: + tcm_hcd->command = CMD_NONE; + + atomic_set(&tcm_hcd->command_status, CMD_IDLE); + + mutex_unlock(&tcm_hcd->command_mutex); + + return retval; +} + +static int syna_tcm_wait_hdl(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + + msleep(HOST_DOWNLOAD_WAIT_MS); + + if (!atomic_read(&tcm_hcd->host_downloading)) + return 0; + + retval = wait_event_interruptible_timeout(tcm_hcd->hdl_wq, + !atomic_read(&tcm_hcd->host_downloading), + msecs_to_jiffies(HOST_DOWNLOAD_TIMEOUT_MS)); + if (retval == 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Timed out waiting for completion of host download\n"); + atomic_set(&tcm_hcd->host_downloading, 0); + retval = -EIO; + } else { + retval = 0; + } + + return retval; +} + +static void syna_tcm_check_hdl(struct syna_tcm_hcd *tcm_hcd) +{ + struct syna_tcm_module_handler *mod_handler; + + LOCK_BUFFER(tcm_hcd->report.buffer); + + tcm_hcd->report.buffer.buf = NULL; + tcm_hcd->report.buffer.buf_size = 0; + tcm_hcd->report.buffer.data_length = 0; + tcm_hcd->report.id = REPORT_HDL; + + UNLOCK_BUFFER(tcm_hcd->report.buffer); + + mutex_lock(&mod_pool.mutex); + + if (!list_empty(&mod_pool.list)) { + list_for_each_entry(mod_handler, &mod_pool.list, link) { + if (!mod_handler->insert && + !mod_handler->detach && + (mod_handler->mod_cb->syncbox)) + mod_handler->mod_cb->syncbox(tcm_hcd); + } + } + + mutex_unlock(&mod_pool.mutex); + + return; +} + +static void syna_tcm_update_watchdog(struct syna_tcm_hcd *tcm_hcd, bool en) +{ + cancel_delayed_work_sync(&tcm_hcd->watchdog.work); + flush_workqueue(tcm_hcd->watchdog.workqueue); + + if (!tcm_hcd->watchdog.run) { + tcm_hcd->watchdog.count = 0; + return; + } + + if (en) { + queue_delayed_work(tcm_hcd->watchdog.workqueue, + &tcm_hcd->watchdog.work, + msecs_to_jiffies(WATCHDOG_DELAY_MS)); + } else { + tcm_hcd->watchdog.count = 0; + } + + return; +} + +static void syna_tcm_watchdog_work(struct work_struct *work) +{ + int retval; + unsigned char marker; + struct delayed_work *delayed_work = + container_of(work, struct delayed_work, work); + struct syna_tcm_watchdog *watchdog = + container_of(delayed_work, struct syna_tcm_watchdog, + work); + struct syna_tcm_hcd *tcm_hcd = + container_of(watchdog, struct syna_tcm_hcd, watchdog); + + if (mutex_is_locked(&tcm_hcd->rw_ctrl_mutex)) + goto exit; + + mutex_lock(&tcm_hcd->rw_ctrl_mutex); + + retval = syna_tcm_read(tcm_hcd, + &marker, + 1); + + mutex_unlock(&tcm_hcd->rw_ctrl_mutex); + + if (retval < 0 || marker != MESSAGE_MARKER) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read from device\n"); + + tcm_hcd->watchdog.count++; + + if (tcm_hcd->watchdog.count >= WATCHDOG_TRIGGER_COUNT) { + retval = tcm_hcd->reset(tcm_hcd, true, false); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reset\n"); + } + tcm_hcd->watchdog.count = 0; + } + } + +exit: + queue_delayed_work(tcm_hcd->watchdog.workqueue, + &tcm_hcd->watchdog.work, + msecs_to_jiffies(WATCHDOG_DELAY_MS)); + + return; +} + +static void syna_tcm_polling_work(struct work_struct *work) +{ + int retval; + struct delayed_work *delayed_work = + container_of(work, struct delayed_work, work); + struct syna_tcm_hcd *tcm_hcd = + container_of(delayed_work, struct syna_tcm_hcd, + polling_work); + + if (!tcm_hcd->do_polling) + return; + + retval = tcm_hcd->read_message(tcm_hcd, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read message\n"); + if (retval == -ENXIO && tcm_hcd->hw_if->bus_io->type == BUS_SPI) + syna_tcm_check_hdl(tcm_hcd); + } + + if (!(tcm_hcd->in_suspend && retval < 0)) { + queue_delayed_work(tcm_hcd->polling_workqueue, + &tcm_hcd->polling_work, + msecs_to_jiffies(POLLING_DELAY_MS)); + } + + return; +} + +static irqreturn_t syna_tcm_isr(int irq, void *data) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = data; + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + if (unlikely(gpio_get_value(bdata->irq_gpio) != bdata->irq_on_state)) + goto exit; + + tcm_hcd->isr_pid = current->pid; + + retval = tcm_hcd->read_message(tcm_hcd, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read message\n"); + if (retval == -ENXIO && tcm_hcd->hw_if->bus_io->type == BUS_SPI) + syna_tcm_check_hdl(tcm_hcd); + } + +exit: + return IRQ_HANDLED; +} + +static int syna_tcm_enable_irq(struct syna_tcm_hcd *tcm_hcd, bool en, bool ns) +{ + int retval; + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + static bool irq_freed = true; + + mutex_lock(&tcm_hcd->irq_en_mutex); + + if (en) { + if (tcm_hcd->irq_enabled) { + LOGD(tcm_hcd->pdev->dev.parent, + "Interrupt already enabled\n"); + retval = 0; + goto exit; + } + + if (bdata->irq_gpio < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid IRQ GPIO\n"); + retval = -EINVAL; + goto queue_polling_work; + } + + if (irq_freed) { + retval = request_threaded_irq(tcm_hcd->irq, NULL, + syna_tcm_isr, bdata->irq_flags, + PLATFORM_DRIVER_NAME, tcm_hcd); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create interrupt thread\n"); + } + } else { + enable_irq(tcm_hcd->irq); + retval = 0; + } + +queue_polling_work: + if (retval < 0) { +#ifdef FALL_BACK_ON_POLLING + queue_delayed_work(tcm_hcd->polling_workqueue, + &tcm_hcd->polling_work, + msecs_to_jiffies(POLLING_DELAY_MS)); + tcm_hcd->do_polling = true; + retval = 0; +#endif + } + + if (retval < 0) + goto exit; + else + msleep(ENABLE_IRQ_DELAY_MS); + } else { + if (!tcm_hcd->irq_enabled) { + LOGD(tcm_hcd->pdev->dev.parent, + "Interrupt already disabled\n"); + retval = 0; + goto exit; + } + + if (bdata->irq_gpio >= 0) { + if (ns) { + disable_irq_nosync(tcm_hcd->irq); + } else { + disable_irq(tcm_hcd->irq); + free_irq(tcm_hcd->irq, tcm_hcd); + } + irq_freed = !ns; + } + + if (ns) { + cancel_delayed_work(&tcm_hcd->polling_work); + } else { + cancel_delayed_work_sync(&tcm_hcd->polling_work); + flush_workqueue(tcm_hcd->polling_workqueue); + } + + tcm_hcd->do_polling = false; + } + + retval = 0; + +exit: + if (retval == 0) + tcm_hcd->irq_enabled = en; + + mutex_unlock(&tcm_hcd->irq_en_mutex); + + return retval; +} + +static int syna_tcm_set_gpio(struct syna_tcm_hcd *tcm_hcd, int gpio, + bool config, int dir, int state) +{ + int retval; + char label[16]; + + if (config) { + retval = snprintf(label, 16, "tcm_gpio_%d\n", gpio); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to set GPIO label\n"); + return retval; + } + + retval = gpio_request(gpio, label); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to request GPIO %d\n", + gpio); + return retval; + } + + if (dir == 0) + retval = gpio_direction_input(gpio); + else + retval = gpio_direction_output(gpio, state); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to set GPIO %d direction\n", + gpio); + return retval; + } + } else { + gpio_free(gpio); + } + + return 0; +} + +static int syna_tcm_config_gpio(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + if (bdata->irq_gpio >= 0) { + retval = syna_tcm_set_gpio(tcm_hcd, bdata->irq_gpio, + true, 0, 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to configure interrupt GPIO\n"); + goto err_set_gpio_irq; + } + } + + if (bdata->power_gpio >= 0) { + retval = syna_tcm_set_gpio(tcm_hcd, bdata->power_gpio, + true, 1, !bdata->power_on_state); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to configure power GPIO\n"); + goto err_set_gpio_power; + } + } + + if (bdata->reset_gpio >= 0) { + retval = syna_tcm_set_gpio(tcm_hcd, bdata->reset_gpio, + true, 1, !bdata->reset_on_state); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to configure reset GPIO\n"); + goto err_set_gpio_reset; + } + } + + if (bdata->power_gpio >= 0) { + gpio_set_value(bdata->power_gpio, bdata->power_on_state); + msleep(bdata->power_delay_ms); + } + + if (bdata->reset_gpio >= 0) { + gpio_set_value(bdata->reset_gpio, bdata->reset_on_state); + msleep(bdata->reset_active_ms); + gpio_set_value(bdata->reset_gpio, !bdata->reset_on_state); + msleep(bdata->reset_delay_ms); + } + + return 0; + +err_set_gpio_reset: + if (bdata->power_gpio >= 0) + syna_tcm_set_gpio(tcm_hcd, bdata->power_gpio, false, 0, 0); + +err_set_gpio_power: + if (bdata->irq_gpio >= 0) + syna_tcm_set_gpio(tcm_hcd, bdata->irq_gpio, false, 0, 0); + +err_set_gpio_irq: + return retval; +} + +static int syna_tcm_enable_regulator(struct syna_tcm_hcd *tcm_hcd, bool en) +{ + int retval; + + if (!en) { + retval = 0; + goto disable_ibb_reg; + } + + if (tcm_hcd->bus_reg) { + retval = regulator_enable(tcm_hcd->bus_reg); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enable bus regulator\n"); + goto exit; + } + } + + if (tcm_hcd->lab_reg) { + retval = regulator_enable(tcm_hcd->lab_reg); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enable lab regulator\n"); + goto disable_bus_reg; + } + } + + if (tcm_hcd->ibb_reg) { + retval = regulator_enable(tcm_hcd->ibb_reg); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enable ibb regulator\n"); + goto disable_lab_reg; + } + } + + return 0; + +disable_ibb_reg: + if (tcm_hcd->ibb_reg) + regulator_disable(tcm_hcd->ibb_reg); + +disable_lab_reg: + if (tcm_hcd->lab_reg) + regulator_disable(tcm_hcd->lab_reg); + +disable_bus_reg: + if (tcm_hcd->bus_reg) + regulator_disable(tcm_hcd->bus_reg); + +exit: + return retval; +} + +static int syna_tcm_get_regulator(struct syna_tcm_hcd *tcm_hcd, bool get) +{ + int retval; + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + if (!get) { + retval = 0; + goto regulator_put; + } + + if (bdata->bus_reg_name != NULL && *bdata->bus_reg_name != 0) { + tcm_hcd->bus_reg = regulator_get(tcm_hcd->pdev->dev.parent, + bdata->bus_reg_name); + if (IS_ERR(tcm_hcd->bus_reg)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get bus regulator\n"); + retval = PTR_ERR(tcm_hcd->bus_reg); + goto regulator_put; + } + } + + if (bdata->i2c_reg_name != NULL && *bdata->i2c_reg_name != 0) { + tcm_hcd->i2c_reg = regulator_get(tcm_hcd->pdev->dev.parent, + bdata->i2c_reg_name); + if (IS_ERR(tcm_hcd->i2c_reg)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get bus regulator\n"); + retval = PTR_ERR(tcm_hcd->i2c_reg); + goto regulator_put; + } + } + + if (bdata->pwr_reg_name != NULL && *bdata->pwr_reg_name != 0) { + tcm_hcd->pwr_reg = regulator_get(tcm_hcd->pdev->dev.parent, + bdata->pwr_reg_name); + if (IS_ERR(tcm_hcd->pwr_reg)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get power regulator\n"); + retval = PTR_ERR(tcm_hcd->pwr_reg); + goto regulator_put; + } + } + + if (bdata->lab_reg_name != NULL && *bdata->lab_reg_name != 0) { + tcm_hcd->lab_reg = regulator_get(tcm_hcd->pdev->dev.parent, + bdata->lab_reg_name); + if (IS_ERR(tcm_hcd->lab_reg)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get lab regulator\n"); + retval = PTR_ERR(tcm_hcd->lab_reg); + goto regulator_put; + } + } + + if (bdata->ibb_reg_name != NULL && *bdata->ibb_reg_name != 0) { + tcm_hcd->ibb_reg = regulator_get(tcm_hcd->pdev->dev.parent, + bdata->ibb_reg_name); + if (IS_ERR(tcm_hcd->ibb_reg)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get ibb regulator\n"); + retval = PTR_ERR(tcm_hcd->ibb_reg); + goto regulator_put; + } + } + + return 0; + +regulator_put: + if (tcm_hcd->bus_reg) { + regulator_put(tcm_hcd->bus_reg); + tcm_hcd->bus_reg = NULL; + } + + if (tcm_hcd->i2c_reg) { + regulator_put(tcm_hcd->i2c_reg); + tcm_hcd->i2c_reg = NULL; + } + + if (tcm_hcd->pwr_reg) { + regulator_put(tcm_hcd->pwr_reg); + tcm_hcd->pwr_reg = NULL; + } + + if (tcm_hcd->lab_reg) { + regulator_put(tcm_hcd->lab_reg); + tcm_hcd->lab_reg = NULL; + } + + if (tcm_hcd->ibb_reg) { + regulator_put(tcm_hcd->ibb_reg); + tcm_hcd->ibb_reg = NULL; + } + + return retval; +} + +static int syna_tcm_get_app_info(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + unsigned char *resp_buf; + unsigned int resp_buf_size; + unsigned int resp_length; + unsigned int timeout; + + timeout = APP_STATUS_POLL_TIMEOUT_MS; + + resp_buf = NULL; + resp_buf_size = 0; + +get_app_info: + retval = tcm_hcd->write_message(tcm_hcd, + CMD_GET_APPLICATION_INFO, + NULL, + 0, + &resp_buf, + &resp_buf_size, + &resp_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_GET_APPLICATION_INFO)); + goto exit; + } + + retval = secure_memcpy((unsigned char *)&tcm_hcd->app_info, + sizeof(tcm_hcd->app_info), + resp_buf, + resp_buf_size, + MIN(sizeof(tcm_hcd->app_info), resp_length)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy application info\n"); + goto exit; + } + + tcm_hcd->app_status = le2_to_uint(tcm_hcd->app_info.status); + + if (tcm_hcd->app_status == APP_STATUS_BOOTING || + tcm_hcd->app_status == APP_STATUS_UPDATING) { + if (timeout > 0) { + msleep(APP_STATUS_POLL_MS); + timeout -= APP_STATUS_POLL_MS; + goto get_app_info; + } + } + + retval = 0; + +exit: + kfree(resp_buf); + + return retval; +} + +static int syna_tcm_get_boot_info(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + unsigned char *resp_buf; + unsigned int resp_buf_size; + unsigned int resp_length; + + resp_buf = NULL; + resp_buf_size = 0; + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_GET_BOOT_INFO, + NULL, + 0, + &resp_buf, + &resp_buf_size, + &resp_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_GET_BOOT_INFO)); + goto exit; + } + + retval = secure_memcpy((unsigned char *)&tcm_hcd->boot_info, + sizeof(tcm_hcd->boot_info), + resp_buf, + resp_buf_size, + MIN(sizeof(tcm_hcd->boot_info), resp_length)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy boot info\n"); + goto exit; + } + + retval = 0; + +exit: + kfree(resp_buf); + + return retval; +} + +static int syna_tcm_identify(struct syna_tcm_hcd *tcm_hcd, bool id) +{ + int retval; + unsigned char *resp_buf; + unsigned int resp_buf_size; + unsigned int resp_length; + unsigned int max_write_size; + + resp_buf = NULL; + resp_buf_size = 0; + + mutex_lock(&tcm_hcd->identify_mutex); + + if (!id) + goto get_info; + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_IDENTIFY, + NULL, + 0, + &resp_buf, + &resp_buf_size, + &resp_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_IDENTIFY)); + goto exit; + } + + retval = secure_memcpy((unsigned char *)&tcm_hcd->id_info, + sizeof(tcm_hcd->id_info), + resp_buf, + resp_buf_size, + MIN(sizeof(tcm_hcd->id_info), resp_length)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy identification info\n"); + goto exit; + } + + tcm_hcd->packrat_number = le4_to_uint(tcm_hcd->id_info.build_id); + + max_write_size = le2_to_uint(tcm_hcd->id_info.max_write_size); + tcm_hcd->wr_chunk_size = MIN(max_write_size, WR_CHUNK_SIZE); + if (tcm_hcd->wr_chunk_size == 0) + tcm_hcd->wr_chunk_size = max_write_size; + +get_info: + switch (tcm_hcd->id_info.mode) { + case MODE_APPLICATION: + retval = syna_tcm_get_app_info(tcm_hcd); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get application info\n"); + goto exit; + } + break; + case MODE_BOOTLOADER: + case MODE_TDDI_BOOTLOADER: + retval = syna_tcm_get_boot_info(tcm_hcd); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get boot info\n"); + goto exit; + } + break; + default: + break; + } + + retval = 0; + +exit: + mutex_unlock(&tcm_hcd->identify_mutex); + + kfree(resp_buf); + + return retval; +} + +static int syna_tcm_run_production_test_firmware(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + bool retry; + unsigned char *resp_buf; + unsigned int resp_buf_size; + unsigned int resp_length; + + retry = true; + + resp_buf = NULL; + resp_buf_size = 0; + +retry: + retval = tcm_hcd->write_message(tcm_hcd, + CMD_ENTER_PRODUCTION_TEST_MODE, + NULL, + 0, + &resp_buf, + &resp_buf_size, + &resp_length, + NULL, + MODE_SWITCH_DELAY_MS); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_ENTER_PRODUCTION_TEST_MODE)); + goto exit; + } + + if (tcm_hcd->id_info.mode != MODE_PRODUCTION_TEST) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run production test firmware\n"); + if (retry) { + retry = false; + goto retry; + } + retval = -EINVAL; + goto exit; + } else if (tcm_hcd->app_status != APP_STATUS_OK) { + LOGE(tcm_hcd->pdev->dev.parent, + "Application status = 0x%02x\n", + tcm_hcd->app_status); + } + + retval = 0; + +exit: + kfree(resp_buf); + + return retval; +} + +static int syna_tcm_run_application_firmware(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + bool retry; + unsigned char *resp_buf; + unsigned int resp_buf_size; + unsigned int resp_length; + + retry = true; + + resp_buf = NULL; + resp_buf_size = 0; + +retry: + retval = tcm_hcd->write_message(tcm_hcd, + CMD_RUN_APPLICATION_FIRMWARE, + NULL, + 0, + &resp_buf, + &resp_buf_size, + &resp_length, + NULL, + MODE_SWITCH_DELAY_MS); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_RUN_APPLICATION_FIRMWARE)); + goto exit; + } + + retval = tcm_hcd->identify(tcm_hcd, false); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do identification\n"); + goto exit; + } + + if (tcm_hcd->id_info.mode != MODE_APPLICATION) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run application firmware (boot status = 0x%02x)\n", + tcm_hcd->boot_info.status); + if (retry) { + retry = false; + goto retry; + } + retval = -EINVAL; + goto exit; + } else if (tcm_hcd->app_status != APP_STATUS_OK) { + LOGE(tcm_hcd->pdev->dev.parent, + "Application status = 0x%02x\n", + tcm_hcd->app_status); + } + + retval = 0; + +exit: + kfree(resp_buf); + + return retval; +} + +static int syna_tcm_run_bootloader_firmware(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + unsigned char *resp_buf; + unsigned int resp_buf_size; + unsigned int resp_length; + + resp_buf = NULL; + resp_buf_size = 0; + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_RUN_BOOTLOADER_FIRMWARE, + NULL, + 0, + &resp_buf, + &resp_buf_size, + &resp_length, + NULL, + MODE_SWITCH_DELAY_MS); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_RUN_BOOTLOADER_FIRMWARE)); + goto exit; + } + + retval = tcm_hcd->identify(tcm_hcd, false); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do identification\n"); + goto exit; + } + + if (tcm_hcd->id_info.mode == MODE_APPLICATION) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enter bootloader mode\n"); + retval = -EINVAL; + goto exit; + } + + retval = 0; + +exit: + kfree(resp_buf); + + return retval; +} + +static int syna_tcm_switch_mode(struct syna_tcm_hcd *tcm_hcd, + enum firmware_mode mode) +{ + int retval; + + mutex_lock(&tcm_hcd->reset_mutex); + + tcm_hcd->update_watchdog(tcm_hcd, false); + + switch (mode) { + case FW_MODE_BOOTLOADER: + retval = syna_tcm_run_bootloader_firmware(tcm_hcd); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to switch to bootloader mode\n"); + goto exit; + } + break; + case FW_MODE_APPLICATION: + retval = syna_tcm_run_application_firmware(tcm_hcd); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to switch to application mode\n"); + goto exit; + } + break; + case FW_MODE_PRODUCTION_TEST: + retval = syna_tcm_run_production_test_firmware(tcm_hcd); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to switch to production test mode\n"); + goto exit; + } + break; + default: + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid firmware mode\n"); + retval = -EINVAL; + goto exit; + } + + retval = 0; + +exit: + tcm_hcd->update_watchdog(tcm_hcd, true); + + mutex_unlock(&tcm_hcd->reset_mutex); + + return retval; +} + +static int syna_tcm_get_dynamic_config(struct syna_tcm_hcd *tcm_hcd, + enum dynamic_config_id id, unsigned short *value) +{ + int retval; + unsigned char out_buf; + unsigned char *resp_buf; + unsigned int resp_buf_size; + unsigned int resp_length; + + resp_buf = NULL; + resp_buf_size = 0; + + out_buf = (unsigned char)id; + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_GET_DYNAMIC_CONFIG, + &out_buf, + sizeof(out_buf), + &resp_buf, + &resp_buf_size, + &resp_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_GET_DYNAMIC_CONFIG)); + goto exit; + } + + if (resp_length < 2) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid data length\n"); + retval = -EINVAL; + goto exit; + } + + *value = (unsigned short)le2_to_uint(resp_buf); + + retval = 0; + +exit: + kfree(resp_buf); + + return retval; +} + +static int syna_tcm_set_dynamic_config(struct syna_tcm_hcd *tcm_hcd, + enum dynamic_config_id id, unsigned short value) +{ + int retval; + unsigned char out_buf[3]; + unsigned char *resp_buf; + unsigned int resp_buf_size; + unsigned int resp_length; + + resp_buf = NULL; + resp_buf_size = 0; + + out_buf[0] = (unsigned char)id; + out_buf[1] = (unsigned char)value; + out_buf[2] = (unsigned char)(value >> 8); + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_SET_DYNAMIC_CONFIG, + out_buf, + sizeof(out_buf), + &resp_buf, + &resp_buf_size, + &resp_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_SET_DYNAMIC_CONFIG)); + goto exit; + } + + retval = 0; + +exit: + kfree(resp_buf); + + return retval; +} + +static int syna_tcm_get_data_location(struct syna_tcm_hcd *tcm_hcd, + enum flash_area area, unsigned int *addr, unsigned int *length) +{ + int retval; + unsigned char out_buf; + unsigned char *resp_buf; + unsigned int resp_buf_size; + unsigned int resp_length; + + switch (area) { + case CUSTOM_LCM: + out_buf = LCM_DATA; + break; + case CUSTOM_OEM: + out_buf = OEM_DATA; + break; + case PPDT: + out_buf = PPDT_DATA; + break; + default: + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid flash area\n"); + return -EINVAL; + } + + resp_buf = NULL; + resp_buf_size = 0; + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_GET_DATA_LOCATION, + &out_buf, + sizeof(out_buf), + &resp_buf, + &resp_buf_size, + &resp_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_GET_DATA_LOCATION)); + goto exit; + } + + if (resp_length != 4) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid data length\n"); + retval = -EINVAL; + goto exit; + } + + *addr = le2_to_uint(&resp_buf[0]); + *length = le2_to_uint(&resp_buf[2]); + + retval = 0; + +exit: + kfree(resp_buf); + + return retval; +} + +static int syna_tcm_sleep(struct syna_tcm_hcd *tcm_hcd, bool en) +{ + int retval; + unsigned char command; + unsigned char *resp_buf; + unsigned int resp_buf_size; + unsigned int resp_length; + + command = en ? CMD_ENTER_DEEP_SLEEP : CMD_EXIT_DEEP_SLEEP; + + resp_buf = NULL; + resp_buf_size = 0; + + retval = tcm_hcd->write_message(tcm_hcd, + command, + NULL, + 0, + &resp_buf, + &resp_buf_size, + &resp_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + en ? + STR(CMD_ENTER_DEEP_SLEEP) : + STR(CMD_EXIT_DEEP_SLEEP)); + goto exit; + } + + retval = 0; + +exit: + kfree(resp_buf); + + return retval; +} + +static int syna_tcm_reset(struct syna_tcm_hcd *tcm_hcd, bool hw, bool update_wd) +{ + int retval; + unsigned char *resp_buf; + unsigned int resp_buf_size; + unsigned int resp_length; + struct syna_tcm_module_handler *mod_handler; + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + resp_buf = NULL; + resp_buf_size = 0; + + mutex_lock(&tcm_hcd->reset_mutex); + + if (update_wd) + tcm_hcd->update_watchdog(tcm_hcd, false); + + if (hw) { + if (bdata->reset_gpio < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Hardware reset unavailable\n"); + retval = -EINVAL; + goto exit; + } + gpio_set_value(bdata->reset_gpio, bdata->reset_on_state); + msleep(bdata->reset_active_ms); + gpio_set_value(bdata->reset_gpio, !bdata->reset_on_state); + } else { + + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_RESET, + NULL, + 0, + &resp_buf, + &resp_buf_size, + &resp_length, + NULL, + bdata->reset_delay_ms); + + if (retval < 0 && !tcm_hcd->host_download_mode) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_RESET)); + goto exit; + } + } + + if (tcm_hcd->host_download_mode) { + mutex_unlock(&tcm_hcd->reset_mutex); + kfree(resp_buf); + retval = syna_tcm_wait_hdl(tcm_hcd); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to wait for completion of host download\n"); + return retval; + } + if (update_wd) + tcm_hcd->update_watchdog(tcm_hcd, true); + return 0; + } + + msleep(bdata->reset_delay_ms); + + retval = tcm_hcd->identify(tcm_hcd, false); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do identification\n"); + goto exit; + } + + if (tcm_hcd->id_info.mode == MODE_APPLICATION) + goto get_features; + LOGE(tcm_hcd->pdev->dev.parent, + "%s: Write command CMD_RUN_APPLICATION_FIRMWARE", + __func__); + retval = tcm_hcd->write_message(tcm_hcd, + CMD_RUN_APPLICATION_FIRMWARE, + NULL, + 0, + &resp_buf, + &resp_buf_size, + &resp_length, + NULL, + MODE_SWITCH_DELAY_MS); + if (retval < 0) { + LOGN(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_RUN_APPLICATION_FIRMWARE)); + } + + retval = tcm_hcd->identify(tcm_hcd, false); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do identification\n"); + goto exit; + } + +get_features: + LOGN(tcm_hcd->pdev->dev.parent, + "Firmware mode = 0x%02x\n", + tcm_hcd->id_info.mode); + + if (tcm_hcd->id_info.mode != MODE_APPLICATION) { + LOGN(tcm_hcd->pdev->dev.parent, + "Boot status = 0x%02x\n", + tcm_hcd->boot_info.status); + } else if (tcm_hcd->app_status != APP_STATUS_OK) { + LOGN(tcm_hcd->pdev->dev.parent, + "Application status = 0x%02x\n", + tcm_hcd->app_status); + } + + if (tcm_hcd->id_info.mode != MODE_APPLICATION) + goto dispatch_reset; + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_GET_FEATURES, + NULL, + 0, + &resp_buf, + &resp_buf_size, + &resp_length, + NULL, + 0); + if (retval < 0) { + LOGN(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_GET_FEATURES)); + } else { + retval = secure_memcpy((unsigned char *)&tcm_hcd->features, + sizeof(tcm_hcd->features), + resp_buf, + resp_buf_size, + MIN(sizeof(tcm_hcd->features), resp_length)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy feature description\n"); + } + } + +dispatch_reset: + mutex_lock(&mod_pool.mutex); + + if (!list_empty(&mod_pool.list)) { + list_for_each_entry(mod_handler, &mod_pool.list, link) { + if (!mod_handler->insert && + !mod_handler->detach && + (mod_handler->mod_cb->reset)) + mod_handler->mod_cb->reset(tcm_hcd); + } + } + + mutex_unlock(&mod_pool.mutex); + + retval = 0; + +exit: + if (update_wd) + tcm_hcd->update_watchdog(tcm_hcd, true); + + mutex_unlock(&tcm_hcd->reset_mutex); + + kfree(resp_buf); + + return retval; +} + +static int syna_tcm_rezero(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + unsigned char *resp_buf; + unsigned int resp_buf_size; + unsigned int resp_length; + + resp_buf = NULL; + resp_buf_size = 0; + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_REZERO, + NULL, + 0, + &resp_buf, + &resp_buf_size, + &resp_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_REZERO)); + goto exit; + } + + retval = 0; + +exit: + kfree(resp_buf); + + return retval; +} + +static void syna_tcm_helper_work(struct work_struct *work) +{ + int retval; + unsigned char task; + struct syna_tcm_module_handler *mod_handler; + struct syna_tcm_helper *helper = + container_of(work, struct syna_tcm_helper, work); + struct syna_tcm_hcd *tcm_hcd = + container_of(helper, struct syna_tcm_hcd, helper); + + task = atomic_read(&helper->task); + + switch (task) { + case HELP_RUN_APPLICATION_FIRMWARE: + mutex_lock(&tcm_hcd->reset_mutex); + tcm_hcd->update_watchdog(tcm_hcd, false); + retval = syna_tcm_run_application_firmware(tcm_hcd); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to switch to application mode\n"); + } + tcm_hcd->update_watchdog(tcm_hcd, true); + mutex_unlock(&tcm_hcd->reset_mutex); + break; + case HELP_SEND_RESET_NOTIFICATION: + mutex_lock(&tcm_hcd->reset_mutex); + retval = tcm_hcd->identify(tcm_hcd, true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do identification\n"); + mutex_unlock(&tcm_hcd->reset_mutex); + break; + } + mutex_lock(&mod_pool.mutex); + if (!list_empty(&mod_pool.list)) { + list_for_each_entry(mod_handler, &mod_pool.list, link) { + if (!mod_handler->insert && + !mod_handler->detach && + (mod_handler->mod_cb->reset)) + mod_handler->mod_cb->reset(tcm_hcd); + } + } + mutex_unlock(&mod_pool.mutex); + mutex_unlock(&tcm_hcd->reset_mutex); + break; + default: + break; + } + + atomic_set(&helper->task, HELP_NONE); + + return; +} + +#if defined(CONFIG_PM) || defined(CONFIG_FB) +static int syna_tcm_resume(struct device *dev) +{ + int retval; + struct syna_tcm_module_handler *mod_handler; + struct syna_tcm_hcd *tcm_hcd = dev_get_drvdata(dev); + if (!tcm_hcd->in_suspend) + return 0; + tcm_hcd->enable_irq(tcm_hcd, true, NULL); + + if (tcm_hcd->host_download_mode) { + retval = syna_tcm_wait_hdl(tcm_hcd); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to wait for completion of host download\n"); + goto exit; + } + } + + tcm_hcd->update_watchdog(tcm_hcd, true); +#ifdef RESET_ON_RESUME + msleep(RESET_ON_RESUME_DELAY_MS); + + goto do_reset; +#endif + if (tcm_hcd->id_info.mode != MODE_APPLICATION || + tcm_hcd->app_status != APP_STATUS_OK) { + LOGN(tcm_hcd->pdev->dev.parent, + "Application firmware not running\n"); + goto do_reset; + } + + retval = tcm_hcd->sleep(tcm_hcd, false); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to exit deep sleep\n"); + goto exit; + } + + retval = syna_tcm_rezero(tcm_hcd); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to rezero\n"); + goto exit; + } + + goto mod_resume; + +do_reset: + + retval = tcm_hcd->reset(tcm_hcd, false, true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reset\n"); + goto exit; + } + if (tcm_hcd->id_info.mode != MODE_APPLICATION || + tcm_hcd->app_status != APP_STATUS_OK) { + LOGN(tcm_hcd->pdev->dev.parent, + "Application firmware not running\n"); + retval = 0; + goto exit; + } + +mod_resume: + mutex_lock(&mod_pool.mutex); + + if (!list_empty(&mod_pool.list)) { + list_for_each_entry(mod_handler, &mod_pool.list, link) { + if (!mod_handler->insert && + !mod_handler->detach && + (mod_handler->mod_cb->resume)) + mod_handler->mod_cb->resume(tcm_hcd); + } + } + + mutex_unlock(&mod_pool.mutex); + + retval = 0; + +exit: + tcm_hcd->in_suspend = false; + + return retval; +} + +static int syna_tcm_suspend(struct device *dev) +{ + struct syna_tcm_module_handler *mod_handler; + struct syna_tcm_hcd *tcm_hcd = dev_get_drvdata(dev); + + if (tcm_hcd->in_suspend) + return 0; + mutex_lock(&mod_pool.mutex); + + if (!list_empty(&mod_pool.list)) { + list_for_each_entry(mod_handler, &mod_pool.list, link) { + if (!mod_handler->insert && + !mod_handler->detach && + (mod_handler->mod_cb->suspend)) + mod_handler->mod_cb->suspend(tcm_hcd); + } + } + + mutex_unlock(&mod_pool.mutex); + + tcm_hcd->in_suspend = true; + + return 0; +} +#endif + +#ifdef CONFIG_FB + +static int syna_tcm_early_suspend(struct device *dev) +{ +#ifndef WAKEUP_GESTURE + int retval; +#endif + + struct syna_tcm_module_handler *mod_handler; + struct syna_tcm_hcd *tcm_hcd = dev_get_drvdata(dev); + + if (tcm_hcd->in_suspend) + return 0; + + tcm_hcd->update_watchdog(tcm_hcd, false); + + if (tcm_hcd->id_info.mode != MODE_APPLICATION || + tcm_hcd->app_status != APP_STATUS_OK) { + LOGN(tcm_hcd->pdev->dev.parent, + "Application firmware not running\n"); + return 0; + } + +#ifndef WAKEUP_GESTURE + if (!tcm_hcd->gesture_enabled) { + retval = tcm_hcd->sleep(tcm_hcd, true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enter deep sleep\n"); + return retval; + } + } +#endif + + mutex_lock(&mod_pool.mutex); + + if (!list_empty(&mod_pool.list)) { + list_for_each_entry(mod_handler, &mod_pool.list, link) { + if (!mod_handler->insert && + !mod_handler->detach && + (mod_handler->mod_cb->early_suspend)) + mod_handler->mod_cb->early_suspend(tcm_hcd); + } + } + + mutex_unlock(&mod_pool.mutex); + + return 0; +} + +/* + * add struct tpdbg_operations + */ +static void tpdbg_suspend(struct syna_tcm_hcd *tcm_hcd, bool enable) +{ + LOGE(tcm_hcd->pdev->dev.parent, "syna tp switch state"); + if (enable) { + syna_tcm_early_suspend(&tcm_hcd->pdev->dev); + syna_tcm_suspend(&tcm_hcd->pdev->dev); + } else + syna_tcm_resume(&tcm_hcd->pdev->dev); +} +static int tpdbg_open(struct inode *inode, struct file *file) +{ + file->private_data = inode->i_private; + return 0; +} +static ssize_t tpdbg_read(struct file *file, char __user *buf, + size_t size, loff_t *ppos) +{ + const char *str = "cmd support as below:\n \ + \necho \"irq-disable\" or \"irq-enable\" to ctrl irq\n \ + \necho \"tp-sd-en\" of \"tp-sd-off\" to in or off sleep mode\n \ + \necho \"tp-suspend-en\" or \"tp-suspend-off\" to in or off suspend \n"; + loff_t pos = *ppos; + int len = strlen(str); + + if (pos < 0) + return -EINVAL; + + if (pos >= len) + return 0; + + if (copy_to_user(buf, str, len)) + return -EFAULT; + + *ppos = pos + len; + return len; +} +static ssize_t tpdbg_write(struct file *file, const char __user *buf, + size_t size, loff_t *ppos) +{ + char *cmd = kzalloc(size + 1, GFP_KERNEL); + int ret = size; + + if (!cmd) + return -ENOMEM; + + if (copy_from_user(cmd, buf, size)) { + ret = -EFAULT; + goto out; + } + + cmd[size] = '\0'; + + if (!strncmp(cmd, "irq-disable", 11)) + disable_irq(tcm_hcd->irq); + else if (!strncmp(cmd, "irq-enable", 10)) + enable_irq(tcm_hcd->irq); + else if (!strncmp(cmd, "tp-sd-en", 8)) + tpdbg_suspend(tcm_hcd, true); + else if (!strncmp(cmd, "tp-sd-off", 9)) + tpdbg_suspend(tcm_hcd, false); + else if (!strncmp(cmd, "tp-suspend-en", 13)) + tpdbg_suspend(tcm_hcd, true); + else if (!strncmp(cmd, "tp-suspend-off", 14)) + tpdbg_suspend(tcm_hcd, false); + +out: + kfree(cmd); + return ret; +} +static int tpdbg_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + return 0; +} +static const struct file_operations tpdbg_operations = { + .owner = THIS_MODULE, + .open = tpdbg_open, + .read = tpdbg_read, + .write = tpdbg_write, + .release = tpdbg_release, +}; + + +static void syna_tcm_resume_work(struct work_struct *work) +{ + struct syna_tcm_hcd *tcm_hcd = container_of(work, struct syna_tcm_hcd, resume_work); + int retval; + if (tcm_hcd->reflash_okay) { + if (tcm_hcd->ts_pinctrl) { + retval = pinctrl_select_state(tcm_hcd->ts_pinctrl, + tcm_hcd->pinctrl_state_active); + if (retval < 0) + LOGE(tcm_hcd->pdev->dev.parent, + "%s: Failed to select %s pinstate\n", + __func__, PINCTRL_STATE_ACTIVE); + else + LOGE(tcm_hcd->pdev->dev.parent, + "%s:select %s pinstate\n", + __func__, PINCTRL_STATE_ACTIVE); + } + if (tcm_hcd->in_suspend) + syna_tcm_resume(&tcm_hcd->pdev->dev); + } +} + +static int syna_tcm_fb_notifier_cb(struct notifier_block *nb, + unsigned long action, void *data) +{ + int retval = 0; + int *transition; + struct fb_event *evdata = data; + struct syna_tcm_hcd *tcm_hcd = + container_of(nb, struct syna_tcm_hcd, fb_notifier); + + + if (evdata && evdata->data && tcm_hcd && mdss_panel_is_prim(evdata->info)) { + transition = evdata->data; + flush_workqueue(tcm_hcd->event_wq); + if (action == FB_EARLY_EVENT_BLANK) { + if (*transition == FB_BLANK_POWERDOWN) { + retval = syna_tcm_early_suspend(&tcm_hcd->pdev->dev); +#ifdef WAKEUP_GESTURE + if (!tcm_hcd->gesture_enabled) + tcm_hcd->enable_irq(tcm_hcd, false, true); + if (tcm_hcd->gesture_enabled) { + syna_tcm_enable_regulator(tcm_hcd, true); + mdss_panel_reset_skip_enable(true); + tcm_hcd->gesture_enabled_when_resume = true; + tcm_hcd->gesture_disabled_when_resume = false; + } + } else if (*transition == FB_BLANK_UNBLANK) { + if ((tcm_hcd->gesture_enabled || !tcm_hcd->gesture_disabled_when_resume) + && tcm_hcd->gesture_enabled_when_resume && tcm_hcd->reflash_okay) + retval = syna_tcm_resume(&tcm_hcd->pdev->dev); + } +#endif + } else if (action == FB_EVENT_BLANK) { + if (*transition == FB_BLANK_POWERDOWN) { +#ifdef WAKEUP_GESTURE + /* need delay 4 frams after 28 10 cmd*/ + if (tcm_hcd->gesture_enabled) + msleep(32); +#endif + retval = syna_tcm_suspend(&tcm_hcd->pdev->dev); + if (!tcm_hcd->gesture_enabled && tcm_hcd->ts_pinctrl) { + retval = pinctrl_select_state(tcm_hcd->ts_pinctrl, + tcm_hcd->pinctrl_state_suspend); + if (retval < 0) + LOGE(tcm_hcd->pdev->dev.parent, + "%s: Failed to select %s pinstate\n", + __func__, PINCTRL_STATE_SUSPEND); + else + LOGE(tcm_hcd->pdev->dev.parent, + "%s:select %s pinstate\n", + __func__, PINCTRL_STATE_SUSPEND); + } + tcm_hcd->fb_ready = 0; + } else if (*transition == FB_BLANK_UNBLANK) { + if (!(tcm_hcd->gesture_enabled || !tcm_hcd->gesture_disabled_when_resume) + || !tcm_hcd->gesture_enabled_when_resume) + queue_work(tcm_hcd->event_wq, &tcm_hcd->resume_work); +#ifdef WAKEUP_GESTURE + if ((tcm_hcd->gesture_enabled || !tcm_hcd->gesture_disabled_when_resume) + && tcm_hcd->gesture_enabled_when_resume) { + mdss_panel_reset_skip_enable(false); + syna_tcm_enable_regulator(tcm_hcd, false); + tcm_hcd->gesture_enabled_when_resume = false; + tcm_hcd->gesture_disabled_when_resume = true; + } +#endif + tcm_hcd->fb_ready++; + } + } + } + + return 0; +} +#endif + +static int syna_tcm_pinctrl_init(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + + /* Get pinctrl if target uses pinctrl */ + tcm_hcd->ts_pinctrl = devm_pinctrl_get((tcm_hcd->pdev->dev.parent)); + if (IS_ERR_OR_NULL(tcm_hcd->ts_pinctrl)) { + retval = PTR_ERR(tcm_hcd->ts_pinctrl); + dev_dbg(tcm_hcd->pdev->dev.parent, + "Target does not use pinctrl %d\n", retval); + goto err_pinctrl_get; + } + + tcm_hcd->pinctrl_state_active + = pinctrl_lookup_state(tcm_hcd->ts_pinctrl, PINCTRL_STATE_ACTIVE); + if (IS_ERR_OR_NULL(tcm_hcd->pinctrl_state_active)) { + retval = PTR_ERR(tcm_hcd->pinctrl_state_active); + dev_err(tcm_hcd->pdev->dev.parent, + "Can not lookup %s pinstate %d\n", + PINCTRL_STATE_ACTIVE, retval); + goto err_pinctrl_lookup; + } + + tcm_hcd->pinctrl_state_suspend + = pinctrl_lookup_state(tcm_hcd->ts_pinctrl, PINCTRL_STATE_SUSPEND); + if (IS_ERR_OR_NULL(tcm_hcd->pinctrl_state_suspend)) { + retval = PTR_ERR(tcm_hcd->pinctrl_state_suspend); + dev_dbg(tcm_hcd->pdev->dev.parent, + "Can not lookup %s pinstate %d\n", + PINCTRL_STATE_SUSPEND, retval); + goto err_pinctrl_lookup; + } + + return 0; + +err_pinctrl_lookup: + devm_pinctrl_put(tcm_hcd->ts_pinctrl); +err_pinctrl_get: + tcm_hcd->ts_pinctrl = NULL; + return retval; +} + +static int grip_area_open(struct inode *inode, struct file *file) +{ + file->private_data = inode->i_private; + return 0; +} + +static ssize_t grip_area_write(struct file *file, const char __user *buf, size_t size, loff_t *ppos) +{ + char *cmd = kzalloc(size + 1, GFP_KERNEL); + int ret = -EIO; + int input = 0; + char tmp[2]; + char result[2]; + + if (!tcm_hcd || !cmd) + return ret; + + if (tcm_hcd->in_suspend) { + dev_err(tcm_hcd->pdev->dev.parent, "tp is suspended, no need to set\n"); + return ret; + } + + if (copy_from_user(cmd, buf, size)) { + goto out; + } + + cmd[size] = '\0'; + tmp[1] = '\0'; + result[1] = '\0'; + if (sscanf(cmd, "%d", &input) != 1) + goto out; + if (input == 90 || input == 270) + tmp[0] = '1'; + else + tmp[0] = '0'; + + ret = syna_tcm_sysfs_grip_enable_store(NULL, NULL, tmp, 2); + ret = syna_tcm_sysfs_grip_enable_show(NULL, NULL, result); + if (strncmp(tmp, result, 1)) { + dev_err(tcm_hcd->pdev->dev.parent, "error grip area set:%s, actuly:%s\n", tmp, result); + ret = -EIO; + } else { + dev_info(tcm_hcd->pdev->dev.parent, "grip area set:%s\n", tmp); + ret = size; + } +out: + kfree(cmd); + cmd = NULL; + return ret; +} + +static int grip_area_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + return 0; +} + +static const struct file_operations grip_area_operations = { + .owner = THIS_MODULE, + .open = grip_area_open, + .write = grip_area_write, + .release = grip_area_release, +}; + +static int syna_tcm_probe(struct platform_device *pdev) +{ + int retval; + int idx; + const struct syna_tcm_board_data *bdata; + const struct syna_tcm_hw_interface *hw_if; + + hw_if = pdev->dev.platform_data; + if (!hw_if) { + LOGE(&pdev->dev, + "Hardware interface not found\n"); + return -ENODEV; + } + + bdata = hw_if->bdata; + if (!bdata) { + LOGE(&pdev->dev, + "Board data not found\n"); + return -ENODEV; + } + + tcm_hcd = kzalloc(sizeof(*tcm_hcd), GFP_KERNEL); + if (!tcm_hcd) { + LOGE(&pdev->dev, + "Failed to allocate memory for tcm_hcd\n"); + return -ENOMEM; + } + + platform_set_drvdata(pdev, tcm_hcd); + + tcm_hcd->pdev = pdev; + tcm_hcd->hw_if = hw_if; + tcm_hcd->reset = syna_tcm_reset; + tcm_hcd->sleep = syna_tcm_sleep; + tcm_hcd->identify = syna_tcm_identify; + tcm_hcd->enable_irq = syna_tcm_enable_irq; + tcm_hcd->switch_mode = syna_tcm_switch_mode; + tcm_hcd->read_message = syna_tcm_read_message; + tcm_hcd->write_message = syna_tcm_write_message; + tcm_hcd->get_dynamic_config = syna_tcm_get_dynamic_config; + tcm_hcd->set_dynamic_config = syna_tcm_set_dynamic_config; + tcm_hcd->get_data_location = syna_tcm_get_data_location; + tcm_hcd->rd_chunk_size = RD_CHUNK_SIZE; + tcm_hcd->wr_chunk_size = WR_CHUNK_SIZE; + tcm_hcd->reflash_okay = false; +#ifdef PREDICTIVE_READING + tcm_hcd->read_length = MIN_READ_LENGTH; +#else + tcm_hcd->read_length = MESSAGE_HEADER_SIZE; +#endif + + tcm_hcd->watchdog.run = RUN_WATCHDOG; + tcm_hcd->update_watchdog = syna_tcm_update_watchdog; + + if (bdata->irq_gpio >= 0) + tcm_hcd->irq = gpio_to_irq(bdata->irq_gpio); + else + tcm_hcd->irq = bdata->irq_gpio; + LOGE(tcm_hcd->pdev->dev.parent, + "%s: Synaptics tp driver probe startsss\n", __func__); + mutex_init(&tcm_hcd->extif_mutex); + mutex_init(&tcm_hcd->reset_mutex); + mutex_init(&tcm_hcd->irq_en_mutex); + mutex_init(&tcm_hcd->io_ctrl_mutex); + mutex_init(&tcm_hcd->rw_ctrl_mutex); + mutex_init(&tcm_hcd->command_mutex); + mutex_init(&tcm_hcd->identify_mutex); + + INIT_BUFFER(tcm_hcd->in, false); + INIT_BUFFER(tcm_hcd->out, false); + INIT_BUFFER(tcm_hcd->resp, true); + INIT_BUFFER(tcm_hcd->temp, false); + INIT_BUFFER(tcm_hcd->config, false); + INIT_BUFFER(tcm_hcd->report.buffer, true); + + LOCK_BUFFER(tcm_hcd->in); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &tcm_hcd->in, + tcm_hcd->read_length + 1); + if (retval < 0) { + LOGE(&pdev->dev, + "Failed to allocate memory for tcm_hcd->in.buf\n"); + UNLOCK_BUFFER(tcm_hcd->in); + goto err_alloc_mem; + } + + UNLOCK_BUFFER(tcm_hcd->in); + + atomic_set(&tcm_hcd->command_status, CMD_IDLE); + + atomic_set(&tcm_hcd->helper.task, HELP_NONE); + + device_init_wakeup(&pdev->dev, 1); + + init_waitqueue_head(&tcm_hcd->hdl_wq); + + if (!mod_pool.initialized) { + mutex_init(&mod_pool.mutex); + INIT_LIST_HEAD(&mod_pool.list); + mod_pool.initialized = true; + } + + retval = syna_tcm_get_regulator(tcm_hcd, true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get regulators\n"); + goto err_get_regulator; + } +/* + retval = syna_tcm_enable_regulator(tcm_hcd, true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enable regulators\n"); + goto err_enable_regulator; + } +*/ + if (tcm_hcd->i2c_reg) { + retval = regulator_enable(tcm_hcd->i2c_reg); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enable i2c regulator\n"); + } + } + retval = syna_tcm_pinctrl_init(tcm_hcd); + + if (!retval && tcm_hcd->ts_pinctrl) { + retval = pinctrl_select_state(tcm_hcd->ts_pinctrl, + tcm_hcd->pinctrl_state_active); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "%s: Failed to select %s pinstate %d\n", + __func__, PINCTRL_STATE_ACTIVE, retval); + goto err_pinctrl_init; + } + } + retval = syna_tcm_config_gpio(tcm_hcd); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to configure GPIO's\n"); + goto err_config_gpio; + } + + sysfs_dir = kobject_create_and_add(PLATFORM_DRIVER_NAME, + &pdev->dev.kobj); + if (!sysfs_dir) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create sysfs directory\n"); + retval = -EINVAL; + goto err_sysfs_create_dir; + } + + tcm_hcd->sysfs_dir = sysfs_dir; + + for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) { + retval = sysfs_create_file(tcm_hcd->sysfs_dir, + &(*attrs[idx]).attr); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create sysfs file\n"); + goto err_sysfs_create_file; + } + } + + tcm_hcd->dynamnic_config_sysfs_dir = + kobject_create_and_add(DYNAMIC_CONFIG_SYSFS_DIR_NAME, + tcm_hcd->sysfs_dir); + if (!tcm_hcd->dynamnic_config_sysfs_dir) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create dynamic config sysfs directory\n"); + retval = -EINVAL; + goto err_sysfs_create_dynamic_config_dir; + } + + for (idx = 0; idx < ARRAY_SIZE(dynamic_config_attrs); idx++) { + retval = sysfs_create_file(tcm_hcd->dynamnic_config_sysfs_dir, + &(*dynamic_config_attrs[idx]).attr); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create dynamic config sysfs file\n"); + goto err_sysfs_create_dynamic_config_file; + } + } +#ifdef CONFIG_FB + tcm_hcd->fb_notifier.notifier_call = syna_tcm_fb_notifier_cb; + retval = fb_register_client(&tcm_hcd->fb_notifier); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to register FB notifier client\n"); + } +#endif + + tcm_hcd->notifier_thread = kthread_run(syna_tcm_report_notifier, + tcm_hcd, "syna_tcm_report_notifier"); + if (IS_ERR(tcm_hcd->notifier_thread)) { + retval = PTR_ERR(tcm_hcd->notifier_thread); + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create and run tcm_hcd->notifier_thread\n"); + goto err_create_run_kthread; + } + tcm_hcd->event_wq = alloc_workqueue("syna-tcm-event-queue", + WQ_UNBOUND | WQ_HIGHPRI | WQ_CPU_INTENSIVE, 1); + if (!tcm_hcd->event_wq) { + LOGE(tcm_hcd->pdev->dev.parent, "ERROR:Cannot create work thread\n"); + goto err_create_event_wq; + } + INIT_WORK(&tcm_hcd->resume_work, syna_tcm_resume_work); + tcm_hcd->helper.workqueue = + create_singlethread_workqueue("syna_tcm_helper"); + INIT_WORK(&tcm_hcd->helper.work, syna_tcm_helper_work); + + tcm_hcd->watchdog.workqueue = + create_singlethread_workqueue("syna_tcm_watchdog"); + INIT_DELAYED_WORK(&tcm_hcd->watchdog.work, syna_tcm_watchdog_work); + + tcm_hcd->polling_workqueue = + create_singlethread_workqueue("syna_tcm_polling"); + INIT_DELAYED_WORK(&tcm_hcd->polling_work, syna_tcm_polling_work); + + retval = tcm_hcd->enable_irq(tcm_hcd, true, NULL); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enable interrupt\n"); + goto err_enable_irq; + } +#if 0 + retval = tcm_hcd->reset(tcm_hcd, false, false); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reset\n"); + tcm_hcd->init_okay = false; + tcm_hcd->watchdog.run = false; + tcm_hcd->update_watchdog(tcm_hcd, false); + tcm_hcd->enable_irq(tcm_hcd, false, false); +#ifndef KEEP_DRIVER_ON_ERROR + goto err_reset; +#endif + } else { + tcm_hcd->init_okay = true; + tcm_hcd->update_watchdog(tcm_hcd, true); + } +#endif + retval = sysfs_create_file(&pdev->dev.parent->kobj, &dev_attr_panel_color.attr); + + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "%s: Failed to create panel color attributes\n", __func__); + } + retval = sysfs_create_file(&pdev->dev.parent->kobj, &dev_attr_panel_vendor.attr); + + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "%s: Failed to create panel color attributes\n", __func__); + } + retval = sysfs_create_file(&pdev->dev.parent->kobj, &dev_attr_panel_display.attr); + + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "%s: Failed to create panel color attributes\n", __func__); + } + dev_set_drvdata(pdev->dev.parent, tcm_hcd); + + mod_pool.workqueue = + create_singlethread_workqueue("syna_tcm_module"); + INIT_WORK(&mod_pool.work, syna_tcm_module_work); + mod_pool.tcm_hcd = tcm_hcd; + mod_pool.queue_work = true; + queue_work(mod_pool.workqueue, &mod_pool.work); + /* add syna_tp_debug interface for power dissipation + */ + tcm_hcd->debugfs = debugfs_create_dir("tp_debug", NULL); + if (tcm_hcd->debugfs) { + debugfs_create_file("switch_state", 0660, + tcm_hcd->debugfs, tcm_hcd, &tpdbg_operations); + debugfs_create_file("grip_area", 0660, tcm_hcd->debugfs, tcm_hcd, &grip_area_operations); + } + return 0; +#if 0 +#ifndef KEEP_DRIVER_ON_ERROR +err_reset: +#endif +#endif +err_enable_irq: + cancel_delayed_work_sync(&tcm_hcd->polling_work); + flush_workqueue(tcm_hcd->polling_workqueue); + destroy_workqueue(tcm_hcd->polling_workqueue); + + cancel_delayed_work_sync(&tcm_hcd->watchdog.work); + flush_workqueue(tcm_hcd->watchdog.workqueue); + destroy_workqueue(tcm_hcd->watchdog.workqueue); + + kthread_stop(tcm_hcd->notifier_thread); +err_create_event_wq: + destroy_workqueue(tcm_hcd->event_wq); +err_create_run_kthread: +#ifdef CONFIG_FB + fb_unregister_client(&tcm_hcd->fb_notifier); +#endif + +err_sysfs_create_dynamic_config_file: + for (idx--; idx >= 0; idx--) { + sysfs_remove_file(tcm_hcd->dynamnic_config_sysfs_dir, + &(*dynamic_config_attrs[idx]).attr); + } + + kobject_put(tcm_hcd->dynamnic_config_sysfs_dir); + + idx = ARRAY_SIZE(attrs); + +err_sysfs_create_dynamic_config_dir: +err_sysfs_create_file: + for (idx--; idx >= 0; idx--) + sysfs_remove_file(tcm_hcd->sysfs_dir, &(*attrs[idx]).attr); + + kobject_put(tcm_hcd->sysfs_dir); + +err_sysfs_create_dir: + if (bdata->irq_gpio >= 0) + syna_tcm_set_gpio(tcm_hcd, bdata->irq_gpio, false, 0, 0); + + if (bdata->power_gpio >= 0) + syna_tcm_set_gpio(tcm_hcd, bdata->power_gpio, false, 0, 0); + + if (bdata->reset_gpio >= 0) + syna_tcm_set_gpio(tcm_hcd, bdata->reset_gpio, false, 0, 0); + +err_config_gpio: + /* + syna_tcm_enable_regulator(tcm_hcd, false); +err_enable_regulator: +*/ +err_pinctrl_init: + if (tcm_hcd->ts_pinctrl) { + devm_pinctrl_put(tcm_hcd->ts_pinctrl); + tcm_hcd->ts_pinctrl = NULL; + } + syna_tcm_get_regulator(tcm_hcd, false); + +err_get_regulator: + device_init_wakeup(&pdev->dev, 0); + +err_alloc_mem: + RELEASE_BUFFER(tcm_hcd->report.buffer); + RELEASE_BUFFER(tcm_hcd->config); + RELEASE_BUFFER(tcm_hcd->temp); + RELEASE_BUFFER(tcm_hcd->resp); + RELEASE_BUFFER(tcm_hcd->out); + RELEASE_BUFFER(tcm_hcd->in); + + kfree(tcm_hcd); + + return retval; +} + +static int syna_tcm_remove(struct platform_device *pdev) +{ + int idx; + struct syna_tcm_module_handler *mod_handler; + struct syna_tcm_hcd *tcm_hcd = platform_get_drvdata(pdev); + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + mutex_lock(&mod_pool.mutex); + + if (!list_empty(&mod_pool.list)) { + list_for_each_entry(mod_handler, &mod_pool.list, link) { + if (mod_handler->mod_cb->remove) + mod_handler->mod_cb->remove(tcm_hcd); + list_del(&mod_handler->link); + kfree(mod_handler); + } + } + + mod_pool.queue_work = false; + cancel_work_sync(&mod_pool.work); + flush_workqueue(mod_pool.workqueue); + destroy_workqueue(mod_pool.workqueue); + + mutex_unlock(&mod_pool.mutex); + + if (tcm_hcd->irq_enabled && bdata->irq_gpio >= 0) { + disable_irq(tcm_hcd->irq); + free_irq(tcm_hcd->irq, tcm_hcd); + } + + cancel_delayed_work_sync(&tcm_hcd->polling_work); + flush_workqueue(tcm_hcd->polling_workqueue); + destroy_workqueue(tcm_hcd->polling_workqueue); + + cancel_delayed_work_sync(&tcm_hcd->watchdog.work); + flush_workqueue(tcm_hcd->watchdog.workqueue); + destroy_workqueue(tcm_hcd->watchdog.workqueue); + destroy_workqueue(tcm_hcd->event_wq); + kthread_stop(tcm_hcd->notifier_thread); + +#ifdef CONFIG_FB + fb_unregister_client(&tcm_hcd->fb_notifier); +#endif + + for (idx = 0; idx < ARRAY_SIZE(dynamic_config_attrs); idx++) { + sysfs_remove_file(tcm_hcd->dynamnic_config_sysfs_dir, + &(*dynamic_config_attrs[idx]).attr); + } + + kobject_put(tcm_hcd->dynamnic_config_sysfs_dir); + + for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) + sysfs_remove_file(tcm_hcd->sysfs_dir, &(*attrs[idx]).attr); + + kobject_put(tcm_hcd->sysfs_dir); + + if (bdata->irq_gpio >= 0) + syna_tcm_set_gpio(tcm_hcd, bdata->irq_gpio, false, 0, 0); + + if (bdata->power_gpio >= 0) + syna_tcm_set_gpio(tcm_hcd, bdata->power_gpio, false, 0, 0); + + if (bdata->reset_gpio >= 0) + syna_tcm_set_gpio(tcm_hcd, bdata->reset_gpio, false, 0, 0); +/* + syna_tcm_enable_regulator(tcm_hcd, false); +*/ + syna_tcm_get_regulator(tcm_hcd, false); + + device_init_wakeup(&pdev->dev, 0); + + RELEASE_BUFFER(tcm_hcd->report.buffer); + RELEASE_BUFFER(tcm_hcd->config); + RELEASE_BUFFER(tcm_hcd->temp); + RELEASE_BUFFER(tcm_hcd->resp); + RELEASE_BUFFER(tcm_hcd->out); + RELEASE_BUFFER(tcm_hcd->in); + + kfree(tcm_hcd); + + return 0; +} + +#ifdef CONFIG_PM +static const struct dev_pm_ops syna_tcm_dev_pm_ops = { +#ifndef CONFIG_FB + .suspend = syna_tcm_suspend, + .resume = syna_tcm_resume, +#endif +}; +#endif + +static struct platform_driver syna_tcm_driver = { + .driver = { + .name = PLATFORM_DRIVER_NAME, + .owner = THIS_MODULE, +#ifdef CONFIG_PM + .pm = &syna_tcm_dev_pm_ops, +#endif + }, + .probe = syna_tcm_probe, + .remove = syna_tcm_remove, +}; + +static int __init syna_tcm_module_init(void) +{ + int retval; + + retval = syna_tcm_bus_init(); + if (retval < 0) + return retval; + + return platform_driver_register(&syna_tcm_driver); +} + +static void __exit syna_tcm_module_exit(void) +{ + platform_driver_unregister(&syna_tcm_driver); + + syna_tcm_bus_exit(); + + return; +} + +late_initcall(syna_tcm_module_init); +module_exit(syna_tcm_module_exit); + +MODULE_AUTHOR("Synaptics, Inc."); +MODULE_DESCRIPTION("Synaptics TCM Touch Driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_core.h b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_core.h new file mode 100644 index 000000000000..28d306fc98c7 --- /dev/null +++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_core.h @@ -0,0 +1,681 @@ +/* + * Synaptics TCM touchscreen driver + * + * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved. + * + * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS + * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, + * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS. + * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION + * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED + * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES + * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' + * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. + * DOLLARS. + */ + +#ifndef _SYNAPTICS_TCM_CORE_H_ +#define _SYNAPTICS_TCM_CORE_H_ + +#include <linux/version.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/input.h> +#include <linux/delay.h> +#include <linux/platform_device.h> +#include <linux/input/synaptics_tcm.h> +#ifdef CONFIG_FB +#include <linux/fb.h> +#include <linux/notifier.h> +#endif +#include <linux/proc_fs.h> +#include <linux/vmalloc.h> +#include <linux/uaccess.h> + +#define SYNAPTICS_TCM_ID_PRODUCT (1 << 0) +#define SYNAPTICS_TCM_ID_VERSION 0x0100 +#define SYNAPTICS_TCM_ID_SUBVERSION 0 + +#define PLATFORM_DRIVER_NAME "synaptics_tcm" + +#define TOUCH_INPUT_NAME "synaptics_tcm_touch" +#define TOUCH_INPUT_PHYS_PATH "synaptics_tcm/touch_input" +#define PINCTRL_STATE_ACTIVE "pmx_ts_active" +#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend" + + +#define RD_CHUNK_SIZE 0 /* read length limit in bytes, 0 = unlimited */ +#define WR_CHUNK_SIZE 0 /* write length limit in bytes, 0 = unlimited */ + +#define MESSAGE_HEADER_SIZE 4 +#define MESSAGE_MARKER 0xa5 +#define MESSAGE_PADDING 0x5a +#define LOCKDOWN_SIZE 8 + +#define LOGx(func, dev, log, ...) \ + func(dev, "%s: " log, __func__, ##__VA_ARGS__) + +#define LOGy(func, dev, log, ...) \ + func(dev, "%s (line %d): " log, __func__, __LINE__, ##__VA_ARGS__) + +#define LOGD(dev, log, ...) LOGx(dev_dbg, dev, log, ##__VA_ARGS__) +#define LOGI(dev, log, ...) LOGx(dev_info, dev, log, ##__VA_ARGS__) +#define LOGN(dev, log, ...) LOGx(dev_notice, dev, log, ##__VA_ARGS__) +#define LOGW(dev, log, ...) LOGy(dev_warn, dev, log, ##__VA_ARGS__) +#define LOGE(dev, log, ...) LOGy(dev_err, dev, log, ##__VA_ARGS__) + +#define INIT_BUFFER(buffer, is_clone) \ + mutex_init(&buffer.buf_mutex); \ + buffer.clone = is_clone + +#define LOCK_BUFFER(buffer) \ + mutex_lock(&buffer.buf_mutex) + +#define UNLOCK_BUFFER(buffer) \ + mutex_unlock(&buffer.buf_mutex) + +#define RELEASE_BUFFER(buffer) \ + do { \ + if (buffer.clone == false) { \ + kfree(buffer.buf); \ + buffer.buf_size = 0; \ + buffer.data_length = 0; \ + } \ + } while (0) + +#define MAX(a, b) \ + ({__typeof__(a) _a = (a); \ + __typeof__(b) _b = (b); \ + _a > _b ? _a : _b; }) + +#define MIN(a, b) \ + ({__typeof__(a) _a = (a); \ + __typeof__(b) _b = (b); \ + _a < _b ? _a : _b; }) + +#define STR(x) #x + +#define CONCAT(a, b) a##b + +#define SHOW_PROTOTYPE(m_name, a_name) \ +static ssize_t CONCAT(m_name##_sysfs, _##a_name##_show)(struct device *dev, \ + struct device_attribute *attr, char *buf); \ +\ +static struct device_attribute dev_attr_##a_name = \ + __ATTR(a_name, S_IRUGO, \ + CONCAT(m_name##_sysfs, _##a_name##_show), \ + syna_tcm_store_error); + +#define STORE_PROTOTYPE(m_name, a_name) \ +static ssize_t CONCAT(m_name##_sysfs, _##a_name##_store)(struct device *dev, \ + struct device_attribute *attr, const char *buf, size_t count); \ +\ +static struct device_attribute dev_attr_##a_name = \ + __ATTR(a_name, (S_IWUSR), \ + syna_tcm_show_error, \ + CONCAT(m_name##_sysfs, _##a_name##_store)); + +#define SHOW_STORE_PROTOTYPE(m_name, a_name) \ +static ssize_t CONCAT(m_name##_sysfs, _##a_name##_show)(struct device *dev, \ + struct device_attribute *attr, char *buf); \ +\ +static ssize_t CONCAT(m_name##_sysfs, _##a_name##_store)(struct device *dev, \ + struct device_attribute *attr, const char *buf, size_t count); \ +\ +static struct device_attribute dev_attr_##a_name = \ + __ATTR(a_name, (S_IRUGO | S_IWUSR), \ + CONCAT(m_name##_sysfs, _##a_name##_show), \ + CONCAT(m_name##_sysfs, _##a_name##_store)); + +#define ATTRIFY(a_name) (&dev_attr_##a_name) + +enum module_type { + TCM_TOUCH = 0, + TCM_DEVICE = 1, + TCM_TESTING = 2, + TCM_REFLASH = 3, + TCM_RECOVERY = 4, + TCM_ZEROFLASH = 5, + TCM_DIAGNOSTICS = 6, + TCM_XIAOMI_INTERFACE = 7, + TCM_LAST, +}; + +enum boot_mode { + MODE_APPLICATION = 0x01, + MODE_HOST_DOWNLOAD = 0x02, + MODE_BOOTLOADER = 0x0b, + MODE_TDDI_BOOTLOADER = 0x0c, + MODE_PRODUCTION_TEST = 0x0e, +}; + +enum boot_status { + BOOT_STATUS_OK = 0x00, + BOOT_STATUS_BOOTING = 0x01, + BOOT_STATUS_APP_BAD_DISPLAY_CRC = 0xfc, + BOOT_STATUS_BAD_DISPLAY_CONFIG = 0xfd, + BOOT_STATUS_BAD_APP_FIRMWARE = 0xfe, + BOOT_STATUS_WARM_BOOT = 0xff, +}; + +enum app_status { + APP_STATUS_OK = 0x00, + APP_STATUS_BOOTING = 0x01, + APP_STATUS_UPDATING = 0x02, + APP_STATUS_BAD_APP_CONFIG = 0xff, +}; + +enum firmware_mode { + FW_MODE_BOOTLOADER = 0, + FW_MODE_APPLICATION = 1, + FW_MODE_PRODUCTION_TEST = 2, +}; +#define DC_DYNAMIC_GRIP 208 +enum dynamic_config_id { + DC_UNKNOWN = 0x00, + DC_NO_DOZE, + DC_DISABLE_NOISE_MITIGATION, + DC_INHIBIT_FREQUENCY_SHIFT, + DC_REQUESTED_FREQUENCY, + DC_DISABLE_HSYNC, + DC_REZERO_ON_EXIT_DEEP_SLEEP, + DC_CHARGER_CONNECTED, + DC_NO_BASELINE_RELAXATION, + DC_IN_WAKEUP_GESTURE_MODE, + DC_STIMULUS_FINGERS, + DC_GRIP_SUPPRESSION_ENABLED, + DC_ENABLE_THICK_GLOVE, + DC_ENABLE_GLOVE, +}; + +enum command { + CMD_NONE = 0x00, + CMD_CONTINUE_WRITE = 0x01, + CMD_IDENTIFY = 0x02, + CMD_RESET = 0x04, + CMD_ENABLE_REPORT = 0x05, + CMD_DISABLE_REPORT = 0x06, + CMD_GET_BOOT_INFO = 0x10, + CMD_ERASE_FLASH = 0x11, + CMD_WRITE_FLASH = 0x12, + CMD_READ_FLASH = 0x13, + CMD_RUN_APPLICATION_FIRMWARE = 0x14, + CMD_SPI_MASTER_WRITE_THEN_READ = 0x15, + CMD_REBOOT_TO_ROM_BOOTLOADER = 0x16, + CMD_RUN_BOOTLOADER_FIRMWARE = 0x1f, + CMD_GET_APPLICATION_INFO = 0x20, + CMD_GET_STATIC_CONFIG = 0x21, + CMD_SET_STATIC_CONFIG = 0x22, + CMD_GET_DYNAMIC_CONFIG = 0x23, + CMD_SET_DYNAMIC_CONFIG = 0x24, + CMD_GET_TOUCH_REPORT_CONFIG = 0x25, + CMD_SET_TOUCH_REPORT_CONFIG = 0x26, + CMD_REZERO = 0x27, + CMD_COMMIT_CONFIG = 0x28, + CMD_DESCRIBE_DYNAMIC_CONFIG = 0x29, + CMD_PRODUCTION_TEST = 0x2a, + CMD_SET_CONFIG_ID = 0x2b, + CMD_ENTER_DEEP_SLEEP = 0x2c, + CMD_EXIT_DEEP_SLEEP = 0x2d, + CMD_GET_TOUCH_INFO = 0x2e, + CMD_GET_DATA_LOCATION = 0x2f, + CMD_DOWNLOAD_CONFIG = 0x30, + CMD_ENTER_PRODUCTION_TEST_MODE = 0x31, + CMD_GET_FEATURES = 0x32, +}; + +enum status_code { + STATUS_IDLE = 0x00, + STATUS_OK = 0x01, + STATUS_BUSY = 0x02, + STATUS_CONTINUED_READ = 0x03, + STATUS_NOT_EXECUTED_IN_DEEP_SLEEP = 0x0b, + STATUS_RECEIVE_BUFFER_OVERFLOW = 0x0c, + STATUS_PREVIOUS_COMMAND_PENDING = 0x0d, + STATUS_NOT_IMPLEMENTED = 0x0e, + STATUS_ERROR = 0x0f, + STATUS_INVALID = 0xff, +}; + +enum report_type { + REPORT_IDENTIFY = 0x10, + REPORT_TOUCH = 0x11, + REPORT_DELTA = 0x12, + REPORT_RAW = 0x13, + REPORT_STATUS = 0x1b, + REPORT_PRINTF = 0x82, + REPORT_HDL = 0xfe, +}; + +enum command_status { + CMD_IDLE = 0, + CMD_BUSY = 1, + CMD_ERROR = -1, +}; + +enum flash_area { + BOOTLOADER = 0, + BOOT_CONFIG, + APP_FIRMWARE, + APP_CONFIG, + DISP_CONFIG, + CUSTOM_OTP, + CUSTOM_LCM, + CUSTOM_OEM, + PPDT, +}; + +enum flash_data { + LCM_DATA = 1, + OEM_DATA, + PPDT_DATA, +}; + +enum helper_task { + HELP_NONE = 0, + HELP_RUN_APPLICATION_FIRMWARE, + HELP_SEND_RESET_NOTIFICATION, +}; + +struct syna_tcm_helper { + atomic_t task; + struct work_struct work; + struct workqueue_struct *workqueue; +}; + +struct syna_tcm_watchdog { + bool run; + unsigned char count; + struct delayed_work work; + struct workqueue_struct *workqueue; +}; + +struct syna_tcm_buffer { + bool clone; + unsigned char *buf; + unsigned int buf_size; + unsigned int data_length; + struct mutex buf_mutex; +}; + +struct syna_tcm_report { + unsigned char id; + struct syna_tcm_buffer buffer; +}; + +struct syna_tcm_identification { + unsigned char version; + unsigned char mode; + unsigned char part_number[16]; + unsigned char build_id[4]; + unsigned char max_write_size[2]; +}; + +struct syna_tcm_boot_info { + unsigned char version; + unsigned char status; + unsigned char asic_id[2]; + unsigned char write_block_size_words; + unsigned char erase_page_size_words[2]; + unsigned char max_write_payload_size[2]; + unsigned char last_reset_reason; + unsigned char pc_at_time_of_last_reset[2]; + unsigned char boot_config_start_block[2]; + unsigned char boot_config_size_blocks[2]; + unsigned char display_config_start_block[4]; + unsigned char display_config_length_blocks[2]; + unsigned char backup_display_config_start_block[4]; + unsigned char backup_display_config_length_blocks[2]; + unsigned char custom_otp_start_block[2]; + unsigned char custom_otp_length_blocks[2]; +}; + +struct syna_tcm_app_info { + unsigned char version[2]; + unsigned char status[2]; + unsigned char static_config_size[2]; + unsigned char dynamic_config_size[2]; + unsigned char app_config_start_write_block[2]; + unsigned char app_config_size[2]; + unsigned char max_touch_report_config_size[2]; + unsigned char max_touch_report_payload_size[2]; + unsigned char customer_config_id[16]; + unsigned char max_x[2]; + unsigned char max_y[2]; + unsigned char max_objects[2]; + unsigned char num_of_buttons[2]; + unsigned char num_of_image_rows[2]; + unsigned char num_of_image_cols[2]; + unsigned char has_hybrid_data[2]; +}; + +struct syna_tcm_touch_info { + unsigned char image_2d_scale_factor[4]; + unsigned char image_0d_scale_factor[4]; + unsigned char hybrid_x_scale_factor[4]; + unsigned char hybrid_y_scale_factor[4]; +}; + +struct syna_tcm_message_header { + unsigned char marker; + unsigned char code; + unsigned char length[2]; +}; + +struct syna_tcm_features { + unsigned char byte_0_reserved; + unsigned char byte_1_reserved; + unsigned char dual_firmware:1; + unsigned char byte_2_reserved:7; +} __packed; + +struct syna_tcm_hcd { + pid_t isr_pid; + atomic_t command_status; + atomic_t host_downloading; + wait_queue_head_t hdl_wq; + int irq; + bool reflash_okay; + bool init_okay; + bool do_polling; + bool in_suspend; + bool irq_enabled; + bool host_download_mode; + unsigned char fb_ready; + unsigned char command; + unsigned char async_report_id; + unsigned char status_report_code; + unsigned char response_code; + unsigned int read_length; + unsigned int payload_length; + unsigned int packrat_number; + unsigned int rd_chunk_size; + unsigned int wr_chunk_size; + unsigned int app_status; + struct dentry *debugfs; + struct platform_device *pdev; + struct regulator *pwr_reg; + struct regulator *bus_reg; + struct regulator *lab_reg; + struct regulator *ibb_reg; + struct regulator *i2c_reg; + struct kobject *sysfs_dir; + struct kobject *dynamnic_config_sysfs_dir; + struct mutex extif_mutex; + struct mutex reset_mutex; + struct mutex irq_en_mutex; + struct mutex io_ctrl_mutex; + struct mutex rw_ctrl_mutex; + struct mutex command_mutex; + struct mutex identify_mutex; + struct delayed_work polling_work; + struct workqueue_struct *polling_workqueue; + struct work_struct resume_work; + struct workqueue_struct *event_wq; + struct task_struct *notifier_thread; +#ifdef CONFIG_FB + struct notifier_block fb_notifier; +#endif + struct syna_tcm_buffer in; + struct syna_tcm_buffer out; + struct syna_tcm_buffer resp; + struct syna_tcm_buffer temp; + struct syna_tcm_buffer config; + struct syna_tcm_report report; + struct syna_tcm_app_info app_info; + struct syna_tcm_boot_info boot_info; + struct syna_tcm_touch_info touch_info; + struct syna_tcm_identification id_info; + struct syna_tcm_helper helper; + struct syna_tcm_watchdog watchdog; + struct syna_tcm_features features; + const struct syna_tcm_hw_interface *hw_if; + int (*reset)(struct syna_tcm_hcd *tcm_hcd, bool hw, bool update_wd); + int (*sleep)(struct syna_tcm_hcd *tcm_hcd, bool en); + int (*identify)(struct syna_tcm_hcd *tcm_hcd, bool id); + int (*enable_irq)(struct syna_tcm_hcd *tcm_hcd, bool en, bool ns); + int (*switch_mode)(struct syna_tcm_hcd *tcm_hcd, + enum firmware_mode mode); + int (*read_message)(struct syna_tcm_hcd *tcm_hcd, + unsigned char *in_buf, unsigned int length); + int (*write_message)(struct syna_tcm_hcd *tcm_hcd, + unsigned char command, unsigned char *payload, + unsigned int length, unsigned char **resp_buf, + unsigned int *resp_buf_size, unsigned int *resp_length, + unsigned char *response_code, + unsigned int polling_delay_ms); + int (*get_dynamic_config)(struct syna_tcm_hcd *tcm_hcd, + enum dynamic_config_id id, unsigned short *value); + int (*set_dynamic_config)(struct syna_tcm_hcd *tcm_hcd, + enum dynamic_config_id id, unsigned short value); + int (*get_data_location)(struct syna_tcm_hcd *tcm_hcd, + enum flash_area area, unsigned int *addr, + unsigned int *length); + int (*read_flash_data)(enum flash_area area, bool run_app_firmware, + struct syna_tcm_buffer *output); + void (*report_touch)(void); + void (*update_watchdog)(struct syna_tcm_hcd *tcm_hcd, bool en); + char lockdown[LOCKDOWN_SIZE]; + bool gesture_enabled; + struct pinctrl *ts_pinctrl; + struct pinctrl_state *pinctrl_state_active; + struct pinctrl_state *pinctrl_state_suspend; + bool gesture_enabled_when_resume; + bool gesture_disabled_when_resume; +}; + +struct syna_tcm_module_cb { + enum module_type type; + int (*init)(struct syna_tcm_hcd *tcm_hcd); + int (*remove)(struct syna_tcm_hcd *tcm_hcd); + int (*syncbox)(struct syna_tcm_hcd *tcm_hcd); + int (*asyncbox)(struct syna_tcm_hcd *tcm_hcd); + int (*reset)(struct syna_tcm_hcd *tcm_hcd); + int (*suspend)(struct syna_tcm_hcd *tcm_hcd); + int (*resume)(struct syna_tcm_hcd *tcm_hcd); + int (*early_suspend)(struct syna_tcm_hcd *tcm_hcd); +}; + +struct syna_tcm_module_handler { + bool insert; + bool detach; + struct list_head link; + struct syna_tcm_module_cb *mod_cb; +}; + +struct syna_tcm_module_pool { + bool initialized; + bool queue_work; + struct mutex mutex; + struct list_head list; + struct work_struct work; + struct workqueue_struct *workqueue; + struct syna_tcm_hcd *tcm_hcd; +}; + +struct syna_tcm_bus_io { + unsigned char type; + int (*rmi_read)(struct syna_tcm_hcd *tcm_hcd, unsigned short addr, + unsigned char *data, unsigned int length); + int (*rmi_write)(struct syna_tcm_hcd *tcm_hcd, unsigned short addr, + unsigned char *data, unsigned int length); + int (*read)(struct syna_tcm_hcd *tcm_hcd, unsigned char *data, + unsigned int length); + int (*write)(struct syna_tcm_hcd *tcm_hcd, unsigned char *data, + unsigned int length); +}; + +struct syna_tcm_hw_interface { + struct syna_tcm_board_data *bdata; + const struct syna_tcm_bus_io *bus_io; +}; + +int syna_tcm_bus_init(void); + +void syna_tcm_bus_exit(void); + +int syna_tcm_add_module(struct syna_tcm_module_cb *mod_cb, bool insert); + +static inline int syna_tcm_rmi_read(struct syna_tcm_hcd *tcm_hcd, + unsigned short addr, unsigned char *data, unsigned int length) +{ + return tcm_hcd->hw_if->bus_io->rmi_read(tcm_hcd, addr, data, length); +} + +static inline int syna_tcm_rmi_write(struct syna_tcm_hcd *tcm_hcd, + unsigned short addr, unsigned char *data, unsigned int length) +{ + return tcm_hcd->hw_if->bus_io->rmi_write(tcm_hcd, addr, data, length); +} + +static inline int syna_tcm_read(struct syna_tcm_hcd *tcm_hcd, + unsigned char *data, unsigned int length) +{ + return tcm_hcd->hw_if->bus_io->read(tcm_hcd, data, length); +} + +static inline int syna_tcm_write(struct syna_tcm_hcd *tcm_hcd, + unsigned char *data, unsigned int length) +{ + return tcm_hcd->hw_if->bus_io->write(tcm_hcd, data, length); +} + +static inline ssize_t syna_tcm_show_error(struct device *dev, + struct device_attribute *attr, char *buf) +{ + pr_err("%s: Attribute not readable\n", + __func__); + + return -EPERM; +} + +static inline ssize_t syna_tcm_store_error(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + pr_err("%s: Attribute not writable\n", + __func__); + + return -EPERM; +} + +static inline int secure_memcpy(unsigned char *dest, unsigned int dest_size, + const unsigned char *src, unsigned int src_size, + unsigned int count) +{ + if (dest == NULL || src == NULL) + return -EINVAL; + + if (count > dest_size || count > src_size) { + pr_err("%s: src_size = %d, dest_size = %d, count = %d\n", + __func__, src_size, dest_size, count); + return -EINVAL; + } + + memcpy((void *)dest, (const void *)src, count); + + return 0; +} + +static inline int syna_tcm_realloc_mem(struct syna_tcm_hcd *tcm_hcd, + struct syna_tcm_buffer *buffer, unsigned int size) +{ + int retval; + unsigned char *temp; + + if (size > buffer->buf_size) { + temp = buffer->buf; + + buffer->buf = kmalloc(size, GFP_KERNEL); + if (!(buffer->buf)) { + dev_err(tcm_hcd->pdev->dev.parent, + "%s: Failed to allocate memory\n", + __func__); + kfree(temp); + buffer->buf_size = 0; + return -ENOMEM; + } + + retval = secure_memcpy(buffer->buf, + size, + temp, + buffer->buf_size, + buffer->buf_size); + if (retval < 0) { + dev_err(tcm_hcd->pdev->dev.parent, + "%s: Failed to copy data\n", + __func__); + kfree(temp); + kfree(buffer->buf); + buffer->buf_size = 0; + return retval; + } + + kfree(temp); + buffer->buf_size = size; + } + + return 0; +} + +static inline int syna_tcm_alloc_mem(struct syna_tcm_hcd *tcm_hcd, + struct syna_tcm_buffer *buffer, unsigned int size) +{ + if (size > buffer->buf_size) { + kfree(buffer->buf); + buffer->buf = kmalloc(size, GFP_KERNEL); + if (!(buffer->buf)) { + dev_err(tcm_hcd->pdev->dev.parent, + "%s: Failed to allocate memory\n", + __func__); + dev_err(tcm_hcd->pdev->dev.parent, + "%s: Allocation size = %d\n", + __func__, size); + buffer->buf_size = 0; + buffer->data_length = 0; + return -ENOMEM; + } + buffer->buf_size = size; + } + + memset(buffer->buf, 0x00, buffer->buf_size); + buffer->data_length = 0; + + return 0; +} + +static inline unsigned int le2_to_uint(const unsigned char *src) +{ + return (unsigned int)src[0] + + (unsigned int)src[1] * 0x100; +} + +static inline unsigned int le4_to_uint(const unsigned char *src) +{ + return (unsigned int)src[0] + + (unsigned int)src[1] * 0x100 + + (unsigned int)src[2] * 0x10000 + + (unsigned int)src[3] * 0x1000000; +} + +static inline unsigned int ceil_div(unsigned int dividend, unsigned divisor) +{ + return (dividend + divisor - 1) / divisor; +} + +#endif diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_device.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_device.c new file mode 100644 index 000000000000..d5e5ebe1dc65 --- /dev/null +++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_device.c @@ -0,0 +1,708 @@ +/* + * Synaptics TCM touchscreen driver + * + * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved. + * + * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS + * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, + * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS. + * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION + * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED + * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES + * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' + * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. + * DOLLARS. + */ + +#include <linux/cdev.h> +#include <linux/gpio.h> +#include <linux/uaccess.h> +#include "synaptics_tcm_core.h" + +#define CHAR_DEVICE_NAME "tcm" + +#define CONCURRENT true + +#define DEVICE_IOC_MAGIC 's' +#define DEVICE_IOC_RESET _IO(DEVICE_IOC_MAGIC, 0) /* 0x00007300 */ +#define DEVICE_IOC_IRQ _IOW(DEVICE_IOC_MAGIC, 1, int) /* 0x40047301 */ +#define DEVICE_IOC_RAW _IOW(DEVICE_IOC_MAGIC, 2, int) /* 0x40047302 */ +#define DEVICE_IOC_CONCURRENT _IOW(DEVICE_IOC_MAGIC, 3, int) /* 0x40047303 */ + +struct device_hcd { + dev_t dev_num; + bool raw_mode; + bool concurrent; + unsigned int ref_count; + struct cdev char_dev; + struct class *class; + struct device *device; + struct syna_tcm_buffer out; + struct syna_tcm_buffer resp; + struct syna_tcm_buffer report; + struct syna_tcm_hcd *tcm_hcd; +}; + +DECLARE_COMPLETION(device_remove_complete); + +static struct device_hcd *device_hcd; + +static int rmidev_major_num; + +static void device_capture_touch_report(unsigned int count) +{ + int retval; + unsigned char id; + unsigned int idx; + unsigned int size; + unsigned char *data; + struct syna_tcm_hcd *tcm_hcd = device_hcd->tcm_hcd; + static bool report; + static unsigned int offset; + static unsigned int remaining_size; + + if (count < 2) + return; + + data = &device_hcd->resp.buf[0]; + + if (data[0] != MESSAGE_MARKER) + return; + + id = data[1]; + + size = 0; + + LOCK_BUFFER(device_hcd->report); + + switch (id) { + case REPORT_TOUCH: + if (count >= 4) { + remaining_size = le2_to_uint(&data[2]); + } else { + report = false; + goto exit; + } + retval = syna_tcm_alloc_mem(tcm_hcd, + &device_hcd->report, + remaining_size); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for device_hcd->report.buf\n"); + report = false; + goto exit; + } + idx = 4; + size = count - idx; + offset = 0; + report = true; + break; + case STATUS_CONTINUED_READ: + if (report == false) + goto exit; + if (count >= 2) { + idx = 2; + size = count - idx; + } + break; + default: + goto exit; + } + + if (size) { + size = MIN(size, remaining_size); + retval = secure_memcpy(&device_hcd->report.buf[offset], + device_hcd->report.buf_size - offset, + &data[idx], + count - idx, + size); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy touch report data\n"); + report = false; + goto exit; + } else { + offset += size; + remaining_size -= size; + device_hcd->report.data_length += size; + } + } + + if (remaining_size) + goto exit; + + LOCK_BUFFER(tcm_hcd->report.buffer); + + tcm_hcd->report.buffer.buf = device_hcd->report.buf; + tcm_hcd->report.buffer.buf_size = device_hcd->report.buf_size; + tcm_hcd->report.buffer.data_length = device_hcd->report.data_length; + + tcm_hcd->report_touch(); + + UNLOCK_BUFFER(tcm_hcd->report.buffer); + + report = false; + +exit: + UNLOCK_BUFFER(device_hcd->report); + + return; +} + +static int device_capture_touch_report_config(unsigned int count) +{ + int retval; + unsigned int size; + unsigned int buf_size; + unsigned char *data; + struct syna_tcm_hcd *tcm_hcd = device_hcd->tcm_hcd; + + if (device_hcd->raw_mode) { + if (count < 3) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid write data\n"); + return -EINVAL; + } + + size = le2_to_uint(&device_hcd->out.buf[1]); + + if (count - 3 < size) { + LOGE(tcm_hcd->pdev->dev.parent, + "Incomplete write data\n"); + return -EINVAL; + } + + if (!size) + return 0; + + data = &device_hcd->out.buf[3]; + buf_size = device_hcd->out.buf_size - 3; + } else { + size = count - 1; + + if (!size) + return 0; + + data = &device_hcd->out.buf[1]; + buf_size = device_hcd->out.buf_size - 1; + } + + LOCK_BUFFER(tcm_hcd->config); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &tcm_hcd->config, + size); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for tcm_hcd->config.buf\n"); + UNLOCK_BUFFER(tcm_hcd->config); + return retval; + } + + retval = secure_memcpy(tcm_hcd->config.buf, + tcm_hcd->config.buf_size, + data, + buf_size, + size); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy touch report config data\n"); + UNLOCK_BUFFER(tcm_hcd->config); + return retval; + } + + tcm_hcd->config.data_length = size; + + UNLOCK_BUFFER(tcm_hcd->config); + + return 0; +} + +#ifdef HAVE_UNLOCKED_IOCTL +static long device_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +#else +static int device_ioctl(struct inode *inp, struct file *filp, unsigned int cmd, + unsigned long arg) +#endif +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = device_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + retval = 0; + + switch (cmd) { + case DEVICE_IOC_RESET: + retval = tcm_hcd->reset(tcm_hcd, false, true); + break; + case DEVICE_IOC_IRQ: + if (arg == 0) + retval = tcm_hcd->enable_irq(tcm_hcd, false, false); + else if (arg == 1) + retval = tcm_hcd->enable_irq(tcm_hcd, true, NULL); + break; + case DEVICE_IOC_RAW: + if (arg == 0) + device_hcd->raw_mode = false; + else if (arg == 1) + device_hcd->raw_mode = true; + break; + case DEVICE_IOC_CONCURRENT: + if (arg == 0) + device_hcd->concurrent = false; + else if (arg == 1) + device_hcd->concurrent = true; + break; + default: + retval = -ENOTTY; + break; + } + + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static loff_t device_llseek(struct file *filp, loff_t off, int whence) +{ + return -EINVAL; +} + +static ssize_t device_read(struct file *filp, char __user *buf, + size_t count, loff_t *f_pos) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = device_hcd->tcm_hcd; + + if (count == 0) + return 0; + + mutex_lock(&tcm_hcd->extif_mutex); + + LOCK_BUFFER(device_hcd->resp); + + if (device_hcd->raw_mode) { + retval = syna_tcm_alloc_mem(tcm_hcd, + &device_hcd->resp, + count); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for device_hcd->resp.buf\n"); + UNLOCK_BUFFER(device_hcd->resp); + goto exit; + } + + retval = tcm_hcd->read_message(tcm_hcd, + device_hcd->resp.buf, + count); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read message\n"); + UNLOCK_BUFFER(device_hcd->resp); + goto exit; + } + } else { + if (count != device_hcd->resp.data_length) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid length information\n"); + UNLOCK_BUFFER(device_hcd->resp); + retval = -EINVAL; + goto exit; + } + } + + if (copy_to_user(buf, device_hcd->resp.buf, count)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy data to user space\n"); + UNLOCK_BUFFER(device_hcd->resp); + retval = -EINVAL; + goto exit; + } + + if (!device_hcd->concurrent) + goto skip_concurrent; + + if (tcm_hcd->report_touch == NULL) { + LOGE(tcm_hcd->pdev->dev.parent, + "Unable to report touch\n"); + device_hcd->concurrent = false; + } + + if (device_hcd->raw_mode) + device_capture_touch_report(count); + +skip_concurrent: + UNLOCK_BUFFER(device_hcd->resp); + + retval = count; + +exit: + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t device_write(struct file *filp, const char __user *buf, + size_t count, loff_t *f_pos) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = device_hcd->tcm_hcd; + + if (count == 0) + return 0; + + mutex_lock(&tcm_hcd->extif_mutex); + + LOCK_BUFFER(device_hcd->out); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &device_hcd->out, + count == 1 ? count + 1 : count); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for device_hcd->out.buf\n"); + UNLOCK_BUFFER(device_hcd->out); + goto exit; + } + + if (copy_from_user(device_hcd->out.buf, buf, count)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy data from user space\n"); + UNLOCK_BUFFER(device_hcd->out); + retval = -EINVAL; + goto exit; + } + + LOCK_BUFFER(device_hcd->resp); + + if (device_hcd->raw_mode) { + retval = tcm_hcd->write_message(tcm_hcd, + device_hcd->out.buf[0], + &device_hcd->out.buf[1], + count - 1, + NULL, + NULL, + NULL, + NULL, + 0); + } else { + mutex_lock(&tcm_hcd->reset_mutex); + retval = tcm_hcd->write_message(tcm_hcd, + device_hcd->out.buf[0], + &device_hcd->out.buf[1], + count - 1, + &device_hcd->resp.buf, + &device_hcd->resp.buf_size, + &device_hcd->resp.data_length, + NULL, + 0); + mutex_unlock(&tcm_hcd->reset_mutex); + } + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command 0x%02x\n", + device_hcd->out.buf[0]); + UNLOCK_BUFFER(device_hcd->resp); + UNLOCK_BUFFER(device_hcd->out); + goto exit; + } + + if (count && device_hcd->out.buf[0] == CMD_SET_TOUCH_REPORT_CONFIG) { + retval = device_capture_touch_report_config(count); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to capture touch report config\n"); + } + } + + UNLOCK_BUFFER(device_hcd->out); + + if (device_hcd->raw_mode) + retval = count; + else + retval = device_hcd->resp.data_length; + + UNLOCK_BUFFER(device_hcd->resp); + +exit: + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static int device_open(struct inode *inp, struct file *filp) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = device_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + if (device_hcd->ref_count < 1) { + device_hcd->ref_count++; + retval = 0; + } else { + retval = -EACCES; + } + + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static int device_release(struct inode *inp, struct file *filp) +{ + struct syna_tcm_hcd *tcm_hcd = device_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + if (device_hcd->ref_count) + device_hcd->ref_count--; + + mutex_unlock(&tcm_hcd->extif_mutex); + + return 0; +} + +static char *device_devnode(struct device *dev, umode_t *mode) +{ + if (!mode) + return NULL; + + *mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); + + return kasprintf(GFP_KERNEL, "%s/%s", PLATFORM_DRIVER_NAME, + dev_name(dev)); +} + +static int device_create_class(void) +{ + struct syna_tcm_hcd *tcm_hcd = device_hcd->tcm_hcd; + + if (device_hcd->class != NULL) + return 0; + + device_hcd->class = class_create(THIS_MODULE, PLATFORM_DRIVER_NAME); + + if (IS_ERR(device_hcd->class)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create class\n"); + return -ENODEV; + } + + device_hcd->class->devnode = device_devnode; + + return 0; +} + +static const struct file_operations device_fops = { + .owner = THIS_MODULE, +#ifdef HAVE_UNLOCKED_IOCTL + .unlocked_ioctl = device_ioctl, +#ifdef HAVE_COMPAT_IOCTL + .compat_ioctl = device_ioctl, +#endif +#else + .ioctl = device_ioctl, +#endif + .llseek = device_llseek, + .read = device_read, + .write = device_write, + .open = device_open, + .release = device_release, +}; + +static int device_init(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + dev_t dev_num; + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + device_hcd = kzalloc(sizeof(*device_hcd), GFP_KERNEL); + if (!device_hcd) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for device_hcd\n"); + return -ENOMEM; + } + + device_hcd->tcm_hcd = tcm_hcd; + + device_hcd->concurrent = CONCURRENT; + + INIT_BUFFER(device_hcd->out, false); + INIT_BUFFER(device_hcd->resp, false); + INIT_BUFFER(device_hcd->report, false); + + if (rmidev_major_num) { + dev_num = MKDEV(rmidev_major_num, 0); + retval = register_chrdev_region(dev_num, 1, + PLATFORM_DRIVER_NAME); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to register char device\n"); + goto err_register_chrdev_region; + } + } else { + retval = alloc_chrdev_region(&dev_num, 0, 1, + PLATFORM_DRIVER_NAME); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate char device\n"); + goto err_alloc_chrdev_region; + } + + rmidev_major_num = MAJOR(dev_num); + } + + device_hcd->dev_num = dev_num; + + cdev_init(&device_hcd->char_dev, &device_fops); + + retval = cdev_add(&device_hcd->char_dev, dev_num, 1); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to add char device\n"); + goto err_add_chardev; + } + + retval = device_create_class(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create class\n"); + goto err_create_class; + } + + device_hcd->device = device_create(device_hcd->class, NULL, + device_hcd->dev_num, NULL, CHAR_DEVICE_NAME"%d", + MINOR(device_hcd->dev_num)); + if (IS_ERR(device_hcd->device)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create device\n"); + retval = -ENODEV; + goto err_create_device; + } + + if (bdata->irq_gpio >= 0) { + retval = gpio_export(bdata->irq_gpio, false); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to export GPIO\n"); + } else { + retval = gpio_export_link(&tcm_hcd->pdev->dev, + "attn", bdata->irq_gpio); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to export GPIO link\n"); + } + } + } + + return 0; + +err_create_device: + class_destroy(device_hcd->class); + +err_create_class: + cdev_del(&device_hcd->char_dev); + +err_add_chardev: + unregister_chrdev_region(dev_num, 1); + +err_alloc_chrdev_region: +err_register_chrdev_region: + RELEASE_BUFFER(device_hcd->report); + RELEASE_BUFFER(device_hcd->resp); + RELEASE_BUFFER(device_hcd->out); + + kfree(device_hcd); + device_hcd = NULL; + + return retval; +} + +static int device_remove(struct syna_tcm_hcd *tcm_hcd) +{ + if (!device_hcd) + goto exit; + + device_destroy(device_hcd->class, device_hcd->dev_num); + + class_destroy(device_hcd->class); + + cdev_del(&device_hcd->char_dev); + + unregister_chrdev_region(device_hcd->dev_num, 1); + + RELEASE_BUFFER(device_hcd->report); + RELEASE_BUFFER(device_hcd->resp); + RELEASE_BUFFER(device_hcd->out); + + kfree(device_hcd); + device_hcd = NULL; + +exit: + complete(&device_remove_complete); + + return 0; +} + +static int device_reset(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + + if (!device_hcd) { + retval = device_init(tcm_hcd); + return retval; + } + + return 0; +} + +static struct syna_tcm_module_cb device_module = { + .type = TCM_DEVICE, + .init = device_init, + .remove = device_remove, + .syncbox = NULL, + .asyncbox = NULL, + .reset = device_reset, + .suspend = NULL, + .resume = NULL, + .early_suspend = NULL, +}; + +static int __init device_module_init(void) +{ + return syna_tcm_add_module(&device_module, true); +} + +static void __exit device_module_exit(void) +{ + syna_tcm_add_module(&device_module, false); + + wait_for_completion(&device_remove_complete); + + return; +} + +late_initcall(device_module_init); +module_exit(device_module_exit); + +MODULE_AUTHOR("Synaptics, Inc."); +MODULE_DESCRIPTION("Synaptics TCM Device Module"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_diagnostics.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_diagnostics.c new file mode 100644 index 000000000000..b72dd7587f63 --- /dev/null +++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_diagnostics.c @@ -0,0 +1,567 @@ +/* + * Synaptics TCM touchscreen driver + * + * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved. + * + * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS + * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, + * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS. + * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION + * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED + * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES + * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' + * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. + * DOLLARS. + */ + +#include "synaptics_tcm_core.h" + +#define SYSFS_DIR_NAME "diagnostics" + +enum pingpong_state { + PING = 0, + PONG = 1, +}; + +struct diag_hcd { + pid_t pid; + unsigned char report_type; + enum pingpong_state state; + struct kobject *sysfs_dir; + struct siginfo sigio; + struct task_struct *task; + struct syna_tcm_buffer ping; + struct syna_tcm_buffer pong; + struct syna_tcm_hcd *tcm_hcd; +}; + +DECLARE_COMPLETION(diag_remove_complete); + +static struct diag_hcd *diag_hcd; + +STORE_PROTOTYPE(diag, pid) +SHOW_PROTOTYPE(diag, size) +STORE_PROTOTYPE(diag, type) +SHOW_PROTOTYPE(diag, rows) +SHOW_PROTOTYPE(diag, cols) +SHOW_PROTOTYPE(diag, hybrid) +SHOW_PROTOTYPE(diag, buttons) + +static struct device_attribute *attrs[] = { + ATTRIFY(pid), + ATTRIFY(size), + ATTRIFY(type), + ATTRIFY(rows), + ATTRIFY(cols), + ATTRIFY(hybrid), + ATTRIFY(buttons), +}; + +static ssize_t diag_sysfs_data_show(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count); + +static struct bin_attribute bin_attr = { + .attr = { + .name = "data", + .mode = S_IRUGO, + }, + .size = 0, + .read = diag_sysfs_data_show, +}; + +static ssize_t diag_sysfs_pid_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int retval; + unsigned int input; + struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd; + + if (sscanf(buf, "%u", &input) != 1) + return -EINVAL; + + mutex_lock(&tcm_hcd->extif_mutex); + + diag_hcd->pid = input; + + if (diag_hcd->pid) { + diag_hcd->task = pid_task(find_vpid(diag_hcd->pid), + PIDTYPE_PID); + if (!diag_hcd->task) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to locate task\n"); + retval = -EINVAL; + goto exit; + } + } + + retval = count; + +exit: + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t diag_sysfs_size_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + if (diag_hcd->state == PING) { + LOCK_BUFFER(diag_hcd->ping); + + retval = snprintf(buf, PAGE_SIZE, + "%u\n", + diag_hcd->ping.data_length); + + UNLOCK_BUFFER(diag_hcd->ping); + } else { + LOCK_BUFFER(diag_hcd->pong); + + retval = snprintf(buf, PAGE_SIZE, + "%u\n", + diag_hcd->pong.data_length); + + UNLOCK_BUFFER(diag_hcd->pong); + } + + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t diag_sysfs_type_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + unsigned int input; + struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd; + + if (sscanf(buf, "%u", &input) != 1) + return -EINVAL; + + mutex_lock(&tcm_hcd->extif_mutex); + + diag_hcd->report_type = (unsigned char)input; + + mutex_unlock(&tcm_hcd->extif_mutex); + + return count; +} + +static ssize_t diag_sysfs_rows_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int retval; + unsigned int rows; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + if (tcm_hcd->id_info.mode != MODE_APPLICATION || + tcm_hcd->app_status != APP_STATUS_OK) { + retval = -ENODEV; + goto exit; + } + + app_info = &tcm_hcd->app_info; + rows = le2_to_uint(app_info->num_of_image_rows); + + retval = snprintf(buf, PAGE_SIZE, "%u\n", rows); + +exit: + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t diag_sysfs_cols_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int retval; + unsigned int cols; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + if (tcm_hcd->id_info.mode != MODE_APPLICATION || + tcm_hcd->app_status != APP_STATUS_OK) { + retval = -ENODEV; + goto exit; + } + + app_info = &tcm_hcd->app_info; + cols = le2_to_uint(app_info->num_of_image_cols); + + retval = snprintf(buf, PAGE_SIZE, "%u\n", cols); + +exit: + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t diag_sysfs_hybrid_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int retval; + unsigned int hybrid; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + if (tcm_hcd->id_info.mode != MODE_APPLICATION || + tcm_hcd->app_status != APP_STATUS_OK) { + retval = -ENODEV; + goto exit; + } + + app_info = &tcm_hcd->app_info; + hybrid = le2_to_uint(app_info->has_hybrid_data); + + retval = snprintf(buf, PAGE_SIZE, "%u\n", hybrid); + +exit: + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t diag_sysfs_buttons_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int retval; + unsigned int buttons; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + if (tcm_hcd->id_info.mode != MODE_APPLICATION || + tcm_hcd->app_status != APP_STATUS_OK) { + retval = -ENODEV; + goto exit; + } + + app_info = &tcm_hcd->app_info; + buttons = le2_to_uint(app_info->num_of_buttons); + + retval = snprintf(buf, PAGE_SIZE, "%u\n", buttons); + +exit: + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t diag_sysfs_data_show(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count) +{ + int retval; + unsigned int readlen; + struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + retval = 0; + + if (diag_hcd->state == PING) { + LOCK_BUFFER(diag_hcd->ping); + + if (diag_hcd->ping.data_length == 0) { + readlen = 0; + goto exit; + } + + readlen = MIN(count, diag_hcd->ping.data_length - pos); + + if (diag_hcd->ping.data_length) { + retval = secure_memcpy(buf, + count, + &diag_hcd->ping.buf[pos], + diag_hcd->ping.buf_size - pos, + readlen); + } + + UNLOCK_BUFFER(diag_hcd->ping); + } else { + LOCK_BUFFER(diag_hcd->pong); + + if (diag_hcd->pong.data_length == 0) { + readlen = 0; + goto exit; + } + + readlen = MIN(count, diag_hcd->pong.data_length - pos); + + if (diag_hcd->pong.data_length) { + retval = secure_memcpy(buf, + count, + &diag_hcd->pong.buf[pos], + diag_hcd->pong.buf_size - pos, + readlen); + } + + UNLOCK_BUFFER(diag_hcd->pong); + } + +exit: + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy report data\n"); + } else { + retval = readlen; + } + + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static void diag_report(void) +{ + int retval; + static enum pingpong_state state = PING; + struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd; + + if (state == PING) { + LOCK_BUFFER(diag_hcd->ping); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &diag_hcd->ping, + tcm_hcd->report.buffer.data_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for diag_hcd->ping.buf\n"); + UNLOCK_BUFFER(diag_hcd->ping); + return; + } + + retval = secure_memcpy(diag_hcd->ping.buf, + diag_hcd->ping.buf_size, + tcm_hcd->report.buffer.buf, + tcm_hcd->report.buffer.buf_size, + tcm_hcd->report.buffer.data_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy report data\n"); + UNLOCK_BUFFER(diag_hcd->ping); + return; + } + + diag_hcd->ping.data_length = tcm_hcd->report.buffer.data_length; + + UNLOCK_BUFFER(diag_hcd->ping); + + diag_hcd->state = state; + state = PONG; + } else { + LOCK_BUFFER(diag_hcd->pong); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &diag_hcd->pong, + tcm_hcd->report.buffer.data_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for diag_hcd->pong.buf\n"); + UNLOCK_BUFFER(diag_hcd->pong); + return; + } + + retval = secure_memcpy(diag_hcd->pong.buf, + diag_hcd->pong.buf_size, + tcm_hcd->report.buffer.buf, + tcm_hcd->report.buffer.buf_size, + tcm_hcd->report.buffer.data_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy report data\n"); + UNLOCK_BUFFER(diag_hcd->pong); + return; + } + + diag_hcd->pong.data_length = tcm_hcd->report.buffer.data_length; + + UNLOCK_BUFFER(diag_hcd->pong); + + diag_hcd->state = state; + state = PING; + } + + if (diag_hcd->pid) + send_sig_info(SIGIO, &diag_hcd->sigio, diag_hcd->task); + + return; +} + +static int diag_init(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + int idx; + + diag_hcd = kzalloc(sizeof(*diag_hcd), GFP_KERNEL); + if (!diag_hcd) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for diag_hcd\n"); + return -ENOMEM; + } + + diag_hcd->tcm_hcd = tcm_hcd; + diag_hcd->state = PING; + + INIT_BUFFER(diag_hcd->ping, false); + INIT_BUFFER(diag_hcd->pong, false); + + memset(&diag_hcd->sigio, 0x00, sizeof(diag_hcd->sigio)); + diag_hcd->sigio.si_signo = SIGIO; + diag_hcd->sigio.si_code = SI_USER; + + diag_hcd->sysfs_dir = kobject_create_and_add(SYSFS_DIR_NAME, + tcm_hcd->sysfs_dir); + if (!diag_hcd->sysfs_dir) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create sysfs directory\n"); + retval = -EINVAL; + goto err_sysfs_create_dir; + } + + for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) { + retval = sysfs_create_file(diag_hcd->sysfs_dir, + &(*attrs[idx]).attr); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create sysfs file\n"); + goto err_sysfs_create_file; + } + } + + retval = sysfs_create_bin_file(diag_hcd->sysfs_dir, &bin_attr); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create sysfs bin file\n"); + goto err_sysfs_create_bin_file; + } + + return 0; + +err_sysfs_create_bin_file: +err_sysfs_create_file: + for (idx--; idx >= 0; idx--) + sysfs_remove_file(diag_hcd->sysfs_dir, &(*attrs[idx]).attr); + + kobject_put(diag_hcd->sysfs_dir); + +err_sysfs_create_dir: + RELEASE_BUFFER(diag_hcd->pong); + RELEASE_BUFFER(diag_hcd->ping); + + kfree(diag_hcd); + diag_hcd = NULL; + + return retval; +} + +static int diag_remove(struct syna_tcm_hcd *tcm_hcd) +{ + int idx; + + if (!diag_hcd) + goto exit; + + sysfs_remove_bin_file(diag_hcd->sysfs_dir, &bin_attr); + + for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) + sysfs_remove_file(diag_hcd->sysfs_dir, &(*attrs[idx]).attr); + + kobject_put(diag_hcd->sysfs_dir); + + RELEASE_BUFFER(diag_hcd->pong); + RELEASE_BUFFER(diag_hcd->ping); + + kfree(diag_hcd); + diag_hcd = NULL; + +exit: + complete(&diag_remove_complete); + + return 0; +} + +static int diag_syncbox(struct syna_tcm_hcd *tcm_hcd) +{ + if (!diag_hcd) + return 0; + + if (tcm_hcd->report.id == diag_hcd->report_type) + diag_report(); + + return 0; +} + +static int diag_reset(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + + if (!diag_hcd) { + retval = diag_init(tcm_hcd); + return retval; + } + + return 0; +} + +static struct syna_tcm_module_cb diag_module = { + .type = TCM_DIAGNOSTICS, + .init = diag_init, + .remove = diag_remove, + .syncbox = diag_syncbox, + .asyncbox = NULL, + .reset = diag_reset, + .suspend = NULL, + .resume = NULL, + .early_suspend = NULL, +}; + +static int __init diag_module_init(void) +{ + return syna_tcm_add_module(&diag_module, true); +} + +static void __exit diag_module_exit(void) +{ + syna_tcm_add_module(&diag_module, false); + + wait_for_completion(&diag_remove_complete); + + return; +} + +late_initcall(diag_module_init); +module_exit(diag_module_exit); + +MODULE_AUTHOR("Synaptics, Inc."); +MODULE_DESCRIPTION("Synaptics TCM Diagnostics Module"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_i2c.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_i2c.c new file mode 100644 index 000000000000..e0b662253621 --- /dev/null +++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_i2c.c @@ -0,0 +1,536 @@ +/* + * Synaptics TCM touchscreen driver + * + * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved. + * + * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS + * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, + * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS. + * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION + * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED + * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES + * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' + * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. + * DOLLARS. + */ + +#include <linux/i2c.h> +#include <linux/of_gpio.h> +#include "synaptics_tcm_core.h" + +#define XFER_ATTEMPTS 10 + +static unsigned char *buf; + +static unsigned int buf_size; + +static struct syna_tcm_bus_io bus_io; + +static struct syna_tcm_hw_interface hw_if; + +static struct platform_device *syna_tcm_i2c_device; + +#ifdef CONFIG_OF +static int parse_dt(struct device *dev, struct syna_tcm_board_data *bdata) +{ + int retval; + u32 value; + struct property *prop; + struct device_node *np = dev->of_node; + const char *name; + + prop = of_find_property(np, "synaptics,irq-gpio", NULL); + if (prop && prop->length) { + bdata->irq_gpio = of_get_named_gpio_flags(np, + "synaptics,irq-gpio", 0, + (enum of_gpio_flags *)&bdata->irq_flags); + } else { + bdata->irq_gpio = -1; + } + + retval = of_property_read_u32(np, "synaptics,irq-on-state", &value); + if (retval < 0) + bdata->irq_on_state = 0; + else + bdata->irq_on_state = value; + + retval = of_property_read_string(np, "synaptics,pwr-reg-name", &name); + if (retval < 0) + bdata->pwr_reg_name = NULL; + else + bdata->pwr_reg_name = name; + + retval = of_property_read_string(np, "synaptics,bus-reg-name", &name); + if (retval < 0) + bdata->bus_reg_name = NULL; + else + bdata->bus_reg_name = name; + + retval = of_property_read_string(np, "synaptics,lab-reg-name", &name); + if (retval < 0) + bdata->lab_reg_name = NULL; + else + bdata->lab_reg_name = name; + + retval = of_property_read_string(np, "synaptics,ibb-reg-name", &name); + if (retval < 0) + bdata->ibb_reg_name = NULL; + else + bdata->ibb_reg_name = name; + + retval = of_property_read_string(np, "synaptics,i2c-reg-name", &name); + if (retval < 0) + bdata->i2c_reg_name = NULL; + else + bdata->i2c_reg_name = name; + + prop = of_find_property(np, "synaptics,power-gpio", NULL); + if (prop && prop->length) { + bdata->power_gpio = of_get_named_gpio_flags(np, + "synaptics,power-gpio", 0, NULL); + } else { + bdata->power_gpio = -1; + } + + prop = of_find_property(np, "synaptics,power-on-state", NULL); + if (prop && prop->length) { + retval = of_property_read_u32(np, "synaptics,power-on-state", + &value); + if (retval < 0) { + LOGE(dev, + "Failed to read synaptics,power-on-state property\n"); + return retval; + } else { + bdata->power_on_state = value; + } + } else { + bdata->power_on_state = 0; + } + + prop = of_find_property(np, "synaptics,power-delay-ms", NULL); + if (prop && prop->length) { + retval = of_property_read_u32(np, "synaptics,power-delay-ms", + &value); + if (retval < 0) { + LOGE(dev, + "Failed to read synaptics,power-delay-ms property\n"); + return retval; + } else { + bdata->power_delay_ms = value; + } + } else { + bdata->power_delay_ms = 0; + } + + prop = of_find_property(np, "synaptics,reset-gpio", NULL); + if (prop && prop->length) { + bdata->reset_gpio = of_get_named_gpio_flags(np, + "synaptics,reset-gpio", 0, NULL); + } else { + bdata->reset_gpio = -1; + } + + prop = of_find_property(np, "synaptics,mdss-reset", NULL); + if (prop && prop->length) { + bdata->mdss_reset = of_get_named_gpio_flags(np, + "synaptics,mdss-reset", 0, NULL); + } else { + bdata->mdss_reset = -1; + } + + prop = of_find_property(np, "synaptics,reset-on-state", NULL); + if (prop && prop->length) { + retval = of_property_read_u32(np, "synaptics,reset-on-state", + &value); + if (retval < 0) { + LOGE(dev, + "Failed to read synaptics,reset-on-state property\n"); + return retval; + } else { + bdata->reset_on_state = value; + } + } else { + bdata->reset_on_state = 0; + } + + prop = of_find_property(np, "synaptics,reset-active-ms", NULL); + if (prop && prop->length) { + retval = of_property_read_u32(np, "synaptics,reset-active-ms", + &value); + if (retval < 0) { + LOGE(dev, + "Failed to read synaptics,reset-active-ms property\n"); + return retval; + } else { + bdata->reset_active_ms = value; + } + } else { + bdata->reset_active_ms = 0; + } + + prop = of_find_property(np, "synaptics,reset-delay-ms", NULL); + if (prop && prop->length) { + retval = of_property_read_u32(np, "synaptics,reset-delay-ms", + &value); + if (retval < 0) { + LOGE(dev, + "Unable to read synaptics,reset-delay-ms property\n"); + return retval; + } else { + bdata->reset_delay_ms = value; + } + } else { + bdata->reset_delay_ms = 0; + } + + prop = of_find_property(np, "synaptics,x-flip", NULL); + bdata->x_flip = prop > 0 ? true : false; + + prop = of_find_property(np, "synaptics,y-flip", NULL); + bdata->y_flip = prop > 0 ? true : false; + + prop = of_find_property(np, "synaptics,swap-axes", NULL); + bdata->swap_axes = prop > 0 ? true : false; + + prop = of_find_property(np, "synaptics,ubl-i2c-addr", NULL); + if (prop && prop->length) { + retval = of_property_read_u32(np, "synaptics,ubl-i2c-addr", + &value); + if (retval < 0) { + LOGE(dev, + "Unable to read synaptics,ubl-i2c-addr property\n"); + return retval; + } else { + bdata->ubl_i2c_addr = value; + } + } else { + bdata->ubl_i2c_addr = 0; + } + + return 0; +} +#endif + +static int syna_tcm_i2c_alloc_mem(struct syna_tcm_hcd *tcm_hcd, + unsigned int size) +{ + struct i2c_client *i2c = to_i2c_client(tcm_hcd->pdev->dev.parent); + + if (size > buf_size) { + if (buf_size) + kfree(buf); + buf = kmalloc(size, GFP_KERNEL); + if (!buf) { + LOGE(&i2c->dev, + "Failed to allocate memory for buf\n"); + buf_size = 0; + return -ENOMEM; + } + buf_size = size; + } + + return 0; +} + +static int syna_tcm_i2c_rmi_read(struct syna_tcm_hcd *tcm_hcd, + unsigned short addr, unsigned char *data, unsigned int length) +{ + int retval; + unsigned char address; + unsigned int attempt; + struct i2c_msg msg[2]; + struct i2c_client *i2c = to_i2c_client(tcm_hcd->pdev->dev.parent); + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + mutex_lock(&tcm_hcd->io_ctrl_mutex); + + address = (unsigned char)addr; + + msg[0].addr = bdata->ubl_i2c_addr; + msg[0].flags = 0; + msg[0].len = 1; + msg[0].buf = &address; + + msg[1].addr = bdata->ubl_i2c_addr; + msg[1].flags = I2C_M_RD; + msg[1].len = length; + msg[1].buf = data; + + for (attempt = 0; attempt < XFER_ATTEMPTS; attempt++) { + if (i2c_transfer(i2c->adapter, msg, 2) == 2) { + retval = length; + goto exit; + } + LOGE(&i2c->dev, + "Transfer attempt %d failed\n", + attempt + 1); + + if (attempt + 1 == XFER_ATTEMPTS) { + retval = -EIO; + goto exit; + } + + msleep(20); + } + +exit: + mutex_unlock(&tcm_hcd->io_ctrl_mutex); + + return retval; +} + +static int syna_tcm_i2c_rmi_write(struct syna_tcm_hcd *tcm_hcd, + unsigned short addr, unsigned char *data, unsigned int length) +{ + int retval; + unsigned int attempt; + unsigned int byte_count; + struct i2c_msg msg; + struct i2c_client *i2c = to_i2c_client(tcm_hcd->pdev->dev.parent); + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + mutex_lock(&tcm_hcd->io_ctrl_mutex); + + byte_count = length + 1; + + retval = syna_tcm_i2c_alloc_mem(tcm_hcd, byte_count); + if (retval < 0) { + LOGE(&i2c->dev, + "Failed to allocate memory\n"); + goto exit; + } + + buf[0] = (unsigned char)addr; + retval = secure_memcpy(&buf[1], + buf_size - 1, + data, + length, + length); + if (retval < 0) { + LOGE(&i2c->dev, + "Failed to copy write data\n"); + goto exit; + } + + msg.addr = bdata->ubl_i2c_addr; + msg.flags = 0; + msg.len = byte_count; + msg.buf = buf; + + for (attempt = 0; attempt < XFER_ATTEMPTS; attempt++) { + if (i2c_transfer(i2c->adapter, &msg, 1) == 1) { + retval = length; + goto exit; + } + LOGE(&i2c->dev, + "Transfer attempt %d failed\n", + attempt + 1); + + if (attempt + 1 == XFER_ATTEMPTS) { + retval = -EIO; + goto exit; + } + + msleep(20); + } + +exit: + mutex_unlock(&tcm_hcd->io_ctrl_mutex); + + return retval; +} + +static int syna_tcm_i2c_read(struct syna_tcm_hcd *tcm_hcd, unsigned char *data, + unsigned int length) +{ + int retval; + unsigned int attempt; + struct i2c_msg msg; + struct i2c_client *i2c = to_i2c_client(tcm_hcd->pdev->dev.parent); + + mutex_lock(&tcm_hcd->io_ctrl_mutex); + + msg.addr = i2c->addr; + msg.flags = I2C_M_RD; + msg.len = length; + msg.buf = data; + + for (attempt = 0; attempt < XFER_ATTEMPTS; attempt++) { + if (i2c_transfer(i2c->adapter, &msg, 1) == 1) { + retval = length; + goto exit; + } + LOGE(&i2c->dev, + "Transfer attempt %d failed\n", + attempt + 1); + + if (attempt + 1 == XFER_ATTEMPTS) { + retval = -EIO; + goto exit; + } + + msleep(20); + } + +exit: + mutex_unlock(&tcm_hcd->io_ctrl_mutex); + + return retval; +} + +static int syna_tcm_i2c_write(struct syna_tcm_hcd *tcm_hcd, unsigned char *data, + unsigned int length) +{ + int retval; + unsigned int attempt; + struct i2c_msg msg; + struct i2c_client *i2c = to_i2c_client(tcm_hcd->pdev->dev.parent); + + mutex_lock(&tcm_hcd->io_ctrl_mutex); + + msg.addr = i2c->addr; + msg.flags = 0; + msg.len = length; + msg.buf = data; + + for (attempt = 0; attempt < XFER_ATTEMPTS; attempt++) { + if (i2c_transfer(i2c->adapter, &msg, 1) == 1) { + retval = length; + goto exit; + } + LOGE(&i2c->dev, + "Transfer attempt %d failed\n", + attempt + 1); + + if (attempt + 1 == XFER_ATTEMPTS) { + retval = -EIO; + goto exit; + } + + msleep(20); + } + +exit: + mutex_unlock(&tcm_hcd->io_ctrl_mutex); + + return retval; +} + +static int syna_tcm_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *dev_id) +{ + int retval; + + syna_tcm_i2c_device = platform_device_alloc(PLATFORM_DRIVER_NAME, 0); + if (!syna_tcm_i2c_device) { + LOGE(&i2c->dev, + "Failed to allocate platform device\n"); + return -ENOMEM; + } + +#ifdef CONFIG_OF + hw_if.bdata = devm_kzalloc(&i2c->dev, sizeof(*hw_if.bdata), GFP_KERNEL); + if (!hw_if.bdata) { + LOGE(&i2c->dev, + "Failed to allocate memory for board data\n"); + return -ENOMEM; + } + parse_dt(&i2c->dev, hw_if.bdata); +#else + hw_if.bdata = i2c->dev.platform_data; +#endif + + bus_io.type = BUS_I2C; + bus_io.read = syna_tcm_i2c_read; + bus_io.write = syna_tcm_i2c_write; + bus_io.rmi_read = syna_tcm_i2c_rmi_read; + bus_io.rmi_write = syna_tcm_i2c_rmi_write; + + hw_if.bus_io = &bus_io; + + syna_tcm_i2c_device->dev.parent = &i2c->dev; + syna_tcm_i2c_device->dev.platform_data = &hw_if; + + retval = platform_device_add(syna_tcm_i2c_device); + if (retval < 0) { + LOGE(&i2c->dev, + "Failed to add platform device\n"); + return retval; + } + + return 0; +} + +static int syna_tcm_i2c_remove(struct i2c_client *i2c) +{ + syna_tcm_i2c_device->dev.platform_data = NULL; + + platform_device_unregister(syna_tcm_i2c_device); + + return 0; +} + +static const struct i2c_device_id syna_tcm_id_table[] = { + {I2C_MODULE_NAME, 0}, + {}, +}; +MODULE_DEVICE_TABLE(i2c, syna_tcm_id_table); + +#ifdef CONFIG_OF +static struct of_device_id syna_tcm_of_match_table[] = { + { + .compatible = "synaptics,tcm-i2c", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, syna_tcm_of_match_table); +#else +#define syna_tcm_of_match_table NULL +#endif + +static struct i2c_driver syna_tcm_i2c_driver = { + .driver = { + .name = I2C_MODULE_NAME, + .owner = THIS_MODULE, + .of_match_table = syna_tcm_of_match_table, + }, + .probe = syna_tcm_i2c_probe, + .remove = syna_tcm_i2c_remove, + .id_table = syna_tcm_id_table, +}; + +int syna_tcm_bus_init(void) +{ + return i2c_add_driver(&syna_tcm_i2c_driver); +} +EXPORT_SYMBOL(syna_tcm_bus_init); + +void syna_tcm_bus_exit(void) +{ + kfree(buf); + + i2c_del_driver(&syna_tcm_i2c_driver); + + return; +} +EXPORT_SYMBOL(syna_tcm_bus_exit); + +MODULE_AUTHOR("Synaptics, Inc."); +MODULE_DESCRIPTION("Synaptics TCM I2C Bus Module"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_interface.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_interface.c new file mode 100644 index 000000000000..f315a278ae12 --- /dev/null +++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_interface.c @@ -0,0 +1,603 @@ +/* + * Synaptics TCM touchscreen driver + * + * Copyright (C) 2017 Synaptics Incorporated. All rights reserved. + * Copyright (C) 2020 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS + * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, + * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS. + * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION + * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED + * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES + * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' + * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. + * DOLLARS. + */ + +#include <linux/firmware.h> +#include "synaptics_tcm_core.h" + +#define SYSFS_DIR_NAME "xiaomi_interface" + +#define INTF_REPORT_TIMEOUT_100MS 30 + + +struct xiaomi_intf_hcd { + /* handler for synaptiucs tcm device */ + struct syna_tcm_hcd *tcm_hcd; + /* to create the sysfs */ + struct kobject *sysfs_dir; + /* flag to indicate the error out during the process */ + bool err_flag; + + /* for report image using */ + int *report_data; + unsigned char report_rows; + unsigned char report_cols; + unsigned char report_type; + bool report_is_ready; +}; + +DECLARE_COMPLETION(xiaomi_intf_remove_complete); + +static struct xiaomi_intf_hcd *intf_hcd; + +SHOW_STORE_PROTOTYPE(intf, get_rawordiff_data) + +static struct device_attribute *attrs[] = { + ATTRIFY(get_rawordiff_data), +}; + +/* + * helper function to set the report type + * input: + * 0 = raw image + * 1 = delta image + * + * return: + * true = valid report ; false = invalid report + */ +static bool intf_helper_set_report_type(int input) +{ + bool is_valid = false; + struct syna_tcm_hcd *tcm_hcd = intf_hcd->tcm_hcd; + + switch (input) { + case 0: /* raw image */ + intf_hcd->report_type = REPORT_RAW; + is_valid = true; + break; + case 1: /* delta image */ + intf_hcd->report_type = REPORT_DELTA; + is_valid = true; + break; + default: + LOGE(tcm_hcd->pdev->dev.parent, + "unknown input [0:raw/1:delta] (input = %d)\n", input); + is_valid = false; + break; + } + + return is_valid; +} +/* + * helper function to enable/disable the report stream + * input: + * true = enable / false = disable + * return: + * 0 = succeed ; otherwise, failure + */ +static int intf_helper_enable_report(bool enable) +{ + int retval; + unsigned char report_touch = REPORT_TOUCH; + struct syna_tcm_hcd *tcm_hcd = intf_hcd->tcm_hcd; + unsigned char command; + + /* to disable the touch report if delta/raw report stream is enabled */ + if (enable) { + retval = tcm_hcd->write_message(tcm_hcd, + CMD_DISABLE_REPORT, + &report_touch, + 1, + &tcm_hcd->resp.buf, + &tcm_hcd->resp.buf_size, + &tcm_hcd->resp.data_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "failed to disable touch report\n"); + return -EINVAL; + } + } + /* otherwise, resume the touch report */ + else { + retval = tcm_hcd->write_message(tcm_hcd, + CMD_ENABLE_REPORT, + &report_touch, + 1, + &tcm_hcd->resp.buf, + &tcm_hcd->resp.buf_size, + &tcm_hcd->resp.data_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "failed to disable touch report\n"); + return -EINVAL; + } + } + + if (enable) + command = CMD_ENABLE_REPORT; + else + command = CMD_DISABLE_REPORT; + + retval = tcm_hcd->write_message(tcm_hcd, + command, + &intf_hcd->report_type, + 1, + &tcm_hcd->resp.buf, + &tcm_hcd->resp.buf_size, + &tcm_hcd->resp.data_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "failed to write command %s\n", STR(command)); + return -EINVAL; + } + + return 0; +} + +/* + * function to get a raw/delta data image + * + * input: + * which - 0 = raw image + * 1 = delta image + * *data - an integer array containing (Tx rows * Rx columns) + * return: + * succeed- 0 + * fail - (-EINVAL) + */ +static int intf_helper_get_rawordiff_data(int which, int *data) +{ + int retval = -EINVAL; + struct syna_tcm_hcd *tcm_hcd = intf_hcd->tcm_hcd; + unsigned char timeout_count = 0; + short *p_data_16; + struct syna_tcm_buffer buf; + int i, j; + + if (!data) { + LOGE(tcm_hcd->pdev->dev.parent, + "invalid parameter, data buffer\n"); + goto exit; + } + + if (tcm_hcd->id_info.mode != MODE_APPLICATION || + tcm_hcd->app_status != APP_STATUS_OK) { + + intf_hcd->err_flag = true; + + LOGE(tcm_hcd->pdev->dev.parent, + "invalid app status (id_info.mode = 0x%x) (app_status = 0x%x)\n", + tcm_hcd->id_info.mode, tcm_hcd->app_status); + retval = -EINVAL; + goto exit; + } + + if (!intf_helper_set_report_type(which)) { + retval = -EINVAL; + LOGE(tcm_hcd->pdev->dev.parent, "failed to set report type\n"); + goto exit; + } + + intf_hcd->report_is_ready = false; + + intf_hcd->report_rows = + le2_to_uint(tcm_hcd->app_info.num_of_image_rows); + intf_hcd->report_cols = + le2_to_uint(tcm_hcd->app_info.num_of_image_cols); + + INIT_BUFFER(buf, false); + + /* send tcm command - to enable the report */ + if (intf_helper_enable_report(true) < 0) { + retval = -EINVAL; + LOGE(tcm_hcd->pdev->dev.parent, + "failed to enable the requested report\n"); + goto exit; + } + + /* waiting for the completion of requested report */ + do { + if (timeout_count == INTF_REPORT_TIMEOUT_100MS) + break; + + msleep(100); + timeout_count++; + } while (!intf_hcd->report_is_ready); + + if (timeout_count == INTF_REPORT_TIMEOUT_100MS) { + LOGE(tcm_hcd->pdev->dev.parent, + "timeout waiting for a report image\n"); + + intf_helper_enable_report(false); /* close the report stream */ + + retval = -EINVAL; + goto exit; + } + + /* clone the request report data */ + LOCK_BUFFER(buf); + + buf.buf = kzalloc(tcm_hcd->report.buffer.data_length, GFP_KERNEL); + if (!buf.buf) { + LOGE(tcm_hcd->pdev->dev.parent, + "failed to allocate temporary buffer\n"); + UNLOCK_BUFFER(buf); + + intf_helper_enable_report(false); /* close the report stream */ + + RELEASE_BUFFER(buf); + retval = -EINVAL; + goto exit; + } + buf.buf_size = tcm_hcd->report.buffer.data_length; + buf.data_length = 0; + + memcpy((void *)buf.buf, + (const void *)tcm_hcd->report.buffer.buf, + buf.buf_size); + buf.data_length = tcm_hcd->report.buffer.data_length; + + UNLOCK_BUFFER(buf); + + /* to disable the report stream */ + if (intf_helper_enable_report(false) < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "failed to disable the report\n"); + return -EINVAL; + } + + /* move data to the output buffer */ + p_data_16 = (short *)buf.buf; + for (i = 0; i < intf_hcd->report_rows; i++) { + for (j = 0; j < intf_hcd->report_cols; j++) { + data[i*intf_hcd->report_cols + j] = (int)*p_data_16; + + p_data_16++; + } + } + + retval = 0; + RELEASE_BUFFER(buf); + +exit: + return retval; +} + + +/* + * sysfs name - get_rawordiff_data + * description - funciton will call intf_helper_get_rawordiff_data to get + * a report image + * usage - + * $ echo [0/1] > get_rawordiff_data + */ +static ssize_t intf_sysfs_get_rawordiff_data_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int retval; + unsigned int input; + struct syna_tcm_hcd *tcm_hcd = intf_hcd->tcm_hcd; + int report_size; + + if (sscanf(buf, "%u", &input) != 1) + return -EINVAL; + + intf_hcd->err_flag = false; + + intf_hcd->report_rows = + le2_to_uint(tcm_hcd->app_info.num_of_image_rows); + intf_hcd->report_cols = + le2_to_uint(tcm_hcd->app_info.num_of_image_cols); + report_size = intf_hcd->report_rows * intf_hcd->report_cols; + + /* allocate the buffer for one report data */ + intf_hcd->report_data = kzalloc(report_size*sizeof(int), GFP_KERNEL); + if (!intf_hcd->report_data) { + + intf_hcd->err_flag = true; + + retval = -ENOMEM; + LOGE(tcm_hcd->pdev->dev.parent, + "failed to allocate mem for intf_hcd->report_data\n"); + goto exit; + } + + /* to get the requested report */ + retval = intf_helper_get_rawordiff_data((int)input, intf_hcd->report_data); + if (retval < 0) { + intf_hcd->err_flag = true; + + LOGE(tcm_hcd->pdev->dev.parent, + "failed to get the requested image (type: %x)\n", + input); + goto exit; + } + + retval = count; + +exit: + return retval; +} +/* + * sysfs name - get_rawordiff_data + * description - funciton will show the image data onto the stdout + * usage - + * $ cat get_rawordiff_data + */ +static ssize_t intf_sysfs_get_rawordiff_data_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int row, col; + int i, j; + int cnt; + int count = 0; + int *p_data; + + if (!intf_hcd->report_data) + return snprintf(buf, PAGE_SIZE, + "\nerror: report data is not allocated\n\n"); + + if (intf_hcd->err_flag) { + kfree(intf_hcd->report_data); + intf_hcd->report_data = NULL; + + return snprintf(buf, PAGE_SIZE, + "\nerror: unable to get the requested image\n\n"); + } + + /* print out the report data */ + row = intf_hcd->report_rows; + col = intf_hcd->report_cols; + + p_data = &intf_hcd->report_data[0]; + for (i = 0; i < row; i++) { + for (j = 0; j < col; j++) { + if (intf_hcd->report_type == REPORT_RAW) + cnt = snprintf(buf, PAGE_SIZE - count, "%-4d ", *p_data); + else + cnt = snprintf(buf, PAGE_SIZE - count, "%-3d ", *p_data); + + buf += cnt; + count += cnt; + + p_data++; + } + cnt = snprintf(buf, PAGE_SIZE - count, "\n"); + buf += cnt; + count += cnt; + } + + snprintf(buf, PAGE_SIZE - count, "\n"); + count++; + + /* release the allocated buffer */ + kfree(intf_hcd->report_data); + intf_hcd->report_data = NULL; + + return count; +} + +static ssize_t syna_data_dump_read(struct file *file, char __user *buf, size_t count, loff_t *pos) +{ + int retval; + int cnt = 0; + u8 *buffer = NULL; + + if (*pos != 0) + return -EINVAL; + buffer = vmalloc(PAGE_SIZE + PAGE_SIZE / 2); + if (!buffer) + return -ENOMEM; + retval = intf_sysfs_get_rawordiff_data_store(NULL, NULL, "0", 2); + if (retval < 0) { + snprintf(buffer, PAGE_SIZE, "get differ data error\n"); + goto out; + } + retval = intf_sysfs_get_rawordiff_data_show(NULL, NULL, buffer); + if (retval < 0) { + snprintf(buffer, PAGE_SIZE, "get differ data error\n"); + goto out; + } + cnt += strlen(buffer); + retval = intf_sysfs_get_rawordiff_data_store(NULL, NULL, "1", 2); + if (retval < 0) { + snprintf(buffer, PAGE_SIZE, "get raw data error\n"); + goto out; + } + retval = intf_sysfs_get_rawordiff_data_show(NULL, NULL, buffer + cnt); + if (retval < 0) { + snprintf(buffer, PAGE_SIZE, "get raw data error\n"); + goto out; + } + cnt = strlen(buffer); + + if (copy_to_user(buf, buffer, strlen(buffer))) { + retval = -EFAULT; + goto out; + } +out: + cnt = strlen(buffer); + *pos += cnt; + vfree(buffer); + buffer = NULL; + if (retval < 0) + return retval; + else + return cnt; +} + + +static const struct file_operations syna_data_dump_ops = { + .read = syna_data_dump_read, +}; + + +/* + * module initialization + * to allocate the struct xiaomi_intf_hcd, then create the sysfs files + */ +static int xiaomi_intf_init(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + int idx; + + LOGN(tcm_hcd->pdev->dev.parent, "+\n"); + + intf_hcd = kzalloc(sizeof(struct xiaomi_intf_hcd), GFP_KERNEL); + if (!intf_hcd) { + LOGE(tcm_hcd->pdev->dev.parent, + "failed to allocate memory for xiaomi_intf_hcd\n"); + return -ENOMEM; + } + + intf_hcd->tcm_hcd = tcm_hcd; + + intf_hcd->sysfs_dir = kobject_create_and_add(SYSFS_DIR_NAME, + tcm_hcd->sysfs_dir); + if (!intf_hcd->sysfs_dir) { + LOGE(tcm_hcd->pdev->dev.parent, + "failed to create sysfs directory\n"); + goto err_sysfs_create_dir; + } + + for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) { + retval = sysfs_create_file(intf_hcd->sysfs_dir, + &(*attrs[idx]).attr); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "failed to create sysfs file\n"); + goto err_sysfs_create_file; + } + } + + intf_hcd->err_flag = false; + intf_hcd->report_data = NULL; + intf_hcd->report_cols = 0; + intf_hcd->report_rows = 0; + proc_create("tp_data_dump", 0644, NULL, &syna_data_dump_ops); + + return 0; + +err_sysfs_create_file: + for (idx--; idx >= 0; idx--) + sysfs_remove_file(intf_hcd->sysfs_dir, &(*attrs[idx]).attr); + + kobject_put(intf_hcd->sysfs_dir); + +err_sysfs_create_dir: + kfree(intf_hcd); + intf_hcd = NULL; + + return retval; +} + +/* + * to remove the module and sysfs files as well + */ +static int xiaomi_intf_remove(struct syna_tcm_hcd *tcm_hcd) +{ + int idx; + + LOGN(tcm_hcd->pdev->dev.parent, "+\n"); + + if (!intf_hcd) + goto exit; + + for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) + sysfs_remove_file(intf_hcd->sysfs_dir, &(*attrs[idx]).attr); + + kobject_put(intf_hcd->sysfs_dir); + + kfree(intf_hcd); + intf_hcd = NULL; + +exit: + complete(&xiaomi_intf_remove_complete); + + return 0; +} + +/* + * call by synaptics_tcm_core.c when a tcm message is dispatched + */ +static int xiaomi_intf_syncbox(struct syna_tcm_hcd *tcm_hcd) +{ + if (!intf_hcd) + return 0; + + /* once to receive a requested report */ + if (tcm_hcd->report.id == intf_hcd->report_type) + intf_hcd->report_is_ready = true; + + return 0; +} + + +/* + * module definition, xiaomi_intf_module + */ + +static struct syna_tcm_module_cb xiaomi_intf_module = { + .type = TCM_XIAOMI_INTERFACE, + .init = xiaomi_intf_init, + .remove = xiaomi_intf_remove, + .syncbox = xiaomi_intf_syncbox, + .asyncbox = NULL, + .reset = NULL, + .suspend = NULL, + .resume = NULL, +}; + +static int __init xiaomi_intf_module_init(void) +{ + return syna_tcm_add_module(&xiaomi_intf_module, true); +} + +static void __exit xiaomi_intf_module_exit(void) +{ + syna_tcm_add_module(&xiaomi_intf_module, false); + + wait_for_completion(&xiaomi_intf_remove_complete); + + return; +} + +late_initcall(xiaomi_intf_module_init); +module_exit(xiaomi_intf_module_exit); + +MODULE_AUTHOR("Synaptics, Inc."); +MODULE_DESCRIPTION("Synaptics TCM XIAOMI Interface Module"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_recovery.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_recovery.c new file mode 100644 index 000000000000..cb7c37301d1b --- /dev/null +++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_recovery.c @@ -0,0 +1,900 @@ +/* + * Synaptics TCM touchscreen driver + * + * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved. + * + * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS + * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, + * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS. + * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION + * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED + * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES + * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' + * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. + * DOLLARS. + */ + +#include "synaptics_tcm_core.h" + +#define SET_UP_RECOVERY_MODE true + +#define ENABLE_SYSFS_INTERFACE true + +#define SYSFS_DIR_NAME "recovery" + +#define IHEX_BUF_SIZE (2048 * 1024) + +#define DATA_BUF_SIZE (512 * 1024) + +#define IHEX_RECORD_SIZE 14 + +#define PDT_START_ADDR 0x00e9 + +#define UBL_FN_NUMBER 0x35 + +#define F35_CHUNK_SIZE 16 + +#define F35_CHUNK_SIZE_WORDS 8 + +#define F35_ERASE_ALL_WAIT_MS 5000 + +#define F35_ERASE_ALL_POLL_MS 100 + +#define F35_DATA5_OFFSET 5 + +#define F35_CTRL3_OFFSET 18 + +#define F35_RESET_COMMAND 16 + +#define F35_ERASE_ALL_COMMAND 3 + +#define F35_WRITE_CHUNK_COMMAND 2 + +#define F35_READ_FLASH_STATUS_COMMAND 1 + +struct rmi_pdt_entry { + unsigned char query_base_addr; + unsigned char command_base_addr; + unsigned char control_base_addr; + unsigned char data_base_addr; + unsigned char intr_src_count:3; + unsigned char reserved_1:2; + unsigned char fn_version:2; + unsigned char reserved_2:1; + unsigned char fn_number; +} __packed; + +struct rmi_addr { + unsigned short query_base; + unsigned short command_base; + unsigned short control_base; + unsigned short data_base; +}; + +struct recovery_hcd { + bool set_up_recovery_mode; + unsigned char chunk_buf[F35_CHUNK_SIZE + 3]; + unsigned char out_buf[3]; + unsigned char *ihex_buf; + unsigned char *data_buf; + unsigned int ihex_size; + unsigned int ihex_records; + unsigned int data_entries; + struct kobject *sysfs_dir; + struct rmi_addr f35_addr; + struct syna_tcm_hcd *tcm_hcd; +}; + +DECLARE_COMPLETION(recovery_remove_complete); + +static struct recovery_hcd *recovery_hcd; + +static int recovery_do_recovery(void); + +STORE_PROTOTYPE(recovery, recovery) + +static struct device_attribute *attrs[] = { + ATTRIFY(recovery), +}; + +static ssize_t recovery_sysfs_ihex_store(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count); + +static struct bin_attribute bin_attr = { + .attr = { + .name = "ihex", + .mode = (S_IWUSR | S_IWGRP), + }, + .size = 0, + .write = recovery_sysfs_ihex_store, +}; + +static ssize_t recovery_sysfs_recovery_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int retval; + unsigned int input; + struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd; + + if (sscanf(buf, "%u", &input) != 1) + return -EINVAL; + + if (input == 1) + recovery_hcd->set_up_recovery_mode = true; + else if (input == 2) + recovery_hcd->set_up_recovery_mode = false; + else + return -EINVAL; + + mutex_lock(&tcm_hcd->extif_mutex); + + if (recovery_hcd->ihex_size == 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get ihex data\n"); + retval = -EINVAL; + goto exit; + } + + if (recovery_hcd->ihex_size % IHEX_RECORD_SIZE) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid ihex data\n"); + retval = -EINVAL; + goto exit; + } + + recovery_hcd->ihex_records = recovery_hcd->ihex_size / IHEX_RECORD_SIZE; + + retval = recovery_do_recovery(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do recovery\n"); + goto exit; + } + + retval = count; + +exit: + recovery_hcd->set_up_recovery_mode = SET_UP_RECOVERY_MODE; + + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t recovery_sysfs_ihex_store(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + retval = secure_memcpy(&recovery_hcd->ihex_buf[pos], + IHEX_BUF_SIZE - pos, + buf, + count, + count); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy ihex data\n"); + recovery_hcd->ihex_size = 0; + goto exit; + } + + recovery_hcd->ihex_size = pos + count; + + retval = count; + +exit: + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static int recovery_device_reset(void) +{ + int retval; + unsigned char command; + struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd; + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + command = F35_RESET_COMMAND; + + retval = syna_tcm_rmi_write(tcm_hcd, + recovery_hcd->f35_addr.control_base + F35_CTRL3_OFFSET, + &command, + sizeof(command)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write F$35 command\n"); + return retval; + } + + msleep(bdata->reset_delay_ms); + + return 0; +} + +static int recovery_add_data_entry(unsigned char data) +{ + struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd; + + if (recovery_hcd->data_entries >= DATA_BUF_SIZE) { + LOGE(tcm_hcd->pdev->dev.parent, + "Reached data buffer size limit\n"); + return -EINVAL; + } + + recovery_hcd->data_buf[recovery_hcd->data_entries++] = data; + + return 0; +} + +static int recovery_add_padding(unsigned int *words) +{ + int retval; + unsigned int padding; + struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd; + + padding = (F35_CHUNK_SIZE_WORDS - *words % F35_CHUNK_SIZE_WORDS); + padding %= F35_CHUNK_SIZE_WORDS; + + while (padding) { + retval = recovery_add_data_entry(0xff); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to add data entry\n"); + return retval; + } + + retval = recovery_add_data_entry(0xff); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to add data entry\n"); + return retval; + } + + (*words)++; + padding--; + } + + return 0; +} + +static int recovery_parse_ihex(void) +{ + int retval; + unsigned char colon; + unsigned char *buf; + unsigned int addr; + unsigned int type; + unsigned int addrl; + unsigned int addrh; + unsigned int data0; + unsigned int data1; + unsigned int count; + unsigned int words; + unsigned int offset; + unsigned int record; + struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd; + + words = 0; + + offset = 0; + + buf = recovery_hcd->ihex_buf; + + recovery_hcd->data_entries = 0; + + for (record = 0; record < recovery_hcd->ihex_records; record++) { + buf[(record + 1) * IHEX_RECORD_SIZE - 1] = 0x00; + retval = sscanf(&buf[record * IHEX_RECORD_SIZE], + "%c%02x%02x%02x%02x%02x%02x", + &colon, + &count, + &addrh, + &addrl, + &type, + &data0, + &data1); + if (retval != 7) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read ihex record\n"); + return -EINVAL; + } + + if (type == 0x00) { + if ((words % F35_CHUNK_SIZE_WORDS) == 0) { + addr = (addrh << 8) + addrl; + addr += offset; + addr >>= 4; + + retval = recovery_add_data_entry(addr); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to add data entry\n"); + return retval; + } + + retval = recovery_add_data_entry(addr >> 8); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to add data entry\n"); + return retval; + } + } + + retval = recovery_add_data_entry(data0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to add data entry\n"); + return retval; + } + + retval = recovery_add_data_entry(data1); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to add data entry\n"); + return retval; + } + + words++; + } else if (type == 0x02) { + retval = recovery_add_padding(&words); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to add padding\n"); + return retval; + } + + offset = (data0 << 8) + data1; + offset <<= 4; + } + } + + retval = recovery_add_padding(&words); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to add padding\n"); + return retval; + } + + return 0; +} + +static int recovery_check_status(void) +{ + int retval; + unsigned char status; + struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd; + + retval = syna_tcm_rmi_read(tcm_hcd, + recovery_hcd->f35_addr.data_base, + &status, + sizeof(status)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read status\n"); + return retval; + } + + status = status & 0x1f; + + if (status != 0x00) { + LOGE(tcm_hcd->pdev->dev.parent, + "Recovery mode status = 0x%02x\n", + status); + return -EINVAL; + } + + return 0; +} + +static int recovery_write_flash(void) +{ + int retval; + unsigned char *data_ptr; + unsigned int chunk_buf_size; + unsigned int chunk_data_size; + unsigned int entries_written; + unsigned int entries_to_write; + struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd; + + entries_written = 0; + + data_ptr = recovery_hcd->data_buf; + + chunk_buf_size = sizeof(recovery_hcd->chunk_buf); + + chunk_data_size = chunk_buf_size - 1; + + recovery_hcd->chunk_buf[chunk_buf_size - 1] = F35_WRITE_CHUNK_COMMAND; + + while (entries_written < recovery_hcd->data_entries) { + entries_to_write = F35_CHUNK_SIZE + 2; + + retval = secure_memcpy(recovery_hcd->chunk_buf, + chunk_buf_size - 1, + data_ptr, + recovery_hcd->data_entries - entries_written, + entries_to_write); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy chunk data\n"); + return retval; + } + + retval = syna_tcm_rmi_write(tcm_hcd, + recovery_hcd->f35_addr.control_base, + recovery_hcd->chunk_buf, + chunk_buf_size); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write chunk data\n"); + return retval; + } + + data_ptr += entries_to_write; + entries_written += entries_to_write; + } + + retval = recovery_check_status(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get no error recovery mode status\n"); + return retval; + } + + return 0; +} + +static int recovery_poll_erase_completion(void) +{ + int retval; + unsigned char status; + unsigned char command; + unsigned char data_base; + unsigned int timeout; + struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd; + + timeout = F35_ERASE_ALL_WAIT_MS; + + data_base = recovery_hcd->f35_addr.data_base; + + do { + command = F35_READ_FLASH_STATUS_COMMAND; + + retval = syna_tcm_rmi_write(tcm_hcd, + recovery_hcd->f35_addr.command_base, + &command, + sizeof(command)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write F$35 command\n"); + return retval; + } + + do { + retval = syna_tcm_rmi_read(tcm_hcd, + recovery_hcd->f35_addr.command_base, + &command, + sizeof(command)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read command status\n"); + return retval; + } + + if (command == 0x00) + break; + + if (timeout == 0) + break; + + msleep(F35_ERASE_ALL_POLL_MS); + timeout -= F35_ERASE_ALL_POLL_MS; + } while (true); + + if (command != 0 && timeout == 0) { + retval = -EINVAL; + goto exit; + } + + retval = syna_tcm_rmi_read(tcm_hcd, + data_base + F35_DATA5_OFFSET, + &status, + sizeof(status)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read flash status\n"); + return retval; + } + + if ((status & 0x01) == 0x00) + break; + + if (timeout == 0) { + retval = -EINVAL; + goto exit; + } + + msleep(F35_ERASE_ALL_POLL_MS); + timeout -= F35_ERASE_ALL_POLL_MS; + } while (true); + + retval = 0; + +exit: + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get erase completion\n"); + } + + return retval; +} + +static int recovery_erase_flash(void) +{ + int retval; + unsigned char command; + struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd; + + command = F35_ERASE_ALL_COMMAND; + + retval = syna_tcm_rmi_write(tcm_hcd, + recovery_hcd->f35_addr.control_base + F35_CTRL3_OFFSET, + &command, + sizeof(command)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write F$35 command\n"); + return retval; + } + + if (recovery_hcd->f35_addr.command_base) { + retval = recovery_poll_erase_completion(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to wait for erase completion\n"); + return retval; + } + } else { + msleep(F35_ERASE_ALL_WAIT_MS); + } + + retval = recovery_check_status(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get no error recovery mode status\n"); + return retval; + } + + return 0; +} + +static int recovery_set_up_recovery_mode(void) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd; + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + retval = tcm_hcd->identify(tcm_hcd, true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do identification\n"); + return retval; + } + + if (tcm_hcd->id_info.mode == MODE_APPLICATION) { + retval = tcm_hcd->switch_mode(tcm_hcd, FW_MODE_BOOTLOADER); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enter bootloader mode\n"); + return retval; + } + } + + retval = tcm_hcd->write_message(tcm_hcd, + recovery_hcd->out_buf[0], + &recovery_hcd->out_buf[1], + 2, + NULL, + NULL, + NULL, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_REBOOT_TO_ROM_BOOTLOADER)); + return retval; + } + + msleep(bdata->reset_delay_ms); + + return 0; +} + +static int recovery_do_recovery(void) +{ + int retval; + struct rmi_pdt_entry p_entry; + struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd; + + retval = recovery_parse_ihex(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to parse ihex data\n"); + return retval; + } + + if (recovery_hcd->set_up_recovery_mode) { + retval = recovery_set_up_recovery_mode(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to set up recovery mode\n"); + return retval; + } + } + + tcm_hcd->update_watchdog(tcm_hcd, false); + + retval = syna_tcm_rmi_read(tcm_hcd, + PDT_START_ADDR, + (unsigned char *)&p_entry, + sizeof(p_entry)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read PDT entry\n"); + return retval; + } + + if (p_entry.fn_number != UBL_FN_NUMBER) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to find F$35\n"); + return -ENODEV; + } + + recovery_hcd->f35_addr.query_base = p_entry.query_base_addr; + recovery_hcd->f35_addr.command_base = p_entry.command_base_addr; + recovery_hcd->f35_addr.control_base = p_entry.control_base_addr; + recovery_hcd->f35_addr.data_base = p_entry.data_base_addr; + + LOGN(tcm_hcd->pdev->dev.parent, + "Start of recovery\n"); + + retval = recovery_erase_flash(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to erase flash\n"); + return retval; + } + + LOGN(tcm_hcd->pdev->dev.parent, + "Flash erased\n"); + + retval = recovery_write_flash(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write to flash\n"); + return retval; + } + + LOGN(tcm_hcd->pdev->dev.parent, + "Flash written\n"); + + retval = recovery_device_reset(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reset\n"); + return retval; + } + + LOGN(tcm_hcd->pdev->dev.parent, + "End of recovery\n"); + + if (recovery_hcd->set_up_recovery_mode) + return 0; + + tcm_hcd->update_watchdog(tcm_hcd, true); + + retval = tcm_hcd->enable_irq(tcm_hcd, true, NULL); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enable interrupt\n"); + return retval; + } + + retval = tcm_hcd->identify(tcm_hcd, true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do identification\n"); + return retval; + } + + if (tcm_hcd->id_info.mode != MODE_APPLICATION) { + retval = tcm_hcd->switch_mode(tcm_hcd, FW_MODE_APPLICATION); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run application firmware\n"); + return retval; + } + } + + return 0; +} + +static int recovery_init(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + int idx; + + recovery_hcd = kzalloc(sizeof(*recovery_hcd), GFP_KERNEL); + if (!recovery_hcd) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for recovery_hcd\n"); + return -ENOMEM; + } + + recovery_hcd->ihex_buf = kzalloc(IHEX_BUF_SIZE, GFP_KERNEL); + if (!recovery_hcd->ihex_buf) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for recovery_hcd->ihex_buf\n"); + goto err_allocate_ihex_buf; + } + + recovery_hcd->data_buf = kzalloc(DATA_BUF_SIZE, GFP_KERNEL); + if (!recovery_hcd->data_buf) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for recovery_hcd->data_buf\n"); + goto err_allocate_data_buf; + } + + recovery_hcd->tcm_hcd = tcm_hcd; + + recovery_hcd->set_up_recovery_mode = SET_UP_RECOVERY_MODE; + + recovery_hcd->out_buf[0] = CMD_REBOOT_TO_ROM_BOOTLOADER; + recovery_hcd->out_buf[1] = 0; + recovery_hcd->out_buf[2] = 0; + + if (ENABLE_SYSFS_INTERFACE == false) + return 0; + + recovery_hcd->sysfs_dir = kobject_create_and_add(SYSFS_DIR_NAME, + tcm_hcd->sysfs_dir); + if (!recovery_hcd->sysfs_dir) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create sysfs directory\n"); + retval = -EINVAL; + goto err_sysfs_create_dir; + } + + for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) { + retval = sysfs_create_file(recovery_hcd->sysfs_dir, + &(*attrs[idx]).attr); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create sysfs file\n"); + goto err_sysfs_create_file; + } + } + + retval = sysfs_create_bin_file(recovery_hcd->sysfs_dir, &bin_attr); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create sysfs bin file\n"); + goto err_sysfs_create_bin_file; + } + + return 0; + +err_sysfs_create_bin_file: +err_sysfs_create_file: + for (idx--; idx >= 0; idx--) + sysfs_remove_file(recovery_hcd->sysfs_dir, &(*attrs[idx]).attr); + + kobject_put(recovery_hcd->sysfs_dir); + +err_sysfs_create_dir: + kfree(recovery_hcd->data_buf); +err_allocate_data_buf: + kfree(recovery_hcd->ihex_buf); +err_allocate_ihex_buf: + kfree(recovery_hcd); + recovery_hcd = NULL; + + return retval; +} + +static int recovery_remove(struct syna_tcm_hcd *tcm_hcd) +{ + int idx; + + if (!recovery_hcd) + goto exit; + + if (ENABLE_SYSFS_INTERFACE == true) { + sysfs_remove_bin_file(recovery_hcd->sysfs_dir, &bin_attr); + + for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) { + sysfs_remove_file(recovery_hcd->sysfs_dir, + &(*attrs[idx]).attr); + } + + kobject_put(recovery_hcd->sysfs_dir); + } + + kfree(recovery_hcd->data_buf); + kfree(recovery_hcd->ihex_buf); + kfree(recovery_hcd); + recovery_hcd = NULL; + +exit: + complete(&recovery_remove_complete); + + return 0; +} + +static int recovery_reset(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + + if (!recovery_hcd) { + retval = recovery_init(tcm_hcd); + return retval; + } + + return 0; +} + +static struct syna_tcm_module_cb recovery_module = { + .type = TCM_RECOVERY, + .init = recovery_init, + .remove = recovery_remove, + .syncbox = NULL, + .asyncbox = NULL, + .reset = recovery_reset, + .suspend = NULL, + .resume = NULL, + .early_suspend = NULL, +}; + +static int __init recovery_module_init(void) +{ + return syna_tcm_add_module(&recovery_module, true); +} + +static void __exit recovery_module_exit(void) +{ + syna_tcm_add_module(&recovery_module, false); + + wait_for_completion(&recovery_remove_complete); + + return; +} + +late_initcall(recovery_module_init); +module_exit(recovery_module_exit); + +MODULE_AUTHOR("Synaptics, Inc."); +MODULE_DESCRIPTION("Synaptics TCM Recovery Module"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_reflash.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_reflash.c new file mode 100644 index 000000000000..698916c1af34 --- /dev/null +++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_reflash.c @@ -0,0 +1,2262 @@ +/* + * Synaptics TCM touchscreen driver + * + * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved. + * + * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS + * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, + * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS. + * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION + * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED + * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES + * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' + * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. + * DOLLARS. + */ + +#include <linux/crc32.h> +#include <linux/firmware.h> +#include "synaptics_tcm_core.h" + +#define STARTUP_REFLASH +#define FORCE_REFLASH false + +#define DISPLAY_REFLASH true + +#define ENABLE_SYSFS_INTERFACE true + +#define SYSFS_DIR_NAME "reflash" + +#define CUSTOM_DIR_NAME "custom" + +#define FW_IMAGE_NAME "synaptics_boe_4320.fw" + +#define BOOT_CONFIG_ID "BOOT_CONFIG" + +#define APP_CODE_ID "APP_CODE" + +#define PROD_TEST_ID "APP_PROD_TEST" + +#define APP_CONFIG_ID "APP_CONFIG" + +#define DISP_CONFIG_ID "DISPLAY" + +#define FB_READY_COUNT 1 + +#define FB_READY_WAIT_MS 100 + +#define FB_READY_TIMEOUT_S 130 + +#define IMAGE_FILE_MAGIC_VALUE 0x4818472b + +#define FLASH_AREA_MAGIC_VALUE 0x7c05e516 + +#define BOOT_CONFIG_SIZE 8 + +#define BOOT_CONFIG_SLOTS 16 + +#define IMAGE_BUF_SIZE (512 * 1024) + +#define ERASE_FLASH_DELAY_MS 500 + +#define WRITE_FLASH_DELAY_MS 20 + +#define REFLASH (1 << 0) + +#define FORCE_UPDATE (1 << 1) + +#define APP_CFG_UPDATE (1 << 2) + +#define DISP_CFG_UPDATE (1 << 3) + +#define BOOT_CFG_UPDATE (1 << 4) + +#define BOOT_CFG_LOCKDOWN (1 << 5) + +#define reflash_write(p_name) \ +static int reflash_write_##p_name(void) \ +{ \ + int retval; \ + unsigned int size; \ + unsigned int flash_addr; \ + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; \ + const unsigned char *data; \ +\ + data = reflash_hcd->image_info.p_name.data; \ + size = reflash_hcd->image_info.p_name.size; \ + flash_addr = reflash_hcd->image_info.p_name.flash_addr; \ +\ + retval = reflash_write_flash(flash_addr, data, size); \ + if (retval < 0) { \ + LOGE(tcm_hcd->pdev->dev.parent, \ + "Failed to write to flash\n"); \ + return retval; \ + } \ +\ + return 0; \ +} + +#define reflash_erase(p_name) \ +static int reflash_erase_##p_name(void) \ +{ \ + int retval; \ + unsigned int size; \ + unsigned int flash_addr; \ + unsigned int page_start; \ + unsigned int page_count; \ + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; \ +\ + flash_addr = reflash_hcd->image_info.p_name.flash_addr; \ +\ + page_start = flash_addr / reflash_hcd->page_size; \ +\ + size = reflash_hcd->image_info.p_name.size; \ + page_count = ceil_div(size, reflash_hcd->page_size); \ +\ + LOGD(tcm_hcd->pdev->dev.parent, \ + "Page start = %d\n", \ + page_start); \ +\ + LOGD(tcm_hcd->pdev->dev.parent, \ + "Page count = %d\n", \ + page_count); \ +\ + retval = reflash_erase_flash(page_start, page_count); \ + if (retval < 0) { \ + LOGE(tcm_hcd->pdev->dev.parent, \ + "Failed to erase flash pages\n"); \ + return retval; \ + } \ +\ + return 0; \ +} + +#define reflash_update(p_name) \ +static int reflash_update_##p_name(bool reset) \ +{ \ + int retval; \ + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; \ +\ + retval = reflash_set_up_flash_access(); \ + if (retval < 0) { \ + LOGE(tcm_hcd->pdev->dev.parent, \ + "Failed to set up flash access\n"); \ + return retval; \ + } \ +\ + tcm_hcd->update_watchdog(tcm_hcd, false); \ +\ + retval = reflash_check_##p_name(); \ + if (retval < 0) { \ + LOGE(tcm_hcd->pdev->dev.parent, \ + "Failed "#p_name" partition check\n"); \ + reset = true; \ + goto reset; \ + } \ +\ + retval = reflash_erase_##p_name(); \ + if (retval < 0) { \ + LOGE(tcm_hcd->pdev->dev.parent, \ + "Failed to erase "#p_name" partition\n"); \ + reset = true; \ + goto reset; \ + } \ +\ + LOGN(tcm_hcd->pdev->dev.parent, \ + "Partition erased ("#p_name")\n"); \ +\ + retval = reflash_write_##p_name(); \ + if (retval < 0) { \ + LOGE(tcm_hcd->pdev->dev.parent, \ + "Failed to write "#p_name" partition\n"); \ + reset = true; \ + goto reset; \ + } \ +\ + LOGN(tcm_hcd->pdev->dev.parent, \ + "Partition written ("#p_name")\n"); \ +\ + retval = 0; \ +\ +reset: \ + if (!reset) \ + goto exit; \ +\ + if (tcm_hcd->reset(tcm_hcd, false, true) < 0) { \ + LOGE(tcm_hcd->pdev->dev.parent, \ + "Failed to do reset\n"); \ + } \ +\ +exit: \ + tcm_hcd->update_watchdog(tcm_hcd, true); \ +\ + return retval; \ +} + +#define reflash_show_data() \ +{ \ + LOCK_BUFFER(reflash_hcd->read); \ +\ + readlen = MIN(count, reflash_hcd->read.data_length - pos); \ +\ + retval = secure_memcpy(buf, \ + count, \ + &reflash_hcd->read.buf[pos], \ + reflash_hcd->read.buf_size - pos, \ + readlen); \ + if (retval < 0) { \ + LOGE(tcm_hcd->pdev->dev.parent, \ + "Failed to copy read data\n"); \ + } else { \ + retval = readlen; \ + } \ +\ + UNLOCK_BUFFER(reflash_hcd->read); \ +} + +enum update_area { + NONE = 0, + FIRMWARE_CONFIG, + CONFIG_ONLY, +}; + +struct app_config_header { + unsigned short magic_value[4]; + unsigned char checksum[4]; + unsigned char length[2]; + unsigned char build_id[4]; + unsigned char customer_config_id[16]; +}; + +struct area_descriptor { + unsigned char magic_value[4]; + unsigned char id_string[16]; + unsigned char flags[4]; + unsigned char flash_addr_words[4]; + unsigned char length[4]; + unsigned char checksum[4]; +}; + +struct block_data { + const unsigned char *data; + unsigned int size; + unsigned int flash_addr; +}; + +struct image_info { + struct block_data boot_config; + struct block_data app_firmware; + struct block_data prod_test_firmware; + struct block_data app_config; + struct block_data disp_config; +}; + +struct image_header { + unsigned char magic_value[4]; + unsigned char num_of_areas[4]; +}; + +struct boot_config { + union { + unsigned char i2c_address; + struct { + unsigned char cpha:1; + unsigned char cpol:1; + unsigned char word0_b2__7:6; + } __packed; + }; + unsigned char attn_polarity:1; + unsigned char attn_drive:2; + unsigned char attn_pullup:1; + unsigned char word0_b12__14:3; + unsigned char used:1; + unsigned short customer_part_id; + unsigned short boot_timeout; + unsigned short continue_on_reset:1; + unsigned short word3_b1__15:15; +} __packed; + +struct reflash_hcd { + bool force_update; + bool disp_cfg_update; + const unsigned char *image; + unsigned char *image_buf; + unsigned int image_size; + unsigned int page_size; + unsigned int write_block_size; + unsigned int max_write_payload_size; + const struct firmware *fw_entry; + struct mutex reflash_mutex; + struct kobject *sysfs_dir; + struct kobject *custom_dir; + struct work_struct work; + struct workqueue_struct *workqueue; + struct image_info image_info; + struct syna_tcm_buffer out; + struct syna_tcm_buffer resp; + struct syna_tcm_buffer read; + struct syna_tcm_hcd *tcm_hcd; +}; + +DECLARE_COMPLETION(reflash_remove_complete); + +static struct reflash_hcd *reflash_hcd; + +static int reflash_get_fw_image(void); + +static int reflash_read_data(enum flash_area area, bool run_app_firmware, + struct syna_tcm_buffer *output); + +static int reflash_update_custom_otp(const unsigned char *data, + unsigned int offset, unsigned int datalen); + +static int reflash_update_custom_lcm(const unsigned char *data, + unsigned int offset, unsigned int datalen); + +static int reflash_update_custom_oem(const unsigned char *data, + unsigned int offset, unsigned int datalen); + +static int reflash_update_boot_config(bool lock); + +static int reflash_update_app_config(bool reset); + +static int reflash_update_disp_config(bool reset); + +static int reflash_do_reflash(void); + +STORE_PROTOTYPE(reflash, reflash) + +static struct device_attribute *attrs[] = { + ATTRIFY(reflash), +}; + +static ssize_t reflash_sysfs_image_store(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count); + +static ssize_t reflash_sysfs_lockdown_show(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count); + +static ssize_t reflash_sysfs_lockdown_store(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count); + +static ssize_t reflash_sysfs_lcm_show(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count); + +static ssize_t reflash_sysfs_lcm_store(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count); + +static ssize_t reflash_sysfs_oem_show(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count); + +static ssize_t reflash_sysfs_oem_store(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count); + +static struct bin_attribute bin_attrs[] = { + { + .attr = { + .name = "image", + .mode = (S_IWUSR | S_IWGRP), + }, + .size = 0, + .write = reflash_sysfs_image_store, + }, + { + .attr = { + .name = "lockdown", + .mode = (S_IRUGO | S_IWUSR | S_IWGRP), + }, + .size = 0, + .read = reflash_sysfs_lockdown_show, + .write = reflash_sysfs_lockdown_store, + }, + { + .attr = { + .name = "lcm", + .mode = (S_IRUGO | S_IWUSR | S_IWGRP), + }, + .size = 0, + .read = reflash_sysfs_lcm_show, + .write = reflash_sysfs_lcm_store, + }, + { + .attr = { + .name = "oem", + .mode = (S_IRUGO | S_IWUSR | S_IWGRP), + }, + .size = 0, + .read = reflash_sysfs_oem_show, + .write = reflash_sysfs_oem_store, + }, +}; + +static ssize_t reflash_sysfs_reflash_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int retval; + unsigned int input; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + if (sscanf(buf, "%u", &input) != 1) + return -EINVAL; + + mutex_lock(&tcm_hcd->extif_mutex); + + pm_stay_awake(&tcm_hcd->pdev->dev); + + mutex_lock(&reflash_hcd->reflash_mutex); + + if (reflash_hcd->image_size != 0) + reflash_hcd->image = reflash_hcd->image_buf; + + reflash_hcd->force_update = input & FORCE_UPDATE ? true : false; + + if (input & REFLASH || input & FORCE_UPDATE) { + retval = reflash_do_reflash(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reflash\n"); + goto exit; + } + } + + if ((input & ~(REFLASH | FORCE_UPDATE)) == 0) { + retval = count; + goto exit; + } + + retval = reflash_get_fw_image(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get firmware image\n"); + goto exit; + } + + if (input & BOOT_CFG_LOCKDOWN) { + retval = reflash_update_boot_config(true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to lockdown boot config\n"); + goto exit; + } + } else if (input & BOOT_CFG_UPDATE) { + retval = reflash_update_boot_config(false); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to update boot config\n"); + goto exit; + } + } + + if (input & REFLASH || input & FORCE_UPDATE) { + retval = count; + goto exit; + } + + if (input & DISP_CFG_UPDATE) { + if (input & APP_CFG_UPDATE) + retval = reflash_update_disp_config(false); + else + retval = reflash_update_disp_config(true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to reflash display config\n"); + goto exit; + } + } + + if (input & APP_CFG_UPDATE) { + retval = reflash_update_app_config(true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to reflash application config\n"); + goto exit; + } + } + + retval = count; + +exit: + if (reflash_hcd->fw_entry) { + release_firmware(reflash_hcd->fw_entry); + reflash_hcd->fw_entry = NULL; + } + + reflash_hcd->image = NULL; + reflash_hcd->image_size = 0; + reflash_hcd->force_update = FORCE_REFLASH; + + mutex_unlock(&reflash_hcd->reflash_mutex); + + pm_relax(&tcm_hcd->pdev->dev); + + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t reflash_sysfs_image_store(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + retval = secure_memcpy(&reflash_hcd->image_buf[pos], + IMAGE_BUF_SIZE - pos, + buf, + count, + count); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy firmware image data\n"); + reflash_hcd->image_size = 0; + goto exit; + } + + reflash_hcd->image_size = pos + count; + + retval = count; + +exit: + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} +static ssize_t reflash_sysfs_lockdown_show(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count) +{ + int retval; + unsigned int readlen; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + int i = 0; + + mutex_lock(&tcm_hcd->extif_mutex); + + mutex_lock(&reflash_hcd->reflash_mutex); + + retval = reflash_read_data(CUSTOM_OTP, true, NULL); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read lockdown data\n"); + goto exit; + } + for (i = 0; i < LOCKDOWN_SIZE; i++) + pr_info("%x ", reflash_hcd->read.buf[i]); + + reflash_show_data(); + +exit: + mutex_unlock(&reflash_hcd->reflash_mutex); + + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t reflash_sysfs_lockdown_store(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + pm_stay_awake(&tcm_hcd->pdev->dev); + + mutex_lock(&reflash_hcd->reflash_mutex); + + retval = reflash_update_custom_otp(buf, pos, count); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to update custom OTP data\n"); + goto exit; + } + + retval = count; + +exit: + mutex_unlock(&reflash_hcd->reflash_mutex); + + pm_relax(&tcm_hcd->pdev->dev); + + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t reflash_sysfs_lcm_show(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count) +{ + int retval; + unsigned int readlen; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + mutex_lock(&reflash_hcd->reflash_mutex); + + retval = reflash_read_data(CUSTOM_LCM, true, NULL); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read LCM data\n"); + goto exit; + } + + reflash_show_data(); + +exit: + mutex_unlock(&reflash_hcd->reflash_mutex); + + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t reflash_sysfs_lcm_store(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + pm_stay_awake(&tcm_hcd->pdev->dev); + + mutex_lock(&reflash_hcd->reflash_mutex); + + retval = reflash_update_custom_lcm(buf, pos, count); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to update custom LCM data\n"); + goto exit; + } + + retval = count; + +exit: + mutex_unlock(&reflash_hcd->reflash_mutex); + + pm_relax(&tcm_hcd->pdev->dev); + + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t reflash_sysfs_oem_show(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count) +{ + int retval; + unsigned int readlen; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + mutex_lock(&reflash_hcd->reflash_mutex); + + retval = reflash_read_data(CUSTOM_OEM, true, NULL); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read OEM data\n"); + goto exit; + } + + reflash_show_data(); + +exit: + mutex_unlock(&reflash_hcd->reflash_mutex); + + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t reflash_sysfs_oem_store(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + pm_stay_awake(&tcm_hcd->pdev->dev); + + mutex_lock(&reflash_hcd->reflash_mutex); + + retval = reflash_update_custom_oem(buf, pos, count); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to update custom OEM data\n"); + goto exit; + } + + retval = count; + +exit: + mutex_unlock(&reflash_hcd->reflash_mutex); + + pm_relax(&tcm_hcd->pdev->dev); + + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static int reflash_set_up_flash_access(void) +{ + int retval; + unsigned int temp; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + retval = tcm_hcd->identify(tcm_hcd, true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do identification\n"); + return retval; + } + + if (tcm_hcd->id_info.mode == MODE_APPLICATION) { + retval = tcm_hcd->switch_mode(tcm_hcd, FW_MODE_BOOTLOADER); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enter bootloader mode\n"); + return retval; + } + } + + temp = tcm_hcd->boot_info.write_block_size_words; + reflash_hcd->write_block_size = temp * 2; + + temp = le2_to_uint(tcm_hcd->boot_info.erase_page_size_words); + reflash_hcd->page_size = temp * 2; + + temp = le2_to_uint(tcm_hcd->boot_info.max_write_payload_size); + reflash_hcd->max_write_payload_size = temp; + + LOGD(tcm_hcd->pdev->dev.parent, + "Write block size = %d\n", + reflash_hcd->write_block_size); + + LOGD(tcm_hcd->pdev->dev.parent, + "Page size = %d\n", + reflash_hcd->page_size); + + LOGD(tcm_hcd->pdev->dev.parent, + "Max write payload size = %d\n", + reflash_hcd->max_write_payload_size); + + if (reflash_hcd->write_block_size > (tcm_hcd->wr_chunk_size - 5)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Write block size greater than available chunk space\n"); + return -EINVAL; + } + + return 0; +} + +static int reflash_parse_fw_image(void) +{ + unsigned int idx; + unsigned int addr; + unsigned int offset; + unsigned int length; + unsigned int checksum; + unsigned int flash_addr; + unsigned int magic_value; + unsigned int num_of_areas; + struct image_header *header; + struct image_info *image_info; + struct area_descriptor *descriptor; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + const unsigned char *image; + const unsigned char *content; + + image = reflash_hcd->image; + image_info = &reflash_hcd->image_info; + header = (struct image_header *)image; + + magic_value = le4_to_uint(header->magic_value); + if (magic_value != IMAGE_FILE_MAGIC_VALUE) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid image file magic value\n"); + return -EINVAL; + } + + memset(image_info, 0x00, sizeof(*image_info)); + + offset = sizeof(*header); + num_of_areas = le4_to_uint(header->num_of_areas); + + for (idx = 0; idx < num_of_areas; idx++) { + addr = le4_to_uint(image + offset); + descriptor = (struct area_descriptor *)(image + addr); + offset += 4; + + magic_value = le4_to_uint(descriptor->magic_value); + if (magic_value != FLASH_AREA_MAGIC_VALUE) + continue; + + length = le4_to_uint(descriptor->length); + content = (unsigned char *)descriptor + sizeof(*descriptor); + flash_addr = le4_to_uint(descriptor->flash_addr_words) * 2; + checksum = le4_to_uint(descriptor->checksum); + + if (0 == strncmp((char *)descriptor->id_string, + BOOT_CONFIG_ID, + strlen(BOOT_CONFIG_ID))) { + if (checksum != (crc32(~0, content, length) ^ ~0)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Boot config checksum error\n"); + return -EINVAL; + } + image_info->boot_config.size = length; + image_info->boot_config.data = content; + image_info->boot_config.flash_addr = flash_addr; + LOGD(tcm_hcd->pdev->dev.parent, + "Boot config size = %d\n", + length); + LOGD(tcm_hcd->pdev->dev.parent, + "Boot config flash address = 0x%08x\n", + flash_addr); + } else if (0 == strncmp((char *)descriptor->id_string, + APP_CODE_ID, + strlen(APP_CODE_ID))) { + if (checksum != (crc32(~0, content, length) ^ ~0)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Application firmware checksum error\n"); + return -EINVAL; + } + image_info->app_firmware.size = length; + image_info->app_firmware.data = content; + image_info->app_firmware.flash_addr = flash_addr; + LOGD(tcm_hcd->pdev->dev.parent, + "Application firmware size = %d\n", + length); + LOGD(tcm_hcd->pdev->dev.parent, + "Application firmware flash address = 0x%08x\n", + flash_addr); + } else if (0 == strncmp((char *)descriptor->id_string, + PROD_TEST_ID, + strlen(PROD_TEST_ID))) { + if (checksum != (crc32(~0, content, length) ^ ~0)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Production test firmware checksum error\n"); + return -EINVAL; + } + image_info->prod_test_firmware.size = length; + image_info->prod_test_firmware.data = content; + image_info->prod_test_firmware.flash_addr = flash_addr; + LOGD(tcm_hcd->pdev->dev.parent, + "Production test firmware size = %d\n", + length); + LOGD(tcm_hcd->pdev->dev.parent, + "Production test firmware flash address = 0x%08x\n", + flash_addr); + } else if (0 == strncmp((char *)descriptor->id_string, + APP_CONFIG_ID, + strlen(APP_CONFIG_ID))) { + if (checksum != (crc32(~0, content, length) ^ ~0)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Application config checksum error\n"); + return -EINVAL; + } + image_info->app_config.size = length; + image_info->app_config.data = content; + image_info->app_config.flash_addr = flash_addr; + LOGD(tcm_hcd->pdev->dev.parent, + "Application config size = %d\n", + length); + LOGD(tcm_hcd->pdev->dev.parent, + "Application config flash address = 0x%08x\n", + flash_addr); + } else if (0 == strncmp((char *)descriptor->id_string, + DISP_CONFIG_ID, + strlen(DISP_CONFIG_ID))) { + if (checksum != (crc32(~0, content, length) ^ ~0)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Display config checksum error\n"); + return -EINVAL; + } + image_info->disp_config.size = length; + image_info->disp_config.data = content; + image_info->disp_config.flash_addr = flash_addr; + LOGD(tcm_hcd->pdev->dev.parent, + "Display config size = %d\n", + length); + LOGD(tcm_hcd->pdev->dev.parent, + "Display config flash address = 0x%08x\n", + flash_addr); + } + } + + return 0; +} + +static int reflash_get_fw_image(void) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + if (reflash_hcd->image == NULL) { + retval = request_firmware(&reflash_hcd->fw_entry, FW_IMAGE_NAME, + tcm_hcd->pdev->dev.parent); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to request %s\n", + FW_IMAGE_NAME); + return retval; + } + + LOGD(tcm_hcd->pdev->dev.parent, + "Firmware image size = %d\n", + (unsigned int)reflash_hcd->fw_entry->size); + + reflash_hcd->image = reflash_hcd->fw_entry->data; + reflash_hcd->image_size = reflash_hcd->fw_entry->size; + } + + retval = reflash_parse_fw_image(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to parse firmware image\n"); + return retval; + } + + return 0; +} + +static enum update_area reflash_compare_id_info(void) +{ + enum update_area update_area; + unsigned int device_fw_id; + unsigned int image_fw_id; + unsigned int idx; + unsigned char *image_config_id; + unsigned char *device_config_id; + struct app_config_header *header; + const unsigned char *app_config_data; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + update_area = NONE; + + if (reflash_hcd->image_info.app_config.size < sizeof(*header)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid application config in image file\n"); + goto exit; + } + + app_config_data = reflash_hcd->image_info.app_config.data; + header = (struct app_config_header *)app_config_data; + + if (reflash_hcd->force_update) { + update_area = FIRMWARE_CONFIG; + goto exit; + } + + if (tcm_hcd->id_info.mode != MODE_APPLICATION) { + update_area = FIRMWARE_CONFIG; + goto exit; + } + + image_fw_id = le4_to_uint(header->build_id); + device_fw_id = tcm_hcd->packrat_number; + + if (image_fw_id != device_fw_id) { + LOGN(tcm_hcd->pdev->dev.parent, + "Image firmware ID %d is not equal device firmware ID %d\n", image_fw_id, device_fw_id); + update_area = FIRMWARE_CONFIG; + goto exit; + } else { + LOGN(tcm_hcd->pdev->dev.parent, + "Image firmware ID is equal device firmware ID %d\n", device_fw_id); + update_area = NONE; + } + + image_config_id = header->customer_config_id; + device_config_id = tcm_hcd->app_info.customer_config_id; + for (idx = 0; idx < 16; idx++) { + if (image_config_id[idx] != device_config_id[idx]) { + LOGN(tcm_hcd->pdev->dev.parent, + "Image config ID[] is not equal device config ID\n"); + update_area = CONFIG_ONLY; + goto exit; + } else if (image_config_id[idx] < device_config_id[idx]) { + LOGN(tcm_hcd->pdev->dev.parent, + "Image config ID older than device config ID\n"); + update_area = NONE; + goto exit; + } + } + + update_area = NONE; + +exit: + if (update_area == NONE) { + LOGN(tcm_hcd->pdev->dev.parent, + "No need to do reflash\n"); + } else { + LOGN(tcm_hcd->pdev->dev.parent, + "Updating %s\n", + update_area == FIRMWARE_CONFIG ? + "firmware and config" : + "config only"); + } + + return update_area; +} + +static int reflash_read_flash(unsigned int address, unsigned char *data, + unsigned int datalen) +{ + int retval; + unsigned int length_words; + unsigned int flash_addr_words; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + LOCK_BUFFER(reflash_hcd->out); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &reflash_hcd->out, + 6); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for reflash_hcd->out.buf\n"); + UNLOCK_BUFFER(reflash_hcd->out); + return retval; + } + + length_words = datalen / 2; + flash_addr_words = address / 2; + + reflash_hcd->out.buf[0] = (unsigned char)flash_addr_words; + reflash_hcd->out.buf[1] = (unsigned char)(flash_addr_words >> 8); + reflash_hcd->out.buf[2] = (unsigned char)(flash_addr_words >> 16); + reflash_hcd->out.buf[3] = (unsigned char)(flash_addr_words >> 24); + reflash_hcd->out.buf[4] = (unsigned char)length_words; + reflash_hcd->out.buf[5] = (unsigned char)(length_words >> 8); + + LOCK_BUFFER(reflash_hcd->resp); + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_READ_FLASH, + reflash_hcd->out.buf, + 6, + &reflash_hcd->resp.buf, + &reflash_hcd->resp.buf_size, + &reflash_hcd->resp.data_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_READ_FLASH)); + UNLOCK_BUFFER(reflash_hcd->resp); + UNLOCK_BUFFER(reflash_hcd->out); + return retval; + } + + UNLOCK_BUFFER(reflash_hcd->out); + + if (reflash_hcd->resp.data_length != datalen) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read requested length\n"); + UNLOCK_BUFFER(reflash_hcd->resp); + return -EIO; + } + + retval = secure_memcpy(data, + datalen, + reflash_hcd->resp.buf, + reflash_hcd->resp.buf_size, + datalen); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy read data\n"); + UNLOCK_BUFFER(reflash_hcd->resp); + return retval; + } + + UNLOCK_BUFFER(reflash_hcd->resp); + + return 0; +} + +static int reflash_read_data(enum flash_area area, bool run_app_firmware, + struct syna_tcm_buffer *output) +{ + int retval; + unsigned int temp; + unsigned int addr; + unsigned int length; + struct syna_tcm_app_info *app_info; + struct syna_tcm_boot_info *boot_info; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + switch (area) { + case CUSTOM_LCM: + case CUSTOM_OEM: + case PPDT: + retval = tcm_hcd->get_data_location(tcm_hcd, + area, + &addr, + &length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get data location\n"); + return retval; + } + break; + default: + break; + } + + retval = reflash_set_up_flash_access(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to set up flash access\n"); + return retval; + } + + app_info = &tcm_hcd->app_info; + boot_info = &tcm_hcd->boot_info; + + switch (area) { + case BOOT_CONFIG: + temp = le2_to_uint(boot_info->boot_config_start_block); + addr = temp * reflash_hcd->write_block_size; + length = BOOT_CONFIG_SIZE * BOOT_CONFIG_SLOTS; + break; + case APP_CONFIG: + temp = le2_to_uint(app_info->app_config_start_write_block); + addr = temp * reflash_hcd->write_block_size; + length = le2_to_uint(app_info->app_config_size); + break; + case DISP_CONFIG: + temp = le4_to_uint(boot_info->display_config_start_block); + addr = temp * reflash_hcd->write_block_size; + temp = le2_to_uint(boot_info->display_config_length_blocks); + length = temp * reflash_hcd->write_block_size; + break; + case CUSTOM_OTP: + temp = le2_to_uint(boot_info->custom_otp_start_block); + addr = temp * reflash_hcd->write_block_size; + temp = le2_to_uint(boot_info->custom_otp_length_blocks); + length = temp * reflash_hcd->write_block_size; + break; + case CUSTOM_LCM: + case CUSTOM_OEM: + case PPDT: + addr *= reflash_hcd->write_block_size; + length *= reflash_hcd->write_block_size; + break; + default: + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid data area\n"); + retval = -EINVAL; + goto run_app_firmware; + } + + if (addr == 0 || length == 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Data area unavailable\n"); + retval = -EINVAL; + goto run_app_firmware; + } + + LOCK_BUFFER(reflash_hcd->read); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &reflash_hcd->read, + length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for reflash_hcd->read.buf\n"); + UNLOCK_BUFFER(reflash_hcd->read); + goto run_app_firmware; + } + + retval = reflash_read_flash(addr, reflash_hcd->read.buf, length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read from flash\n"); + UNLOCK_BUFFER(reflash_hcd->read); + goto run_app_firmware; + } + + reflash_hcd->read.data_length = length; + + if (output != NULL) { + retval = syna_tcm_alloc_mem(tcm_hcd, + output, + length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for output->buf\n"); + UNLOCK_BUFFER(reflash_hcd->read); + goto run_app_firmware; + } + + retval = secure_memcpy(output->buf, + output->buf_size, + reflash_hcd->read.buf, + reflash_hcd->read.buf_size, + length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy read data\n"); + UNLOCK_BUFFER(reflash_hcd->read); + goto run_app_firmware; + } + + output->data_length = length; + } + + UNLOCK_BUFFER(reflash_hcd->read); + + retval = 0; + +run_app_firmware: + if (!run_app_firmware) + goto exit; + + if (tcm_hcd->switch_mode(tcm_hcd, FW_MODE_APPLICATION) < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run application firmware\n"); + } + +exit: + return retval; +} + +static int reflash_check_boot_config(void) +{ + unsigned int temp; + unsigned int image_addr; + unsigned int device_addr; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + if (reflash_hcd->image_info.boot_config.size < BOOT_CONFIG_SIZE) { + LOGE(tcm_hcd->pdev->dev.parent, + "No valid boot config in image file\n"); + return -EINVAL; + } + + image_addr = reflash_hcd->image_info.boot_config.flash_addr; + + temp = le2_to_uint(tcm_hcd->boot_info.boot_config_start_block); + device_addr = temp * reflash_hcd->write_block_size; + + if (image_addr != device_addr) { + LOGE(tcm_hcd->pdev->dev.parent, + "Flash address mismatch\n"); + return -EINVAL; + } + + return 0; +} + +static int reflash_check_app_config(void) +{ + unsigned int temp; + unsigned int image_addr; + unsigned int image_size; + unsigned int device_addr; + unsigned int device_size; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + if (reflash_hcd->image_info.app_config.size == 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "No application config in image file\n"); + return -EINVAL; + } + + image_addr = reflash_hcd->image_info.app_config.flash_addr; + image_size = reflash_hcd->image_info.app_config.size; + + temp = le2_to_uint(tcm_hcd->app_info.app_config_start_write_block); + device_addr = temp * reflash_hcd->write_block_size; + device_size = le2_to_uint(tcm_hcd->app_info.app_config_size); + + if (device_addr == 0 && device_size == 0) + return 0; + + if (image_addr != device_addr) { + LOGE(tcm_hcd->pdev->dev.parent, + "Flash address mismatch\n"); + return -EINVAL; + } + + if (image_size != device_size) { + LOGE(tcm_hcd->pdev->dev.parent, + "Config size mismatch\n"); + return -EINVAL; + } + + return 0; +} + +static int reflash_check_disp_config(void) +{ + unsigned int temp; + unsigned int image_addr; + unsigned int image_size; + unsigned int device_addr; + unsigned int device_size; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + if (reflash_hcd->image_info.disp_config.size == 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "No display config in image file\n"); + return -EINVAL; + } + + image_addr = reflash_hcd->image_info.disp_config.flash_addr; + image_size = reflash_hcd->image_info.disp_config.size; + + temp = le4_to_uint(tcm_hcd->boot_info.display_config_start_block); + device_addr = temp * reflash_hcd->write_block_size; + + temp = le2_to_uint(tcm_hcd->boot_info.display_config_length_blocks); + device_size = temp * reflash_hcd->write_block_size; + + if (image_addr != device_addr) { + LOGE(tcm_hcd->pdev->dev.parent, + "Flash address mismatch\n"); + return -EINVAL; + } + + if (image_size != device_size) { + LOGE(tcm_hcd->pdev->dev.parent, + "Config size mismatch\n"); + return -EINVAL; + } + + return 0; +} + +static int reflash_check_prod_test_firmware(void) +{ + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + if (reflash_hcd->image_info.prod_test_firmware.size == 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "No production test firmware in image file\n"); + return -EINVAL; + } + + return 0; +} + +static int reflash_check_app_firmware(void) +{ + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + if (reflash_hcd->image_info.app_firmware.size == 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "No application firmware in image file\n"); + return -EINVAL; + } + + return 0; +} + +static int reflash_write_flash(unsigned int address, const unsigned char *data, + unsigned int datalen) +{ + int retval; + unsigned int offset; + unsigned int w_length; + unsigned int xfer_length; + unsigned int remaining_length; + unsigned int flash_address; + unsigned int block_address; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + w_length = tcm_hcd->wr_chunk_size - 5; + + w_length = w_length - (w_length % reflash_hcd->write_block_size); + + w_length = MIN(w_length, reflash_hcd->max_write_payload_size); + + offset = 0; + + remaining_length = datalen; + + LOCK_BUFFER(reflash_hcd->out); + LOCK_BUFFER(reflash_hcd->resp); + + while (remaining_length) { + if (remaining_length > w_length) + xfer_length = w_length; + else + xfer_length = remaining_length; + + retval = syna_tcm_alloc_mem(tcm_hcd, + &reflash_hcd->out, + xfer_length + 2); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for reflash_hcd->out.buf\n"); + UNLOCK_BUFFER(reflash_hcd->resp); + UNLOCK_BUFFER(reflash_hcd->out); + return retval; + } + + flash_address = address + offset; + block_address = flash_address / reflash_hcd->write_block_size; + reflash_hcd->out.buf[0] = (unsigned char)block_address; + reflash_hcd->out.buf[1] = (unsigned char)(block_address >> 8); + + retval = secure_memcpy(&reflash_hcd->out.buf[2], + reflash_hcd->out.buf_size - 2, + &data[offset], + datalen - offset, + xfer_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy write data\n"); + UNLOCK_BUFFER(reflash_hcd->resp); + UNLOCK_BUFFER(reflash_hcd->out); + return retval; + } + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_WRITE_FLASH, + reflash_hcd->out.buf, + xfer_length + 2, + &reflash_hcd->resp.buf, + &reflash_hcd->resp.buf_size, + &reflash_hcd->resp.data_length, + NULL, + WRITE_FLASH_DELAY_MS); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_WRITE_FLASH)); + LOGE(tcm_hcd->pdev->dev.parent, + "Flash address = 0x%08x\n", + flash_address); + LOGE(tcm_hcd->pdev->dev.parent, + "Data length = %d\n", + xfer_length); + UNLOCK_BUFFER(reflash_hcd->resp); + UNLOCK_BUFFER(reflash_hcd->out); + return retval; + } + + offset += xfer_length; + remaining_length -= xfer_length; + } + + UNLOCK_BUFFER(reflash_hcd->resp); + UNLOCK_BUFFER(reflash_hcd->out); + + return 0; +} + +reflash_write(app_config) + +reflash_write(disp_config) + +reflash_write(prod_test_firmware) + +reflash_write(app_firmware) + +static int reflash_erase_flash(unsigned int page_start, unsigned int page_count) +{ + int retval; + unsigned char out_buf[2]; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + out_buf[0] = (unsigned char)page_start; + out_buf[1] = (unsigned char)page_count; + + LOCK_BUFFER(reflash_hcd->resp); + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_ERASE_FLASH, + out_buf, + sizeof(out_buf), + &reflash_hcd->resp.buf, + &reflash_hcd->resp.buf_size, + &reflash_hcd->resp.data_length, + NULL, + ERASE_FLASH_DELAY_MS); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_ERASE_FLASH)); + UNLOCK_BUFFER(reflash_hcd->resp); + return retval; + } + + UNLOCK_BUFFER(reflash_hcd->resp); + + return 0; +} + +reflash_erase(app_config) + +reflash_erase(disp_config) + +reflash_erase(prod_test_firmware) + +reflash_erase(app_firmware) + +static int reflash_update_custom_otp(const unsigned char *data, + unsigned int offset, unsigned int datalen) +{ + int retval; + unsigned int temp; + unsigned int addr; + unsigned int length; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + retval = reflash_set_up_flash_access(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to set up flash access\n"); + return retval; + } + + tcm_hcd->update_watchdog(tcm_hcd, false); + + temp = le2_to_uint(tcm_hcd->boot_info.custom_otp_start_block); + addr = temp * reflash_hcd->write_block_size; + + temp = le2_to_uint(tcm_hcd->boot_info.custom_otp_length_blocks); + length = temp * reflash_hcd->write_block_size; + + if (addr == 0 || length == 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Data area unavailable\n"); + retval = -EINVAL; + goto run_app_firmware; + } + + if (datalen + offset > length) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid data length\n"); + retval = -EINVAL; + goto run_app_firmware; + } + + retval = reflash_write_flash(addr + offset, + data, + datalen); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write to flash\n"); + goto run_app_firmware; + } + + retval = 0; + +run_app_firmware: + if (tcm_hcd->switch_mode(tcm_hcd, FW_MODE_APPLICATION) < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run application firmware\n"); + } + + tcm_hcd->update_watchdog(tcm_hcd, true); + + return retval; +} + +static int reflash_update_custom_lcm(const unsigned char *data, + unsigned int offset, unsigned int datalen) +{ + int retval; + unsigned int addr; + unsigned int length; + unsigned int page_start; + unsigned int page_count; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + retval = tcm_hcd->get_data_location(tcm_hcd, + CUSTOM_LCM, + &addr, + &length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get data location\n"); + return retval; + } + + retval = reflash_set_up_flash_access(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to set up flash access\n"); + return retval; + } + + tcm_hcd->update_watchdog(tcm_hcd, false); + + addr *= reflash_hcd->write_block_size; + length *= reflash_hcd->write_block_size; + + if (addr == 0 || length == 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Data area unavailable\n"); + retval = -EINVAL; + goto run_app_firmware; + } + + if (datalen + offset > length) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid data length\n"); + retval = -EINVAL; + goto run_app_firmware; + } + + if (offset == 0) { + page_start = addr / reflash_hcd->page_size; + + page_count = ceil_div(length, reflash_hcd->page_size); + + retval = reflash_erase_flash(page_start, page_count); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to erase flash pages\n"); + goto run_app_firmware; + } + } + + retval = reflash_write_flash(addr + offset, + data, + datalen); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write to flash\n"); + goto run_app_firmware; + } + + retval = 0; + +run_app_firmware: + if (tcm_hcd->switch_mode(tcm_hcd, FW_MODE_APPLICATION) < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run application firmware\n"); + } + + tcm_hcd->update_watchdog(tcm_hcd, true); + + return retval; +} + +static int reflash_update_custom_oem(const unsigned char *data, + unsigned int offset, unsigned int datalen) +{ + int retval; + unsigned int addr; + unsigned int length; + unsigned int page_start; + unsigned int page_count; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + retval = tcm_hcd->get_data_location(tcm_hcd, + CUSTOM_OEM, + &addr, + &length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get data location\n"); + return retval; + } + + retval = reflash_set_up_flash_access(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to set up flash access\n"); + return retval; + } + + tcm_hcd->update_watchdog(tcm_hcd, false); + + addr *= reflash_hcd->write_block_size; + length *= reflash_hcd->write_block_size; + + if (addr == 0 || length == 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Data area unavailable\n"); + retval = -EINVAL; + goto run_app_firmware; + } + + if (datalen + offset > length) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid data length\n"); + retval = -EINVAL; + goto run_app_firmware; + } + + if (offset == 0) { + page_start = addr / reflash_hcd->page_size; + + page_count = ceil_div(length, reflash_hcd->page_size); + + retval = reflash_erase_flash(page_start, page_count); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to erase flash pages\n"); + goto run_app_firmware; + } + } + + retval = reflash_write_flash(addr + offset, + data, + datalen); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write to flash\n"); + goto run_app_firmware; + } + + retval = 0; + +run_app_firmware: + if (tcm_hcd->switch_mode(tcm_hcd, FW_MODE_APPLICATION) < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run application firmware\n"); + } + + tcm_hcd->update_watchdog(tcm_hcd, true); + + return retval; +} + +static int reflash_update_boot_config(bool lock) +{ + int retval; + unsigned char slot_used; + unsigned int idx; + unsigned int addr; + struct boot_config *data; + struct boot_config *last_slot; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + retval = reflash_set_up_flash_access(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to set up flash access\n"); + return retval; + } + + tcm_hcd->update_watchdog(tcm_hcd, false); + + retval = reflash_check_boot_config(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed boot_config partition check\n"); + goto reset; + } + + retval = reflash_read_data(BOOT_CONFIG, false, NULL); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read boot config\n"); + goto reset; + } + + LOCK_BUFFER(reflash_hcd->read); + + data = (struct boot_config *)reflash_hcd->read.buf; + last_slot = data + (BOOT_CONFIG_SLOTS - 1); + slot_used = tcm_hcd->id_info.mode == MODE_TDDI_BOOTLOADER ? 0 : 1; + + if (last_slot->used == slot_used) { + LOGE(tcm_hcd->pdev->dev.parent, + "Boot config already locked down\n"); + UNLOCK_BUFFER(reflash_hcd->read); + goto reset; + } + + if (lock) { + idx = BOOT_CONFIG_SLOTS - 1; + } else { + for (idx = 0; idx < BOOT_CONFIG_SLOTS; idx++) { + if (data->used == slot_used) { + data++; + continue; + } else { + break; + } + } + } + + UNLOCK_BUFFER(reflash_hcd->read); + + if (idx == BOOT_CONFIG_SLOTS) { + LOGE(tcm_hcd->pdev->dev.parent, + "No free boot config slot available\n"); + goto reset; + } + + addr += idx * BOOT_CONFIG_SIZE; + + retval = reflash_write_flash(addr, + reflash_hcd->image_info.boot_config.data, + BOOT_CONFIG_SIZE); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write to flash\n"); + goto reset; + } + + LOGN(tcm_hcd->pdev->dev.parent, + "Slot %d updated with new boot config\n", + idx); + + retval = 0; + +reset: + if (tcm_hcd->reset(tcm_hcd, false, true) < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reset\n"); + } + + tcm_hcd->update_watchdog(tcm_hcd, true); + + return retval; +} + +reflash_update(app_config) + +reflash_update(disp_config) + +reflash_update(prod_test_firmware) + +reflash_update(app_firmware) + +static int reflash_do_reflash(void) +{ + int retval; + enum update_area update_area; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + LOGN(tcm_hcd->pdev->dev.parent, + "Start of reflash\n"); + retval = reflash_get_fw_image(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get firmware image\n"); + goto exit; + } + + update_area = reflash_compare_id_info(); + + switch (update_area) { + case FIRMWARE_CONFIG: + retval = reflash_update_app_firmware(false); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to reflash application firmware\n"); + goto exit; + } + memset(&tcm_hcd->app_info, 0x00, sizeof(tcm_hcd->app_info)); + if (tcm_hcd->features.dual_firmware) { + retval = reflash_update_prod_test_firmware(false); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to reflash production test firmware\n"); + goto exit; + } + } + case CONFIG_ONLY: + if (reflash_hcd->disp_cfg_update) { + retval = reflash_update_disp_config(false); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to reflash display config\n"); + goto exit; + } + } + retval = reflash_update_app_config(true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to reflash application config\n"); + goto exit; + } + break; + case NONE: + default: + break; + } + + LOGN(tcm_hcd->pdev->dev.parent, + "End of reflash\n"); + + retval = 0; + tcm_hcd->reflash_okay = true; +exit: + if (reflash_hcd->fw_entry) { + release_firmware(reflash_hcd->fw_entry); + reflash_hcd->fw_entry = NULL; + reflash_hcd->image = NULL; + reflash_hcd->image_size = 0; + } + + return retval; +} + +#ifdef STARTUP_REFLASH +static void reflash_startup_work(struct work_struct *work) +{ + int retval; + int idx; +#ifdef CONFIG_FB + unsigned int timeout; +#endif + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + +#ifdef CONFIG_FB + timeout = FB_READY_TIMEOUT_S * 1000 / FB_READY_WAIT_MS; + + while (tcm_hcd->fb_ready != FB_READY_COUNT) { + if (timeout == 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Timed out waiting for FB ready\n"); + return; + } + msleep(FB_READY_WAIT_MS); + timeout--; + } +#endif + + if (tcm_hcd->id_info.mode == MODE_APPLICATION) { + retval = tcm_hcd->identify(tcm_hcd, false); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, "%s Failed to do identification\n", __func__); + } + } + + pm_stay_awake(&tcm_hcd->pdev->dev); + + mutex_lock(&reflash_hcd->reflash_mutex); + + retval = reflash_do_reflash(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reflash\n"); + } + retval = reflash_read_data(CUSTOM_OTP, false, NULL); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, "Failed to read lockdown data\n"); + } else { + for (idx = 0; idx < LOCKDOWN_SIZE; idx++) + tcm_hcd->lockdown[idx] = reflash_hcd->read.buf[idx]; + pr_info("synaptics %s Lockdown:0x%2x,0x%2x,0x%2x,0x%2x,0x%2x,0x%2x,0x%2x,0x%2x\n", __func__, + tcm_hcd->lockdown[0], tcm_hcd->lockdown[1], tcm_hcd->lockdown[2], tcm_hcd->lockdown[3], + tcm_hcd->lockdown[4], tcm_hcd->lockdown[5], tcm_hcd->lockdown[6], tcm_hcd->lockdown[7]); + } + + LOGE(tcm_hcd->pdev->dev.parent, "%s: Do Hard reset started\n", __func__); + retval = tcm_hcd->reset(tcm_hcd, true, true); + if (retval < 0) + LOGE(tcm_hcd->pdev->dev.parent, "%s: Do Hard reset failed\n", __func__); + + mutex_unlock(&reflash_hcd->reflash_mutex); + + pm_relax(&tcm_hcd->pdev->dev); + + return; +} +#endif + +#define TP_INFO_MAX_LENGTH 50 +static ssize_t synaptics_lockdown_info_read(struct file *file, char __user *buf, + size_t count, loff_t *pos) +{ + int cnt = 0, retval = 0; + char tmp[TP_INFO_MAX_LENGTH]; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + + if (!reflash_hcd || *pos != 0) + return 0; + cnt = snprintf(tmp, TP_INFO_MAX_LENGTH, + "0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x\n", + tcm_hcd->lockdown[0], tcm_hcd->lockdown[1], + tcm_hcd->lockdown[2], tcm_hcd->lockdown[3], + tcm_hcd->lockdown[4], tcm_hcd->lockdown[5], + tcm_hcd->lockdown[6], tcm_hcd->lockdown[7]); + retval = copy_to_user(buf, tmp, cnt); + *pos += cnt; + if (retval != 0) + return 0; + else + return cnt; +} +static ssize_t synaptics_fw_version_read(struct file *file, char __user *buf, + size_t count, loff_t *pos) +{ + char tmp[TP_INFO_MAX_LENGTH]; + int cnt = 0, retval = 0; + struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; + if (!reflash_hcd || *pos != 0) + return 0; + retval = tcm_hcd->identify(tcm_hcd, false); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do identification\n"); + return 0; + } + cnt = snprintf(tmp, TP_INFO_MAX_LENGTH, "%d\n", tcm_hcd->packrat_number); + retval = copy_to_user(buf, tmp, cnt); + *pos += cnt; + if (retval != 0) + return 0; + else + return cnt; +} + +static const struct file_operations synaptics_lockdown_info_ops = { + .read = synaptics_lockdown_info_read, +}; +static const struct file_operations synaptics_fw_version_ops = { + .read = synaptics_fw_version_read, +}; + +static int reflash_init(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + int idx; + reflash_hcd = kzalloc(sizeof(*reflash_hcd), GFP_KERNEL); + if (!reflash_hcd) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for reflash_hcd\n"); + return -ENOMEM; + } + + reflash_hcd->image_buf = kzalloc(IMAGE_BUF_SIZE, GFP_KERNEL); + if (!reflash_hcd->image_buf) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for reflash_hcd->image_buf\n"); + goto err_allocate_memory; + } + + reflash_hcd->tcm_hcd = tcm_hcd; + + reflash_hcd->force_update = FORCE_REFLASH; + + reflash_hcd->disp_cfg_update = DISPLAY_REFLASH; + + mutex_init(&reflash_hcd->reflash_mutex); + + INIT_BUFFER(reflash_hcd->out, false); + INIT_BUFFER(reflash_hcd->resp, false); + INIT_BUFFER(reflash_hcd->read, false); + +#ifdef STARTUP_REFLASH + reflash_hcd->workqueue = + create_singlethread_workqueue("syna_tcm_reflash"); + INIT_WORK(&reflash_hcd->work, reflash_startup_work); + queue_work(reflash_hcd->workqueue, &reflash_hcd->work); +#endif + + if (ENABLE_SYSFS_INTERFACE == false) + return 0; + + reflash_hcd->sysfs_dir = kobject_create_and_add(SYSFS_DIR_NAME, + tcm_hcd->sysfs_dir); + if (!reflash_hcd->sysfs_dir) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create sysfs directory\n"); + retval = -EINVAL; + goto err_sysfs_create_dir; + } + + for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) { + retval = sysfs_create_file(reflash_hcd->sysfs_dir, + &(*attrs[idx]).attr); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create sysfs file\n"); + goto err_sysfs_create_file; + } + } + + retval = sysfs_create_bin_file(reflash_hcd->sysfs_dir, &bin_attrs[0]); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create sysfs bin file\n"); + goto err_sysfs_create_bin_file; + } + + reflash_hcd->custom_dir = kobject_create_and_add(CUSTOM_DIR_NAME, + reflash_hcd->sysfs_dir); + if (!reflash_hcd->custom_dir) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create custom sysfs directory\n"); + retval = -EINVAL; + goto err_custom_sysfs_create_dir; + } + + for (idx = 1; idx < ARRAY_SIZE(bin_attrs); idx++) { + retval = sysfs_create_bin_file(reflash_hcd->custom_dir, + &bin_attrs[idx]); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create sysfs bin file\n"); + goto err_custom_sysfs_create_bin_file; + } + } + + tcm_hcd->read_flash_data = reflash_read_data; + proc_create("tp_lockdown_info", 0, NULL, &synaptics_lockdown_info_ops); + proc_create("tp_fw_version", 0, NULL, &synaptics_fw_version_ops); + return 0; + +err_custom_sysfs_create_bin_file: + for (idx--; idx > 0; idx--) + sysfs_remove_bin_file(reflash_hcd->custom_dir, &bin_attrs[idx]); + + kobject_put(reflash_hcd->custom_dir); + + idx = ARRAY_SIZE(attrs); + +err_custom_sysfs_create_dir: + sysfs_remove_bin_file(reflash_hcd->sysfs_dir, &bin_attrs[0]); + +err_sysfs_create_bin_file: +err_sysfs_create_file: + for (idx--; idx >= 0; idx--) + sysfs_remove_file(reflash_hcd->sysfs_dir, &(*attrs[idx]).attr); + + kobject_put(reflash_hcd->sysfs_dir); + +err_sysfs_create_dir: +err_allocate_memory: + kfree(reflash_hcd->image_buf); + + RELEASE_BUFFER(reflash_hcd->read); + RELEASE_BUFFER(reflash_hcd->resp); + RELEASE_BUFFER(reflash_hcd->out); + + kfree(reflash_hcd); + reflash_hcd = NULL; + + return retval; +} + +static int reflash_remove(struct syna_tcm_hcd *tcm_hcd) +{ + int idx; + + if (!reflash_hcd) + goto exit; + + tcm_hcd->read_flash_data = NULL; + + if (ENABLE_SYSFS_INTERFACE == true) { + for (idx = 1; idx < ARRAY_SIZE(bin_attrs); idx++) { + sysfs_remove_bin_file(reflash_hcd->custom_dir, + &bin_attrs[idx]); + } + + kobject_put(reflash_hcd->custom_dir); + + sysfs_remove_bin_file(reflash_hcd->sysfs_dir, &bin_attrs[0]); + + for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) { + sysfs_remove_file(reflash_hcd->sysfs_dir, + &(*attrs[idx]).attr); + } + + kobject_put(reflash_hcd->sysfs_dir); + } + +#ifdef STARTUP_REFLASH + cancel_work_sync(&reflash_hcd->work); + flush_workqueue(reflash_hcd->workqueue); + destroy_workqueue(reflash_hcd->workqueue); +#endif + + kfree(reflash_hcd->image_buf); + + RELEASE_BUFFER(reflash_hcd->read); + RELEASE_BUFFER(reflash_hcd->resp); + RELEASE_BUFFER(reflash_hcd->out); + + kfree(reflash_hcd); + reflash_hcd = NULL; + +exit: + complete(&reflash_remove_complete); + + return 0; +} + +static int reflash_reset(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + + if (!reflash_hcd) { + retval = reflash_init(tcm_hcd); + return retval; + } + + return 0; +} + +static struct syna_tcm_module_cb reflash_module = { + .type = TCM_REFLASH, + .init = reflash_init, + .remove = reflash_remove, + .syncbox = NULL, + .asyncbox = NULL, + .reset = reflash_reset, + .suspend = NULL, + .resume = NULL, + .early_suspend = NULL, +}; + +static int __init reflash_module_init(void) +{ + return syna_tcm_add_module(&reflash_module, true); +} + +static void __exit reflash_module_exit(void) +{ + syna_tcm_add_module(&reflash_module, false); + + wait_for_completion(&reflash_remove_complete); + + return; +} + +late_initcall(reflash_module_init); +module_exit(reflash_module_exit); + +MODULE_AUTHOR("Synaptics, Inc."); +MODULE_DESCRIPTION("Synaptics TCM Reflash Module"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_spi.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_spi.c new file mode 100644 index 000000000000..0cddf272bc17 --- /dev/null +++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_spi.c @@ -0,0 +1,684 @@ +/* + * Synaptics TCM touchscreen driver + * + * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved. + * + * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS + * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, + * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS. + * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION + * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED + * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES + * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' + * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. + * DOLLARS. + */ + +#include <linux/spi/spi.h> +#include <linux/of_gpio.h> +#include "synaptics_tcm_core.h" + +static unsigned char *buf; + +static unsigned int buf_size; + +static struct spi_transfer *xfer; + +static struct syna_tcm_bus_io bus_io; + +static struct syna_tcm_hw_interface hw_if; + +static struct platform_device *syna_tcm_spi_device; + +#ifdef CONFIG_OF +static int parse_dt(struct device *dev, struct syna_tcm_board_data *bdata) +{ + int retval; + u32 value; + struct property *prop; + struct device_node *np = dev->of_node; + const char *name; + + prop = of_find_property(np, "synaptics,irq-gpio", NULL); + if (prop && prop->length) { + bdata->irq_gpio = of_get_named_gpio_flags(np, + "synaptics,irq-gpio", 0, + (enum of_gpio_flags *)&bdata->irq_flags); + } else { + bdata->irq_gpio = -1; + } + + retval = of_property_read_u32(np, "synaptics,irq-on-state", &value); + if (retval < 0) + bdata->irq_on_state = 0; + else + bdata->irq_on_state = value; + + retval = of_property_read_string(np, "synaptics,pwr-reg-name", &name); + if (retval < 0) + bdata->pwr_reg_name = NULL; + else + bdata->pwr_reg_name = name; + + retval = of_property_read_string(np, "synaptics,bus-reg-name", &name); + if (retval < 0) + bdata->bus_reg_name = NULL; + else + bdata->bus_reg_name = name; + + prop = of_find_property(np, "synaptics,power-gpio", NULL); + if (prop && prop->length) { + bdata->power_gpio = of_get_named_gpio_flags(np, + "synaptics,power-gpio", 0, NULL); + } else { + bdata->power_gpio = -1; + } + + prop = of_find_property(np, "synaptics,power-on-state", NULL); + if (prop && prop->length) { + retval = of_property_read_u32(np, "synaptics,power-on-state", + &value); + if (retval < 0) { + LOGE(dev, + "Failed to read synaptics,power-on-state property\n"); + return retval; + } else { + bdata->power_on_state = value; + } + } else { + bdata->power_on_state = 0; + } + + prop = of_find_property(np, "synaptics,power-delay-ms", NULL); + if (prop && prop->length) { + retval = of_property_read_u32(np, "synaptics,power-delay-ms", + &value); + if (retval < 0) { + LOGE(dev, + "Failed to read synaptics,power-delay-ms property\n"); + return retval; + } else { + bdata->power_delay_ms = value; + } + } else { + bdata->power_delay_ms = 0; + } + + prop = of_find_property(np, "synaptics,reset-gpio", NULL); + if (prop && prop->length) { + bdata->reset_gpio = of_get_named_gpio_flags(np, + "synaptics,reset-gpio", 0, NULL); + } else { + bdata->reset_gpio = -1; + } + + prop = of_find_property(np, "synaptics,reset-on-state", NULL); + if (prop && prop->length) { + retval = of_property_read_u32(np, "synaptics,reset-on-state", + &value); + if (retval < 0) { + LOGE(dev, + "Failed to read synaptics,reset-on-state property\n"); + return retval; + } else { + bdata->reset_on_state = value; + } + } else { + bdata->reset_on_state = 0; + } + + prop = of_find_property(np, "synaptics,reset-active-ms", NULL); + if (prop && prop->length) { + retval = of_property_read_u32(np, "synaptics,reset-active-ms", + &value); + if (retval < 0) { + LOGE(dev, + "Failed to read synaptics,reset-active-ms property\n"); + return retval; + } else { + bdata->reset_active_ms = value; + } + } else { + bdata->reset_active_ms = 0; + } + + prop = of_find_property(np, "synaptics,reset-delay-ms", NULL); + if (prop && prop->length) { + retval = of_property_read_u32(np, "synaptics,reset-delay-ms", + &value); + if (retval < 0) { + LOGE(dev, + "Unable to read synaptics,reset-delay-ms property\n"); + return retval; + } else { + bdata->reset_delay_ms = value; + } + } else { + bdata->reset_delay_ms = 0; + } + + prop = of_find_property(np, "synaptics,x-flip", NULL); + bdata->x_flip = prop > 0 ? true : false; + + prop = of_find_property(np, "synaptics,y-flip", NULL); + bdata->y_flip = prop > 0 ? true : false; + + prop = of_find_property(np, "synaptics,swap-axes", NULL); + bdata->swap_axes = prop > 0 ? true : false; + + prop = of_find_property(np, "synaptics,byte-delay-us", NULL); + if (prop && prop->length) { + retval = of_property_read_u32(np, "synaptics,byte-delay-us", + &value); + if (retval < 0) { + LOGE(dev, + "Unable to read synaptics,byte-delay-us property\n"); + return retval; + } else { + bdata->byte_delay_us = value; + } + } else { + bdata->byte_delay_us = 0; + } + + prop = of_find_property(np, "synaptics,block-delay-us", NULL); + if (prop && prop->length) { + retval = of_property_read_u32(np, "synaptics,block-delay-us", + &value); + if (retval < 0) { + LOGE(dev, + "Unable to read synaptics,block-delay-us property\n"); + return retval; + } else { + bdata->block_delay_us = value; + } + } else { + bdata->block_delay_us = 0; + } + + prop = of_find_property(np, "synaptics,spi-mode", NULL); + if (prop && prop->length) { + retval = of_property_read_u32(np, "synaptics,spi-mode", + &value); + if (retval < 0) { + LOGE(dev, + "Unable to read synaptics,spi-mode property\n"); + return retval; + } else { + bdata->spi_mode = value; + } + } else { + bdata->spi_mode = 0; + } + + prop = of_find_property(np, "synaptics,ubl-max-freq", NULL); + if (prop && prop->length) { + retval = of_property_read_u32(np, "synaptics,ubl-max-freq", + &value); + if (retval < 0) { + LOGE(dev, + "Unable to read synaptics,ubl-max-freq property\n"); + return retval; + } else { + bdata->ubl_max_freq = value; + } + } else { + bdata->ubl_max_freq = 0; + } + + prop = of_find_property(np, "synaptics,ubl-byte-delay-us", NULL); + if (prop && prop->length) { + retval = of_property_read_u32(np, "synaptics,ubl-byte-delay-us", + &value); + if (retval < 0) { + LOGE(dev, + "Unable to read synaptics,ubl-byte-delay-us property\n"); + return retval; + } else { + bdata->ubl_byte_delay_us = value; + } + } else { + bdata->ubl_byte_delay_us = 0; + } + + return 0; +} +#endif + +static int syna_tcm_spi_alloc_mem(struct syna_tcm_hcd *tcm_hcd, + unsigned int count, unsigned int size) +{ + static unsigned int xfer_count; + struct spi_device *spi = to_spi_device(tcm_hcd->pdev->dev.parent); + + if (count > xfer_count) { + kfree(xfer); + xfer = kcalloc(count, sizeof(*xfer), GFP_KERNEL); + if (!xfer) { + LOGE(&spi->dev, + "Failed to allocate memory for xfer\n"); + xfer_count = 0; + return -ENOMEM; + } + xfer_count = count; + } else { + memset(xfer, 0, count * sizeof(*xfer)); + } + + if (size > buf_size) { + if (buf_size) + kfree(buf); + buf = kmalloc(size, GFP_KERNEL); + if (!buf) { + LOGE(&spi->dev, + "Failed to allocate memory for buf\n"); + buf_size = 0; + return -ENOMEM; + } + buf_size = size; + } + + return 0; +} + +static int syna_tcm_spi_rmi_read(struct syna_tcm_hcd *tcm_hcd, + unsigned short addr, unsigned char *data, unsigned int length) +{ + int retval; + unsigned int idx; + unsigned int mode; + unsigned int byte_count; + struct spi_message msg; + struct spi_device *spi = to_spi_device(tcm_hcd->pdev->dev.parent); + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + mutex_lock(&tcm_hcd->io_ctrl_mutex); + + spi_message_init(&msg); + + byte_count = length + 2; + + if (bdata->ubl_byte_delay_us == 0) + retval = syna_tcm_spi_alloc_mem(tcm_hcd, 2, 2); + else + retval = syna_tcm_spi_alloc_mem(tcm_hcd, byte_count, 2); + if (retval < 0) { + LOGE(&spi->dev, + "Failed to allocate memory\n"); + goto exit; + } + + buf[0] = (unsigned char)(addr >> 8) | 0x80; + buf[1] = (unsigned char)addr; + + if (bdata->ubl_byte_delay_us == 0) { + xfer[0].len = 2; + xfer[0].tx_buf = buf; + xfer[0].speed_hz = bdata->ubl_max_freq; + spi_message_add_tail(&xfer[0], &msg); + xfer[1].len = length; + xfer[1].rx_buf = data; + if (bdata->block_delay_us) + xfer[1].delay_usecs = bdata->block_delay_us; + xfer[1].speed_hz = bdata->ubl_max_freq; + spi_message_add_tail(&xfer[1], &msg); + } else { + for (idx = 0; idx < byte_count; idx++) { + xfer[idx].len = 1; + if (idx < 2) + xfer[idx].tx_buf = &buf[idx]; + else + xfer[idx].rx_buf = &data[idx - 2]; + xfer[idx].delay_usecs = bdata->ubl_byte_delay_us; + if (bdata->block_delay_us && (idx == byte_count - 1)) + xfer[idx].delay_usecs = bdata->block_delay_us; + xfer[idx].speed_hz = bdata->ubl_max_freq; + spi_message_add_tail(&xfer[idx], &msg); + } + } + + mode = spi->mode; + spi->mode = SPI_MODE_3; + + retval = spi_sync(spi, &msg); + if (retval == 0) { + retval = length; + } else { + LOGE(&spi->dev, + "Failed to complete SPI transfer, error = %d\n", + retval); + } + + spi->mode = mode; + +exit: + mutex_unlock(&tcm_hcd->io_ctrl_mutex); + + return retval; +} + +static int syna_tcm_spi_rmi_write(struct syna_tcm_hcd *tcm_hcd, + unsigned short addr, unsigned char *data, unsigned int length) +{ + int retval; + unsigned int mode; + unsigned int byte_count; + struct spi_message msg; + struct spi_device *spi = to_spi_device(tcm_hcd->pdev->dev.parent); + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + mutex_lock(&tcm_hcd->io_ctrl_mutex); + + spi_message_init(&msg); + + byte_count = length + 2; + + retval = syna_tcm_spi_alloc_mem(tcm_hcd, 1, byte_count); + if (retval < 0) { + LOGE(&spi->dev, + "Failed to allocate memory\n"); + goto exit; + } + + buf[0] = (unsigned char)(addr >> 8) & ~0x80; + buf[1] = (unsigned char)addr; + retval = secure_memcpy(&buf[2], + buf_size - 2, + data, + length, + length); + if (retval < 0) { + LOGE(&spi->dev, + "Failed to copy write data\n"); + goto exit; + } + + xfer[0].len = byte_count; + xfer[0].tx_buf = buf; + if (bdata->block_delay_us) + xfer[0].delay_usecs = bdata->block_delay_us; + spi_message_add_tail(&xfer[0], &msg); + + mode = spi->mode; + spi->mode = SPI_MODE_3; + + retval = spi_sync(spi, &msg); + if (retval == 0) { + retval = length; + } else { + LOGE(&spi->dev, + "Failed to complete SPI transfer, error = %d\n", + retval); + } + + spi->mode = mode; + +exit: + mutex_unlock(&tcm_hcd->io_ctrl_mutex); + + return retval; +} + +static int syna_tcm_spi_read(struct syna_tcm_hcd *tcm_hcd, unsigned char *data, + unsigned int length) +{ + int retval; + unsigned int idx; + struct spi_message msg; + struct spi_device *spi = to_spi_device(tcm_hcd->pdev->dev.parent); + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + mutex_lock(&tcm_hcd->io_ctrl_mutex); + + spi_message_init(&msg); + + if (bdata->byte_delay_us == 0) + retval = syna_tcm_spi_alloc_mem(tcm_hcd, 1, length); + else + retval = syna_tcm_spi_alloc_mem(tcm_hcd, length, 1); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory\n"); + goto exit; + } + + if (bdata->byte_delay_us == 0) { + memset(buf, 0xff, length); + xfer[0].len = length; + xfer[0].tx_buf = buf; + xfer[0].rx_buf = data; + if (bdata->block_delay_us) + xfer[0].delay_usecs = bdata->block_delay_us; + spi_message_add_tail(&xfer[0], &msg); + } else { + buf[0] = 0xff; + for (idx = 0; idx < length; idx++) { + xfer[idx].len = 1; + xfer[idx].tx_buf = buf; + xfer[idx].rx_buf = &data[idx]; + xfer[idx].delay_usecs = bdata->byte_delay_us; + if (bdata->block_delay_us && (idx == length - 1)) + xfer[idx].delay_usecs = bdata->block_delay_us; + spi_message_add_tail(&xfer[idx], &msg); + } + } + + retval = spi_sync(spi, &msg); + if (retval == 0) { + retval = length; + } else { + LOGE(&spi->dev, + "Failed to complete SPI transfer, error = %d\n", + retval); + } + +exit: + mutex_unlock(&tcm_hcd->io_ctrl_mutex); + + return retval; +} + +static int syna_tcm_spi_write(struct syna_tcm_hcd *tcm_hcd, unsigned char *data, + unsigned int length) +{ + int retval; + unsigned int idx; + struct spi_message msg; + struct spi_device *spi = to_spi_device(tcm_hcd->pdev->dev.parent); + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + mutex_lock(&tcm_hcd->io_ctrl_mutex); + + spi_message_init(&msg); + + if (bdata->byte_delay_us == 0) + retval = syna_tcm_spi_alloc_mem(tcm_hcd, 1, 0); + else + retval = syna_tcm_spi_alloc_mem(tcm_hcd, length, 0); + if (retval < 0) { + LOGE(&spi->dev, + "Failed to allocate memory\n"); + goto exit; + } + + if (bdata->byte_delay_us == 0) { + xfer[0].len = length; + xfer[0].tx_buf = data; + if (bdata->block_delay_us) + xfer[0].delay_usecs = bdata->block_delay_us; + spi_message_add_tail(&xfer[0], &msg); + } else { + for (idx = 0; idx < length; idx++) { + xfer[idx].len = 1; + xfer[idx].tx_buf = &data[idx]; + xfer[idx].delay_usecs = bdata->byte_delay_us; + if (bdata->block_delay_us && (idx == length - 1)) + xfer[idx].delay_usecs = bdata->block_delay_us; + spi_message_add_tail(&xfer[idx], &msg); + } + } + + retval = spi_sync(spi, &msg); + if (retval == 0) { + retval = length; + } else { + LOGE(&spi->dev, + "Failed to complete SPI transfer, error = %d\n", + retval); + } + +exit: + mutex_unlock(&tcm_hcd->io_ctrl_mutex); + + return retval; +} + +static int syna_tcm_spi_probe(struct spi_device *spi) +{ + int retval; + + if (spi->master->flags & SPI_MASTER_HALF_DUPLEX) { + LOGE(&spi->dev, + "Full duplex not supported by host\n"); + return -EIO; + } + + syna_tcm_spi_device = platform_device_alloc(PLATFORM_DRIVER_NAME, 0); + if (!syna_tcm_spi_device) { + LOGE(&spi->dev, + "Failed to allocate platform device\n"); + return -ENOMEM; + } + +#ifdef CONFIG_OF + hw_if.bdata = devm_kzalloc(&spi->dev, sizeof(*hw_if.bdata), GFP_KERNEL); + if (!hw_if.bdata) { + LOGE(&spi->dev, + "Failed to allocate memory for board data\n"); + return -ENOMEM; + } + parse_dt(&spi->dev, hw_if.bdata); +#else + hw_if.bdata = spi->dev.platform_data; +#endif + + switch (hw_if.bdata->spi_mode) { + case 0: + spi->mode = SPI_MODE_0; + break; + case 1: + spi->mode = SPI_MODE_1; + break; + case 2: + spi->mode = SPI_MODE_2; + break; + case 3: + spi->mode = SPI_MODE_3; + break; + } + + bus_io.type = BUS_SPI; + bus_io.read = syna_tcm_spi_read; + bus_io.write = syna_tcm_spi_write; + bus_io.rmi_read = syna_tcm_spi_rmi_read; + bus_io.rmi_write = syna_tcm_spi_rmi_write; + + hw_if.bus_io = &bus_io; + + spi->bits_per_word = 8; + + retval = spi_setup(spi); + if (retval < 0) { + LOGE(&spi->dev, + "Failed to set up SPI protocol driver\n"); + return retval; + } + + syna_tcm_spi_device->dev.parent = &spi->dev; + syna_tcm_spi_device->dev.platform_data = &hw_if; + + retval = platform_device_add(syna_tcm_spi_device); + if (retval < 0) { + LOGE(&spi->dev, + "Failed to add platform device\n"); + return retval; + } + + return 0; +} + +static int syna_tcm_spi_remove(struct spi_device *spi) +{ + syna_tcm_spi_device->dev.platform_data = NULL; + + platform_device_unregister(syna_tcm_spi_device); + + return 0; +} + +static const struct spi_device_id syna_tcm_id_table[] = { + {SPI_MODULE_NAME, 0}, + {}, +}; +MODULE_DEVICE_TABLE(spi, syna_tcm_id_table); + +#ifdef CONFIG_OF +static struct of_device_id syna_tcm_of_match_table[] = { + { + .compatible = "synaptics,tcm-spi", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, syna_tcm_of_match_table); +#else +#define syna_tcm_of_match_table NULL +#endif + +static struct spi_driver syna_tcm_spi_driver = { + .driver = { + .name = SPI_MODULE_NAME, + .owner = THIS_MODULE, + .of_match_table = syna_tcm_of_match_table, + }, + .probe = syna_tcm_spi_probe, + .remove = syna_tcm_spi_remove, + .id_table = syna_tcm_id_table, +}; + +int syna_tcm_bus_init(void) +{ + return spi_register_driver(&syna_tcm_spi_driver); +} +EXPORT_SYMBOL(syna_tcm_bus_init); + +void syna_tcm_bus_exit(void) +{ + kfree(buf); + + kfree(xfer); + + spi_unregister_driver(&syna_tcm_spi_driver); + + return; +} +EXPORT_SYMBOL(syna_tcm_bus_exit); + +MODULE_AUTHOR("Synaptics, Inc."); +MODULE_DESCRIPTION("Synaptics TCM SPI Bus Module"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_testing.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_testing.c new file mode 100644 index 000000000000..2b6bfffa3f24 --- /dev/null +++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_testing.c @@ -0,0 +1,2046 @@ +/* + * Synaptics TCM touchscreen driver + * + * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved. + * + * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS + * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, + * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS. + * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION + * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED + * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES + * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' + * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. + * DOLLARS. + */ + +#include <linux/gpio.h> +#include "synaptics_tcm_core.h" +#include "synaptics_tcm_testing.h" + +#define SYSFS_DIR_NAME "testing" + +#define REPORT_TIMEOUT_MS 500 + +#define testing_sysfs_show(t_name) \ +static ssize_t testing_sysfs_##t_name##_show(struct device *dev, \ + struct device_attribute *attr, char *buf) \ +{ \ + int retval; \ + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; \ +\ + mutex_lock(&tcm_hcd->extif_mutex); \ + LOGE(tcm_hcd->pdev->dev.parent, \ + ""#t_name" test start\n"); \ +\ + retval = testing_##t_name(); \ + if (retval < 0) { \ + LOGE(tcm_hcd->pdev->dev.parent, \ + "Failed to do "#t_name" test\n"); \ + goto exit; \ + } \ +\ + retval = snprintf(buf, PAGE_SIZE, \ + "%s\n", \ + testing_hcd->result ? "Passed" : "Failed"); \ +\ +exit: \ + mutex_unlock(&tcm_hcd->extif_mutex); \ +\ + LOGE(tcm_hcd->pdev->dev.parent, \ + ""#t_name" test end\n"); \ + return retval; \ +} + +enum test_code { + TEST_TRX_TRX_SHORTS = 0, + TEST_TRX_SENSOR_OPENS = 1, + TEST_TRX_GROUND_SHORTS = 2, + TEST_DYNAMIC_RANGE = 7, + TEST_OPEN_SHORT_DETECTOR = 8, + TEST_NOISE = 10, + TEST_PT11 = 11, + TEST_PT12 = 12, + TEST_PT13 = 13, + TEST_DYNAMIC_RANGE_DOZE = 14, + TEST_NOISE_DOZE = 15, +}; + +struct testing_hcd { + bool result; + unsigned char report_type; + unsigned int report_index; + unsigned int num_of_reports; + struct kobject *sysfs_dir; + struct syna_tcm_buffer out; + struct syna_tcm_buffer resp; + struct syna_tcm_buffer report; + struct syna_tcm_buffer process; + struct syna_tcm_buffer output; + struct syna_tcm_hcd *tcm_hcd; + int result_type; + int (*collect_reports)(enum report_type report_type, + unsigned int num_of_reports); +}; + +DECLARE_COMPLETION(report_complete); + +DECLARE_COMPLETION(testing_remove_complete); + +static struct testing_hcd *testing_hcd; + +static int testing_dynamic_range(void); + +static int testing_dynamic_range_lpwg(void); + +static int testing_dynamic_range_doze(void); + +static int testing_noise(void); + +static int testing_noise_lpwg(void); + +static int testing_noise_doze(void); + +static int testing_open_short_detector(void); + +static int testing_pt11(void); + +static int testing_pt12(void); + +static int testing_pt13(void); + +static int testing_reset_open(void); + +static int testing_lockdown(void); + +static int testing_trx(enum test_code test_code); + +SHOW_PROTOTYPE(testing, dynamic_range) +SHOW_PROTOTYPE(testing, dynamic_range_lpwg) +SHOW_PROTOTYPE(testing, dynamic_range_doze) +SHOW_PROTOTYPE(testing, noise) +SHOW_PROTOTYPE(testing, noise_lpwg) +SHOW_PROTOTYPE(testing, noise_doze) +SHOW_PROTOTYPE(testing, open_short_detector) +SHOW_PROTOTYPE(testing, pt11) +SHOW_PROTOTYPE(testing, pt12) +SHOW_PROTOTYPE(testing, pt13) +SHOW_PROTOTYPE(testing, reset_open) +SHOW_PROTOTYPE(testing, lockdown) +SHOW_PROTOTYPE(testing, trx_trx_shorts) +SHOW_PROTOTYPE(testing, trx_sensor_opens) +SHOW_PROTOTYPE(testing, trx_ground_shorts) +SHOW_PROTOTYPE(testing, size) + +static struct device_attribute *attrs[] = { + ATTRIFY(dynamic_range), + ATTRIFY(dynamic_range_lpwg), + ATTRIFY(dynamic_range_doze), + ATTRIFY(noise), + ATTRIFY(noise_lpwg), + ATTRIFY(noise_doze), + ATTRIFY(open_short_detector), + ATTRIFY(pt11), + ATTRIFY(pt12), + ATTRIFY(pt13), + ATTRIFY(reset_open), + ATTRIFY(lockdown), + ATTRIFY(trx_trx_shorts), + ATTRIFY(trx_sensor_opens), + ATTRIFY(trx_ground_shorts), + ATTRIFY(size), +}; + +static ssize_t testing_sysfs_data_show(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count); + +static struct bin_attribute bin_attr = { + .attr = { + .name = "data", + .mode = S_IRUGO, + }, + .size = 0, + .read = testing_sysfs_data_show, +}; + +testing_sysfs_show(dynamic_range) + +testing_sysfs_show(dynamic_range_lpwg) + +testing_sysfs_show(dynamic_range_doze) + +testing_sysfs_show(noise) + +testing_sysfs_show(noise_lpwg) + +testing_sysfs_show(noise_doze) + +testing_sysfs_show(open_short_detector) + +testing_sysfs_show(pt11) + +testing_sysfs_show(pt12) + +testing_sysfs_show(pt13) + +testing_sysfs_show(reset_open) + +testing_sysfs_show(lockdown) + +static ssize_t testing_sysfs_trx_trx_shorts_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + retval = testing_trx(TEST_TRX_TRX_SHORTS); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do TRX-TRX shorts test\n"); + goto exit; + } + + retval = snprintf(buf, PAGE_SIZE, + "%s\n", + testing_hcd->result ? "Passed" : "Failed"); + +exit: + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t testing_sysfs_trx_sensor_opens_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + retval = testing_trx(TEST_TRX_SENSOR_OPENS); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do TRX-sensor opens test\n"); + goto exit; + } + + retval = snprintf(buf, PAGE_SIZE, + "%s\n", + testing_hcd->result ? "Passed" : "Failed"); + +exit: + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t testing_sysfs_trx_ground_shorts_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + retval = testing_trx(TEST_TRX_GROUND_SHORTS); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do TRX-ground shorts test\n"); + goto exit; + } + + retval = snprintf(buf, PAGE_SIZE, + "%s\n", + testing_hcd->result ? "Passed" : "Failed"); + +exit: + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t testing_sysfs_size_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + LOCK_BUFFER(testing_hcd->output); + + retval = snprintf(buf, PAGE_SIZE, + "%u\n", + testing_hcd->output.data_length); + + UNLOCK_BUFFER(testing_hcd->output); + + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static ssize_t testing_sysfs_data_show(struct file *data_file, + struct kobject *kobj, struct bin_attribute *attributes, + char *buf, loff_t pos, size_t count) +{ + int retval; + unsigned int readlen; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + mutex_lock(&tcm_hcd->extif_mutex); + + LOCK_BUFFER(testing_hcd->output); + + readlen = MIN(count, testing_hcd->output.data_length - pos); + + retval = secure_memcpy(buf, + count, + &testing_hcd->output.buf[pos], + testing_hcd->output.buf_size - pos, + readlen); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy report data\n"); + } else { + retval = readlen; + } + + UNLOCK_BUFFER(testing_hcd->output); + + mutex_unlock(&tcm_hcd->extif_mutex); + + return retval; +} + +static int testing_run_prod_test_item(enum test_code test_code) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + if (tcm_hcd->features.dual_firmware && + tcm_hcd->id_info.mode != MODE_PRODUCTION_TEST) { + retval = tcm_hcd->switch_mode(tcm_hcd, FW_MODE_PRODUCTION_TEST); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run production test firmware\n"); + return retval; + } + } else if (tcm_hcd->id_info.mode != MODE_APPLICATION || + tcm_hcd->app_status != APP_STATUS_OK) { + LOGE(tcm_hcd->pdev->dev.parent, + "Application firmware not running\n"); + return -ENODEV; + } + + LOCK_BUFFER(testing_hcd->out); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &testing_hcd->out, + 1); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for testing_hcd->out.buf\n"); + UNLOCK_BUFFER(testing_hcd->out); + return retval; + } + + testing_hcd->out.buf[0] = test_code; + + LOCK_BUFFER(testing_hcd->resp); + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_PRODUCTION_TEST, + testing_hcd->out.buf, + 1, + &testing_hcd->resp.buf, + &testing_hcd->resp.buf_size, + &testing_hcd->resp.data_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_PRODUCTION_TEST)); + UNLOCK_BUFFER(testing_hcd->resp); + UNLOCK_BUFFER(testing_hcd->out); + return retval; + } + + UNLOCK_BUFFER(testing_hcd->resp); + UNLOCK_BUFFER(testing_hcd->out); + + return 0; +} + +static int testing_collect_reports(enum report_type report_type, + unsigned int num_of_reports) +{ + int retval; + bool completed; + unsigned int timeout; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + testing_hcd->report_index = 0; + testing_hcd->report_type = report_type; + testing_hcd->num_of_reports = num_of_reports; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)) + reinit_completion(&report_complete); +#else + INIT_COMPLETION(report_complete); +#endif + + LOCK_BUFFER(testing_hcd->out); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &testing_hcd->out, + 1); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for testing_hcd->out.buf\n"); + UNLOCK_BUFFER(testing_hcd->out); + goto exit; + } + + testing_hcd->out.buf[0] = testing_hcd->report_type; + + LOCK_BUFFER(testing_hcd->resp); + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_ENABLE_REPORT, + testing_hcd->out.buf, + 1, + &testing_hcd->resp.buf, + &testing_hcd->resp.buf_size, + &testing_hcd->resp.data_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_ENABLE_REPORT)); + UNLOCK_BUFFER(testing_hcd->resp); + UNLOCK_BUFFER(testing_hcd->out); + goto exit; + } + + UNLOCK_BUFFER(testing_hcd->resp); + UNLOCK_BUFFER(testing_hcd->out); + + completed = false; + timeout = REPORT_TIMEOUT_MS * num_of_reports; + + retval = wait_for_completion_timeout(&report_complete, + msecs_to_jiffies(timeout)); + if (retval == 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Timed out waiting for report collection\n"); + } else { + completed = true; + } + + LOCK_BUFFER(testing_hcd->out); + + testing_hcd->out.buf[0] = testing_hcd->report_type; + + LOCK_BUFFER(testing_hcd->resp); + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_DISABLE_REPORT, + testing_hcd->out.buf, + 1, + &testing_hcd->resp.buf, + &testing_hcd->resp.buf_size, + &testing_hcd->resp.data_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_DISABLE_REPORT)); + UNLOCK_BUFFER(testing_hcd->resp); + UNLOCK_BUFFER(testing_hcd->out); + goto exit; + } + + UNLOCK_BUFFER(testing_hcd->resp); + UNLOCK_BUFFER(testing_hcd->out); + + if (completed) + retval = 0; + else + retval = -EIO; + +exit: + testing_hcd->report_type = 0; + + return retval; +} + +static void testing_get_frame_size_words(unsigned int *size, bool image_only) +{ + unsigned int rows; + unsigned int cols; + unsigned int hybrid; + unsigned int buttons; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + app_info = &tcm_hcd->app_info; + + rows = le2_to_uint(app_info->num_of_image_rows); + cols = le2_to_uint(app_info->num_of_image_cols); + hybrid = le2_to_uint(app_info->has_hybrid_data); + buttons = le2_to_uint(app_info->num_of_buttons); + + *size = rows * cols; + + if (!image_only) { + if (hybrid) + *size += rows + cols; + *size += buttons; + } + + return; +} + +static void testing_doze_frame_output(unsigned int rows, unsigned int cols) +{ + int retval; + unsigned int data_size; + unsigned int header_size; + unsigned int output_size; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + app_info = &tcm_hcd->app_info; + + header_size = 2; + + data_size = rows * cols; + + if (le2_to_uint(app_info->num_of_buttons)) + data_size++; + + output_size = header_size + data_size * 2; + + LOCK_BUFFER(testing_hcd->output); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &testing_hcd->output, + output_size); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for testing_hcd->output.buf\n"); + UNLOCK_BUFFER(testing_hcd->output); + return; + } + + testing_hcd->output.buf[0] = rows; + testing_hcd->output.buf[1] = cols; + + output_size = header_size; + + LOCK_BUFFER(testing_hcd->resp); + + retval = secure_memcpy(testing_hcd->output.buf + header_size, + testing_hcd->output.buf_size - header_size, + testing_hcd->resp.buf, + testing_hcd->resp.buf_size, + testing_hcd->resp.data_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy test data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + UNLOCK_BUFFER(testing_hcd->output); + return; + } + + output_size += testing_hcd->resp.data_length; + + UNLOCK_BUFFER(testing_hcd->resp); + + testing_hcd->output.data_length = output_size; + + UNLOCK_BUFFER(testing_hcd->output); + + return; +} + +static void testing_standard_frame_output(bool image_only) +{ + int retval; + unsigned int data_size; + unsigned int header_size; + unsigned int output_size; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + app_info = &tcm_hcd->app_info; + + testing_get_frame_size_words(&data_size, image_only); + + header_size = sizeof(app_info->num_of_buttons) + + sizeof(app_info->num_of_image_rows) + + sizeof(app_info->num_of_image_cols) + + sizeof(app_info->has_hybrid_data); + + output_size = header_size + data_size * 2; + + LOCK_BUFFER(testing_hcd->output); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &testing_hcd->output, + output_size); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for testing_hcd->output.buf\n"); + UNLOCK_BUFFER(testing_hcd->output); + return; + } + + retval = secure_memcpy(testing_hcd->output.buf, + testing_hcd->output.buf_size, + &app_info->num_of_buttons[0], + header_size, + header_size); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy header data\n"); + UNLOCK_BUFFER(testing_hcd->output); + return; + } + + output_size = header_size; + + LOCK_BUFFER(testing_hcd->resp); + + retval = secure_memcpy(testing_hcd->output.buf + header_size, + testing_hcd->output.buf_size - header_size, + testing_hcd->resp.buf, + testing_hcd->resp.buf_size, + testing_hcd->resp.data_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy test data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + UNLOCK_BUFFER(testing_hcd->output); + return; + } + + output_size += testing_hcd->resp.data_length; + + UNLOCK_BUFFER(testing_hcd->resp); + + testing_hcd->output.data_length = output_size; + + UNLOCK_BUFFER(testing_hcd->output); + + return; +} + +static int testing_dynamic_range_doze(void) +{ + int retval; + unsigned char *buf; + unsigned int idx; + unsigned int row; + unsigned int col; + unsigned int data; + unsigned int rows; + unsigned int cols; + unsigned int data_size; + unsigned int limits_rows; + unsigned int limits_cols; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + app_info = &tcm_hcd->app_info; + + cols = le2_to_uint(app_info->num_of_image_cols); + + retval = testing_run_prod_test_item(TEST_DYNAMIC_RANGE_DOZE); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run test\n"); + goto exit; + } + + LOCK_BUFFER(testing_hcd->resp); + + data_size = testing_hcd->resp.data_length / 2; + + if (le2_to_uint(app_info->num_of_buttons)) + data_size--; + + if (data_size % cols) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid max number of rows per burst\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + rows = data_size / cols; + + limits_rows = sizeof(drt_hi_limits) / sizeof(drt_hi_limits[0]); + limits_cols = sizeof(drt_hi_limits[0]) / sizeof(drt_hi_limits[0][0]); + + if (rows > limits_rows || cols > limits_cols) { + LOGE(tcm_hcd->pdev->dev.parent, + "Mismatching limits data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + limits_rows = sizeof(drt_lo_limits) / sizeof(drt_lo_limits[0]); + limits_cols = sizeof(drt_lo_limits[0]) / sizeof(drt_lo_limits[0][0]); + + if (rows > limits_rows || cols > limits_cols) { + LOGE(tcm_hcd->pdev->dev.parent, + "Mismatching limits data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + idx = 0; + buf = testing_hcd->resp.buf; + testing_hcd->result = true; + + for (row = 0; row < rows; row++) { + for (col = 0; col < cols; col++) { + data = le2_to_uint(&buf[idx * 2]); + if (data > drt_hi_limits[row][col] || + data < drt_lo_limits[row][col]) { + testing_hcd->result = false; + break; + } + idx++; + } + } + + UNLOCK_BUFFER(testing_hcd->resp); + + testing_doze_frame_output(rows, cols); + + retval = 0; + +exit: + if (tcm_hcd->features.dual_firmware) { + if (tcm_hcd->reset(tcm_hcd, false, true) < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reset\n"); + } + } + + return retval; +} + +static int testing_dynamic_range_lpwg(void) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + retval = tcm_hcd->set_dynamic_config(tcm_hcd, + DC_IN_WAKEUP_GESTURE_MODE, + 1); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enable wakeup gesture mode\n"); + return retval; + } + + retval = testing_dynamic_range(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do dynamic range test\n"); + return retval; + } + + retval = tcm_hcd->set_dynamic_config(tcm_hcd, + DC_IN_WAKEUP_GESTURE_MODE, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to disable wakeup gesture mode\n"); + return retval; + } + + return 0; +} + +static int testing_dynamic_range(void) +{ + int retval; + unsigned char *buf; + unsigned int idx; + unsigned int row; + unsigned int col; + unsigned int data; + unsigned int rows; + unsigned int cols; + unsigned int limits_rows; + unsigned int limits_cols; + unsigned int frame_size_words; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + app_info = &tcm_hcd->app_info; + + rows = le2_to_uint(app_info->num_of_image_rows); + cols = le2_to_uint(app_info->num_of_image_cols); + + testing_get_frame_size_words(&frame_size_words, false); + + retval = testing_run_prod_test_item(TEST_DYNAMIC_RANGE); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run test\n"); + goto exit; + } + + LOCK_BUFFER(testing_hcd->resp); + + if (frame_size_words != testing_hcd->resp.data_length / 2) { + LOGE(tcm_hcd->pdev->dev.parent, + "Frame size mismatch\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + limits_rows = sizeof(drt_hi_limits) / sizeof(drt_hi_limits[0]); + limits_cols = sizeof(drt_hi_limits[0]) / sizeof(drt_hi_limits[0][0]); + + if (rows > limits_rows || cols > limits_cols) { + LOGE(tcm_hcd->pdev->dev.parent, + "Mismatching limits data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + limits_rows = sizeof(drt_lo_limits) / sizeof(drt_lo_limits[0]); + limits_cols = sizeof(drt_lo_limits[0]) / sizeof(drt_lo_limits[0][0]); + + if (rows > limits_rows || cols > limits_cols) { + LOGE(tcm_hcd->pdev->dev.parent, + "Mismatching limits data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + idx = 0; + buf = testing_hcd->resp.buf; + testing_hcd->result = true; + + for (row = 0; row < rows; row++) { + for (col = 0; col < cols; col++) { + data = le2_to_uint(&buf[idx * 2]); + if (data > drt_hi_limits[row][col] || + data < drt_lo_limits[row][col]) { + testing_hcd->result = false; + dev_info(tcm_hcd->pdev->dev.parent, "row:%d col:%d data:%d outof range\n", + row, col, data); + break; + } + idx++; + } + } + + UNLOCK_BUFFER(testing_hcd->resp); + + testing_standard_frame_output(false); + + retval = 0; + +exit: + if (tcm_hcd->features.dual_firmware) { + if (tcm_hcd->reset(tcm_hcd, false, true) < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reset\n"); + } + } + + return retval; +} + +static int testing_noise_doze(void) +{ + int retval; + short data; + unsigned char *buf; + unsigned int idx; + unsigned int row; + unsigned int col; + unsigned int rows; + unsigned int cols; + unsigned int data_size; + unsigned int limits_rows; + unsigned int limits_cols; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + app_info = &tcm_hcd->app_info; + + cols = le2_to_uint(app_info->num_of_image_cols); + + retval = testing_run_prod_test_item(TEST_NOISE_DOZE); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run test\n"); + goto exit; + } + + LOCK_BUFFER(testing_hcd->resp); + + data_size = testing_hcd->resp.data_length / 2; + + if (le2_to_uint(app_info->num_of_buttons)) + data_size--; + + if (data_size % cols) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid max number of rows per burst\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + rows = data_size / cols; + + limits_rows = sizeof(noise_limits) / sizeof(noise_limits[0]); + limits_cols = sizeof(noise_limits[0]) / sizeof(noise_limits[0][0]); + + if (rows > limits_rows || cols > limits_cols) { + LOGE(tcm_hcd->pdev->dev.parent, + "Mismatching limits data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + idx = 0; + buf = testing_hcd->resp.buf; + testing_hcd->result = true; + + for (row = 0; row < rows; row++) { + for (col = 0; col < cols; col++) { + data = (short)le2_to_uint(&buf[idx * 2]); + if (data > noise_limits[row][col]) { + testing_hcd->result = false; + break; + } + idx++; + } + } + + UNLOCK_BUFFER(testing_hcd->resp); + + testing_doze_frame_output(rows, cols); + + retval = 0; + +exit: + if (tcm_hcd->features.dual_firmware) { + if (tcm_hcd->reset(tcm_hcd, false, true) < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reset\n"); + } + } + + return retval; +} + +static int testing_noise_lpwg(void) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + retval = tcm_hcd->set_dynamic_config(tcm_hcd, + DC_IN_WAKEUP_GESTURE_MODE, + 1); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enable wakeup gesture mode\n"); + return retval; + } + + retval = testing_noise(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do noise test\n"); + return retval; + } + + retval = tcm_hcd->set_dynamic_config(tcm_hcd, + DC_IN_WAKEUP_GESTURE_MODE, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to disable wakeup gesture mode\n"); + return retval; + } + + return 0; +} + +static int testing_noise(void) +{ + int retval; + short data; + unsigned char *buf; + unsigned int idx; + unsigned int row; + unsigned int col; + unsigned int rows; + unsigned int cols; + unsigned int limits_rows; + unsigned int limits_cols; + unsigned int frame_size_words; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + app_info = &tcm_hcd->app_info; + + rows = le2_to_uint(app_info->num_of_image_rows); + cols = le2_to_uint(app_info->num_of_image_cols); + + testing_get_frame_size_words(&frame_size_words, false); + + retval = testing_run_prod_test_item(TEST_NOISE); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run test\n"); + goto exit; + } + + LOCK_BUFFER(testing_hcd->resp); + + if (frame_size_words != testing_hcd->resp.data_length / 2) { + LOGE(tcm_hcd->pdev->dev.parent, + "Frame size mismatch\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + limits_rows = sizeof(noise_limits) / sizeof(noise_limits[0]); + limits_cols = sizeof(noise_limits[0]) / sizeof(noise_limits[0][0]); + + if (rows > limits_rows || cols > limits_cols) { + LOGE(tcm_hcd->pdev->dev.parent, + "Mismatching limits data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + idx = 0; + buf = testing_hcd->resp.buf; + testing_hcd->result = true; + + for (row = 0; row < rows; row++) { + for (col = 0; col < cols; col++) { + data = (short)le2_to_uint(&buf[idx * 2]); + if (data > noise_limits[row][col]) { + dev_info(tcm_hcd->pdev->dev.parent, "row:%d col:%d data:%d outof range\n", + row, col, data); + testing_hcd->result = false; + break; + } + idx++; + } + } + + UNLOCK_BUFFER(testing_hcd->resp); + + testing_standard_frame_output(false); + + retval = 0; + +exit: + if (tcm_hcd->features.dual_firmware) { + if (tcm_hcd->reset(tcm_hcd, false, true) < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reset\n"); + } + } + + return retval; +} + +static void testing_open_short_detector_output(void) +{ + int retval; + unsigned int rows; + unsigned int cols; + unsigned int data_size; + unsigned int header_size; + unsigned int output_size; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + app_info = &tcm_hcd->app_info; + + rows = le2_to_uint(app_info->num_of_image_rows); + cols = le2_to_uint(app_info->num_of_image_cols); + data_size = (rows * cols + 7) / 8; + + header_size = sizeof(app_info->num_of_buttons) + + sizeof(app_info->num_of_image_rows) + + sizeof(app_info->num_of_image_cols) + + sizeof(app_info->has_hybrid_data); + + output_size = header_size + data_size * 2; + + LOCK_BUFFER(testing_hcd->output); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &testing_hcd->output, + output_size); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for testing_hcd->output.buf\n"); + UNLOCK_BUFFER(testing_hcd->output); + return; + } + + retval = secure_memcpy(testing_hcd->output.buf, + testing_hcd->output.buf_size, + &app_info->num_of_buttons[0], + header_size, + header_size); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy header data\n"); + UNLOCK_BUFFER(testing_hcd->output); + return; + } + + output_size = header_size; + + LOCK_BUFFER(testing_hcd->resp); + + retval = secure_memcpy(testing_hcd->output.buf + header_size, + testing_hcd->output.buf_size - header_size, + testing_hcd->resp.buf, + testing_hcd->resp.buf_size, + testing_hcd->resp.data_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy test data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + UNLOCK_BUFFER(testing_hcd->output); + return; + } + + output_size += testing_hcd->resp.data_length; + + UNLOCK_BUFFER(testing_hcd->resp); + + testing_hcd->output.data_length = output_size; + + UNLOCK_BUFFER(testing_hcd->output); + + return; +} + +static int testing_open_short_detector(void) +{ + int retval; + unsigned int bit; + unsigned int byte; + unsigned int row; + unsigned int col; + unsigned int rows; + unsigned int cols; + unsigned int data_size; + unsigned char *data; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + app_info = &tcm_hcd->app_info; + + rows = le2_to_uint(app_info->num_of_image_rows); + cols = le2_to_uint(app_info->num_of_image_cols); + data_size = (rows * cols + 7) / 8; + + retval = testing_run_prod_test_item(TEST_OPEN_SHORT_DETECTOR); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run test\n"); + goto exit; + } + + LOCK_BUFFER(testing_hcd->resp); + + if (data_size * 2 != testing_hcd->resp.data_length) { + LOGE(tcm_hcd->pdev->dev.parent, + "Data size mismatch\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + testing_hcd->result = true; + + bit = 0; + byte = 0; + data = &testing_hcd->resp.buf[0]; + for (row = 0; row < rows; row++) { + for (col = 0; col < cols; col++) { + if (data[byte] & (1 << bit)) { + testing_hcd->result = false; + break; + } + if (bit++ > 7) { + bit = 0; + byte++; + } + } + } + + if (testing_hcd->result == true) { + bit = 0; + byte = 0; + data = &testing_hcd->resp.buf[data_size]; + for (row = 0; row < rows; row++) { + for (col = 0; col < cols; col++) { + if (data[byte] & (1 << bit)) { + testing_hcd->result = false; + break; + } + if (bit++ > 7) { + bit = 0; + byte++; + } + } + } + } + + UNLOCK_BUFFER(testing_hcd->resp); + + testing_open_short_detector_output(); + + retval = 0; + +exit: + if (tcm_hcd->reset(tcm_hcd, false, true) < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reset\n"); + } + + return retval; +} + +static int testing_pt11(void) +{ + int retval; + short data; + unsigned char *buf; + unsigned int idx; + unsigned int row; + unsigned int col; + unsigned int rows; + unsigned int cols; + unsigned int limits_rows; + unsigned int limits_cols; + unsigned int image_size_words; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + app_info = &tcm_hcd->app_info; + rows = le2_to_uint(app_info->num_of_image_rows); + cols = le2_to_uint(app_info->num_of_image_cols); + dev_info(tcm_hcd->pdev->dev.parent, "%s\n", __func__); + testing_get_frame_size_words(&image_size_words, true); + + retval = testing_run_prod_test_item(TEST_PT11); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run test\n"); + goto exit; + } + + LOCK_BUFFER(testing_hcd->resp); + + if (image_size_words != testing_hcd->resp.data_length / 2) { + LOGE(tcm_hcd->pdev->dev.parent, + "Image size mismatch\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + limits_rows = sizeof(pt11_hi_limits) / sizeof(pt11_hi_limits[0]); + limits_cols = sizeof(pt11_hi_limits[0]) / sizeof(pt11_hi_limits[0][0]); + + if (rows > limits_rows || cols > limits_cols) { + LOGE(tcm_hcd->pdev->dev.parent, + "Mismatching limits data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + limits_rows = sizeof(pt11_lo_limits) / sizeof(pt11_lo_limits[0]); + limits_cols = sizeof(pt11_lo_limits[0]) / sizeof(pt11_lo_limits[0][0]); + + if (rows > limits_rows || cols > limits_cols) { + LOGE(tcm_hcd->pdev->dev.parent, + "Mismatching limits data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + idx = 0; + buf = testing_hcd->resp.buf; + testing_hcd->result = true; + + for (row = 0; row < rows; row++) { + for (col = 0; col < cols; col++) { + data = (short)le2_to_uint(&buf[idx * 2]); + if (data > pt11_hi_limits[row][col] || + data < pt11_lo_limits[row][col]) { + dev_info(tcm_hcd->pdev->dev.parent, "row:%d, col: %d data:%d outof range:\n", + row, col, data); + testing_hcd->result = false; + break; + } + idx++; + } + } + + UNLOCK_BUFFER(testing_hcd->resp); + + testing_standard_frame_output(true); + + retval = 0; + +exit: + if (tcm_hcd->features.dual_firmware) { + if (tcm_hcd->reset(tcm_hcd, false, true) < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reset\n"); + } + } + + return retval; +} + +static int testing_pt12(void) +{ + int retval; + short data; + unsigned char *buf; + unsigned int idx; + unsigned int row; + unsigned int col; + unsigned int rows; + unsigned int cols; + unsigned int limits_rows; + unsigned int limits_cols; + unsigned int image_size_words; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + app_info = &tcm_hcd->app_info; + + rows = le2_to_uint(app_info->num_of_image_rows); + cols = le2_to_uint(app_info->num_of_image_cols); + + testing_get_frame_size_words(&image_size_words, true); + + retval = testing_run_prod_test_item(TEST_PT12); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run test\n"); + goto exit; + } + + LOCK_BUFFER(testing_hcd->resp); + + if (image_size_words != testing_hcd->resp.data_length / 2) { + LOGE(tcm_hcd->pdev->dev.parent, + "Image size mismatch\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + limits_rows = sizeof(pt12_limits) / sizeof(pt12_limits[0]); + limits_cols = sizeof(pt12_limits[0]) / sizeof(pt12_limits[0][0]); + + if (rows > limits_rows || cols > limits_cols) { + LOGE(tcm_hcd->pdev->dev.parent, + "Mismatching limits data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + idx = 0; + buf = testing_hcd->resp.buf; + testing_hcd->result = true; + + for (row = 0; row < rows; row++) { + for (col = 0; col < cols; col++) { + data = (short)le2_to_uint(&buf[idx * 2]); + if (data < pt12_limits[row][col]) { + testing_hcd->result = false; + break; + } + idx++; + } + } + + UNLOCK_BUFFER(testing_hcd->resp); + + testing_standard_frame_output(true); + + retval = 0; + +exit: + if (tcm_hcd->features.dual_firmware) { + if (tcm_hcd->reset(tcm_hcd, false, true) < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reset\n"); + } + } + + return retval; +} + +static int testing_pt13(void) +{ + int retval; + short data; + unsigned char *buf; + unsigned int idx; + unsigned int row; + unsigned int col; + unsigned int rows; + unsigned int cols; + unsigned int limits_rows; + unsigned int limits_cols; + unsigned int image_size_words; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + app_info = &tcm_hcd->app_info; + + rows = le2_to_uint(app_info->num_of_image_rows); + cols = le2_to_uint(app_info->num_of_image_cols); + + testing_get_frame_size_words(&image_size_words, true); + + retval = testing_run_prod_test_item(TEST_PT13); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run test\n"); + goto exit; + } + + LOCK_BUFFER(testing_hcd->resp); + + if (image_size_words != testing_hcd->resp.data_length / 2) { + LOGE(tcm_hcd->pdev->dev.parent, + "Image size mismatch\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + limits_rows = sizeof(pt13_limits) / sizeof(pt13_limits[0]); + limits_cols = sizeof(pt13_limits[0]) / sizeof(pt13_limits[0][0]); + + if (rows > limits_rows || cols > limits_cols) { + LOGE(tcm_hcd->pdev->dev.parent, + "Mismatching limits data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + retval = -EINVAL; + goto exit; + } + + idx = 0; + buf = testing_hcd->resp.buf; + testing_hcd->result = true; + + for (row = 0; row < rows; row++) { + for (col = 0; col < cols; col++) { + data = (short)le2_to_uint(&buf[idx * 2]); + if (data < pt13_limits[row][col]) { + testing_hcd->result = false; + break; + } + idx++; + } + } + + UNLOCK_BUFFER(testing_hcd->resp); + + testing_standard_frame_output(true); + + retval = 0; + +exit: + if (tcm_hcd->features.dual_firmware) { + if (tcm_hcd->reset(tcm_hcd, false, true) < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reset\n"); + } + } + + return retval; +} + +static int testing_reset_open(void) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + if (bdata->reset_gpio < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Hardware reset unavailable\n"); + return -EINVAL; + } + + mutex_lock(&tcm_hcd->reset_mutex); + + tcm_hcd->update_watchdog(tcm_hcd, false); + + gpio_set_value(bdata->reset_gpio, bdata->reset_on_state); + msleep(bdata->reset_active_ms); + gpio_set_value(bdata->reset_gpio, !bdata->reset_on_state); + msleep(bdata->reset_delay_ms); + + tcm_hcd->update_watchdog(tcm_hcd, true); + + mutex_unlock(&tcm_hcd->reset_mutex); + + if (tcm_hcd->id_info.mode == MODE_APPLICATION) { + retval = tcm_hcd->switch_mode(tcm_hcd, FW_MODE_BOOTLOADER); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enter bootloader mode\n"); + return retval; + } + } else { + retval = tcm_hcd->identify(tcm_hcd, false); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do identification\n"); + goto run_app_firmware; + } + } + + if (tcm_hcd->boot_info.last_reset_reason == reset_open_limit) + testing_hcd->result = true; + else + testing_hcd->result = false; + + retval = 0; + +run_app_firmware: + if (tcm_hcd->switch_mode(tcm_hcd, FW_MODE_APPLICATION) < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run application firmware\n"); + } + + return retval; +} + +static void testing_lockdown_output(void) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + LOCK_BUFFER(testing_hcd->output); + LOCK_BUFFER(testing_hcd->resp); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &testing_hcd->output, + testing_hcd->resp.data_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for testing_hcd->output.buf\n"); + UNLOCK_BUFFER(testing_hcd->resp); + UNLOCK_BUFFER(testing_hcd->output); + return; + } + + retval = secure_memcpy(testing_hcd->output.buf, + testing_hcd->output.buf_size, + testing_hcd->resp.buf, + testing_hcd->resp.buf_size, + testing_hcd->resp.data_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy test data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + UNLOCK_BUFFER(testing_hcd->output); + return; + } + + testing_hcd->output.data_length = testing_hcd->resp.data_length; + + UNLOCK_BUFFER(testing_hcd->resp); + UNLOCK_BUFFER(testing_hcd->output); + + return; +} + +static int testing_lockdown(void) +{ + int retval; + unsigned int idx; + unsigned int lockdown_size; + unsigned int limits_size; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + if (tcm_hcd->read_flash_data == NULL) { + LOGE(tcm_hcd->pdev->dev.parent, + "Unable to read from flash\n"); + return -EINVAL; + } + + LOCK_BUFFER(testing_hcd->resp); + + retval = tcm_hcd->read_flash_data(CUSTOM_OTP, true, &testing_hcd->resp); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read lockdown data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + return retval; + } + + lockdown_size = testing_hcd->resp.data_length; + + limits_size = sizeof(lockdown_limits) / sizeof(*lockdown_limits); + + if (lockdown_size != limits_size) { + LOGE(tcm_hcd->pdev->dev.parent, + "Mismatching limits data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + return -EINVAL; + } + + testing_hcd->result = true; + + for (idx = 0; idx < lockdown_size; idx++) { + if (testing_hcd->resp.buf[idx] != lockdown_limits[idx]) { + testing_hcd->result = false; + break; + } + } + + UNLOCK_BUFFER(testing_hcd->resp); + + testing_lockdown_output(); + + return 0; +} + +static void testing_trx_output(void) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + LOCK_BUFFER(testing_hcd->output); + LOCK_BUFFER(testing_hcd->resp); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &testing_hcd->output, + testing_hcd->resp.data_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for testing_hcd->output.buf\n"); + UNLOCK_BUFFER(testing_hcd->resp); + UNLOCK_BUFFER(testing_hcd->output); + return; + } + + retval = secure_memcpy(testing_hcd->output.buf, + testing_hcd->output.buf_size, + testing_hcd->resp.buf, + testing_hcd->resp.buf_size, + testing_hcd->resp.data_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy test data\n"); + UNLOCK_BUFFER(testing_hcd->resp); + UNLOCK_BUFFER(testing_hcd->output); + return; + } + + testing_hcd->output.data_length = testing_hcd->resp.data_length; + + UNLOCK_BUFFER(testing_hcd->resp); + UNLOCK_BUFFER(testing_hcd->output); + + return; +} + +static int testing_trx(enum test_code test_code) +{ + int retval; + unsigned char pass_vector; + unsigned int idx; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + switch (test_code) { + case TEST_TRX_TRX_SHORTS: + case TEST_TRX_GROUND_SHORTS: + pass_vector = 0xff; + break; + case TEST_TRX_SENSOR_OPENS: + pass_vector = 0x00; + break; + default: + return -EINVAL; + } + + retval = testing_run_prod_test_item(test_code); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to run test\n"); + goto exit; + } + + LOCK_BUFFER(testing_hcd->resp); + + testing_hcd->result = true; + + for (idx = 0; idx < testing_hcd->resp.data_length; idx++) { + if (testing_hcd->resp.buf[idx] != pass_vector) { + testing_hcd->result = false; + break; + } + } + + UNLOCK_BUFFER(testing_hcd->resp); + + testing_trx_output(); + + retval = 0; + +exit: + if (tcm_hcd->features.dual_firmware) { + if (tcm_hcd->reset(tcm_hcd, false, true) < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do reset\n"); + } + } + + return retval; +} + +static void testing_report(void) +{ + int retval; + unsigned int offset; + unsigned int report_size; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + report_size = tcm_hcd->report.buffer.data_length; + + LOCK_BUFFER(testing_hcd->report); + + if (testing_hcd->report_index == 0) { + retval = syna_tcm_alloc_mem(tcm_hcd, + &testing_hcd->report, + report_size * testing_hcd->num_of_reports); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for testing_hcd->report.buf\n"); + UNLOCK_BUFFER(testing_hcd->report); + return; + } + } + + if (testing_hcd->report_index < testing_hcd->num_of_reports) { + offset = report_size * testing_hcd->report_index; + + retval = secure_memcpy(testing_hcd->report.buf + offset, + testing_hcd->report.buf_size - offset, + tcm_hcd->report.buffer.buf, + tcm_hcd->report.buffer.buf_size, + tcm_hcd->report.buffer.data_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy report data\n"); + UNLOCK_BUFFER(testing_hcd->report); + return; + } + + testing_hcd->report_index++; + testing_hcd->report.data_length += report_size; + } + + UNLOCK_BUFFER(testing_hcd->report); + + if (testing_hcd->report_index == testing_hcd->num_of_reports) + complete(&report_complete); + + return; +} + +static ssize_t i2c_test(void) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; + + retval = tcm_hcd->read_message(tcm_hcd, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read message\n"); + testing_hcd->result_type = TEST_FAILED; + } else + testing_hcd->result_type = TEST_OK; + return retval; +} + +static ssize_t syna_selftest_read(struct file *file, char __user *buf, size_t count, loff_t *pos) +{ + char tmp[5]; + + if (!testing_hcd) + return 0; + if (*pos != 0) + return 0; + + snprintf(tmp, sizeof(testing_hcd->result_type), "%d\n", testing_hcd->result_type); + if (copy_to_user(buf, tmp, strlen(tmp))) { + return -EFAULT; + } + + *pos += strlen(tmp); + + return strlen(tmp); +} + +static ssize_t syna_selftest_write(struct file *file, const char __user *buf, size_t count, loff_t *pos) +{ + int retval; + char tmp[6]; + + if (!testing_hcd || count > sizeof(tmp)) { + retval = -EINVAL; + testing_hcd->result_type = TEST_INVALID; + goto out; + } + + if (copy_from_user(tmp, buf, count)) { + retval = -EFAULT; + goto out; + } + + if (!strncmp(tmp, "short", 5) || !strncmp(tmp, "open", 4)) { + testing_pt11(); + if (testing_hcd->result) + testing_hcd->result_type = TEST_OK; + else + testing_hcd->result_type = TEST_FAILED; + } else if (!strncmp(tmp, "i2c", 3)) + retval = i2c_test(); + +out: + if (retval >= 0) + retval = count; + + return retval; +} + +static const struct file_operations syna_selftest_ops = { + .read = syna_selftest_read, + .write = syna_selftest_write, +}; + +static int testing_init(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + int idx; + static bool proc_already; + + testing_hcd = kzalloc(sizeof(*testing_hcd), GFP_KERNEL); + if (!testing_hcd) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for testing_hcd\n"); + return -ENOMEM; + } + + testing_hcd->tcm_hcd = tcm_hcd; + + testing_hcd->collect_reports = testing_collect_reports; + + INIT_BUFFER(testing_hcd->out, false); + INIT_BUFFER(testing_hcd->resp, false); + INIT_BUFFER(testing_hcd->report, false); + INIT_BUFFER(testing_hcd->process, false); + INIT_BUFFER(testing_hcd->output, false); + + testing_hcd->sysfs_dir = kobject_create_and_add(SYSFS_DIR_NAME, + tcm_hcd->sysfs_dir); + if (!testing_hcd->sysfs_dir) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create sysfs directory\n"); + retval = -EINVAL; + goto err_sysfs_create_dir; + } + + for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) { + retval = sysfs_create_file(testing_hcd->sysfs_dir, + &(*attrs[idx]).attr); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create sysfs file\n"); + goto err_sysfs_create_file; + } + } + + retval = sysfs_create_bin_file(testing_hcd->sysfs_dir, &bin_attr); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to create sysfs bin file\n"); + goto err_sysfs_create_bin_file; + } + if (!proc_already) { + proc_already = true; + proc_create("tp_selftest", 0644, NULL, &syna_selftest_ops); + } + + return 0; + +err_sysfs_create_bin_file: +err_sysfs_create_file: + for (idx--; idx >= 0; idx--) + sysfs_remove_file(testing_hcd->sysfs_dir, &(*attrs[idx]).attr); + + kobject_put(testing_hcd->sysfs_dir); + +err_sysfs_create_dir: + RELEASE_BUFFER(testing_hcd->output); + RELEASE_BUFFER(testing_hcd->process); + RELEASE_BUFFER(testing_hcd->report); + RELEASE_BUFFER(testing_hcd->resp); + RELEASE_BUFFER(testing_hcd->out); + + kfree(testing_hcd); + testing_hcd = NULL; + + return retval; +} + +static int testing_remove(struct syna_tcm_hcd *tcm_hcd) +{ + int idx; + + if (!testing_hcd) + goto exit; + + sysfs_remove_bin_file(testing_hcd->sysfs_dir, &bin_attr); + + for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) + sysfs_remove_file(testing_hcd->sysfs_dir, &(*attrs[idx]).attr); + + kobject_put(testing_hcd->sysfs_dir); + + RELEASE_BUFFER(testing_hcd->output); + RELEASE_BUFFER(testing_hcd->process); + RELEASE_BUFFER(testing_hcd->report); + RELEASE_BUFFER(testing_hcd->resp); + RELEASE_BUFFER(testing_hcd->out); + + kfree(testing_hcd); + testing_hcd = NULL; + +exit: + complete(&testing_remove_complete); + + return 0; +} + +static int testing_reset(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + + if (!testing_hcd) { + retval = testing_init(tcm_hcd); + return retval; + } + + return 0; +} + +static int testing_syncbox(struct syna_tcm_hcd *tcm_hcd) +{ + if (!testing_hcd) + return 0; + + if (tcm_hcd->report.id == testing_hcd->report_type) + testing_report(); + + return 0; +} + +static struct syna_tcm_module_cb testing_module = { + .type = TCM_TESTING, + .init = testing_init, + .remove = testing_remove, + .syncbox = testing_syncbox, + .asyncbox = NULL, + .reset = testing_reset, + .suspend = NULL, + .resume = NULL, + .early_suspend = NULL, +}; + +static int __init testing_module_init(void) +{ + return syna_tcm_add_module(&testing_module, true); +} + +static void __exit testing_module_exit(void) +{ + syna_tcm_add_module(&testing_module, false); + + wait_for_completion(&testing_remove_complete); + + return; +} + +late_initcall(testing_module_init); +module_exit(testing_module_exit); + +MODULE_AUTHOR("Synaptics, Inc."); +MODULE_DESCRIPTION("Synaptics TCM Testing Module"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_testing.h b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_testing.h new file mode 100644 index 000000000000..54bf2b930fc3 --- /dev/null +++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_testing.h @@ -0,0 +1,418 @@ +/* + * Synaptics TCM touchscreen driver + * + * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved. + * + * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS + * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, + * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS. + * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION + * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED + * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES + * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' + * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. + * DOLLARS. + */ + +#ifndef _SYNAPTICS_TCM_TESTING_H_ +#define _SYNAPTICS_TCM_TESTING_H_ + +static const unsigned short drt_hi_limits[36][36] = { + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1700, 1700, 1700, 1700, 1700, 1700, 2000, 2000, 2000, 2000, 2000, 2000, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, +}; + +static const unsigned short drt_lo_limits[36][36] = { + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 0, 0, 0, 0, 0, 0, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, +}; + +static const unsigned short noise_limits[36][36] = { + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, +}; + +static const short pt11_hi_limits[36][36] = { + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, +}; + +static const short pt11_lo_limits[36][36] = { + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, + {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70}, +}; + +static const short pt12_limits[36][36] = { + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, + {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10}, +}; + +static const short pt13_limits[36][36] = { + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, + {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100}, +}; + +static const unsigned char lockdown_limits[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +}; + +static const unsigned short discrete_full_raw_hi_limits[36][36] = { + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, +}; + +static const unsigned short discrete_full_raw_lo_limits[36][36] = { + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, +}; + +static const unsigned short discrete_abs_row_limits[36] = { + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28 +}; + +static const unsigned short discrete_abs_col_limits[36] = { + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28 +}; + +static const unsigned char reset_open_limit = 0x13; +#define TEST_INVALID 0 +#define TEST_FAILED 1 +#define TEST_OK 2 +#endif diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_touch.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_touch.c new file mode 100644 index 000000000000..1df24959f0c0 --- /dev/null +++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_touch.c @@ -0,0 +1,1355 @@ +/* + * Synaptics TCM touchscreen driver + * + * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved. + * + * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS + * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, + * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS. + * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION + * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED + * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES + * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' + * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. + * DOLLARS. + */ + +#include <linux/input/mt.h> +#include <linux/interrupt.h> +#include "synaptics_tcm_core.h" +#define TYPE_B_PROTOCOL + +#define USE_DEFAULT_TOUCH_REPORT_CONFIG + +#define TOUCH_REPORT_CONFIG_SIZE 128 + +#define INPUT_EVENT_START 0 +#define INPUT_EVENT_WAKEUP_MODE_OFF 4 +#define INPUT_EVENT_WAKEUP_MODE_ON 5 +#define INPUT_EVENT_END 13 + +enum touch_status { + LIFT = 0, + FINGER = 1, + GLOVED_FINGER = 2, + NOP = -1, +}; + +enum touch_report_code { + TOUCH_END = 0, + TOUCH_FOREACH_ACTIVE_OBJECT, + TOUCH_FOREACH_OBJECT, + TOUCH_FOREACH_END, + TOUCH_PAD_TO_NEXT_BYTE, + TOUCH_TIMESTAMP, + TOUCH_OBJECT_N_INDEX, + TOUCH_OBJECT_N_CLASSIFICATION, + TOUCH_OBJECT_N_X_POSITION, + TOUCH_OBJECT_N_Y_POSITION, + TOUCH_OBJECT_N_Z, + TOUCH_OBJECT_N_X_WIDTH, + TOUCH_OBJECT_N_Y_WIDTH, + TOUCH_OBJECT_N_TX_POSITION_TIXELS, + TOUCH_OBJECT_N_RX_POSITION_TIXELS, + TOUCH_0D_BUTTONS_STATE, + TOUCH_GESTURE_DOUBLE_TAP, + TOUCH_FRAME_RATE, + TOUCH_POWER_IM, + TOUCH_CID_IM, + TOUCH_RAIL_IM, + TOUCH_CID_VARIANCE_IM, + TOUCH_NSM_FREQUENCY, + TOUCH_NSM_STATE, + TOUCH_NUM_OF_ACTIVE_OBJECTS, + TOUCH_NUM_OF_CPU_CYCLES_USED_SINCE_LAST_FRAME, + TOUCH_TUNING_GAUSSIAN_WIDTHS = 0x80, + TOUCH_TUNING_SMALL_OBJECT_PARAMS, + TOUCH_TUNING_0D_BUTTONS_VARIANCE, +}; + +struct object_data { + unsigned char status; + unsigned int x_pos; + unsigned int y_pos; + unsigned int x_width; + unsigned int y_width; + unsigned int z; + unsigned int tx_pos; + unsigned int rx_pos; +}; + +struct input_params { + unsigned int max_x; + unsigned int max_y; + unsigned int max_objects; +}; + +struct touch_data { + struct object_data *object_data; + unsigned int timestamp; + unsigned int buttons_state; + unsigned int gesture_double_tap; + unsigned int frame_rate; + unsigned int power_im; + unsigned int cid_im; + unsigned int rail_im; + unsigned int cid_variance_im; + unsigned int nsm_frequency; + unsigned int nsm_state; + unsigned int num_of_active_objects; + unsigned int num_of_cpu_cycles; +}; +struct syna_tcm_work_mode_switch { + struct touch_hcd *touch_hcd; + unsigned char mode; + struct work_struct switch_mode_work; +}; +struct touch_hcd { + int dbclick_count; + bool irq_wake; + bool report_touch; + bool suspend_touch; + unsigned char *prev_status; + unsigned int max_x; + unsigned int max_y; + unsigned int max_objects; + struct mutex report_mutex; + struct input_dev *input_dev; + struct touch_data touch_data; + struct input_params input_params; + struct syna_tcm_buffer out; + struct syna_tcm_buffer resp; + struct syna_tcm_hcd *tcm_hcd; +}; + +DECLARE_COMPLETION(touch_remove_complete); + +/* + *add the follow two lines + *to declare input event function + */ + +static int syna_tcm_input_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value); +static void syna_tcm_switch_mode_work(struct work_struct *work); + +static struct touch_hcd *touch_hcd; + +/** + * touch_free_objects() - Free all touch objects + * + * Report finger lift events to the input subsystem for all touch objects. + */ +static void touch_free_objects(void) +{ +#ifdef TYPE_B_PROTOCOL + unsigned int idx; +#endif + + if (touch_hcd->input_dev == NULL) + return; + + mutex_lock(&touch_hcd->report_mutex); + +#ifdef TYPE_B_PROTOCOL + for (idx = 0; idx < touch_hcd->max_objects; idx++) { + input_mt_slot(touch_hcd->input_dev, idx); + input_mt_report_slot_state(touch_hcd->input_dev, + MT_TOOL_FINGER, 0); + } +#endif + input_report_key(touch_hcd->input_dev, + BTN_TOUCH, 0); + input_report_key(touch_hcd->input_dev, + BTN_TOOL_FINGER, 0); +#ifndef TYPE_B_PROTOCOL + input_mt_sync(touch_hcd->input_dev); +#endif + input_sync(touch_hcd->input_dev); + + mutex_unlock(&touch_hcd->report_mutex); + + return; +} + +/** + * touch_get_report_data() - Retrieve data from touch report + * + * Retrieve data from the touch report based on the bit offset and bit length + * information from the touch report configuration. + */ +static int touch_get_report_data(unsigned int offset, + unsigned int bits, unsigned int *data) +{ + unsigned char mask; + unsigned char byte_data; + unsigned int output_data; + unsigned int bit_offset; + unsigned int byte_offset; + unsigned int data_bits; + unsigned int available_bits; + unsigned int remaining_bits; + unsigned char *touch_report; + struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd; + + if (bits == 0 || bits > 32) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid number of bits\n"); + return -EINVAL; + } + + if (offset + bits > tcm_hcd->report.buffer.data_length * 8) { + *data = 0; + return 0; + } + + touch_report = tcm_hcd->report.buffer.buf; + + output_data = 0; + remaining_bits = bits; + + bit_offset = offset % 8; + byte_offset = offset / 8; + + while (remaining_bits) { + byte_data = touch_report[byte_offset]; + byte_data >>= bit_offset; + + available_bits = 8 - bit_offset; + data_bits = MIN(available_bits, remaining_bits); + mask = 0xff >> (8 - data_bits); + + byte_data &= mask; + + output_data |= byte_data << (bits - remaining_bits); + + bit_offset = 0; + byte_offset += 1; + remaining_bits -= data_bits; + } + + *data = output_data; + + return 0; +} + +/** + * touch_parse_report() - Parse touch report + * + * Traverse through the touch report configuration and parse the touch report + * generated by the device accordingly to retrieve the touch data. + */ +static int touch_parse_report(void) +{ + int retval; + bool active_only; + bool num_of_active_objects; + unsigned char code; + unsigned int size; + unsigned int idx; + unsigned int obj; + unsigned int next; + unsigned int data; + unsigned int bits; + unsigned int offset; + unsigned int objects; + unsigned int active_objects; + unsigned int report_size; + unsigned int config_size; + unsigned char *config_data; + struct touch_data *touch_data; + struct object_data *object_data; + struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd; + static unsigned int end_of_foreach; + + touch_data = &touch_hcd->touch_data; + object_data = touch_hcd->touch_data.object_data; + + config_data = tcm_hcd->config.buf; + config_size = tcm_hcd->config.data_length; + + report_size = tcm_hcd->report.buffer.data_length; + + size = sizeof(*object_data) * touch_hcd->max_objects; + memset(touch_hcd->touch_data.object_data, 0x00, size); + + num_of_active_objects = false; + + idx = 0; + offset = 0; + objects = 0; + while (idx < config_size) { + code = config_data[idx++]; + switch (code) { + case TOUCH_END: + goto exit; + case TOUCH_FOREACH_ACTIVE_OBJECT: + obj = 0; + next = idx; + active_only = true; + break; + case TOUCH_FOREACH_OBJECT: + obj = 0; + next = idx; + active_only = false; + break; + case TOUCH_FOREACH_END: + end_of_foreach = idx; + if (active_only) { + if (num_of_active_objects) { + objects++; + if (objects < active_objects) + idx = next; + } else if (offset < report_size * 8) { + idx = next; + } + } else { + obj++; + if (obj < touch_hcd->max_objects) + idx = next; + } + break; + case TOUCH_PAD_TO_NEXT_BYTE: + offset = ceil_div(offset, 8) * 8; + break; + case TOUCH_TIMESTAMP: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get timestamp\n"); + return retval; + } + touch_data->timestamp = data; + offset += bits; + break; + case TOUCH_OBJECT_N_INDEX: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &obj); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get object index\n"); + return retval; + } + offset += bits; + break; + case TOUCH_OBJECT_N_CLASSIFICATION: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get object classification\n"); + return retval; + } + object_data[obj].status = data; + offset += bits; + break; + case TOUCH_OBJECT_N_X_POSITION: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get object x position\n"); + return retval; + } + object_data[obj].x_pos = data; + offset += bits; + break; + case TOUCH_OBJECT_N_Y_POSITION: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get object y position\n"); + return retval; + } + object_data[obj].y_pos = data; + offset += bits; + break; + case TOUCH_OBJECT_N_Z: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get object z\n"); + return retval; + } + object_data[obj].z = data; + offset += bits; + break; + case TOUCH_OBJECT_N_X_WIDTH: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get object x width\n"); + return retval; + } + object_data[obj].x_width = data; + offset += bits; + break; + case TOUCH_OBJECT_N_Y_WIDTH: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get object y width\n"); + return retval; + } + object_data[obj].y_width = data; + offset += bits; + break; + case TOUCH_OBJECT_N_TX_POSITION_TIXELS: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get object tx position\n"); + return retval; + } + object_data[obj].tx_pos = data; + offset += bits; + break; + case TOUCH_OBJECT_N_RX_POSITION_TIXELS: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get object rx position\n"); + return retval; + } + object_data[obj].rx_pos = data; + offset += bits; + break; + case TOUCH_0D_BUTTONS_STATE: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get 0D buttons state\n"); + return retval; + } + touch_data->buttons_state = data; + offset += bits; + break; + case TOUCH_GESTURE_DOUBLE_TAP: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get gesture double tap\n"); + return retval; + } + touch_data->gesture_double_tap = data; + tcm_hcd->gesture_enabled = touch_data->gesture_double_tap; + offset += bits; + break; + case TOUCH_FRAME_RATE: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get frame rate\n"); + return retval; + } + touch_data->frame_rate = data; + offset += bits; + break; + case TOUCH_POWER_IM: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get power IM\n"); + return retval; + } + touch_data->power_im = data; + offset += bits; + break; + case TOUCH_CID_IM: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get CID IM\n"); + return retval; + } + touch_data->cid_im = data; + offset += bits; + break; + case TOUCH_RAIL_IM: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get rail IM\n"); + return retval; + } + touch_data->rail_im = data; + offset += bits; + break; + case TOUCH_CID_VARIANCE_IM: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get CID variance IM\n"); + return retval; + } + touch_data->cid_variance_im = data; + offset += bits; + break; + case TOUCH_NSM_FREQUENCY: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get NSM frequency\n"); + return retval; + } + touch_data->nsm_frequency = data; + offset += bits; + break; + case TOUCH_NSM_STATE: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get NSM state\n"); + return retval; + } + touch_data->nsm_state = data; + offset += bits; + break; + case TOUCH_NUM_OF_ACTIVE_OBJECTS: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get number of active objects\n"); + return retval; + } + active_objects = data; + num_of_active_objects = true; + touch_data->num_of_active_objects = data; + offset += bits; + if (touch_data->num_of_active_objects == 0) + idx = end_of_foreach; + break; + case TOUCH_NUM_OF_CPU_CYCLES_USED_SINCE_LAST_FRAME: + bits = config_data[idx++]; + retval = touch_get_report_data(offset, bits, &data); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get number of CPU cycles used since last frame\n"); + return retval; + } + touch_data->num_of_cpu_cycles = data; + offset += bits; + break; + case TOUCH_TUNING_GAUSSIAN_WIDTHS: + bits = config_data[idx++]; + offset += bits; + break; + case TOUCH_TUNING_SMALL_OBJECT_PARAMS: + bits = config_data[idx++]; + offset += bits; + break; + case TOUCH_TUNING_0D_BUTTONS_VARIANCE: + bits = config_data[idx++]; + offset += bits; + break; + } + } + +exit: + return 0; +} + +/** + * touch_report() - Report touch events + * + * Retrieve data from the touch report generated by the device and report touch + * events to the input subsystem. + */ +static void touch_report(void) +{ + int retval; + unsigned int idx; + unsigned int x; + unsigned int y; + unsigned int temp; + unsigned int status; + unsigned int touch_count; + struct touch_data *touch_data; + struct object_data *object_data; + struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd; + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + + if (!touch_hcd->report_touch) + return; + + if (touch_hcd->input_dev == NULL) + return; + + mutex_lock(&touch_hcd->report_mutex); + + retval = touch_parse_report(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to parse touch report\n"); + goto exit; + } + + touch_data = &touch_hcd->touch_data; + object_data = touch_hcd->touch_data.object_data; +#ifdef WAKEUP_GESTURE + if (touch_data->gesture_double_tap && tcm_hcd->in_suspend) { + touch_hcd->dbclick_count++; + LOGE(tcm_hcd->pdev->dev.parent, + "syna wakeup with dbclick and count ++\n"); + input_report_key(touch_hcd->input_dev, KEY_WAKEUP, 1); + input_sync(touch_hcd->input_dev); + input_report_key(touch_hcd->input_dev, KEY_WAKEUP, 0); + input_sync(touch_hcd->input_dev); + } +#endif + + if (tcm_hcd->in_suspend) + goto exit; + + touch_count = 0; + + for (idx = 0; idx < touch_hcd->max_objects; idx++) { + if (touch_hcd->prev_status[idx] == LIFT && + object_data[idx].status == LIFT) + status = NOP; + else + status = object_data[idx].status; + + switch (status) { + case LIFT: +#ifdef TYPE_B_PROTOCOL + input_mt_slot(touch_hcd->input_dev, idx); + input_mt_report_slot_state(touch_hcd->input_dev, + MT_TOOL_FINGER, 0); +#endif + break; + case FINGER: + case GLOVED_FINGER: + x = object_data[idx].x_pos; + y = object_data[idx].y_pos; + if (bdata->swap_axes) { + temp = x; + x = y; + y = temp; + } + if (bdata->x_flip) + x = touch_hcd->input_params.max_x - x; + if (bdata->y_flip) + y = touch_hcd->input_params.max_y - y; +#ifdef TYPE_B_PROTOCOL + input_mt_slot(touch_hcd->input_dev, idx); + input_mt_report_slot_state(touch_hcd->input_dev, + MT_TOOL_FINGER, 1); +#endif + input_report_key(touch_hcd->input_dev, + BTN_TOUCH, 1); + input_report_key(touch_hcd->input_dev, + BTN_TOOL_FINGER, 1); + input_report_abs(touch_hcd->input_dev, + ABS_MT_POSITION_X, x); + input_report_abs(touch_hcd->input_dev, + ABS_MT_POSITION_Y, y); +#ifndef TYPE_B_PROTOCOL + input_mt_sync(touch_hcd->input_dev); +#endif + LOGD(tcm_hcd->pdev->dev.parent, + "Finger %d: x = %d, y = %d\n", + idx, x, y); + touch_count++; + break; + default: + break; + } + + touch_hcd->prev_status[idx] = object_data[idx].status; + } + + if (touch_count == 0) { + input_report_key(touch_hcd->input_dev, + BTN_TOUCH, 0); + input_report_key(touch_hcd->input_dev, + BTN_TOOL_FINGER, 0); +#ifndef TYPE_B_PROTOCOL + input_mt_sync(touch_hcd->input_dev); +#endif + } + + input_sync(touch_hcd->input_dev); + +exit: + mutex_unlock(&touch_hcd->report_mutex); + + return; +} + +/** + * touch_set_input_params() - Set input parameters + * + * Set the input parameters of the input device based on the information + * retrieved from the application information packet. In addition, set up an + * array for tracking the status of touch objects. + */ +static int touch_set_input_params(void) +{ + struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd; + + input_set_abs_params(touch_hcd->input_dev, + ABS_MT_POSITION_X, 0, touch_hcd->max_x, 0, 0); + input_set_abs_params(touch_hcd->input_dev, + ABS_MT_POSITION_Y, 0, touch_hcd->max_y, 0, 0); + + input_mt_init_slots(touch_hcd->input_dev, touch_hcd->max_objects, + INPUT_MT_DIRECT); + + touch_hcd->input_params.max_x = touch_hcd->max_x; + touch_hcd->input_params.max_y = touch_hcd->max_y; + touch_hcd->input_params.max_objects = touch_hcd->max_objects; + + if (touch_hcd->max_objects == 0) + return 0; + + kfree(touch_hcd->prev_status); + touch_hcd->prev_status = kzalloc(touch_hcd->max_objects, GFP_KERNEL); + if (!touch_hcd->prev_status) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for touch_hcd->prev_status\n"); + return -ENOMEM; + } + + return 0; +} + +/** + * touch_get_input_params() - Get input parameters + * + * Retrieve the input parameters to register with the input subsystem for + * the input device from the application information packet. In addition, + * the touch report configuration is retrieved and stored. + */ +static int touch_get_input_params(void) +{ + int retval; + unsigned int temp; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd; + const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata; + + app_info = &tcm_hcd->app_info; + touch_hcd->max_x = le2_to_uint(app_info->max_x); + touch_hcd->max_y = le2_to_uint(app_info->max_y); + touch_hcd->max_objects = le2_to_uint(app_info->max_objects); + + if (bdata->swap_axes) { + temp = touch_hcd->max_x; + touch_hcd->max_x = touch_hcd->max_y; + touch_hcd->max_y = temp; + } + + LOCK_BUFFER(tcm_hcd->config); + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_GET_TOUCH_REPORT_CONFIG, + NULL, + 0, + &tcm_hcd->config.buf, + &tcm_hcd->config.buf_size, + &tcm_hcd->config.data_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_GET_TOUCH_REPORT_CONFIG)); + UNLOCK_BUFFER(tcm_hcd->config); + return retval; + } + + UNLOCK_BUFFER(tcm_hcd->config); + + return 0; +} + +/** + * touch_set_input_dev() - Set up input device + * + * Allocate an input device, configure the input device based on the particular + * input events to be reported, and register the input device with the input + * subsystem. + */ +static int touch_set_input_dev(void) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd; + + touch_hcd->input_dev = input_allocate_device(); + if (touch_hcd->input_dev == NULL) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate input device\n"); + return -ENODEV; + } + + touch_hcd->input_dev->name = TOUCH_INPUT_NAME; + touch_hcd->input_dev->phys = TOUCH_INPUT_PHYS_PATH; + touch_hcd->input_dev->id.product = SYNAPTICS_TCM_ID_PRODUCT; + touch_hcd->input_dev->id.version = SYNAPTICS_TCM_ID_VERSION; + touch_hcd->input_dev->dev.parent = tcm_hcd->pdev->dev.parent; + /**add input event interface**/ + touch_hcd->input_dev->event = syna_tcm_input_event; + input_set_drvdata(touch_hcd->input_dev, touch_hcd); + + set_bit(EV_SYN, touch_hcd->input_dev->evbit); + set_bit(EV_KEY, touch_hcd->input_dev->evbit); + set_bit(EV_ABS, touch_hcd->input_dev->evbit); + set_bit(BTN_TOUCH, touch_hcd->input_dev->keybit); + set_bit(BTN_TOOL_FINGER, touch_hcd->input_dev->keybit); +#ifdef INPUT_PROP_DIRECT + set_bit(INPUT_PROP_DIRECT, touch_hcd->input_dev->propbit); +#endif + +#ifdef WAKEUP_GESTURE + set_bit(KEY_WAKEUP, touch_hcd->input_dev->keybit); + input_set_capability(touch_hcd->input_dev, EV_KEY, KEY_WAKEUP); +#endif + + retval = touch_set_input_params(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to set input parameters\n"); + input_free_device(touch_hcd->input_dev); + touch_hcd->input_dev = NULL; + return retval; + } + + retval = input_register_device(touch_hcd->input_dev); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to register input device\n"); + input_free_device(touch_hcd->input_dev); + touch_hcd->input_dev = NULL; + return retval; + } + return 0; +} + +/** + * touch_set_report_config() - Set touch report configuration + * + * Send the SET_TOUCH_REPORT_CONFIG command to configure the format and content + * of the touch report. + */ +static int touch_set_report_config(void) +{ + int retval; + unsigned int idx; + unsigned int length; + struct syna_tcm_app_info *app_info; + struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd; + +#ifdef USE_DEFAULT_TOUCH_REPORT_CONFIG + return 0; +#endif + + app_info = &tcm_hcd->app_info; + length = le2_to_uint(app_info->max_touch_report_config_size); + + if (length < TOUCH_REPORT_CONFIG_SIZE) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid maximum touch report config size\n"); + return -EINVAL; + } + + LOCK_BUFFER(touch_hcd->out); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &touch_hcd->out, + length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for touch_hcd->out.buf\n"); + UNLOCK_BUFFER(touch_hcd->out); + return retval; + } + + idx = 0; +#ifdef WAKEUP_GESTURE + touch_hcd->out.buf[idx++] = TOUCH_GESTURE_DOUBLE_TAP; + touch_hcd->out.buf[idx++] = 8; +#endif + touch_hcd->out.buf[idx++] = TOUCH_FOREACH_ACTIVE_OBJECT; + touch_hcd->out.buf[idx++] = TOUCH_OBJECT_N_INDEX; + touch_hcd->out.buf[idx++] = 4; + touch_hcd->out.buf[idx++] = TOUCH_OBJECT_N_CLASSIFICATION; + touch_hcd->out.buf[idx++] = 4; + touch_hcd->out.buf[idx++] = TOUCH_OBJECT_N_X_POSITION; + touch_hcd->out.buf[idx++] = 12; + touch_hcd->out.buf[idx++] = TOUCH_OBJECT_N_Y_POSITION; + touch_hcd->out.buf[idx++] = 12; + touch_hcd->out.buf[idx++] = TOUCH_FOREACH_END; + touch_hcd->out.buf[idx++] = TOUCH_END; + + LOCK_BUFFER(touch_hcd->resp); + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_SET_TOUCH_REPORT_CONFIG, + touch_hcd->out.buf, + length, + &touch_hcd->resp.buf, + &touch_hcd->resp.buf_size, + &touch_hcd->resp.data_length, + NULL, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_SET_TOUCH_REPORT_CONFIG)); + UNLOCK_BUFFER(touch_hcd->resp); + UNLOCK_BUFFER(touch_hcd->out); + return retval; + } + + UNLOCK_BUFFER(touch_hcd->resp); + UNLOCK_BUFFER(touch_hcd->out); + + return 0; +} + +/** + * touch_check_input_params() - Check input parameters + * + * Check if any of the input parameters registered with the input subsystem for + * the input device has changed. + */ +static int touch_check_input_params(void) +{ + unsigned int size; + struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd; + + if (touch_hcd->max_x == 0 && touch_hcd->max_y == 0) + return 0; + + if (touch_hcd->input_params.max_objects != touch_hcd->max_objects) { + kfree(touch_hcd->touch_data.object_data); + size = sizeof(*touch_hcd->touch_data.object_data); + size *= touch_hcd->max_objects; + touch_hcd->touch_data.object_data = kzalloc(size, GFP_KERNEL); + if (!touch_hcd->touch_data.object_data) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for touch_hcd->touch_data.object_data\n"); + return -ENOMEM; + } + return 1; + } + + if (touch_hcd->input_params.max_x != touch_hcd->max_x) + return 1; + + if (touch_hcd->input_params.max_y != touch_hcd->max_y) + return 1; + + return 0; +} + +/** + * touch_set_input_reporting() - Configure touch report and set up new input + * device if necessary + * + * After a device reset event, configure the touch report and set up a new input + * device if any of the input parameters has changed after the device reset. + */ +static int touch_set_input_reporting(void) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd; + + if (tcm_hcd->id_info.mode != MODE_APPLICATION || + tcm_hcd->app_status != APP_STATUS_OK) { + LOGN(tcm_hcd->pdev->dev.parent, + "Application firmware not running\n"); + return 0; + } + + touch_hcd->report_touch = false; + + touch_free_objects(); + + mutex_lock(&touch_hcd->report_mutex); + + retval = touch_set_report_config(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to set report config\n"); + goto exit; + } + + retval = touch_get_input_params(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get input parameters\n"); + goto exit; + } + + retval = touch_check_input_params(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to check input parameters\n"); + goto exit; + } else if (retval == 0) { + LOGN(tcm_hcd->pdev->dev.parent, + "Input parameters unchanged\n"); + goto exit; + } + + if (touch_hcd->input_dev != NULL) { + input_unregister_device(touch_hcd->input_dev); + touch_hcd->input_dev = NULL; + } + + retval = touch_set_input_dev(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to set up input device\n"); + goto exit; + } + +exit: + mutex_unlock(&touch_hcd->report_mutex); + + touch_hcd->report_touch = retval < 0 ? false : true; + + return retval; +} + + +/* + *add syna_tcm_input_event + *this function is used to get input event command to switch work mode + */ +static void syna_tcm_switch_mode_work(struct work_struct *work) +{ + struct syna_tcm_work_mode_switch *ms = + container_of(work, struct syna_tcm_work_mode_switch, switch_mode_work); + struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd; + unsigned char value = ms->mode; + + if (value >= INPUT_EVENT_WAKEUP_MODE_OFF && + value <= INPUT_EVENT_WAKEUP_MODE_ON) { + touch_hcd->touch_data.gesture_double_tap = value - INPUT_EVENT_WAKEUP_MODE_OFF; + tcm_hcd->gesture_enabled = touch_hcd->touch_data.gesture_double_tap; + LOGE(tcm_hcd->pdev->dev.parent, "Success get input tmode command:%d\n", value); + } else { + LOGE(tcm_hcd->pdev->dev.parent, "Does not support touch mode %d\n", value); + } + if(ms != NULL) { + kfree(ms); + ms = NULL; + } + return; +} + + + +static int syna_tcm_input_event + (struct input_dev *dev, unsigned int type, unsigned int code, int value) +{ + struct touch_hcd *touch_hcd = input_get_drvdata(dev); + struct syna_tcm_work_mode_switch *ms; + struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd; + if (type == EV_SYN && code == SYN_CONFIG) { + LOGE(tcm_hcd->pdev->dev.parent, "set input event value = %d\n", value); + if (value >= INPUT_EVENT_START && value <= INPUT_EVENT_END) { + ms = (struct syna_tcm_work_mode_switch *) + kmalloc(sizeof(struct syna_tcm_work_mode_switch), GFP_ATOMIC); + if (ms != NULL) { + ms->mode = (unsigned char)value; + INIT_WORK(&ms->switch_mode_work, syna_tcm_switch_mode_work); + schedule_work(&ms->switch_mode_work); + } else { + LOGE(tcm_hcd->pdev->dev.parent, + "failed in allocating memory for switching mode\n"); + return -ENOMEM; + } + } else { + LOGE(tcm_hcd->pdev->dev.parent, "Invalid event value\n"); + return -EINVAL; + } + } + return 0; +} + + +static int touch_init(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + + touch_hcd = kzalloc(sizeof(*touch_hcd), GFP_KERNEL); + if (!touch_hcd) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for touch_hcd\n"); + return -ENOMEM; + } + + touch_hcd->tcm_hcd = tcm_hcd; + + mutex_init(&touch_hcd->report_mutex); + + INIT_BUFFER(touch_hcd->out, false); + INIT_BUFFER(touch_hcd->resp, false); + + retval = touch_set_input_reporting(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to set up input reporting\n"); + goto err_set_input_reporting; + } + touch_hcd->dbclick_count = 0; + tcm_hcd->report_touch = touch_report; + + return 0; + +err_set_input_reporting: + kfree(touch_hcd->touch_data.object_data); + kfree(touch_hcd->prev_status); + + RELEASE_BUFFER(touch_hcd->resp); + RELEASE_BUFFER(touch_hcd->out); + + kfree(touch_hcd); + touch_hcd = NULL; + + return retval; +} + +static int touch_remove(struct syna_tcm_hcd *tcm_hcd) +{ + if (!touch_hcd) + goto exit; + + tcm_hcd->report_touch = NULL; + + input_unregister_device(touch_hcd->input_dev); + + kfree(touch_hcd->touch_data.object_data); + kfree(touch_hcd->prev_status); + + RELEASE_BUFFER(touch_hcd->resp); + RELEASE_BUFFER(touch_hcd->out); + + kfree(touch_hcd); + touch_hcd = NULL; + +exit: + complete(&touch_remove_complete); + + return 0; +} + +static int touch_syncbox(struct syna_tcm_hcd *tcm_hcd) +{ + if (!touch_hcd) + return 0; + switch (tcm_hcd->report.id) { + case REPORT_IDENTIFY: + touch_free_objects(); + break; + case REPORT_TOUCH: + if (touch_hcd->touch_data.gesture_double_tap || !touch_hcd->suspend_touch) + touch_report(); + break; + default: + break; + } + + return 0; +} + +static int touch_asyncbox(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + + if (!touch_hcd) + return 0; + + switch (tcm_hcd->async_report_id) { + case REPORT_IDENTIFY: + if (tcm_hcd->id_info.mode != MODE_APPLICATION) + break; + retval = tcm_hcd->identify(tcm_hcd, false); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to do identification\n"); + return retval; + } + retval = touch_set_input_reporting(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to set up input reporting\n"); + return retval; + } + break; + default: + break; + } + + return 0; +} + +static int touch_reset(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + + if (!touch_hcd) { + retval = touch_init(tcm_hcd); + return retval; + } + + if (tcm_hcd->id_info.mode == MODE_APPLICATION) { + retval = touch_set_input_reporting(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to set up input reporting\n"); + return retval; + } + } + + return 0; +} + +static int touch_early_suspend(struct syna_tcm_hcd *tcm_hcd) +{ + if (!touch_hcd) + return 0; + + touch_hcd->suspend_touch = true; + + touch_free_objects(); + + return 0; +} + +static int touch_suspend(struct syna_tcm_hcd *tcm_hcd) +{ +#ifdef WAKEUP_GESTURE + int retval; +#endif + + if (!touch_hcd) + return 0; + + touch_hcd->suspend_touch = true; + + +#ifdef WAKEUP_GESTURE + if (touch_hcd->touch_data.gesture_double_tap) { + if (!touch_hcd->irq_wake) { + enable_irq_wake(tcm_hcd->irq); + touch_hcd->irq_wake = true; + } + + retval = tcm_hcd->set_dynamic_config(tcm_hcd, + DC_IN_WAKEUP_GESTURE_MODE, + 1); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enable wakeup gesture mode\n"); + return retval; + } + } +#endif + touch_free_objects(); + return 0; +} + +static int touch_resume(struct syna_tcm_hcd *tcm_hcd) +{ +#ifdef WAKEUP_GESTURE + int retval; +#endif + + if (!touch_hcd) + return 0; + + touch_hcd->suspend_touch = false; + +#ifdef WAKEUP_GESTURE + if ((touch_hcd->touch_data.gesture_double_tap || !tcm_hcd->gesture_disabled_when_resume) + && tcm_hcd->gesture_enabled_when_resume) { + if (touch_hcd->irq_wake) { + disable_irq_wake(tcm_hcd->irq); + touch_hcd->irq_wake = false; + } + + retval = tcm_hcd->set_dynamic_config(tcm_hcd, + DC_IN_WAKEUP_GESTURE_MODE, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to disable wakeup gesture mode\n"); + return retval; + } + } +#endif + + return 0; +} + +static struct syna_tcm_module_cb touch_module = { + .type = TCM_TOUCH, + .init = touch_init, + .remove = touch_remove, + .syncbox = touch_syncbox, + .asyncbox = touch_asyncbox, + .reset = touch_reset, + .suspend = touch_suspend, + .resume = touch_resume, + .early_suspend = touch_early_suspend, +}; + +static int __init touch_module_init(void) +{ + return syna_tcm_add_module(&touch_module, true); +} + +static void __exit touch_module_exit(void) +{ + syna_tcm_add_module(&touch_module, false); + + wait_for_completion(&touch_remove_complete); + + return; +} + +late_initcall(touch_module_init); +module_exit(touch_module_exit); + +MODULE_AUTHOR("Synaptics, Inc."); +MODULE_DESCRIPTION("Synaptics TCM Touch Module"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_zeroflash.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_zeroflash.c new file mode 100644 index 000000000000..cc7ec971d28a --- /dev/null +++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_zeroflash.c @@ -0,0 +1,975 @@ +/* + * Synaptics TCM touchscreen driver + * + * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved. + * + * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS + * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, + * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS. + * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION + * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED + * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES + * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' + * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. + * DOLLARS. + */ + +#include <linux/crc32.h> +#include <linux/firmware.h> +#include "synaptics_tcm_core.h" + +#define FW_IMAGE_NAME "synaptics/hdl_firmware.img" + +#define BOOT_CONFIG_ID "BOOT_CONFIG" + +#define F35_APP_CODE_ID "F35_APP_CODE" + +#define APP_CONFIG_ID "APP_CONFIG" + +#define DISP_CONFIG_ID "DISPLAY" + +#define IMAGE_FILE_MAGIC_VALUE 0x4818472b + +#define FLASH_AREA_MAGIC_VALUE 0x7c05e516 + +#define PDT_START_ADDR 0x00e9 + +#define PDT_END_ADDR 0x00ee + +#define UBL_FN_NUMBER 0x35 + +#define F35_CTRL3_OFFSET 18 + +#define F35_CTRL7_OFFSET 22 + +#define F35_WRITE_FW_TO_PMEM_COMMAND 4 + +#define DOWNLOAD_RETRY_COUNT 10 + +enum f35_error_code { + SUCCESS = 0, + UNKNOWN_FLASH_PRESENT, + MAGIC_NUMBER_NOT_PRESENT, + INVALID_BLOCK_NUMBER, + BLOCK_NOT_ERASED, + NO_FLASH_PRESENT, + CHECKSUM_FAILURE, + WRITE_FAILURE, + INVALID_COMMAND, + IN_DEBUG_MODE, + INVALID_HEADER, + REQUESTING_FIRMWARE, + INVALID_CONFIGURATION, + DISABLE_BLOCK_PROTECT_FAILURE, +}; + +enum config_download { + HDL_INVALID = 0, + HDL_TOUCH_CONFIG_TO_PMEM, + HDL_DISPLAY_CONFIG_TO_PMEM, + HDL_DISPLAY_CONFIG_TO_RAM, +}; + +struct area_descriptor { + unsigned char magic_value[4]; + unsigned char id_string[16]; + unsigned char flags[4]; + unsigned char flash_addr_words[4]; + unsigned char length[4]; + unsigned char checksum[4]; +}; + +struct block_data { + const unsigned char *data; + unsigned int size; + unsigned int flash_addr; +}; + +struct image_info { + unsigned int packrat_number; + struct block_data boot_config; + struct block_data app_firmware; + struct block_data app_config; + struct block_data disp_config; +}; + +struct image_header { + unsigned char magic_value[4]; + unsigned char num_of_areas[4]; +}; + +struct rmi_f35_query { + unsigned char version:4; + unsigned char has_debug_mode:1; + unsigned char has_data5:1; + unsigned char has_query1:1; + unsigned char has_query2:1; + unsigned char chunk_size; + unsigned char has_ctrl7:1; + unsigned char has_host_download:1; + unsigned char has_spi_master:1; + unsigned char advanced_recovery_mode:1; + unsigned char reserved:4; +} __packed; + +struct rmi_f35_data { + unsigned char error_code:5; + unsigned char recovery_mode_forced:1; + unsigned char nvm_programmed:1; + unsigned char in_recovery:1; +} __packed; + +struct rmi_pdt_entry { + unsigned char query_base_addr; + unsigned char command_base_addr; + unsigned char control_base_addr; + unsigned char data_base_addr; + unsigned char intr_src_count:3; + unsigned char reserved_1:2; + unsigned char fn_version:2; + unsigned char reserved_2:1; + unsigned char fn_number; +} __packed; + +struct rmi_addr { + unsigned short query_base; + unsigned short command_base; + unsigned short control_base; + unsigned short data_base; +}; + +struct firmware_status { + unsigned short invalid_static_config:1; + unsigned short need_disp_config:1; + unsigned short need_app_config:1; + unsigned short reserved:13; +} __packed; + +struct zeroflash_hcd { + bool has_hdl; + bool f35_ready; + const unsigned char *image; + unsigned char *buf; + const struct firmware *fw_entry; + struct work_struct config_work; + struct work_struct firmware_work; + struct workqueue_struct *workqueue; + struct rmi_addr f35_addr; + struct image_info image_info; + struct firmware_status fw_status; + struct syna_tcm_buffer out; + struct syna_tcm_buffer resp; + struct syna_tcm_hcd *tcm_hcd; +}; + +DECLARE_COMPLETION(zeroflash_remove_complete); + +static struct zeroflash_hcd *zeroflash_hcd; + +static int zeroflash_check_uboot(void) +{ + int retval; + unsigned char fn_number; + struct rmi_f35_query query; + struct rmi_pdt_entry p_entry; + struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd; + + retval = syna_tcm_rmi_read(tcm_hcd, + PDT_END_ADDR, + &fn_number, + sizeof(fn_number)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read RMI function number\n"); + return retval; + } + + LOGD(tcm_hcd->pdev->dev.parent, + "Found F$%02x\n", + fn_number); + + if (fn_number != UBL_FN_NUMBER) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to find F$35\n"); + return -ENODEV; + } + + if (zeroflash_hcd->f35_ready) + return 0; + + retval = syna_tcm_rmi_read(tcm_hcd, + PDT_START_ADDR, + (unsigned char *)&p_entry, + sizeof(p_entry)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read PDT entry\n"); + return retval; + } + + zeroflash_hcd->f35_addr.query_base = p_entry.query_base_addr; + zeroflash_hcd->f35_addr.command_base = p_entry.command_base_addr; + zeroflash_hcd->f35_addr.control_base = p_entry.control_base_addr; + zeroflash_hcd->f35_addr.data_base = p_entry.data_base_addr; + + retval = syna_tcm_rmi_read(tcm_hcd, + zeroflash_hcd->f35_addr.query_base, + (unsigned char *)&query, + sizeof(query)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read F$35 query\n"); + return retval; + } + + zeroflash_hcd->f35_ready = true; + + if (query.has_query2 && query.has_ctrl7 && query.has_host_download) { + zeroflash_hcd->has_hdl = true; + } else { + LOGE(tcm_hcd->pdev->dev.parent, + "Host download not supported\n"); + zeroflash_hcd->has_hdl = false; + return -ENODEV; + } + + return 0; +} + +static int zeroflash_parse_fw_image(void) +{ + unsigned int idx; + unsigned int addr; + unsigned int offset; + unsigned int length; + unsigned int checksum; + unsigned int flash_addr; + unsigned int magic_value; + unsigned int num_of_areas; + struct image_header *header; + struct image_info *image_info; + struct area_descriptor *descriptor; + struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd; + const unsigned char *image; + const unsigned char *content; + + image = zeroflash_hcd->image; + image_info = &zeroflash_hcd->image_info; + header = (struct image_header *)image; + + magic_value = le4_to_uint(header->magic_value); + if (magic_value != IMAGE_FILE_MAGIC_VALUE) { + LOGE(tcm_hcd->pdev->dev.parent, + "Invalid image file magic value\n"); + return -EINVAL; + } + + memset(image_info, 0x00, sizeof(*image_info)); + + offset = sizeof(*header); + num_of_areas = le4_to_uint(header->num_of_areas); + + for (idx = 0; idx < num_of_areas; idx++) { + addr = le4_to_uint(image + offset); + descriptor = (struct area_descriptor *)(image + addr); + offset += 4; + + magic_value = le4_to_uint(descriptor->magic_value); + if (magic_value != FLASH_AREA_MAGIC_VALUE) + continue; + + length = le4_to_uint(descriptor->length); + content = (unsigned char *)descriptor + sizeof(*descriptor); + flash_addr = le4_to_uint(descriptor->flash_addr_words) * 2; + checksum = le4_to_uint(descriptor->checksum); + + if (0 == strncmp((char *)descriptor->id_string, + BOOT_CONFIG_ID, + strlen(BOOT_CONFIG_ID))) { + if (checksum != (crc32(~0, content, length) ^ ~0)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Boot config checksum error\n"); + return -EINVAL; + } + image_info->boot_config.size = length; + image_info->boot_config.data = content; + image_info->boot_config.flash_addr = flash_addr; + LOGD(tcm_hcd->pdev->dev.parent, + "Boot config size = %d\n", + length); + LOGD(tcm_hcd->pdev->dev.parent, + "Boot config flash address = 0x%08x\n", + flash_addr); + } else if (0 == strncmp((char *)descriptor->id_string, + F35_APP_CODE_ID, + strlen(F35_APP_CODE_ID))) { + if (checksum != (crc32(~0, content, length) ^ ~0)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Application firmware checksum error\n"); + return -EINVAL; + } + image_info->app_firmware.size = length; + image_info->app_firmware.data = content; + image_info->app_firmware.flash_addr = flash_addr; + LOGD(tcm_hcd->pdev->dev.parent, + "Application firmware size = %d\n", + length); + LOGD(tcm_hcd->pdev->dev.parent, + "Application firmware flash address = 0x%08x\n", + flash_addr); + } else if (0 == strncmp((char *)descriptor->id_string, + APP_CONFIG_ID, + strlen(APP_CONFIG_ID))) { + if (checksum != (crc32(~0, content, length) ^ ~0)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Application config checksum error\n"); + return -EINVAL; + } + image_info->app_config.size = length; + image_info->app_config.data = content; + image_info->app_config.flash_addr = flash_addr; + image_info->packrat_number = le4_to_uint(&content[14]); + LOGD(tcm_hcd->pdev->dev.parent, + "Application config size = %d\n", + length); + LOGD(tcm_hcd->pdev->dev.parent, + "Application config flash address = 0x%08x\n", + flash_addr); + } else if (0 == strncmp((char *)descriptor->id_string, + DISP_CONFIG_ID, + strlen(DISP_CONFIG_ID))) { + if (checksum != (crc32(~0, content, length) ^ ~0)) { + LOGE(tcm_hcd->pdev->dev.parent, + "Display config checksum error\n"); + return -EINVAL; + } + image_info->disp_config.size = length; + image_info->disp_config.data = content; + image_info->disp_config.flash_addr = flash_addr; + LOGD(tcm_hcd->pdev->dev.parent, + "Display config size = %d\n", + length); + LOGD(tcm_hcd->pdev->dev.parent, + "Display config flash address = 0x%08x\n", + flash_addr); + } + } + + return 0; +} + +static int zeroflash_get_fw_image(void) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd; + + if (zeroflash_hcd->fw_entry != NULL) + return 0; + + do { + retval = request_firmware(&zeroflash_hcd->fw_entry, + FW_IMAGE_NAME, + tcm_hcd->pdev->dev.parent); + if (retval < 0) { + LOGD(tcm_hcd->pdev->dev.parent, + "Failed to request %s\n", + FW_IMAGE_NAME); + msleep(100); + } else { + break; + } + } while (1); + + LOGD(tcm_hcd->pdev->dev.parent, + "Firmware image size = %d\n", + (unsigned int)zeroflash_hcd->fw_entry->size); + + zeroflash_hcd->image = zeroflash_hcd->fw_entry->data; + + retval = zeroflash_parse_fw_image(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to parse firmware image\n"); + release_firmware(zeroflash_hcd->fw_entry); + zeroflash_hcd->fw_entry = NULL; + zeroflash_hcd->image = NULL; + return retval; + } + + return 0; +} + +static void zeroflash_download_config(void) +{ + struct firmware_status *fw_status; + struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd; + + fw_status = &zeroflash_hcd->fw_status; + + if (!fw_status->need_app_config && !fw_status->need_disp_config) { + if (atomic_read(&tcm_hcd->helper.task) == HELP_NONE) { + atomic_set(&tcm_hcd->helper.task, + HELP_SEND_RESET_NOTIFICATION); + queue_work(tcm_hcd->helper.workqueue, + &tcm_hcd->helper.work); + } + atomic_set(&tcm_hcd->host_downloading, 0); + wake_up_interruptible(&tcm_hcd->hdl_wq); + return; + } + + queue_work(zeroflash_hcd->workqueue, &zeroflash_hcd->config_work); + + return; +} + +static void zeroflash_download_firmware(void) +{ + queue_work(zeroflash_hcd->workqueue, &zeroflash_hcd->firmware_work); + + return; +} + +static int zeroflash_download_disp_config(void) +{ + int retval; + unsigned char response_code; + struct image_info *image_info; + struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd; + static unsigned int retry_count; + + LOGN(tcm_hcd->pdev->dev.parent, + "Downloading display config\n"); + + image_info = &zeroflash_hcd->image_info; + + if (image_info->disp_config.size == 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "No display config in image file\n"); + return -EINVAL; + } + + LOCK_BUFFER(zeroflash_hcd->out); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &zeroflash_hcd->out, + image_info->disp_config.size + 2); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for zeroflash_hcd->out.buf\n"); + goto unlock_out; + } + + zeroflash_hcd->out.buf[0] = 1; + zeroflash_hcd->out.buf[1] = HDL_DISPLAY_CONFIG_TO_RAM; + + retval = secure_memcpy(&zeroflash_hcd->out.buf[2], + zeroflash_hcd->out.buf_size - 2, + image_info->disp_config.data, + image_info->disp_config.size, + image_info->disp_config.size); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy display config data\n"); + goto unlock_out; + } + + zeroflash_hcd->out.data_length = image_info->disp_config.size + 2; + + LOCK_BUFFER(zeroflash_hcd->resp); + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_DOWNLOAD_CONFIG, + zeroflash_hcd->out.buf, + zeroflash_hcd->out.data_length, + &zeroflash_hcd->resp.buf, + &zeroflash_hcd->resp.buf_size, + &zeroflash_hcd->resp.data_length, + &response_code, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_DOWNLOAD_CONFIG)); + if (response_code != STATUS_ERROR) + goto unlock_resp; + retry_count++; + if (DOWNLOAD_RETRY_COUNT && retry_count > DOWNLOAD_RETRY_COUNT) + goto unlock_resp; + } else { + retry_count = 0; + } + + retval = secure_memcpy((unsigned char *)&zeroflash_hcd->fw_status, + sizeof(zeroflash_hcd->fw_status), + zeroflash_hcd->resp.buf, + zeroflash_hcd->resp.buf_size, + sizeof(zeroflash_hcd->fw_status)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy firmware status\n"); + goto unlock_resp; + } + + LOGN(tcm_hcd->pdev->dev.parent, + "Display config downloaded\n"); + + retval = 0; + +unlock_resp: + UNLOCK_BUFFER(zeroflash_hcd->resp); + +unlock_out: + UNLOCK_BUFFER(zeroflash_hcd->out); + + return retval; +} + +static int zeroflash_download_app_config(void) +{ + int retval; + unsigned char response_code; + struct image_info *image_info; + struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd; + static unsigned int retry_count; + + LOGN(tcm_hcd->pdev->dev.parent, + "Downloading application config\n"); + + image_info = &zeroflash_hcd->image_info; + + if (image_info->app_config.size == 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "No application config in image file\n"); + return -EINVAL; + } + + LOCK_BUFFER(zeroflash_hcd->out); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &zeroflash_hcd->out, + image_info->app_config.size + 2); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for zeroflash_hcd->out.buf\n"); + goto unlock_out; + } + + zeroflash_hcd->out.buf[0] = 1; + zeroflash_hcd->out.buf[1] = HDL_TOUCH_CONFIG_TO_PMEM; + + retval = secure_memcpy(&zeroflash_hcd->out.buf[2], + zeroflash_hcd->out.buf_size - 2, + image_info->app_config.data, + image_info->app_config.size, + image_info->app_config.size); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy application config data\n"); + goto unlock_out; + } + + zeroflash_hcd->out.data_length = image_info->app_config.size + 2; + + LOCK_BUFFER(zeroflash_hcd->resp); + + retval = tcm_hcd->write_message(tcm_hcd, + CMD_DOWNLOAD_CONFIG, + zeroflash_hcd->out.buf, + zeroflash_hcd->out.data_length, + &zeroflash_hcd->resp.buf, + &zeroflash_hcd->resp.buf_size, + &zeroflash_hcd->resp.data_length, + &response_code, + 0); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write command %s\n", + STR(CMD_DOWNLOAD_CONFIG)); + if (response_code != STATUS_ERROR) + goto unlock_resp; + retry_count++; + if (DOWNLOAD_RETRY_COUNT && retry_count > DOWNLOAD_RETRY_COUNT) + goto unlock_resp; + } else { + retry_count = 0; + } + + retval = secure_memcpy((unsigned char *)&zeroflash_hcd->fw_status, + sizeof(zeroflash_hcd->fw_status), + zeroflash_hcd->resp.buf, + zeroflash_hcd->resp.buf_size, + sizeof(zeroflash_hcd->fw_status)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy firmware status\n"); + goto unlock_resp; + } + + LOGN(tcm_hcd->pdev->dev.parent, + "Application config downloaded\n"); + + retval = 0; + +unlock_resp: + UNLOCK_BUFFER(zeroflash_hcd->resp); + +unlock_out: + UNLOCK_BUFFER(zeroflash_hcd->out); + + return retval; +} + +static void zeroflash_download_config_work(struct work_struct *work) +{ + int retval; + struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd; + + retval = zeroflash_get_fw_image(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get firmware image\n"); + return; + } + + LOGN(tcm_hcd->pdev->dev.parent, + "Start of config download\n"); + + if (zeroflash_hcd->fw_status.need_app_config) { + retval = zeroflash_download_app_config(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to download application config\n"); + return; + } + goto exit; + } + + if (zeroflash_hcd->fw_status.need_disp_config) { + retval = zeroflash_download_disp_config(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to download display config\n"); + return; + } + goto exit; + } + +exit: + LOGN(tcm_hcd->pdev->dev.parent, + "End of config download\n"); + + zeroflash_download_config(); + + return; +} + +static int zeroflash_download_app_fw(void) +{ + int retval; + unsigned char command; + struct image_info *image_info; + struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd; + + LOGN(tcm_hcd->pdev->dev.parent, + "Downloading application firmware\n"); + + image_info = &zeroflash_hcd->image_info; + + if (image_info->app_firmware.size == 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "No application firmware in image file\n"); + return -EINVAL; + } + + LOCK_BUFFER(zeroflash_hcd->out); + + retval = syna_tcm_alloc_mem(tcm_hcd, + &zeroflash_hcd->out, + image_info->app_firmware.size); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for zeroflash_hcd->out.buf\n"); + UNLOCK_BUFFER(zeroflash_hcd->out); + return retval; + } + + retval = secure_memcpy(zeroflash_hcd->out.buf, + zeroflash_hcd->out.buf_size, + image_info->app_firmware.data, + image_info->app_firmware.size, + image_info->app_firmware.size); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy application firmware data\n"); + UNLOCK_BUFFER(zeroflash_hcd->out); + return retval; + } + + zeroflash_hcd->out.data_length = image_info->app_firmware.size; + + command = F35_WRITE_FW_TO_PMEM_COMMAND; + + retval = syna_tcm_rmi_write(tcm_hcd, + zeroflash_hcd->f35_addr.control_base + F35_CTRL3_OFFSET, + &command, + sizeof(command)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write F$35 command\n"); + UNLOCK_BUFFER(zeroflash_hcd->out); + return retval; + } + + retval = syna_tcm_rmi_write(tcm_hcd, + zeroflash_hcd->f35_addr.control_base + F35_CTRL7_OFFSET, + zeroflash_hcd->out.buf, + zeroflash_hcd->out.data_length); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to write application firmware data\n"); + UNLOCK_BUFFER(zeroflash_hcd->out); + return retval; + } + + UNLOCK_BUFFER(zeroflash_hcd->out); + + LOGN(tcm_hcd->pdev->dev.parent, + "Application firmware downloaded\n"); + + return 0; +} + +static void zeroflash_download_firmware_work(struct work_struct *work) +{ + int retval; + struct rmi_f35_data data; + struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd; + static unsigned int retry_count; + + retval = zeroflash_check_uboot(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Microbootloader support unavailable\n"); + goto exit; + } + + atomic_set(&tcm_hcd->host_downloading, 1); + + retval = syna_tcm_rmi_read(tcm_hcd, + zeroflash_hcd->f35_addr.data_base, + (unsigned char *)&data, + sizeof(data)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to read F$35 data\n"); + goto exit; + } + + if (data.error_code != REQUESTING_FIRMWARE) { + LOGE(tcm_hcd->pdev->dev.parent, + "Microbootloader error code = 0x%02x\n", + data.error_code); + if (data.error_code != CHECKSUM_FAILURE) { + retval = -EIO; + goto exit; + } else { + retry_count++; + } + } else { + retry_count = 0; + } + + retval = zeroflash_get_fw_image(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to get firmware image\n"); + goto exit; + } + + LOGN(tcm_hcd->pdev->dev.parent, + "Start of firmware download\n"); + + retval = zeroflash_download_app_fw(); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to download application firmware\n"); + goto exit; + } + + LOGN(tcm_hcd->pdev->dev.parent, + "End of firmware download\n"); + +exit: + if (retval < 0) + retry_count++; + + if (DOWNLOAD_RETRY_COUNT && retry_count > DOWNLOAD_RETRY_COUNT) { + retval = tcm_hcd->enable_irq(tcm_hcd, false, true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to disable interrupt\n"); + } + } else { + retval = tcm_hcd->enable_irq(tcm_hcd, true, NULL); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to enable interrupt\n"); + } + } + + return; +} + +static int zeroflash_init(struct syna_tcm_hcd *tcm_hcd) +{ + zeroflash_hcd = kzalloc(sizeof(*zeroflash_hcd), GFP_KERNEL); + if (!zeroflash_hcd) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to allocate memory for zeroflash_hcd\n"); + return -ENOMEM; + } + + zeroflash_hcd->tcm_hcd = tcm_hcd; + + INIT_BUFFER(zeroflash_hcd->out, false); + INIT_BUFFER(zeroflash_hcd->resp, false); + + zeroflash_hcd->workqueue = + create_singlethread_workqueue("syna_tcm_zeroflash"); + INIT_WORK(&zeroflash_hcd->config_work, + zeroflash_download_config_work); + INIT_WORK(&zeroflash_hcd->firmware_work, + zeroflash_download_firmware_work); + + if (tcm_hcd->init_okay == false && + tcm_hcd->hw_if->bus_io->type == BUS_SPI) + zeroflash_download_firmware(); + + return 0; +} + +static int zeroflash_remove(struct syna_tcm_hcd *tcm_hcd) +{ + if (!zeroflash_hcd) + goto exit; + + if (zeroflash_hcd->fw_entry) + release_firmware(zeroflash_hcd->fw_entry); + + cancel_work_sync(&zeroflash_hcd->config_work); + cancel_work_sync(&zeroflash_hcd->firmware_work); + flush_workqueue(zeroflash_hcd->workqueue); + destroy_workqueue(zeroflash_hcd->workqueue); + + RELEASE_BUFFER(zeroflash_hcd->resp); + RELEASE_BUFFER(zeroflash_hcd->out); + + kfree(zeroflash_hcd); + zeroflash_hcd = NULL; + +exit: + complete(&zeroflash_remove_complete); + + return 0; +} + +static int zeroflash_syncbox(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + unsigned char *fw_status; + + if (!zeroflash_hcd) + return 0; + + switch (tcm_hcd->report.id) { + case REPORT_STATUS: + fw_status = (unsigned char *)&zeroflash_hcd->fw_status; + retval = secure_memcpy(fw_status, + sizeof(zeroflash_hcd->fw_status), + tcm_hcd->report.buffer.buf, + tcm_hcd->report.buffer.buf_size, + sizeof(zeroflash_hcd->fw_status)); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to copy firmware status\n"); + return retval; + } + zeroflash_download_config(); + break; + case REPORT_HDL: + retval = tcm_hcd->enable_irq(tcm_hcd, false, true); + if (retval < 0) { + LOGE(tcm_hcd->pdev->dev.parent, + "Failed to disable interrupt\n"); + return retval; + } + zeroflash_download_firmware(); + break; + default: + break; + } + + return 0; +} + +static int zeroflash_reset(struct syna_tcm_hcd *tcm_hcd) +{ + int retval; + + if (!zeroflash_hcd) { + retval = zeroflash_init(tcm_hcd); + return retval; + } + + return 0; +} + +static struct syna_tcm_module_cb zeroflash_module = { + .type = TCM_ZEROFLASH, + .init = zeroflash_init, + .remove = zeroflash_remove, + .syncbox = zeroflash_syncbox, + .asyncbox = NULL, + .reset = zeroflash_reset, + .suspend = NULL, + .resume = NULL, + .early_suspend = NULL, +}; + +static int __init zeroflash_module_init(void) +{ + return syna_tcm_add_module(&zeroflash_module, true); +} + +static void __exit zeroflash_module_exit(void) +{ + syna_tcm_add_module(&zeroflash_module, false); + + wait_for_completion(&zeroflash_remove_complete); + + return; +} + +late_initcall(zeroflash_module_init); +module_exit(zeroflash_module_exit); + +MODULE_AUTHOR("Synaptics, Inc."); +MODULE_DESCRIPTION("Synaptics TCM Zeroflash Module"); +MODULE_LICENSE("GPL v2"); diff --git a/firmware/Makefile b/firmware/Makefile index 691852793e89..d67fa9dfd8cf 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -106,6 +106,8 @@ fw-shipped-$(CONFIG_USB_KAWETH) += kaweth/new_code.bin kaweth/trigger_code.bin \ kaweth/trigger_code_fix.bin fw-shipped-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FORCE) += synaptics_jdi_3331_c8.fw \ synaptics_jdi_3330_c8.fw synaptics_sharp_4322_c8.fw +fw-shipped-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_D2T) += synaptics_boe_4320.fw +fw-shipped-$(CONFIG_TOUCHSCREEN_NVT_D2T) += novatek_nt36672_d2t.fw ifdef CONFIG_FIRMWARE_IN_KERNEL fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_MPR) += keyspan/mpr.fw fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA18X) += keyspan/usa18x.fw diff --git a/firmware/novatek_nt36672_d2t.fw.ihex b/firmware/novatek_nt36672_d2t.fw.ihex new file mode 100644 index 000000000000..c33d57951b11 --- /dev/null +++ b/firmware/novatek_nt36672_d2t.fw.ihex @@ -0,0 +1,7426 @@ +:1000000000010000000000004BE00000E0390100AA +:1000100000770200E70300007CDB50F2E1ECCB202C +:1000200000000000C003632905000000000000007C +:1000300000B80200FF07000000A001004A08F3E436 +:10004000004E0200FF1300000048010083D9C1BA2E +:1000500000620200FF130000005C010061F9E93F4B +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F000704C0200FF00000000000000E49B934FE2 +:10010000480001EA400000094000000940000009E1 +:100110003AFFBFFC3A0FA83C4400000148000190A0 +:100120003AFFBFFC3A0FA83C440000024800018897 +:100130003AFFBFFC3A0FA83C44000003480001808E +:100140003AFFBFFC3A0FA83C440000044800017885 +:100150003AFFBFFC3A0FA83C44000005480001707C +:100160003AFFBFFC3A0FA83C440000064800016873 +:100170003AFFBFFC3A0FA83C44000007480001606A +:10018000480000004000000940000009400000094C +:100190003AFFBCBC3A0F943C440000004800017197 +:1001A0003AFFBCBC3A0F943C440000014800017483 +:1001B0003AFFBCBC3A0F943C440000024800016C7A +:1001C0003AFFBCBC3A0F943C44000003480001597C +:1001D0003AFFBCBC3A0F943C440000044800015C68 +:1001E0003AFFBCBC3A0F943C44000005480001496A +:1001F0003AFFBCBC3A0F943C440000064800014161 +:100200003AFFBCBC3A0F943C440000074800013957 +:100210003AFFBCBC3A0F943C44000008480001314E +:100220003AFFBCBC3A0F943C440000094800012945 +:100230003AFFBCBC3A0F943C4400000A480001213C +:100240003AFFBCBC3A0F943C4400000B4800011933 +:100250003AFFBCBC3A0F943C4400000C480001112A +:100260003AFFBCBC3A0F943C4400000D4800010921 +:100270003AFFBCBC3A0F943C4400000E4800010118 +:100280003AFFBCBC3A0F943C4400000F4800010404 +:100290003AFFBCBC3A0F943C44000010480000FCFC +:1002A0003AFFBCBC3A0F943C44000011480000E9FE +:1002B0003AFFBCBC3A0F943C44000012480000E1F5 +:1002C0003AFFBCBC3A0F943C44000013480000D9EC +:1002D0003AFFBCBC3A0F943C44000014480000DCD8 +:1002E0003AFFBCBC3A0F943C44000015480000D4CF +:1002F0003AFFBCBC3A0F943C44000016480000C1D1 +:100300003AFFBCBC3A0F943C44000017480000B9C7 +:100310003AFFBCBC3A0F943C44000018480000B1BE +:100320003AFFBCBC3A0F943C44000019480000A9B5 +:100330003AFFBCBC3A0F943C4400001A480000A1AC +:100340003AFFBCBC3A0F943C4400001B48000099A3 +:100350003AFFBCBC3A0F943C4400001C480000919A +:100360003AFFBCBC3A0F943C4400001D4800008991 +:100370003AFFBCBC3A0F943C4400001E4800008188 +:100380003AFFBCBC3A0F943C4400001F480000797F +:10039000F2C20000F2C20000FAC30000E0CA00008E +:1003A000E0CA0000E0CA0000E0CA0000E0CA0000A5 +:1003B000E0CA0000E0CA00000000000038C60000EB +:1003C00040C600004CC60000BEC60000F8C60000D3 +:1003D0003EC7000090C70000B4C70000BCC70000C3 +:1003E000C4C70000CCC70000D4C70000DCC70000B1 +:1003F000E4C70000E6C70000EEC70000C2C8000066 +:10040000CEC800001CC9000024C900009EC900001D +:10041000A6C90000AEC90000DAC9000040CA000049 +:1004200064CA00006CCA00009ECA0000A6CA000090 +:10043000A8CA0000D0CA0000D8CA00006412A402F2 +:10044000642204023A1F883C803F442002983821ED +:100450000202643200029ED964320003DD2264028B +:100460000043640000083A1F88046412A403642255 +:1004700004033A0FA8043AFFBFC4640000044420F8 +:1004800002BC38210202DD223A0F94043AFFBC84F8 +:10049000640000046412A402642204023A1F883C2F +:1004A000442002BC38210202643200029ED9643228 +:1004B0000003DD2264020043640000083A1F880440 +:1004C0006412A403642204033A0F94043AFFBC8428 +:1004D000640000044FF2001D3A0FA83C3AFFBFFC35 +:1004E00045D28F88801F64126402965F9E49C105C1 +:1004F0003CFD5CC2480000043CFD5CC3E809DD2F04 +:10050000C8073AFFBFC43A0FA8046400000464029D +:100510002402441F3FFFFE0E5800400064022403E3 +:100520006400000845D28F8845F2B80044F0C2B498 +:100530004EF20003DD2F3CFD5CC4DD2F640FFFEAAB +:10054000FC41F28180E13C2DFBC13C1DFBC080C31E +:10055000490033FA3C1DFBBE8520A60AA64B490084 +:100560003411F0014900341B3C1DFBBF000080101A +:10057000E320E81180093810A4004900341D3C0D27 +:10058000FBBF401024008009001080084900343C63 +:100590008D21D5EB840049003406490033E2840103 +:1005A00049003401490033DD8403490033FC49002C +:1005B00033D8490033F0AE308400A670E201E83B46 +:1005C000A079950138508101D034A0FD94429899CA +:1005D0000091000294AA886200F18002E32FE803F0 +:1005E00010918002A0FD40918400886200948003F5 +:1005F00000A18003E349E80310918003A0FD389136 +:100600008400886200F18000E32FE80310918000ED +:10061000A0FD88238843A649A6D1E261E802AE5135 +:10062000A0BA956988A238111001A4E88823AC68A3 +:100630008C01D5C4FCC1FC402240800084C0AD10B8 +:1006400022408001AD112E400404CC043C4DFC0A34 +:10065000A1A14440010842019073B480C405005038 +:1006600000209746CD05005000EA5A580112440276 +:100670007FA0848138400C08A40844427F70A449BC +:1006800038020E09941A8804AC414800010E5A4001 +:100690000404480000C2001000E05A1001044800A1 +:1006A000010484203C1FFBF93C1FFBF844127FA08F +:1006B00038108C00C94944427F5C44A27EC0385245 +:1006C0000C0044427F5038920C005A50010680E1E1 +:1006D0008081850CD521951A894480A1808184E18F +:1006E0004C54C00384E2228500008CA14213A07305 +:1006F0002285000197684243A07350A500305A58E4 +:1007000003F084A440109436404214963C1FFBF939 +:100710003C4FFBF8D51980A34252207338F51611CF +:10072000956A88AA8C81225280019720882FE32421 +:1007300088E5E8F28D214010A4364073A4F63C1FF2 +:10074000FBF93C7FFBF83C1DFBF93CADFBF880A1BD +:100750004E140003FF4A808A4EA400045245000054 +:100760008885E2C44EF200A10040002044527F7010 +:100770009716959A44900064C411444000823872E0 +:100780008E01FE644010A43688274245102438129A +:100790008E09407224F6986ED51144700073424061 +:1007A0009C2438128E0140422496888142751C2474 +:1007B00038428E09986E4073A4F6A50988E4ADC945 +:1007C00038128E0144427E90AC50986E38720E11F1 +:1007D000A44988C4AC510010002022F00007581032 +:1007E0008002101000202251000022100006224337 +:1007F00000018AE18AA1221100018A8F8A2FFF2439 +:10080000FE4C42439C7342129473E081E84D842174 +:1008100010100050D549C4485A40064744627FA092 +:1008200044527F5C38430C0044027F505A48010A0E +:10083000848038428C0838400C0838430C08D516A0 +:1008400038400C00E682E8038C81D5028480384071 +:100850000C0838428C00CC0A38400C005A48020779 +:1008600044427F5C84A138520C0838400C0080A3BD +:10087000840C4252007344427F70226080002270D8 +:1008800080018005945A38520E0144927EC088241B +:100890009B7538548209A549940288099B7DAD4116 +:1008A00038620E09ADC944027E90A45038100E097A +:1008B00094DA8860A411AC19FCC0FC40A10DA04CD6 +:1008C00095513C8DFC0C94D288A18864A66900A443 +:1008D0000002A79A84BEA71B4295142480A19EE122 +:1008E000425328738A66956996D8804688A084E02A +:1008F00038629C114E640003FFB25EF30033E909D5 +:100900008C6196D8E664E8218E4188E95A2FFFF27F +:10091000421510739449005400034065040888018F +:100920008440E085E810381008114E140003FE4A98 +:100930005EF08033E9088C6196D8E6648846E80565 +:100940008C81D5F08401D5028400FCC0FC42A10D4D +:1009500094D2886480C000918000A7D90081800271 +:10096000A6DB8381F3829CF98A6996D8F283F381AE +:100970004E830006E6E6E903E72CE906F001E6030C +:10098000E907480000A649FFFF9A4E0300A28440F1 +:1009900080083C3DFC0C80A28082802204AF800253 +:1009A000E340E9334E92001700F18002814942A0F2 +:1009B0003C7338F3291141E504084EF7000488AF71 +:1009C000976B41E3780022FF7FFF4EF70004884FCA +:1009D000969301E1800250FF7FFFE0EFE81481E78A +:1009E00042F0787341E7840838F33D114EF7000474 +:1009F000882F964B41E3780022FF00014EF7000458 +:100A0000888F97238C01D5CB8405FE84E045E80AC6 +:100A1000FE24E001E8074E920006A61A8E01E0E0EF +:100A2000E959F0015A080114F0028C018A08960075 +:100A3000E606E90DE045E9034E93000A8405FF044C +:100A4000E081E948A61A8E014C700045F003B90414 +:100A5000940188018420A60100A1800380E1812106 +:100A60008441E24AE824A75A810042811473404439 +:100A70000408388321114E84000452840000892820 +:100A8000C00A4083100022847FFF4E8400045284F9 +:100A9000000088E88EA14C0280098886224200016D +:100AA0004E440003FF2288248C41D5DC5CF487D1BE +:100AB000E90F5CF38064E902C80B5CF08064E90A2A +:100AC000A75A84208EA1FE2D40008006D504840103 +:100AD000D5028400FCC2FC4FF185F287441268788D +:100AE0008440F48CF594F382F181848180A2F30533 +:100AF000E243F389E83322600000F7021260800AC3 +:100B000022300001A1FB1260800CA1851230800B05 +:100B10001230800D3873990194F1127080171460AF +:100B2000800EA58212608020F602A1B48866A79983 +:100B300010608033A6D810308032C606C3055A60D4 +:100B400011045A3823051040802CD5031050802CF6 +:100B50008C41501080488C18D5CB2E07F02C448245 +:100B60006848F086F0848400802044A2681844928B +:100B700067E8447267B84460004844526878443279 +:100B8000645842201824991588433814020A3815ED +:100B9000020A3814820A3813820A8C011012002BC0 +:100BA0001011002B5A080CEF3C0C0253F206F09384 +:100BB0002E00040444100048F0972E07EC0F3CADC3 +:100BC000FC0DF0983C0DFB8945E26878F0992E0702 +:100BD000EBC1F09AF0059402F09B44026458420184 +:100BE0000473F09C8400F088F508F11B4C5081964A +:100BF000F1084402684884413820040A440262181B +:100C00008801F08344526458F01C4C500180F10676 +:100C1000F005E201221F000CE80A2202800E9A0869 +:100C2000F08D221F000D2202800FD5092202800CB8 +:100C30009A08F08D221F000D2202800D9A08F08B79 +:100C4000220F000C44100050F0902202800CF0950E +:100C5000220F000DF0912202800DF096B405F08A6B +:100C600022028018F092FE0C44100064400004162A +:100C7000F09D00028035C0069F01E6119720E8062E +:100C8000D50280809C419648D502FA21002280340A +:100C9000F18EC2079E515CF100239648E806D5020A +:100CA00080229DD196F8D502FA73FAC2F38FFF8C99 +:100CB0008520F30FE061E92B98F480E494D9048F48 +:100CC000800EE107E921048F8002B50838840C000A +:100CD0005A80FF1804FF800204F7800138F7A10052 +:100CE000048F000E4CF4400E048F801304FF801D0F +:100CF00089030284000040840011E10FE90285218C +:100D00008CE18C62D5DD8C218CD2D5D4F302041F0A +:100D1000000EA0DD944A9999A6F2A673A731A7B058 +:100D2000E206E920E280E91EE243E91CE222E91A38 +:100D3000FA2242010473F11394018801F112A40014 +:100D400085E296034010BC36E020E9035A98010B77 +:100D500000028044E602E806040280098E01E603F0 +:100D6000D50285E0049280095A9804080002802880 +:100D70005A0801084800052B5A980704480005271F +:100D8000F00BF10DFE04F21542008473F1109B8A02 +:100D9000F111F2169BCA0422800F42139C244213C5 +:100DA0001873CA735AF801044800050404250001A9 +:100DB000E2224EF304FF02350001F40AFEE4E223CE +:100DC000E83004350002E223E809A0ECA12BFEFC88 +:100DD000423310734E3604EED52404350003E2236B +:100DE000E820A0ECA12BFEFC42331073F60A44402D +:100DF0000064FF1C40421897FF24FF340065002761 +:100E000044F0271040F23DF7FF8C444000644063FB +:100E100010D7E2CFE8064E370005F30A4E3304CA76 +:100E20000032802A00450000E283E8060435000411 +:100E3000E2234EF304BFF3175A380110F3185A385F +:100E4000010DF3195CF18065E908F31AC3068465A6 +:100E5000FE9CE2224EF304AE002500264E2204B78B +:100E60004426D983E2414EF304B25A980404480060 +:100E700004AE0012802C4E1304AA001F002C4E1347 +:100E800004A646190000D5375A2002044800049FE2 +:100E90005A9804044800049B04F500012242800E85 +:100EA000E22F048280032222800FA0EC4EF3048202 +:100EB0000015002885EA42940424FE5C4094BD3667 +:100EC00040F0BDF6F11188438A228041F1108888F4 +:100ED0008A24FE94422084734217BC244214A473D3 +:100EE000E0414EF20474FEFC423320734E37046F2F +:100EF000461800008801F10350528048B601F00303 +:100F000050000030F08348FFFE81F00851EF0048A8 +:100F10008C04F08848FFFE6A8400441268188441FB +:100F2000F306E203E8053820820A8C01D5FAF005C1 +:100F3000E60BE810E66BE80E8023F00544226848D3 +:100F40004432681844426218445262004900048BDB +:100F5000D50DF005F1064422684844326818444231 +:100F600062184452620049000435F08A8400F0831C +:100F7000F0864608FFFF50000FFF442264584432B9 +:100F80006878F08B448293E8F006F10AE2014EF2B1 +:100F9000018BF00680A29501440262008804A641FC +:100FA00044000048425080730402800F5A08021720 +:100FB000F506440262003800150084AC42009473C8 +:100FC00044526218380282024E0500094402681831 +:100FD00084813840060A480001624402620044509D +:100FE00000483800100080834240147380C2509241 +:100FF000001842609473F688225480012273000C1A +:101000002263000D22A2000C9BAE81E440751C01FE +:1010100043E3182443E39C731DE78002A9A41477DB +:10102000800188C588EA127480021264800380E01F +:1010300084CC4270987344626218F50B38631E02C8 +:1010400051E20010E2A650420038E80CF50884C2D4 +:101050008CB0A9A1A52A124F0002A52B124F0003A4 +:10106000D50384A0A9614460004880A380E2425077 +:1010700018734270987380C7509280108CF022448D +:10108000800222A38002227380038A8AA929224433 +:101090008003049300098A87A92A00430020507224 +:1010A0008020104280205A9003044800007E38546B +:1010B00010005A58020D445293DC385290005A588E +:1010C000010784EA3874100810530028445293E84A +:1010D000385290005A58010F4450004880C2426074 +:1010E0009473005300288CB81053002884A23854FD +:1010F0001008385410005A58030E4450004880C25B +:101100004260947380A684C11062802884A43854FD +:1011100010084450004880C24260947380E34270DB +:101120001473005300288EA1105380282E57EC18FA +:10113000C51C04AF80020493800E04A50005406422 +:10114000880888CA00A30001A7B08B464EA7000EEE +:10115000F602A1B438632500E6C4E9078EA13E5724 +:10116000EC1884A0105380284450004880C342608B +:1011700014730073002844526878C708B4C65CF33F +:101180000385E90A38441000CC0744400048425027 +:1011900010738481D5064440004842501073848304 +:1011A00014428009D5142E67EC188482A939C60F21 +:1011B0000442800EF5029522A16D8885A761A720C3 +:1011C0008AA44E5700058EC13E67EC184450004873 +:1011D00080824240947380C342601473505300284D +:1011E0000042002A3C9DFC0DAF2AB4C60474800561 +:1011F000E2E6E805E68AE80A8C81D50704748006F1 +:10120000E2C7E804C4038E81AF2A44400048445238 +:1012100064584250907300528044FF045CF280C8CE +:101220008883E8028CA11052004444500048424098 +:101230001424FE6C999C40910400227300172254E0 +:101240008018E0A7445268A8E80688851273001841 +:10125000A461D50A88854452648802748017882561 +:1012600012730018A449AC624410004880834240C5 +:10127000047300520020444267B884213812160AD1 +:10128000444267E83812020AF0098E01F089F0043E +:101290008E01F084F0038801F083F0068C01F08663 +:1012A00048FFFE744492681844626458850044A262 +:1012B00067E82E07F02CE300E803F004C80E3C0DAD +:1012C000FC0D3C1016394462687812100015850038 +:1012D000449267B8480001083C2DFC0CF103000162 +:1012E0000009E220E8ED0C0480015A0001044800E6 +:1012F00000E2F00CC80D040300095A08030AF00CC0 +:101300001404FFFFF0048E01F084480000D40403AD +:1013100000095A00030B5A0007099E41E622E80B18 +:101320000413000F5A1802048420D51B3C1DFC0D29 +:10133000A649D517001300285A18011300430020AE +:1013400044300108F50742520C73004280855A4828 +:10135000010884221013002810128085D5048E21E4 +:1013600010130028001300285A180112004300200F +:1013700044300108F50742520C7300328085CB07D8 +:101380000033002B583180041033002B002100194A +:1013900084E044326848E2E2E80938451E02CC04A1 +:1013A00038419E02C4068CE1D5F784E048000081F4 +:1013B000C1038404D5525A080345000300339E41FB +:1013C000E630E82B2E100427C10800130020442229 +:1013D00093E838110400C1210023002044100108C3 +:1013E000F30742310473224180192221801880239F +:1013F00084639522FE9CE082E810F214A692CA0D46 +:101400002E27EBE3CA0A001080DFC107840714030C +:10141000000910330029D523842814130009C003C0 +:101420005A08111E00030020441293E8380080007F +:10143000C016840414030009840210030028D50F89 +:101440005A08070B00030029C0058E01100300296C +:10145000D5068408D502840614030009000300445D +:101460005CF000C8E8048C011003004444200048EC +:1014700044026878420388738026490065F7002398 +:101480000020441267B8840138008A0A38051E0A11 +:1014900084001404FFFFF0048E01F084F0038C013B +:1014A000F083D50838351E024E32FF848CE14C7132 +:1014B0007FFB8D015063004848FFFEFDF0094E029E +:1014C00000BE00218009F003E2024EF200B844029F +:1014D000684840A40808380022025A00010C8D0117 +:1014E00050630048F0053C3DFC0CE300E9E848008F +:1014F00000A6440267E838702202CFF2F1020433FA +:10150000000E3C0DFC0DA04B38108D010230001573 +:10151000E261E8E638149E024E13008D0223000CAF +:10152000B626A871A872A873A874F184F1031223D7 +:10153000000E0223000D88011223000F10730020FB +:101540000000001C1003002849002872F1045A080A +:1015500002142E000404C0072E07EC01C004840509 +:10156000100300282E00035DC009000300288C0131 +:1015700010030028D5031013002800030020441294 +:1015800093E8844038208008F30744100108423073 +:1015900004730423000EF102F026F38449FFF9D806 +:1015A000F3042E17EC18100180DFC902C80484056B +:1015B000100300288400100181041001808284013E +:1015C000140180221401801500130028C102840335 +:1015D0001403000984001003002A0003002B8481F7 +:1015E000FE271003002B0203001784601433000F42 +:1015F000103300441203001850130032500300341B +:101600008442F486F38449006531F406440267E8B5 +:10161000F3043840280A4402684838449E0A3830A7 +:10162000280AF0098E01F089F0038C01F08348FF4D +:10163000FF588CE1E2E248FFFF6E8420F007804112 +:1016400000418009E224E80AB6401020004E102034 +:1016500000EA8C2150000108D5F484003E07F02CEC +:101660003E07EBE38500446267E8447264583C0D32 +:10167000FC0C00000019E3004EF200973803220230 +:101680005A0001044800008AF00104A000095AA091 +:1016900006145AA008122E07F02C44200048802778 +:1016A000421008738001F101490064E02E07F02C1C +:1016B0008C013E07F02CF001049F800700100020F1 +:1016C00044000108429080738400100480F15AA8FD +:1016D00007068400B6098401D5075AA808058400C6 +:1016E000B609D502B7491004804E0004804E5A084E +:1016F000010A020480061204800802048007120412 +:101700008009F00150248024F1010000002B100416 +:101710008020F0012200000A12048002F001220061 +:10172000000B12048003F00104A0000E14A4800931 +:10173000B400A815A0495CF02711A856F101A04AF1 +:10174000A857E9062E07EBE38C013E07EBE3F00117 +:101750000400000F14048011B4095A08030D00049A +:1017600080DFC80BF026F102804A49FFF8F110042F +:1017700080DFD5035A000412F00240150408A003CC +:101780003800290112048018F002A084500480EE71 +:10179000882284424900646AF0018D0150000048AB +:1017A000F08148FFFF662E07F02C3E07EC19FCCFB6 +:1017B0005A90030448FFFBA1F10C5A18010448FF9A +:1017C000FB9C4611000048FFFB97841F48FFFB95D8 +:1017D000FC43F08181008400F484F182F58580E18E +:1017E0008380812084814E82003DC73B5A48013A64 +:1017F00084A08085855EF101D122386116025A6885 +:10180000011DF10495AA88C1F68384C0F1024C60E1 +:10181000801539E19A025BE8010F4410003042F371 +:101820000424F1033810BC02E22AE80583868125EE +:10183000809E81418CC1D5EB8CA1D5DEC4D5F1054C +:10184000954188A18C0184201092800011C28001F2 +:1018500096003811260A8F013811F20A8EE1D5C49C +:10186000FCC3C06EC16FFC4051FFFD28E220E82F91 +:1018700080E144A00030851F81244293A87384C076 +:1018800038849A0A8CC14C607FFD8CE14C707FF6E5 +:1018900080C083818001802681248105F28181437B +:1018A000490026E5B026490026E98009490026F0CE +:1018B000B002490026F7840C490026FE49002701A2 +:1018C000844080A245E000308082D514E201E8E146 +:1018D00084E044A00030851F81244293A87380C017 +:1018E00038849A0A8CC14C60FFFD8CE14C70FFF685 +:1018F000D5D0840C81E94212802442F2F87384E04E +:1019000098F9B00238300C005A38011138379E026D +:101910005A37FF0D94D188688C41AFD8AF59F30185 +:10192000969038419E0A3845160A8CE14C737FEA3E +:101930008CA14C5E7FE0800251FF82D8FCC08040C9 +:10194000D50280418002DD9EFC0080C04900340C3D +:10195000C00784013E07EB5C8400AE34AE35FC80EA +:101960002E07F050DD9E44327FD0AE18AE59AE9AAD +:10197000DD9E3C0FF9F4DD9E3C0DF9F4DD9E3C0D3F +:10198000FB88465FF00F50528F00FF464600100064 +:10199000D80684003E07EE238401DD9E8400DD9E90 +:1019A0002E17F0762E57F0773C0DFC524C12C010DB +:1019B0002E27F0745A28010CA6059D49400280B6D6 +:1019C00097683E57F0763E57F077DD9EA6058CA1CE +:1019D000400280B697683E57F077D90484013E07ED +:1019E000F074DD9E2E57F0762E17F077D9042E076F +:1019F000F074C0103C0DFC528CA1A605400280B6CC +:101A000097683E57F0764C12C00584003E07F0748C +:101A10008401DD9E2E57F0762E07F077D8082E072A +:101A2000F07484208E0140008006DD9E8401DD9EDE +:101A30002E57F0762E07F077D8072E17F074840013 +:101A400040000406DD9E8401DD9EFC0084A08C81A4 +:101A5000E2A4E8073860080438608C0C8CA1D5F942 +:101A6000FC8080603C0DF9F49E41E622E8253C2D87 +:101A7000FC5184200041000AE224E809A1593852AF +:101A800087025A58010384028C21D5F7FC00842078 +:101A90000041000944500108E224E80DB44342200B +:101AA0009473B4429F91E6C2E9055A2004048C2144 +:101AB000D5F48401FC80DD9EFC43F181B4E1843FD8 +:101AC000101F80172E1029108140C1082E17F050CA +:101AD000C90549FFFFC83C0FF9F43C0DF9F45A0061 +:101AE00001044800012B2E27EC183C1DFC51F28309 +:101AF0003C8DFC52B61F84C045E27FC0B41F00304D +:101B000080098E019600E203845F4EF201124420A8 +:101B1000010842900824B44A8849B4629F19E682B9 +:101B2000E9095A3004080031004E5A3001044800D7 +:101B300000F7383F00005CF180C8E8048C61383F52 +:101B4000000800310085CB29003100505A38012EA1 +:101B50000021004E5A20012A442296083821000014 +:101B6000E6544EF200E08C414432960896903821BB +:101B700080085A200104480000D6442295D8382114 +:101B800000005A200104480000CE382F00005A20DF +:101B90000104480000C8D5095A3802080231000C77 +:101BA000ACD40231000DACD5B48A88890022004E35 +:101BB0005A28011BF203CA18442293E83801000096 +:101BC000C80702020008AC2402020009AC25220268 +:101BD00000044E0400048400AC24220200054E04DC +:101BE00000048400AC250004000022220004C0058B +:101BF000020080098E019A82000400012232000551 +:101C0000C0050200800A8E019AC300040003C02DA3 +:101C100002508009000400028EA1C810A40A85E2C7 +:101C200040F2BDF68E0142F10073402794570250F6 +:101C3000800A02F080038EA1D50FA40B85E240F24A +:101C4000BDF68E0142F10073402794570250800A7E +:101C500002F080028EA1840250F7FFFF400280163E +:101C60004201BC7340301477A40AE240E9029E812D +:101C7000A40BE260E9029EC184A6800742031473AC +:101C8000B4BF40F11009956B58528002AF40005428 +:101C9000000214FF800240F19009CD0B005F800824 +:101CA000949496DFFE9FAF4110F00002AE83D50AF8 +:101CB000005F800894DC969FFED710F00001AF42D1 +:101CC000AEC30202000EC0039600D5028401804715 +:101CD000846642230C73AE140202000FC003960008 +:101CE000D5028401AE15841F1003803C1003803D93 +:101CF0000000800CE602E910B40A880900000049DF +:101D0000C802840198BE10010046B40A8809200068 +:101D1000004A1001006E8CC197B0D5048440382F62 +:101D20000008B41F8C019600B61F48FFFEE910237F +:101D3000803E1023803FD53F5A08022784181003A5 +:101D4000803C84C084001003803D3C3DFC518006F3 +:101D50000011800AE201E813041500013810830223 +:101D60005A18010B0023803D4010800CFE578CC197 +:101D70001013803D97B08C019600D5EB0003803D99 +:101D80003E07F04BD5182E67F048C6152E17F049C0 +:101D9000A638E63EE804944B9617D5039617843090 +:101DA000FE0FAE382E07F04AAFB9AE3A84013E07B7 +:101DB000F05084C02E07F0505A00FF0DC00BCE0A21 +:101DC000841F3E07F0503C0DFC138C013C0FFC13AC +:101DD000D5033E67F0503C3DF9F45A3801173C0DED +:101DE000FC5100400009E2C4E810F0018426FE74B2 +:101DF000B4408A868406FF0496488822500F8017D4 +:101E000084408E8149FFFE23F001B420840080A12C +:101E1000502080400832800188039600DAFCFE02E0 +:101E2000100080408401C60284003E07F07AFCC3A3 +:101E3000FC20844180624440004080E080C149FF32 +:101E4000FE063C0DFC510000000CE602E910505368 +:101E500080465013004650738050080280011800DD +:101E600080012002802710008027DFF8FCA0FC40C2 +:101E70008120A60080C184203E17F079C0292E075A +:101E8000F0755A08010C2E27F0783E17F0743E27A3 +:101E9000F0763E27F0773E07F07949FFFD833C0D51 +:101EA000FC522E77F0773C1DFC1CA70484410404EF +:101EB00080014213907380628E8149FFFDC82E0716 +:101EC000F07A5A0801063E07F0753E77F0782E1733 +:101ED000F079B4065A180130A605C81849003148EF +:101EE000C80F3C0DFC52B4262E37F078A6843C0D6A +:101EF000FC1C42018873B42149FFFF9CD50A4900AC +:101F00003137C0F0490030F5D5FB49003131C80305 +:101F100049003136B42684003E07F0793E07F0755B +:101F20008401AE0DB426AE0C2E17F048C13FB42686 +:101F3000AE0FD53CA644C90549FFFD7CC037D50D81 +:101F4000A6055A08010849003113C8304900311864 +:101F5000D52D49FFFD61C8F84900310A80E0C82647 +:101F600049FFFD423C0DFC52B4262E97F076A68424 +:101F70003C0DFC1CB4214204887349FFFF5B2E1703 +:101F8000F0755A18010F2E57F0784C54C00BB40658 +:101F90003E77F075AE452E07F048C003B406AE4755 +:101FA000490030EEB4068421AE44FCC0FC208040E1 +:101FB00080E144027FECA05144628004B6202E17D9 +:101FC000F0503C6FFC1810100008A052A8414412B9 +:101FD0007FE849FFFD7344027FE02E17F050A9818E +:101FE000AE40B4273C1FFC1544127FDC49FFFF4183 +:101FF00044027FD08420AE40AE41AE4249FFFD1A7C +:10200000FCA0FC41F5814082801141C2C00A4450CD +:10201000010842019473005000202260800054A205 +:1020200080012210800184E14EA2001644528B34BC +:10203000852038928C08854C44528AA44251A8735A +:10204000ADA8AC6944528B40109000EC38728C08FB +:102050004800007201E000E95BE8030B44528B404A +:1020600038A28C0844528B3438A28C08D5644FE3D4 +:10207000002044928B40854338548C0081E542F126 +:10208000A87340A788088CA144F28AA4894F976856 +:10209000E6A3126500001215000138548C08E94BC4 +:1020A00044528B3439E48C0838728C08D5445BE890 +:1020B000016E44928B4084E338548C0081E542F1F8 +:1020C0009C7340F7880844728AA440F79C008CA156 +:1020D00097681267800012178001E6A338548C08B5 +:1020E00044528B34E90539E28C0838A48C08385204 +:1020F0008C00CD0538548C00C51ED50284A3842CD9 +:10210000427184738460802380C3549180FFE325EF +:10211000E80E40918808892738A38E010294800137 +:1021200088CA882997B3964B8C61D5F0406314D642 +:1021300040109436003F80285A380129000000E9F9 +:102140005A0801253C5DFEF4A42DE280E81F4033CF +:1021500020014E340003FEDA4000F0014E0400037B +:10216000FE028803A4EEE003E811A4EF9F194001EA +:102170008409421270734262207388C088014063F0 +:102180000CD640100C3697B3964BAD90AC51FCC1B9 +:10219000FC0196CB9683903090108A018A43FE040E +:1021A00042010873FC81FC4480C3812222308000FC +:1021B00022208001441001084203047380E0B4002F +:1021C000F481F082F102841DFE0EF5833C3BFAE6B9 +:1021D0003C2BFAE744428524448284F444A28410D0 +:1021E0005A000106000380EA4E0200F93C0DFD731F +:1021F000441284E838021A0A38041A0A444284B89D +:10220000840038009808441009C438121A0A44128D +:1022100084AC848F38409808441284A05EF18032E8 +:1022200038009808100380E044128494E806840182 +:10223000380098088003D50F5EF18406E806380060 +:10224000980844000032D5078402380098085201EB +:10225000843796035EF10032444293E8E80938502F +:10226000980058528004385098088022D5135EF1A7 +:1022700008CEE90B3850980058528008385098081A +:10228000521108FF964BD50D5EF1007844100032D4 +:10229000E8085051FE7997695CF28121E818D5076A +:1022A0005EF108CFE9143C5DFFE9CD11385218000A +:1022B000CD0E445293E885E138F29808445293C811 +:1022C00038229909445294003832990945E293DC46 +:1022D00084A0385F1808385218005A580226445211 +:1022E0009400385299118AA34E540003FF6A5EF29B +:1022F0008051E90484A1385F1808445293C83852C9 +:1023000099115EF28480E80550528028E0A2D50839 +:1023100044F004804C57800950F2FFC4E04FE804B9 +:1023200084A338521808E02044428488E8058E3E91 +:1023300038121808D5048E1E3802180838021810F2 +:10234000E40FE80644028488842F3810180802132A +:10235000800F440284285EF1803338101B09441238 +:1023600083F8840038009909441283EC3805190970 +:1023700038009808441293F438009808441283E017 +:1023800038009808E9133C1DFEF30200800950F064 +:102390007FCDE06FE80B5EF10033E9080200800AB0 +:1023A00050F07FCDE04F8401E9028400441283D4D1 +:1023B000100380DE84003800980838241A02441282 +:1023C00083A438209A0A441283983800980844124B +:1023D000838C380098084800033638021A023C1DE6 +:1023E000FD73F286F385F48449FFFED4B61F3805E9 +:1023F0001901F404F305F206C8090203800F5CF02A +:1024000012C1E904840138051909440283F838101F +:102410001901C90E0213800F5CF0A329E90384237C +:10242000D5055CF09965E904842238101909F0019A +:10243000E603E9082E07EBFDC808F001E608E90904 +:10244000D504854F84A5D50744A0003CFAA0D50348 +:10245000854F84A8000380E0C043F001E602E94014 +:10246000B41FFF6CE205E82C441283E038009800AA +:102470005CF0003DE92B4402835C3C1DFD73380099 +:102480001A02F487F586F285F38449FFFE83F50688 +:10249000F304E205F205F407E813441284B8420598 +:1024A000282438009A0A8402100380E0440284F44D +:1024B00038101A02440283A438101A0AD5114402B3 +:1024C00083E0842038101808D50BC8073C5DFD73E5 +:1024D00044A2835C38551A0A8C013800980800031E +:1024E00080DE5A0802168400441284B8100380DE8D +:1024F0004400190038009A0A8403100380E0440263 +:1025000084F438101A02440283A438101A0A4402D0 +:1025100084B838A01A02440284AC38001800C019EC +:10252000F10344528410A648C90438F29901E80A1C +:102530005200000FE405E8062E07EBFDC80340A596 +:1025400010084402849438001810C0034E12038609 +:1025500000038020960EC80C44128428943388010E +:10256000A542AD43A541AD4238109B01AC414402A8 +:1025700084280213800F445283EC38101B09380260 +:102580009800E603E8048C0138029808B41F5CF058 +:102590002710440293F4E80638501800C5068EA1AF +:1025A000D50284AF3850180844028410380019014D +:1025B0005A080143000380F8C0152E57EC0F5A58F3 +:1025C0000112445001F4FF4450F289C4B4BFE2AF99 +:1025D000E80984A08C0114538015100380F844A0EE +:1025E000FE01F0025A0002065A0804278409D502A7 +:1025F000840684AAFE6C445283EC40F308083852E7 +:10260000980088AF44F2842838579501FE2CE020CA +:10261000E813840014038015440293F43800180072 +:10262000E606E908854F40A501568401140380158C +:10263000D50344A0FE014402838C381018005A10C0 +:10264000FF058C213810180838001800E615E95DE0 +:10265000000380E05A0804114412835038009800A7 +:102660008E01960038009808C850441284B8814002 +:1026700038009A0AD54A5A0801493C0C03595CF0C3 +:1026800000C8E8430213802D5CF08097E93EF0011A +:102690005A08013C5EF18065E9383C0DFEF30250BA +:1026A000000950F2FF9BE06FE8305EF100B5E92DC4 +:1026B0000200000A50F07F9BE04FE8270223802CA5 +:1026C000846A8407FED4FE0CE060E81F440283980D +:1026D000842038101808840438141A02100380E08B +:1026E000440283A444A009C438101A0A84001403C5 +:1026F000801544028350842538101808440284B899 +:102700001223802D38A01A0AF48249001F91F40286 +:102710005A00020540A50808D5112E07EBFB5A0800 +:10272000010E3C1005A83C27F6278403944AFE14AA +:10273000E020E804840642A50024B41F441284ACBF +:10274000E34094B284A0E861000380E084613E37F6 +:10275000EBE85A000155445284E838329808C81210 +:1027600044028338FA7838301909F3015A38011ACB +:1027700044328398005F800438519808443000C880 +:10278000D5065A080208FA64440283383830190919 +:10279000D5085A08030544300032D5F75A0004F52D +:1027A00044F282C0440283208460445282F0383074 +:1027B000190938079A0238A41A0138029A0A380708 +:1027C0009A014452829040A0280138A29A094007F9 +:1027D000880040A40800A40102A5000188A28A0A7A +:1027E000AC298401100380E0440283D43830980877 +:1027F00038301808440284A038301808440284B8DD +:10280000846038301A0A84A138009800105380F090 +:102810003C1DFD73C0258E01443284AC9600380106 +:102820009808C81E4402841038121A0A3830190158 +:10283000440284B8C311443283F838319901C30982 +:102840005A30030544300640D509443007E9D5061F +:1028500044300384D503443000E138301A0A44324E +:1028600084F44E5200D844A284E838121A0A38057B +:10287000180014AF8001C80538119A0A480000D921 +:102880005A08035E441282903C83FAE638509A114B +:1028900038219A0141E28013400478018A0294B2FF +:1028A000990A9601F081224200018862020F80029B +:1028B0003CA3FAE740F20013A4D93C0BF98240058F +:1028C0003C019AC3F00196D9FE0296033C3BF98382 +:1028D000FEDA3C0BF98096DBFE2C3C3BF9814E0581 +:1028E000000AC5068402405280B6405F1401385089 +:1028F0009A09FEE44E35000A980AC40684624042F2 +:102900000C9640479001AD0138309A11CB0B440230 +:102910008290880222000001C805440284E8383011 +:1029200018088822440284F48B03A44938801A09C9 +:1029300088028B4112A000014800007B5A0001046C +:102940004800007744328398814338019800C019C9 +:10295000444282C03C0DFD7338121A02F283F482A5 +:1029600049FFFC18E609F402F203E80838121A02DB +:10297000440282F038101A0AD50484003805180879 +:102980003845180044A28320CC19441282F03C0D33 +:10299000FD7338109A02F283F48249FFFBFBF402C4 +:1029A000802449003274381519019601E2203C0B4D +:1029B000F97EF203E8033805190944028338381018 +:1029C000190138051901E201E90944028320F301E4 +:1029D000381019098400380198084432829038056B +:1029E000190138419A119A08FF043C53FAE6404213 +:1029F00004969B2C38441A0989028843222100013D +:102A0000FE14400004163C13FAE79A081204000171 +:102A1000D50F440293E838001800E604E9093C03A6 +:102A2000FAE638019A0988623C03FAE7AC19B41F48 +:102A3000E60BE9082E07EBE85A080105B41F3C0F26 +:102A4000FB8900138082443293E8440283D4C90591 +:102A500038119800E624E90C382198008420E644D7 +:102A600038101808E905442284E83811180838108D +:102A70001800444283A4440284F4C1309EC9441225 +:102A800083D496D838309808441284A038201A117C +:102A900038A0980038521A1140150C0140830808DC +:102AA000FE8C880842228C734052200022000001D4 +:102AB00022F28001FE0C42078C7340212856400010 +:102AC00028169603969312048001AC2912248000E4 +:102AD00038221A098401480000B8B42794B28E2124 +:102AE000E622E83E38119800445293E8E62AE93895 +:102AF00044A293C838F519115EF78481E93122F3B5 +:102B0000804638801A1150A0FFF65210800E4217EE +:102B100084244214287385444010A836121480007F +:102B200038129800880222F380472280000150006A +:102B3000FFF65210800E4217842442140073401096 +:102B4000A83612148001380298008C0196003802D1 +:102B500098085A080F71840038019808D56C3851CC +:102B60009800E6A4E960441293C850A2FFFC38F034 +:102B70009911525280095EF7848022138046E8271B +:102B800022F380475EF78033E905448000321283E8 +:102B9000804738801A11FE6C4214287385454050D6 +:102BA000A8B61254800038119800880222F380479A +:102BB00022800001520080099F4C42178024421459 +:102BC00014734010A83612148001D523448008FFE6 +:102BD0001283804738801A11FE6C4214287384A532 +:102BE0004010943612148000441293E88802381082 +:102BF00098002280000150A0FFFC52008009441080 +:102C000008FFFE0C420428734000141612048001D1 +:102C100038019800E609E8A0441293E88C013800D6 +:102C20009808D50938101A01880212148000A401EE +:102C30001204800102048000884438021A09020448 +:102C40008001AC118400100380E13C1DFD7344023F +:102C500082C038101A0AFCC4960054100001C10545 +:102C600038F21A11E06FE91B54100002C105381246 +:102C70001A11E023E91454100004C1079472882447 +:102C800022F08001E04FE90B961E4E02FC63943265 +:102C9000880422000001E0024EF2FC5C3802990137 +:102CA0004E03FC584402848838A0181048FFFC5298 +:102CB000FC4822708000226080014410010842011B +:102CC0008473B4A044428254945A3C9DFEF45A50FA +:102CD0000105005000EAC516ADD0AD9138720E095D +:102CE000000480058881ADA15A0001044800015EFE +:102CF000440282248820844038200E09AC89480090 +:102D00000155F28B00000020002480058143F285EC +:102D1000F08A5A200104480000ACF00A960E4E02D8 +:102D200000A84402822438200E11CA0A88202200FA +:102D300080014E02009E38720E114800009A8801F0 +:102D4000229000014E9300078824226080014800F1 +:102D500000908007901FF08640037C0A528100009B +:102D60008824F0874004FC0AB61F40047C0AF081E6 +:102D70002200800138120E11FE1442048475F10104 +:102D8000F082901FF088804880618008F58FF7837B +:102D9000490059248381F18CB43F80E08049800947 +:102DA00080614900591B80808807E204F18D883CCE +:102DB000F08440078400F203F10CF306F0898007E9 +:102DC000F48E4900590B80E0F301F18C8009B43F87 +:102DD0008048490059038046F307490058FF41C322 +:102DE0008001F00CE2FC8A0140703C01F202F30821 +:102DF0008009B43F490058F2400E0001402E000601 +:102E00009A79F3098A22F204490057E6F50FB43F94 +:102E100097C35204800040528006FE4A8A25F3017F +:102E20008048490058DBF203F306490058D7F40EF6 +:102E30008380812180048046F307F10D490058CE3C +:102E4000406E0000E2DC882940978400F202F3081B +:102E50008008F101490058C29A30406300064014CE +:102E600084018A26F204F309490057B69783F00AD1 +:102E700044928254960EC0783C0DFEF380270230B7 +:102E80000009E0E3E9073854AA11E0A3E80E9F59CE +:102E9000D50C4E7400083854AA114E55000784A072 +:102EA000D50480A78480D50284810200000A408571 +:102EB0000808B61FB45F8006E0C2E9094044A000DC +:102EC00022420001E082E80F9F11D50D4E640009F7 +:102ED0004044A000224200014E440062D5045A48FA +:102EE00001448086890939C4AA1122840001402343 +:102EF000F00140F32001C20B840241E2F0014001E5 +:102F00000016420F3C73400008168808E80B842224 +:102F100041E2200140178436421F08734010BC363E +:102F2000883C4C44003FE023E90552318001886130 +:102F3000D5044E140037FECA4C5E000DB45FE002AB +:102F4000E905522100018840D5064E040004FE82A6 +:102F5000D5028440E043E80497EB9783D505E0620F +:102F6000E80397CB97A3F105400508085A18010F0D +:102F70003824AA01441282249ABA3820AA0940248B +:102F800080008820A4919AB2AC893874AA0989205B +:102F9000F00B12648001ADC0AD81D5078480D5A34C +:102FA00084604C5E7FCDD5E0FCC8FC43F1833C1DC2 +:102FB000FEF4812084003C0FFB89A44D3C0DF9F503 +:102FC000E201E8048C013C0FF9F5814980C984E0F5 +:102FD0003C0DFEF300300009E2E34EF200C6B406F9 +:102FE0004E0200945A080604480000902213000480 +:102FF00044229C50943A38111E092213000588027D +:103000003C8DFEF4AC41A436B045120F800AA437C3 +:103010008041120F800B000400018067B61F3C4DF9 +:10302000F9F580093C5DFEF249FFF7ED000400046C +:10303000C00B49001AFD5A080208B04580098041BA +:103040008067490059A73C0DFEF4A602C00AB045AE +:10305000800980418067F40344528B4C49FFF8A5F6 +:103060003C0DFEF4A603C00C49001AE25A080209FE +:10307000B045800980418067F40349005869B04534 +:10308000804144029CB496F82E402C4949FFEAD571 +:10309000B04580098041806749FFFE0C220F800AFD +:1030A0004E0400058400120F800A3C0DFEF3222F0F +:1030B000800A02100009E041E9049E89122F800A6B +:1030C000222F800B4E2400058440122F800B02001B +:1030D000000A222F800BE040E9049E81122F800B12 +:1030E000222F800A225F800B003300DEACB4AD7566 +:1030F0005A38010CC2078E214C208005C5038E0171 +:10310000D8048402100300DEB4265A1006045A18AC +:103110000823000300E0C0035A180819440000788F +:103120003E07FBC62E07FBC5E602E80E042300227D +:103130005A280105002300EDC2035A18080D8C011E +:103140003E07FBC5D5088401D50484003E07FBC5B6 +:103150003E07FBC42E07FBC48CE13E0004355063E0 +:10316000010848FFFF372E07FBC4C8072E07FBC620 +:10317000C0108E013E07FBC6444001084291907387 +:103180003C27FDE43C17FDE53C0DF9F58089D50EA3 +:103190003E07FBC5D5F2B46A5A380607222500045B +:1031A00022150005840050A501084CA27FF63C2B97 +:1031B000FDE43C1BFDE53C0FF9F5FCC3FC208480DD +:1031C0008E4184C2E044E91198E24031987638702B +:1031D0000D019559E027E90788A0A529E024E90712 +:1031E0009D19D5F19E99D5EF841FD5028003FCA0CF +:1031F000FC423C7DFEF5F1825013800AF181508340 +:1032000080DC51C000028540853EF002E3404EF272 +:1032100000DB226E7FFFA43DE006E85CA53C9C231A +:10322000940188079EA1A401E0C0E904A5B88EC15D +:10323000D552F0018026F48349FFFFC25A07FF4CA4 +:10324000A57BA4B9E2059441F403E8108827FE1495 +:10325000A4CDA44E8AC3FF94404314969B8B406236 +:1032600018D6405014B788C5D5368A858E81E204B9 +:10327000E9188827A4FAA50D886552F18001880F06 +:103280008AC4FF94FE1440001417A4F8405314B6E7 +:10329000A58E8A628AC48803406298D688C0D51BEE +:1032A0008827A4F84231247381E3A4CDA53A8A0586 +:1032B0008AC38E814267982442003C244000101744 +:1032C00040431096A58E88408AC3406218D688C2B3 +:1032D000D50284C0126E7FFF0203806E226E000052 +:1032E000E006E86B0243806D5002006B9401880792 +:1032F0009EA1A402E0C0E905026380698EC1D55E8B +:1033000080088026F48349FFFF5B5A07FF58025369 +:10331000806C0223806AE2059441F403E812882756 +:10332000FE140230806E0210806F8AC3FF94404307 +:1033300014969B8B406218D6405014B788C5D53E72 +:103340008A858E81E204E91C88270233806B024063 +:10335000806E886552F18001880F8AC4FF94FE1444 +:103360004000141702338069405314B60260806F26 +:103370008A628AC48803406298D688C0D51F88278D +:10338000023380694231247381E30230806E02434C +:10339000806B8A058AC38E814267982442003C2450 +:1033A00040001017404310960260806F88408AC327 +:1033B000406218D688C2D50284C01A6E000C8D41B6 +:1033C00048FFFF25FCC2FC43F081F601FA0242608F +:1033D0008073B40495B199C68381A678F083840084 +:1033E000F482B602A8115A18FF05B623A859D50CC5 +:1033F000F002A678A00138000501962FB60344001C +:1034000000FFA8198401F4014617FFFF50108FFF39 +:103410008824F18480248C21507E7FFFF185501E0A +:103420000001E0274EF300805CF38024E878F1018E +:10343000F4045090FFFFFA2242438473946188257C +:10344000F405E089E96CE732E867F4014C92400545 +:103450004C7E4005D5614C7E4060F40340A0940151 +:1034600038A228005AA0FF59F4020482000138A4AF +:10347000290154A5003FC80F2280800039E298112D +:1034800040FF2007E849B743B4028B1E8900B7020A +:103490008401D5425A080115B5034CA400172280B7 +:1034A000800039E2981140FF2007E83614A180011E +:1034B000A0118B1E8900148100018402D52D5A08A9 +:1034C0000233B5034CA4401022A08000388298112A +:1034D00005E10000E10AE8038B48D5028540895EDA +:1034E000B742D51A048180014CA4401122A080006B +:1034F0003882981105E10001E10AE8038B48D50202 +:103500008540895E14A10001D50722F08000388231 +:103510009811E10FE9078D218C22D5938CE148FFAA +:10352000FF808403FCC3FC4680C03C0DFEF6B63F22 +:10353000A602F0842E07EBF35A08050884003C3DF0 +:10354000FEF68020480000A52E100406C9F8F004FD +:103550009401F0852E07EBDFE020E8F14403F04A08 +:1035600044200055AE8004A3000138550501F583C1 +:103570004C50C08CA035948A884087C0A6D0A751F3 +:10358000E662A612A693E9048E6255E180FF3C3DF7 +:10359000FEF6A71A9FE2E0A7E8048CA29728D503BD +:1035A0008E819720E602F481E9048E029600D5020E +:1035B0008400A6DB9F1AE044E8048C429690D50371 +:1035C0008E619698F2823C2C0254F304F287805E5E +:1035D00042200C7394918480F28680648040812420 +:1035E000F502E0A2E929F506811E88A4F701E0E8CA +:1035F000E91FB4E640F394000077800197D6CF0925 +:103600000077800004FF800338751D014C77C00EE1 +:10361000F70788E5A5F8CF09B4FF8C6196D9387310 +:10362000940188E9409380118D018CA2D5E0F505C5 +:103630008C418885D5D640418409892440348C76D4 +:10364000F206B49F8844F402E080E91F80FE80A265 +:10365000F401E087E917B49FB5269B2C8889009276 +:10366000000154F48004E908A720049F8003384532 +:1036700011014C44C005A5288A83AD288CE18CA299 +:10368000D5E88C01F405D5DF8C2148FFFF650021CA +:103690008038E002E80DA0B63811020AA0B7381150 +:1036A000020A042300083811020A8C01D5F18500B2 +:1036B0002E07EBDFE3004EF200E4A0313850210189 +:1036C0004C5440DCA075400408088801A7C2E6E21B +:1036D000E9048EE197F8D50284E0A6435CF08022ED +:1036E000E8048C219648D502FA33F183A640E622FD +:1036F000E9048E219648D5028420A601F181E610C6 +:10370000E8048C019600D502FA01F084FA02FE3C2E +:10371000F082F003E0074EF300B104AF8001F00245 +:10372000B43F880A940140908000F004E00A4EF310 +:1037300000A0B41F40048001F085F105B4068801A3 +:10374000200000014E050091220480004E07008DEC +:10375000800A8027B088B0CA8086B4BF49FFFE3592 +:103760005A08011DF00AA0769402880122148000F4 +:10377000B44042250473B640F00AA0B79402880210 +:10378000B44042238473B640F00A04230008940234 +:103790008802B4408822B620D55F5A08025EF10A3A +:1037A000A0F622048000F508F409944A88234220F8 +:1037B0001424888540411096B44142251073B641C7 +:1037C000F20AA17704FF8008F40994928845421018 +:1037D0003C24888F40409096B42242139073B622C6 +:1037E000F40A0423000805EF8008F1099522888275 +:1037F00042F07824883E4017843604F20000882F77 +:10380000B624F10B04FF8009F408944A8861888F7C +:1038100042103C2440409096B42342151073B623C6 +:10382000F10BF408944A8825F50942301424888560 +:1038300040419096B46142339073B661F10BF30945 +:10384000944A884142100C24F008880340008016F6 +:10385000B4228801B602B406F1058801441FFF8036 +:10386000A681FE57AE418D418D2248FFFF60F002D8 +:103870008CE18C1248FFFF4E8D0148FFFF1BFCC6F8 +:10388000FC403C7DFEF680C19B31E282E81FA1072F +:1038900004900008048000060853000100A3803251 +:1038A0003894960238421602385416028C784255E3 +:1038B00014244052A4B71251FFF400538033FF2C5C +:1038C000404224971241FFF5D5E0FCC0FC41812025 +:1038D0008400814280E3AE20F18180C43C2DFEF65D +:1038E000840044328B64E20AE811041480013850E9 +:1038F0008101D818A67038018408A6708C219648DA +:10390000AE7000410019E224E90D8009F10149FF80 +:10391000FE0C8400AE3084A03C0DFEF644228B6485 +:10392000D50A8C01D5E104148001381095014C12A0 +:1039300080068CA14C557FF9D50CA670385104082F +:10394000A6708C219648AE7000300019E223E9F28F +:103950008009A6B0806744128B6449FFFF938400FE +:10396000FA4844328B64A670E201E80980274210CD +:103970000873384180008C01A90DD5F6FCC1FC20EC +:1039800080E480C5C83FCA17CB112E07EB845A08C4 +:1039900001053C0C01EBD5555A1004392E002914B1 +:1039A0005A00014C3C0C01E5D54C5A38014C5A18D0 +:1039B000043ED52C5A280152CB095A1804053C0C58 +:1039C00001E7D5163C0C01F1D50A5A3801135A18F3 +:1039D00004053C0C01EAD50C3C0C01E8B6062E00AF +:1039E00029145A0801072E07EBFD4900088FB60677 +:1039F000B40684203C0FFB2D4403F40BAE4084211D +:103A0000D5295A08012BC90ACB043C0C01E7D5196A +:103A10005A3801193C0C01EAD5145A180114CB0488 +:103A20003C0C01E5D5055A38010E3C0C01E8B60600 +:103A30002E0029145A0801072E07EBFD49000866DD +:103A4000B606B40684233C0FFB2D4403F40BAE40B2 +:103A500084204403F40DAE40A47044024E2097F835 +:103A6000AC404403F40044104E20AC404403F40244 +:103A7000AFC0FCA084003C0FFBB54403F4038421D9 +:103A8000AE40DD9E4403F403A6005C000001DD9E11 +:103A90004413F40384003C0FFBB5AE08DD9EFC002C +:103AA00084C03C6FFBB55A08010949FFFFE53C6F34 +:103AB000FBB53C6BF630D50349FFFFECFC80FC20E6 +:103AC0004463F01D4473F421A670A631A6B04000F3 +:103AD0002008FE0F580004009640AE709208A671B0 +:103AE000AE3144000055AE38442000004430000A96 +:103AF000502100014C21FFFE49FFFFCC8400AE386D +:103B0000442000004430000A502100014C21FFFEF7 +:103B1000A6309600AE30FCA0FC402E07EB84B4E14A +:103B200084C04490003C44A200005A08014C2E0777 +:103B3000EB93E2C04EF200858006490024E10213B7 +:103B40008012421024733C0DFB404010A8043C1F1F +:103B5000FB2AC81602208014440FCFFFFE861220D5 +:103B6000801402208015FE86122080150220801607 +:103B7000FE861220801602208017FE16D51702003E +:103B80008014580030001200801402008015580084 +:103B9000300012008015020080165800300012001C +:103BA000801602008017580030008CC11200801768 +:103BB00097B0D5BE8006490024A35A080C098CC1D1 +:103BC00097B02E0028A7E2C0E9F6D53A021380127A +:103BD000421024733C0DFB404010A8043C1FFB2AFC +:103BE000C81602208014440FCFFFFE8612208014D6 +:103BF00002208015FE861220801502208016FE8687 +:103C00001220801602208017FE16D517020080149D +:103C10005800300012008014020080155800300057 +:103C20001200801502008016580030001200801625 +:103C3000020080175800300012008017D5C1FCC068 +:103C4000FC0049FFFF6BFC80FC214413F0604463DF +:103C5000F061A6084473F04A9600100F8007000F29 +:103C60008007540000FC100F8007000F80075800E9 +:103C70000003100F8007AE088400100F8007840037 +:103C80003C0FFB78000F80075A000311A630960006 +:103C9000100F8007000F8007960F100F8007440059 +:103CA0000055AE384900430BD5EEFCA194038420A7 +:103CB00044229A6C380105098C215A1808FD3C2DC4 +:103CC000FB2D4401000044429A6C0411000C8060FA +:103CD000FE471411000C4450005C84209721A0166C +:103CE000920A962FE220E80A02010012880342009D +:103CF00094738C211240001AD5F3DD9EFC214413ED +:103D0000F0604463F061A6084473F04A9600100F17 +:103D10008007000F8007540000FC100F8007000F81 +:103D200080079600AE08841F100F800784003C0FA8 +:103D3000FB78000F8007C010A6309600100F800798 +:103D4000000F8007960F100F800744000055AE3813 +:103D5000490042B5D5EFFCA13C0DFB2D0200001639 +:103D6000DD9E44220000FE174430003C0200001299 +:103D700042008C738840A616DD9E44220000FE1788 +:103D80004430003C0200001242008C738840A615AB +:103D9000DD9E8060C10D3C0DFB2D844C02000013A4 +:103DA0004201887344220000FE1710100008DD9EB7 +:103DB000C1193C2DFB2D846C5CF0840002210013A2 +:103DC00042200C7344020000FE878001E903440096 +:103DD00003FFA051540003FF922A4010A808FE0FD1 +:103DE000A811DD9E3C1003CA44024E20AC40DD9E6B +:103DF0003C0C01E54610037050108037025000154E +:103E000044020000FF47460AFFFA50228078500023 +:103E10000FFFB605A829A86A8CACDAFCDD9EFC2051 +:103E2000B48084608C8484E6B4045A380506920A0F +:103E300040002808D504921E4000780842219C24A6 +:103E4000969084A05A20200C386088008C414063F2 +:103E5000140C8CA5880696905A581EF68C6196D83C +:103E6000AA215A3806E3FCA0FC00A6495A18060706 +:103E7000441297B849FFFFD5D50E5A1003085020B9 +:103E8000FFF6E642E9035A180D072E17EBFD8E21C7 +:103E9000E622E8EFFC80FC0084003E07EBF9840397 +:103EA0003E07EBEF2E07EBFDE6023E07EBD6840064 +:103EB000E8028403848144527D6C3E07EBFD2E07AB +:103EC000EBF92E17EBEF2E27EBB32E37EBD549FF8F +:103ED000FD5844027D6C441297B849FFFFA22E079B +:103EE000EBD684813E07EBFD44527D6C2E07EBF947 +:103EF0002E17EBEF2E27EBB32E37EBD549FFFD4105 +:103F000044027D6C441297B849FFFF8B2E07EBD615 +:103F1000E6028403E80284003E07EBFDFC80B480E7 +:103F2000840080403830800095414031940C8C01F1 +:103F300088435A0810F98400A8A780405030001028 +:103F400096D8954138308C008C014031940C8843D0 +:103F50005A0810F614220008DD9EFC00B440806070 +:103F60003C2FFB2DA6495A1003045A180D06800356 +:103F700044129750D51A5A18040B2E000CA8E605C7 +:103F8000E91A2E07EBB35A080105D5155A1805088A +:103F9000A057841CFE0E58000001D5105030FFF6CB +:103FA000E662E8064412A72449FFFFBBD5088E2825 +:103FB000E622E805A057841CFE0EA817FC80FC40F2 +:103FC000A68181405A20032B5A2006299E14E6021E +:103FD000E80C84003E07EBF984043E07EBEF2E97D4 +:103FE000EBD73C73F631D53350017FF8E602E80C8D +:103FF00084013E07EBF984003E07EBEF2E902CFC8A +:104000003C70167FD52450017FF6E602E9125A284B +:104010000D3E4900130D5A08020D84003E07EBF9CE +:1040200084033E07EBEF2E97EBDB3C73F62ED50AAD +:1040300084013E07EBF92E902CFD3E07EBEF3C7020 +:1040400016802E000CAB84C35A00010384C02E07D7 +:10405000EBF984812E17EBEF44527D6C2E27EBB3E6 +:104060002E37EBD549FFFC8D44027D6C802A49FF39 +:10407000FF768006802949FFFE8EFD0349FFFE9AE8 +:1040800044027D6C802A49FFFEF1FCC0FC012E1722 +:10409000EBFAF081C91584213E17EBFA4420004861 +:1040A0004412489449001117F00144124924442055 +:1040B000004849001110F001441249B4D50D2E27D3 +:1040C000EB6884234011045796904412489444307E +:1040D000009042110C7344200048490010FC2E0748 +:1040E000EB6884238C0196004020043796484010EA +:1040F000041B3E17EB68FC81FC40840084203C0BD1 +:10410000FF833C0BFF822E57EBFD806180014462F0 +:104110004A5C44724A5E44924A6044A24A62C503C1 +:104120005A580303C91B948B9916028200003C4322 +:10413000FF8388883C4BFF839917028200003C4331 +:10414000FF8288883C4BFF8240412400884AA5209A +:10415000A49088048862960196D98C215A180AE1A5 +:104160003C13FF833C23FF828801985A96499601AD +:104170003C0BFF8388013C1BFF823C0BFF81FCC092 +:10418000FC41002F8028006F802C8460F2812E87F4 +:10419000EBC241C3040880A3814387DFF201D21F31 +:1041A000844099C340908C0054F100FF40F798067A +:1041B000E8125A80010B38F2090138F3890938F204 +:1041C000090138F48909D50538A3890939E4890931 +:1041D0008C41D5EB8CA19768887CD5E1FCC1FC00B3 +:1041E000001F801084A0944988224C208018A500CC +:1041F000A590E2C4E803A500AD10A580A518E2C40F +:10420000E803A500AD180A4100010A6180018A8611 +:10421000E0A4E80297618C02D5E98005FC80FC42AD +:10422000443000909541810044020BF0880580C124 +:1042300042340C24444223A044927CA844727C90D3 +:1042400044A00048442221F0F083B0438843B75F84 +:104250008864440205204044940088C888A749FF28 +:10426000FFC097B044129414380099092E07EBFD53 +:104270005A080111B75F44020520B04344222310BD +:10428000443224C0504480049D7C49FFFFAA3C0B6B +:10429000F60FFCC2FC42F0828400F1833C0BFF80ED +:1042A0003C0BFF7F49FFFF2AF00249FFFEF12E077A +:1042B000EB6C5A0801082E07EBFD3C2DFFC3C843E9 +:1042C000D52E84C04470004844824894F00381484D +:1042D0004090180042A31C738029442221F04432EC +:1042E00023A044427CA844527C90B6FF800A49FF38 +:1042F000FF783C0BFF80B6FF800A80294422231000 +:10430000443224C044427CAC44527C9449FFFF694F +:104310008CC23C0BFF7F5A6806DBD5CE0261000ED3 +:104320000071002A490011845A0802049639D524E4 +:104330003C0DFFC30260000E8403FF8497B144006C +:10434000FFFFD51A3C03F612C0153C13FE080221EC +:10435000000F42300424FE8C446FFFCE4410003224 +:10436000406198D6401104368826998197B184001F +:10437000D5030261000F2E37EBFD3C23FF803C1379 +:10438000FF7FC3042E47EB6BD5032E47EB62402122 +:104390001056401090363C2BFF803C1BFF7F3C1397 +:1043A000FF80E2C12E17EB6AE906CB073C23FF81B1 +:1043B000E202E8038C21D503C1048E213E17EB6A8B +:1043C000FCC2FC003C03FF805CF00033E910840178 +:1043D0003E0004272E07EBFC5A081E063C0DFFC3C7 +:1043E000A600D50284073C0FFB44D50D3C03FE0814 +:1043F0005CF00033E908490016BD3C0FFB44840023 +:104400003E000427FC80FC52842080C080E2801F94 +:10441000442000902EA0287B49004E323C03FE0829 +:104420002E9028A65CF00033E92C40050408844057 +:10443000960080A285439668E229E823842096C8E6 +:10444000E260E81C98CA94D98866384F8501A4D8E0 +:104450004031A47688642E4028A696D98E81383FB4 +:104460008509DC0A38438501926242422824908201 +:104470008864383385098C21D5E38CA18840D5DC4C +:10448000FCD2FC0084003E07EB752E07EB6AE602C7 +:10449000E90484013E07EB752E07EBFF3C13FF8018 +:1044A000E201E8053C13FF7FE201E9193C0C05EF4E +:1044B0005A0001062E00042A5A0801063C03FE0693 +:1044C0008C01D50284003C0BFE062E07EBE7C00CE6 +:1044D0003C03FE088C013C0BFE08D50684003C0B17 +:1044E000FE083C0BFE06FC8084003E07EB6A84005D +:1044F0003C0BFE08DD9EFC003C03FE085CF0003334 +:10450000E90649FFFFF384003C0BF6123C03FE066C +:104510005CF00033E90484003C0BFE06FC8084015F +:104520003E07FC0E84003E07EB77DD9EFC0049FF52 +:10453000FDE52E27EB623C13F60F3C0002464010CF +:104540008836400008163C1BF60F3C08024649001E +:10455000106F5A0802093C0DFFC30010002B4400E5 +:104560000032D5054410FFFF440000963C23F60FAF +:10457000E240E9053C200246E240E80A3C03FF81B4 +:10458000E220E90684003C0BFE068401D50284008B +:10459000FC802E37EBFD8E62E662E81D40302C0A6F +:1045A00096C6C304443FF000FE1F3CF7F62BE00F15 +:1045B000E8042E000CC6D50A3CF7F629E00FE80403 +:1045C0002E000CC2D5032E07EB65AE102E07EB694B +:1045D000AE08D5072E07EB60AE082E07EB62AE10D3 +:1045E0002E07FF085A08010D2E07EBFD8E02E6028A +:1045F000E8072E07EB69AE082E07EB65AE10DD9ECF +:104600002E100CC6FE0C2E17EB6B96034000041602 +:10461000DD9E2E17EBFD5A18031FFC40449299684B +:1046200080C050A000244480051084E038031C1191 +:1046300049FFFFE838031C09507380244C747FF84D +:104640002204800049FFFFDE8CC21A0480014C6501 +:104650007FEEFCC0DD9EFC405A0803053C5C01E691 +:10466000D5033C5C01E50232801844620000FEF78D +:10467000A418A1D9B4630242801292704090001332 +:10468000547387FF54318FFF9721C908504200B4FB +:10469000FF37A0A454210FFF969354010800C004D3 +:1046A000440FF000FE87001280494600009650003B +:1046B00002585A1801075014800288238841D503F4 +:1046C00088478C429491400008169601FCC05A0815 +:1046D00003083C040657AC083C040656D5063C04C7 +:1046E0000659AC083C040658AC10DD9EFC003C4D5D +:1046F000FB2D4460003C54108FFF025200124250C8 +:10470000187344020000FE2F96F7A14492AC405269 +:10471000B008FF4FA9442E17EBFD9F49E6A2E822FF +:10472000B48058420080B6805A180109A104441F81 +:10473000CFFFFE6658109000D504A0445810B0007A +:10474000A844A044464F00FF50420FFF40215008AC +:10475000FE66FE57A844B4209227944FFECFB66061 +:10476000D51CC90B0412000F460FE7FF50000FFFC6 +:10477000FE0E46100800D5050412000F4600180072 +:10478000FE0F1402000F10220049B424440FFC074E +:1047900094DBFE0EFEC7B664FC80FC4181202E0730 +:1047A000EBFDC8043C77FE00D50544028B703870E1 +:1047B00025113C0DFFC30000002EC0033C7414BE45 +:1047C0002E07EB63501F80063E07EB6D2E07EB6B49 +:1047D000502F80073E07EB64800749FFFEDC000F87 +:1047E000800684C03E07EB63000F80073E07EB6B3B +:1047F00080068CC149001E8497B080272E27EB636A +:104800002E37EB6B49FFFF745A680AF43E97EB674B +:10481000FCC1FC0049000F0C5A0802264413F0604A +:104820002E27EBEEA608540000FC5A280111580070 +:104830000001AE084423F04A4413F06144300055AF +:10484000A608960F5A000110AED0D5FBAE0844233F +:10485000F04A4413F06144300055A608960FC00397 +:10486000AED0D5FCFC8084013E07FC0EDD9EFC40F2 +:10487000844080A04440FFFF80024472942C9790B3 +:10488000E2C1E80F38938800A4E88C414031A47657 +:10489000E2641A3280014041BC1B40033C1BD5F04E +:1048A000FCC0949180A088408400D2080A32800124 +:1048B000E223E8FC9CC19618D5F9DD9EFC002E177A +:1048C000EB722E67EB768E21FE74840096483E07CD +:1048D000EB739449440294148801804644100032DA +:1048E00049FFFFE1FE355C0000013E07EB73FC80F1 +:1048F000FC0049FFFE02842080412E07EBFD49FFAA +:10490000FEAC2E17FC0E3C0BF6335A180120840027 +:104910003E07EBFA3E07EB773E07EB683E07FC0EDF +:104920003E17EB7249FFFDE23C0DFFC30000002E75 +:10493000C00D3C0014BE3C0BF61184003C0BFF7E06 +:104940003E07EBE784003C0E0106FC80FC003E07BE +:10495000EBFD3C0DFB8349FFFB342E07EB6749FF62 +:10496000FF1E49FFFDDEFC80FC0080C02E07EC012D +:10497000E606E9042E17EBA8D5033C1014A12E007F +:1049800004275A0801042E10299A2E07EBE7C805C0 +:104990002E00299C88209649AC702E00299AAC34B0 +:1049A00049000E465A0002113C1005A884039449A0 +:1049B0004010803696495CF08055E903AC70D50410 +:1049C00044000055AC30FC80DD9E2E3004275A3068 +:1049D00001062E37EB6E5A38011784603E37EB6EB6 +:1049E000003000103E302C49A00794023C0E0B13FF +:1049F000A60A3E002C9CA60B3E002C9DA4123C084F +:104A00001663D51AA6C03E302C49A0033C0E0B13EA +:104A1000A6083E002C9CA6093E002C9DA4103C0834 +:104A200016632E07EBFCE605E90D2E000E24C804E4 +:104A30002E000F2CC007440000503C081664840A66 +:104A4000D505FA043C08166484043E002CCA2E07DF +:104A5000EC01E605E90A2E000434C0074400005AC0 +:104A60003E002A043E002A05DD9EFC402E77EB72B4 +:104A700081202E07EB768EE1FFC484C084013C6F59 +:104A8000FBA397F8490010B444A3F04A3E67FC0E1C +:104A900049FFFD2C4C64803684003E07EC0449003D +:104AA0001E1F441000552E07EC04E60AE8231015DB +:104AB00000003C8DFBA35A8801F884003C0FFBA347 +:104AC0002E07EC048027960649FFFBAB2E17EC045B +:104AD0005004FFFF8C2196483E17EC044C603FE3E6 +:104AE0002E07EC045A080ADF3C0DFB77108000000B +:104AF000D5D9440FFFAA8CC13E07EBCE97B0D5CBDA +:104B0000840049001075FCC0C8043C0C01E5DD9E22 +:104B10005A0801053C0C01EDDD9E5A0803053C0CCA +:104B200001E6DD9E3C0C01EEDD9EFC002E07EBE570 +:104B3000C00484003C0E01062E07EBE7C8303C1C85 +:104B400001065A18142D3C0805A44422163480602E +:104B50003C101456E201E80698428C01AEC896015A +:104B6000D5F844026E703C1C025149000BDF440032 +:104B700000333C0BFE083C0DFB40C00444023520D2 +:104B8000D5034402052044128DEC44228CC84432E3 +:104B90008C3449FFFC3A84013E07EBE7FC802E177A +:104BA000EBFD2E07EBF1C1062E17EBEE5A180103B1 +:104BB0008C013E002940DD9E840044228BA03811E8 +:104BC0000101FE5C381281098C015A0848FADD9E09 +:104BD0002E4004295A480228FC403C9C025184A0E3 +:104BE00044A22A603C401456E2A4E81695A94073FA +:104BF000280088C9A538A5F8028300008CA140844C +:104C000005168AE8407380F642438875FF1C972199 +:104C1000AD309769D5E884003E07EBE784003C0E91 +:104C20000106FCC0DD9E949188404C0100051A10DD +:104C30000001D5FCDD9EFC422E17EB763C032802DA +:104C400084C0120F800444A28B702E06500644824A +:104C5000942C100F800A3C032804120F80062E06A5 +:104C6000500A100F800E2E07EB728E01FE0C54902E +:104C700000FF3C0DFB778421AE402E07EB76E2C0AF +:104C8000E8632E07EBFD5A0801063C77F610B003E7 +:104C9000D5064004980038750111B0028380501F7A +:104CA00080068007502F800749FFFC75380E1800DA +:104CB0008027002F8006003F800749FFFD192E073F +:104CC000EBC244700090FFF45A080114440221F032 +:104CD000880784204420004849FFFFA7440223A0FE +:104CE00088074410FFFF4420004849FFFF9ED51F5E +:104CF000445221F02E07EB632E17EB6B002F80063A +:104D0000003F800744428CC888A749FFFF574452A0 +:104D100023A02E07EB632E17EB6B002F8006003FBE +:104D2000800744428CC888A749FFFF482E07EBFD47 +:104D30005A00010840041800001F8007381024089A +:104D40008CC197B0D59BFCC2FC412EA028A62E306A +:104D5000287B4210A82494D984C0F081964896D824 +:104D60002FE7EBFD2E07FF0880A644828CC845C2C2 +:104D70008C384C550023F40194B18844848097E02A +:104D8000E2E3E81702F1000095E140F785F65BE801 +:104D90000309C807389E1C01892F389E1C09D506B7 +:104DA00038941C01892F38941C098C818C42D5E8D9 +:104DB0008CA1976888C3D5DEFCC1FC202E10042886 +:104DC0005A10010944128DF44420004849000A8316 +:104DD000D51980C02E57EB6C844044428DF4840A70 +:104DE00084E6381309015A50010938320901FE7C62 +:104DF000FEC4906490248823381209098C415A28F3 +:104E000048F2FCA04413F4034423F04A4430005514 +:104E1000A608C003AED0D5FDDD9EFC0080C049FFD2 +:104E2000FFF33C0DFB833E67EBFD49FFF8CA8400AE +:104E300049FFFCB584203C1FFBB53C1DFB7784017A +:104E40003E000429AE0849001C4B4413F04A44209C +:104E500000553C0DFB77A6005A080104AE88D5FA30 +:104E60004413F4034423F04A44300055A608C00319 +:104E7000AED0D5FD3C0C024F3C1C025149000A56F5 +:104E800044428CC82E07EB6D2E17EB642E27EB6384 +:104E90002E37EB6B80A449FFFE9149FFFB42840152 +:104EA0003E07EBE7FC80FC02B61F84003C0FFBB51D +:104EB0003C0DFB77F1818421AE40F282F3834900FF +:104EC0001C0F4413F04A442000553C0DFB77A6000C +:104ED0005A080104AE88D5FA440298C444127B7B78 +:104EE00049001A4BF101F202F303B41F49FFFE72AD +:104EF0004413F4034423F04A44300055A608C00389 +:104F0000AED0D5FD3C0DFB778421AE404402052098 +:104F100049FFFF554402052044128CC84420004834 +:104F2000490009D9FC82FC0080C049FFFF6D3C0D9F +:104F3000FB833E67EBFD49FFF84449FFFAF2FC8032 +:104F4000FC2084C0840184E13C6FFB403E77EB721F +:104F500049FFFFEB49FFFE714402231080264420E5 +:104F6000004849FFFE62440224C04410FFFF442071 +:104F7000004849FFFE5A440294148026844C49FF9D +:104F8000FE54840149FFFD7349FFFAD25A00013BE8 +:104F900084033E07EBFD3C0DFB8349FFF8128403BD +:104FA00049FFFCD62E07EB6D2E27EB632E17EB6423 +:104FB0002E37EB6B4C0140044C11800B44428CC8E3 +:104FC00080A449FFFDFB84023E000429D5033E7006 +:104FD00004292E07EB6D2E17EB642E27EB632E377B +:104FE000EB6B49FFFF6244428CC82E07EB6D2E1716 +:104FF000EB642E27EB632E37EB6B80A449FFFDDEBD +:10500000D51F84023E000429800649FFFCA12E071B +:10501000EB6D2E17EB642E27EB602E37EB6249FF0A +:10502000FF442E07EBEE3E67EB6CC0053E67EBEEF0 +:1050300049FFFBF184003C0E01063E07EBE749FF08 +:10504000FA70FCA0FC40840184203E07EB72844689 +:10505000440294143C1FFB4049FFFDE7840249FFD2 +:10506000FF643C0DFFC30060002EC61A2E07EB76CE +:105070002E17EB7244629414FE449648800649FF52 +:10508000FBF884203C1BF6123C1DFFC338230101B2 +:105090000230800FE262E82D3C2BF612D52A4493B1 +:1050A000F04A447000555A6001E31074800049FFD3 +:1050B000FDC43C0DFFC3A60149FFFCD949FFFC001C +:1050C0002E07EBC2C8052E07EB735A0801D12E0735 +:1050D000EB722E27EB768C018426960040108836E2 +:1050E000E0203E07EB72E8E03E17EB7284C1D5DAB0 +:1050F0000010802D5A18010384003E07EB678403DB +:1051000049FFFC262E07EB6D2E27EB632E17EB6471 +:105110002E37EB6B4C0140044C11800944428CC883 +:1051200080A449FFFD4B8402D50284013E0004297E +:105130002E07EBC2C80B2E07EB6D2E17EB642E2744 +:10514000EB632E37EB6B49FFFEB0840084213C0EED +:1051500001063E1004273E07EBE7FCC0FC0184017A +:10516000446000483E00042849FFFBC484014432E7 +:105170007C9044428CC844528C34B61F441223A005 +:10518000440221F044227CA8F68149FFF7FB440247 +:1051900023108420804649FFFD48440224C0441067 +:1051A000FFFF804649FFFD413C0DFB8B44128DEC17 +:1051B000844049FFF87149FFF9662E07EBFD441062 +:1051C0000032C8033E0004273E17EBFF3C1DFFC31F +:1051D0000020802C5A2001052E27EBE9CA07C004C5 +:1051E000840049FFFE1C8400D5140020802D5A281D +:1051F00001065A0003FA8403D5F50010802EC11C65 +:105200005A18020B3C57F6113C0414BED0ED840131 +:105210003E07EB75D5115A180110C004840049FFF0 +:10522000FDFE3C57F6113C0414BED0DE2E07EB67A2 +:1052300049FFFAB5D5D93C0DFB8B44128DEC4422C5 +:105240008CC844328C3449FFF8E02E67EB755A68FD +:10525000010B84023E00042984003E00042849FF1B +:10526000FEF3D51C2E07FF08C81B2E07EBFDC01848 +:105270003C0DFFC30060002ECE133C03FE065CF025 +:105280000032E90E49FFF94D3C6BFE063E600428F2 +:1052900084C13E67EB6E49FFFE553E6004283C0D1D +:1052A000FFC30000002EC01B3C03FF803C13FF7EA9 +:1052B000E220E8033C0BFF7E44121C539680A6C8F4 +:1052C0009208AE88A689AE093C13F63344021C55F9 +:1052D0009688A6C09228AE80A681AE41FC81FC4093 +:1052E0003C3005A84452B8002E602A0C2E47EBFD36 +:1052F0002E7004368420812544A000785C31812CF6 +:105300004480005A9688E246E81EC405988100F160 +:105310000020D50338F0040098A910F10184CF0FC4 +:105320009881C40400210028D5030021000840F41E +:10533000840040240C1B1027818CD50310A1018C04 +:105340008C21D5E12E07EBE35A08010A4400005AEC +:105350003E002A043E002A053E002A06FCC0DD9ECF +:10536000FC2084003C0FFB784463F4034473F04A50 +:10537000A6305A08010844000055AE384900379F4E +:10538000D5F8FCA0FC2380C0A601F283F384F48549 +:1053900080E55A080412A6305A08010F3C1DFB860E +:1053A0005A100A045A180B06440298C44900177A86 +:1053B000840049001ABA2E07EC0B5A08010A44026D +:1053C0007B93F103F204F305808749002975440FAC +:1053D000FFAA3E07EC083C1DFB8344227B55F303E8 +:1053E000F404F505B6FF44027D9C49002AFF9600AF +:1053F0003E07EBF3490026D32E07EBF35A000105D5 +:1054000084013C0FFBAFA6315A080810A6305A0899 +:1054100002433C0DFB865A00063D5A0809334900F9 +:1054200009075A08022FD5355A08090BA6305A0821 +:1054300002333C0DFB868E06E602E823D52A5A0885 +:105440000A07A6308E02E602E826D5235A0803088A +:10545000A6305A08012149000BEBD51B5A08040657 +:10546000A6305A080119D5155A080616A7B05A6869 +:105470000113800649000BDC800649000BB9D509F1 +:10548000844084618402FA25808380A24900163B0F +:105490008408D5028401FCA3FC00840149000BA808 +:1054A0002E07EB9D5A08050D3C0DFB83A601490014 +:1054B0001A693C0BF62184013E07EB9DD50484005C +:1054C0003C0BF62184003C0BF6203E07EBDA84000F +:1054D0003C0FFB402E102D04840A442297B844321E +:1054E000982449001A0D440FFFAA3E07EBCE3C0D4D +:1054F000FB778421AE40FC80FC003C0DFB838423C1 +:10550000AE4149FFF55E49001731840049000B7038 +:105510003C1DFB928401AE083C1DFB77AE082E07B4 +:10552000EB9D5A00040584053E07EB9D49001A3E99 +:10553000E6028400E90449001A398E023C0E010596 +:1055400084023E07EC0984003E07EBA0FC80FC408F +:1055500084003C0FFBB23C0FFB784473F04A44904C +:1055600000553C6DFBB2CE0E10938000490036A76B +:105570008401802080468066808080A6490015C313 +:10558000D5F1FCC0FC2084C03C6FFBB349FFFFE1B8 +:105590003C0DFB4044127D6C49FFF354840149FFEC +:1055A000F280447000553C6FFB784463F04A2E0053 +:1055B00028A73C1DFBB38E01E220E80DAFF04900A7 +:1055C000367E8401844080208062808080A24900F1 +:1055D000159AD5EE84003C0FFB784463F04A447082 +:1055E000005549FFF251C805AFF049003668D5FAB9 +:1055F000FCA0FC20490016BA3C0DFB4044127D6C17 +:1056000049FFF320840149FFF24C84003C0FFB78F2 +:105610004463F4034473F04AA6305A080108440076 +:105620000055AE384900364BD5F84900169FFCA00E +:10563000FC003C0DFB83A601540000FD5A08091133 +:105640002E07EB9D5A00040584053E07EB9D49009B +:105650000F64E602E90549000F608E02D50284005E +:105660003C0E010584203C0DFB834900178F3C0D47 +:10567000FB83842AAE4149FFF4A449FFFFBC8401A7 +:105680003E00042584003E07EBA049000F1C840E59 +:1056900049001555FC80FC40C006441003E8FE0C90 +:1056A00049000F3F842144004F0080418061490040 +:1056B000076444600E5D4473F04A4490005549000D +:1056C00007B7C0068EC1C60410938000D5F9490003 +:1056D00007AFC00D8400490007744463F04A44706A +:1056E0000055490007A5C003AFF0D5FCFCC0000081 +:1056F000FC40812080C24900153380E049FFFE3222 +:105700005004FFFFE60A4EF2018244F056183807B3 +:10571000810140F03C00DD0F1400560024010A0214 +:1057200088002C023C0288027002BE02840EAE3158 +:105730008405AE30840010038050449000554473BB +:10574000F04A490007755A08020510938000D5FAFF +:105750004900076EC008842144005AF080418061EE +:105760004900070B4400009149FFFF97D50F840EB5 +:10577000AE318406AE3084001003805080A7500301 +:105780008041843F18128001D8FE800684214900A0 +:1057900016FD8420840280418461808148000134A8 +:1057A00084E13E70036249FFF37884003E07EBF921 +:1057B000AFF02E07EBF984812E17EBEF44527D6C8E +:1057C0002E27EBB32E37EBD549FFF0DB44027D6C7F +:1057D0004412975049FFF3A52E000CAB84E05A0801 +:1057E000010384E380072E17EBDB49FFF2D4800727 +:1057F0003C13F62E49FFF2DE84002E2004283E00E2 +:105800000425842184003C0E01053E17EBC35A2079 +:1058100001063E17FC0E490009EB3C1DFB92840279 +:10582000AE083C1DFB77AE08A6318E08E6044EF2AA +:1058300000EE800649001575480000E9440218CCC6 +:10584000FA23AE40441218CD440FFFAAAE0844120A +:1058500018CEAE08441218CFAE083C1DFB77840169 +:105860003E0003638402AE08AE308400490009D1D3 +:10587000A6319E43E624E90A5A000D095A080E098A +:10588000490017608400490016318408D502840954 +:10589000AE318400100380503E07EBDA49FFF2FD81 +:1058A0003C0DFB8349FFF38D84033E07EB79446392 +:1058B000F04A4900121144700055490006B95A08CF +:1058C0000204AFF0D5FB490006B3C00884214400B0 +:1058D0005AF0804180614900065084002E2004283F +:1058E0003E000425842184003C0E01053E17EBC3D5 +:1058F0005A2001063E17FC0E4900097A3C0DFB8632 +:105900005A0004045A0807088440840284218062F3 +:10591000848FD57984408402FA258062848F84A1A3 +:10592000D57384203C0DFB8349001630840AAE31C8 +:105930008403AE303C0DFB8349FFF343840149FFF0 +:10594000E01AD56484003E07EBF93E07EBD549FF2A +:10595000F1D7D53484003E07EBF984013E07EBD53F +:1059600049FFF1742E07EBF984812E17EBEF4452B7 +:105970007D6C2E27EBB32E37EBD549FFF0024400A8 +:10598000004049FFF195D542440000A0441000A119 +:1059900084418460490005F184003E07EBF9D50C91 +:1059A000440000A0802084418460490005E6840012 +:1059B0003E07EBF984013E07EBB32E07EBF9848138 +:1059C0002E17EBEF44527D6C2E27EBB32E37EBD521 +:1059D00049FFEFD7D51B840EAE318406AE3080A7C9 +:1059E00050038041843F18128001D8FE8006842134 +:1059F000490015CC840084208461100380508041CC +:105A00008402808380A14900137EFCC0FC41A681F2 +:105A10008E43E6494EF202FD80E380C044F0592CEB +:105A20003827890140F13C004A003C0012004A013D +:105A3000E205B802E2058403D403A8046C053C0D1A +:105A4000FB865A08091E490005F35A08021A440247 +:105A50007B3744127BE24900153A44027B554412DD +:105A60007B5C49001522840CAE313C0DFB83842005 +:105A70004900158C8403AE31FA003C0FFB8600030D +:105A800080205A000104480002C42E002912C809CF +:105A900084003C0FFB784493F04A44A00055D52A7B +:105AA0005A0001092E0029125A000104480002B1CF +:105AB000D5260493800449001779E209E8EAD5F372 +:105AC0003C0DFB77A6005A0801EF10A480004900A6 +:105AD00033F62E07EBCD5A08010644027BE8490055 +:105AE000147584408401842A8062808080A24900E9 +:105AF000130A3C0DFB92A600C0E4D5D504938004A4 +:105B000049001754E209E90EA63A5A0001092E0786 +:105B1000EB915A0001044800027CD50B2E00035C77 +:105B2000C8F749FFDF1FC8F42E07EB5C5A0801F1E4 +:105B30002E07EBEF5A00041D84003C0FFB784473E2 +:105B4000F04A449000553C0DFB92A600C806109305 +:105B50008000490033B4D5F83C0DFB838420490014 +:105B600015158404AE313C0DFB8349FFF22A49FF31 +:105B7000FC95480000AA2E07EB9DC0035A08032D90 +:105B80008006842049001502840149FFEF8A44738E +:105B9000F04A4490005549FFEF77C8041093800005 +:105BA000D5FB490016602E07EB9D5A00041B84218B +:105BB0003C0DFB83490014EA8401490016B64900F4 +:105BC00016CBF08184408402F1018461808280A23E +:105BD00049001299D5065A08040584013E07EB9D39 +:105BE000800684E02E17EBF33E77EBA04900183ACD +:105BF0002E07EB915A08010D440FFFAA3E07EBCE8A +:105C00003C0DFB773E77EBD8AFC0480002022E0771 +:105C1000EBD85A080104480000C92E07EB9D5A082A +:105C20000404480000C33C73F621A631490016AABB +:105C3000E2E0E903490015CA3C73F620A6314900A9 +:105C400016ABE2E0E9042E000406C0063C03F62091 +:105C50005CF00168E939440FFFAA3E07EBCE8406E9 +:105C6000AE313C0DFB8349FFF1AC84013E07EBA054 +:105C700084003C0BF6203C0DFB865A080A064402C1 +:105C800098C4842BD5065A080B07440298C4842A6A +:105C9000490013082E67EBB397B05A60010448001F +:105CA00001B880263C0DFB8349001470490016544E +:105CB000F081F101840284408066808280A24900E4 +:105CC0001222480001A684213C0DFB834900145E8A +:105CD00084014900162A4900163FF081F10184022F +:105CE0008440D55C2E97EBA05A98012A49FFFC4CC2 +:105CF0002E0004065A0801174900049A5A08021394 +:105D00004900313080E03E07EBD85A08010C84008E +:105D100049000DD184003E00035D3E70035C3E00EF +:105D200004063C0DFB838421490014308406AE3107 +:105D30003C0DFB8349FFF1454800013A5A900204AB +:105D4000480001673C0DFB92109000003C0DFB7772 +:105D500010900000A608C8242E07EBD8C821000127 +:105D60008026C81E2E77EBE5CF1B8404AE313C0D98 +:105D7000FB8349FFF1263C1DFB9284013C7FFB40E5 +:105D8000AE083C1DFB77AE088401490015CE4900E2 +:105D900015E3F081F101800980478461D58F3C0DC6 +:105DA000FB838420490013F249FFFBA8480001311E +:105DB0003C0DFB865A08061384003E07EB9D3E0708 +:105DC000EBA049000435C054490012F03C0DFB51D2 +:105DD0000200001149FFFC61D54B5A00090448003C +:105DE0000118490004255A000204480001123C0D24 +:105DF000FB838420490013CA8403AE3148000109A3 +:105E00002E97EB9D4E9300238029490013BF490034 +:105E100014B780068029490013B9490014B149001C +:105E200015223C0DFB778421AE402E07EB9D5A00D6 +:105E30000413490015A2F08184618402F1018049B4 +:105E4000808380A94900115FD5065A980405840112 +:105E50003E07EB9D80062E17EBF3490017032E0734 +:105E6000EBD85A0001062E07EB9D5A08040C49FF97 +:105E7000FBE13C1DFB7784013E07EB9CAE0848002C +:105E800000C83C93F621A6314900157CE320E903C4 +:105E90004900149C3C93F620A6314900157DE3206F +:105EA000E91285203C0DFB8314938004802949006E +:105EB000136D840BAE3184013E07EBA03C9BF620B2 +:105EC000480000A749001559F081F101840284407F +:105ED00048000099A6005A08024CA608C8042E07DC +:105EE000EBD8C0042E07EB9CC83B04938004490008 +:105EF0000B14E320E8052E07EB9C4E03008A840078 +:105F00003C0FFB784493F04A44A000553C0DFB92B3 +:105F1000A600C80610A48000490031D1D5F82E078C +:105F2000EB9D5A08050BA6314900152C3C0BF621B8 +:105F300084013E07EB9DD50484003C0BF6218520AF +:105F400084093C9BF620AE313C0DFB8384C049FFA5 +:105F5000F03810938021A9BC3E97EBA0D54D84006A +:105F6000A83C84011003802149000AADD5513C0DA5 +:105F7000FB865A08070F8409AE3149FFFB5B3C1DC5 +:105F8000FB7784013E07EB9CAE08FA003C0FFB86D2 +:105F9000840010038021D53C2E07EBA05A08011085 +:105FA0003C0DFB8349FFF00D49FFFB2584023E07B2 +:105FB000EBA03C0DFB778420AE40D52A5A0802297D +:105FC00084003E07EBA0A608C8042E07EBD8C00447 +:105FD0002E07EB9CC81B8409AE313C0DFB8349FFA7 +:105FE000EFF03C0DFB838421490012D084C0840073 +:105FF00010038021A9BC490014C0F081F101840282 +:1060000080468461808348FFFE5B49FFFB13FCC12F +:10601000E605E85B4423F2484413F24944F05F2C60 +:106020003807800040F03C004A003C0006364C50E7 +:106030006A008401AE108442AE884413F24A84643C +:10604000AE084413F24BAE884413F24CAEC844136E +:10605000F24DAE884413F24EAE084413F24FAE88B0 +:10606000D531841FAE10AE084413F24A8448AE08FE +:106070004413F24BAE08D51A8401D5028402AE1047 +:10608000AE084413F24AAE084413F24BAE08441370 +:10609000F24CAE08D50E8400AE10AE084413F24A9E +:1060A0008441AE084413F24BAE084413F24CAE8860 +:1060B0004413F24DAE084413F24EAE084413F24FAF +:1060C000AE084413F250AE08DD9E92004433F25104 +:1060D0004443F241A698AE60541100E0FE0FAE18A2 +:1060E000DD9E4433F2529601AC184403F2549649B3 +:1060F000AC404403F2569691AC80DD9E4403F240DE +:106100008421AE404413F04A44200055AE88A64096 +:106110005A1001FFDD9E4413F258A448AC404413CA +:10612000F25AA448AC414413F25CA448AC42441374 +:10613000F25EA448AC434413F260A6481010000875 +:10614000DD9EFC2180E0800280C1F38149FFFF6277 +:106150004403F24497F9ADC04403F24697B1AD80D1 +:1061600049FFFFCEF00149FFFFD8FCA144021BD834 +:106170003C0FFB454403F142441FFFD8AE404403AB +:10618000F143FA2BAE40DD9E3C1DFB46A68210205B +:10619000800CA6831020800DA680A6011020800E02 +:1061A0001000800FDD9E3C1DFB46A6821020801053 +:1061B000A68310208011A680A60110208012100056 +:1061C0008013DD9E3C1DFB46A68210208014A68312 +:1061D00010208015A680A6011020801610008017C0 +:1061E000DD9EFC01B63FF28149FFFFD0B41F49FF9D +:1061F000FFDCF00149FFFFE8FC813C1DFFC45410A7 +:10620000802FFE0F3C1DFB463C0FFFC41000800A90 +:10621000DD9E3C1DFFC4541080F0FE0F3C1DFB466C +:106220003C0FFFC41000800ADD9E3C1DFFC45410CB +:1062300080F05A1810053C1DFB46AC0CDD9EFC029C +:10624000F1813C1DFB4584C0F383AD8BF2823C1F82 +:10625000FB4649FFFFD4F102F001F20349FFFFC3FF +:10626000800649FFFFE43C0DFB4644107FFF1210FF +:10627000000C441F80001210000DFC82FC40814085 +:106280008401812180E280C349FFFFC53C4DFB466C +:106290004403F140842112A2000012920001ADE2F9 +:1062A0001062000BAE40FCC0FC408120840280E103 +:1062B00080C249FFFFB03C3DFB4684008421AC19FD +:1062C0004403F14012918000ADDA1061800BAE40C2 +:1062D000FCC0FC029690B61F102F80088401102F7E +:1062E000800B102F800C102F800FB0838062F18103 +:1062F000100F800A100F8009100F800E100F800DF4 +:10630000B042FA0049FFFF9DB41FF101844049FFEC +:10631000FFCD4403F04A44100055AE404413F14011 +:10632000A6085A0001FFFC82FC02B61F8401100F70 +:10633000800E2E002887F181100F800C100F800F27 +:106340002E002888B04380418061100F800DFA0034 +:1063500049FFFF77B41FF101844049FFFFA74403C1 +:10636000F04A44100055AE404413F140A6085A00CC +:1063700001FFFC82FC03B61F8401100F8016FA0295 +:10638000F181100F8014B045100F8017FA14F282BB +:10639000F38380418061100F8015840049FFFF5115 +:1063A000B41FF101F202F30349FFFF6A4403F04A0C +:1063B00044100055AE404413F140A6085A0001FFB6 +:1063C000FC83FC2084003C0FFB784463F40344739B +:1063D000F04AA6305A08010844000055AE3849007A +:1063E0002F6ED5F84403F3808421AE404413F04A65 +:1063F00044200055AE88A6405A1001FFFCA044532B +:10640000F381944AA7289407544200F0FEA7FE5750 +:106410009648FE0F9600AE284403F38496D8AEC08B +:10642000DD9EC8044403F386D5034403F387A60026 +:106430009600DD9E4413F3868400AE084413F38770 +:10644000AE08DD9E4403F3C98421AE40DD9E4413B3 +:10645000F280A60858000001AE08DD9E4423F280B9 +:106460009405A650FE479648AE50DD9E440219277B +:1064700044121926A600A64840002008FE0FDD9E03 +:106480004402192944121928A600A64840002008F1 +:10649000FE0F50F066D45CF7805AE9034400192CD3 +:1064A000DD9E44021924A60092019606DD9E440258 +:1064B0001924A60092029606DD9E44021925A60024 +:1064C000DD9E4412192AA6089600C00EA608960062 +:1064D0005A00010BA60896005A000207A60896006B +:1064E0005A0003038400DD9E4412192B9600AE0867 +:1064F000DD9EFC20002000094443F280968694D162 +:10650000A6A00010000A542100FDFE9F3C4FFB2670 +:106510009646AEA0948AA66080E0541080FBFE5799 +:10652000AE60A4404403F28480C4AC40A47A440327 +:10653000F286AC40001380084403F283AE400003AF +:10654000800B49FFFF8D49FFFF844413F04A44202C +:106550000055A6309606C003AE88D5FC4413F281E0 +:106560003C1FFB34A60892029606C0EAA6089203D6 +:106570009606C0E6FCA0FC0044621924AE704412EA +:106580009BF8B6018401100080081000800B800188 +:10659000A989102080091030800A49FFFFACA6307D +:1065A000FC80FC008441842080624400B10049FFEB +:1065B000FFE484003C0FFBA13E000360FC80C808A0 +:1065C000441218C1A6088C019600AE08D50F4422CB +:1065D00018C2A6508C219648AE505A0801084413A0 +:1065E000F060A60858000004D5064413F060A60821 +:1065F000540000FBAE08DD9E4403F061A600920249 +:106600009606DD9E4403F061A6009207DD9E4413CA +:10661000F0679600AE08DD9E4413F0689600AE0861 +:10662000DD9E4413F06A9600AE08DD9EFC0049FF33 +:10663000FFEBC80749FFFFE25A0001068401D504B9 +:106640008400D5028402FC809404FE47960844230B +:10665000F06D4413F077443FFFC0AED0AE08DD9E2E +:106660004403F06D8420AE40DD9E9404FE479608FE +:106670004413F481AE08DD9E4413F4839680AE8803 +:1066800092084413F4849600AE08DD9E4413F4850A +:106690009680AE8892084413F4869600AE08DD9E7C +:1066A0004413F4879680AE8892084413F4889600C9 +:1066B000AE08DD9E4413F4899600AE08DD9E4403C7 +:1066C000F48244200055A640541080FE58108001EA +:1066D000AE404413F04AAE88A6409646C9FEDD9E01 +:1066E000FC004463F00EA43054000100C0094412C1 +:1066F00018C0A6088C019600AE088408D57EA43088 +:10670000960EC86AA430961EC009441218BFA60887 +:106710008C019600AE088403D570A4309616C0098B +:10672000441218BEA6088C019600AE088402D565F6 +:10673000A4309626C009441218BDA6088C01960004 +:10674000AE088404D55AA4309606C803FA00D5557D +:1067500049002DCAA4309636C841A430962EC840B0 +:10676000A430963EC83FA43054000200C00B44033E +:10677000F063A6409646C138A640541080FEAE4055 +:10678000D5334403F00EA44054108400C92FA44014 +:1067900054108800C92DA44054109000C92BA44067 +:1067A0005410A000922DC928A48054214000C20C8E +:1067B0002E000361C80584013E000361D5033E102D +:1067C0000361840ED51AA400920FC0C184013E005B +:1067D0000360840FD5128401D5108406D50E84057C +:1067E000D50C8407D50A8409D508840AD506840BFC +:1067F000D504840CD502840D4413F00E8440AC887B +:10680000FC804403F3228421AE40DD9E4413F32335 +:10681000AE08DD9E4403F323A600DD9EFC00446326 +:10682000F540B6064403F544B6204403F548B640A7 +:106830004403F54CB6604403F550B6804403F55468 +:10684000B6A0F1044403F558B620F1054403F55C05 +:10685000B620FC80FC004413F5024403F5043C0F11 +:10686000FB3E3C1FFB3FA48858210040AC88A4405D +:1068700058108040AC4084008020804080604900F7 +:106880000C97FC80FC004413F5023C1FFB3F4413B3 +:10689000F5043C1FFB3E4413F5103C1FFB41441321 +:1068A000F5113C1FFB3A4413F5123C1FFB3B44130C +:1068B000F51380C03C1FFB3C5A08027C4403F522C0 +:1068C0008420AE404403F523842FAE404413F344A8 +:1068D0008403AE084413F5008441AE884413F501E7 +:1068E000AE08840080208040806049000C613C2D0F +:1068F000FB3F441FFFBFA41058000022FE0EAC1047 +:106900003C0DFB3EA480FE56AC40840080208040BD +:10691000806049000C4D44000D02490006023C1DF8 +:10692000FB3EA40858000022AC0884008020804070 +:10693000806049000C3D44001F38490005F23C0DC1 +:10694000FB3BA64058108001AE4084008020804070 +:10695000806049000C2D440007CE490005E23C0D43 +:10696000FB41A64058108001AE408400802080404A +:10697000806049000C1D3C1DFB3FA408580000042A +:10698000AC083C0DFB3EA48058210004AC80A488D8 +:1069900058210008AC88A44058108008AC408400FE +:1069A00080208040806049000C0344001A04D567B1 +:1069B000C8694413F522844FAE084413F52384615B +:1069C000AE884423F3448423AE504423F500AED074 +:1069D0004423F5018060AE508020804049000BE8E0 +:1069E0003C5DFB3F440FFEFF8046A4688066FE4688 +:1069F000AC683C4DFB3EA460FE0EAC20A468440F86 +:106A0000FFEFFE46AC68A460FE0EAC20A4288026F2 +:106A100058000002AC28A42058000002AC20A42892 +:106A200058000020AC28A42058000020AC20A42846 +:106A300058000004AC28A42058000004AC20A4286E +:106A400058000008AC28A42058000008AC2080069C +:106A500049000BAE3C1DFB413C0DFB3BA688582179 +:106A60000001AE88A64058108001AE40840080200E +:106A70008040806049000B9C4400027F4900055122 +:106A8000D57E5A08017D4403F5228420AE4044039C +:106A9000F523842AAE404403F3448422AE403C2DC7 +:106AA000FB41841EA650FE46AE503C1DFB3BA68813 +:106AB000FE16AE08840080208040806049000B787C +:106AC0003C1DFB3FA40858000100AC083C0DFB3EF8 +:106AD000A48058210100AC80A48858210010AC8803 +:106AE000A48058210010AC80A4C8845DFED6ACC838 +:106AF000A4C0FE9EAC80A4C8442FFFDFFED6ACC865 +:106B0000A4C0FE9EAC80A4C8845BFED6ACC8A4C062 +:106B1000FE9EAC80A4C88457FED6ACC8A440FE8EAE +:106B2000AC80840080208040806049000B413C0D97 +:106B3000FB83A6415A180E17A6005A0805143C1DDF +:106B4000FB41A60858000003AE083C1DFB3BA6080D +:106B500058000003AE088400802080408060490017 +:106B60000B274413F5008400AE084413F501AE086A +:106B7000840080208040806049000B1AFC80FC006B +:106B80004433F5104423F51280203C3FFB413C2F59 +:106B9000FB3BC80CA71858420001AF18A6D05831CB +:106BA0008001AED080408060D50E5A08010FA658F3 +:106BB000841EFE46AE58A650FE0EAE108400802005 +:106BC0008040806049000AF4FC8046108000641315 +:106BD000240364230402461F7FFF50108FFFFE56DC +:106BE00040006C08FE0F64030403DD9E461008009D +:106BF0006413240364230402461FF7FF50108FFF21 +:106C0000FE5640005C08FE0F64030403DD9E441141 +:106C100000006413240364230402441EFFFFFE5695 +:106C200040004008FE0F64030403DD9E4410800012 +:106C30006413240364230402441F7FFFFE564000B4 +:106C40003C08FE0F64030403DD9EFC003C1DFB3F7B +:106C5000A40858000040AC083C1DFB3EA4085800A6 +:106C60000040AC08840080208040806049000AA079 +:106C7000FC80FC003C2DFB3F440FFFBFA450FE46B0 +:106C8000AC503C1DFB3EA488FE16AC08840080205E +:106C90008040806049000A8CFC80FC2080C1441345 +:106CA000F04080E2A6C84423F00E5431801CFEC799 +:106CB000848096D8AD10AEC85A08020584246413A7 +:106CC00004034413F04A44200055AE885A080207D2 +:106CD000490000FCC8FE640304034413F0DA97B0D3 +:106CE000A608540000F0402380044403F0ED969081 +:106CF000AE88AF804403F04144100055AE404000E0 +:106D0000000940000009400000094000000940005F +:106D10000009FCA0944D4423F042FE0F9600A6D03B +:106D2000AE10DD9E96069404965FFE474403F04342 +:106D3000AE40DD9E4413F044AC08DD9E4413F046A3 +:106D4000AE08DD9E4433F2009601AC184403F20213 +:106D50009649AC404403F2049691AC80DD9E440316 +:106D6000F20A44200055A640541080FE58108001BD +:106D7000AE404413F04AAE88A6409646C9FEDD9E5A +:106D80004423F2069600AE104403F2079648AE4044 +:106D9000DD9E4403F20BA600DD9E4413F208AC080E +:106DA000DD9E4423F20A9401A6509646FE4796487B +:106DB000AE50DD9EE608E82544F06CC83807800038 +:106DC00040F03C004A003C00080E141A20262C32E9 +:106DD0004403F20CD5154403F20ED5124403F2100D +:106DE000D50F4403F212D50C4403F214D509440321 +:106DF000F216D5064403F218D5034403F21AAE4046 +:106E0000DD9E9200E608E82544F06D183807800002 +:106E100040F03C004A003C00080E141A20262C3298 +:106E20004403F20DD5154403F20FD5124403F211B9 +:106E3000D50F4403F213D50C4403F215D5094403CE +:106E4000F217D5064403F219D5034403F21BAE40F2 +:106E5000DD9E92003C0DFB20B40092039617DD9E50 +:106E60004403F0C4A600DD9E4413F0C49600AE08AF +:106E7000DD9E4403F0C3A600DD9E4413F0C39600DC +:106E8000AE08DD9E4433F0D44423F0D6A458A610B7 +:106E900040F0A00840F7800444021BFFE00FE80B1D +:106EA000A418A65040002008FE0F44F21C424000E7 +:106EB0003C07DD9E8400DD9E44021C00DD9E4413E1 +:106EC000F0C69600AE08DD9E4403F0F4A600DD9EF9 +:106ED0004403F0F7A600DD9E4413F0F79600AE08D9 +:106EE000DD9E4403F0F6A600DD9E4413F0F6960006 +:106EF000AE08DD9E4423F0509617A650541080F83B +:106F0000FE47AE50DD9E4423F0509617A6509404E1 +:106F10005410808FFE47AE50DD9E4413F050A608FB +:106F200058000080AE08DD9E4413F050A608963746 +:106F3000AE08DD9E4413F051A60858000001AE08CB +:106F4000DD9EFC00840749FFFFD74403F04C8420FA +:106F5000AE40840749FFFFD94403F04E8421AE4080 +:106F6000FC80C80444120000D503441230003C1FCA +:106F7000FB2CC80444120510D503441235103C1FE5 +:106F8000FB2BC804441206DCD503441236DC3C1F3C +:106F9000FB24C80444020BF0D50344023BF03C0F31 +:106FA000FB23DD9E84003C0FFBA24403F18084217F +:106FB000AE404413F04A44200055AE88A6405A1013 +:106FC00001FFDD9EC8283C53F6584443F1863C3D02 +:106FD000FB243C2DFB313C1DFB293C0DFB33AD60FC +:106FE0004443F18E96D9ACE04433F1889691AC9845 +:106FF0004423F18A9649AC504413F18C9601AC08B5 +:107000002E2028874403F1842E102888AE80440364 +:10701000F185AE40DD9EFC404433F1824473F18142 +:107020003C3FFB323C7FFB27A740848140629002BB +:10703000A758855E4052A802FF77AF58A741853D0B +:10704000FF664062900CA7584052A402FF77AF58E9 +:10705000A742FF6695AAA758545280FBFF77AF5806 +:10706000A743FF6695ABA758545280F7FF77AF58F8 +:10707000A744FF6695ACA758545280EFFF77AF58EE +:10708000A745FF6695ADA758545280DFFF77AF58EC +:10709000A6069546A618962FFE2FAE18A610A6F89F +:1070A000FE264031A80240A1800410A38000A61152 +:1070B000FF069421544500FF40422402FF07AF38E9 +:1070C0000020800E4403F183AE80A4894403F19034 +:1070D000AC80A48A4403F192AC80A68E4403F19460 +:1070E000AE80022080084403F196AC80A48E440355 +:1070F000F198AC80002080084403F19EAE8000200F +:10710000800B4403F195AE800020800A4403F19F78 +:10711000AE80002080124403F1A0AE800210800AED +:107120004403F1A2AC40FCC04413F19AA448AC4023 +:107130004413F19CA448AC414413F1A4A448AC42CC +:107140004413F1A6A448AC434413F1A8A448AC44AA +:107150004413F1AAA448AC454413F00AA648965734 +:107160001010000CDD9E4403F00AA6009606DD9E7A +:107170003C0DFFC5A600DD9EFC00A6488E24E6223D +:10718000E813C80444120000D503441230003C1F29 +:10719000FB1DC80444123000D503441200003C1FFC +:1071A000FB1BC016D512C80444123000D50344128C +:1071B00000003C1FFB1DC80444120000D50344120C +:1071C00030003C1FFB1BC80444020000D5034402EE +:1071D00030003C0FFB21FC8084003C0FFB964403F5 +:1071E000F1C08421AE40DD9EFC005A0002055A0029 +:1071F0000318C82E2E2028874403F1C22E10288899 +:10720000AE804403F1C34423F1C4AE403C1DFB1BDC +:107210003C33F63A3C0DFB219649ACD0D5122E20DA +:1072200028874403F1C22E102888AE804403F1C39E +:107230004423F1C4AE403C13F6363C0DFB21AC5068 +:107240004423F1C69601AC504413F1C8AC08FC804D +:10725000FC202E10042980E03C6DF9F7C102840364 +:1072600049FFFFC43C1DF9F75A100F16C7035A789F +:10727000020380C14403F1C197B0AF8049FFFFAE64 +:107280004403F04A44100055AE404413F1C0A60830 +:107290005A0001FFFCA0C0045A000209DD9E3C0D0B +:1072A000FFC5A6003C0FF9F7DD9E3C1FF9F7DD9EF8 +:1072B000FC4380E0840080C181222E102A0C4422ED +:1072C000B8008060E201E80699028C011032018C5E +:1072D000D5FAA03C8029FA4E503F801749FFC932A9 +:1072E000000F80178420F0813C4DFB53841F80A148 +:1072F000F201E2A2E8260434800194A93831950114 +:10730000DB1E04A4800404348002884A008100014A +:1073100038319501E702E91300A200028F42E10A29 +:10732000E80E00A10000E742E90AA6A38E42E1426E +:10733000E806E2234011BC1B4002BC1B8CA1D5D93E +:107340005A07FF1B50348018B443944238A10202FC +:10735000A09938510202A09A38310202C375002266 +:1073600000320002003342250824FE2C41E10FD7F1 +:1073700040300C77D56A846083C380438143D50F46 +:107380004E220090000200324205002440A009571E +:10739000000200334204002440200857A6305A005F +:1073A000010B2E07EBE8C004F0015A000105441060 +:1073B000003CD502FA38400F28019A9AFE04420197 +:1073C0000873FE4CE22081403C0FFB8A0013003022 +:1073D000E819F001E603E810C90F2E00043CC80CC0 +:1073E0002E07EBE75A080109442000783E17EBE12D +:1073F0003E27FF18AE30A6305A080113440000782B +:10740000D50B2E07EBE8C00C2E07EBE1C0092E07C9 +:10741000FF18C0058E013E07FF18D502AE30C1032C +:107420008400AE30A6305A0801405CF500C92E0732 +:10743000EBC1E905E605E8388C01D503C0358E01BE +:107440003E07EBC1D53183C3040480058440882006 +:107450008102A60BA74AF0828142F002E205E9917F +:1074600000908001A608149F8003049F8003E320FE +:10747000E9160092000281E042F2A473409784086A +:1074800004F38004892F0294800040948011E53E2B +:10749000E904894089058C418C01D5E88CA1D5DEB1 +:1074A000814248FFFF7DFCC33C1DFFC9A004A44CE2 +:1074B000E201E90684003E0004258402DD9E84008A +:1074C000DD9EFC0044027D848420442FFFAAAE810F +:1074D000AE40AE423E27E7E4840084413E17FF53AE +:1074E0003C0FFFD23C0FFFD13E07FF523C0BFFA6E3 +:1074F0003C2FF9F83E17FF513C0BFFA73E07FF5406 +:107500003E07FF2F3E07FF2E3E07FF2D3E07FF5091 +:107510003E07FF2CFC803C0DFFC9A404DD9EEFF864 +:10752000F081F0018E01F081F001C002D5FBEC0882 +:10753000DD9EFC0046F7FFFF50F78FFF5A18022C24 +:10754000806084A0B4435A280221808084C0D61869 +:10755000B4445A28021622118004222200049A8A76 +:107560004E240003FE922211800522F200058A2F8C +:107570004E140003FE4AFE4C4211087381E18CC197 +:10758000504201085A680AE58CA1503181085A58C6 +:107590000ADBD50484003E0004362E000436C80AF7 +:1075A0004401DE83E00F8401E80284003E000436DB +:1075B000FC8044031703D5F7FC02F382F483B63F43 +:1075C000F28149FFFD01B41FF101F20249FFFD25DF +:1075D00049FFFCEAF00349FFFDA9FC82FC40F609E3 +:1075E000227F80164E0300840093000C1092800EC0 +:1075F0000293000112928001029300021292800213 +:107600000093000110928006A4D82EF7EC011232EC +:107610008008A4F5ACEEA4F3ACEC00330009103202 +:10762000800B003300081032800AE90C2E37EBED96 +:10763000C3068E613E37EBEDA4F5D502FA78ACEEC9 +:10764000D506A4F5ACEE846A3E37EBED84605CF7BA +:1076500080063E37EBA7E8064430003C3E37EBA8F7 +:10766000D50AFA7D3E37EBA884613E37EBA7FA7D59 +:10767000123280082E300434C3038460AEEEF30867 +:1076800022918004FEFAE123E802ADE92E37EBE512 +:107690005A380105A4F7123280082E37EBFD5A380C +:1076A0000316A5B72E37EB6BFEF42E600CC64031E7 +:1076B0009876979940330409E2C340333C1A12325A +:1076C00080088E6596D9ACEAACE92E3004255A388C +:1076D0000106F30CA4DA123280082E300365CB05C4 +:1076E0002E37EBF85A3801048460AEEEA6C85A383B +:1076F00002088461AEE4C8068403AE08D5038400A2 +:10770000AE240011002284005A1801071001002243 +:10771000AE62AE63D503AE22AE23FCC02E00291F9D +:107720005A0801272E100434C9243C1014AB3C2005 +:1077300005A4E222E9053C20064CE222E81A842056 +:107740003C1805A43C18064C8400443216343C20F6 +:107750001456E202E80698838C01AE509601D5F8E3 +:107760002E00042B8C013E00042B8402DD9E84013C +:10777000DD9EFC4084404430FFFFB641A8C9B4C040 +:1077800044429968447005103832081184A0982A40 +:107790008806029000002E0029404001800C8809D4 +:1077A000B5219603E320E802B60104908001E209C6 +:1077B000E802A80950528024DFEB8C425A2824E6C4 +:1077C000FCC0FC413C5DFFDCA72AB69F4440010899 +:1077D0004201907305C00000504E7FFFE682E85AD8 +:1077E00004400009A04D95228881A662A7A00092BE +:1077F0000001A7E3C1038E219648A72B8E81E0E408 +:10780000E8038CE197F8C6038EC197B0B49F8E81D0 +:10781000E124E80550448001549200FF848083C431 +:10782000855FE2E1E91AB4BFFF4CF58180A6E3254C +:10783000E911048F8001890538812111E510E907DC +:10784000E30A888840A43C1B51EF00018CA1976893 +:10785000D5EF8C219648D5E6441001F44245787561 +:10786000FF0C0210002C442294F0404204975BC8A5 +:10787000010538410E0AD50C38110E0284A5FE6CA4 +:1078800084A3421214734010940D38110E0A124052 +:10789000000FFCC12E17FF7584003E07FF74C1085E +:1078A00084213E17EBD83E10035C3E07FF75840031 +:1078B000DD9E3E07FF7584003E07FF748400DD9E59 +:1078C00084003E00035DDD9E841F3C0FFA3284007D +:1078D0003E07FF753E07FF74DD9EFC438100840078 +:1078E00081413C0FFB7884C0F6813C0DFB54A6031C +:1078F000E0C0E871E4C48400E9029E33F0829C3366 +:1079000084E0F0833C0DFB54A602E0E0E86244030F +:10791000F04A44100055AE40490024D13C3DFB5490 +:10792000B4488027A61A42130073381105005A1074 +:10793000FF4F04440001381205114E150049E4E4DC +:1079400087C0E90351E3FFFDA65BF5038E21E02527 +:107950004012BC1A8E01F1849C7BE0014000BC1AED +:10796000F085F102F004E001E932801EF505E0A0A7 +:10797000E92C0091800281E042F0A4734057840812 +:1079800038F13D005AF0FF2038F23D114EF4001C52 +:1079900004F5000488AF3CF00488A568976BE0AF5D +:1079A000E91280A7425324733851150044FF800028 +:1079B000956988A4029280004094BC0412928000D1 +:1079C00084A1F5818C01D5D38C21D5CD8CE1D59BBB +:1079D0008CC1D58CF001C888FCC3FC40A612C00342 +:1079E0008E01AE123C9DFB54A753000480038E0110 +:1079F000D0038CA1AF53A610C0038E01AE100004BB +:107A00008002A7518E01D0038CA1AF512E07EBEA63 +:107A1000E602E90D3C3005A8926196DBE479E907BE +:107A20005EF18097E90544300096D502FA6984003A +:107A3000A79000A1000180A0E346E926A7D200811B +:107A40000003E307E91F0044800281E642F39073DC +:107A5000808F04F080059521888F02F2000040F7A6 +:107A60008011E06FE80D02F2000040F78011880FEE +:107A700002F2000040F78011E0AFE802A5608CE15F +:107A8000D5E18CC1D5DAC506441001F4FE0C4000E6 +:107A90001417FCC0FC4C847F3C3FFA323C3DFB5544 +:107AA000A71B5CF20042E90444400041AF1BA71849 +:107AB0005CF20042E90444400041AF182E50040635 +:107AC000444003E85A5001062E50035D5A580107FE +:107AD000A75CA7DD42929024D505A75BA7D8429268 +:107AE00090242E300404FFE4A7105A38010C2E37DE +:107AF000EBC1C310E683E80E846342948C24FFDC60 +:107B0000D509CB082E37EBB5E66BE9044094840821 +:107B100095F9CC048420480000C284603C8DFA3280 +:107B200080A3E0A4E80FA18138631501DE09A182DA +:107B300038631501E2664082BC1B40333C1B8CA1BC +:107B4000D5F18142A085F18140140808882280C0C7 +:107B50008444B0033C8FFA32490032888006F10138 +:107B6000B08349FFFF3CE2E0E81B84013E07FF745D +:107B70003E00035D49FFF55C5A08020A44000078A4 +:107B80003C0801AF3C0DFB55A601D505FA083C08A1 +:107B900001AF840C3E07FF75842148000080E3207C +:107BA000E8BA442F80008420B0C4402408040005B3 +:107BB0000000E020E80CA13194098804A540385168 +:107BC00085094C544003AC808C21D5F28006F1012C +:107BD00049FFFE853C9DFA32048300054014880865 +:107BE0008828B00384444900324100350000500425 +:107BF00000038420E023E82EA0B13851050196ABA4 +:107C00004E2400265452FFFF4C548022D9200020DD +:107C10007FFD004F800CE282E903102F800C0020D2 +:107C20007FFE004F800DE244E903102F800D0020FD +:107C30007FFF004F800EE282E903102F800EA680A6 +:107C4000004F800FE244E903102F800F8C218C0439 +:107C5000D5D28006F101B08349FFFEC1E2E0E81011 +:107C60003C1DFB5584013E07FF74A6493E00035DA1 +:107C7000440000783E17FF753C0801AFD58E8400A4 +:107C8000B08400150000E0014EF2FF46A0713831CB +:107C90000101383081098C01D5F52E07FF75C00D23 +:107CA0005A1801053E17FF74D5088E0196003E074D +:107CB000FF75C8033E07FF743C0001AFC009C90847 +:107CC0008E0196013C0801AFC8033E10035D2E07EC +:107CD000FF74FCCC2E57EB7A2E07EB793BFFFCBCF4 +:107CE0008C01EFFCD0294403F04A44100055AE400B +:107CF0002E07EB792E17EB792E27EB79443277009C +:107D00009404949488038843944CA002381184020C +:107D1000A49249002371440002EE49FFFC022E07A1 +:107D2000EB798C0196003E07EB7A2E07EB7B8C01FA +:107D300096003E07EB7B49FFF89EC00784013C0F8D +:107D4000FBAF840049FFF89B49FFF88CC00AEC04A4 +:107D500084013C0FFB9A3BFFFC84840048FFF886BB +:107D6000EC043BFFFC84DD9E84003E07EB7948FF7A +:107D7000FFB33BFFFCBCEFFC49FFF45A5A0002067C +:107D800084033E07EB79D50484043E07EB79EC04C9 +:107D90003BFFFC8448FFFFA03A6FAABCEFFC8120A8 +:107DA0008001490003AD83808403400480375490F0 +:107DB00000FF4402953C548080FF381070005074DE +:107DC000800C97F85A10FF1E442295183C03F615B4 +:107DD0003811040049FFDFC73C13F614442000604B +:107DE00042100873800144120000FE0F84CA38005C +:107DF0002602426418244060180D546303FFD50323 +:107E0000446003FF44029524381070005A10FF1E8E +:107E1000442295303C03F6153811040049FFDFA3D6 +:107E20003C13F61444200060421008738001441291 +:107E30000000FE0F842A38001E024214042440A0D1 +:107E4000040D54A503FFD50344A003FF803C3C0D63 +:107E5000FB2D49FFDF88838049FFDF8044100060ED +:107E6000420E047344120000FE0F4613FFFF502021 +:107E7000006080A050108FFFAA69DAFF846A423444 +:107E80000C24442003FF40210C0CFE5340A50C0C95 +:107E900040630C0CEC04FF8F401504043860260A84 +:107EA00038101E0A3A6FAA84DD9E3A6FA8BC3C6D5A +:107EB000FB2D449200004063240484E00403000C82 +:107EC00044A0003C940792071403000C0413000C18 +:107ED000460FE03F50000FFFFE0E1403000C9638D3 +:107EE0004900030E021300128CE188294210287306 +:107EF000A08B8001441FF03FFE56A8435A7809F139 +:107F00003A6FA884DD9E84003E07EB7FDD9E3A6FCA +:107F10009ABCEFFC2E17EB92E623E9633C3DFB2D68 +:107F20004412000002218012FE573C1FFB2AB4417C +:107F3000924796865A280105B4219677D504B42332 +:107F400092239677442FFE00FE54964984A0444025 +:107F50000510B46088658CA2A49888419691AC986D +:107F6000DCF949000FE884003E07EB8E3E07EB8406 +:107F70003E07EB7C3E07EB873E07EB8B840049FF17 +:107F8000F6264413F04A442000553C0DFB92A6000F +:107F9000C803AE88D5FB8421804180614400FBA0EA +:107FA00049FFF2EB84418062441000AF44001CA002 +:107FB00049FFF2E384418062FA284400D9B049FFC6 +:107FC000F2DC490013132E07EBF984812E17EBEF37 +:107FD00044527D6C2E27EBB32E37EBD549FFDCD115 +:107FE0008401EC043A6F9A84DD9E5A08040F3BFF2B +:107FF000FCBCEFFC49000F9F3C0DFB778421EC0497 +:10800000AE403BFFFC84DD9E3C0DFB778421AE40FF +:10801000DD9E3C1DFB2D463FFC7F464003000220B9 +:10802000801544120000FE574650FFF0844C3A6F12 +:108030009C3C4210087350318FC78440504200303E +:1080400050528FFF466A000AB4015A200206FE2EE3 +:10805000FE37AA09D504FE1EFE27B6018C41969074 +:108060005A2803F43A6F9C04DD9E3A6F98BC80C195 +:108070002E17EB7CC91C5A00FF063E07EB7949FF1F +:10808000FE2B5A68011549000090C80944023000CF +:10809000441200003A6F988448FFF14844020000FF +:1080A000441230003A6F988448FFF1403A6F988448 +:1080B000DD9E4423F5104413F5125A080106840589 +:1080C000AE10AE08DD9E3A6F98BC840084C0AF90BD +:1080D0008060AF88804080204900006A3E67EB8561 +:1080E0003A6F9884DD9EFC0049FFF2FCFC8044035B +:1080F000F04A44100055AE40DD9EFC0049FFF835C3 +:10810000FC80FC03F0818005F384F485F283F18226 +:1081100049FFF289F002F10349FFF5FE4403F04AFA +:1081200044100055AE40F001F104F20549FFF5B7E7 +:10813000440001F449FFF9F5FC83FC2084C080E091 +:10814000E2C7E80C8401844080208062808080A2A5 +:108150008CC149FFFFD897B0D5F4FCA0FC0049FFC3 +:10816000F6ADFC80FC0049FFF68FFC80FC0049FF67 +:10817000F673FC80FC0049FFF24CFC80FC0044627A +:10818000B8000003000B49FFF2444400003249FFED +:10819000F9C80003000B5200000149FFF23A8400C5 +:1081A0003E07EB5CFC803C0DFB40DD9EFC0049FF84 +:1081B000F12849FFF1084403F04A44100055AE404D +:1081C0004413F380A6085A0001FF84003C0FFB789B +:1081D0004463F380840049FFF1265A08011149FFE6 +:1081E000F12B49FFF0F04403F04A44100055AE4033 +:1081F00049002065A6305A0001FFD5ED840149FFF2 +:10820000F1125A0001EEFC80FC0049FFF846FC80A8 +:1082100044026200DD9EC80444220000D5034422CB +:108220003000B641C80444220510D503442235105D +:10823000A889C804442206DCD503442236DCA88C75 +:10824000C804442236DCD503442206DCA88DC804C9 +:1082500044220BF0D50344223BF0A88EC8044422EC +:108260003BF0D50344220BF0A88F44220BFCA88AD4 +:1082700044223BFCA88B2E2029145A28010AC8044A +:1082800044020520D503440235203C0FFB8B4402F9 +:108290002550140080104402620014008011DD9EFD +:1082A0005A180A0544123D44D5055A180B064412C3 +:1082B0004BE014100009DD9EFC015A0801153C0C2E +:1082C0000A3B3C1C0A36B61F3C0C0A3C3C2C0A37C5 +:1082D000F0813C3C0A383C0C0A353C4C0A393C5C89 +:1082E0000A3AD5133C0C0A333C1C0A2EB61F3C0C30 +:1082F0000A343C2C0A2FF0813C3C0A303C0C0A2DFD +:108300003C4C0A313C5C0A3249FFF28A84008020EE +:108310008040806049FFF07549FFF055FC81FC20EA +:10832000842CAE4184C084013C6FFBA64470005590 +:1083300049FFF1473C6FFB784463F04A3C0DFBA6D4 +:10834000C00C8420846184028041808380A33C1F10 +:10835000FBA649FFFED8FCA049FFF25E5A0801F3D4 +:10836000AFF049001FACD5EB3C0DFB4052000001C3 +:108370003C0FFB40DD9EFC01B61F3C0DFB83F181F1 +:10838000A6015A00060449FFFFF1B43F3C0DFB4033 +:1083900049FFFF433C0DFB4049FFF5E53C0DFB4029 +:1083A000F10149FFF6EBFC81FC0049FFF22C84014E +:1083B00049FFF22EFC804423F0759606A650541017 +:1083C00080FEFE0FAE10DD9EA4408C2196495CF02D +:1083D0008190AC40E90AFC00840049FFDB62440064 +:1083E000006949FFF56EFC80DD9EFC00A740D90CBA +:1083F0008CA19768E6A5E90284A0AF40440FFFAACC +:108400003E07EBCED512441218BCA6088C0196008C +:10841000AE08840049FFDB454403F4038420AE40EA +:108420004400005549FFF54D440218BCA600C004A5 +:1084300084013E00042DFC80A6885A28AA0AFC006C +:10844000A680AE888420AE4049FFF570FC80DD9E9A +:10845000FC003C0DFB865A08042749FFF52F3C0F12 +:10846000FFDF49FFF0E55A0002162E0029135A08D3 +:10847000011284003E0003643E07EBAF84003C0B16 +:10848000F62D44127B5C44027B5549FFFFD78403E1 +:10849000D505FA003C0FFB86840584203C2DFB8328 +:1084A00049FFE928FC80A6885A20AA10FC00AE806B +:1084B000442FFFAAAE88A6005A08010549FFF52FF0 +:1084C000D50349FFF533FC80DD9E8440AE808400F7 +:1084D000AC08DD9EFC008420840149FFF4254400A3 +:1084E0000CD549FFF429FC80FC005A08010549FF1E +:1084F000F3AED50349FFF3BFFC800000E60DE83280 +:108500003C1DFB2D44F084143807800040F03C00F3 +:108510004A003C000E12161A1E22262A30363C4211 +:108520004800A009D51DA009D50CA009D50DA009AA +:10853000D50EA009D50FA009D510A00AD511A00A03 +:108540009205D50EA00A920AD50BA00A920FD50863 +:10855000A00A9214D505A00A9219D502A00B96275D +:10856000DD9E8400DD9E9200FC004403F5608420C3 +:10857000AE404403F5618423AE40840080208040F7 +:10858000806049FFFE15FC80FC004423F04A443023 +:108590000055AED04433F380A6985A2001FFC95F3E +:1085A000A6018E01E60E4EF2009944F084B8380719 +:1085B000810140F03C00DD0F1C0020012000700014 +:1085C00020007000700034003400780078007000E3 +:1085D00020008C008402D52A2E000CB8C830441329 +:1085E000F516AE084413F517AE08D5292E000CB8C1 +:1085F000C8084413F5168401AE084413F517AE08F5 +:10860000840149FFF00B8440840180A084228062B1 +:10861000808249FFFD78840149FFF392840149FF7C +:10862000FECC840049FFFE4A840049FFF12DD55558 +:10863000840149FFFEC2840049FFFE40840049FFD7 +:10864000F2A0D54B8440840180A084228062808285 +:1086500049FFFD59840149FFF373D5E75A180136E4 +:10866000A6018E03E60CE83944F0857838078000CF +:1086700040F03C004A003C00240C240C0C10101E5E +:108680001E6024288401D5D2840149FFFE1784018D +:1086900049FFF0FAD510840149FFFE108401D5D0BE +:1086A000840149FFFE0B49FFFF61840149FFF0ECA3 +:1086B00049FFF2CD840049FFFE80840049FFF3406A +:1086C000840049FFEFABD5095A180208840149FF1D +:1086D000F0DB840049FFF334FC809200FC002E079D +:1086E000EBF95A08012E49FFEFA3C82A3C0DFB9273 +:1086F000A6405A1801FFA6005A0801233C0DFB773B +:10870000A78097B05A68011D3C0DFB838429AE41B8 +:10871000842049FFFF3B3C0DFB83842AAE413C0D86 +:10872000FB4044127D6C49FFDA8D3C1DFB928400B6 +:10873000AE083C1DFB77AE08800649FFD9B2FC802D +:10874000FC004403F5608423AE404403F5618420BB +:10875000AE40840080208040806049FFFD29FC807D +:108760004402978C8420AE4084213E17EDCA8420B9 +:10877000AC431210000812100011DD9EFC20840191 +:1087800049FFD98F84003C0FFB784463F04A447062 +:10879000005549FFD979C8183C0DFBB5C815AFF095 +:1087A00049001D8D2E07EBCD5A08010644027BE8D7 +:1087B00049FFFE0C8440840180208062808280A278 +:1087C00049FFFCA1D5E7FCA0FC403C0DFB83A601C2 +:1087D0005A08042E3C0DFB865A080A0A2E07EBE0C5 +:1087E0005A00014084013E07EBE0D50A5A080B0904 +:1087F0002E07EBCF5A00013684013E07EBCF2E0740 +:10880000EBE05A08010D2E07EBCF5A08010984004E +:108810003C0BF6213E07EBE03E07EBCF3C4DFB6106 +:108820003C5C02583C6C02598440D50584003C0BEA +:10883000F621D5F5A6239401E040E813945199E977 +:108840008826A4F8A438A448409008094001840967 +:1088500088099222880196018C41AC389690D5EB1C +:10886000FCC0FC4084003C0BF6203C0BF6213E078C +:10887000EBD83C0DFB83A6015A0804092E07EB9D9B +:10888000C8038403D5045A08030584043E07EB9DFE +:108890002E07EB9D5A08020584003E07EB998400E1 +:1088A0003C2DFB613C3C02593C4C02573C5C02585D +:1088B000446001F4447299148120A6539449E00164 +:1088C000E81D944140A204004081840002A50000FC +:1088D000882540A5001312A400002EF00406E90824 +:1088E00002A4000040A5001312A08000D502AD88AC +:1088F000389380088C019600D5E1FCC08400848CFC +:108900009640E628E8049850A649D5085A18080564 +:1089100010418008D50538110000381180088C01FD +:108920005A0820F0DD9EFC005A0801132E07EBB315 +:10893000C8112E000CA8E605E9075A0005058E02AD +:108940009600D5028404802049FFEE80D50349FFBC +:10895000EE89FC802E17EBB33C0DFB51C903A60238 +:10896000D502A6032E17EBA05A180206E604E90367 +:108970008E039600DD9E3C0DFB5100000016DD9E2F +:108980005A0804053C03FFC1DD9E3C0DFB5102006B +:108990000009DD9E5A0804053C03FFC0DD9E3C0D26 +:1089A000FB510200000ADD9E3C0DFB51A400DD9E40 +:1089B000A400920196065A000107A60892019606A5 +:1089C0005A080108440000643C0BFFC18402D5082A +:1089D0003C0DFB51A447020000083C1BFFC13C0BAF +:1089E000FFC0DD9EFC402E17EB9E5A18020B2E177F +:1089F000EB9CC9072E17EB9D8E225C108001D502DF +:108A000084203C2DFB613C9C025984A0A6D384C1E8 +:108A100095198E819FD944A2954852800000E0A408 +:108A2000E81BD71740F284084024BC0050F78002AE +:108A300040F4BC00A49002F780008A4F9693E002B5 +:108A400038251509E903E048E8045A18010384C2EF +:108A50008CA19768D5E55A18012D920144229548BA +:108A600084208122FF02E027E81638510511E00535 +:108A7000E80740A08C0038F12911E00FE908E0A4D4 +:108A8000E807994B38549511E0A4E80284C28C2180 +:108A90009648D5EA5A68010E84E084003E67EB9C54 +:108AA0003E7004063E67EBD849FFF7053E70035D54 +:108AB0008006FCC0FC42B61F4400FFFFA80B3C0D23 +:108AC000FB51850014808002A604E610E8055220C0 +:108AD0000010548100FFE6118060E902FA6084C052 +:108AE00096D88006812644423D4444A299143C5DB8 +:108AF000FB61A76B9569E1253C5DFB834EF200AA03 +:108B0000A6A940748408540100FD3C5C02595A082F +:108B100004203C0DFB865A080A0944024BE099BC2C +:108B200038001C01A5B0D5095A080B0A983C4462CC +:108B30004BE0A40038631C019B8697B35A280604B7 +:108B4000FFB297B398AFA4108A069601AC103C2CE4 +:108B5000025788A78847A428A490420020244201F5 +:108B60000C7392049601AC283C0C02593C5C025AEE +:108B7000880788A7A4803C0C02588807A4009A1094 +:108B80009603AC283C0DFB51A568A405976BFE022B +:108B9000E0A0E8312E07EB9C5A0001062E07EB9D62 +:108BA0005A08022A2E000406C81C380524003C5D21 +:108BB000FB518C01960038052408A56EE2A0E8213F +:108BC0003C5C02593C0C025888A78807A568976945 +:108BD000AD4084003805240884013E07EB99D51187 +:108BE000F483F182F38149FFED23F301F102F403F1 +:108BF0005A0802DD38052400C0048E013805240817 +:108C00003C0C0259A14A8807A480E2A2E803A540CF +:108C1000A94AA480A14BE245E803A400A80BB41F15 +:108C2000A7413C0DFB515A580904A403D502A404E2 +:108C30003C5C025A88E5A578976BE005E80484A1BE +:108C40003E57EBD850548001549280FF48FFFF51AB +:108C5000A6695A18090649FFFEC73E07EB9EFCC2EB +:108C6000FC408121A64180C05074FFFC5A18043397 +:108C7000840149FFEFCE840149FFEFDA840149FF07 +:108C8000EFB7E6E4E9305A900C2F2E07EB9D5A001F +:108C9000042B2E07EB915A0001272E07EBB35A083D +:108CA000010449FFE4568006842049FFFC6F8401DB +:108CB00049FFD6F784003C0FFB784493F04A44A068 +:108CC000005549FFD6E1C80F10A4800049001AF7EB +:108CD000D5F92E17EB9D5A100407842049FFFC5646 +:108CE00049FFFD4E3C03F62144129C048C013C0BD1 +:108CF000F6213C03F6208C013C0BF620800649FF50 +:108D0000FEDB2E0004065A08012249FFEC915A08A6 +:108D1000021E4900192784C081203E07EBD83C6B16 +:108D2000F6215A08010B840049FFF5C53E60035D3A +:108D30003E90035C3E6004062E07EBAD5A08010727 +:108D40003C03F6208C143C0BF6202E07EBD85A0877 +:108D5000010684003E07EBDAD5132E67EB9C5A68B8 +:108D6000011044029C043C1014B444227B6249006C +:108D7000054F5A0802063E67EBD83E67EC0E440FDB +:108D8000FFAAE6E23E07EBCEE80B490008D48400D8 +:108D90003E07EBD884003C0BF6203C0BF6212E0757 +:108DA000EBBB5A0801043E07EBD8FCC0FC20840052 +:108DB0003C0FFB784463F04A447000553C0DFBB512 +:108DC000C815AFF049001A7B2E07EBCD5A080106F3 +:108DD00044027BE849FFFAFA8401844080208062E3 +:108DE000808080A249FFF98FD5EA3C0DFB8384295E +:108DF000AE41842149FFFBCA3C0DFB83842AAE416E +:108E00002E27EE20CA09840284298461848380A2EB +:108E100049FFF979D504840E49FFF991FCA0FC00C3 +:108E2000840084203E07FF943E07FF913E07FF9099 +:108E30003C1BFFC73C1BFFC63E17FF933E07FF923C +:108E40004410004084003E17E8CD3E17E8CC3C0FAC +:108E5000FFE8FC80A601C819E622E9043C0004886A +:108E6000D512E664E90E8E638405FEC4E470E9045D +:108E700044000055D508503180463C381639DD9EF7 +:108E8000440000463C081639DD9EFC418501B61FB2 +:108E900080818120838185404004A001E320405EE1 +:108EA00028014C5780234074A000E2E9400E2800BE +:108EB0004067800040037C0892E1FFC792C18007B1 +:108EC000802680478066F48149002888F401E28189 +:108ED000E9094C124005B43FE220E90481078146CC +:108EE000D5DC81278386D5D9E602E8DE8008802A92 +:108EF000FCC1A640922696465A180109A6809245C2 +:108F00009686CA043C1FFFE9DD9EA640922696463F +:108F10005A180109A600920596065A08010484020F +:108F2000D50284003C0FFFE9DD9EFC4DB61F840096 +:108F3000F084F08680E1FA01FA338142F185F0870E +:108F40003C1C021EB0083C2C021F80C349FFEEFCF3 +:108F50008401802A49FFEF16440291DC4C60000D29 +:108F60004402915C4C60000E440290DC4C600011A5 +:108F7000508F8014D50FB003810051CF8018D505D4 +:108F8000B003810051CF801C44900055D507508F0D +:108F90008010B003838044900032FA1D49FFEEFF39 +:108FA000549480FF848080048420F48149FFEF047E +:108FB000F4018029800449FFEF27F4018C815A488D +:108FC00008F48400F083FA82F003E20AE80EB4A801 +:108FD000B43CB45F4212907338110501B088381167 +:108FE00001098C01F083D5F1840049FFEEDC49FFD3 +:108FF000EEB8840149FFEED749FFEEB3840349FF81 +:10900000EED249FFEEAE49FFEEC6AE308400A67048 +:10901000E201E819A07938508101D013A07D948233 +:10902000956A98CA8825A6DAA70AE264E802AECA59 +:10903000A0FD884388A3A653A6ABE241E802AE6B2D +:109040008C01D5E65035000184A0926150230025A3 +:109050008085D32FA630E2A0E828A039380015017A +:109060004C02C02450F38014B50F942A89009875DF +:1090700000940003008400028D218B28109080252D +:10908000B52F89200094800210908037B52F880971 +:10909000A60310008049A03B381015015002802C17 +:1090A00094018806AC42D502AF108CA18C41D5D278 +:1090B0008CC184A0843F4C550010B40738001500C3 +:1090C0005A08FF04AE70D505A0B938010101AE30D1 +:1090D0008CA18CC1D5F1FCCDFC01FA54443291DC59 +:1090E000B61FF18149FFFF23B41FF101FA54443246 +:1090F000915C49FFFF1CB41FF101FA42443290DC3D +:1091000049FFFF15B41FF101FA424432905C49FF58 +:10911000FF0EFC81FC4683C0F384F485C9074060E0 +:1091200088068401C20984FFD508C20484C3841F51 +:10913000D5FB84C2841F84E1FA62FED4F383886184 +:1091400094D9887EF386223180005EF1802E4EF322 +:1091500000E996D0F38796C8F388F407F30488648F +:10916000A6D9F389F409F3048864F4082031802532 +:10917000F381F3058864A6D9F38AF40AF3058864B9 +:1091800020318025F38238329800C3048464383259 +:109190009808F301429388245EF18024E903F301E7 +:1091A0008E614243882489238C81FA7442A21C2454 +:1091B00043C38C248101FA6242850C73806894D980 +:1091C000850040AF0C008068E124E90938F52011E2 +:1091D0004EF70003886F8C81891CD5F7CB02846120 +:1091E000F40242A00424E492E903F4028E8189444B +:1091F0004290042495018D21F48BF4034244807342 +:1092000095218780408F1000809CE149E90C38F45B +:1092100070114EF70003888F04FF800B8D2141CE23 +:109220003C00D5F4CC0284818847FB4242A128242B +:1092300040808000402520003CFDFFE939CF091126 +:10924000844AE91DF109FED45010802CF20494499F +:10925000884140319076A512F203441000508848AE +:109260004490005AFF0C429E242444100064404263 +:109270000496382F091140948536D51BFF14F20A45 +:1092800040320C765041002CF20595218844882A02 +:10929000A51244200050FF14382F05114410005A25 +:1092A00044900064421E0424404224964090A53617 +:1092B000F10622F08000E08FE840F101E423E804A9 +:1092C000F102E423E93AE122E838E4753832980003 +:1092D000E8035A380433F102F2088E214220047365 +:1092E0009652F201F4078E4142438873852496A278 +:1092F00038929808992ECB03AEA4D51020320004E2 +:1093000042F38824FFDCE0EFE802AEA4202200084C +:1093100042F00424FE14E00FE81010120008D50DEE +:109320005EF1802438029800E804C0078E01D5035E +:10933000C004840438029808FCC6FC44F185F48615 +:10934000F587843FC802842143E08024424F0424EF +:10935000B69F8A80952195C1F48484C0F406384272 +:1093600018005A48014FF4058886A7215A40FF3655 +:10937000B52338449C005A40FF3105C1800104A147 +:109380008005385E1101976FC805952A888AA72144 +:10939000D50338451600FF0CF481F404815E8887FC +:1093A0008889F48385208080048F8001E10AE91692 +:1093B000B51F8909148F8002048F8003388425002B +:1093C00038FE210154F7803F4CF2C0055A80FF035C +:1093D000F4028D418921D5E98080205100244290FA +:1093E0009024FF4CE125E809A750E6A3E9038EA1EC +:1093F000AF50A750E6A3E811104100248484D50C97 +:10940000F4071001002438F21C115EF78024E805EF +:10941000A710C4038E81AF108CC18C41507380247F +:109420005A68249EFCC4FC42F281C505B1C1B183D7 +:10943000FAA2D504B1C3B181FAB4C00450A07FFF31 +:10944000D50281409EAAE241E8038EA1D5029D4942 +:1094500044200032FF1444200064F0834042089707 +:10946000852045C00012F203E222E91204F38000D5 +:10947000B5064287F07338F1A111E28FE9054C205F +:1094800000054C2080038D2A8C41F283D5EDF083BA +:1094900004F38000B446FB024227A07338218911EF +:1094A0004E270004E282E80284404C008011F183E0 +:1094B00005C38000B50644F00012428E3C7338812B +:1094C000A1114E870005E288E902884814AF8003A5 +:1094D0004CA0000DB507B406FB42420428733801C6 +:1094E0008111E408E9038E078840F583D10CB4A705 +:1094F000B406FA224202847338018111E408E903B8 +:109500008E078840842AFE8C400110178809FCC20F +:109510004420010842008873842110100086A04274 +:10952000A845DD9EFC029703F182964B9A61F28179 +:1095300090104E140003FE4A023F80059741222FEF +:1095400080039AEB9A8296DB84028843402100567E +:109550005EF20200964B9613E805FE2440000416C6 +:10956000D50652420438FF044002041696039A2896 +:1095700097435EF289018005E903440009009643A0 +:109580004E14000384009603FC82FC403C5DFB2DDE +:109590004460003C02428012424198734432000011 +:1095A000FF1F3C4FFB2AC96DA7240252801497204D +:1095B000FEEF4450005842321473CA3780A2812211 +:1095C0008541956940801400892384A09728401222 +:1095D000040954720001944A8827386415014072C6 +:1095E0000C093864840897C64012100954630100BE +:1095F0005073804C944A88E192C8971788E95A685A +:1096000001074043100CA7B8FF37D5064045100CA2 +:10961000A678FF23FF0E8CA1AF385A5825D9852292 +:109620005A20014A8441D5CE804180C1949199C28B +:1096300088C3844097504092900940428C094094DE +:109640008808892697068889549280070042004C32 +:109650004042240E4092840940948808974688A985 +:1096600097063853140040422008888538438909FA +:109670008C415A2825E184C25A10011E8421D5D775 +:10968000A6A60252801644100060FF5F4251047388 +:109690008C0298E9A269542083FF12207FFF4020AA +:1096A000A8099234542103FF541083FFAC80AC41CD +:1096B0008C06DBF1FCC0FC40EE88B0028420442024 +:1096C00000B0B1EE490024DC8420442000C08007B3 +:1096D000490024D63C0DFB40441298C449FFF59D37 +:1096E0002E0028A54490003C8C019600F08184C196 +:1096F00044A20000F001E2C0E853B002842084419B +:10970000806649FFFF44842180078066804149FFCD +:10971000FF3E3C0DFB2D3C5C0254023000128400E5 +:1097200088694031A8043C3FFB2A80808C819721C6 +:109730005A40253202218014021180154083800096 +:1097400039E3800196499691B63F02F400245BE329 +:10975000FF1054210FFF9041885EB042969141E086 +:1097600080009491884523EF002613E10000022435 +:1097700000245A23FF0FB43FB08254108FFF902172 +:10978000882F964988409449882522210001AC8879 +:109790008C02D5CD8CC197B05094803CD5ACED787F +:1097A000FCC03C1DFB2AC80402008014D503020043 +:1097B00080159601DD9E3C5DFB2D3C1C01E7D10927 +:1097C000021280124420003C421008738001DD9E8A +:1097D00002028012500002D0DD9E3C2DFB2D443051 +:1097E000003C0211001242100C7380014412000070 +:1097F000FE0F3C0FFB2AB420922796465A1801040C +:10980000B400D503B40292039637DD9E2E3029288A +:109810005A30010448000099FC4081003C0DFB8354 +:109820008122A6015A0009045A0804223C000401BE +:109830003C6014B1E22040103C1B99CEE22697F91F +:10984000E8049A719789D50284C0840C49FFFFC748 +:1098500004A400022FC029754015003740A08013D2 +:1098600004140003400080179601D54C3C0004000E +:109870002E27EBFDE22040103C1BC2052E07FF08FF +:109880005A0801053C6014B0D5033C6014B999CE68 +:10989000E22697F9E8048AC197B1D50284C02E0761 +:1098A000EBE7C81EC2052E17FF085A18010B3C60D3 +:1098B00014B0507300645CF3006597F9E90ED509A4 +:1098C0003C6014B9507300645CF3006597F9E907D4 +:1098D00050637F9C97B1D50484C0D50280C08401B9 +:1098E0002FC0297449FFFF7BB5484005001740A0F1 +:1098F0000013840149FFFF73041400014000801726 +:1099000096015CF384018027E90344100400964922 +:10991000E22AE805000480008C01D504E206E9FB98 +:109920008400100480000004800040FE00068401D2 +:10993000E80A8400100480002E00042C8C013E00F4 +:10994000042C8402FCC08401DD9E3C1C01E73C5DCC +:10995000FB2DD1062E1028A68A019600DD9E840CD0 +:10996000DD9E2E100CAAE622E90440008006DD9E52 +:109970002E100CBA8440FE0D40010006DD9E3C2DE9 +:10998000FB2A0411000E92219646C102C00904115F +:10999000000E9646C1078E015C000001DD9E840129 +:1099A000DD9E8001DD9E3C1DFB2AC804020080165E +:1099B000D503020080179601DD9EFC00A6903C4076 +:1099C00014A1C2028441A882A082A00396863C5DB5 +:1099D000FB6496D99606CA12C833A6A88844884361 +:1099E000AC882E20287AE202E83CA6A8A189884407 +:1099F0008843382301098C01D5F5C012A62A84407A +:109A000088048803AC082E00287AE240E82AA62AB7 +:109A1000A18988048803380309098C41D5F5A6A9D2 +:109A200088448843AC882E20287AE202E81AA6A946 +:109A3000A18988448843382301098C01D5F5A62BD8 +:109A400088048803AC0880022E20287AE202E80904 +:109A5000A6ABA18988448843382301098C01D5F538 +:109A6000FC80FC4680C181008400AC0812008009A3 +:109A700012008008AC0FAC0EAC0BAC0AAC09441061 +:109A800003E8AC7485204410FFFFAC358068B72232 +:109A9000A8511293000AA8553C1DFB231491000401 +:109AA000A85E3C1DFB2BA09DA8593C1DFB2E3E072C +:109AB000EBE6A85BA05A3C3DFB623E07EC17B408FE +:109AC0000031800CF482814949FFE456B73F149F6E +:109AD000800104140005400484088801A5C02E07F5 +:109AE000EBFD97FB5A080306800749FFD58B80E002 +:109AF0008420808944207FFF80A180615002001271 +:109B000004F4000596019401880F2EF7EBFDA400E4 +:109B100096035AF8030EF387F486F285F184F583F1 +:109B200049FFD570F307F406F205F104F50350F28E +:109B30007FFA5CF78006E920E0E24023BC1B9693A5 +:109B40005A30232440F380014EF4000452F7800081 +:109B500041E78013E4FFE9075CFF0010E8169DE988 +:109B60009779D5135EF3FFE2E8105CFF0010E80D73 +:109B70008C219649D50A8CF497F95CF38029E90584 +:109B8000F7018CE197F8F7818C6196D88C925A3066 +:109B9000240480E0D5B45CF28021E805E450E907B4 +:109BA000E6B0E905B41F8C019601B61F5CF0802178 +:109BB000E8065EF17FF1E807E630E90550050001AF +:109BC00040A000138D215A981286FA1D80208441EE +:109BD00080E849FFE2888400842149FFE279A03DC2 +:109BE000B0C98020844449FFE2AE020F8012844154 +:109BF000AC30020F8013AC31F00222000000802054 +:109C000049FFE2718400842149FFE262A03D84445F +:109C10008020B0C949FFE297020F8012B43FAC32F6 +:109C2000020F8013AC33020F8014AC35220F801565 +:109C3000AC34C9034EA2000684213E17EBE5D503E0 +:109C40003EA7EBE55EF00065E90484013E07EBE525 +:109C5000F0015A08081684033E07EC1A2E07EC148C +:109C600084218C019600E6053E17EC173E07EC14A4 +:109C7000E90A000F80043E1004313E07EC1A84000C +:109C80003E07EC142E07EBB95A08010C221300050D +:109C900044021924AC402213000A44021926AC40A5 +:109CA000FCC6FC4A84803C87F6233DC7F6223CACC8 +:109CB00000B580C0806480A4509F800451E0FFFF05 +:109CC000D13CCD0C22200000227000018A474E2496 +:109CD0000003FE9212248000D51D222300004C5F59 +:109CE000400922737FFF8A474E240013FE92D5104D +:109CF000227300019BD74E740003FFFA22F37FFF0B +:109D00008A4F4E240003FE92E0474023BC1B3824B8 +:109D100095092A230001E102E90EE05CE90C3874A0 +:109D2000951100F5000240F79C07E90588628C81D7 +:109D300096DB97238CA1D5C500050004E0048400C0 +:109D4000E80440319076961BFCCAFC4B84C0F0813D +:109D500081218102FAE251CF800C81468420800665 +:109D600042009C73F20194018802A400380E050998 +:109D70008C215A1824F6801C49FFFF952E1029408B +:109D800094F14000040C886897434012840EAC584C +:109D9000842098CE96D994D98869A518E085E906DB +:109DA000A5188A809721AD18D50312A180008C32A6 +:109DB00096495A1A88F08CC15A6812D2FCCBFC0022 +:109DC0002E07EBE55A0001142E0004345A0001104E +:109DD0002E07EBE7C8062E00291484C25A0001039F +:109DE00084C149FFE425C80484C3D50284C83C2C3F +:109DF00000B5A616AE12A6919E51FE448402400004 +:109E000080168E01FE3496033C0BF6233E27EBA210 +:109E1000FE038C413C0BF6223E27EBA3FC80FC02A8 +:109E2000F081F282F38349FFFFCCF002F101F203EB +:109E300049FFFF8DFC82381185118801E004E90E8D +:109E40005CF28024E80E9E2DE6074402A77CE8021F +:109E50008CB238001511E004E80444008000DD9E57 +:109E60008400DD9E001000A284413E1002FA001022 +:109E700000A1102000B63E1002F9001000AC3E1008 +:109E800002F80010009C3E1002F70010009A3E10ED +:109E900002F68420101000A2101000A1101000ACD7 +:109EA0001010009C1010009A3C0C00BF10100051C4 +:109EB000DD9E2E1002F150200401101004382E10E7 +:109EC00002F044429260101004362E1002EF10107F +:109ED00004372E1002EE101004352E1002ED101073 +:109EE00004602E1002EC101004612E1002EB101012 +:109EF00004622E1002EA101004632E1002E9101002 +:109F000000A52E1002E8101000AB2E1002E7101072 +:109F1000009A8420383204008C21183100015A182C +:109F20000AFB8420101000B73C0C00BF1010005139 +:109F3000DD9EFC2084003C0FFB784463F04A4470B3 +:109F400000553C0DFB92A600C805AFF0490011B7C3 +:109F5000D5F949FFF12A3C1C00BFC804440FFFA0FB +:109F6000D503440FFFA1100080513C0DFB83A601D7 +:109F70005A08040584013E07EBF684003C0FFB7889 +:109F80004423F04A443000553C0C00BF00100051FF +:109F90005A10BB04AED0D5F9842010100051FCA09B +:109FA0005A0801093C0C00BF842010100051840A9B +:109FB000DD9E8401DD9E00008E01E604E81244F07F +:109FC0009ECC3807800040F03C00DD0F04080C10E8 +:109FD0008400D5068401D5048402D5028403B60129 +:109FE000DD9E9200FC419EC1E66E4EF200C68001ED +:109FF00044F09F0038378D0140F1BC004A003C001E +:10A000001C0022002800A800C800CE007601D40061 +:10A01000E40004010801760176010C018406480081 +:10A0200000AD8407480000AA84003C0FFB7844730D +:10A03000F04A4490005549FFE24680C05A000207AA +:10A04000109380004900113BD5F7840149FFE24E8F +:10A0500049FFE20E3C0E027549FFE2143C0E027607 +:10A0600049FFE2213E0009DD49FFE2293E0009DC0B +:10A0700049FFE21F3E0009DE4402995C49FFE23BD2 +:10A08000800649FFE23384003C0FFB784463F04ACA +:10A090004470005549FFE217C005AFF04900110FA9 +:10A0A000D5FA49FFE223D568842EAE418426AE401E +:10A0B000842149FFF26B8420840280418461808185 +:10A0C00080A149FFF020D5588401AE10D51A840133 +:10A0D000AE10D50784C1AF9049FFCE8C3E67FF0814 +:10A0E000840ED54B8401AE1044124E00440148004A +:10A0F00044201400490011A7440002EE49FFEA1170 +:10A10000840DD53BFA00D539FA01D53744021C51EC +:10A11000A640A7C1A640A68192E440212008FE8F58 +:10A1200097CF842154210FFF800749FFD29680C02A +:10A13000B0418007502F800649FFD2CB44021C5506 +:10A14000967092C8A68097B1AE40A641AF81021F1B +:10A15000800244021C579688A6C09228AE80A68131 +:10A16000AE41021F800344021C599688A6C0922863 +:10A17000AE80A681AE418401FCC192003C1C00BFB0 +:10A1800010008060DD9E3C0C00BF00000060DD9E82 +:10A190003C1C00BF10008061DD9EFC005A080604D4 +:10A1A0008401D5045A08070684003E07EBBBD51C82 +:10A1B0005A080D0784003E07EBBB8421D5075A08D7 +:10A1C0000E0B84013E07EBBB84203E17EBE93E07F4 +:10A1D000EBE2D50A5A0810048401D5045A08110587 +:10A1E00084003E07EBB9FC80FC003C0C00BF441F20 +:10A1F000FFAA101000513C0C00BF000000515A088B +:10A20000AA07440000FA49FFE98CD5F65A00DD049C +:10A210008401D5028403FC805A080307FC008001F6 +:10A2200049FFFE22FC805A08041E2E0002FA10008C +:10A2300080A22E0002F9100080A12E0002F810006A +:10A2400080AC2E0002F71000809C2E0002F6100059 +:10A25000809A8400100080B63C1C00BF1000805122 +:10A26000DD9EDD9E5A08051D0000812C84423E00C3 +:10A2700002F50000812D3E0002F40000809A3E00AD +:10A2800002F30000809E3E0002F284001000809ADB +:10A290001000809E1000812C1000812DD5335A08AB +:10A2A00006162E0002F31000809A2E0002F5100010 +:10A2B000812C2E0002F41000812D2E0002F21000DD +:10A2C000809E84001000812ED51F5A0807220000AE +:10A2D000812C84413E0002F50000812D3E0002F4F5 +:10A2E0000000809A3E0002F30000809E3E0002F2D1 +:10A2F00084001000809A1000809E1000812C1000B5 +:10A30000812D1020812E3C1C00BF10008051DD9E4D +:10A310005A08016100008438505084013E0002F167 +:10A320000000843680453E0002F00000843744324D +:10A3300092603E0002EF000084353E0002EE000015 +:10A3400084603E0002ED000084613E0002EC0000EB +:10A3500084623E0002EB000084633E0002EA0000DB +:10A3600080A53E0002E9000080AB3E0002E800004C +:10A37000809A3E0002E784000841000138418008CD +:10A380008C015A080AFB8440846110208435102017 +:10A3900084601020846110208462102080A5102029 +:10A3A00080AB1020809A1030843810308436103002 +:10A3B0008437103084635020840B18028001DAFE49 +:10A3C0008401100080B73C0C00BF842010100051A5 +:10A3D000DD9E5A0802FFFC00800149FFFD6CFC80F5 +:10A3E0009EC1E664E823FC01F281800144F0A2FCF6 +:10A3F00038378C0040F1BC004A003C00040C1C249F +:10A40000A44858108002D504A488843DFE56AC4070 +:10A41000F10149FFF2CFD509A44858108001D504B5 +:10A42000A488843EFE56AC40FC81DD9EFC009EC1AB +:10A43000E66CE85F80818004802244F0A3483837CE +:10A440008C0040F1BC00DD0F0C14222A3242A8A877 +:10A45000A84C6688A69058210002D504A6905421E5 +:10A4600000FDAE8849FFF2A6D544A61058000001B1 +:10A47000D510A610540000FED50CA61058000004FC +:10A48000AE1084013E07EDCAD534A610540000FB7F +:10A49000AE08D52FA6D0442FFFBFFED6AEC8A6C8A3 +:10A4A00058318020AEC8A460FE8EACA0D51EA69008 +:10A4B00058210040AE88A6C8442FFFDFFED6AEC8A4 +:10A4C000A46058108040AC60A460FE8EACA0D51192 +:10A4D000A69058210040AE88A68858210020AE885A +:10A4E000A46058108040AC60A44058108020AC405C +:10A4F000FC8092005A08071C8E21E624E87444F080 +:10A50000A40C3817840040F0BC00DD0F040C121AB4 +:10A51000A41058000002D566A450841DD552A41082 +:10A5200058000001D55FA450841ED54B5A08082856 +:10A530008E21E626E85844F0A4443817840040F001 +:10A54000BC00DD0F060E161E262EA61858000002AF +:10A55000D514A618540000FDD510A6185800000107 +:10A56000D50CA618540000FED508A6185800000403 +:10A57000D504A618540000FBAE18DD9E5A080B3413 +:10A580005A100B125A100C205A180A2EA658440FB3 +:10A59000FFBFFE46AE58A65858108020AE58A450B3 +:10A5A000FE0ED51CA61858000040AE18A658440F41 +:10A5B000FFDFFE46AE58A45058108040AC50A45067 +:10A5C000FE0ED510A61858000040AE18A618580068 +:10A5D0000020AE18A41058000040AC10A410580081 +:10A5E0000020AC10DD9E92003C1C00BF000080509B +:10A5F00050007FDFE602E904840010008050DD9EF9 +:10A600003C4C00BF840044329BBC94413821810102 +:10A610008824102080A8382181118C0190481020B6 +:10A6200080A95A081EF4DD9EFC42F28244221C508E +:10A63000F081F383812144121C51A610A790A7C872 +:10A640009204979F97F85A0801249E71E622E90F19 +:10A650005A6003045A68051D3C1C00BF001080604E +:10A660005A10A1062E1004285A10011344027B37F9 +:10A6700044127BE249FFEF2B44027B5544127B5C82 +:10A6800049FFEEDCFD03F20149FFD834D5139E47A4 +:10A69000E622E9035A080B0F8026F202F30349FF72 +:10A6A000FF2B8401100480003C0C00BF842010109C +:10A6B0000050FCC2FC4080C18420AE40A410812226 +:10A6C0009201960680E381445A08010AA43080234F +:10A6D00058000002AC30800649FFF16C0204800093 +:10A6E00092019606C809A470841DFE0EAC30802726 +:10A6F000800649FFF15F0204800096065A080106B1 +:10A70000A43058000001AC30020480009606C80551 +:10A71000A470841EFE0EAC300204800092079606E0 +:10A720005A080108A47058108080AC703E07EDCA2A +:10A730000204800092079606C806A470440FFF7FAB +:10A74000FE0EAC3000050000920196065A08010A80 +:10A75000A638802758000002AE38800649FFF12A4B +:10A760000005000092019606C809A638802754000B +:10A7700000FDAE38800649FFF11D00050000960679 +:10A780005A080106A63858000001AE38000500003E +:10A790009606C805A638540000FEAE380005000035 +:10A7A000920296065A080108A67858108004AE78DE +:10A7B0003E07EDCA0005000092029606C805A638BD +:10A7C000540000FBAE380005000092059606C8054F +:10A7D000A638540000DFAE3800050000920596064A +:10A7E0005A080106A63858000020AE3800050000BF +:10A7F00092069606C805A638540000BFAE3800057C +:10A800000000920696065A080106A6385800004035 +:10A81000AE380204800092059606C806A470440F64 +:10A82000FFDFFE0EAC3002048000920596065A0847 +:10A830000106A43058000020AC30020480009206CB +:10A840009606C806A470440FFFBFFE0EAC3002048B +:10A850008000920696065A080106A430580000406F +:10A86000AC30FCC0FC0080C049FFFC995A68091953 +:10A870002E07EB895A08014B49FFF71F49FFFB5B85 +:10A8800084003E07EB893E07EB7C49FFDED1802048 +:10A890008403C1038404842049FFEBE9D5375A6857 +:10A8A000030649FFCAA18006D5325A680E0C2E074E +:10A8B000FF085A08012C3C0DFB83A6015A08030A25 +:10A8C000D5065A600DFA5A6002F8D5208402D51FC9 +:10A8D000840049FFE19E3C0DFB83A7815A680A0B67 +:10A8E0008429AE41842049FFEE513C0DFB83AF81AA +:10A8F000D504842049FFEE4A49FFDE9A5A0802E84F +:10A900003C1DFB838443AE89D5028401FC8000009A +:10A91000FC00800180C149FFFB4596005A6802593E +:10A920003C6C00BF001300528E21E627E85144F032 +:10A93000A83C3817840040F0BC00DD0F08141E2826 +:10A940003A4E7A0084014412B80049FFFCE3D51066 +:10A950004402B80049FFFAAFD50B4402B80049FFE2 +:10A96000FA83D50684044412B80049FFFC578400DA +:10A9700010030052D52F84054412B80049FFFC741F +:10A980008400100300528402D5202E0002F33E0002 +:10A9900029122E0002F53E0029A42E0002F43E00EA +:10A9A00029A52E0002F23E00291684001003005152 +:10A9B00010030052D50A84074412B80049FFFC5422 +:10A9C00084001003005284013E0029A6D5035A08D2 +:10A9D0000A0C49FFFC0B3C2DFB9284219600AE50E3 +:10A9E0003C2DFB77AE50FC80FC43008080013CFC9A +:10A9F00000BF5A88041484C03E67EBF62E67EB9DB7 +:10AA00005A60010D00678050546300F05A601007CF +:10AA1000440000553E07EC08D5150067805081259D +:10AA2000F4848143B65F80E1F083CE0F800244124C +:10AA30007B5C49FFED3A440000553E07EC083E6759 +:10AA4000EBF284014800017A5A80010949FFDDF0E8 +:10AA50005A080205840149FFE0EBB41F44127B5CF5 +:10AA600049FFECEC3C1C00BF84003E07EC0A006090 +:10AA7000805040031009F08200008051979FF081C0 +:10AA800084003C0FFBAAA6795A180421840149FFCF +:10AA9000E0AF2E07EBB35A08010449FFD55A8007EF +:10AAA000842049FFED73840149FFC7FB84003C0FFC +:10AAB000FB784483F04A49FFC7E7C83C440000558F +:10AAC0001004000049000BFBD5F7A6785A10010AC4 +:10AAD00084003C0FFB784483F04A44200055D51590 +:10AAE0003C0FFBB23C0FFB784483F04A3C0DFBB2B9 +:10AAF000C8F049FFDD9D5A0802ED440000551004DE +:10AB0000000049000BDCD5F33C0DFB92A640C908C0 +:10AB100010240000F28549000BD2F205D5F6A600FC +:10AB20005A0002093C0DFB77A6405A180204842003 +:10AB3000AE40F0028E01E60B4EF200FC44F0AA4C4F +:10AB40003807810140F03C004A003C0016004E00EE +:10AB50009E00B8004C0156016401A601E4017A018F +:10AB6000A60144027B3744127BE249FFECB0B41FDC +:10AB700044127B5C49FFEC998006F101804749FF54 +:10AB8000D5B93C0C00BF8420101000505A600F044F +:10AB9000480000D084CC480000B884013E07EC0A8D +:10ABA0005A6801092E07EBBBC813843F3C1E010500 +:10ABB000D5105A6802092E07EBBBC80D843F3C1E16 +:10ABC0000105D50A84015A68030A84C2D5088400A5 +:10ABD00084C4D505840084C5D50280C084213E1775 +:10ABE000EBF24E0200974800009084053E07EB7997 +:10ABF0008026840149FFFE8E80C084043E07EB79E5 +:10AC0000480000832E07EB7C84E13E77EC0A5A086B +:10AC100001044800009184023E77EB7C3E07EB790B +:10AC200049FFE85A5A6801063E67EB8948000084EC +:10AC30005A680B053E77EB91D5215A68031A3C2CD4 +:10AC400000BF0001005500310054400020080011F1 +:10AC50000052880344310000FEC7000100518046C5 +:10AC60003E17EB823C3FFB5C49001C3CD5055A601B +:10AC700005E85A600AE65A68070549002498D55B3A +:10AC80005A68095A3C0C00BF000000523E07EB888E +:10AC900084013E07EB8DD5388006F10349FFF98E1C +:10ACA000D548FD0344227B9249FFF99E9780D52C1D +:10ACB0008006802A804949FFFB95F10402050000C7 +:10ACC00084CBAC08D5213C0C00BF84201010005070 +:10ACD00044027B3744127BE249FFEBF9B41F441274 +:10ACE0007B5C49FFEBE28006F101804749FFD339E5 +:10ACF000D5208006802A804949FFFB9AF10E000486 +:10AD0000800084CFAE083C0C00BF8420101000509F +:10AD10002E07EC0AC80C44027B3744127BE249FF41 +:10AD2000EBD6B41F44127B5C49FFEBBF8006D50510 +:10AD300084C1D5EA84C9D5EDFCC39200FC2380828E +:10AD40004420DFCCB18380A280E681E33A228C04E8 +:10AD50003A238C24A4E84420DFD8ACF83A21080038 +:10AD6000B1C13A2388202E265054102F8008C134B8 +:10AD7000442295D85A1804058461383100083851A6 +:10AD80000000806184454232887338230C004021E2 +:10AD9000100E9686C21B5A48010538338400D50828 +:10ADA0005EF782BDE9045A480403C5168461445223 +:10ADB000928C38228000E243E8058C4138228008DA +:10ADC000D509842038128008D5074432928C382166 +:10ADD00080088001D5028004FCA32210000C2220F0 +:10ADE00000079ACA222000062200000B9A8A884394 +:10ADF0009A088802DD9EFC423C4C00C080E084C082 +:10AE000000A2000F0042001080A6F4814045040813 +:10AE1000F4824647FFFF50420FFF88814272287339 +:10AE200095F98E218086F1838EE287868E01F1036B +:10AE30008825964A4E150021049F8001E029E81CD0 +:10AE4000987E83C34081040043E2F07384204090E5 +:10AE50000400409480104E95000DE12AE80A38F471 +:10AE60000511389F05014297A4244E970003888955 +:10AE70008C215A1803EEF1028CA188C15A5803D9CB +:10AE800044000084400200169603FCC280608040AB +:10AE900084019A50E622E90B9850922142F08424D2 +:10AEA000E26F4000BC1A4020BC1BD5F4DD9EFC20A4 +:10AEB000848080A4806484E14063900CFF96C60582 +:10AEC000386011118CA188668C815A4819F75A1084 +:10AED000021AC91A403194773C3FFB6680C184E175 +:10AEE0004043840CFF16C406384005118A83426231 +:10AEF00010738C215A1819F64003141749FFFFC824 +:10AF0000D5048003D502841FFCA0FC42F2834620B6 +:10AF10001F8D84205021063F810080C349FFFFC957 +:10AF2000812084208008442739C03CADFB6649FF5E +:10AF3000FFC044129CB48041F082440001084223C7 +:10AF400000733C0C022004210009F1812274000CE2 +:10AF5000385009008008B6BF49FFFF41F1012E8734 +:10AF6000EBC58041B4BFF4034E8300053C13F624C7 +:10AF7000D503441000462FE7EC19503F7FFEE663EF +:10AF8000E8102E37EBE6CB0D50140001E03EE80749 +:10AF9000843B421F042450108050D50344100046C7 +:10AFA000C4083C33F6248423FE5C846540108C3650 +:10AFB0004430010842230C730221000FB65F844025 +:10AFC0003E27EBA4442295D838211800F2815A2854 +:10AFD00001594422965838211A025CF100C8E8044D +:10AFE000E62BE9028E2A2E37EC012E27EC0D4C21A0 +:10AFF000C0402E300433CB3C5A28013B443001087A +:10B0000044229CB442230C730431000E5CF180C8CE +:10B01000E82F22F100055EF7889CE82AA4948E5A56 +:10B020005CF10404E8258446CC02844D44429694A5 +:10B03000FA6438421901FEFCFEA4E26244229CB488 +:10B0400044300108E81942230C73003100F8848170 +:10B050003E47EBA4CB04104100F8D515E666E91392 +:10B060008460103100F83E37EBA48462D50D443083 +:10B07000010844229CB442230C738460103100F810 +:10B080008460D5028461442296B438211901E655C2 +:10B09000E8045CFF0002E93D2E47EBE6CC3444F0C7 +:10B0A000010844429CB442433C73004200505A4859 +:10B0B00001153C4005A69521E0A4E8074E82000654 +:10B0C000400390098840D51D5CF382D1E8094241D4 +:10B0D0001C24448002D0D50A5CF383B7E903949121 +:10B0E000D50842411C24448003B64042209788443E +:10B0F000FB0940002017E202E8038A40D5028440A1 +:10B100008822D507E655E8CC5CFF00024EF2009499 +:10B11000F0029401E209E9055CF28029E804D50B0C +:10B12000E6B5E907FA04405280B74010940DD510F7 +:10B130009221D50E2E07EBE6C80B3C0005A85CF06B +:10B140000097B41FE9039208D502920A88204400B0 +:10B15000006442048024400004175CF00100E9030D +:10B16000440000FF44229CB44440010880A24253A2 +:10B17000107350428100A764E2A0E802AE245CF3A1 +:10B1800087D1E81A4400010880824243007380049A +:10B19000004200505A48040E0400000E5CF007D133 +:10B1A000E80B440293E838001800E604E902FA24A8 +:10B1B000E3218401E952F101440296585A18010D25 +:10B1C00038101A02848780AA425204738025922381 +:10B1D00038101A0AD50C4412963838A01A0A963933 +:10B1E00038009909441296943800990944000108DE +:10B1F00042230073000100505A0004048404D52D3A +:10B20000441295E838A09909CB0A44129638442292 +:10B2100096943830990138311909D50A5A3802F014 +:10B220004412969497F938709909441296383870F8 +:10B230009909D5135A40010448FFFF6C5CF38190D3 +:10B240004EF2FF685CF000E74EF3FF64944B840A13 +:10B250004010803748FFFF5EFCC2FC53F0883C0C76 +:10B2600000C0F189F28C0010003200000033F1823E +:10B27000F08384003E07EBB63E07EBA63C0005A634 +:10B280005CF00031E903FA06D503520000463C0B9E +:10B29000F6242E07EBE62E17EC0D5A080109E622DC +:10B2A000E9063C03F6248E0A3C0BF624E625E90465 +:10B2B00084003C0BF624F00284E09201F08AF00353 +:10B2C00044A296B49201F08BF009506000E93C0C66 +:10B2D00000C0F08600000009E2E04EF2015E50037B +:10B2E0007F17B400F0818E01E6034EF20116500381 +:10B2F0007F1B85002250000050037F1D148F8004A7 +:10B3000022900000F002403280B6961BF087F003D6 +:10B31000976840148016F18DF10A960088A1F10B10 +:10B320008801FE02F085F005FEAA42400024B01418 +:10B3300088088420F08E800442010873F393F19210 +:10B34000F591F490F28F49FFFDA396015CF0008423 +:10B35000F20FF410F511F112F313E8055200008416 +:10B360009601D5028400049F800E38048509049F4D +:10B3700080048C21892080099601F084F0028840A5 +:10B380005A1803DBF105F0038D068820F1855A88F1 +:10B3900012CC840038051D099E1AF08EF00D852010 +:10B3A0008E0295798109F08F840AB0594214007396 +:10B3B000F00FF185880896038480F08DF00EF10D72 +:10B3C00088049603F208B0D4F591F49049FFFD1576 +:10B3D0008020F410F5114E0400038420F205960B32 +:10B3E0005EF0003338111109E907380514018C01AA +:10B3F00038051409D50289208C815A4805E18D0150 +:10B400005A8805D44400003240948137380514012D +:10B410008920F0073895140985214E07000AF006A7 +:10B42000A60250907FFFF007E00956978001221F87 +:10B43000803E44000084FE0CF104400004165013CA +:10B440007F6F9601AC0850137F71A488E240E80634 +:10B450003C2C03595CF100C8E904F2015A280303AB +:10B46000AC0896F8F00944129800F208F38149FFFD +:10B47000E1AAF10C8049F301B01949FFFD48804071 +:10B4800010037F6600137F678007223F803E49FFDD +:10B49000FC5750137F1710037F67B4215A18030716 +:10B4A0008420AE705A080122D5175A08040BA670E2 +:10B4B000C9058421AE70AE71D5188422AE70D51541 +:10B4C0005A080114A6705A1802048423D5045A1885 +:10B4D00003048420AE70441295D838109C005A188A +:10B4E000010510137FF4D50E842010137FF45A0841 +:10B4F00004082E07EBB68C013E07EBB6D5485A0878 +:10B500000147CF452E000650C8422E07EC058C019E +:10B510003E07EC05D53CF1018417FE0EC0035A1816 +:10B5200006258026442295D8840010037F661003E8 +:10B530007F671800FF3538011C084422960838013F +:10B540001C08442294F0840038011E0A44229618F4 +:10B5500038011D094422963838011D094422969469 +:10B5600038011D09AC08D513F0015A080411000375 +:10B570007F675A08010D4402928C38001C00C007F6 +:10B5800000037F665A08040410037F678CE1506350 +:10B59000010848FFFE9EFCD384A1C20284BFC909F2 +:10B5A000FA22FE0CFA2142010473B6038805D50E77 +:10B5B0004410027681E042F10473FA33425104737D +:10B5C000FA2214F1800042028473B604DD9EFC402E +:10B5D00044302710FE5CFA984657FFFF40208856FB +:10B5E000FB2450528FFF80C44470005080233830B9 +:10B5F000191138601D11FECC403198768A624E34A4 +:10B600000003FEDAE0654051BC1B9CE140923C1B0C +:10B610005A30790D5CF18051E9045262009FD502E5 +:10B6200080C3527200778083D5E38009FCC05CF050 +:10B630000051E905523000A0B661D502B6015010A4 +:10B640007FD85CF08051E905520000C8B602DD9E4B +:10B65000B622DD9EFC4484C0810583808141F28254 +:10B66000F38180E480A38126E2E5E9148005F110EE +:10B67000F202B0C4B105F58349FFFF90F004F50371 +:10B68000380E01118CA18920F005380E011188C0F7 +:10B69000D5ECF00180468AE0FFFB840542238073ED +:10B6A0004E26000384418029800A49FFFF92B42876 +:10B6B0005A10FF058C2188019201B608B046B08768 +:10B6C00049FFFFB7F00638150111F00738250111C1 +:10B6D0008402400080164204887340000416FCC4B3 +:10B6E000FC4580E13C1C00D4F2835060002800201F +:10B6F00080328400F2850020803344A2929CF2863E +:10B70000202080392010803AF287F188F08444802C +:10B7100000FF3C0C00D4F10400000009E2204EF2CE +:10B7200000D104137FF6841BFE0E4E0200B85A1897 +:10B730000604480000B4A0375A080204480000AFCD +:10B7400004937FFF40048808F089F109A03D880137 +:10B75000A6C0CB19A642E622E9029EC9A7035CF265 +:10B760000022E8038C81D502FA9384403C1C00D56A +:10B77000B65FF00380A649FFFF6FA07E3810A602D7 +:10B780008A20D522A6415A18112CA6C2E662E903E6 +:10B790008E61D5028460A7035CF20022E8038C81ED +:10B7A000D502FA933C1C00D58400B61F501080A22D +:10B7B0008441F00380A649FFFF4FA07EFA42381073 +:10B7C000A60242100873F205FE54042380083821B3 +:10B7D0002602880240008016F1078801D504B706CA +:10B7E00002037FEE12037FF2F109A03D8801A6C299 +:10B7F000CB1BA640E622E9029EC9A701E690E8031A +:10B800008C81D502FA813C1C00D58401B61F5010F2 +:10B810008144F00384409D7449FFFF1EA07F3810CF +:10B82000A6028A20D520A6435A18232AA6C0E6627B +:10B83000E9038E61D5028460A701E690E8038C815C +:10B84000D502FA813C1C00D58441B65F501081E6D8 +:10B85000F0039D7449FFFF00A07FFA543810A60240 +:10B8600042100873F206FE54042380083821260291 +:10B87000880240008016F1088801D5051483000174 +:10B8800002037FEF12037FF322037FF21205000011 +:10B8900022037FF312050001D50C220500001203DC +:10B8A0007FF222050001B70612037FF31483000123 +:10B8B000F0048D448C01F0845063010848FFFF2B95 +:10B8C000FCC5FC424462785CB61FF181440000A2D2 +:10B8D00080264211807380E28001F201B43F81230F +:10B8E00049FFFE77B042B08349FFFEA344000051F8 +:10B8F00042348024F002F103880388613823011167 +:10B9000038130D1184024001001642038473400075 +:10B9100008169603FCC2C10B402084094430006421 +:10B9200042200C7340110436960BDD9E8001DD9E93 +:10B93000FC5280C03C0C00D4B042509F801C008060 +:10B9400000024400DFE050AF80303A2014043A2077 +:10B950009424A400B1D1AC084400DFF480293A203B +:10B9600014043A209424A40051C3000CAC084400F1 +:10B97000E008802A3A2014043A209424A400FA54BF +:10B98000AC088420B01B4900137B4400E01C8027D6 +:10B990003A2014043A209424A400AC084400E03077 +:10B9A000B0563A2014043A209424A400AC08220390 +:10B9B0000000001F804449FFFFB0AC30A67D220389 +:10B9C000000549FFFFAAAC350013800C2203000CD0 +:10B9D00049FFFFA31203000C001380112203001182 +:10B9E00049FFFF9B221302761203001144000064FA +:10B9F000FE444420004E5010802740108836121319 +:10BA0000027622130287FE0C500000274000081621 +:10BA10005024000694911203028788468500401343 +:10BA2000A000220E0000A64EF28149FFFF761A0EFA +:10BA30000001F201B0164010200022010000A64EC5 +:10BA400049FFFF6BF2018D011A0100015A8806E9D6 +:10BA5000B01B8086842044500064B08238210400EA +:10BA60005A280A1C38348400382504002282000039 +:10BA7000FEECFEAC99DA4224082442340C24403116 +:10BA80009C7602F07FFF40711CF6A480886F88E2EC +:10BA900012307FFFADC0D5225A280B1B38348400EA +:10BAA0003825040022820000FEECFEAC99DA422424 +:10BAB000082442340C2440319C7602F0000040718E +:10BAC0001CF6A481886F88E2ACC0ADC1D5075A28A6 +:10BAD0000C06A480A4E08843AC808C218C028C826C +:10BAE0005A1812BD8400B05B381081013813010967 +:10BAF0008C015A0812FA507300305093003C2A23EC +:10BB00008001E45FE91422338010221380112203A4 +:10BB1000FFFE22438000882322338012880288237C +:10BB20008804846049FFFECF1203FFED4C74FFE9E7 +:10BB300022230005E45FE9152233000422130016D6 +:10BB40002203001722430029882322330028880279 +:10BB500088238804846149FFFEB6A4768801AC3648 +:10BB60002223000CE45FE9172233000D2213001F8B +:10BB70002203001E22430030882322330031880232 +:10BB800088238804846249FFFE9E0213000B88010B +:10BB90001203000BFCD2A0CD94128860A61BA6DA7B +:10BBA0008A03E41FE90484653E37EC182E37EC1550 +:10BBB0005A380108A04C38108900E622E804D5075D +:10BBC0005A300206E41FE8038400DD9E4400800032 +:10BBD000DD9EFC4051FFFD58F0822E00043480E1D0 +:10BBE0008102C805FAD545C00041D5054460004B27 +:10BBF00045C000822E07EBFD442000825A08032234 +:10BC00002E17EB6B2E000CC64460004BFE8CFF8C95 +:10BC100040210056406300D64091001196B3425433 +:10BC20008424FF8CF28144200064405280B640633B +:10BC300000D6FE5441C2801197B340A08156D5076B +:10BC40004400004BF081812244A0006484008020E5 +:10BC500049FFD23E8441B0C58007802849FFD27396 +:10BC60008400842149FFD2348027B0C580078441F5 +:10BC700049FFD2695054002450138024503404ECFE +:10BC8000A4A8505280249693AC880222FFFF501043 +:10BC9000802496931220FFFFDBF48403842149FF64 +:10BCA000D21780078442B0C5802749FFD24C804715 +:10BCB0008400FA62B10840F00C37C1035A1811072A +:10BCC000A450964B40FE0407D504A450964BE121A6 +:10BCD00038F200088C018C425A0A88EF80078027CE +:10BCE0008442B0C5F48349FFD22E84A0812580050B +:10BCF00045E29968F403987DF301A4889693E06285 +:10BD0000F20298D5E910FA4240F00857C2035A28C7 +:10BD1000110802F0800040F78011E0CFE90438F20A +:10BD20000000E805A4989693AC88D50B12F080002B +:10BD3000A458382F09018822964B4E1700038921F9 +:10BD40008CA2441005108C01D9D7F002802849FF3D +:10BD5000D2ED44000064400480164005000751FF06 +:10BD600082A8FCC0FC433C4C02222E97EBDF95419D +:10BD700098655024FFFEE644A6C9A6484EF20094FA +:10BD800044227D28382100005A2801044800008CF4 +:10BD90003DCC0221E6624022F000F282A4902E7097 +:10BDA000287A924140A100113C8C0253E910804353 +:10BDB00042209C7394918E4288489F9AA490E6708A +:10BDC00096934021280797B0E815D504446000FFFA +:10BDD000844081E342F09C7380EF8CE195F988E820 +:10BDE000A5F897FBE0EAE803582100028C6296D898 +:10BDF000D503443000FFE622F381E9089ECA5CF0D7 +:10BE0000802255E180FFE805D50283C18C22964847 +:10BE1000C24A3C3C021F97C1F383F7858460975860 +:10BE2000D8078C6197D8E2E98C82E9FAD53CF70310 +:10BE300038738D01F784F50497D9DFF4A761DE0329 +:10BE40005A20020804AF80014C557FED5A2801EBBF +:10BE5000A7E0E2FEE9E7E227E9E5F502387E0D0119 +:10BE600002A28000E347E8DE44527D2884E1387274 +:10BE70008C0804AF800384E0048F80050AF500017C +:10BE80004CF4400B028F800844527D2812857FFFBE +:10BE9000850138829C088CE154F380FF40F7A406AA +:10BEA000E9ECD5C0FCC3FC003C0C0253842050508C +:10BEB00000305040003C8041A4E896DBE475E9087E +:10BEC000A4E896DB5EF18046E8038C41969002324E +:10BED000801296DBE474E8038C2196488CA2DCED9A +:10BEE000E647E90BE627E90984213E17EC153E17E2 +:10BEF000EC17842A3E17EC1A2E17EC155A18011E5F +:10BF000050500022504000189401846050000022DC +:10BF10009A45A448968BA468964B9A514E140003F8 +:10BF2000FE4AE434E8038C6196D88EA2DCF25A38DB +:10BF3000050584023E07EC152E07EC125A08010590 +:10BF400084023E07EC152E07EC175A0801048405FD +:10BF5000D5052E07EC18C0048E013E07EC18FC80B6 +:10BF6000FC00842084003E07EBAD3C6C025A8061EB +:10BF7000804180019971A52897235EF200C8E903EA +:10BF80008C018C41A52897235EF27F39E8038C61F0 +:10BF90008C018C225A1890F05A3048045A284805CF +:10BFA00084213E17EBAD84203C3C02598041991915 +:10BFB000A5205CF20064E8068C419690E644E90214 +:10BFC00084008C225A1890F55C000003FC803C1C15 +:10BFD000022294018801A640A6018E02E60FE8081D +:10BFE0008E215CF08022E80484003E07EC12DD9E86 +:10BFF000FC403C3C02214090040894893841810176 +:10C00000383185013C7C0223E264954A3C4C021F96 +:10C010003C3C02209582E8273802010138020509DC +:10C020004001A40038118501A4808822AC40987E8C +:10C03000983DA6CAA682E2434021BC1AAE8AA6CB8E +:10C04000A683E2624021BC1AAE8BA6C8A680A601D8 +:10C05000E2434021BC1AAE88A689E24040013C1A66 +:10C06000AE09D52538120501884338120109381167 +:10C070008101A4108801AC10987E983DA6CAA682C2 +:10C08000E2434021BC1AAE82A6CBA683E2624021E5 +:10C09000BC1AAE83A6C8A680A649E2434021BC1ABA +:10C0A000AE80A681E2224020BC1AAE81FCC0503096 +:10C0B0000024441F80002A200001E02240113C1B84 +:10C0C0004C01FFFB5E00FFD8DD9EFC4DF292442048 +:10C0D000E044B118F3893A210C003A220C2046279B +:10C0E000FFFF878050210FFF813CF48EF295F2090B +:10C0F000A690E3224EF200DC04A080013825250141 +:10C10000F2814C24C0D2A0CD402488088843A6D315 +:10C11000A712F38FA6D0A691F390F291F20FE2440A +:10C120004EF300C39EA1F310B65FF211E2434EF34B +:10C1300000B9B4412FE0287AF2828043F50242220E +:10C140007873949199AAA77197564E5300A8A77037 +:10C15000F601385515014C5340A29982F68322838B +:10C1600000004E87009CC408B4FF80C34263F8738C +:10C1700038601901D50344607FFF126F802CC30C17 +:10C180002E60287A80E34272187380C7F71588C73B +:10C1900038601901D50344607FFF126F802D506F06 +:10C1A0007FFFE266E8048840A491D50344207FFF26 +:10C1B000122F802E2E20287B8E41E282E8089CA13F +:10C1C00080C34261787338201901D50344207FFF72 +:10C1D000122F802F844642740824F29396A8F2947A +:10C1E0009E9984CAF28B9CA1406398D6F28C9C994C +:10C1F000F68AF28D84C0F20EB15638211900382229 +:10C200008911F50AF284E045E846F50E94B18845B7 +:10C21000B156A69138228911F50AF285E045E83B2E +:10C220005A60020B5A60030B5A600104F20BD502EC +:10C23000F20DB4BFD505F20BD502F20DF50C42227A +:10C24000F873F502949188A2F586A76997569768C6 +:10C25000CD228840F713F2872221000042F11C24EE +:10C26000F28884EAF20440779CF6E047E814F2058D +:10C27000E047E811F206A7D0F21438751D004C23F0 +:10C28000C00BF208E048E903F203D502F207AD5013 +:10C290008781D5048CC15A6804B08C6148FFFF4780 +:10C2A0008C8148FFFF3D8D2148FFFF235BC80106BD +:10C2B000F309F21249FFA146FCCD3C0DFB78461074 +:10C2C00010008C01E2203C0FFB78E802D500DD9ED7 +:10C2D000FC0044027AE84422A7C484208A40490032 +:10C2E0000ECFFC80FC0084003C0FFBA93C0FFBAA96 +:10C2F0003C0FFBB63C0FFB973C0FFBB53C0FFBAE76 +:10C300003C0FFBB43C0FFBA73C0FFBA23C0FFB9682 +:10C310003C0FFBB93C0FFBA03C0FFBB13C0FFBAB50 +:10C320003C0FFBB73C0FFB993C0FFB9E3C0FFB9D6A +:10C330003C0FFB9B3C0FFBAC3C0FFBB33C0FFB9853 +:10C340003C0FFBA53C0FFBB83C0FFBA43C0FFBB024 +:10C350003C0FFBA83C0FFB9C3C0FFBA63C0FFBA338 +:10C360003C0FFBA13C0FFBAD64030003640304031B +:10C37000641224029646C103640300034400400093 +:10C3800064022403641200028419FE0E6402000396 +:10C390006400000864030402461617805010807C75 +:10C3A000FE0F6403040364020002580000016402EB +:10C3B0000003FC804403F04A44100055AE4044138F +:10C3C000F0EDA6085A08010A4423F0DAA61054003A +:10C3D00000F0AE108400AE08840464030403440338 +:10C3E000F0498425AE404403F04A44100053AE4067 +:10C3F000DD9EDD9EFC204443F1104473F04AB4649A +:10C4000092784031E008FE1F4433F114B604B403BF +:10C41000921840006008FE474403F10EB623AC803A +:10C420004403F10C8421AE4084203C1FFB7880C083 +:10C43000A630C00744000055AE3849FFFF40D5F98B +:10C44000FCA0FC204443F1108E41B4649691927894 +:10C450004031E008FE1F4433F114B604B4034473C2 +:10C46000F04A921840006008FE474403F10EB623DC +:10C47000AC804403F10C8421AE4084203C1FFB7847 +:10C4800080C0A630C00744000055AE3849FFFF17F2 +:10C49000D5F9FCA0FC204443F1144463F134B464A6 +:10C4A0004473F04A92784031E008FE1FB60444031A +:10C4B000F10EAC404403F1048421B6404403F13250 +:10C4C000AE4084003C0FFB78A630960EC8074400AF +:10C4D0000055AE3849FFFEF3D5F84413F134A608F1 +:10C4E0009606C8FEFCA0924284A0D20738301602FD +:10C4F0003830960A8CA1D5FADD9E3A6F9EBC840036 +:10C50000802049FFD40984006405E4034403F00E4D +:10C51000A4009626C00949FFD08B5A0802064400A1 +:10C52000006949FFD4CE4403F00EA440964EC90FD3 +:10C53000A4409656C90CA440965EC909A4409666CC +:10C54000C906A400540001004E0200D14403F00EBD +:10C55000A400960EC80949FFFEBD4403F00EA44096 +:10C56000965EC92CD52244021C5084C0AD803E6723 +:10C57000EBD349FFD171440218BCAF80440218BD0F +:10C58000AF80440218BEAF80440218BFAF8044029F +:10C5900018C0AF80440218C1AF80440218C2AF80F7 +:10C5A000440218C3AF80D5D8A4409656C907A4400A +:10C5B000964EC904A4009626C019446221EC460197 +:10C5C0003135B4A650000A5AFF46D01049FFD0308A +:10C5D0005A08020D460A5A5A500005A54413F06342 +:10C5E000B606A608540000FEAE0844121C60446261 +:10C5F0001C788400AC0844200100AC3044124C701C +:10C6000084003C0FFBAF3C0FFB9A3C0FFBB249FF91 +:10C61000FF1A440002EE49FFD78444224C70503187 +:10C6200000F0A0193C2FFB7D9E44A09BB4039649CB +:10C6300049FFFF3244027C0044124E0044201400A3 +:10C640003C0FFB8C4401480049FFFEFD440002EE14 +:10C6500049FFD7673C2DFB7D040100100211002229 +:10C660000421001349FFFF184412B80044200800B9 +:10C670004401A00049FFFEE7440002EE49FFD75104 +:10C680003C2DFB7D0401000C0211001A0421000F57 +:10C6900049FFFF024402B8008026FA5449FFFF25F3 +:10C6A0003C0DFB7D44321C7C44221C7D04000009AF +:10C6B000401020093E0028953E1028964010400961 +:10C6C00092183E1028973E002898A618A650960269 +:10C6D000964AAE58AE1044321C7E44221C7FA618E7 +:10C6E000A6509602964AAE58AE1064000009440364 +:10C6F000F061441218CDA6009600AE084403F00E77 +:10C70000441218CEA6009600AE084403F00F44125F +:10C7100018CFA6009600AE0849FFDCE73C0FFB8669 +:10C720005A080107440218CC441FFFAAAE40490032 +:10C7300002643A6F9E84DD9E84013C0FFBA9DD9E5E +:10C740003C0DFBAA8C013C0FFBAADD9E3A6F9ABC04 +:10C75000EFFC3C0DFBB68C013C0FFBB63C0DFB83A4 +:10C76000A6005A0801272E07EBD95A0055062E07B6 +:10C77000EBCE5A0855153C03F62D8C019601E60ABE +:10C780003C0BF62DE90F84013E00042D840049FF87 +:10C79000B9884400006949FFD394D50484003C0B58 +:10C7A000F62D440000553E07EBD93E07EBCED504ED +:10C7B00084003C0BF62DEC043A6F9A84DD9E3BFF1F +:10C7C000FCBCEFFC84013C0FFB9749FFCEFA49FF0C +:10C7D000B9613C0DFB83842249FFDED849FFB97162 +:10C7E0008420840284468061808180A149FFDC8BA3 +:10C7F000EC043BFFFC84DD9E3A6F9ABCEFFC49FFE2 +:10C80000D33AC01184013C0FFBAF840049FFD337FA +:10C810003C0DFB8344127B933C2DFB933C3DFB7111 +:10C8200049FFEF0449FFD31EC00784013C0FFB9A68 +:10C83000840049FFD31BEC043A6F9A84DD9E3A6F63 +:10C840009ABCEFFC3C0DFB9284213C1FFBB5AE4033 +:10C85000440FFFAA3E07EBD92E07EBB4C80A3C0DE4 +:10C86000FB83A681542100FD5A20040449FFDE8E7B +:10C8700084003E07EBB42E07EB8E5A0801072E0703 +:10C88000EB928C013E07EB92EC043A6F9A84DD9EAA +:10C8900084013C0FFBAE4403F081A600C00B3BFFBC +:10C8A000FCBCEFFC4400006949FFD30BEC043BFFE8 +:10C8B000FC84DD9E84013C0FFBB4DD9E84013C0FB3 +:10C8C000FBA7DD9E84013C0FFBA2DD9E84013C0F93 +:10C8D000FB96DD9E84013C0FFBB9DD9E84013C0F7D +:10C8E000FBA0DD9EDD9E84013C0FFBABDD9E3A6F1D +:10C8F0009ABCEFFC3C0DFBB05A08010684203C1F9B +:10C90000FBB0D50284023E07EB7D3C1DFB83840116 +:10C910003C0FFBB284003C0FFBB7A6095A000D0781 +:10C920009E82E642E9035A08074AA6085A080147C8 +:10C930002E07EBF99600C8423C1DFB92A6485A18F8 +:10C94000013E3C1DFB77A6485A1801393C0FFBB34A +:10C950002E07EB805A08010449FFDAD72E07EB8E29 +:10C960005A0801082E07EB855A08010449FFDBA38A +:10C970002E07EB875A08010449FFDA992E07EB8E40 +:10C980005A0801082E07EB8B5A08010449000E4291 +:10C990003C0DFB83842049FFDDF944127D6C3C0D86 +:10C9A000FB4049FFB94F840149FFB87B3C1DFB9216 +:10C9B0008400AE083C1DFB77AE08EC043A6F9A8405 +:10C9C000DD9E3C0DFBB78C013C0FFBB7DD9E840167 +:10C9D0003C0FFBA13E0003604403F07E3BFFFCBC28 +:10C9E000A640EFFC5A10010FA6405A10020CA640B8 +:10C9F0005A100309A6405A100406A6405A10100304 +:10CA0000A6008441842080624400B10149FFCDB575 +:10CA100049FFCDC9EC043BFFFC84DD9E84013C0F43 +:10CA2000FB99DD9E84014413F0633C0FFB9EA60836 +:10CA30009606C819442221EC4615A5A550108A5A1D +:10CA4000B6222E1003635A180109461131355010D1 +:10CA50008A5AB6223E0003634413F063A6085800C6 +:10CA60000001D51CA6089606C01A441221EC460AFD +:10CA70005A5A500005A5B6012E0003625A08010A51 +:10CA80004601515550000A5AB60184003E00036227 +:10CA90004413F063A608540000FEAE08DD9E840136 +:10CAA0003C0FFB9DDD9E84013C0FFB9BDD9E3BFF0D +:10CAB000FCBCEFFC84013C0FFBAC49FFEB665A0861 +:10CAC000A10A4403F4038420AE404400005549FF0A +:10CAD000D1F8EC043BFFFC84DD9E3A6F9ABCEFFC7E +:10CAE00084013C0FFBA33C0DFBB38C013C0FFBB35B +:10CAF0002E07EB805A0801222E07EB8CC8052E0763 +:10CB0000EB7F49FFDA882E07EB8C2E17EB7F49FF6E +:10CB1000D9452E07EB7F2E57EB938C0196003E07ED +:10CB2000EB7FD80B2E07EB928C013E07EB922E0782 +:10CB3000EB8C8C013E07EB8CEC043A6F9A84DD9E03 +:10CB400084013C0FFB984403F4033BFFFCBC8420AE +:10CB5000EFFCAE404400005549FFD1B3EC043BFF6D +:10CB6000FC84DD9E84013C0FFBA5DD9E3BFFFCBCED +:10CB7000EFFC49FFD1B8C00784013C0FFBA484003F +:10CB800049FFD1B549FFD1A6C007840049FFD1A60E +:10CB900084013C0FFBB8EC043BFFFC84DD9E840168 +:10CBA0003C0FFBB0DD9EDD9E3BFFFCBCEFFC840137 +:10CBB0003C0FFB9C49FFCC4049FFB766C80449FFC6 +:10CBC000B769D50349FFCBFFEC043BFFFC84DD9E36 +:10CBD00084013C0FFBA6DD9E84013C0FFBADDD9E76 +:10CBE0003BFFFCBCEFFC4400006949FFD16AEC0448 +:10CBF0003BFFFC84DD9EFC452E0029115A000106F6 +:10CC00002E0029135A08011A3C0DFB869E46E62287 +:10CC1000E9048E09E603E8113C0DFB834412938C72 +:10CC20003C2DFB943C3DFB933C4DFB823C5DFB71FA +:10CC300049FFC3AA5A00085049FFD898490011403B +:10CC4000490010483C0DFB838421AE41490013B4D8 +:10CC5000440000A049FFEA9444027D9C3C1DFB83F4 +:10CC60004900105249000DD049000AF584013E07E1 +:10CC7000EB7949FFD831440000A149FFEA813C0D1E +:10CC8000FB8344127B933C2DFB933C3DFB7149FF9E +:10CC9000ECCD2E07EBCD5A08010A44027B37441233 +:10CCA0007BE249FFDC1449FFD1413C1DFB92840229 +:10CCB000AE083C1DFB77AE0849000C8B2E07EBCD70 +:10CCC0005A08010649FFD12B49FFD13649001222EB +:10CCD00049FFD85144A2B8BC44929CC45085011469 +:10CCE00051C480784473F04A44600055840E49FF73 +:10CCF000EA51AFB849FFDBAE2E1004062E27EBFD3C +:10CD0000840AFE0C44100064420104732E100404D3 +:10CD10003C2DFFE9880144102710420104732E20A6 +:10CD20000434441003E8420104733C08061A49FF26 +:10CD3000EC692E0029115A0001172E0029135A0000 +:10CD400001132E07EC0B5A08012544027B933C1D6E +:10CD5000FB943C2DFB933C3DFB823C4DFB7149FF1A +:10CD6000ECABD5173C0DFB83A6415A100D0D2E10D0 +:10CD70000425C90944127B952E20291B4432938C2B +:10CD800049FFC6462E07EBC35A0801DD48FFFF7076 +:10CD90003C0DFBAF5A08013C84003C0FFBAF2E0753 +:10CDA000EC085A0855163C0DFB713C1DFB83B61F61 +:10CDB00044227B5544027D9C3C3DFB943C4DFB93BF +:10CDC0003C5DFB8249FFEE123E07EBF3D5033E6765 +:10CDD000EC082E07EBF349FFED4796003E07EBBD4D +:10CDE0005A08030448FFFF2A5A08021284003C0F25 +:10CDF000FB784463F04A447000553C0DFB92A6005A +:10CE00004E03FF36AFF049FFFA5AD5F83C1DFB92AE +:10CE1000A6085A08020C3C0DFB77A6005A08020728 +:10CE20008401AE083C1DFB77AE083C0DFB83A601D8 +:10CE30005A000B0449FFDC543C0DFB77A68096900A +:10CE40004E23FF562E07EB805A0801213C2FFB781A +:10CE50004463F04A447000553C0DFB92A600C8059F +:10CE6000AFF049FFFA2CD5F9440298C449000A2FC3 +:10CE70002E07EBF349FFD8BB49FFCBDAC803840385 +:10CE8000D5028404842148000186440298C44412D7 +:10CE90007B7BF28749FFDA712E07EC09F2075A080B +:10CEA000020A3C1DFB7784013E07EC09AE0848FFEF +:10CEB000FF1B2E00035C5A08010B2E07EBF349FF02 +:10CEC000D89684023E00035C48FFFF0E5A08020415 +:10CED0003E20035C2E07EBCD5A08010744027B3746 +:10CEE000842049FFDA842E07EB8E5A08010744029A +:10CEF00098C449FFD80ED5BD2E07EBFD5A08030C88 +:10CF00002E0029145A08010849FFBA5D84023C1D0D +:10CF1000FB44D50649FFD12EF087F107840049FF75 +:10CF2000D9753C0DFB83A6415A180D098423AE41E7 +:10CF3000440000A349FFE924D51E440000A349FF93 +:10CF4000E91F2E0029155A0801113C0DFB83A6404C +:10CF50005A18010CA6015A0006092E07EC09C8054B +:10CF60002E07EBD049FFD1762E000429C00484009F +:10CF70003E0004292E6029145A68010984003E00ED +:10CF8000042849FFBE0E3E600428440298C444129F +:10CF9000985C44229C044432B8004442989849FF6B +:10CFA000E5622E07EBF35A08040649FFE7C4480080 +:10CFB00006D02E07EBF7E60EE80C2E07EBEBE609A2 +:10CFC000E8082E07EBE7C80B3C0C0106E613E9075F +:10CFD0003C0C024F44126E7049FFC9A83C1C02541D +:10CFE00084004432A77C0A208001382181098C0109 +:10CFF0005A0824F93C0FFBBB2E0029165A08010CD5 +:10D000003C0C024F3C1C02513C2C025444329968A7 +:10D0100049FFE7072E17EBCD5A18010644027B376C +:10D0200049FFD9E54402985CB61F3C0414AA441297 +:10D030007B39F0834402B9E4F0844422938C840069 +:10D040004432989844427D5C44529AB814AF8001AF +:10D05000148F800249FFD2C4840044127D5C4422B4 +:10D060009AB844327D8044429AD049FFD2A73C000E +:10D0700005A85CF000F5E80484013E07EBE63C0CF3 +:10D08000025349FFBAC83C0C0254A445964BE43500 +:10D09000E90702100017964B5EF0FFF6E90C02104C +:10D0A000000C964BE435E9090210001E964B5EF029 +:10D0B000FFF6E8038421D50284203E17EC15A44531 +:10D0C000964BE435E80FA440964BE435E80B02108C +:10D0D000000C964BE435E806020000119603E415B7 +:10D0E000E9073C00046B5CF000658401E802840001 +:10D0F0003E07EC122E07EB865A08012E440298C414 +:10D100004900083A49FFCA9480208403C10384047B +:10D11000842049FFD7AC3C0DFB778421AE402E67BD +:10D12000EB915A60010448FFFDDF80263C0DFB8334 +:10D1300049FFDA2C800649FFDBF849FFDC0DF08758 +:10D1400084408402F1078066808280A249FFD7DB99 +:10D1500048FFFDCA2E67EB8D5A68012184003E0707 +:10D16000EB8D3E07EB7C2E07EB8849FFD80549FF86 +:10D17000E6E22E0028835200000149FFD7FD3C0D56 +:10D18000FB77AF8049FFCA5480208403C103840425 +:10D19000842049FFD76C48FFFDA749FFD7B03C0E5C +:10D1A00005EF2E07EBCD5A08010744027B37842296 +:10D1B00049FFD91D2E0029175A08010C4402A74423 +:10D1C0004412989844227B952E37EBDD49FFE3F714 +:10D1D0002E0029145A0801084402989844129844D1 +:10D1E00049FFBBC42E00291A5A08011249FFCA2060 +:10D1F0005A08020B440298C44412938C44229800AB +:10D2000049FFD058D50484003E0004043C0C02536E +:10D2100049FFF39084403C2FFBBB3C3C025344024B +:10D220009D70FA825A200A1E04107FD15A10030BF7 +:10D2300004107FF38E22E622E905B4208E22E62236 +:10D24000E80C0050003200100033421290739449F1 +:10D250008823A44812107FBB8C4150000108D5E3FD +:10D260003C5C025484068440444299685011000C8E +:10D2700099A98823A5C8381201018827964BAC705C +:10D280005011003099A988238C42A5C83812010199 +:10D290008C018827964BAC705A080CEA3C0FFBBBFC +:10D2A0003C1C02543C0C02533C2C025F49FFF4939B +:10D2B0003E00043449FFC9BCC0073C0C0254441270 +:10D2C000980049FFDF0B3C1C05EF84005A10010455 +:10D2D0004800010D3E07EBF43E07EBF72E00291442 +:10D2E0005A0001062E00291A5A0801064402B99C68 +:10D2F00049FFBFF72E000434C0073C0C025444120F +:10D3000098008441D5073C0C0254441298003C20FC +:10D31000048844327B6749FF99152E0029245A0856 +:10D3200001123C000202C80E2E07EBFDC80B3C0C9C +:10D330000253441298003C20048844327B6749FF22 +:10D34000F6C6840044127D288040382080088C0175 +:10D350005A0806FD84003C0FFBBBFAC23C0DFBBB28 +:10D360002E17EBDFE201E8453C2C021F94413851B7 +:10D370000101D8393C2C02223C3C02218841FA842C +:10D38000A651A69080A138018111425118734432F0 +:10D39000996849FFE5523C2DFBBB3C3C021F945170 +:10D3A0008823A4C8FE1FAC083C0C02213C10059940 +:10D3B00038000901E220E80C5CF0003CE8092E1777 +:10D3C000EC035CF080FAE8048C213E17EC03961025 +:10D3D00049FFF4CA2E07EC125A0801062E07EEEC9C +:10D3E00049FFF5F73C0DFBBB8C013C0FFBBBD5B7F0 +:10D3F0005A1002072E0029195A080162D5468400E6 +:10D400003E07EC163E07EC1184003C0FFBBB84C1C9 +:10D410003C0DFBBB2E17EBDFE201E8ED3C1C021FCD +:10D42000950138508101D82B2E07EC165A080118A7 +:10D430002E17EC113C0C022294C988608880A698B3 +:10D44000A6209A828C41E643E80AA6A1A6198A4042 +:10D450008C42E645E804962849FFF5CC3C1DFBBB11 +:10D460003C2C022294098802A680CA09A6018E05D6 +:10D47000E608E8053E67EC163E17EC113C0DFBBBD9 +:10D480008C013C0FFBBBD5C53C0DFB94A40096065C +:10D490005A0001083C0DFB82A60096065A080110AE +:10D4A0002E07EB6AC80C44029800441298C4442228 +:10D4B0007B6749FFD2F13E000406D50684003E009A +:10D4C000040649FFD2033CF4046E5EF78065E9046C +:10D4D00084003E0004062E0004065A08010584005C +:10D4E0003E00035C49FFF4E1D51D3E0004373E00D9 +:10D4F00004363E00043C2E0004065A08010649FF8B +:10D50000D1CB3E00040649FFD1DD84003E07EBDFAE +:10D510003E07EC032E07EBF4E60AE8048C013E0715 +:10D52000EBF42E07EBCD5A08010744027B37842326 +:10D5300049FFD75D84003C0FFBBB3C0DFBBB2E2796 +:10D54000EBDFE202E81C3C1C021F38508101D813BB +:10D550004412980096A83C0C02544432938C49FF24 +:10D56000F31C3C1DFBBB3C2C021F94498822A48861 +:10D57000FE17AC083C0DFBBB8C01D5DECA043E2770 +:10D58000EC0DD50B440298003C1C025344326BD87E +:10D5900044427B9549FFB19C2E0004065A080105C0 +:10D5A00084203E17EC0D2E17EC0DC1472E3028AA13 +:10D5B0002E4028AB9261928144026BD88440E241B4 +:10D5C000E80BA5408C4188A3AD40A5418C1888A4E8 +:10D5D00012507FF5D5F52E00291D3C2FFBBB5A08B4 +:10D5E00001092E000804C80544026BD849FFAE02A9 +:10D5F0003C0C01048C013C0E010484003C0E01052E +:10D600003C0E01063E07EC073E07EBF73E07EBEB4F +:10D610003C0DFB83A6015A0803048400D5085A0870 +:10D620000A6C2E07EB9D5A08050684013E07EB9D08 +:10D63000D5635A080462D5F2C85F84213E000436DF +:10D640003E07EBE83E17EBE13E07EBDF3E07EC0D54 +:10D650003C0E01083C0E01043C1C0105460005B8C7 +:10D6600050000D80E201E9048C213C1E01053C1CA8 +:10D670000106E201E9142E07EBFF3C23FF80E202E2 +:10D68000E8083C23FF7FE202E8042E07FF08C005FC +:10D690008C213C1E0106D5033C0E01062E07EBE54E +:10D6A0005A08010F2E07EBF7E60FE8072E17EBF4E9 +:10D6B0005A180A048C01D50284003E07EBF7440295 +:10D6C000996849FFF4F65A0801082E07EBEBE60AC1 +:10D6D000E8038C01D50284003E07EBEB2E07EBBB81 +:10D6E0005A0801083E07EBD884003C0E0105D5041A +:10D6F00084003E07EBD82E07EBE24E0300852E0098 +:10D700000406C8282E07EC0DC8252E07EC0EC822EB +:10D71000440298C444129C0449FFD02D2E07FF08F0 +:10D720005A08010B3C0C01065CF000C8E9058401B5 +:10D730003E07EC0ED50F49FFCFF35A0002FA440220 +:10D740009C043C1014B344227B8F49FFE0615A00D3 +:10D7500002F03C0DFB83A6015A0006045A080B1385 +:10D760002E07EC0E5A0001092E0004315A00010563 +:10D770002E07EC07C04884013E07EBD83E07EB9C20 +:10D78000D5422E07EBEB5A000A0E2E07EC0E5A007C +:10D79000010A2E0004315A0001062E07EC155A0822 +:10D7A000022484003E07EC1584003C0FFB784463A0 +:10D7B000F04A447000553C0DFB92A600C805AFF03E +:10D7C00049FFF57DD5F9840084213E07EC0E3E002B +:10D7D00004313E1004323E07EB9D3E07EBE53E0769 +:10D7E000EBEB48FFFA452E07EBF75A080F0D8400C4 +:10D7F0003E07EBE53E07EBF73C1C025144026E701E +:10D8000049FFC5942E0004065A08010784003C0E07 +:10D8100001053C0E01062E0029145A08010A440293 +:10D82000BC00501000305020005849FFB8D04402CE +:10D83000938C2E17EC0D2E27EBE62E37EC0349FFC9 +:10D84000DB0B3C0C025F2E27EC18B61F2E17EC0DDD +:10D8500044026BD8C20744229CB4443298008480AE +:10D86000D50644229CB44432980084814452938C5F +:10D8700049FF99333C0C025344129CB42E27EC0D03 +:10D8800049FFECED2E07EBCD5A08010744027B3728 +:10D89000842449FFD5AC2E00292344629CB45A0845 +:10D8A000010A8006441298003C2C025349FFEF1AEB +:10D8B000D5132E20288180068420E222E80BB46054 +:10D8C000C305A4C2ACC6A4C3ACC78C2150000108D8 +:10D8D000D5F53C1FFBBB2E07EC0D2E17EBC59A416F +:10D8E000964844029CB449FFAB6249FFC6A1C80DEB +:10D8F0002E07EBD13E07EBC52E0029135A00010479 +:10D90000480001634800014E3C0DFB8249FFDAF3F9 +:10D910004412980044029CB4490005BB3E07EC0F3A +:10D920004412980044029CB44900063244029CB45C +:10D93000441298003C2C025349000A7F44029CB4D4 +:10D94000441298003C2C0253490006AF84003E0765 +:10D95000EBD184003C0FFBBB3C0DFBBBE60AE8C9E6 +:10D9600044100108FE4498F1B4034E020116502100 +:10D970008080A6124E0200F5A7164E4200BB002181 +:10D9800080EB44029CBC5A28030950200010380048 +:10D99000040238110402D506402484003800040231 +:10D9A000A05149FFA3F7842049FFDA7196C15CF1C9 +:10D9B00080973C1DFBBBE90D4400010880464220D6 +:10D9C0008073500100808440AE82AE864430009661 +:10D9D00044000108804642208073005100EB800221 +:10D9E000527180968C48C56CE6A2E94722F000048B +:10D9F00084805EF7821CE903444004375A58022CA5 +:10DA000044200108FE8C983284A3105000EB505043 +:10DA1000001002F2800245E29C5012F0000C02F26B +:10DA20008003F489F388F58712F0000D38FF0601B2 +:10DA3000944A883E40048800A449885C41E0C008BC +:10DA4000A001A051402F3C0449FFDD6EF507F40909 +:10DA5000F308AC2B3C1DFBBB440001088046422070 +:10DA6000807322110004FF3C42408C7344100096E6 +:10DA700040420496AD14D50D2210000A2220000465 +:10DA8000FE7C42110C734420009640108836AC4452 +:10DA90003C1DFBBB4400010880464220807380028D +:10DAA000501100082200000B22208001FFC44271A7 +:10DAB0000C7344000096407380F6ADC9D5395050C0 +:10DAC00000882212800222400004FE7C42120C7365 +:10DAD0004440009640109036AC442212800322014C +:10DAE0000001FFCC42700C73407390F6ADD1D5208D +:10DAF0005011808822F08002225180045270000A66 +:10DB000042F03C245041800842F3947384AA40F7C9 +:10DB100095F62210800312F1800422320001FE44A7 +:10DB200042138C73401094368E01AC61AE123C1DD2 +:10DB3000FBBB440001088046422080732231000470 +:10DB40004E3400048460ACD480464220807380024E +:10DB50008C08221000014E1400048420AC413C1DAE +:10DB6000FBBB4400010880464220807380020421F0 +:10DB700000225A2801060400002F5A00010E2E0729 +:10DB8000EBD180468C013E07EBD1440001084220D6 +:10DB900080738420B6223C0DFBBB8C0148FFFEDC69 +:10DBA0002E0004255A0801114402938C49FFCC7EB3 +:10DBB000C80B4402980044129CB42E27EC0D44324A +:10DBC0007D84490002F084003C0FFBBC3E07EBEA79 +:10DBD0003C0FFBBB2E4028813C6C0220804044124D +:10DBE0009CD08060447000FFE264E81B0450FFF9A1 +:10DBF000CD0380A2D511A14A385315015CF28100F2 +:10DC0000E807E6B5AD48E9058C019600D502ADC838 +:10DC1000A14FE2A2E9EF8C61501081088045D5E563 +:10DC20003E07EBEA2E07EC0D3C3FFBBB3C2FFBBC59 +:10DC3000C0232E07EBFD5A0803202E0004275A00AC +:10DC4000010544000090D503440000413C1DFBBC8D +:10DC50003E07EC1CE2202E07EBFCE805E61EE80C74 +:10DC60008C01D508C0095CF09900E9038400D50255 +:10DC70008E013E07EBFC49FFC4DB5A08020A44024E +:10DC80009CB42E17EC0D4422980049FFCC543C0D57 +:10DC9000FB83A6015A00030749FF9E70E6034EF37B +:10DCA00000933C0DFB9A5A08010984003C0FFB9A33 +:10DCB00044027DA449FF9E4A2E07EBF35A00050A51 +:10DCC00044029A0844127DC449FFA1723E07EE2225 +:10DCD00049FF9E5780C05A08015149FF9E4F5A087C +:10DCE0000305800649FF9E4749FF9E485A080405E0 +:10DCF000840149FF9E403C0C05EF3C0E05F03C00C2 +:10DD000005A83C0BF6272E07EC0D3E07EC0149FF5A +:10DD10009E29E602E93D49FF9E255A00FF3AFA0E88 +:10DD20003E00043C49FF9E1EC8383E07EBB52E005E +:10DD300029145A0001392E07EC09C0048E013E0750 +:10DD4000EC092E07EBF35A08050448FFF9303C0DA7 +:10DD5000FB778421AE402E0029135A00010448FFAE +:10DD6000F7C33C0DFB83A6015A000A0448FFF7BC29 +:10DD700049FFD81E48FFF7B849FF9E005A0803BD67 +:10DD800084003C0E010584013E07EB9CD5B52E00B6 +:10DD9000043CC0C98E01D5C52E07EBB5E60AE8C81C +:10DDA0008C01D5C43C0DFB83A6015A0006C65A005F +:10DDB0000BC42E07EC09E602E8BF49FFB6B849FFDD +:10DDC000B9CFD5BA84003E07EE203E07EE213E07CC +:10DDD000EE22D5923A6F98BC40608C0390DF4E34AF +:10DDE0000006FEDAC203FE929ED94E140006FE4AD9 +:10DDF000C003FE029E4984804900003AC6084040A4 +:10DE00008004C405FE4AC003FE029E493A6F98840E +:10DE1000DD9E920040A14009974192104040A837F2 +:10DE200096D14010C008FE4742020C24E220E809C7 +:10DE30009F21984AE222E905E220E8039F21984ABF +:10DE40009A484010A81740004008FE2FFECCE2037D +:10DE5000E80998029E49E202E905E203E803980214 +:10DE60009E499A0340424008FE67DD9EEFD83A6F14 +:10DE7000AAA0FD30FD418384CB51E2E8E81A800876 +:10DE8000490000CCF087C00C4084000C52500020A8 +:10DE90004053140D4073800CFFEF4063000CFD03F2 +:10DEA000804849FFFFB9F18880C084A0F589D52555 +:10DEB000C22C8008490000B2F087C8058AE884A116 +:10DEC000F589D51452F000204084000C804840436E +:10DED0003C0D4053800C4063000C40029004401302 +:10DEE000BC0D49FFFF99F18980E0FD03804849FF9F +:10DEF000FF93F188506000004FC20055F307447053 +:10DF0000000040630C0DD54C407420D78420840061 +:10DF10004FC2004CB6DCBF81D548E2E9E9F8800980 +:10DF20004900007CF087C045524000204054100D4D +:10DF30004024800CFEAF81224084000C4033100D41 +:10DF40004063000C4003800C4013900DFE1F49FFFE +:10DF5000FF63F18880E0800849000070E2E1E90594 +:10DF60004C13C00DE2C0E80AF3088A299ED9F38851 +:10DF700040302001E2038A2F80038460F3894FC27E +:10DF800000129A309A79E2C08A2FF307524180201A +:10DF90004070900C40600C0DFFBF40708C0DB6DCE3 +:10DFA000BF81F008041F80093A6FAA80EC28DD9E2B +:10DFB0008460E327E903E2C8E90A84A1F5884043C5 +:10DFC00020018AE9E2C48AEF80C4D502F388F3898C +:10DFD0004FC3FFE7D5E79200425088244010400924 +:10DFE00042500C73960140314009969142F00C2446 +:10DFF00042400824FE8C40078800E20240F7C00837 +:10E000004020400842F08C7340104009882F98222D +:10E01000E204882F984DDD9EC00EFA20FA6F9B19FE +:10E020004020040D4032081B4001081B9221C9F812 +:10E030008003DD9EFA10DD9E9681403040099609EE +:10E04000923042510424FE84FE1C9968E2A040F7FD +:10E05000C00842F184734012C009882F4002C008F2 +:10E060009802E202882FDD9E8060C207994A08402C +:10E07000800118418001D9FCDD9E92008060995A90 +:10E08000D30418118001D5FDDD9E92000F10FF0012 +:10E090000D0EFF0000020800000404040406080638 +:10E0A00001082105060604070104040601042206EE +:10E0B00004040506060101080606050607010422F8 +:10E0C0000404012206040501050701041E1D1B119D +:10E0D000031E1119110300000000050004000000D8 +:10E0E0000B0B0B0B0B0B0000000000000A0A0A0AC6 +:10E0F0000A0A00003C282828282800000000000008 +:10E100003C1414141414000014141414143C0000CF +:10E110000000000028282828283C0000426464648D +:10E120006441000000000000416464646442000037 +:10E13000646464646464614D4C4C4D616464646403 +:10E140006464000000010002010302033C0FFBBFF6 +:10E15000DD9E3C0FFBBEDD9EFC00C0085A08010B93 +:10E16000490004B03C0FFBC1D505490004A83C0F91 +:10E17000FBC0FC808020E6293C0DFBC1E82544F073 +:10E18000E08C3817840040F0BC00DD0F0A3C10160C +:10E190001C22282E34003C0DFBC0DD9E5000005098 +:10E1A000DD9E500000A0DD9E500000F0DD9E50007E +:10E1B0000140DD9E500001E0DD9E50000280DD9EAA +:10E1C00050000320DD9E8400DD9E92003C0FFC0A7F +:10E1D000DD9E3C0FFC09DD9E3C0FFC0DDD9E3C0FDF +:10E1E000FC0CDD9E3C0FFC52DD9E3C0FFC51DD9E85 +:10E1F0003C1DFC52440280483C0FFC1CA64D840090 +:10E200008E2196483E17F0763E17F07784213E0720 +:10E21000F0743E07F0753E07F0783E07F0793E0750 +:10E22000F07A3E07F0493E07F0483E07F04A3C1FAF +:10E23000F9F43E07EE23441280048400845F382002 +:10E2400080088C015A0841FDDD9EFC0049FFCF8803 +:10E25000FC80FC21841F100F800749FFCF89C81064 +:10E26000500F800784404440003F44128004846182 +:10E2700049FF9BED8480800444228004D50A4463D6 +:10E28000F04A4470005549FFCF73C0EBAFF0D5FCA6 +:10E29000381110008C81880196005A4840FB844157 +:10E2A000FE0244121C0080623E07F0BC440280045F +:10E2B00049FF9BCD84013E07EE2049FFCF61FCA1C1 +:10E2C0003C0FFEF4DD9E3C0FFEF3DD9E3C0FFEF5A1 +:10E2D000DD9E3C0FFEF6DD9E4433F405AE984423EC +:10E2E000F406AE504413F404AE08DD9EA640A685A5 +:10E2F0003E100CA8A641402120083E100CA9A642C1 +:10E30000A6C63E100CAAA643004000083E100CAB67 +:10E31000A6448841A64796934010A0088823003061 +:10E320000009964B4031A00888643C3806580030FC +:10E33000000B0040000A4031A00888643C380659B0 +:10E340000030000C3C2806563E300CB40030000D66 +:10E350003C1806573E300CB50030000E96C63E30D5 +:10E360000CB60030000E926196C63E300CB70030FD +:10E37000000E926296C63E300CB80030000E9263DA +:10E3800096C63E300CB90030000F3E300CBA00305B +:10E390000011004000104031A00888643C38065E3F +:10E3A00000300013004000124031A00888643C385F +:10E3B000065F003000150040001496CF4031A008E1 +:10E3C00088643C3806600030001592623E300CC212 +:10E3D000003000170040001696CF4031A008886436 +:10E3E0003C3806620000001792023E000CC6400155 +:10E3F0002C0A9606C006440FF000FE873C280656FD +:10E400004000AC0A9606C006440FF000FE473C18D8 +:10E410000657DD9EA4C04422971C44120000FECF84 +:10E42000B662A4C250410020FECFA8D2A4C4FECF41 +:10E43000A8D1A4C6FECFB66402300008FECFA8E182 +:10E440000230000AFECFA8E20230000CFECFA8E3A3 +:10E450000200000EFE47A864DD9E4413F40BAE08D4 +:10E46000DD9E4413F407AE084413F408AE08DD9EA5 +:10E47000FC004403F5378424AE40840080208040B3 +:10E48000806049FFCE95FC805A0804053C0C01E7EA +:10E49000D5033C0C01E502000013844C4200887354 +:10E4A00044120000FE0F00000008DD9E5A0804051B +:10E4B0003C0C01E7D5033C0C01E502000013844C41 +:10E4C0004200887344120000FE0FA001540003FFB5 +:10E4D000DD9EFC002E000CAB84C05A08010384C3EF +:10E4E0008026840349FFFFD23E07EBDB80268403AE +:10E4F00049FFFFDE3C0BF62E8420840449FFFFC653 +:10E500003E07EBD78420840449FFFFD23C0BF63151 +:10E51000FC80B44084A08C449C2EA2D196005A5812 +:10E52000200680A05A0824FADD9E5441801F3840FE +:10E5300094088CA197689265D8F3D5F4B4605050D4 +:10E5400080108001A09F54410003184000019242B6 +:10E550004C02FFFB0401800850108020542000036F +:10E56000182280019202D9FBDD9EFC404462971C78 +:10E570008423B40684E13C0FFB2D4403F40B852077 +:10E58000AE404403F4054413F407AFC04403F4065B +:10E59000AFC04403F404109000008402AE0844139A +:10E5A000F408AE0849FFFF664403F01E1090000017 +:10E5B0004403F420AFC049FFB2094900008849FF75 +:10E5C000FF8A8006441297B849FFFFA580064412CF +:10E5D000975049FFFFB5490000BCFCC0FC002E105D +:10E5E000294084003E17EBF13C1414BE3E07EBFDBE +:10E5F0003C1BF6113C1BFDF43C1014BF3E07EB67BF +:10E600003C1BFDF53C1014C03E07EBC23C1BFDF665 +:10E610003C1014C13E0004293C1BFDF73C1014C201 +:10E620003C1BFDF83C1014C33C1BFDF93C1014C40A +:10E630003C1BFDFA3C1014C53C1BFDFB3C1014C6F2 +:10E640003C1BFDFC3C1014C73C1BFDFD3C1014C8DA +:10E650003C1BFDFE3C1014C93C1BFDFF2E17EB6557 +:10E660003E17EBAE3E07EBEE3E07EBC73E07EBC0B7 +:10E670003E07EB613E07EBFC4400003284213E077D +:10E68000EBFF84023E17FC0E3E07EB7684203C0431 +:10E6900006623C1BF6123E17EB6C842F3C1FFB44BA +:10E6A0004010240A9646C104441FFC00FE0F3C0B98 +:10E6B000F62B3C0406604010240A9646C104441F11 +:10E6C000FC00FE0F3C0BF629FC802E0029145A0892 +:10E6D0000118FC002E00299E4900007C2E00299F75 +:10E6E0004900007D2E0029A0490000832E0029A1A9 +:10E6F0004900007A44004A5C49000080FC80DD9EAD +:10E700003C0FFFC3DD9E3C3DFB2D022180120031FA +:10E7100080499691AEC03C0DFB2DB4009203963714 +:10E72000AE082E07EBFDC81344120000400104049C +:10E73000A00454000FFF96033C0BF6103C0BFE00A8 +:10E740003C0BFE013C0BFE023C0814BDDD9EFC00B0 +:10E7500084033E07EBFD84812E07EBF944527D6C68 +:10E760002E17EBEF2E27EBB32E37EBD549FFA90978 +:10E770002E07EBC7C80A44027AF144127AED49FF2A +:10E78000FFC484013E07EBC784003E07EBFD848194 +:10E790002E07EBF944527D6C2E17EBEF2E27EBB3CF +:10E7A0002E37EBD549FFA8ED2E07EBC0C80A44026F +:10E7B0007AE844127AEA49FFFFA884013E07EBC0D9 +:10E7C000FC804423F242AE104403F243AE40DD9E8F +:10E7D0004413F3C59600AE08DD9E4413F3C69600BD +:10E7E000AE08DD9E4413F3C79600AE08DD9E4413C9 +:10E7F000F3C89600AE08DD9E4413F3DE9681AC8824 +:10E800008002DD9EFC204472B80084C02E002FB030 +:10E810008CE4E2C0E80F0203839C0013873A2E20A9 +:10E820002FB1846149FFBEA98CC11003873B97B00B +:10E83000D5EEFCA04423F054AC104403F056AC4099 +:10E84000DD9EFC004403F58784234423F583AE401A +:10E850008402AE104423F59FFA70AE504423F59B1A +:10E860004443F58CAE104423F5AD84A5AE5044135B +:10E87000F5A9845FAE084403F5814413F580AE80AA +:10E880004403F585AEC08401AE084413F588AE0894 +:10E890004413F589AE084413F58AAE084413F58B8A +:10E8A000AE088420AE604443F58DAE604443F58EDF +:10E8B000AE204443F58FAE204443F590AE20444350 +:10E8C000F591AE204443F592AE204443F593AE203B +:10E8D0004443F594AE204443F595AE204443F59669 +:10E8E000AE204443F597AE204443F53FAF60444328 +:10E8F000F08CAE204443F599AEA04443F59DAEE0C4 +:10E900004443F598AE204443F5A0AE204443F5A11E +:10E91000AE604443F5A2AE204443F5A3AE20444389 +:10E92000F5A4AE604443F5A5AE604443F5A7AEA0A0 +:10E930004443F5ABAEE04433F5A64443F584AE184A +:10E940004433F5AEAE184433F5AFAE184433F5B0EA +:10E95000AE184433F5B1AE184433F5B2AE58443373 +:10E96000F5B3AE584433F582AE98FA71AEE0444345 +:10E97000F586AE204443F59AAEA04443F59CAEE044 +:10E980004443F59EAE204443F5A8AEA04423F5AA27 +:10E990004443F51AAED04423F5AC846AAE10442348 +:10E9A000F56BAED02E200CB84433F51BAE605A2860 +:10E9B000011D4403F51CAE58AE804403F51DAE4066 +:10E9C0004403F51EAE404403F51FAE404403F51466 +:10E9D000AE404403F515AE404413F518FA14AE08E2 +:10E9E0004413F519AE08D51DAE184433F51CAE1806 +:10E9F0004433F51DAE184403F51E846CAE40440349 +:10EA0000F51FAEC04403F514AE404403F515AE4007 +:10EA10004403F518FA34AE404403F519FA2BAE401E +:10EA20004403F56A8421AE404413F5B4840FAE0864 +:10EA30004413F5B54433F516AE084413F5B6840314 +:10EA4000AE084413F5B7AE084413F5B8AE08441346 +:10EA5000F5B9AE084413F5178400AE18AE084403A8 +:10EA6000F5BA5A280104AE80D5038422AE4044038F +:10EA7000F566842E4423F567AE408402AE1044232D +:10EA8000F568AE504413F5694423F340AE0884386A +:10EA9000AE504423F524AE504423F525AE50441324 +:10EAA000F523844AAE884413F344AE0884008020E2 +:10EAB0008040806049FFCB7CFC8044023E6CDD9E40 +:10EAC00044021E00DD9EFC204403F0C03C0FFB20EE +:10EAD0004403F0D44410021CAC4084003C0FFB788B +:10EAE0004463F0F44473F04AA6309600C007440033 +:10EAF0000055AE3849FFEBE3D5F84413F0C284412A +:10EB0000AE884413F0CC44200036AE884413F0E8BD +:10EB1000AE084413F069AE08FCA092084413F0D488 +:10EB20009601AC08DD9EFC00840049FFC21C440233 +:10EB30000BFC3C0FFB314402111044227D5C3C0F66 +:10EB4000FB294402163484213C0FFB338400AE5071 +:10EB5000AE51AE12AE13AE14AE55AE1644229AB8F4 +:10EB6000FA7DACD1ACD244300032123100084430CE +:10EB700000641031000AFA6444500078848A10312D +:10EB80000012FA64AE561011000EAD56AD1410010D +:10EB9000000B1231000A44227D804460005FAE50B9 +:10EBA000AE1144223BFC3C2FFB2E44223C083C2F60 +:10EBB000FB2244223C143C2FFB3644227DC8AE503D +:10EBC000AE51AE12AE13AE14AE55AE1644229844FA +:10EBD0001001000EAD91AD92ACD410310012446022 +:10EBE00000648463AE5612610008AD561001000B3C +:10EBF0001041000A1231000A44227D8CAE50AE1141 +:10EC0000FC803C0FFFC5DD9E3C0FFB53DD9E3C0F9F +:10EC1000FFC9DD9E3C0FFFC8DD9E3C0FFFC7DD9E98 +:10EC20003C0FFFD6DD9E440294C88420AE40AE4126 +:10EC3000AE42AE43AE44AE45AE46AE47DD9E3C0F5F +:10EC4000FFDCDD9E3C0FFB55DD9E3C0FFB54DD9E43 +:10EC50003A6F9ABCEFFC3C0FFFDE49FFCADB3C0F6A +:10EC6000FB5649FFCAD7500002883C0FFB57EC0403 +:10EC70003A6F9A84DD9E5020002044123D44A851F2 +:10EC800044123C1CB62244123CB0A85244123DD45B +:10EC9000A85544123D40A85644123CACA854441216 +:10ECA0003DD8A85344123E68A857DD9E4413F30292 +:10ECB000A6089600E41EE808A6084413F01F8C027C +:10ECC0009600AE08DD9E4403F01FFA2FAE40DD9E95 +:10ECD000FC008400802049FFFDAF49FFFEF649FF9C +:10ECE000FC4649FFCBF949FFFFE349FFFF1E49FFFF +:10ECF000FDAA49FFBA3D49FFC12649FFBBA549FF0F +:10ED0000EAF3FC80FC403C0DFB8680C15A080410ED +:10ED10002E002913C00C840249FFDA3C840349FF0A +:10ED2000DA393C0DFB865A08042AD5174473F04A99 +:10ED30004490005549FFBC7C5A0002EF840149FF12 +:10ED4000DA298420846110938000840280418081CC +:10ED500080A349FFC9D8D5EF49FFBC6A5A00020F0A +:10ED60002E7029135A78010B800749FFBD5184008A +:10ED700049FFA697800749FFBC2484003C0FFB781D +:10ED80004473F04A449000553C0DFBA6C00C84052A +:10ED900049FFDA00840649FFD9FD2E0003645A08B2 +:10EDA0000128D50D49FFBD385A0801F3840449FFF5 +:10EDB000D9F11093800049FFEA82D5E73C0DFB862C +:10EDC0005A08041749FFBC345A0002132E002913B5 +:10EDD0005A08010F49FFCAEA840049FFB45E3C0D9E +:10EDE000FB83842049FFCBD28402AE31D513804609 +:10EDF0008405842049FFB47E3C0DFB83842049FFB9 +:10EE0000CBC58402AE31840149FFBF12840749FF9C +:10EE1000D9C1FCC03C0FFB61DD9E3C0FFB51DD9E68 +:10EE2000502000202E100CAB5A1001048420D50273 +:10EE30008423181000014C017FF7DD9E3C0FFFE793 +:10EE4000DD9E3C0FFFE6DD9E3C0DFFE7A4413C1B31 +:10EE5000FFC5A444A6003C1BFFC43E07FF86DD9E01 +:10EE60003C0FFB63DD9E3C0FFB62DD9E3C0FFB64B1 +:10EE7000DD9E3C0FFB65DD9E3C0E00B5DD9EFC007B +:10EE800049FFC96E84203C0E00BF101000501010C6 +:10EE9000005110100052101000531010006010109C +:10EEA0000061FC803C0E00C0DD9E3C0FFB67DD9ED8 +:10EEB0003C0E00D5DD9E3C0E00D4DD9EFC402E3085 +:10EEC000287A2E1028AA2E20287B42008C243C0869 +:10EED00014452E0028AB92214240082492013E00A6 +:10EEE00028B22E0028823E2028883C4814463E1036 +:10EEF00028B13E3028874422B800C00284013E0079 +:10EF000029104452B800444F64784412B82498EC55 +:10EF1000080280019602AE18D9FB44521C9C443D65 +:10EF2000EAD844021CA4986B38110410181280010E +:10EF3000D8FB44321C7C44221C7DA618A6509602A5 +:10EF4000964AAE58AE1044321C7E44221C7FA6184E +:10EF5000A6509602964AAE58AE102E10287B2E0070 +:10EF6000287A84C0FE0C3C08145644024E203C6FA4 +:10EF7000FB8549FFFA513C0C01E5442218CA3C0FBD +:10EF8000FB7944321C5E44121C5C440218C84442A3 +:10EF900018C4AD98AD88AD80AD903C4FFB92444213 +:10EFA00018C53C4FFB77444218C63C2FFB823C3FC0 +:10EFB000FB933E67EBE23C1FFB943C0FFB713C4F25 +:10EFC000FB83A50884E158420002AD08A5088541ED +:10EFD000FF3FAD08A548444FFF7FFF2EAD08A508B1 +:10EFE000852258420020AD08A548444FFFBFFF2EA0 +:10EFF000AD08A448AC58A65058108002AE50A65098 +:10F00000FE7FAE50A650541080FBAE50A650AE40CE +:10F010002E0029203E67EC0B3E07EBCD440FFFAAE4 +:10F020003E07EBD4440000553E07EBD93E07EBCE3C +:10F030003E07EC083E67EBF83C7E01033E67EC0EB2 +:10F040003E67EC073E67EBDA3E6004323E67EBAFAB +:10F050003C6BF62D3C6BF6303EA7EBF33EA7EBBDC9 +:10F0600049FFFF0F3C0DFB833E67EB7A3E67EBBB2E +:10F070003E67EB7BAF813E67EBD03EA7EBE93E6797 +:10F08000EBB9AF802E0029113E67EBF93E00042456 +:10F090003C0DFB923E67EBEF3C6E05EF3E67EBD518 +:10F0A0003C7E05F33E6004253E6004263E67EBB3DC +:10F0B000109000003C0DFB7710900000440298C4B3 +:10F0C0003E67EBC33E97EBB149FFFDD744026E703C +:10F0D0003C0E02A344026E203C0E02A444026D8C3E +:10F0E0003C0E02A544026CF83C0E02A6440000321D +:10F0F0003C0804883C08048C44029C8C3C0E02456D +:10F10000440297103C0FFB8E840A3E07EDC82E0088 +:10F11000287B3C6BF6343E0029AD80063C6BF63212 +:10F120003E67EBB83E67EE343E67EDC93E67EDCA19 +:10F1300049FFF814800749FFF811800649FFF81CC1 +:10F140003C0E021E800749FFF8173C0E021F840286 +:10F1500049FFF8123C0E0220840349FFF80D3C0ED3 +:10F160000221840449FFF8083C0E0222840549FF6D +:10F17000F8033C0E0223840649FFF7FE3C0E0224EE +:10F18000840749FFF7F93C0E0225840849FFF7F48C +:10F190003C0E02264402A7043C0FFB7B3C001445B6 +:10F1A0003C1015523C0815503C0014463C6E0108BA +:10F1B0003C0815B93C0015533E67EBD840001C0CC9 +:10F1C00088013C0815543C0015BC3C1015BB4000A0 +:10F1D0001C0C88013C0815BD4402BC603E60041C48 +:10F1E00049FFF8024402B80049FFF80149FFF82F2F +:10F1F0003C0FFB8749FFF7FE44029CB43C0E02A182 +:10F20000440298A43C0E02A244027DA43E67EE2173 +:10F210003E67EE203E67EE223E600A803C0FFB8F89 +:10F22000845F3C0DFB87843F382018088CC65A68E1 +:10F230003CFA3C0DFB8784C084E11010003C1010A8 +:10F24000003D2E0028833C6E01053E07EB883C6E96 +:10F2500001063E60042C3E60042B3E60042D3E609F +:10F26000042E3E67EDFC3E67EDFE3E67EDFD3E770A +:10F27000EBDC3E67EBF63E67EBB43E67EC093E67BE +:10F28000EBE03E67EBCF3E67EB833E67EB843E6788 +:10F29000EB893E67EB7C3E67EB8E3E67EB863E6715 +:10F2A000EB8A3E67EB803E67EB8D3E67EB913E60FD +:10F2B000043149FFFCBA4400005AFA493C080518D9 +:10F2C0003C28051C440000963C2DFB823C08051997 +:10F2D0003C08051EFA183E60042F3E600A293E6075 +:10F2E0000A2A3C08051F84053C080521A610441085 +:10F2F0000064540000F73C1805163C6805173C688C +:10F30000051A3C68051B3C68051D3C6805203C68E7 +:10F310000522AE10FA043C08040C440003843C08A7 +:10F32000040D840F3E00081E84063C18040E3E00A7 +:10F3300008203E6004303E6008043E6008053E60E0 +:10F3400008063C6804053C68040B3E60081F3E60EC +:10F3500008213E70082249FFCA05FA083E00082429 +:10F3600044024E003E67EC033E67EBE63E67EBED82 +:10F3700049FFF7BE2E0029145A08010449FFF9304D +:10F380004402A7243E7004283E77EBE749FFFD4A7C +:10F3900084003C0FFB783E07EBE33C0FFB893E0704 +:10F3A000EBF73E07EBEB2E1028882E00288749FF4D +:10F3B000FA0AFCC0FC014462B8B8800649FFFC238D +:10F3C00050037F48F08149FFFD4D9C3449FFFD4DBE +:10F3D0005003007849FFFD52500300A849FFFD4843 +:10F3E000500300C049FFFD47500300CC49FFF6B071 +:10F3F00050037F48F08149FFF6AE50037F48F0810B +:10F4000049FFFD55500300B049FFFC1E50037F48E3 +:10F41000F08149FFFC1C50037F48F08149FFFBF657 +:10F420005003011849FFFD0C50037F48F08149FF4C +:10F43000FD0A49FFFD0B5003012C49FFFBEA500375 +:10F440007F48F08149FFFBE8500303A849FFFBE731 +:10F4500050037F48F08149FFF73E5003017049FF98 +:10F46000F7375003031849FFF6B950037F48F0817E +:10F4700049FFF6B75003036C49FFF6AA50037F48D3 +:10F48000F08149FFF6A85003037C49FFF71B5003A6 +:10F490007F48F08149FFF719500303B449FFFCBFCF +:10F4A00050037F48F08149FFFCB73C1DFB823C0DB7 +:10F4B000FB9449FFCA7F500303D849FFFCFB50036C +:10F4C0007F48F08149FFFCF95003004849FFF91AD1 +:10F4D00050037F48F08149FFFBBD50037F48F08116 +:10F4E00049FFFCE250037F48F08149FFFBAA50032B +:10F4F0007F48F08149FFFB96FC81FC402E07EBFD25 +:10F50000E602E8062E77EB602E97EB62D5052E77A4 +:10F51000EB692E97EB6584C02E0028A7E2C0E80BAC +:10F5200080063C17F610804780698CC149FFB2B74E +:10F5300097B0D5F3FCC0FC4480E0F1843C0DFB4067 +:10F5400044127D6CF28549FFAD543C1DFB92840151 +:10F5500084C0AE083C1DFB778127AE0884013C6F58 +:10F56000FBA349FFC51CE6E9E902852885403C6FFD +:10F57000FB7880CA4C6480D44483F04A4410005520 +:10F5800010140000F18749FFF07140031C3784001C +:10F590003E07EC043C0DFB83F186F107A6018E0AC1 +:10F5A000E602E813101400004403F403A6005A0016 +:10F5B00001FD3C0DFB83842049FFD1BF84003C0F3B +:10F5C000FBB3840149FFAC44540480FF5084FFFF27 +:10F5D000F0872E17EC042E0028A7E2204EF2009DA3 +:10F5E0003C0DFBA35A0001045AA801F584203C1FDE +:10F5F000FBA32E07EC048C0196003E07EC042E279B +:10F60000EC042E0028A6E202E82D2E37EC04F206C8 +:10F610008A60B6FFCA0AF004F281F2828020F20505 +:10F6200096D8FA9484A1D51BF004F181F18244228A +:10F6300006DC802096D8FA9484A1490000752E0734 +:10F64000EC042E3028A6F10584A19AC3B6BFF5813B +:10F65000F582440206DC804196D8FA9449000064A1 +:10F66000D50D2E57EC04D80A2E0029145A0801078C +:10F6700044020520F10749FFB5402E0029145A081D +:10F6800001112E17EC042E5028A6D9193C1DFB772A +:10F69000AE084C6440152E07EBFD5A080311D50B3C +:10F6A0003C0DFB778421AE404C64400A2E07EC00F1 +:10F6B0005A0806063C0DFB778420AE402E00291424 +:10F6C0005A0801162E0028A72E57EC048E02D80FD8 +:10F6D0004C64400E2E07EBFDC80A84033E07EBFD89 +:10F6E0003C0DFB8349FFAE4449FFFF093C5DFBB382 +:10F6F0002E07EC048540D0073C0DFBB32E2028A636 +:10F7000040A100062E07EC042E5028A74C507F6322 +:10F71000854048FFFF608CC148FFFF2E840049FFF1 +:10F72000C43EFCC4FC593C6DFB2D4490003C048F4E +:10F73000803A02730016026300124261A4734432DD +:10F740000000FF9FFEFF0093000644700060F481FC +:10F7500004FF803C3C6FFB2A42349C734E830003C1 +:10F760008501E90285E150AF800851E18060812A7E +:10F77000A3D955C383FF13C4800041C3A80992F4E1 +:10F7800055CE03FF547383FF13C4800112748002AB +:10F790008D264C3F7FEF8780F3014DC180380233C7 +:10F7A0000014029300150A7500014044801396D995 +:10F7B000B69F03E500235A73FF139261886796D9B9 +:10F7C000F43B38708D11FFE44093BD3738700D1154 +:10F7D000FFEC4073A0F788E938710D095BE3FF1473 +:10F7E000B47FF43B9261887E96D938708D11FFE426 +:10F7F0004093BD3738700D11FFEC4073A0F788E9D6 +:10F8000038710D0951CE0001D5C8FCD9FC412E003C +:10F81000293444120000442230004442351044325E +:10F82000051049FFFE8A2E10287A2E47EB69B63F55 +:10F830002E10287B2E57EB60F1812E17EB6284008F +:10F8400081218AA43C0FFB843C0FFB733C0FFB74AB +:10F850002E77EB6597218020804044A230004482BF +:10F860000BFC3C301456E243E82F41E104084432DB +:10F870002A60406F0C00403F280041EF200002F159 +:10F88000800003EF000040F79DF6A4D841EF27D693 +:10F8900041E7F80141EF17D640319C764232787348 +:10F8A00096D9ACF02E30287A40F10FD6926140FF05 +:10F8B0000C07A4F05031FE3EE9038803D5028823EB +:10F8C0008C419691D5CFB47FF20144428BA0FE9C2F +:10F8D0004031080A8823904140108837501081C277 +:10F8E00088033C1FFB84400008172E10287B500023 +:10F8F00001C23C0FFB7394492E37EB6584004452E0 +:10F900008C38E001E80A3822810140210C56382267 +:10F9100001098C019601D5F62E07EBD6C8123E07D9 +:10F92000EBFD3C0DFB8349FFAD2344020BFC44126D +:10F93000000049FFBED244020BFC44123000D51730 +:10F9400084032E27EB6944428CC83E07EBFD2E173B +:10F95000EB622E07EB6080A43E27EB633E37EB6B38 +:10F9600049FFB3034402300044120BFC49FFBEB50B +:10F970004403F04A44100055AE40FCC1FC418401F0 +:10F980003E07EBC22E0029145A0801352E07EBE979 +:10F99000C0032E07EBFD3E07EBD684003E07EBC409 +:10F9A0003E07FF083E0004293E07EBFD3E07EBFA49 +:10F9B0003E07EB682E07EB602E20287B3E07EB63AB +:10F9C0002E07EB6284203E07EB6B949144028D5826 +:10F9D00049FFB3024402231084204420004849FF19 +:10F9E000B2FB440224C04410FFFF4420004849FFFA +:10F9F000B2F33C0DFB8384203C1FFB40A601F18148 +:10FA00003E07EC0049FFBFEB3C2DFB83F1015A0898 +:10FA100002098404AE11800249FFCF8F842DD507DF +:10FA20008409AE11800249FFCF88842A3C0DFB83F4 +:10FA3000AE413C0DFB8349FFAC9B2E0029145A08B4 +:10FA4000010449FFFD5C840849FFDD7B2E00291E6F +:10FA50005A08010449000468840C49FFDD722E60D5 +:10FA600029145A68013249FFB0D72E20287B44025E +:10FA70008CC88420949149FFB2AF2E20287B440289 +:10FA80008C388420949149FFB2A72E07FF08C8192B +:10FA90003C0DFB8349FFAC6C4412000044220BFC7C +:10FAA0004432051044423BFC2E00293449FFFD45F9 +:10FAB000840D3E67EBE749FFDD4449FFFEA9D51001 +:10FAC0002E00299DD5032E00293444120000442223 +:10FAD0000BFC4432051044423BFC49FFFD2E49FF1C +:10FAE000BF7E3C1DFB832E27EC005A0802069E12A7 +:10FAF000E602E804D5055A200204AE89D503840D38 +:10FB0000AE092E0029145A0001153C0DFB8349FF54 +:10FB1000AC2F840084233E07EBE53E07EBF73E075E +:10FB2000EBEB3E07EBC33E17EBB13E07EBC2FCC16C +:10FB300084C04490009044728DF42E0028A6E2C048 +:10FB4000E8E5441205204213247344028CC8442083 +:10FB5000004849FFBD9744200048421308249449B7 +:10FB600044028CC888278CC149FFBD8C97B0D5E66C +:10FB7000FC41B421003F8030009F802C0210801493 +:10FB8000B67F9649CA07021F8014AD00AD42AC4152 +:10FB9000FCC14031200954A1800144320000FE5FC5 +:10FBA000F1818781B43FE321E8EF44100058048FCE +:10FBB000800185E04284847380EF88E8842040607F +:10FBC000840995B254308001886640608C093823DE +:10FBD0008C089786403090095063004C94DA886610 +:10FBE0008867546080075AA8010901E180004065D8 +:10FBF000180C406F1804D508406E180C01E1800005 +:10FC0000FFB3406F18028C219648AF985A1825D937 +:10FC100084E25AF0010485E1D5D15014800154905A +:10FC200080FFD5C1FC4580E03C0DFB2DB63F812215 +:10FC3000B45F020000124410003C420104734462AD +:10FC40000000FE373C0FFB2A8009F382F48449FF51 +:10FC5000D781FE37F0854E930011F0028029844150 +:10FC6000B47F49FFD66B8421F0048041B47F49FF03 +:10FC7000D6658149FAD5D503FB5484C0B41F49FF2A +:10FC8000D785F083B41F001F80008C044000A41AA5 +:10FC90009600F086F00295B14080180040050408F7 +:10FCA000854080C8F087802A14AF8001542500FF6A +:10FCB000CA228009F189F28849FFD83AF208F1098D +:10FCC000C04F8009F188F28149FFD84644320000D4 +:10FCD000FE1F3C5DFB2D3C3C01E7F201F108DB031C +:10FCE000A53AD502A539F303A40040000C16F3068B +:10FCF000F381D519F107400504088801F104880152 +:10FD000002107FFF5A13FF2D3C0C01E73C5DFB2DD9 +:10FD1000D803A53AD502A538F005F303380005014C +:10FD200040000C162E37EBB22E57EBF051E1FFFEE0 +:10FD30009B04E0BE9723E86CE669E822C5395A5077 +:10FD40000146220300004E0400048400AC3022F37C +:10FD500000005EF78200E904440001FFAC308D41F1 +:10FD60008CC25AA825A55A900104480000E88420B6 +:10FD7000F0028041B47F49FFD5E1480000E03C0338 +:10FD8000F62A4E45000CCA06022400009A104800CC +:10FD900000C4A4B08802480000CFCA0602240000B4 +:10FDA0008802480000BAA4B09A10480000C5CA08EA +:10FDB000F30144223BFC38010D09480000AB44220A +:10FDC0003E6C38010509480000B5CA13F30144220E +:10FDD0003BFC38210D118A024E040003FE029603FB +:10FDE00040420096020400009B0412440000D5AA81 +:10FDF00044223E6C382105118A024E040003FE02A3 +:10FE0000960340420096A4308880AD30D59B4C5F6D +:10FE1000402CCA0E05EF800144F235103847F9092D +:10FE200002F400004E45001650F7FFFFD51440F0D5 +:10FE3000840845E230003847F80945E23E6C38074F +:10FE4000F8094E45000C02F3000050F78001D50A76 +:10FE500050F7800112F40000D50702F3000050F7BC +:10FE6000FFFF12F300008E614C51FF6D4E450045BF +:10FE7000CA11F20144023510380009114E04FF6323 +:10FE8000FE029603E0804EF3FF5E020400008E0146 +:10FE9000D5433C2C01E73C5DFB2D40F08408443207 +:10FEA0003E6CDA0F38278C118A024E040003FE02E2 +:10FEB0000223800D96C3E043E8111203800DD50E96 +:10FEC00038278C118A024E040003FE020223800CA4 +:10FED00096C3E043E8031203800C4402300038006C +:10FEE00005114E04FF30FE029603E0804EF3FF2B17 +:10FEF000A4308C01D520FF229723CA12F2014402BC +:10FF00003510380009114E05FF1EE0044EF2FF1BAC +:10FF1000020400008C011204000048FFFF14440298 +:10FF20003000380005114E05FF0EE0044EF2FF0BC5 +:10FF3000A4308E01AC3048FFFF06FCC5FC40EE78D3 +:10FF4000B63F814084208102B006442000B049FFC2 +:10FF5000FA6E8420442000C0B03249FFFA68840160 +:10FF600049FFC01D84013E07EBBE3C5DFB2D3C0CF0 +:10FF700001E7D0078400B43F3C0FFB4049FFA8399C +:10FF80003C1DFB928401467EFFFFAE083C1DFB77C3 +:10FF900084C050738FFFAE0884003E07EBF03C0D29 +:10FFA000FB2D8380B90C92309646F181BA0C441E29 +:10FFB000FFFFFE56B98C96304C64001549FFD5D42E +:10FFC00044120000FE0F8380B083B90C3C0FFB2A63 +:10FFD000923C964638130808B90C8CC1FE7EB98C49 +:10FFE000D5EB2E000432C8183C5DFB2D3C0C01E71C +:10FFF000D0043C0C01EFD8042E00296BD5032E0051 +:020000021000EC +:10000000296A469010003E07EBB28D2184C045C39B +:10001000F403480000A1840AD5F54403F04A4410D3 +:1000200000558F21AE404E92009F84003E07EC04A5 +:1000300084003C0FFBA349FFBCD25A0002044800D5 +:10004000009484012E17EBF03E07EBB444000080CF +:100050004000040E9601C80284013C0BF62A3C5D68 +:10006000FB2D3C0C01E74C50009249FFBCB85A00F4 +:1000700002044800008C3C0C01EF3C5DFB2D4C5011 +:1000800000863C0DFB2DA1C692EA97EF2E07EC04EB +:10009000E207E84E3C0DFBA35A000104480000941F +:1000A0002E07EBB22E17EBF08E01E0204EF30092FC +:1000B00084003C0FFBA32E07EC043C5DFB2D8C0160 +:1000C00096003E07EC043C0C01E54C5040A72E077F +:1000D000EBE95A000104480000A12E07EC042E5061 +:1000E00028A64C50409B2E27EBFD4E2300972E0058 +:1000F00029145A000104480000912E0029265A00B4 +:1001000001044800008B4402052044128DEC49FF95 +:10011000AA9A49FFBC645A0802753C03FF7F3C1051 +:1001200014CCE220E86884013E07FF0884C02E0753 +:10013000EBF03C1C01E73C5DFB2D8C013E07EBF036 +:100140002E07EBB24C50C0B72E57EBF0D804840208 +:100150003E07EBBE2E07EBBE5A08010448FFFF5FC7 +:10016000480000B5D5002E07EBF04E03FF6C3C0DA8 +:10017000FB865A0804058409100500013C0DFB8329 +:10018000842049FFCBDA48FFFF5E84003C0FFBB3BD +:100190004403F04A44100055AE40000E00005A00DF +:1001A00001FE000500015A0809073C0DFB8384206D +:1001B00049FFCBC3840149FFA64B84013E07EBB442 +:1001C00048FFFF615A60010448FFFF6248FFFF6A71 +:1001D0002E07EC042E5028A64C507F6C3C0C01E7F7 +:1001E0003C5DFB2D4C503F663C0DFB778421AE40BF +:1001F00048FFFF603C03FF812E1029A3E220E99411 +:1002000049FFBBED5A00020A3C2014CC3C13FF7F8F +:100210008403FE14E001E9882E07EC0449FFD57A37 +:100220005A0001073C0C01E73C5DFB2DD8302E073E +:10023000EC0449FFD563B61F2E07EBB22E57EBF047 +:100240008E01D81549FFBBCB5A0802123C0C01E7BE +:100250003C5DFB2DD80C3C0DFB778421AE40840D1A +:10026000100500013C0DFB8349FFA88244029770F2 +:10027000B43F8440B0C6B13249FFFCD64402977007 +:10028000B43F8441B0C6B13249FFFCCE3C5DFBB304 +:100290002E07EC0484C0D0072E07EC042E6028A69D +:1002A000406300062E57EC044C53FEF284C048FF16 +:1002B000FEEF2E17EBFD4E13FF492E17FF084E12CF +:1002C000FF453E07EBF048FFFF41840049FFBE6752 +:1002D0003C2DFB2DF001838240104008BB0C440EE6 +:1002E000FFFFFE1EFE0F467EFFFFB88C84C05073DA +:1002F0008FFF96304C64001649FFD436441200003C +:10030000FE0FB0438380381304003C0FFB2A96464F +:100310004020F008B90C8CC1FE7EFE57B98CD5EA9E +:10032000ED88FCC0FC432E000432C8142E00296A5C +:100330005A000A073C9014B63C7014B7D5044470B8 +:10034000010081272E00296B5A000A0A3C6014B86C +:10035000D5084460010080E68126D5034460010091 +:100360003C0014B23C4014B0B61F8400F0812E0053 +:1003700028A53C5014B180678540F08244127D6C02 +:100380004402977080493CA804003CA8040149FF3E +:10039000FBF13C0DFB8344127D6C2E2028A749FF06 +:1003A000FDCF840949FFD8CD2E0029145A08013BFE +:1003B0002E8029265A8801372E07FF08C0332E17B2 +:1003C000EBFDC930F1853EA004283E80042949FF99 +:1003D000B012F105840A3C1E01063E8004283E80CE +:1003E00004273EA7EBE749FFD8AC3C0014B2F10567 +:1003F000B61F2E0028A5F181F08244127D6C4402C4 +:10040000977080493C4014B03C5014B1806749FF5C +:10041000FBB13C0DFB8344127D6C2E2028A749FFC5 +:10042000FD8F49FFBADC3C1DFB835A080209840595 +:10043000AE098001842049FFCA80D5038409AE0932 +:100440003C0DFB8349FFA794840B49FFD87A3C00FD +:1004500014B284EAB61F840B3C4014B03C5014B173 +:10046000F08244127D6C4402977080468066F7816A +:1004700049FFFB803C0DFB8344127D6C844149FFA6 +:10048000FD5F84003E00043249FFBAA95A08020603 +:10049000842D3C0DFB83D50C3C0DFB83842049FF50 +:1004A000CA4C2E17EC003C0DFB835A100204AE41DF +:1004B000D502AFC13C0DFB8349FFA75AFCC3FC002A +:1004C0003C1DFB928402AE083C1DFB77AE08840104 +:1004D0003C0FFB40440000A249FFD8293C0DFB83A0 +:1004E000A6015A080D128400847F3C2DFB87843FAF +:1004F000383100088C065A083CFA3C0DFB87101076 +:10050000003C1010003D49FFCE633E0004052E0064 +:10051000288384C0520000013E67EBAF49FFC80347 +:100520003E60040649FFC3A9FC803C0C01E50200C3 +:100530000016DD9E3C0DFB2D02000015DD9E3C0CDF +:1005400001E5DD9EA44044020000FE0F3C0E01EBDD +:10055000DD9E3A6FA6BC3C1DFFDEA1440220801A3E +:100560002E17EB915A1801082E20287B0430000B1F +:100570009491D50280653C13F6173C43F616E224AD +:10058000E9073C6DFB563C7DFB578420D5568C21FA +:1005900096493C1BF6175A10010580038420D53379 +:1005A0008400443FFF804440007F9641E222E87A85 +:1005B0003C1DFB56383080083C1DFB5738408008F6 +:1005C0008C01D5F43C6DFB563C3DFB572E57EB910F +:1005D00038430410383184105A580106A540976BEF +:1005E00090A2AD40A540976BE085E911A540976BBF +:1005F000E0A3E918384304083C4DFB578C0238321D +:1006000004088C2196C9E262E9DED54CA500972347 +:100610005EF20080E804A5009723D5E94440007FFE +:10062000D5E6A4C096DB5EF1FF81E904A4C096DBA9 +:10063000D5E2443FFF81D5DF96C9E262E813384333 +:1006400004103833840040422008FF1F94C94092B0 +:100650008C008C2112448000049000058869AD183C +:10066000D5EC84C03E67EB863E67EB7C49FFDE52EB +:100670002E07EB915A0801143E07EBBB84203C0D7A +:10068000FB833E67EBF649FFD1703C0DFB8384236F +:10069000AE4149FFAE85840049FFC4AA84003E07ED +:1006A000EB913A6FA684DD9E2E17EB925A182546E1 +:1006B0003C2DFB2D84203E17EB92023100123E1799 +:1006C000EB8C44120000FE5FB4623A6F98BC9263F8 +:1006D0003C1FFB2A96F73C5DFFDE8440FAC80212FD +:1006E000801AE241E80DB480945188818C41A46065 +:1006F0009691FE7440108C379649AC60D5F149FF55 +:10070000DE0984003E07EB7C3E07EB803E07EB846E +:1007100049FFE15B840049FFC45A2E07EBF984814D +:100720002E17EBEF44527D6C2E27EBB33A6F988473 +:100730002E37EBD548FFAB14DD9E3A6FAABCEFF421 +:10074000840044529518843F444295304432953C8D +:100750004422952438128008381200083811800885 +:10076000381100088C0144A29518448295304462E7 +:10077000953C447295245A0809EF85202E07EB9387 +:10078000E320E8453C13F61A4402000041C080040F +:1007900050048001549000FF80293C03F61549FF66 +:1007A000ACDD842C43C00473803C8440B4015A20E7 +:1007B000022294D240540C00848054F0000792032B +:1007C0005AF80204389290088C815A4804F8A50916 +:1007D000886A84005452000792835A580204389160 +:1007E00080088C015A0804F88C418C245A2803E0B4 +:1007F000D5C6541000075A1802043E9005B0921056 +:1008000096175A0802BD3E900598D5B985208508EF +:100810002E07EB93E320E850800949FFD060814028 +:100820003C0DFB2D45C20000802A0230001540001F +:10083000700496D9F38149FFAC91F301842C4031C7 +:10084000F004423004738400B4435A00022195023C +:10085000972084205451000792435A580205994C1E +:100860003853A8088C2196485A1804F6A499842075 +:100870005451000792435A580205994C385328089E +:100880008C2196485A1804F68C64D50D5411000733 +:100890005A1802043883A808925096975A280204DE +:1008A000388328088C0196005A0803D05004800130 +:1008B000549000FFD5AEEC0C3A6FAA84DD9E3A6FDF +:1008C000AABCEFFC850084C1812180E28383814042 +:1008D0003E67EB843E87EB923E87EB8B49FFFE271A +:1008E0003C0BF61449FFFE2D3C0BF61549FFFE2488 +:1008F0003C0BF61A3E87EB8C3E87EB855A78030853 +:1009000084013E67EB8049FFC362D5228421804188 +:1009100080614400FBA03E67EB8E49FFC01D84410F +:100920008062441000FA44001CA049FFC0158441B5 +:100930004400D9B0FA20806249FFC00E5AA8AD0524 +:100940003E67EB85D5055AA8AE043E67EB8B500594 +:1009500000559600E602E8068404490007FA3EA71F +:10096000EB7E54048002C01C5A90030445C15C0015 +:10097000801C441262004420140049FFEF534400DD +:1009800002EE49FFC7BD5A7803074402622049FFBF +:10099000FDDBD50F4402622449FFFDD6D50A49008C +:1009A00007B84E92FFF25A980105801C49FFFDCC12 +:1009B0002E07EBF984812E17EBEF44527D6C2E2726 +:1009C000EBB32E37EBD549FFA9CB3C0DFB2DA00691 +:1009D000920A962F3E07EB935A780307EC043A6F7E +:1009E000AA8448FFFEACEC043A6FAA84DD9E3C3D2D +:1009F000FB2D44120000FECF3A6FAABC0421800CEC +:100A0000460FE03F50000FFFFE1646200AC0FE17BB +:100A10001401800C0401800C462800009407920702 +:100A2000FE17EFEC1401800C84408081446FF8FFC6 +:100A3000445FC7FF020180124482000088028804DC +:100A40005021003CA045FE7658108100A845A045E5 +:100A5000FE6EA8455A2A58F00201801285EC8808DB +:100A6000446FFFC7A645020180154200BC73880889 +:100A70008438B440444FFE3FFE8E58210004B640F7 +:100A8000B440467FFC7FFEB658210020B640B440FB +:100A900046900200FEA658210100B640B440444FE3 +:100AA000F1FFFEA658210800B640B4A04428FFFF7D +:100AB000FF564052A004B6A0B4A050438FFFFF667B +:100AC0004052A404F481B6A0B4A0467FE3FF504393 +:100AD0008FFFFF6646701000FF7FF482B6A0B4A0BF +:100AE00046AF1FFF50450FFF47C08000FF664052D2 +:100AF000F004F483B6A0A141444FFE3FFF4E58528C +:100B00008004A941A14147E04000FF76585280206F +:100B1000A941A141FF6658528100A941A141444F1A +:100B2000F1FFFF6658528800A941A14140A2880206 +:100B30004454000040A5140414A0000104A00001C6 +:100B4000F40140A5100240A5240414A0000104A053 +:100B50000001F40240A5100240A51C0414A00001ED +:100B600004A00001F40340A5100240A5700414A0E5 +:100B7000000104A00002444FFE3F40A5040258A516 +:100B8000000214A0000204A0000240A5080240A533 +:100B9000140414A0000202A180124402004138A0F3 +:100BA00028000201801542053C738808B54040A525 +:100BB000040258A50004B740B54040A5180258A546 +:100BC0000020B740B54040A5100258A50100B7402D +:100BD000B540444FF1FF40A5100258A50800B740AA +:100BE000B54040A5080240A51404B740B540F40143 +:100BF00040A510024640010040A51004B740B54092 +:100C0000F40240A5100240A51C04B740F403B5400F +:100C100040A5100240A57004B74004A00001444F55 +:100C2000FE3F40A5040258A5000414A0000104A042 +:100C3000000140A5180258A5002014A0000104A03E +:100C4000000140A5100258A5010014A0000104A055 +:100C50000001444FF1FF40A5100258A5040014A064 +:100C6000000104A0000140A5080240A5140414A03E +:100C7000000104A00001F40140A5100240A52404D5 +:100C800014A0000104A00001F40240A5100240A538 +:100C90001C0414A0000104A00001F40340A51002EC +:100CA00040A5700414A0000104A00002444FFE3FC0 +:100CB00040A5080240A5140414A0000204A00002EC +:100CC00040A5040258A5000414A0000202A180124D +:100CD0004402007D38A028000201801542053C73C3 +:100CE0008808B54040A5040258A50004B740B540A7 +:100CF00040A5180258A50020B740B54040A51002F5 +:100D000058A50100B740B540444FF1FF40A510027F +:100D100058A50800B740B54040A5080240A51404F6 +:100D2000B740B540F40140A5100240A52404B740E7 +:100D3000B540F40240A510024640080040A510044A +:100D4000B740B540F40340A5100240A57004B74079 +:100D500004A00001444FFE3F40A5040258A5000432 +:100D600014A0000104A0000140A5180258A500200D +:100D700014A0000104A0000140A5100258A50080A5 +:100D800014A0000104A00001444FF1FF40A510028F +:100D900058A5080014A0000104A0000140A5080205 +:100DA00040A5140414A0000104A00001F40140A512 +:100DB000100240A5240414A0000104A00001F402C4 +:100DC00040A5100240A51C0414A0000104A00001CD +:100DD000F40340A5100240A5700414A0000104A073 +:100DE0000002444FFE3F40A5080240A5140414A091 +:100DF000000204A0000240A5040258A5000414A0AB +:100E0000000202A18012440200B938A028000201A9 +:100E1000801542053C738808B54040A5040258A5DA +:100E20000004B740B54040A5180258A50020B740BF +:100E3000B54040A5100258A50100B740B540444F49 +:100E4000F1FF40A5100258A50800B740B54040A5E5 +:100E5000080240A51404B740B540F40140A51002B3 +:100E600040A52404B740B540F40240A5100240A5B7 +:100E70001C04B740B540F40340A5100240A5780417 +:100E8000B74004A00001444FFE3F40A5040258A50E +:100E9000000414A0000104A0000140A5180258A5F8 +:100EA000001014A0000104A0000140A5100258A5E4 +:100EB000010014A0000104A00001444FF1FF40A56F +:100EC000100258A5080014A0000104A0000140A5CC +:100ED000080240A5140414A0000104A00001F401BC +:100EE00040A5100240A5240414A0000104A00001A4 +:100EF000F40240A5100240A51C0414A0000104A0A7 +:100F00000001F40340A5100240A5700414A00001E4 +:100F100004A00002444FFE3F40A5080240A514046F +:100F200014A0000204A0000240A5040258A5000479 +:100F300014A0000202A18012440200F538A028008B +:100F40000201801542053C738808B54040A50402A3 +:100F500058A50004B740B54040A5180258A5002088 +:100F6000B740B54040A5100258A50100B740B540B4 +:100F7000444FF1FF40A5100258A50800B740B54006 +:100F800040A5080240A51404B740B540F40140A5AF +:100F9000100240A52404B740B540F40240A5100259 +:100FA00040A51C04B740F403B54040A5100240A57D +:100FB0007004B74004A00001444FFE3F40A5040266 +:100FC00058A5000214A0000104A0000140A51802C9 +:100FD00058A5002014A0000104A0000140A51002A3 +:100FE00058A5010014A0000104A00001444FF1FF26 +:100FF00040A5100258A5080014A0000104A000019B +:1010000040A5080240A5200414A0000104A000018E +:10101000F40140A5100240A5240414A0000104A07E +:101020000001F40240A5100240A51C0414A0000118 +:1010300004A00001F40340A5100240A5700414A010 +:10104000000104A00002444FFE3F40A5080240A555 +:10105000140414A0000204A0000240A5040258A534 +:10106000000414A0000202A180124402013138A041 +:1010700028000201801542053C738808B54040A550 +:10108000040258A50004B740B54040A5180258A571 +:101090000020B740B54040A5100258A50100B74058 +:1010A000B540444FF1FF40A5100258A50400B740D9 +:1010B000B54040A5080240A51404B740B540F4016E +:1010C00040A5100240A52404B740B540F40240A555 +:1010D000100240A51C04B740B540F40340A510021F +:1010E00040A57004B74004A00001444FFE3F40A556 +:1010F000040258A5000414A0000104A0000140A5AA +:10110000180258A5002014A0000104A0000140A569 +:10111000100258A5010014A0000104A00001444FD2 +:10112000F1FF40A5100258A5080014A0000104A07A +:10113000000140A5080240A5140414A0000104A069 +:101140000001F40140A510024640010040A5100432 +:1011500014A0000104A00001F40240A5100240A563 +:101160001C0414A0000104A00001F40340A5100217 +:1011700040A5700414A0000104A00002444FFE3FEB +:1011800040A5080240A5140414A0000204A0000217 +:1011900040A5040258A5000414A0000202A1801278 +:1011A0004402016D38A028000201801542053C73FD +:1011B0008808B54040A5040258A50004B740B540D2 +:1011C00040A5180258A50020B740B54040A5100220 +:1011D00058A50080B740B540444FF1FF40A510022C +:1011E00058A50800B740B54040A5080240A5140422 +:1011F000B740B540F40140A5100240A52404B74013 +:10120000B540F40240A5100240A51C04B740B5400B +:10121000F40340A5100240A57004B74004A00001EB +:10122000444FFE3F40A5040258A5000414A000014D +:1012300004A0000140A5180258A5002014A0000138 +:1012400004A0000140A5100258A5010014A000014F +:1012500004A00001444FF1FF40A5100258A508006A +:1012600014A0000104A0000140A5080240A5140438 +:1012700014A0000104A00001F40140A5100240A543 +:10128000240414A0000104A00001F40240A51002EF +:101290004640080040A5100414A0000104A000016D +:1012A000F40340A5100240A5700414A0000104A09E +:1012B0000002444FFE3F40A5080240A5140414A0BC +:1012C000000204A0000240A5040258A5000414A0D6 +:1012D000000202A18012440201A938A028000201E4 +:1012E000801542053C738808B54040A5040258A506 +:1012F0000004B740B54040A5180258A50010B740FB +:10130000B54040A5100258A50100B740B540444F74 +:10131000F1FF40A5100258A50800B740B54040A510 +:10132000080240A51404B740B540F40140A51002DE +:1013300040A52404B740B540F40240A5100240A5E2 +:101340001C04B740F403B54040A5100240A570044A +:10135000B74004A00001444FFE3F40A5040258A539 +:10136000000414A0000104A0000140A5180258A523 +:10137000002014A0000104A0000140A5100258A5FF +:10138000010014A0000104A00001444FF1FF40A59A +:10139000100258A5080014A0000104A0000140A5F7 +:1013A000080240A5140414A0000104A00001F401E7 +:1013B00040A5100240A5240414A0000104A00001CF +:1013C000F40240A5100240A51C0414A0000104A0D2 +:1013D0000001F40340A5100240A5780414A0000108 +:1013E00004A00002444FFE3F40A5080240A514049B +:1013F00014A0000204A0000240A5040258A50004A5 +:1014000014A0000202A18012440201E538A02800C5 +:101410000201801542053C7388088148B50046FFEB +:10142000FE3F4084040258840002B700B50050F724 +:101430008FFF4084180258840020B700B500408414 +:10144000100258840100B700B500444FF1FF4084FA +:10145000100258840800B700B50040840802408498 +:101460001404B700B500F401408410024084240441 +:10147000B700B500F4024084100240841C04B70099 +:10148000B500F4034084100240847004B700048067 +:101490000001444FFE3F408404025884000414803D +:1014A0000001048000014084180258840020148048 +:1014B000000104800001408410025884010014805F +:1014C000000104800001444FF1FF40841002588461 +:1014D0000800148000010480000140840802405488 +:1014E0001404A941A141F401FF664092A4041490A0 +:1014F0000001A141F402449F8FFFFF66FFEFA9C1E5 +:10150000A141F403FF664052F004A941A142444FB7 +:10151000F1FFFF4E58528004A942A142FF564052AB +:10152000A804A9420201801240002804A607020173 +:10153000801844026CACA14192AB4052AC085852A6 +:10154000805FA941A14492AF4052BC085852805FCD +:10155000A944A1C4465C000750528FFFFF7E46702D +:1015600002F8FF7FA9444450005F10500019047036 +:101570000010FFF6147000101050001B04700010D3 +:10158000FFE6147000104470005E1070001C0480B0 +:101590000010444C7FFF408424021480001010701F +:1015A000001D048000104084100214800010107090 +:1015B000001E04800010444FFE3F40843C02148013 +:1015C00000101070001F05E00010468FF1FF5084DE +:1015D0000FFF41EF200215E000101050002405E03D +:1015E000001141EF100215E000111050002505E038 +:1015F0000011444FF1FF41EF100215E000111050AF +:10160000002605E00011444C7FFF41EF240215E065 +:1016100000111050002705E0001141EF100215E005 +:1016200000111050002805E00011444FFE3F40FF1C +:101630003C0214F000111050002904F0001147E0A2 +:1016400005F04087A002148000111050002A04F019 +:101650000011468F8FFF50840FFF4087A002148037 +:1016600000111050002B04F00011468C7FFF5084B5 +:101670000FFF4087A002148000111050002C04803E +:10168000001246F8000F408404021480001210502B +:10169000002D0480001250F78FFF40841802148040 +:1016A00000121050002E048000124084100214809A +:1016B00000121050002F04800012444FF1FF4084AC +:1016C0001002148000121050003004800012444CAC +:1016D0007FFF4084240214800012105000310480E7 +:1016E0000012408410021480001204800014930F32 +:1016F00040843C085884005F148000140480001467 +:1017000040843C0240847804148000140480001556 +:10171000930F40843C085884005F148000150480B7 +:10172000001540F43C024087F80414800015105066 +:1017300000590480002040841802148000201050BA +:10174000005B04800020F40140841002148000201B +:101750001050005D04800020444FF1FF40841002CF +:10176000148000201050005F04800020F4034084A7 +:101770001002148000201070006004800020444F8C +:10178000FE3F408424021480002010700061048019 +:10179000002140840402148000211070006204F0D3 +:1017A00000204688FFFF50840FFF40F7A00214F08E +:1017B00000201070006304F0002140F7880214F04C +:1017C00000211070006404F000214067980214604A +:1017D00000211070006504600021FFA61460002144 +:1017E0001070006604600021F401FFA6146000215F +:1017F0001070006704600021F402FFA6146000214D +:101800001050007004600022444FFE3FFFA6146099 +:1018100000221050007104600022444FF1FFFF3697 +:10182000144000221050007204400022F602FF36DD +:10183000144000221050007304400022F503EC1401 +:10184000FF2E144000221070007404400023FE6636 +:101850001410002310700075041000224010A40220 +:10186000141000221070007604100023FE8E142045 +:10187000002310700077041000224010A002141002 +:10188000002202018018880AA042922F4010BC0852 +:101890005810811CA842A043922F4010BC08581039 +:1018A000811CA84384201210000A1210000B0201B0 +:1018B00080124410003C400028040020000802016F +:1018C0008017420104738940460FF3FF0415000599 +:1018D00050000FFFFE0E46100800FE0F1405000515 +:1018E00004150005460F3FFF50000FFFFE0E40009D +:1018F0007004140500050405000546180000940254 +:101900009202FE0F140500053A6FAA84DD9EFC20AA +:101910003C0C00BF441FFFCC4463F04A1010005140 +:1019200084003C0FFB78447000553C0C00BF000065 +:1019300000515A00BB06AFF049FFE6B0D5F74400AE +:10194000003249FFBFDD84003C0FFBAFFCA08421C7 +:101950003E17EB813C1C00BF8801002000523C2B4D +:10196000F61C001000534010A00888223C1BF61CF7 +:10197000001000543C1BF61B0000005540002008DE +:1019800088013C0BF61BDD9EFC003C1C00BF840163 +:101990003E07EB860020805284003C0BF617840A39 +:1019A000FE143C0BF616000080515A08AB05840269 +:1019B00049FFFFCFFC80FC4184C081209FD13C6F58 +:1019C000FB7844A3F04A44800055E0E6E918F18131 +:1019D0001085000049FFF0A898F79061F1014C6371 +:1019E000C00538548E02D11138548E02941AE22563 +:1019F000E9088809A001E220E806D107841FD5067E +:101A00009FD9D5E49D99D5E28003FCC1FC40852097 +:101A100080C33C4DFFC9804180E98069855B8505B5 +:101A2000B4A240F2A802E80F5A50060E04F10009D1 +:101A3000A1423852BD0100F2000640F79406E803C7 +:101A400010830002B4A250F2FFFF5CF78002E903AA +:101A50005A58041B2251000502F2001EE0AFE9149F +:101A600002F2001F40F79407E90F2251000402F22E +:101A7000001CE0AFE90902F2001D40F79407E904F9 +:101A80008CE197F881238C6196D8502101085A384F +:101A90000AC92E87FF53CF038400D51AA6325A00F5 +:101AA000051984035A78011550047FFFE602E80502 +:101AB0002E57FF504C54FFF244000108421480732B +:101AC00084012220800422108005AE32D504AE327B +:101AD00084208041A6325A0801593C5DFFC7A6E820 +:101AE0005A3801093C3DFFC8023180098E619A9A3B +:101AF0009693A6E95A3801093C3DFFC80231800A95 +:101B00008E619A59964BA6EB01E280025A38013950 +:101B10003C5DFFC80232800950F1FFFF4FE3001A1D +:101B2000A4EA51E1FFFF846240A78D5642A1787379 +:101B300040253C5702A2800AA56B8F418EA14035FB +:101B40000C76423094734011A8379693964BD51D6E +:101B5000A4EB85428E6140A7A95642A10C73402593 +:101B60003C5702A2800AA56A8F4184628EA140354B +:101B70000C76423094734011A8379693964B5BE8ED +:101B80000105806280418023E705E81844F0E230D7 +:101B90003887A00040F43C00DD0F060C0C161C003A +:101BA0005A08010BD5105A00010CC80C8403D50B40 +:101BB000E602E808D503C806D5068400D5048402E9 +:101BC000D50284043E07FF538E01E60484604EF282 +:101BD00002A944F0E2783807810140F03C004A0055 +:101BE0003C0008006600CC01380584603C3FFFD211 +:101BF0003C3FFFD1846184003C3FF9F8443FFFAA99 +:101C00003C0BFFA63E07FF523E07FF513E37E7E47D +:101C10003C2BFFA03C1BFFA13C2BFF9E3C1BFF9FCE +:101C20003C2BFF9C3C1BFF9D3C2BFF9A3C1BFF9BCE +:101C30003C2BFF983C1BFF993E07FF2E3E97FF5021 +:101C40003E07FF2C480002702E07FF2E0232001ABA +:101C5000E203E8048C013E07FF2E3CF7FF9A3C2B81 +:101C6000FF98E04F3C1BFF99E8043C2BFF9AD507F7 +:101C70003C07FF9CE002E8033C2BFF9C3CF7FF9BEA +:101C8000E02FE8043C1BFF9BD5073C07FF9DE001CC +:101C9000E8033C1BFF9D3C07FF9E9B424E54000304 +:101CA000FF6A3C37FF9F9A194E040003FE02880525 +:101CB0005EF000B0E90484013E07FF2C3C97FFA0D2 +:101CC000400488014E040003FE023DE7FFA1403FAF +:101CD00004014E340003FEDA02A200059958E345E0 +:101CE0004EF20222A5662E87FF51E205E90CE122A1 +:101CF000E805585400028540D50854540001854039 +:101D00008521D50480A885428520A527E264E90EB7 +:101D1000E03EE80458528001D509974E50448001B6 +:101D20009768549200FF58A500013C4DFFD188648C +:101D30003C3FFFD13C3DFFD288033C0FFFD25A9875 +:101D4000020E2E07FF52C81D84013E07FF523C0DB4 +:101D5000F9F894023C0FF9F8D5255AA803132E0779 +:101D6000FF52C80F3C0DF9F89402580000023C0FD6 +:101D7000F9F884013E07FF5284023E07FF51D51255 +:101D80004C5400112E37FF52E667E80C3C0DF9F871 +:101D90008C619402FE2F3C0FF9F83E37FF523E57FC +:101DA000FF513C2BFFA03C1BFFA1480001BD2E07AB +:101DB000FF523C3DFFD1E6033C0DFFD2E8453C57C6 +:101DC000FF9E0212000CE0A1E93D0212000DE02589 +:101DD000E9393C17FF9F0222000EE022E93302227C +:101DE000000FE041E92F3C27FF998A410212000BC6 +:101DF00052F08000E04FE8070212000AE201842955 +:101E0000E916D508E022E8060212000AE201842A57 +:101E1000E90E3C17FF98022200088A25FF52E025B0 +:101E2000E80902120009E261E80F842B3E17E7E49B +:101E3000D50BE041E80902120009E261842CE9F7C0 +:101E4000D5038422AE72021200108803E2204EF203 +:101E500000EE2E07E7E45A00AA04480000E83C0719 +:101E6000FF9E02120011E0014EF300DF0212001289 +:101E7000E0204EF300DA3C07FF9F02120013E0015E +:101E80004EF300D302120014E0204EF300CE4402C1 +:101E900077703C1DF9F84420003849FFFD8E5A0F39 +:101EA000FF04480000BD4410DF94380080003C1D52 +:101EB000FFC93E07E7E45A0821203C27FF993C0769 +:101EC000FF9FE040E8038406D57B8A024E040003AE +:101ED000FE024430006442200C243CF7FF9B3C0788 +:101EE000FF9D8A0F400100160020802B9603E040E2 +:101EF0008400E966D5E95A0822363C27FF983C075A +:101F0000FF9EE040E9E18A024E040003FE024430F5 +:101F1000006442200C243CF7FF9A3C07FF9C8A0F88 +:101F2000400100160020802D9603E040E9193C078F +:101F3000FF9F3C27FF998A024E040003FE024430B3 +:101F4000006442200C243CF7FF9B3C07FF9D8A0F56 +:101F5000400100160020802E9603E040E8B584077B +:101F6000D52F5A0802303C07FF9B3C47FF9D3CF7AA +:101F7000FF9A8A803C07FF9C8A0F4E040003FE02F2 +:101F800044200064FE140030803040001016960398 +:101F9000FE9CE040E9133C07FF9F3C27FF999A8293 +:101FA0004E240003FE9244300064FE9C4001101653 +:101FB0000020802F9603E040E805440FFFAA3E076B +:101FC000E7E42E07E7E4C8323C07FF9A3C47FF9C52 +:101FD0003CF7FF9B8A803C07FF9D8A0F4E0400035D +:101FE000FE0244200064FE140030802C40001016D5 +:101FF0009603FE9CE040E9133C07FF9E3C27FF98B8 +:102000009A824E240003FE9244300064FE9C4001FC +:1020100010160010802A9603E020E808440FFFAA5B +:102020003E07E7E4D5038402AE322E47E7E43C0DD9 +:10203000FFC95CF20020E811A440A4C14010C00810 +:1020400040208C045212001F4011040E9646C90510 +:10205000441FFFAA3E17E7E4A440922C9646C163B2 +:102060002E17FF2F5A18012A2E27FF2E0210001AB2 +:10207000E241E8232E27FF2D0210001BE241E81D5C +:102080002E17FF2CC91A3C17FF983CF7FF9402202B +:1020900000198A2F4E140003FE4AE022E80E3C1776 +:1020A000FF993CF7FF958A2F4E140003FE4AE02269 +:1020B000E80484233E17E7E42E27E7E484203E1754 +:1020C000FF2D5A2003313E17FF2F2E17FF2CC92B4F +:1020D0003C17FF990220001EE022E91D0220001F8C +:1020E000E041E9193C27FF980230001CE043E91366 +:1020F0000230001DE062E90F2E37FF2E0200001AA9 +:10210000E260E81184013E07FF2F3C2BFF943C1B4B +:10211000FF95D5098402AE32D5063E37FF2FD50391 +:102120003E37FF5384003E07FF543C2DFFC93C035C +:10213000FFA6C70EA454E201E8038C01D521840157 +:102140003E07FF548404AE323E07FF53D51B2E17C3 +:10215000FF2F5A18010E2E17FF2D0231001BE2230C +:10216000E8058C213E17FF2DD5033E77FF2FA454A1 +:10217000E201E905440FFFAA3E07E7E484003C0BB7 +:10218000FFA62E27E7E45CF10020E8198C4C96901E +:102190008401E65FAE30AEB18401E903FA2ED502C8 +:1021A000802249FF9817840349FF981A84003E074C +:1021B000FF53440FFFAA3E07E7E4D5038400AE3087 +:1021C000FCC0FC413CADFEF4224080002250800166 +:1021D00000150017F281B63F4410010842018473D4 +:1021E000B5000075001645C28A7444628A444412E0 +:1021F0008624449285E85A800107000000EAC8035B +:102200005A88031D840038030E0A44628A14384039 +:102210008E0938730E0A446289E4380E0E0A387348 +:102220000E0A959A8826AD494412861838008C0803 +:10223000840138048E0A480000E438048E028C01C0 +:10224000E407E902840638048E0A38030E02449239 +:102250008A44E405E8038C01D502840038048E0A20 +:10226000380E0E02C80A38030E025A080507440247 +:102270008A74852138900E0A38030E02852C80C39B +:102280004260247338409A0995B2882645E289E471 +:10229000AD4944128A1444F2862438608E02386FA5 +:1022A0000E0A4E07000951E07FFF8043422F24733E +:1022B0008122D5035091803C39E7A61140948808CB +:1022C000892F404F100122948001405494014E44C4 +:1022D0000003FF224E540003FF6A0295000D88A4FC +:1022E000E3258089E9060245000CE2A44042BC1ABD +:1022F000B45FE0C2E804225F8000D5069D71976B51 +:10230000E4A6E90284A638FE0E02E90438708E0ABB +:10231000D5128F04E702E90F02F5000C40829C0100 +:1023200040A23C01424428248B2F404224979B2CFE +:1023300038408E0A38408E0285438046422510730D +:10234000808285E48C8240423C96E0C444928A14A8 +:1023500038408E0A44A28618E81138450C00508394 +:1023600000018C819720E10438450C08E80438848A +:102370008E0AD50438648E0AD504848038450C084A +:1023800038608E0244428A14E0C7E80438720E0AAC +:10239000D505E0A6E80338520E0A444285E83850D5 +:1023A0008E0238420E02E085E80544528A14384213 +:1023B0008E0A84A038908E0280C58085447286245F +:1023C000854C4C5480138023421028733883861127 +:1023D000944A882788882210800188C1C0038E0112 +:1023E000D50284058CA1D5EE842240028416888013 +:1023F000880640421496405014B69723976BF0011C +:10240000AD00AD41FCC1FC4144600108420198733C +:1024100044528588444285B8B4C022A080002280FE +:102420008001F28138720E0238128E0283855A6062 +:102430000105000000EAC00B44028558842038A240 +:102440000E0A388E0E0A38100E0AD5535A68030742 +:1024500038A20E0A38828E0AD54C963B40650001A0 +:10246000964B4E640003FFB2405404014E540003E7 +:10247000FF6A3C7DFEF488C54452855838628E0A56 +:102480000253800EE0C5E8310093801E83C550746E +:10249000FFFF43E398734272A4244023F801FE54E3 +:1024A000421F207340109C36381E0E0A441293E8D7 +:1024B00038108C008E24E626E80E401488085090D0 +:1024C000FFFF956A4254987395FC9A7DFE0C420278 +:1024D000A873D5068022FE448001420F2873407005 +:1024E0001CF638720E0AD50538A20E0A388E0E0A6E +:1024F000F10138020E02AC084402858838000E0251 +:10250000AC09FCC1FC405050006050900AB08400FF +:10251000804084C2848384E10032FFC054F1800192 +:102520000432FFE8E816C3150432FFF104A0800569 +:1025300094DA886A00F18000A6D9E9065A301119A8 +:102540001472FFFFD5195A3811141462FFFFD51405 +:102550008E61E663E8520432FFF104A0800594DA4C +:10256000886A00F18000E808A6D9E671E8058C01C8 +:102570001422FFFF96000432FFFFCB04B685A8E9C2 +:10258000D53C5A38011522A2FFD65EF57FFDE8033F +:10259000B645D521E54BE9065EF500298066403257 +:1025A0003C1A5EF500C9B665E827D5155A380226EB +:1025B00022A2FFD65EF5043BE903B645D5165EF5CB +:1025C000042DE903B6E5D50E5EF5040F40323C1B41 +:1025D000B665D50822F2FFD75EF7876FE90DA9E946 +:1025E000D50C5EF5036FE90822F2FFD75EF7876F1F +:1025F000E903A9A9D502A8A9505281084C54FF8E1D +:10260000FCC0FC408481505000B884E550000B08A9 +:1026100085248460854384C20022FF6854F1000150 +:102620000422FFD2E811C2100422FFDB04808005DF +:102630009492884800F10002A693E9165A202315C7 +:102640001442FFFED5138E41E643E8470422FFDB28 +:10265000048080059492884800F10002E807A69360 +:102660005CF10023E8031432FFFE0422FFFECA0BD4 +:1026700022F2FFAB1462FFFF5EF7848140223C1A16 +:10268000B645D52B5A2801102282FFAB5EF47FFCA1 +:10269000E8041432FFFFD518E51F40233C1A14222A +:1026A000FFFFD5125A28021A2282FFAB5EF40904FA +:1026B000E9041432FFFFD5155EF408E140223C1A0C +:1026C0001422FFFFD50E2222FFAA5EF101C3E81DEE +:1026D0005EF400FBE822B6C550528108D89EFCC0CB +:1026E0002222FFAA5EF101C3E8065EF40805E90BA9 +:1026F000B725D5F35EF10275E9065EF40805E90336 +:10270000B6E5D5EBB685D5E95EF10275E9065EF46E +:1027100000FBE803B745D5E1B665D5DFFC47F18995 +:102720002E17E8D083825CF080C8E8048C213E1725 +:10273000E8D02E17E8CF5CF080C8E8048C213E1763 +:10274000E8CF3C9DFFE984E05014FFFFF18380C097 +:102750005014FFFE840AE2E1F087840114FF800D2B +:10276000F085F784F782F7818107B4064E0203985B +:102770005A080604480003945A0804044800031A3F +:10278000F2090003002404A3002CA09494418822A1 +:102790009402A689A648F286F18AF109A04D880123 +:1027A000A643A602F18BF08C4EA2005C5AA0010A4F +:1027B000841FF085FA12F088FB134412905CD50850 +:1027C00014AF800514AF80088500441290DCF00639 +:1027D0008801A60198885000002C94010031003730 +:1027E000880100210049A502F381F2828003C3031E +:1027F0008E01D502F001F084F002E611E8039DC1DC +:10280000D502FAE1F1028048807C84A1F00149FF01 +:10281000D647F208FA3483DC43E1047380BC844079 +:10282000425404738062F104E0E1E90D38428511FD +:102830004E4700038864384F05114E470003884413 +:102840008C21D5F3F10484879A79FE4B4220907352 +:102850004E2600038441842AFE5C40208856D5031E +:10286000804A800A001300209646C15AFA2E10139F +:1028700000CE001F801812030063101300C84EA280 +:10288000001D8421101300C084231413002F842002 +:10289000101300C1F101C104F1025A1811064410CD +:1028A000003C101300CEFA22F30642340473381EA3 +:1028B0000D1112130065D50C441FFFC8101300C082 +:1028C00084211413002F101300C112A300652213DA +:1028D00000072E37E8D014130034E6718420121359 +:1028E0000061101300C4101300D4101300D510138E +:1028F00000D6101300D7101300D8101300D91013EE +:1029000000DA101300DB101300DCE802842110133E +:1029100000CC2E17E8CFE6318420E83BD5390213EE +:102920000063E220E803120300634EA20018F101E5 +:10293000C104F1025A1811064410003C101300CED5 +:10294000FA62001300C842140C7322330065381E6B +:102950000511E061E80312130065001300C05CF08C +:1029600080C8E80B8C2104330034101300C02213FC +:1029700000078823141300342E17E8D0E631E8044A +:102980008421101300CC2E17E8CFE631E80484210F +:10299000101300CDF103E622E913441FFFC8101302 +:1029A00000C00433002F8421101300C1843DFE5E5B +:1029B0005A1801071413002F84201413002C8420AC +:1029C00010130068F103E622E8360413002CC1332B +:1029D0005A1801075A98010C843F8482D50C5A1862 +:1029E00002095A980107843F8483D505F40DD50365 +:1029F0008421808144328F3038319000C31C44528E +:102A00008F308885F30620520008FECCFE6CE02350 +:102A1000E912F305F10AFE5C20320004F405FEE43D +:102A2000E061E909021300635CF08029E904842174 +:102A300010130068003300684E33008B0413002C21 +:102A4000C130041300115A10022D0413002F5A181C +:102A500003070413002EE622E824D5035A180222A5 +:102A6000F10BF40C8C218A249648E622E91AE448FA +:102A7000E81842F100245CF7815FE813001300833B +:102A80005A180108001300C1C904842A10130082D7 +:102A900084211413002F101300C184201413002C60 +:102AA0000443002CC455041300115A10025204139D +:102AB000002F5A1005058E22E622E84A5A480105E1 +:102AC000001300CCD5055A480244001300CDC9407C +:102AD00022430046221300069A614E140003FE4A68 +:102AE0000253006344400BB844F003E8FF2C40421B +:102AF0003C97E281E82D5CF08033E92A004300C86E +:102B0000FAA2814442A414732253006538FE2911AD +:102B100085424052A8B6E0AFE809F504E085E90334 +:102B2000E0E4E8165CF0812DE913001300835A18E5 +:102B30000108001300C1C904842A101300828421F3 +:102B40001413002F101300C184201413002C04133D +:102B5000002C4E1200FF0443002F5A40030448008B +:102B60000113004300C0005300CEE2A44EF300A8BE +:102B70000453002DCD0B004300C48C81104300C4CE +:102B8000004300DA8C81104300DA5EF1012DE80683 +:102B900042F100245CF7BA99E90B004300C48C8130 +:102BA000104300C4004300DC8C81104300DCE6A22B +:102BB000E8285A1801165A98010822F300065EF711 +:102BC000821DE909D5145A98021D22F300065EF70A +:102BD000821CE90D22130007E42BE813D5085A18CC +:102BE000021122F300075EF788F5E90B021300617A +:102BF0008C2112130061001300D48C21101300D417 +:102C00005A38010C021300618C2112130061001369 +:102C100000D58C21101300D55EF10029E805FE14C3 +:102C20005CF007D1E90B020300618C011203006123 +:102C3000000300D68C01100300D6020300635CF091 +:102C4000003DE90EF003E602E80B020300618C018F +:102C500012030061000300D88C01100300D80403A4 +:102C6000002B5CF00065E90FF003E6024EF2008CE9 +:102C7000020300618C0112030061000300D98C0182 +:102C8000100300D90403002E5A9802095A000212B8 +:102C90005A08047A2E07E8CFD50E5A9801755A08BB +:102CA00005072E17E8CFE631E86ED53D5A08036CCC +:102CB0002E07E8D0E6118405E936D5650403003413 +:102CC000400010165A18020D5EF008F5E8270203BE +:102CD0000061001300D48A0112030061D51F5A1845 +:102CE000011E5A98010A22F30006021300615EF7E2 +:102CF000821DE90DD50A5A98021222F3000602132A +:102D000000615EF7821CE803E41FD502E40BE906CC +:102D1000000300D48A201213006102030061E6065A +:102D2000E90584021403002FD52E000300835A08FE +:102D30000108000300C1C804840A10030082840152 +:102D40001403002F100300C184001403002CD51BB2 +:102D5000040300115A0002180403002F9E42E622C9 +:102D6000E9035A080511000300835A08010800030B +:102D700000C1C804840A1003008284011403002FD8 +:102D8000100300C10403002EC8080413002F5A18B2 +:102D9000010E3E07E8D0D50A5A0801090403002FA6 +:102DA0005A08010584003E07E8CF44000032D5628E +:102DB000000300209616C0730423002F8400100324 +:102DC00000CF84015A2805068401100300CF840037 +:102DD00000430092FA620013009342120C7338FE13 +:102DE00005110213003E8463944940108C36E02F95 +:102DF000E8058402100300CF8400021300635CF036 +:102E0000803DE908F103E622E8058403100300CFC2 +:102E10008400003300C00413003440108C368C242E +:102E20005CF08908E808001300C4004300DA8A2433 +:102E3000101300C4004300C4E686E8059C599021A5 +:102E4000E024E8058404100300CF8400001300CEC2 +:102E5000E223E903E662E8058405100300CF84005D +:102E60000413002B5CF08065E908F103E622E80515 +:102E70008406100300CFD5135A2001125A080110FE +:102E8000041300221403002F5A18010A10030085AE +:102E9000A4341203000CA4351203000DF007506394 +:102EA00001088E01F0874E03FC62FCC7FC5AF08AD1 +:102EB000814181028420FA54B01049FFF91C84201A +:102EC000FA54B01949FFF9178420FA54B02249FF87 +:102ED000F912B02B8420FA5449FFF90D2E07E8CEE1 +:102EE0005CF000C8E8048C013E07E8CE2E07E8D16C +:102EF0005CF000C8E8048C013E07E8D1800884201B +:102F0000FA53443291DC4442905C44528F3049FF82 +:102F1000D13E8008FA21FA534432915C4442905CDD +:102F200044528F3049FFD1338400B61FF082F084C1 +:102F300044029014F083B010F0858400446291DC68 +:102F4000F08180E6852008038025F0865063005CD0 +:102F5000F006E320E82608038001C020000380116A +:102F6000F201F082000380238068B61FB43FF002B4 +:102F7000A53084A049FFD2945CF0005B4EF20509B5 +:102F8000F003F1028801F103B45F9A41E241E906DE +:102F900008100001C1F9480004FC8D218CC2D5D96C +:102FA000F0045A00010EFA01F081B019F0854402D4 +:102FB0008FCCF08384014462915CF084D5C384009B +:102FC000441291DC44229014806AB11080A849FF19 +:102FD000D1F1FA014412915C44228FCC806AB1197C +:102FE00080A849FFD1E7F00AF08780C044028F84AF +:102FF000F08BF004F0888400F085F086F089B40648 +:10300000F08C4E0204765A080604480004725A08EE +:103010000404480003D3804A00030024A054F08D28 +:1030200094018801A641A7C0F184000F801010739D +:10303000009210030093F00DA05594028801A64160 +:10304000A600F18EF08F04030017F083C06B5A00C6 +:10305000010D44028F3CF08B841FF088FA01FB20A5 +:10306000F0814412915CD50B44028F84F08BF00305 +:10307000441291DCF08881208400F081980FA60131 +:1030800098885000002C94010031003788010021FD +:103090000049A502F382B65F8003C3038E01D50207 +:1030A000F002F086B41F5CF00023E8038C01D50227 +:1030B000FA13F085B43FF201806884A0F00249FF62 +:1030C000D1EFF1068040FA02FE0CF10184809941B3 +:1030D00088099569940188A841E02000049F800632 +:1030E00080248064F005E009E90F38F290114EF772 +:1030F0000003886F38FF10114EF70003882F8D21D1 +:1031000050420024D5F0F4068A04FE03848742105E +:1031100010734E1600038421840AFE1C409005366D +:10312000D505F203812280228062000300209606EA +:10313000C06EFA0E10030094F003107300A9C01CB7 +:103140008401100300698403140300228400100327 +:103150000083F002C004B41F5A0823064400003C58 +:1031600010030094FA02F4014243807338041111F1 +:1031700012030055D512440FFFC8100300698401E3 +:103180001403002210030083020F8006120300556F +:10319000000F800C3E07E8CE84A084002243000686 +:1031A0001053006F12530036A577100300821003EE +:1031B00000EB1243004612530047124300481443E9 +:1031C0000027F50D04450003122300381493002650 +:1031D0003842150110030085100300A0100300A160 +:1031E000100300A2100300A3100300A4100300A505 +:1031F000100300A6100300A7100300A81243003E0E +:103200001413003F143300408400D567F003C0243A +:10321000F002C004B41F5A0823064400003C100307 +:103220000094004300A9FA02F501425200732243C0 +:10323000005538041511E080E8031203005504031B +:10324000003FE001E8031413003F04030040E003E3 +:10325000E80314330040000300695CF000C8E80E86 +:10326000504300988C0110030069B404A0618809E0 +:10327000B604220300068801A821F00C5A080108B0 +:10328000A43412030046A435120300470203003899 +:10329000E202E80312230038F10D040500033800B0 +:1032A00005010213003EE220E8031203003E220360 +:1032B0000046224300069B044E440003FF222213D3 +:1032C0000047220300079A084E040003FE0204137D +:1032D000002B8804E220E8031403002B8400100371 +:1032E00000683C0DFFE9C82404030017C0215A0000 +:1032F0000103840344128F3038408000C4198801D0 +:10330000F408F5042010000842F21424FE64E02FB3 +:10331000E90F20000004FE7AFE02E001E909020341 +:1033200000385CF00029E904840110030068000300 +:103330000068C86904030017C066040300115A003E +:103340000263F00EF10F8C018A0104130022960033 +:103350005A18030604430019C404D5085A18020772 +:10336000E602E951E5284EF303278E22E622E84BD8 +:10337000E602E949E52CE84742F488245CF7822715 +:10338000E84200030069E603E83E00030083C83119 +:10339000000300C15A08012E840A100300820203B0 +:1033A000004750F07FB95CF787F2E823221300460C +:1033B0005000FFD396015CF003DEE80E22030048C4 +:1033C000E001E8055EF0002DE907D508E020E806F9 +:1033D0005EF0040BE9038402D5028401100300EBC4 +:1033E000F109F00AF28CF38349FFD0CFF20CF3031A +:1033F00084011403002210030083840014030017C7 +:103400003E07E8CE000300682E57EC0DC00604030B +:103410000017C86E4800013C04030017C0F90403FC +:1034200000115A0002F6040300225A0005058E021C +:10343000E602E8EE22130047220300079A084E0432 +:103440000003FE020243003844100C8044F003E8FD +:10345000FE644010BC37E220E8DB5CF00033E9D8C2 +:10346000001300A9FA8204FF800142F09073224306 +:10347000005539E43D1185E240423C96E09EE80A61 +:10348000F406E024E904F405E081E8C25CF0012DD3 +:10349000E9BF44F00190405794B6E0A3E8B90013A7 +:1034A0000083C911001300C15A18010E5CF000C955 +:1034B000E80A840A10030082F109F00AF28349FF46 +:1034C000D064F2038401F10BF3061403002210030D +:1034D00000838400140300178823F30BF4059ACBB0 +:1034E000E283E9961800800110008023D5F70403D9 +:1034F00000225A000304480000E30013006900039F +:103500000094E201E97E04130018C90B0003006F68 +:103510008C011003006F000300A68C01100300A6AD +:103520005EF4812DE80642F488245CF7BA99E90B31 +:103530000003006F8C011003006F000300A88C01D2 +:10354000100300A8E622E80B020300368C011203E8 +:103550000036000300A08C01100300A000030068E7 +:103560005A08010C020300368C01120300360003D6 +:1035700000A18C01100300A15EF48029E80642241A +:1035800088245CF107D1E90B020300368C01120399 +:103590000036000300A28C01100300A202030038D1 +:1035A0005CF00047E90E3C0DFFE9C80B0203003652 +:1035B0008C0112030036000300A48C01100300A448 +:1035C0000403002B5CF00065E90E3C0DFFE9C80B1D +:1035D000020300368C0112030036000300A58C01A3 +:1035E000100300A5040300198E01E602E8683C0DF3 +:1035F000FFE9C8652E07E8D1E6118405E932D55FF9 +:1036000004030026400004175CF00038E816FE842E +:103610005CF10ABFE812409024018D2AE735E80DDD +:10362000020300385CF00033E80802030036002390 +:1036300000A28A0212030036040300274000041689 +:103640008E0B5CF00422E80802030036001300A091 +:103650008A011203003602030036E606E9058402F9 +:1036600014030022D52C00030083C808000300C106 +:103670005A080105840A1003008284011403002201 +:1036800010030083840014030017D51904030011EC +:103690005A000216040300228E02E604E81000031A +:1036A0000083C808000300C15A080105840A1003FA +:1036B0000082840114030022100300830403001716 +:1036C000C01C4402901438001C00C00A440290142C +:1036D0008807F10420000024E0014EF20165440255 +:1036E0008FCC38101C00C121880720F00024F00482 +:1036F000E00F4EF20159D5194402901438001C0015 +:10370000C003F004C00944028FCC38001C00C00D77 +:10371000F0045A08110B840414030022F0044E0331 +:1037200001488401140300173C0DFFE9C839040364 +:1037300000228E04E602E934F004C80444028F84B7 +:10374000D506F0045A08112D44028F3C38001C00A5 +:10375000C02704130017840214030022C921F104B6 +:10376000C90284011403001704030017107300A991 +:103770005A000104FA01D5028400F081F101FA0235 +:10378000421380733804051112030055A436120346 +:103790000046A437120300478400120300380403D4 +:1037A00000225A08010584003E07E8D14400003297 +:1037B0001003006E4800009D0003002096164E0284 +:1037C00000988400003300921003006EFA22000378 +:1037D0000093420184730223003E381401118403D4 +:1037E000FE0C9451E0208401E80584021003006E71 +:1037F00084002E17EC0FC10B8423FE543C2005A837 +:10380000E022E805840B1003006E84000013006AB8 +:103810000423001D50108037E222E8102E17E8D153 +:103820008E215CF0803BE80A0413003D5EF080C905 +:10383000E90584031003006E84000023006904136B +:103840000027401088368C235CF0843EE808001383 +:10385000006F003300A68A231013006F0033006F3F +:10386000E666E8059C519021E023E80584041003F6 +:10387000006E840000130094E222E903E642E805AA +:1038800084051003006E84000413002B5CF0806537 +:10389000E9083C1DFFE9C90584091003006E800199 +:1038A0000413002640F089F75CF784B1E80C043378 +:1038B000003F5EF18064E808043300409449FE9CB8 +:1038C000E241E8028400041300225A1001125A084F +:1038D00001100413002F140300225A18010A1003C8 +:1038E0000085A4341203000CA4351203000DF00966 +:1038F000506301088C01F0895A000A0448FFFB81DB +:10390000F00AB0EB50200A508481B162F007B40095 +:103910008E01E603E91CF00750000108F0874C0116 +:103920007FF7806AB12280A88400441291DC44228F +:103930008F8449FFCD3FFA014412915C44228F3CB1 +:10394000806AB12B80A849FFCD35FCDAF00704006E +:1039500000225A0002058E04E602E8DEF007041594 +:1039600000050000002494028801A642A783E2C15A +:10397000E9D3F007040000175A080105380094083D +:10398000D5055A08020438408C088C21D5F1F00284 +:10399000B43FE0204EF3FB03F1058441382080085A +:1039A0008C01D5F784041403002248FFFEBF840273 +:1039B00048FFFEBA42F488245CF7815F4EF3FCE7CF +:1039C00048FFFCD5000000000000000000000000DF +:1039D00000000000000000000000000000000000E7 +:1039E0004CE00000AD1300004CE10000F6F441BAD9 +:1039F0004CE000002F100000FAF400004E3E0B0DCA +:103A00004CE000008B1400002A050100A37CE55067 +:103A10004CE000000B080000B619010080CB746C6C +:103A20004CE0000001180000C22101006A95CE029E +:103A3000050000000000000001000000FFFFFFFF84 +:103A4000030000000700000001000000AA000000C1 +:103A5000120000001B000000480000004B000000A6 +:103A600052000000620000006300000072000000CD +:103A7000730000001E010000210100002D01000064 +:103A80003B010000480100004B0100006C010000F8 +:103A900078010000870100008B0100009201000006 +:103AA0009B010000B2010000B3010000B40100005E +:103AB000BB010000CB010000D2010000E1010000C9 +:103AC000E2010000E3010000EE01000078040000C4 +:103AD000B4040000BB040000ED0400002105000058 +:103AE0002D050000E1050000EE0500001E060000A7 +:103AF0004B0600006D060000CB060000D206000059 +:103B0000E2060000E3060000ED0600004B0700009F +:103B1000870700008B070000B8070000ED120000C7 +:103B2000B81700004B1B00006D1B00008B1B000032 +:103B3000FFFFFFFF4040C8C8C8C800004E00560045 +:103B400060006B00760083009100A000B100C2000D +:103B5000D600EB0002011A013501520170019101FA +:103B6000B501DB0103022E025C028D02C102F802E4 +:103B700032036F03B003F4033B048604D404260528 +:103B80007C05D50532069206F5065C07C6073308A4 +:103B9000A30816098C09040A7E0AFA0A790BF80BA5 +:103BA000790CFB0C7E0D010E830E060F870F07109C +:103BB000861003117D11F5116912DA124713AF1344 +:103BC00013147214CB141E156B15B215F2152C16A6 +:103BD0005E168916AC16C716DB16E716EB164E00F6 +:103BE000560060006B00760083009100A000B100D9 +:103BF000C200D600EB0002011A013501520170012A +:103C00009101B501DB0103022E025C028D02C102AB +:103C1000F80232036F03B003F4033B048604D404B8 +:103C200026057C05D50532069206F5065C07C60713 +:103C30003308A30816098C09040A7E0AFA0A790BCC +:103C4000F80B790CFB0C7E0D010E830E060F870F0F +:103C50000710861003117D11F5116912DA1247134E +:103C6000AF1313147214CB141E156B15B215F21585 +:103C70002C165E168916AC16C716DB16E716EB1661 +:103C80004E00560060006B00760083009100A0009B +:103C9000B100C200D600EB0002011A013501520149 +:103CA00070019101B501DB0103022E025C028D025D +:103CB000C102F80232036F03B003F4033B0486042D +:103CC000D40426057C05D50532069206F5065C0768 +:103CD000C6073308A30816098C09040A7E0AFA0AE3 +:103CE000790BF80B790CFB0C7E0D010E830E060F81 +:103CF000870F0710861003117D11F5116912DA1272 +:103D00004713AF1313147214CB141E156B15B21591 +:103D1000F2152C165E168916AC16C716DB16E716BA +:103D2000EB1680008D009A00A900B900CA00DC00E3 +:103D3000F00005011C0135014F016B018901A9014A +:103D4000CB01EF0115023E0269029602C602F8029B +:103D50002D0365039F03DC031C045F04A504EE042C +:103D600039058705D8052C068306DC063807960733 +:103D7000F7075A08C00827099109FC09680AD60AFA +:103D8000460BB60B270C980C090D7B0DEC0D5C0E49 +:103D9000CC0E3A0FA70F13107C10E2104611A7119A +:103DA00005125F12B512081355139E13E313221464 +:103DB0005B149014BE14E714091526153C154C1518 +:103DC0005615591501000000000000000000000019 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 +:103DF00000000000000000000000000000000000C3 +:103E000000000000000000000000000000000000B2 +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF00000000000000000000000000000000000C2 +:103F000000000000000000000000000000000000B1 +:103F100000000000000000000000000000000000A1 +:103F20000000000000000000000000000000000091 +:103F30000000000000000000000000000000000081 +:103F40000000000000000000000000000000000071 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 +:103F90000000000000000000000000000000000021 +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000000000000000001 +:103FC00000000000000000000000000000000000F1 +:103FD00000000000000000000000000000000000E1 +:103FE00000000000000000000000000000000000D1 +:103FF00000000000000000000000000000000000C1 +:1040000000000000000000000000000000000000B0 +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:104030000000000000000000000000000000000080 +:104040000000000000000000000000000000000070 +:104050000000000000000000000000000000000060 +:104060000000000000000000000000000000000050 +:104070000000000000000000000000000000000040 +:104080000000000000000000000000000000000030 +:104090000000000000000000000000000000000020 +:1040A0000000000000000000000000000000000010 +:1040B0000000000000000000000000000000000000 +:1040C00000000000000000000000000000000000F0 +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000000D0 +:1040F00000000000000000000000000000000000C0 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:10414000000000000000000000000000000000006F +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000000000000000000DE +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000000009D +:10432000000000000000000000000000000000008D +:10433000000000000000000000000000000000007D +:10434000000000000000000000000000000000006D +:10435000000000000000000000000000000000005D +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D +:10438000000000000000000000000000000000002D +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D00000000000000000000000000000000000DD +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000000000000000000000BD +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000000000000000008C +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C +:10446000000000000000000000000000000000004C +:10447000000000000000000000000000000000003C +:10448000000000000000000000000000000000002C +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000000000000000C +:1044B00000000000000000000000000000000000FC +:1044C00000000000000000000000000000000000EC +:1044D00000000000000000000000000000000000DC +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000008B +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000000000005B +:10456000000000000000000000000000000000004B +:10457000000000000000000000000000000000003B +:10458000000000000000000000000000000000002B +:10459000000000000000000000000000000000001B +:1045A000000000000000000000000000000000000B +:1045B00000000000000000000000000000000000FB +:1045C00000000000000000000000000000000000EB +:1045D00000000000000000000000000000000000DB +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000000000000000BB +:1046000000000000000000000000000000000000AA +:10461000000000000000000000000000000000009A +:10462000000000000000000000000000000000008A +:10463000000000000000000000000000000000007A +:10464000000000000000000000000000000000006A +:10465000000000000000000000000000000000005A +:10466000000000000000000000000000000000004A +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000000000002A +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A +:1046B00000000000000000000000000000000000FA +:1046C00000000000000000000000000000000000EA +:1046D00000000000000000000000000000000000DA +:1046E00000000000000000000000000000000000CA +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000000000000000000000000000000089 +:104730000000000000000000000000000000000079 +:104740000000000000000000000000000000000069 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:104770000000000000000000000000000000000039 +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000009 +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000000000000000000000E9 +:1047D00000000000000000000000000000000000D9 +:1047E00000000000000000000000000000000000C9 +:1047F00000000000000000000000000000000000B9 +:10480000050201016100BA0F00000000240105014A +:1048100000030E59FF53C1630000000000000000B8 +:104820003C4E0000904E0000E44E0000384F000067 +:104830008C4F0000E04F000034500000200C0000BE +:104840002088410AE6A004000000000000000000EB +:104850000000000000280000888888888800000088 +:1048600088508454C054A05B405EC85DA85C4880FA +:104870000000105C2F04090000C186002DB4180050 +:10488000137DDC0227060C0000090009000000006F +:10489000080C00000C0000000000000000000000F8 +:1048A0000000000000000000000400000100000003 +:1048B000000000008850A854C054A05B405EC85D52 +:1048C000185C48800000105C2F04090000C106003D +:1048D0002DB41800137DDC0227060C0000C900C9A6 +:1048E00000000000800000002088410AE6A00400CB +:1048F0000000000000000000000000000028000090 +:10490000888808000000000088508454C054A05BD0 +:10491000405EC85D185C48800000105C2F040900F0 +:1049200000C186012DB41800137DDC0227010600AA +:104930000009000900000000200C0000CD35D71C44 +:10494000CD3507000000000000000000000000005E +:104950000028000088880800000000008850845467 +:10496000C054A05B405EC85DA85C48800000105C3D +:104970002F04090000C186002DB41800137DDC024D +:1049800027060C0000C900C90000000090000000CC +:104990000F3EF8200F3E080000000000000000005D +:1049A00000000000002800008888080000000000C7 +:1049B00088508454C054A05B405EC85D185C488039 +:1049C0000000105C2F04090000C186012DB41800FE +:1049D000137DDC022701060000C900C900000000A9 +:1049E000200C00002088410AE620000000000000A2 +:1049F00000000000000000000024000055550100E8 +:104A000000000000885084548858A05B405EC85D58 +:104A1000185C48800000105C2F04090000C186006B +:104A20002DB41800137DDC0227060C0000C900C954 +:104A300000000000200C00002088410AE6A00400CD +:104A4000000000000000000000000000002800003E +:104A500000000000000000008850A854C054A05B73 +:104A6000405EC85DA85C48800000105C2F0409000F +:104A700000C186002DB41800137DDC0227060C004F +:104A800000C900C900000000000000000909000082 +:104A90000010000020080000DF0F0000B4DC21003F +:104AA000030003000000000094489648504A0000AC +:104AB00020052005D00600000000000000000000D6 +:104AC00002000000000000000000010001100000D2 +:104AD00020080000DF0F0000B4DC0100030002002A +:104AE00000000000DC06FE06F00B000022000000C3 +:104AF000100500000000000000000000020000009F +:104B00000000000001010200011000002008000068 +:104B1000DF0F0000B4DC0100030002000000000011 +:104B2000DE06FC06F20B0000200002001205000069 +:104B30000000000000000000020000000000000073 +:104B4000020202000110000020080000DF0F000038 +:104B5000B4DC01000300020000000000E006FA06D9 +:104B6000F40B00001E00040014050000000000000B +:104B7000000000000200000000000000030302002B +:104B80000110000020080000DF0F0000B4DC01006D +:104B90000300020000000000E206F806F60B000029 +:104BA0001C000600160500000000000000000000C8 +:104BB00002000000000000000404020001100000D8 +:104BC00020080000DF0F0000B4DC01000300020039 +:104BD00000000000E406F606000000001A000800CD +:104BE00000000000000000000000000000000000C5 +:104BF0000000000005050200011000002008000070 +:104C0000DF0F0000B4DC0100030002000000000020 +:104C1000E606F4060000000018000A00000000008C +:104C20000000000000000000000000000000000084 +:104C3000060603000110000020080000DF0F00003E +:104C4000B4DC01000300020000000000E806F206E8 +:104C50000000000016000C00000000000000000032 +:104C60000000000000000000000000000707030033 +:104C70000110000020080000DF0F0000B4DC01007C +:104C80000300020000000000EA06F0060000000039 +:104C900014000E00000000000000000000000000F2 +:104CA00000000000000000000808030001100000E0 +:104CB00020080000DF0F0000B4DC01000300020048 +:104CC00000000000EC06EE060000000012001000DC +:104CD00000000000000000000000000000000000D4 +:104CE0000000000009090000001001002008000079 +:104CF000C00F0000B4DC210003000300000000002E +:104D000094489648504A0000B005B005D00600000F +:104D10000000000000000000020000000000000091 +:104D2000090900000010000020080000C00F00006A +:104D3000B4DC210003000300000000009448964802 +:104D4000504A000040064006D00600000000000067 +:104D50000000000002000000810000000A090001BC +:104D60000110000020080000D30F6000B4DC010631 +:104D7000030002000000000000000000000000002E +:104D80001C3C1C3CAC3C000000000000000000008B +:104D900002000000000000000909000000100000EF +:104DA00020080000D30F0000B4DC2106030003003C +:104DB0000000000094489648504A00002005200555 +:104DC000D00600000000000000000000020000000B +:104DD0000000000009090000001000002008000089 +:104DE000D30F0000B4DC2106030003000000000024 +:104DF0000000000000000000200520050000000069 +:104E000000000000000000000000000000000000A2 +:104E1000090900000010000020080000D30F000066 +:104E2000B4DC2103030003000000000000000000C8 +:104E30000000000020052005000000000000000028 +:104E40000000000000000000000000000909000050 +:104E50000010000020080000D30F0000B4DC210384 +:104E6000030003000000000000000000000000003C +:104E700020052005000000000000000000000000E8 +:104E8000000000000F00000010B43844693E00002C +:104E9000030000002DB4B4C469020000000000004B +:104EA0002D38B48410030000000000002DB4B4C4F9 +:104EB00069030000030000002DB4B4C469030000BE +:104EC0005858585858585858585858585858585862 +:104ED0005858585858585858585858585858585852 +:104EE0005858585858585858585858585858585842 +:104EF0005858585858585858585858585858585832 +:104F00005858585858585858580058000000000031 +:104F100000000000000000005858585858585858D1 +:104F20005858585858585858585858585858585801 +:104F300058585858585858585858585858585858F1 +:104F400058585858585858585858585858585858E1 +:104F500058585858585858585858585858585858D1 +:104F60005800580000000000000000000000000091 +:104F700058585858585858585858585858585858B1 +:104F800058585858585858585858585858585858A1 +:104F90005858585858585858585858585858585891 +:104FA0005858585858585858585858585858585881 +:104FB0005858585858585858580058000000000081 +:104FC0000000000000000000585858585858585821 +:104FD0005858585858585858585858585858585851 +:104FE0005858585858585858585858585858585841 +:104FF0005858585858585858585858585858585831 +:105000005858585858585858585858585858585820 +:1050100058005800000000000000000000000000E0 +:105020005858585858585858585858585858585800 +:1050300058585858585858585858585858585858F0 +:1050400058585858585858585858585858585858E0 +:1050500058585858585858585858585858585858D0 +:1050600058585858585858585800580000000000D0 +:105070000000000000000000585858585858585870 +:1050800058585858585858585858585858585858A0 +:105090005858585858585858585858585858585890 +:1050A0005858585858585858585858585858585880 +:1050B0005858585858585858585858585858585870 +:1050C0005800580000000000000000000000000030 +:1050D0005858585858585858585858585858585850 +:1050E0005858585858585858585858585858585840 +:1050F0005858585858585858585858585858585830 +:10510000585858585858585858585858585858581F +:10511000585858585858585858005800000000001F +:1051200000000000000000005858585858585858BF +:1051300058585858585858585858585858585858EF +:1051400058585858585858585858585858585858DF +:1051500058585858585858585858585858585858CF +:1051600058585858585858585858585858585858BF +:10517000580058000000000000000000000000007F +:10518000585858585858585858585858585858589F +:10519000585858585858585858585858585858588F +:1051A000585858585858585858585858585858587F +:1051B000585858585858585858585858585858586F +:1051C000585858585858585858005800000000006F +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF +:10520000000000000000000000000000000000009E +:10521000000000000000000000000000000000008E +:10522000000000000000000000000000000000007E +:10523000000000000000000000000000000000006E +:10524000000000000000000000000000000000005E +:10525000000000000000000000000000000000004E +:10526000000000000000000000000000000000003E +:10527000000000000000000000000000000000002E +:10528000000000000000000000000000000000001E +:10529000000000000000000000000000000000000E +:1052A00000000000000000000000000000000000FE +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000000000DE +:1052D00000000000000000000000000000000000CE +:1052E00000000000000000000000000000000000BE +:1052F00000000000000000000000000000000000AE +:10530000000000000000000000000000000000009D +:10531000000000000000000000000000000000008D +:10532000000000000000000000000000000000007D +:10533000000000000000000000000000000000006D +:10534000000000000000000000000000000000005D +:10535000000000000000000000000000000000004D +:10536000000000000000000000000000000000003D +:10537000000000000000000000000000000000002D +:10538000000000000000000000000000000000001D +:10539000000000000000000000000000000000000D +:1053A00000000000000000000000000000000000FD +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000000000000000000000DD +:1053D00000000000000000000000000000000000CD +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000000000000000000AD +:10540000000000000000000000000000000000009C +:10541000000000000000000000000000000000008C +:10542000000000000000000000000000000000007C +:10543000000000000000000000000000000000006C +:10544000000000000000000000000000000000005C +:10545000000000000000000000000000000000004C +:10546000000000000000000000000000000000003C +:10547000000000000000000000000000000000002C +:10548000000000000000000000000000000000001C +:10549000000000000000000000000000000000000C +:1054A00000000000000000000000000000000000FC +:1054B00000000000000000000000000000000000EC +:1054C00000000000000000000000000000000000DC +:1054D00000000000000000000000000000000000CC +:1054E00000000000000000000000000000000000BC +:1054F00000000000000000000000000000000000AC +:10550000000000000000000000000000000000009B +:10551000000000000000000000000000000000008B +:10552000000000000000000000000000000000007B +:10553000000000000000000000000000000000006B +:10554000000000000000000000000000000000005B +:10555000000000000000000000000000000000004B +:10556000000000000000000000000000000000003B +:10557000000000000000000000000000000000002B +:10558000000000000000000000000000000000001B +:10559000000000000000000000000000000000000B +:1055A000B6ADB69DB6ADB6AD02000200B6ADB66DF5 +:1055B000B6A5B6A506000600B6ADB6ADB6ACB69CAF +:1055C00006000600B6ADB6AD96AD966D06000600B7 +:1055D000B6ADB6ADB2ADB2AD06000600B6A5B6A585 +:1055E000B6ADB6AD06000600B6ACB6ACB6ADB6AD5F +:1055F0000600060096AD96ADB6ADB6AD0600060047 +:10560000B2ADB2ADB6ADB6AD0600060092A49254EE +:1056100092A4925402000200E4007000DE18000020 +:10562000BE807000BE807000DE006F00FFFFFFFFD5 +:1056300033DE33DEDDDDDDDD33323332DEDEDEDE92 +:10564000DEDEDEDEDEDEDEDEDEDE000001010101AA +:105650000101010101010101000000000000000042 +:105660000000000000000000DE80DE80DE00DE00C2 +:1056700033DE33DE33DE33DEDDDDDDDDDDDDDDDDFE +:105680003332333233323332DEDEDEDEDDDDDDDD9A +:105690000101010100000000000000000000000006 +:1056A0000000000000000000670746003A190000F3 +:1056B0004107B2034107B2033A019D000706E40027 +:1056C0005A3A5A3A393939395A595A593A3A3A3A80 +:1056D0003A3A3A3A3A3A3A3A3A3A00000101010182 +:1056E00001010101010101010892240040922409F5 +:1056F00049920000000000003A013A013A013A01E3 +:105700005A3A5A3A5A3A5A3A393939393939393981 +:105710005A595A595A595A593A3A3A3A39393939F1 +:1057200001010101000000000812081249004900AF +:105730004012401201000100670746003A190000BC +:105740004107B2034107B2033A019D000706E40096 +:105750005A3A5A3A393939395A595A593A3A3A3AEF +:105760003A3A3A3A3A3A3A3A3A3A000001010101F1 +:105770000101010101010101089224004092240964 +:1057800049920000000000003A013A013A013A0152 +:105790005A3A5A3A5A3A5A3A3939393939393939F1 +:1057A0005A595A595A595A593A3A3A3A3939393961 +:1057B000010101010000000008120812490049001F +:1057C0004012401201000100030300000303030321 +:1057D000030303030303030303030101E8EBAAAA82 +:1057E000C0000000000000000303030303030303E1 +:1057F00001010101EB0BE80B00FC00FC00000000C4 +:10580000000000000303000003030303030303037A +:1058100003030303030301010800A0AAC000000062 +:10582000000000000303030303030303010101015C +:10583000EB0B080000FC00FC000000000000000072 +:1058400047185104440C21044100F1033EF4C00305 +:105850003BE8900338DC600335D0300332C40003EA +:105860002FB8D0022CACA00229A0700226944002CE +:1058700023881002207CE0011D70B0011A648001B1 +:1058800017585001144C20011140F0000E34C00094 +:105890000B289000081C6000051030000204000076 +:1058A0001290292540BAC8210AE2671ED409071BB5 +:1058B0009E31A617685945143281E410FCA8830D67 +:1058C000C6D0220A90F8C1065A20610324D80900E4 +:1058D0007602202540BAC8210AE2671ED409071BB8 +:1058E0009E31A617685945143281E410FCA8830D37 +:1058F000C6D0220A90F8C1065A20610324484026E7 +:105900001290292540BAC8210AE2671ED409071B54 +:105910009E31A617685945143281E410FCA8830D06 +:10592000C6D0220A90F8C1065A20610324D8090083 +:105930000090292540BAC8210AE2671ED409071B36 +:105940009E31A617685945143281E410FCA8830DD6 +:10595000C6D0220A90F8C1065A2061032448602765 +:105960000090292540BAC8210AE2671ED409071B06 +:105970009E31A617685945143281E410FCA8830DA6 +:10598000C6D0220A90F8C1065A2061032448602735 +:105990000090292540BAC8210AE2671ED409071BD6 +:1059A0009E31A617685945143281E410FCA8830D76 +:1059B000C6D0220A90F8C1065A2061032448602705 +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A90000000000000000000000000000000000006 +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000000000000000000000D6 +:105AD00000000000000000000000000000000000C6 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B10000000000000000000000000000000000085 +:105B20000000000000000000000000000000000075 +:105B30000000000000000000000000000000000065 +:105B40000000000000000000000000000000000055 +:105B50000000000000000000000000000000000045 +:105B60000000000000000000000000000000000035 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000000000000000005 +:105BA00000000000000000000000000000000000F5 +:105BB00000000000000000000000000000000000E5 +:105BC00000000000000000000000000000000000D5 +:105BD00000000000000000000000000000000000C5 +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 +:105C00000502010100000000000000000001040185 +:105C10000304075B0000000000000000000000001B +:105C2000286200007C620000500C00002088414A7D +:105C3000E6200040000000400000000000000000DE +:105C400000240000EEEE010000000000D06280673A +:105C5000BC672C6BB46D3C6D1C6C104F0000105772 +:105C60002F04095400C186012DB41C00137DDC22D1 +:105C70002701060000C900C900000000500C000008 +:105C80002088414AE620004000000040000000005B +:105C90000000000000240000EEEE01000000000003 +:105CA00028658067BC67A46BB46D3C6D1C6C9C1D43 +:105CB000000010572F04095400C186012DB41C00A8 +:105CC000137DDC022701060000C900C900000000A6 +:105CD0000000000000080000001000002008000084 +:105CE000DF0F0000FF8E0300000000000000000036 +:105CF000DC06FE06F00B000012000000100500009C +:105D00000000000000000000020000000000000091 +:105D1000000704000010000020080000DF0F000052 +:105D2000FF8E03000000000000000000DE06FC06FD +:105D3000F20B000014000200120500000000000039 +:105D40000000000002000000000000000006050046 +:105D50000010000020080000DF0F0000FF8E03008D +:105D60000000000000000000E006FA06F40B00004E +:105D700016000400140500000000000000000000F0 +:105D800002000000000000000005060000100000F6 +:105D900020080000DF0F0000FF8E0300000000005D +:105DA00000000000E206F806F60B000018000600EE +:105DB00016050000000000000000000002000000C6 +:105DC0000000000000040700001000002008000090 +:105DD000DF0F0000FF8E0300000000000000000045 +:105DE000E406F606000000001A00080000000000AB +:105DF00000000000000000000000000000000000A3 +:105E0000000308000010000020080000DF0F000061 +:105E1000FF8E03000000000000000000E606F4060C +:105E2000000000001C000A0000000000000000004C +:105E30000000000000000000000000000002090057 +:105E40000010000020080000DF0F0000FF8E03009C +:105E50000000000000000000E806F206000000005C +:105E60001E000C0000000000000000000000000008 +:105E7000000000000000000000010A000010000007 +:105E800020080000DF0F0000FF8E0300000000006C +:105E900000000000EA06F0060000000020000E00EE +:105EA00000000000000000000000000000000000F2 +:105EB0000000000000000B0000100000200800009F +:105EC000DF0F0000FF8E0300000000000000000054 +:105ED000EC06EE06000000002200100000000000AA +:105EE00000000000000000000000000000000000B2 +:105EF000080801000110000020080000DF0F00006A +:105F0000F44120000300030000000000EC06EE0650 +:105F1000000000000000240048004A0000000000CB +:105F2000000000000300000000000000000001016C +:105F30000110000020080000DF0F0000B44800003E +:105F40000000000000000000DC06FE06F00B000070 +:105F5000120000001005000000000000000000001A +:105F6000020000000000000000010201011000001A +:105F700020080000DF0F0000B4480000000000000F +:105F800000000000DE06FC06F20B00001400020018 +:105F900012050000000000000000000002000000E8 +:105FA00000000000000202010110000020080000B3 +:105FB000DF0F0000B44800000000000000000000F7 +:105FC000E006FA06F40B00001600040014050000B9 +:105FD00000000000000000000200000000000000BF +:105FE000000303010110000020080000DF0F000083 +:105FF000B44800000000000000000000E206F806BF +:10600000F60B000018000600160500000000000056 +:106010000000000002000000000000000004030176 +:106020000110000020080000DF0F0000B44800004D +:106030000000000000000000E406F606000000007A +:106040001A0008000000000000000000000000002E +:106050000000000000000000000503010110000026 +:1060600020080000DF0F0000B4480000000000001E +:1060700000000000E606F406000000001C000A0014 +:106080000000000000000000000000000000000010 +:1060900000000000000603010110000020080000BD +:1060A000DF0F0000B4480000000000000000000006 +:1060B000E806F206000000001E000C0000000000D0 +:1060C00000000000000000000000000000000000D0 +:1060D000000703010110000020080000DF0F00008E +:1060E000B44800000000000000000000EA06F006CE +:1060F0000000000020000E00000000000000000072 +:106100000000000000000000000000000008030183 +:106110000110000020080000DF0F0000B44800005C +:106120000000000000000000EC06EE060000000089 +:10613000220010000000000000000000000000002D +:10614000000000000000000008080300011000002B +:1061500020080000DF0F0000F448200003000300C7 +:1061600000000000EC06EE06000000000000240025 +:1061700048004A000000000000000000030000008A +:10618000000000002DB4B4C4690300000300000047 +:106190002DB4B4C4690300000F00000010B43844EB +:1061A000693E0000000000002D38B4841003000098 +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000000000000000000000CF +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:10624000000000000000000000000000000000004E +:10625000000000000000000000000000000000003E +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:10628000000000000000000000000000000000000E +:1062900000000000000000000000000000000000FE +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000000000000000000000DE +:1062C00000000000000000000000000000000000CE +:1062D000000000002499249924A924A902000200A6 +:1062E0002469246924A524A50400040024A924A960 +:1062F000A498A4980400040024A924A9146914698A +:106300000400040024A924A922A922A9040004004D +:1063100024A524A524A924A904000400A4A8A4A8B1 +:1063200024A924A90400040014A514A924A924A9BB +:106330000400040022A922A924A924A9040004001D +:10634000000000000000000000000000FFFFFF3F11 +:10635000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F4D +:10636000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F3D +:10637000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F2D +:10638000FFFFFF3FFFFFFF7FFFFFFF3FFFFFFF3FDD +:10639000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F0D +:1063A000FFFFFF3FFFFFFF3FFFFFFF3F00484002AF +:1063B0003620A1056CF80189A2D0620CD8A8C30FC1 +:1063C0000E812413445985167A31E619B009471D08 +:1063D000E6E1A7601CBA08245292692700484002EF +:1063E0003620A1056CF801C9A2D0620CD8A8C30F51 +:1063F0000E812413445985967A31E619B009471D58 +:10640000E6E1A7201CBA08245292692769076000B8 +:106410003A1900004707B3034707B3033A019D0049 +:106420000D06EE005A3A5A3A393939395A595A59F9 +:106430003A3A3A3A3A3A3A3A3A3A3A3A3A3A000030 +:106440000101010101010101010101010892240082 +:106450004092240949920000000000003A013A01EC +:106460003A013A015A3A5A3A5A3A5A3A3939393982 +:10647000393939395A595A595A595A593A3A3A3A84 +:1064800039393939010101010000000008120812F0 +:10649000490049004012401201000100445985168C +:1064A0007A31E619B009471DE6E1A7201CBA082495 +:1064B0005292692700000000000000000000000068 +:1064C00000000000000000000000000000000000CC +:1064D00000000000000000000000000000000000BC +:1064E00000000000000000000000000000000000AC +:1064F000000000000000000000000000000000009C +:10650000000000000000000000000000000000008B +:10651000000000000000000000000000000000007B +:1065200000000000000000000000000022992499F3 +:1065300024A924A9040002001469246924A924A51B +:1065400004000400A4A824A92499A4980400040029 +:1065500024A524A9246914690400040024A924A9F9 +:1065600022A922A90400040024A924A514A924A96D +:106570000400040024A9A4A8A4A824A904000400D9 +:1065800024A914A924A524A90400040024A922A94B +:1065900024A924A9020004002499249924A924A947 +:1065A00002000200B69DB29DB6ADB6AD0200060077 +:1065B000B66D966DB6A5B6AD06000600B6ADB6AC26 +:1065C000B69CB69D06000600B6ADB6A5966DB66D36 +:1065D00006000600B6ADB6ADB2ADB2AD060006001F +:1065E000B6A5B6ADB6AD96AD06000600B6ACB6AD76 +:1065F000B6ADB6AC0600060096ADB6ADB6ADB6A566 +:1066000006000600B2ADB6ADB6ADB6AD06000200EE +:1066100000000000000000000000000042016000D7 +:106620003A19000000819F0000819F003A019D00FF +:10663000FFFFFFFF5A3A5A3A393939395A595A59EC +:106640003A3A3A3A3A3A3A3A3A3A3A3A3A3A00001E +:106650000101010101010101010101010892240070 +:106660004092240949920000000000003A813A81DA +:106670003A013A015A3A5A3A5A3A5A3A3939393970 +:10668000393939395A595A595A595A593A3A3A3A72 +:1066900039393939010101010000000008120812DE +:1066A000490049004012401201000100420160000F +:1066B0003A19000020819F0020819F003A019D002F +:1066C000FFFFFFFF5A3A5A3A393939395A595A595C +:1066D0003A3A3A3A3A3A3A3A3A3A3A3A3A3A00008E +:1066E00001010101010101010101010108922400E0 +:1066F0004092240949920000000000003A813A814A +:106700003A013A015A3A5A3A5A3A5A3A39393939DF +:10671000393939395A595A595A595A593A3A3A3AE1 +:10672000393939390101010100000000081208124D +:10673000490049004012401201000100030300001B +:10674000030303030303030303030303030301011D +:10675000EBEBEEEECE0000000000000003030303AD +:106760000303030301010101EB0B0800000000001B +:106770000000000000000000030300000303030307 +:106780000303030303030303030301010800E0EE13 +:10679000C00000000000000003030303000000002D +:1067A00000000000000000000000000000000000E9 +:1067B00000000000FFFFFF3FFFFFFF3FFFFFFF3F25 +:1067C000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FD9 +:1067D000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FC9 +:1067E000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FB9 +:1067F000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FA9 +:10680000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F98 +:10681000FFFFFF3F0090292540BAC8210AE2679E8A +:10682000D409071B9E31A617685945143281E4101C +:10683000FCA8830DC6D0220A90F8C1465A206103F5 +:10684000244860277602202540BAC8210AE267DE84 +:10685000D409071B9E31A617685945143281E4906C +:10686000FCA8830DC6D0220A90F8C1065A20610305 +:10687000244840260090292540BAC8210AE2671E14 +:10688000D409071B9E31A617685945143281E410BC +:10689000FCA8830DC6D0220A90F8C1065A206103D5 +:1068A000244860270090292540BAC8210AE2671EC3 +:1068B000D409071B9E31A617685945143281E4108C +:1068C000FCA8830DC6D0220A90F8C1065A206103A5 +:1068D000244860271290292540BAC8210AE2671E81 +:1068E000D409071B9E31A617685945143281E4105C +:1068F000FCA8830DC6D0220A90F8C1065A20610375 +:1069000024D809000090292540BAC8210AE2671E50 +:10691000D409071B9E31A617685945143281E4102B +:10692000FCA8830DC6D0220A90F8C1065A20610344 +:1069300024486027FFFFFF3FFFFFFF3FFFFFFF3FB0 +:10694000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F57 +:10695000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F47 +:10696000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F37 +:10697000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F27 +:10698000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F17 +:10699000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F07 +:1069A000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FF7 +:1069B000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FE7 +:1069C000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FD7 +:1069D000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FC7 +:1069E000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FB7 +:1069F000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FA7 +:106A0000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F96 +:106A1000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F86 +:106A2000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F76 +:106A3000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F66 +:106A4000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F56 +:106A5000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F46 +:106A6000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F36 +:106A7000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F26 +:106A8000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F16 +:106A9000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F06 +:106AA000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FF6 +:106AB000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FE6 +:106AC000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FD6 +:106AD000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FC6 +:106AE000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FB6 +:106AF000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FA6 +:106B0000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F95 +:106B1000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F85 +:106B2000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F75 +:106B3000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F65 +:106B4000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F55 +:106B5000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F45 +:106B6000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F35 +:106B7000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F25 +:106B8000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F15 +:106B9000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F05 +:106BA000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FF5 +:106BB000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FE5 +:106BC000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FD5 +:106BD000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FC5 +:106BE000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FB5 +:106BF000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FA5 +:106C0000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F94 +:106C1000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F84 +:106C2000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F74 +:106C3000FFFFFF3F00000000000000000000000018 +:106C40000000000000000000000000000000000044 +:106C50000000000000000000000000000000000034 +:106C60000000000000000000000000000000000024 +:106C70000000000000000000000000000000000014 +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000000F4 +:106CA00000000000000000000000000000000000E4 +:106CB00000000000000000000000000000000000D4 +:106CC00000000000000000000000000000000000C4 +:106CD00000000000000000000000000000000000B4 +:106CE00000000000000000000000000000000000A4 +:106CF0000000000000000000000000000000000094 +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 +:106D20000000000000000000000000000000000063 +:106D30000000000000000000000000000000000053 +:106D40000000000000000000000000000000000043 +:106D50000000000000000000000000000000000033 +:106D60000000000000000000000000000000000023 +:106D70000000000000000000000000000000000013 +:106D80000000000000000000000000000000000003 +:106D900000000000000000000000000000000000F3 +:106DA00000000000000000000000000000000000E3 +:106DB00000000000000000000000000000000000D3 +:106DC00000000000000000000000000000000000C3 +:106DD00000000000000000000000000000000000B3 +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 +:106E00000000000000000000000000000000000082 +:106E10000000000000000000000000000000000072 +:106E20000000000000000000000000000000000062 +:106E30000000000000000000000000000000000052 +:106E40000000000000000000000000000000000042 +:106E50000000000000000000000000000000000032 +:106E60000000000000000000000000000000000022 +:106E70000000000000000000000000000000000012 +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000000000000000F2 +:106EA00000000000000000000000000000000000E2 +:106EB00000000000000000000000000000000000D2 +:106EC00000000000000000000000000000000000C2 +:106ED00000000000000000000000000000000000B2 +:106EE00000000000000000000000000000000000A2 +:106EF0000000000000000000000000000000000092 +:106F00000000000000000000000000000000000081 +:106F10000000000000000000000000000000000071 +:106F20000000000000000000000000000000000061 +:106F30000000000000000000000000000000000051 +:106F40000000000000000000000000000000000041 +:106F50000000000000000000000000000000000031 +:106F60000000000000000000000000000000000021 +:106F70000000000000000000000000000000000011 +:106F80000000000000000000000000000000000001 +:106F900000000000000000000000000000000000F1 +:106FA00000000000000000000000000000000000E1 +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000000000000000000000000C1 +:106FD00000000000000000000000000000000000B1 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000000091 +:107000000000000000000000000000000000000080 +:107010000000000000000000000000000000000070 +:107020000000000000000000000000000000000060 +:107030000000000000000000000000000000000050 +:107040000000000000000000000000000000000040 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:1070900000000000000000000000000000000000F0 +:1070A00000000000000000000000000000000000E0 +:1070B00000000000000000000000000000000000D0 +:1070C00000000000000000000000000000000000C0 +:1070D00000000000000000000000000000000000B0 +:1070E00000000000000000000000000000000000A0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF +:1071B00000000000000000000000000000000000CF +:1071C00000000000000000000000000000000000BF +:1071D00000000000000000000000000000000000AF +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000008F +:10720000000000000000000000000000000000007E +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000000000000000000000000000000000004E +:10724000000000000000000000000000000000003E +:10725000000000000000000000000000000000002E +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000000000EE +:1072A00000000000000000000000000000000000DE +:1072B00000000000000000000000000000000000CE +:1072C00000000000000000000000000000000000BE +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000003D +:10735000000000000000000000000000000000002D +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:1073800000000000000000000000000000000000FD +:1073900000000000000000000000000000000000ED +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000000CD +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000000000000000AD +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000008D +:10740000000000000000000000000000000000007C +:10741000000000000000000000000000000000006C +:10742000000000000000000000000000000000005C +:10743000000000000000000000000000000000004C +:10744000000000000000000000000000000000003C +:10745000000000000000000000000000000000002C +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:1074800000000000000000000000000000000000FC +:1074900000000000000000000000000000000000EC +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000000CC +:1074C00000000000000000000000000000000000BC +:1074D00000000000000000000000000000000000AC +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:10750000000000000000000000000000000000007B +:10751000000000000000000000000000000000006B +:10752000000000000000000000000000000000005B +:10753000000000000000000000000000000000004B +:10754000000000000000000000000000000000003B +:10755000000000000000000000000000000000002B +:10756000000000000000000000000000000000001B +:10757000000000000000000000000000000000000B +:1075800000000000000000000000000000000000FB +:1075900000000000000000000000000000000000EB +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000000CB +:1075C00000000000000000000000000000000000BB +:1075D00000000000000000000000000000000000AB +:1075E000000000000000000000000000000000009B +:1075F000000000000000000000000000000000008B +:10760000000000000000000000000000000000007A +:10761000000000000000000000000000000000006A +:10762000000000000000000000000000000000005A +:10763000000000000000000000000000000000004A +:10764000000000000000000000000000000000003A +:10765000000000000000000000000000000000002A +:10766000000000000000000000000000000000001A +:10767000000000000000000000000000000000000A +:1076800000000000000000000000000000000000FA +:1076900000000000000000000000000000000000EA +:1076A00000000000000000000000000000000000DA +:1076B00000000000000000000000000000000000CA +:1076C00000000000000000000000000000000000BA +:1076D00000000000000000000000000000000000AA +:1076E000000000000000000000000000000000009A +:1076F000000000000000000000000000000000008A +:107700000000000000000000000000000000000079 +:107710000000000000000000000000000000000069 +:107720000000000000000000000000000000000059 +:107730000000000000000000000000000000000049 +:107740000000000000000000000000000000000039 +:107750000000000000000000000000000000000029 +:107760000000000000000000000000000000000019 +:107770000000000000000000000000000000000009 +:1077800000000000000000000000000000000000F9 +:1077900000000000000000000000000000000000E9 +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000000000000000C9 +:1077C00000000000000000000000000000000000B9 +:1077D00000000000000000000000000000000000A9 +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000000000000000089 +:107800000000000000000000000000000000000078 +:107810000000000000000000000000000000000068 +:107820000000000000000000000000000000000058 +:107830000000000000000000000000000000000048 +:107840000000000000000000000000000000000038 +:107850000000000000000000000000000000000028 +:107860000000000000000000000000000000000018 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000000000000F8 +:1078900000000000000000000000000000000000E8 +:1078A00000000000000000000000000000000000D8 +:1078B00000000000000000000000000000000000C8 +:1078C00000000000000000000000000000000000B8 +:1078D00000000000000000000000000000000000A8 +:1078E0000000000000000000000000000000000098 +:1078F0000000000000000000000000000000000088 +:107900000000000000000000000000000000000077 +:107910000000000000000000000000000000000067 +:107920000000000000000000000000000000000057 +:107930000000000000000000000000000000000047 +:107940000000000000000000000000000000000037 +:107950000000000000000000000000000000000027 +:107960000000000000000000000000000000000017 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000000000000000F7 +:1079900000000000000000000000000000000000E7 +:1079A00000000000000000000000000000000000D7 +:1079B00000000000000000000000000000000000C7 +:1079C00000000000000000000000000000000000B7 +:1079D00000000000000000000000000000000000A7 +:1079E0000000000000000000000000000000000097 +:1079F0000000000000000000000000000000000087 +:107A00000000000000000000000000000000000076 +:107A10000000000000000000000000000000000066 +:107A20000000000000000000000000000000000056 +:107A30000000000000000000000000000000000046 +:107A40000000000000000000000000000000000036 +:107A50000000000000000000000000000000000026 +:107A60000000000000000000000000000000000016 +:107A70000000000000000000000000000000000006 +:107A800000000000000000000000000000000000F6 +:107A900000000000000000000000000000000000E6 +:107AA00000000000000000000000000000000000D6 +:107AB00000000000000000000000000000000000C6 +:107AC00000000000000000000000000000000000B6 +:107AD00000000000000000000000000000000000A6 +:107AE0000000000000000000000000000000000096 +:107AF0000000000000000000000000000000000086 +:107B00000000000000000000000000000000000075 +:107B10000000000000000000000000000000000065 +:107B20000000000000000000000000000000000055 +:107B30000000000000000000000000000000000045 +:107B40000000000000000000000000000000000035 +:107B50000000000000000000000000000000000025 +:107B60000000000000000000000000000000000015 +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000000000000000F5 +:107B900000000000000000000000000000000000E5 +:107BA00000000000000000000000000000000000D5 +:107BB00000000000000000000000000000000000C5 +:107BC00000000000000000000000000000000000B5 +:107BD00000000000000000000000000000000000A5 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000000000000000085 +:107C00000000000000000000000000000000000074 +:107C10000000000000000000000000000000000064 +:107C20000000000000000000000000000000000054 +:107C30000000000000000000000000000000000044 +:107C40000000000000000000000000000000000034 +:107C50000000000000000000000000000000000024 +:107C60000000000000000000000000000000000014 +:107C70000000000000000000000000000000000004 +:107C800000000000000000000000000000000000F4 +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 +:107CC00000000000000000000000000000000000B4 +:107CD00000000000000000000000000000000000A4 +:107CE0000000000000000000000000000000000094 +:107CF0000000000000000000000000000000000084 +:107D00000000000000000000000000000000000073 +:107D10000000000000000000000000000000000063 +:107D20000000000000000000000000000000000053 +:107D30000000000000000000000000000000000043 +:107D40000000000000000000000000000000000033 +:107D50000000000000000000000000000000000023 +:107D60000000000000000000000000000000000013 +:107D70000000000000000000000000000000000003 +:107D800000000000000000000000000000000000F3 +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000000C3 +:107DC00000000000000000000000000000000000B3 +:107DD00000000000000000000000000000000000A3 +:107DE0000000000000000000000000000000000093 +:107DF0000000000000000000000000000000000083 +:107E00000000000000000000000000000000000072 +:107E10000000000000000000000000000000000062 +:107E20000000000000000000000000000000000052 +:107E30000000000000000000000000000000000042 +:107E40000000000000000000000000000000000032 +:107E50000000000000000000000000000000000022 +:107E60000000000000000000000000000000000012 +:107E70000000000000000000000000000000000002 +:107E800000000000000000000000000000000000F2 +:107E900000000000000000000000000000000000E2 +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000000000000000000C2 +:107EC00000000000000000000000000000000000B2 +:107ED00000000000000000000000000000000000A2 +:107EE0000000000000000000000000000000000092 +:107EF0000000000000000000000000000000000082 +:107F00000000000000000000000000000000000071 +:107F10000000000000000000000000000000000061 +:107F20000000000000000000000000000000000051 +:107F30000000000000000000000000000000000041 +:107F40000000000000000000000000000000000031 +:107F50000000000000000000000000000000000021 +:107F60000000000000000000000000000000000011 +:107F70000000000000000000000000000000000001 +:107F800000000000000000000000000000000000F1 +:107F900000000000000000000000000000000000E1 +:107FA00000000000000000000000000000000000D1 +:107FB00000000000000000000000000000000000C1 +:107FC00000000000000000000000000000000000B1 +:107FD00000000000000000000000000000000000A1 +:107FE0000000000000000000000000000000000091 +:107FF0000000000000000000000000000000000081 +:108000000000000000000000000000000000000070 +:108010000000000000000000000000000000000060 +:108020000000000000000000000000000000000050 +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 +:108050000000000000000000000000000000000020 +:108060000000000000000000000000000000000010 +:108070000000000000000000000000000000000000 +:1080800000000000000000000000000000000000F0 +:1080900000000000000000000000000000000000E0 +:1080A00000000000000000000000000000000000D0 +:1080B00000000000000000000000000000000000C0 +:1080C00000000000000000000000000000000000B0 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000000090 +:1080F0000000000000000000000000000000000080 +:10810000000000000000000000000000000000006F +:10811000000000000000000000000000000000005F +:10812000000000000000000000000000000000004F +:10813000000000000000000000000000000000003F +:10814000000000000000000000000000000000002F +:10815000000000000000000000000000000000001F +:10816000000000000000000000000000000000000F +:1081700000000000000000000000000000000000FF +:1081800000000000000000000000000000000000EF +:1081900000000000000000000000000000000000DF +:1081A00000000000000000000000000000000000CF +:1081B00000000000000000000000000000000000BF +:1081C00000000000000000000000000000000000AF +:1081D000000000000000000000000000000000009F +:1081E000000000000000000000000000000000008F +:1081F000000000000000000000000000000000007F +:10820000000000000000000000000000000000006E +:10821000000000000000000000000000000000005E +:10822000000000000000000000000000000000004E +:10823000000000000000000000000000000000003E +:10824000000000000000000000000000000000002E +:10825000000000000000000000000000000000001E +:10826000000000000000000000000000000000000E +:1082700000000000000000000000000000000000FE +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000000000000000000CE +:1082B00000000000000000000000000000000000BE +:1082C00000000000000000000000000000000000AE +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F000000000000000000000000000000000007E +:10830000000000000000000000000000000000006D +:10831000000000000000000000000000000000005D +:10832000000000000000000000000000000000004D +:10833000000000000000000000000000000000003D +:10834000000000000000000000000000000000002D +:10835000000000000000000000000000000000001D +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED +:1083900000000000000000000000000000000000DD +:1083A00000000000000000000000000000000000CD +:1083B00000000000000000000000000000000000BD +:1083C00000000000000000000000000000000000AD +:1083D000000000000000000000000000000000009D +:1083E000000000000000000000000000000000008D +:1083F000000000000000000000000000000000007D +:10840000000000000000000000000000000000006C +:10841000000000000000000000000000000000005C +:10842000000000000000000000000000000000004C +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:10846000000000000000000000000000000000000C +:1084700000000000000000000000000000000000FC +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000000000000000DC +:1084A00000000000000000000000000000000000CC +:1084B00000000000000000000000000000000000BC +:1084C00000000000000000000000000000000000AC +:1084D000000000000000000000000000000000009C +:1084E000000000000000000000000000000000008C +:1084F000000000000000000000000000000000007C +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B +:10852000000000000000000000000000000000004B +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000000000002B +:10855000000000000000000000000000000000001B +:10856000000000000000000000000000000000000B +:1085700000000000000000000000000000000000FB +:1085800000000000000000000000000000000000EB +:1085900000000000000000000000000000000000DB +:1085A00000000000000000000000000000000000CB +:1085B00000000000000000000000000000000000BB +:1085C00000000000000000000000000000000000AB +:1085D000000000000000000000000000000000009B +:1085E000000000000000000000000000000000008B +:1085F000000000000000000000000000000000007B +:10860000000000000000000000000000000000006A +:10861000000000000000000000000000000000005A +:10862000000000000000000000000000000000004A +:10863000000000000000000000000000000000003A +:10864000000000000000000000000000000000002A +:10865000000000000000000000000000000000001A +:10866000000000000000000000000000000000000A +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000000EA +:1086900000000000000000000000000000000000DA +:1086A00000000000000000000000000000000000CA +:1086B00000000000000000000000000000000000BA +:1086C00000000000000000000000000000000000AA +:1086D000000000000000000000000000000000009A +:1086E000000000000000000000000000000000008A +:1086F000000000000000000000000000000000007A +:108700000000000000000000000000000000000069 +:108710000000000000000000000000000000000059 +:108720000000000000000000000000000000000049 +:108730000000000000000000000000000000000039 +:108740000000000000000000000000000000000029 +:108750000000000000000000000000000000000019 +:108760000000000000000000000000000000000009 +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:1087900000000000000000000000000000000000D9 +:1087A00000000000000000000000000000000000C9 +:1087B00000000000000000000000000000000000B9 +:1087C00000000000000000000000000000000000A9 +:1087D0000000000000000000000000000000000099 +:1087E0000000000000000000000000000000000089 +:1087F0000000000000000000000000000000000079 +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000058 +:108820000000000000000000000000000000000048 +:108830000000000000000000000000000000000038 +:108840000000000000000000000000000000000028 +:108850000000000000000000000000000000000018 +:108860000000000000000000000000000000000008 +:1088700000000000000000000000000000000000F8 +:1088800000000000000000000000000000000000E8 +:1088900000000000000000000000000000000000D8 +:1088A00000000000000000000000000000000000C8 +:1088B00000000000000000000000000000000000B8 +:1088C00000000000000000000000000000000000A8 +:1088D0000000000000000000000000000000000098 +:1088E0000000000000000000000000000000000088 +:1088F0000000000000000000000000000000000078 +:108900000000000000000000000000000000000067 +:108910000000000000000000000000000000000057 +:108920000000000000000000000000000000000047 +:108930000000000000000000000000000000000037 +:108940000000000000000000000000000000000027 +:108950000000000000000000000000000000000017 +:108960000000000000000000000000000000000007 +:1089700000000000000000000000000000000000F7 +:1089800000000000000000000000000000000000E7 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000000000000C7 +:1089B00000000000000000000000000000000000B7 +:1089C00000000000000000000000000000000000A7 +:1089D0000000000000000000000000000000000097 +:1089E0000000000000000000000000000000000087 +:1089F0000000000000000000000000000000000077 +:108A00000000000000000000000000000000000066 +:108A10000000000000000000000000000000000056 +:108A20000000000000000000000000000000000046 +:108A30000000000000000000000000000000000036 +:108A40000000000000000000000000000000000026 +:108A50000000000000000000000000000000000016 +:108A60000000000000000000000000000000000006 +:108A700000000000000000000000000000000000F6 +:108A800000000000000000000000000000000000E6 +:108A900000000000000000000000000000000000D6 +:108AA00000000000000000000000000000000000C6 +:108AB00000000000000000000000000000000000B6 +:108AC00000000000000000000000000000000000A6 +:108AD0000000000000000000000000000000000096 +:108AE0000000000000000000000000000000000086 +:108AF0000000000000000000000000000000000076 +:108B00000000000000000000000000000000000065 +:108B10000000000000000000000000000000000055 +:108B20000000000000000000000000000000000045 +:108B30000000000000000000000000000000000035 +:108B40000000000000000000000000000000000025 +:108B50000000000000000000000000000000000015 +:108B60000000000000000000000000000000000005 +:108B700000000000000000000000000000000000F5 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA00000000000000000000000000000000000C5 +:108BB00000000000000000000000000000000000B5 +:108BC00000000000000000000000000000000000A5 +:108BD0000000000000000000000000000000000095 +:108BE0000000000000000000000000000000000085 +:108BF0000000000000000000000000000000000075 +:108C00000000000000000000000000000000000064 +:108C10000000000000000000000000000000000054 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C40000000000000000000000000000000000024 +:108C50000000000000000000000000000000000014 +:108C60000000000000000000000000000000000004 +:108C700000000000000000000000000000000000F4 +:108C800000000000000000000000000000000000E4 +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 +:108CC00000000000000000000000000000000000A4 +:108CD0000000000000000000000000000000000094 +:108CE0000000000000000000000000000000000084 +:108CF0000000000000000000000000000000000074 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D40000000000000000000000000000000000023 +:108D50000000000000000000000000000000000013 +:108D60000000000000000000000000000000000003 +:108D700000000000000000000000000000000000F3 +:108D800000000000000000000000000000000000E3 +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC00000000000000000000000000000000000A3 +:108DD0000000000000000000000000000000000093 +:108DE0000000000000000000000000000000000083 +:108DF0000000000000000000000000000000000073 +:108E00000000000000000000000000000000000062 +:108E10000000000000000000000000000000000052 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 +:108E60000000000000000000000000000000000002 +:108E700000000000000000000000000000000000F2 +:108E800000000000000000000000000000000000E2 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC00000000000000000000000000000000000A2 +:108ED0000000000000000000000000000000000092 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F00000000000000000000000000000000000061 +:108F10000000000000000000000000000000000051 +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 +:108F40000000000000000000000000000000000021 +:108F50000000000000000000000000000000000011 +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000000000F1 +:108F800000000000000000000000000000000000E1 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 +:108FC00000000000000000000000000000000000A1 +:108FD0000000000000000000000000000000000091 +:108FE0000000000000000000000000000000000081 +:108FF0000000000000000000000000000000000071 +:109000000000000000000000000000000000000060 +:109010000000000000000000000000000000000050 +:109020000000000000000000000000000000000040 +:109030000000000000000000000000000000000030 +:109040000000000000000000000000000000000020 +:109050000000000000000000000000000000000010 +:109060000000000000000000000000000000000000 +:1090700000000000000000000000000000000000F0 +:1090800000000000000000000000000000000000E0 +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000000000000000000000B0 +:1090C00000000000000000000000000000000000A0 +:1090D0000000000000000000000000000000000090 +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 +:10910000000000000000000000000000000000005F +:10911000000000000000000000000000000000004F +:10912000000000000000000000000000000000003F +:10913000000000000000000000000000000000002F +:10914000000000000000000000000000000000001F +:10915000000000000000000000000000000000000F +:1091600000000000000000000000000000000000FF +:1091700000000000000000000000000000000000EF +:1091800000000000000000000000000000000000DF +:1091900000000000000000000000000000000000CF +:1091A00000000000000000000000000000000000BF +:1091B00000000000000000000000000000000000AF +:1091C000000000000000000000000000000000009F +:1091D000000000000000000000000000000000008F +:1091E000000000000000000000000000000000007F +:1091F000000000000000000000000000000000006F +:10920000000000000000000000000000000000005E +:10921000000000000000000000000000000000004E +:10922000000000000000000000000000000000003E +:10923000000000000000000000000000000000002E +:10924000000000000000000000000000000000001E +:10925000000000000000000000000000000000000E +:1092600000000000000000000000000000000000FE +:1092700000000000000000000000000000000000EE +:1092800000000000000000000000000000000000DE +:1092900000000000000000000000000000000000CE +:1092A00000000000000000000000000000000000BE +:1092B00000000000000000000000000000000000AE +:1092C000000000000000000000000000000000009E +:1092D000000000000000000000000000000000008E +:1092E000000000000000000000000000000000007E +:1092F000000000000000000000000000000000006E +:10930000000000000000000000000000000000005D +:10931000000000000000000000000000000000004D +:10932000000000000000000000000000000000003D +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:10935000000000000000000000000000000000000D +:1093600000000000000000000000000000000000FD +:1093700000000000000000000000000000000000ED +:1093800000000000000000000000000000000000DD +:1093900000000000000000000000000000000000CD +:1093A00000000000000000000000000000000000BD +:1093B00000000000000000000000000000000000AD +:1093C000000000000000000000000000000000009D +:1093D000000000000000000000000000000000008D +:1093E000000000000000000000000000000000007D +:1093F000000000000000000000000000000000006D +:10940000000000000000000000000000000000005C +:10941000000000000000000000000000000000004C +:10942000000000000000000000000000000000003C +:10943000000000000000000000000000000000002C +:10944000000000000000000000000000000000001C +:10945000000000000000000000000000000000000C +:1094600000000000000000000000000000000000FC +:1094700000000000000000000000000000000000EC +:1094800000000000000000000000000000000000DC +:1094900000000000000000000000000000000000CC +:1094A00000000000000000000000000000000000BC +:1094B00000000000000000000000000000000000AC +:1094C000000000000000000000000000000000009C +:1094D000000000000000000000000000000000008C +:1094E000000000000000000000000000000000007C +:1094F000000000000000000000000000000000006C +:10950000000000000000000000000000000000005B +:10951000000000000000000000000000000000004B +:10952000000000000000000000000000000000003B +:10953000000000000000000000000000000000002B +:10954000000000000000000000000000000000001B +:10955000000000000000000000000000000000000B +:1095600000000000000000000000000000000000FB +:1095700000000000000000000000000000000000EB +:1095800000000000000000000000000000000000DB +:1095900000000000000000000000000000000000CB +:1095A00000000000000000000000000000000000BB +:1095B00000000000000000000000000000000000AB +:1095C000000000000000000000000000000000009B +:1095D000000000000000000000000000000000008B +:1095E000000000000000000000000000000000007B +:1095F000000000000000000000000000000000006B +:10960000000000000000000000000000000000005A +:10961000000000000000000000000000000000004A +:10962000000000000000000000000000000000003A +:10963000000000000000000000000000000000002A +:10964000000000000000000000000000000000001A +:10965000000000000000000000000000000000000A +:1096600000000000000000000000000000000000FA +:1096700000000000000000000000000000000000EA +:1096800000000000000000000000000000000000DA +:1096900000000000000000000000000000000000CA +:1096A00000000000000000000000000000000000BA +:1096B00000000000000000000000000000000000AA +:1096C000000000000000000000000000000000009A +:1096D000000000000000000000000000000000008A +:1096E000000000000000000000000000000000007A +:1096F000000000000000000000000000000000006A +:109700000000000000000000000000000000000059 +:109710000000000000000000000000000000000049 +:109720000000000000000000000000000000000039 +:109730000000000000000000000000000000000029 +:109740000000000000000000000000000000000019 +:109750000000000000000000000000000000000009 +:1097600000000000000000000000000000000000F9 +:1097700000000000000000000000000000000000E9 +:1097800000000000000000000000000000000000D9 +:1097900000000000000000000000000000000000C9 +:1097A00000000000000000000000000000000000B9 +:1097B00000000000000000000000000000000000A9 +:1097C0000000000000000000000000000000000099 +:1097D0000000000000000000000000000000000089 +:1097E0000000000000000000000000000000000079 +:1097F0000000000000000000000000000000000069 +:109800000000000000000000000000000000000058 +:109810000000000000000000000000000000000048 +:109820000000000000000000000000000000000038 +:109830000000000000000000000000000000000028 +:109840000000000000000000000000000000000018 +:109850000000000000000000000000000000000008 +:1098600000000000000000000000000000000000F8 +:1098700000000000000000000000000000000000E8 +:1098800000000000000000000000000000000000D8 +:1098900000000000000000000000000000000000C8 +:1098A00000000000000000000000000000000000B8 +:1098B00000000000000000000000000000000000A8 +:1098C0000000000000000000000000000000000098 +:1098D0000000000000000000000000000000000088 +:1098E0000000000000000000000000000000000078 +:1098F0000000000000000000000000000000000068 +:109900000000000000000000000000000000000057 +:109910000000000000000000000000000000000047 +:109920000000000000000000000000000000000037 +:109930000000000000000000000000000000000027 +:109940000000000000000000000000000000000017 +:109950000000000000000000000000000000000007 +:1099600000000000000000000000000000000000F7 +:1099700000000000000000000000000000000000E7 +:1099800000000000000000000000000000000000D7 +:1099900000000000000000000000000000000000C7 +:1099A00000000000000000000000000000000000B7 +:1099B00000000000000000000000000000000000A7 +:1099C0000000000000000000000000000000000097 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000000000000000000000077 +:1099F0000000000000000000000000000000000067 +:109A00000000000000000000000000000000000056 +:109A10000000000000000000000000000000000046 +:109A20000000000000000000000000000000000036 +:109A30000000000000000000000000000000000026 +:109A40000000000000000000000000000000000016 +:109A50000000000000000000000000000000000006 +:109A600000000000000000000000000000000000F6 +:109A700000000000000000000000000000000000E6 +:109A800000000000000000000000000000000000D6 +:109A900000000000000000000000000000000000C6 +:109AA00000000000000000000000000000000000B6 +:109AB00000000000000000000000000000000000A6 +:109AC0000000000000000000000000000000000096 +:109AD0000000000000000000000000000000000086 +:109AE0000000000000000000000000000000000076 +:109AF0000000000000000000000000000000000066 +:109B00000000000000000000000000000000000055 +:109B10000000000000000000000000000000000045 +:109B20000000000000000000000000000000000035 +:109B30000000000000000000000000000000000025 +:109B40000000000000000000000000000000000015 +:109B50000000000000000000000000000000000005 +:109B600000000000000000000000000000000000F5 +:109B700000000000000000000000000000000000E5 +:109B800000000000000000000000000000000000D5 +:109B900000000000000000000000000000000000C5 +:109BA00000000000000000000000000000000000B5 +:109BB00000000000000000000000000000000000A5 +:109BC0000000000000000000000000000000000095 +:109BD0000000000000000000000000000000000085 +:109BE0000000000000000000000000000000000075 +:109BF0000000000000000000000000000000000065 +:109C00000000000000000000000000000000000054 +:109C10000000000000000000000000000000000044 +:109C20000000000000000000000000000000000034 +:109C30000000000000000000000000000000000024 +:109C40000000000000000000000000000000000014 +:109C50000000000000000000000000000000000004 +:109C600000000000000000000000000000000000F4 +:109C700000000000000000000000000000000000E4 +:109C800000000000000000000000000000000000D4 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000000000000000B4 +:109CB00000000000000000000000000000000000A4 +:109CC0000000000000000000000000000000000094 +:109CD0000000000000000000000000000000000084 +:109CE0000000000000000000000000000000000074 +:109CF0000000000000000000000000000000000064 +:109D00000000000000000000000000000000000053 +:109D10000000000000000000000000000000000043 +:109D20000000000000000000000000000000000033 +:109D30000000000000000000000000000000000023 +:109D40000000000000000000000000000000000013 +:109D50000000000000000000000000000000000003 +:109D600000000000000000000000000000000000F3 +:109D700000000000000000000000000000000000E3 +:109D800000000000000000000000000000000000D3 +:109D900000000000000000000000000000000000C3 +:109DA00000000000000000000000000000000000B3 +:109DB00000000000000000000000000000000000A3 +:109DC0000000000000000000000000000000000093 +:109DD0000000000000000000000000000000000083 +:109DE0000000000000000000000000000000000073 +:109DF0000000000000000000000000000000000063 +:109E00000000000000000000000000000000000052 +:109E10000000000000000000000000000000000042 +:109E20000000000000000000000000000000000032 +:109E30000000000000000000000000000000000022 +:109E40000000000000000000000000000000000012 +:109E50000000000000000000000000000000000002 +:109E600000000000000000000000000000000000F2 +:109E700000000000000000000000000000000000E2 +:109E800000000000000000000000000000000000D2 +:109E900000000000000000000000000000000000C2 +:109EA00000000000000000000000000000000000B2 +:109EB00000000000000000000000000000000000A2 +:109EC0000000000000000000000000000000000092 +:109ED0000000000000000000000000000000000082 +:109EE0000000000000000000000000000000000072 +:109EF0000000000000000000000000000000000062 +:109F00000000000000000000000000000000000051 +:109F10000000000000000000000000000000000041 +:109F20000000000000000000000000000000000031 +:109F30000000000000000000000000000000000021 +:109F40000000000000000000000000000000000011 +:109F50000000000000000000000000000000000001 +:109F600000000000000000000000000000000000F1 +:109F700000000000000000000000000000000000E1 +:109F800000000000000000000000000000000000D1 +:109F900000000000000000000000000000000000C1 +:109FA00000000000000000000000000000000000B1 +:109FB00000000000000000000000000000000000A1 +:109FC0000000000000000000000000000000000091 +:109FD0000000000000000000000000000000000081 +:109FE0000000000000000000000000000000000071 +:109FF0000000000000000000000000000000000061 +:10A000001BE412243804E8080E0A000101010812BA +:10A010002400380400090000000C000400000000C7 +:10A0200000000E5900000000000000000009010AB5 +:10A0300000013C4088020000281E2000C0314F0073 +:10A04000000E0100000E0100C0314F00C0314F0072 +:10A05000000E0100000E0100C0314F00C0314F0062 +:10A06000000E0100000E0100C0314F00C0314F0052 +:10A07000000E0100000E0100C0314F000000000082 +:10A0800000010100000000000000000000000000CE +:10A0900000000000000000000001010101010100BA +:10A0A00000010100000101010101010100000100A6 +:10A0B00001000000000000000F0F000001012D0052 +:10A0C0002D000A00640078000100320001015F00E9 +:10A0D0005F0014000A007800000064002D000000FA +:10A0E00000000000000000002C01F4012C012C01F4 +:10A0F0002C010A0A000120000001F40105050000FE +:10A1000007010000CEFFD3FF3700F6FF1200E4FF87 +:10A11000FF7FFF7FFF7FFF7FFF7FFF7F960096001F +:10A120003C003C320A08CECE323228050000000046 +:10A1300001070D1200240D00000000122424242425 +:10A140002424242424242424242424242424000017 +:10A1500000000000000000000000000000000000FF +:10A160000A05000A000000002328011E1114000047 +:10A170000000000000000000010200030400FA0FCC +:10A18000000000000F1E324650000000736C5A5A47 +:10A190005555555508000000000000000F1E3246BE +:10A1A00050000000736C5A5A555555550F141E280F +:10A1B000000000000A0A0A0A0A0A0A0A0F1E3246AA +:10A1C00000000000645F553C3C3C3C3C000000004B +:10A1D00003081C004200ECFF1700B0008200BC0224 +:10A1E000000000000010000055002D00C8002800ED +:10A1F0000F000F00C800C800C800C80000003704E6 +:10A200000000E708F401000037040000E7083214FA +:10A21000021E1E320200AF00280028006400D40392 +:10A2200064008408000000003804300020000100B1 +:10A23000220000003A00520070008F00AF00CF00F3 +:10A24000EF000F012E014F016E018E01AD01CE0115 +:10A25000EC010F022D024D026D028D02AC02CC0208 +:10A26000EB020B032B034A036A038903AA03C90306 +:10A27000E703FF03370400000000000000000000B7 +:10A2800000000000000000000000000000000000CE +:10A2900000000000000000000000000000000000BE +:10A2A00000000000000000000000000000000000AE +:10A2B000000000000000000000000000000000009E +:10A2C000000000000000000000000000000000008E +:10A2D000000000000000000000000000000000007E +:10A2E000000000000000000000000000000000006E +:10A2F00000000000000000000000000930004600DF +:10A300000100480000003C00430066008500A900F1 +:10A31000C800E90009012A0149016B018901AB016B +:10A32000C901EB0109022B024A026C028A02AC024B +:10A33000CA02EC020B032D034B036D038B03AE0328 +:10A34000CB03EE030C042F044C046F048B04AF0406 +:10A35000CC04EF040D0530054D0570058D05B005E5 +:10A36000CD05F1050D0630064E0672068E06B106C5 +:10A37000CE06F2060F073207500773079007B307A0 +:10A38000D107F40711083408520875089108B1087C +:10A39000C608E70800000000000000000000000000 +:10A3A00000000000000000000000000000000000AD +:10A3B000000000000000000000000000000000009D +:10A3C000000000000000000000000000000000008D +:10A3D00002022000F16C0000409C000084D90600BD +:10A3E00029B1010010270000C4090000010101018A +:10A3F000010101010101014B0F00460000000000B6 +:10A40000020101010101010101010100F16C0000E3 +:10A4100002010101010101010101010084DE0100CD +:10A42000000000000F0F0A0A1E00000000000000DC +:10A430000F0F141400010101010140003200E80374 +:10A440000F0008000500E100000006060A001400E5 +:10A4500014000400000000001400140064009001C7 +:10A460000000000141020000000000006801000D32 +:10A470000F006400640064000A0064002C016400A2 +:10A480002C010A02E8E8F800F800010201001900B6 +:10A490006A00750081008E009D00AC00BD00CF00F9 +:10A4A000E200F7000D01260140015C0179019901EC +:10A4B000BC01E001060230025B028902BA02EE0230 +:10A4C00024035D039A03D9031B046004A904F40464 +:10A4D00043059505E90541069C06FA065B07BE079C +:10A4E00024088D08F8086509D409450AB80A2D0B17 +:10A4F000A20B190C900C080D800DF80D6F0EE60ED6 +:10A500005C0FD00F4210B31021118C11F4115912AD +:10A51000BA1217137013C41313145D14A114E014AA +:10A5200018154B1577159C15BB15D415E515EF15AA +:10A53000F3156A00750081008E009D00AC00BD001F +:10A54000CF00E200F7000D01260140015C01790116 +:10A550009901BC01E001060230025B028902BA02E5 +:10A56000EE0224035D039A03D9031B046004A904CB +:10A57000F40443059505E90541069C06FA065B07C8 +:10A58000BE0724088D08F8086509D409450AB80AE9 +:10A590002D0BA20B190C900C080D800DF80D6F0EF1 +:10A5A000E60E5C0FD00F4210B31021118C11F41184 +:10A5B0005912BA1217137013C41313145D14A11493 +:10A5C000E01418154B1577159C15BB15D415E5151A +:10A5D000EF15F315A500B300C300D400E700FA009F +:10A5E0000F0126013E01570172018F01AE01CF011B +:10A5F000F10116023C0265029002BD02ED021E034B +:10A6000052038903C203FE033C047C04BF04050516 +:10A610004D059805E50535068706DB0632078A07EE +:10A62000E5074208A10801096309C7092C0A920A33 +:10A63000F90A600BC80B310C9A0C020D6B0DD20D90 +:10A64000390E9F0E040F670FC80F27108410DE10FD +:10A6500035118911DA1128127112B712F812351357 +:10A660006D13A013CF13F8131C143B145414681467 +:10A6700076147E1481149800A600B500C500D7009A +:10A68000EA00FE0013012B0143015E017A019801EB +:10A69000B701D901FD0122024A027502A102D002CE +:10A6A000010335036B03A403DF031D045D04A00451 +:10A6B000E6042E057905C70517066A06BF061607C4 +:10A6C0007007CC072B088B08ED085109B6091D0A45 +:10A6D000850AEF0A590BC40B2F0C9A0C060D710D4D +:10A6E000DC0D460EAF0E170F7D0FE10F4310A310C8 +:10A6F00001115B11B21106125612A212EB122E13A7 +:10A700006D13A813DD130D1438145E147E14981401 +:10A71000AD14BB14C414C7145500550045004200C5 +:10A720000000000001036400640264005A008C0011 +:10A73000BE00140005000000000000000000000042 +:10A740000000000000000000000000000000000009 +:10A7500000000000000000000000000000000000F9 +:10A7600000000000000000000000000000000000E9 +:10A77000000000001B0000000000000000000000BE +:10A7800000000000000000000000000000000000C9 +:10A7900000000000000000000000000000000000B9 +:10A7A00000000000000000000000000000000000A9 +:10A7B0000000000000000000000000000000000099 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000000000000000000000079 +:10A7E0000000000000000000000000000000000069 +:10A7F0000000000000000000000000000000000059 +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000000000000000000028 +:10A830000000000000000000000000000000000018 +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000000F8 +:10A8600000000000000000000000000000000000E8 +:10A8700000000000000000000000000000000000D8 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 +:10A8A00000000000000000000000000000000000A8 +:10A8B0000000000000000000000000000000000098 +:10A8C0000000000000000000000000000000000088 +:10A8D0000000000000000000000000000000000078 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000000000000000000000000000000058 +:10A900000000000000000000000000000000000047 +:10A910000000000000000000000000000000000037 +:10A920000000000000000000000000000000000027 +:10A930000000000000000000000000000000000017 +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000000000000000000F7 +:10A9600000000000000000000000000000000000E7 +:10A9700000000000000000000000000000000000D7 +:10A9800000000000000000000000000000000000C7 +:10A9900000000000000000000000000000000000B7 +:10A9A00000000000000000000000000000000000A7 +:10A9B0000000000000000000000000000000000097 +:10A9C0000000000000000000000000000000000087 +:10A9D0000000000000000000000000000000000077 +:10A9E0000000000000000000000000000000000067 +:10A9F0000000000000000000000000000000000057 +:10AA00000000000000000000000000000000000046 +:10AA10000000000000000000000000000000000036 +:10AA20000000000000000000000000000000000026 +:10AA30000000000000000000000000000000000016 +:10AA40000000000000000000000000000000000006 +:10AA500000000000000000000000000000000000F6 +:10AA600000000000000000000000000000000000E6 +:10AA700000000000000000000000000000000000D6 +:10AA800000000000000000000000000000000000C6 +:10AA900000000000000000000000000000000000B6 +:10AAA00000000000000000000000000000000000A6 +:10AAB0000000000000000000000000000000000096 +:10AAC0000000000000000000000000000000000086 +:10AAD0000000000000000000000000000000000076 +:10AAE0000000000000000000000000000000000066 +:10AAF0000000000000000000000000000000000056 +:10AB00000000000000000000000000000000000045 +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000000000015 +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000000F5 +:10AB600000000000000000000000000000000000E5 +:10AB700000000000000000000000000000000000D5 +:10AB800000000000000000000000000000000000C5 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000000000000000000000095 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000000000000000000000075 +:10ABE0000000000000000000000000000000000065 +:10ABF0000000000000000000000000000000000055 +:10AC00000000000000000000000000000000000044 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000000000000000C4 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD0000000000000000000000000000000000074 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000000000000000000000033 +:10AD20000000000000000000000000000000000023 +:10AD30000000000000000000000000000000000013 +:10AD40000000000000000000000000000000000003 +:10AD500000000000000000000000000000000000F3 +:10AD600000000000000000000000000000000000E3 +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000000000000000000000000000093 +:10ADC0000000000000000000000000000000000083 +:10ADD0000000000000000000000000000000000073 +:10ADE0000000000000000000000000000000000063 +:10ADF0000000000000000000000000000000000053 +:10AE00000000000000000000000000000000000042 +:10AE10000000000000000000000000000000000032 +:10AE20000000000000000000000000000000000022 +:10AE30000000000000000000000000000000000012 +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000000F2 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000000A2 +:10AEB0000000000000000000000000000000000092 +:10AEC0000000000000000000000000000000000082 +:10AED0000000000000000000000000000000000072 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000000000000052 +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000031 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000000000E1 +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000000000000081 +:10AFD0000000000000000000000000000000000071 +:10AFE0000000000000000000000000000000000061 +:10AFF000000000000000000000000000004E565459 +:10B00000000076425C0F88431900CE400C001741C7 +:10B010000000000000000000000000000000000030 +:10B02000002492000000000020204801204E02076A +:10B0300041B428122342B428122243B428122344D4 +:10B04000B428122345B4281223469428122348B466 +:10B050002812220000000000000000000000000094 +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B090000000000000000000000000000000610E41 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D0000000000000000000000000000000000070 +:10B0E0000000000000000000000000000000000060 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B12000000000000000000000000000000000001F +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000007F +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000000000004F +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000000000000000001E +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C +:10B4D000000000000000000000000000000000006C +:10B4E000000000000000000000000000000000005C +:10B4F000000000000000000000000000000000004C +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B +:10B5D000000000000000000000000000000000006B +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000000000000000000000000E9 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 +:10B7A0000000000000000000000000000000000099 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D0000000000000000000000000000000000069 +:10B7E0000000000000000000000000000000000059 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B8600000000000000000000000000000000000D8 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000068 +:10B8E0000000000000000000000000000000000058 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000000000000000000017 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000000000000000E7 +:10B9600000000000000000000000000000000000D7 +:10B9700000000000000000000000000000000000C7 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000000000000000000000057 +:10B9F0000000000000000000000000000000000047 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000000000000000000000C3 +:10BD800000000000000000000000000000000000B3 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000063 +:10BDE0000000000000000000000000000000000053 +:10BDF0000000000000000000000000000000000043 +:10BE00000000000000000000000000000000000032 +:10BE10000000000000000000000000000000000022 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000000000000000000000C2 +:10BE800000000000000000000000000000000000B2 +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 +:10BEE0000000000000000000000000000000000052 +:10BEF0000000000000000000000000000000000042 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE0000000000000000000000000000000000051 +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C010000000000000000000000000000000000020 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000000000000B0 +:10C0900000000000000000000000000000000000A0 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C11000000000000000000000000000000000001F +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C1700000000000000000000000000000000000BF +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000000000000000000000003F +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000000000000000000000BE +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000000000000000000000BD +:10C3800000000000000000000000000000000000AD +:10C39000000000000000000000000000000000009D +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000000000000000007D +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C4800000000000000000000000000000000000AC +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C50000000000000000000000000000000000002B +:10C51000000000000000000000000000000000001B +:10C52000000000000000000000000000000000000B +:10C5300000000000000000000000000000000000FB +:10C5400000000000000000000000000000000000EB +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B +:10C5D000000000000000000000000000000000005B +:10C5E000000000000000000000000000000000004B +:10C5F000000000000000000000000000000000003B +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000000000000000001A +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D000000000000000000000000000000000005A +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000000000000018 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA20000000000000000000000000000000000006 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000000000C6 +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000000000046 +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB300000000000000000000000000000000000F5 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000000000000000000000000000000000B5 +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000000000000000085 +:10CBB0000000000000000000000000000000000075 +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000000000000000000000045 +:10CBF0000000000000000000000000000000000035 +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000000000000000000000014 +:10CC20000000000000000000000000000000000004 +:10CC300000000000000000000000000000000000F4 +:10CC400000000000000000000000000000000000E4 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000000000B4 +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000000000000000000074 +:10CCC0000000000000000000000000000000000064 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000000000000000000000F3 +:10CD400000000000000000000000000000000000E3 +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD800000000000000000000000000000000000A3 +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000000000000000000063 +:10CDD0000000000000000000000000000000000053 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000000000000000000000D1 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:00000001FF diff --git a/firmware/synaptics_boe_4320.fw.ihex b/firmware/synaptics_boe_4320.fw.ihex new file mode 100644 index 000000000000..5bec9460d815 --- /dev/null +++ b/firmware/synaptics_boe_4320.fw.ihex @@ -0,0 +1,7447 @@ +:100000002B471848050000001C000000C00000003D +:10001000C4590100466701006A87010016E5057CA6 +:10002000424F4F545F434F4E4649472020202020E7 +:1000300000000000C00F00008000000053344FDEBD +:10004000A045000000000000FFFFFFFFFFFFFFFFD3 +:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:10008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:10009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:1000C00016E5057C4150505F434F444520202020D9 +:1000D000202020200100000000100000E058010056 +:1000E0006DBCB6711C2BE0E62B003A06AAC1CC9D74 +:1000F0007FC719881DB20C87A02A35030549205AED +:100100000BEC8A5073C6F6A83AB06F906FF45A346D +:100110006485C78FFFA5525E2E133B7C83E76D6815 +:10012000DD4905A56BA08D6FED45FABDE08D83D04F +:10013000B000F3EF1A8BB68D87BA3F892B2DCAE03A +:10014000AF719A18D53B3FB87A525F8334F6482C8A +:10015000C51CDFE91F723531C8EA841ACFB6AFCCAF +:100160009065EC3B686BB461B84A3072AF6C923208 +:10017000E1CBA0939EA76311B6ABFA581922C69D96 +:10018000CB4DF0F558B8B4F9DD9006B063F3D43137 +:100190009AE0E7025E42A02FB805A69B0F5CA85C20 +:1001A000A1C68EBFB727107768DA031FC2FCF3EA37 +:1001B00041D26DE0B4A212B1D8AFF8A5FE5413AB92 +:1001C000BE8FDEFCA166972B35ECDBC7192F16AE70 +:1001D0002473E6B2F4B7056E6BA4CAD67DEFEFE1E7 +:1001E000090B7EF51368741EE098DEAEF319F25128 +:1001F00028118C7A2112FC7244F441BEBA9738441B +:10020000740CEAD78FD8DF7D0CB315EAA8D7FD4070 +:10021000AEDD478EA3FC5F1062747588B4DC6F643A +:10022000800E095A39C4D5848EF4CD02432FD29062 +:100230004670F3AE423DA664F59739FB4AEC77A0D1 +:10024000BBF5FF56F3456E705BC6218A631150867D +:1002500075320C3CCDA4CC58676468E3ABE8F8AECB +:1002600040AA5539D760A84FA141B71F09967A1601 +:100270006D50D61812FCC5A340CE08EE413D7BBFA1 +:100280008D24BFA126840F96D5DD7CE4D2FFC5BBAB +:100290009AA8998FE62B9937A101F95F07D6BE443A +:1002A000015F773C9AD8D03BEFA5B4978E545E2976 +:1002B00087CDCE431561CC439022103FCF9504E704 +:1002C0004E3FA47CA011B69A6A549BC8B38663F0D3 +:1002D000542D2CECD051B81DBCA5A9E32E335F27BB +:1002E000A6A5234EB266205D753A9475E6EF636D60 +:1002F000BD7DDA83AA8EE3355B2529A6704B67AEF8 +:10030000D86FCBEC0B14ECB301CD5A7FD3A3375885 +:100310009FAF3229E618B3572A0763B65B19C33972 +:10032000A7E0D2EB1240291B4B2044009B3D07B1B4 +:10033000C1C2FF8E0946A3766FC2D036D870867AC6 +:10034000F7940869E748F1CD7EAB21D9E8807524A0 +:1003500086AA2B300A262C1DEC3DE3B6B8FAC12D37 +:10036000C2F96FF3F9B19139602FA5337F0B3F2CA0 +:100370000C3E782BB6DCEB792B2E0F3B6F297DBD25 +:100380009A00A566C87CE4BF606A4D7D180443CD21 +:1003900036042D6C6C47B4FE41CC07AB510FA8005E +:1003A00084223AEC4DBCDC39FC9005B9C066715032 +:1003B00071E9972EBEB9F0D90FCA764E342483F86E +:1003C0002CD45C0ADEFD6500B842F21F316E8E2E21 +:1003D0002421FD9A5DC5140901D0AD236E559B8182 +:1003E0007ECA0F63A4125702D4B6DC865B76F5DAB8 +:1003F000A3C6D1A348158C66BD218A3E635519D585 +:10040000E13565B814B9467697E7F2459EA4D3EB7B +:100410007DA07C3950BDFD4B57EB8E4169818B31FE +:10042000D680B3FADF4682AEDCC9E8BB70DA547F0F +:10043000C293E6986521634E812414B8C953CDD880 +:10044000D27317BB96A82EDF108B28BA42F0B7FAEA +:1004500038670747D59CFA3C7F62BA2E0614582E9F +:10046000A6B66E602FF6748C97D4F361135D3B6D66 +:100470008D340752BCE1E587A2017C28F9BB62D428 +:1004800071E7CEE8E3E92A70D7DC515CBA1866B1AF +:10049000A9CA8DE5B47D343435940EBA39C196BEFF +:1004A00034DAC1D2C2DE9A4A6E763AC433EE1629E5 +:1004B0005021A6B98C537A29398671112871EEBF63 +:1004C000BA274E5227D4B4396FCB1F9D312055AD7A +:1004D0000A43BEFA722057D0D966387AE598DE48CA +:1004E0001EB05A9CFFCFC9E62D0734D4DA631482BC +:1004F0000F0F1694090293D7B8AD6ADE516A7F795F +:1005000096B47415793E097BAA25D0E27F7684677C +:10051000974C74F242BACBE3F9B4B41F9AC458278B +:100520007706C96D6A669ADC9B666A70531B5C1C11 +:10053000FCFA7B01EDAC46D622617DCCE24FB37272 +:10054000156510824F113B1D426EC41FA86AD089E9 +:100550006EC9FF8A77F4AF9B1603B2C0CF267954D9 +:10056000358D92ADB0BB5C20554EA6CFC25DC25951 +:100570005E2FADF03457BB16DE106E0576E500DF5A +:10058000D58A14B3E3CD16E79C3D12DFCE0E207B57 +:1005900050A2FD19D376A75DAF8EBE2A0811DA7E70 +:1005A000858F155EEB07B827D9A660FEADB984121A +:1005B000D3B39C0708314029940F3A877FC1A1D754 +:1005C00013F52548B16BCCE62350E050BC81FD57B4 +:1005D000D0F6E20782E8DEB295FD0AC5B724B7EA95 +:1005E00010047B835EB7A75E23FE47F28F22B41907 +:1005F000255667451D2CDD606985C8D76A5A623A61 +:10060000CAFAAFBB970FD7E8D17FB97B6A3BE8C383 +:100610003BBB75EA964E77789C43936C98EEE8085E +:10062000CDAF54A0FF06486331E8B515AE41F8815F +:10063000378D7100E865063D86B0859B03756C5D5E +:10064000CE75A8DA8A54870898DE0AFE7980EB60B6 +:10065000D733C9F30B05F7C680BEA5F6B591A11532 +:10066000EA379B044805B81A76D757E060825F01E5 +:1006700095ECE6E17C076B5271C5EB9AAAEF94F218 +:100680006CAFCC52EE2E4F33295F8945D66DF86D95 +:10069000BF7CB9326007270EBE80221BF8EEDA223B +:1006A0005EB22BBE96C0C2D3FE81187831B60ECC96 +:1006B00090FB9EDF868683F8348ECE9D5863A20E13 +:1006C000BEA7619717C7ECD28CADE9DC1055012F9E +:1006D000C01B3802F7BA501DE2F2DAACE96321E838 +:1006E000F301D392C38D0F4D6A23F360802F31083D +:1006F000035848204D7DA810F450C756BDEF40E286 +:100700000234BAE4D1C0DA0912E5FE3C4CCCB3881D +:10071000874A61D4B3ED083931092748028F20F4A4 +:10072000B23F588BFF3AEF0DA064DB6A96A21E74AD +:10073000A7B75D989F53B119723C0702612AD03365 +:10074000156DC8DFFD7D57ADFBFDEC41A072A4AC7B +:10075000FA9DF01E8644F785C7613E9F4652856B21 +:10076000E6A38368DAE84A957A994E33A393BCA945 +:1007700061046762BD1E533FD15EB71FE3DD36BB28 +:10078000DDD65BCAC6A1DB76A255F30A03712CC382 +:100790007C8D744E41F0369A8076F0FA7E3AB0B68F +:1007A00014EF74AA262A5C53DA5FE5A14C469FEA4F +:1007B000CBAD403FBC316AB19E7AAECEFC5E5836BE +:1007C0001275F9D35174CDD7D7F6B91D8AEB6B7377 +:1007D0004BFC87E52F7EB6DCCC08ECDCC06A8E7D56 +:1007E00093E33B3D1F5FE51EDF3A70B90337AE1A56 +:1007F000AF5B7F208B199F98936BF113A16B5CE02B +:100800004D6F25FB8F1EFDAF4A82657BEA5C92EA45 +:10081000036CF5B09952586FA8F801F8F837FCDB73 +:100820007F78E7EBD3BC1773BE08C9952DAE984807 +:10083000C3DB17E8E8F292B589968615F1745D0975 +:10084000E64A325225D7B59DD81A575E2F54664FC7 +:10085000000756F0AFF9131A732B6DC08B8FEB574F +:100860009056300068B4061C6A5E6D81F74A29CD47 +:10087000B9157596BE1E555E621EA9E94E0A15A3EE +:1008800085E1525A59654D27C8287F3ABF28472825 +:10089000C8C545A51B93F75DB42FD1534F26AB8335 +:1008A000033D35C2392473ABE69FEFEFC49F2DB7EC +:1008B0002C5AE4034B7BD37E1C5DC3B52EB9B6DF47 +:1008C00086464375DEC9A4B351BA1DD5220D988F53 +:1008D000D4C5A96D35C342CBA3FBF5E2455A2CAC78 +:1008E0009A563EFD0EB901705AC5E39DF448069E26 +:1008F00006057C5A02A1B1227122C8E558F6D0CF74 +:1009000070DE436FDA78BE22CFC53D481B5DE0D470 +:1009100042AEA800A454F5A930D46E6B197BD78DD4 +:10092000FAB833290364FB53D755F327C3284EFA8B +:1009300097493512340A104B41DF57B1B15AE2E3FF +:10094000063C2AD785465B4A02D0EF92757C972BEE +:10095000A899845589434A08468C8D2757115755C5 +:10096000AF8D9AB4B23F0550DCD4287E08F54D2EE9 +:10097000F6AF5C6F77F18F2C808224852DCF258890 +:10098000EC31BAA6243CC8D0C348F662741BA0045C +:10099000254E49F2B7B666700D1ADB1F604CD82F92 +:1009A000DD0824137975B39A5D607B27A9C3391ECE +:1009B0007E1A016C3BD0F821904B09DAFDB5D0EDE1 +:1009C00003B0B83FF09DAEDDFDA6DA380079991589 +:1009D00027F2C280662CA48FEDF3A8641EA42BB965 +:1009E000C29FDDD8453DEBDA92A9B9B17A664029BC +:1009F0000B16A8A8EF82C2CFE6703616F9C17AA30B +:100A00007E55674568C4CEF8F6F1973A5403FEC0A8 +:100A1000A537874ADF8CCE1689F5C20542D7D1E1CA +:100A200019FA8D754C500743CCC03818CEDACE1C5D +:100A300069852A86CE659A767245FD1701CC65A632 +:100A400094C2323CF6C44F68F743EA2880BADF0309 +:100A50007285224A0A7511840700E39FB67F00FD64 +:100A6000C77A9AF82F09D4AA5DAF9FFC0066EBFE07 +:100A700026B0010C2F4BC9425BB5601851ACB0D900 +:100A80005EA7A513AD713AD00205B42D461EFA5CDF +:100A90003C4171E2B447C32F9B50EE489087061348 +:100AA000C44C33EE802C90041D819131FDDCED3B74 +:100AB0009EFDD5833373008D08D07CEFE8D504818B +:100AC0003BACC5BEE6562219E34B0B90EF9CCE859E +:100AD000D704D501A17E56A91DDD06FB0736B02936 +:100AE00080548B7B6A41B88BB25A410920A93E2EB3 +:100AF00045F43C26E8B42CF876076C495A72EF8727 +:100B00009DFA8CA09C815E9CA1E7FDB80993388179 +:100B100070377337E1DC0897AB7F0FEEDFCA3ADE40 +:100B20006344C216A5BBEF5CBDB98C1D3B9710DEBC +:100B30002BC120B6435ECA63F2C3A938EFB8CA57C7 +:100B40004F020D55DCFFFD4557EBF8B79693805FDC +:100B50000DCDC2BD575FFE6D3C3A9E82D3C6EB827F +:100B6000C7A0DC6444A06B2EBEFECA77B65835E041 +:100B7000F22C4602DE2792757E14126408A967A241 +:100B8000FCB99865F472BDFB130F38A4E584AE4B35 +:100B900093F0E31E46D2DAA821B19AAC3BF8002DBF +:100BA000A93C20C25F01688AB203C69F4C9BF38DAB +:100BB00039E99503298E67FC76A9C806D1D650334A +:100BC000C17A495855B94F353575C799F1CC153F9C +:100BD000C5D119D531EDE2454AEAE7C14A6E03E5D0 +:100BE000C8FB8A5AF8059C10EA1B02C791A5083376 +:100BF000260B9D04568DB690CF43A098E118FE5663 +:100C0000F154CC83D31CF762BA529B468A14935694 +:100C10007FF4982F32C3D59C5A1E6D72A131333F99 +:100C2000FBA4BE58FAC5F0CD5915EF34176C8A50A5 +:100C300046E3321BC20223F8233464E98B5A76D888 +:100C40001F6A80609D76F50FA3C695D633D455E212 +:100C5000D4B0DCB3AF6A41E9A384DF455EDBBE0FED +:100C6000C4665C068D2662154F537E8F0C0BE3B471 +:100C7000405A0CAE53847FE98BFFC9FAB04D427CD9 +:100C8000ACD761F22FFF0F34776AAD969629D42C3A +:100C9000F6383BD6F366F56319CBCAAFEAAE734FAD +:100CA0004D0F692C03EC08FA8AFDEEC5C9E322E179 +:100CB00061B420D059107B97CA49AB95E7D2A3B84D +:100CC0005EE14E2BFAA84BC4CEA28A88940281F131 +:100CD00037FFF297655548B321A83364013A2326BC +:100CE000B8F854DC9507C2C2177026B8F77CC21357 +:100CF0005FCF922B0C89C9B2D53AD61C5331EA2565 +:100D00006987C24D4145C048B9F3BDF4AC2696A6EB +:100D100045454AE4CC9D764AC2060ADC3C4DEBF0E0 +:100D20001F485F753DF21016C76BAB80C92D4F444D +:100D3000F14720B8EFF83707A7E244454E8CF04F53 +:100D4000FC3DEF953D6B302DD82F446F43F964BCCB +:100D5000CA804DE0914E8C15DB7E2AC964AB939717 +:100D6000A62313D155539A040BBFE9FAD68D859269 +:100D700056C9CB4FBD527EED3E65839B89B298FF2D +:100D800071B161D5A82A8985145E94E9606CDB5E37 +:100D9000812C8C7D44F6521105DB01C519BC65160A +:100DA0005073F57641F12D919B78B0C1A1C124D546 +:100DB000E9F84A6341B0AA0BA5AD540CF4966A7EDB +:100DC000D85BDFE88A10BBCCF5934CB72C6F21F7CA +:100DD0007505992EA9AD866F8F3516BD1F23960E0A +:100DE000844698620DD1F5A2ED188D6A0D12F5803A +:100DF000AEC92EB5208A2CEAE31CDF5E20AE172C8C +:100E00008E4600ED35959F64048C3F6A612876FB21 +:100E10007033685EC2EDF6A9B0F1854B2EFF9ACF14 +:100E2000FD38F794E6910F5459AE36368D3068DDB3 +:100E3000E05C04098AE5471B6E7F07D16EDA022069 +:100E4000F3C5CCC12ACFE97BAA992A58D7DC402820 +:100E5000D50BD386DAFBC4E0F7B75388A2E8FAE3F0 +:100E600082920A6E7F296E44A978C3A65359ECFC7E +:100E70009360B7D861A99FCF97DBA35D91FF4CFB2F +:100E8000D311E8DD71D329296624FCDF017CFC87BE +:100E900035A18A0A311B7E5075C10E57AD176BBF45 +:100EA000AD38369BEAA52DCCA502885DC65E63BA37 +:100EB000CE68ABF9C60D1D9403D7193EACE9E69A8E +:100EC00084D0B48A8B0EA0AA82C18DD50ACF89673F +:100ED0000C77EEA6125BA9F0C24ECAC62BDD43C644 +:100EE000B0E7181376083CCE242F665AB51383ADAD +:100EF00082B5B07B95C52C0B80806ECADFD5DD1D19 +:100F00004E7434C1B0FB4E7DE4382C147CD8FCEE1A +:100F10006F2968833A380D2F1F1190BA6F6174756D +:100F20007F0543E2F6A66FD2656373C24F54064A4B +:100F3000D4D34EE9A43DCC07C15C0B558E05972157 +:100F4000ED838E40B8541CFADB14BD34BFDA8FBC7D +:100F5000482D93C0F9F45264E2ECFA99D677157AE9 +:100F6000F9557020FD01E59E58861069C8A8EE6409 +:100F7000EE848B45248858B752429ADADCC5822821 +:100F8000D4A2833A1EA0C0D230DCFE8692D10DC519 +:100F90003365AB0852E445A9E842EAAFC9BE126F17 +:100FA0003F13A9C319AFB860556BB49B4ABA838489 +:100FB0004C6AA41B7AE909A3C7AB10E8230E09B257 +:100FC00025FDDD04C4099AB7D0E8CF59564480CA3C +:100FD0006A78E11F91AA47B943651D670C0E211677 +:100FE0005816C08B5BFC1A4781264041299E7ED44F +:100FF000BCCCD6879E62D33C3DA54F4CDAA3342DA2 +:101000004AE72A18474E7E07869AFFA31EE3CFC001 +:10101000F2F921F4C65C0A4D96250609F97038F6F6 +:10102000A91E564D64795C1BCB7AC96A91D7DDCE77 +:10103000AEDA1769D7904004EE7FC06D868DD90572 +:101040005B90EC01E2878C52D741F208714329761C +:10105000F9459186866DB178D08679B2F73AE094F9 +:1010600077367967422D27CC35CE5D2BE3C9E41165 +:10107000703CF3BC7ACF10EEF1FF141704A2A2F477 +:10108000242B2482E350B6C7B49E69B2D2896F780C +:1010900040815CC5CED3FAB6F3D5EB674C607AE5F8 +:1010A0008E706963C1579F51E619797CC0DEDB18E9 +:1010B0004A1542AE560AF27DADCDFE6251F31115CE +:1010C0003141F888A94D84D3EE195102D1DA3F8518 +:1010D00061C5E23C281FA1365DFE9FF4D26E40AE92 +:1010E000F7A45AF5D92489B37489EEB3F8D0B313B1 +:1010F000A065C97AEA43697A4DB3AD88490D3A6A69 +:10110000CD44530C83FB126705DD5E0BEDBB1A75F6 +:10111000B2D1645AA6732DD7211A2A6949549B87E4 +:1011200065678EDA16BC7D71EAEE2219AD864CCA6F +:101130005C241F7FDE980378AA5F57DD03C44D3F10 +:10114000BAC8468AE57293BC08D6521D1C56239A2B +:10115000E0EBD90FC372528BA6EBB98A87F001700E +:101160007772E927E9C6BBB66DF40FD66001B4B556 +:10117000116585CC42EBF49C93C038680728E17177 +:10118000E2F8DAFE732CEE451F04A2BED44977893B +:1011900037EB155FFBD7710F98A56AD75569515684 +:1011A00066E2EA9CF2FD493DA3320432DC58FAA51E +:1011B000243F185240F4E6449189C233B25F6CF880 +:1011C000ADBF95174902360855BAF6AE43184D140F +:1011D0000F1E1DC34CBAB206BE5C6DCE24AD907D11 +:1011E0009FA128787B599A3A38F486D8477CA41571 +:1011F0000456B3B193D596A7EED95A317BC7E98D82 +:10120000CECECC5723A052A05DFBB3C3A34F03D9CE +:10121000B717A2C1895A7C66466A6A2F29835CF295 +:10122000C162ED533EFD201E2CBA8CAA3AE45AC886 +:10123000E3E5B925E9D3A7F7B58E87AF8FE236404E +:10124000DD515BE32818B72EE1E297885F7F8A19AA +:1012500018C086D1926BCDE6FCE3D779FCADA665CC +:10126000A75130138826FB0FE17C88860D474D82FD +:10127000F8305E2EB55AB20C501BCA3586E2F7FC28 +:10128000FE9276C1852AD9BD30A944A9FDD2C250AB +:10129000C89C9D4A44CA3812DA1F956C103E40A083 +:1012A0008F18AB8A6F8B43693FCC86AEE194E93BE4 +:1012B000435EE55938950E95A967A16227109E9265 +:1012C000A9D32C0930FF75250A0CA56558281647A7 +:1012D00054B864FEC4172D99638C3574A7B90A2AD3 +:1012E000E6F086A8359825BEED400299629635DD78 +:1012F000346A4DAE7454D6C1555B0A938EEB3123DC +:10130000EE333C873863A696B8D42BC5B77F5734E5 +:101310005E2405F4E772DEC67D7F98F33293B65EF5 +:10132000EECF2019B1DF0576709E794CA1118FAFF9 +:10133000A2F581C29702B5FE130515EBB3931ACB44 +:10134000CC08049CB06E697C1E98D0E3676296E37B +:10135000FCE33FF9867DBA273C95801961870CCB69 +:10136000C6E91B68DC2286945D32EC00D26B1F90CC +:101370002D522C8D7337E145164917683537DADE63 +:101380003AF0B8AC269B2208F90C73666E3738EE3B +:101390002D5D7BAFF502E8482AC2B01CF07A7710C9 +:1013A000B191EB29228A989884A549C88137EDF735 +:1013B0001442EA56F6371BEB238C820E5DA6248C72 +:1013C000520FBC772660F7A87B6B83D510E9A48AFF +:1013D0000C4F4C9B3A6722D6F18A225D639723CA51 +:1013E000521790777C8C0A306C3F9C57CF8E92CAF4 +:1013F000C90D513BA8026E9B467A8F970CBA7B5958 +:1014000025E1A7C579E0E9D349B7A885F23C1EF6E6 +:10141000037BBC4B62FA68525F8AA3A15C0953A5A7 +:10142000F70FDDDB0180A2DCA0C96C5AFA6E69FA05 +:1014300054089E7681153D5950F807BE589E7C99F8 +:10144000349A76E456981F26FEED19B4B59A899C15 +:10145000D110579FFA8AEE9971BFEC534E0645772B +:101460009172582EAB8041BAD43444CE37104F67B6 +:101470005302801F85AD8565FAE723D4F23907034F +:101480004979BEF62E70C12D06C8DCBD37B027F9EC +:1014900072F459C73249FD1804A2D864461437C8FB +:1014A0005752897FF2243D55E0E374D2F1F593B8A9 +:1014B000F2E778793C032F83F2648BCC8E497B2B47 +:1014C0005EDA5FE536D7BCD7C87F759AD39ED94818 +:1014D0009EDB635B360C4EF6D55A9700443D0E2BCF +:1014E000E7B46E4A2428AE3C7EC0D15519B7399373 +:1014F0005F535C8DF6C183FB23B36B88700EB4B46D +:10150000E30541DBF21DDE7B0379D78FBD8607D76C +:10151000A2FDFE64E6C54B29FE77F0760099B05730 +:1015200089C9410A8C06F82F953036A9845142CEDC +:1015300019779B1128C51CF1A99D6381B29A295482 +:101540007DF9FFD1961B2C20C3EBC55D1B68378F3F +:10155000CDA950B8747B82DA23A587044F8A15EA97 +:1015600002263BF774FDEBF1140692FC70300BBFC2 +:10157000A991F1999445405C59525726A3C89B61A3 +:101580004241A41532B40A79328B5911AA3018633A +:101590003F2D0CC9982D7CAFA7E356053E794F69C6 +:1015A00014503C1D1864785743C88EA3EBAE034E0D +:1015B000E16EA7276739A96851477E8D61BF73B077 +:1015C000EF429FE4502B69E9DBA854FC943AB33C0A +:1015D000A696CBEBDBA5108AC1EFCBD9E3C1619412 +:1015E0000D529C74B2D71451E4D0BF528F4650B8FC +:1015F00036098AC601FB13FF451C17FF6DEAEFB4DD +:10160000A4C90C90D57A2C5E98818185784B46438D +:101610003C58EB35548A93BB7E110C79DAFC135F8E +:10162000EFAC620707FCDEF6721DAFB06A6216AC63 +:101630007B4D9585CCDEC1B40488922DF77F78D898 +:101640002300929740F8FD51AA1DD721DC303D3D83 +:10165000B8E3B3FF66C0D68269AC88B6978561D01F +:10166000736E5028068690FB3B2688E89AD20924A0 +:10167000F95E17F8A5957CEEE19247C68FCA2C3922 +:101680000C5141EEE4DF10211A5B8416CFC8E494BC +:101690007FA729E2B68440CE86BFB379C0A98A1E4F +:1016A00014874FCA075DEB69F5A82BA2A49DFDAD79 +:1016B000DE4E5F6F63D85C94BB98DB078ECFE998F2 +:1016C000CB6057C018BD2289D3A7714764BCBDCE7B +:1016D0009BC44252A48ABFA11EF2FD44558DA1B7FE +:1016E000B45C98BA00E37FC2D9EE41B625ACA48CB5 +:1016F0000A287838E7C8CEDC39F4E776F37D7BBD7D +:1017000010C9A0069504D0BD40569EFBDA31B1B792 +:10171000B6086025A90D982AF7552F1F90A3CEDE95 +:1017200096117D86D080781448ABC8CD123A96DDEC +:1017300091CC22E67B9BC5414E3B70E335AE08A6BB +:10174000A6E1FDDB2D9D571CE3AA64DE5D79DED5A5 +:10175000415D9C7EE897E8A4B5A80C35138A8DB747 +:101760009F24D5AB8B757A14DFB648806A0A186C53 +:10177000F6E73C7A40475B8EBAFAC880462D71ADD9 +:1017800094A16533611C3C4E03F06B63C4A30E2B24 +:10179000EA1F89E0D54644B9DEBDCE5E26D7717218 +:1017A000EF64C5F5EB990DDA810875F859896FEA90 +:1017B0001E8E4D74932450D3CBD4AC80E86B4F6510 +:1017C00061A96C6D10702B7D7025BA876B99597863 +:1017D0003FB71FA13BE9C8E9BFDBCE921BF363C350 +:1017E00024420174AF5ACA662D3FC95F5AA15CAC4E +:1017F0001B4FB1E0365BC2DDABEC3C00EC4FEB5B6A +:10180000627D065054DC42DEBCA6BD77EB6C4C60BA +:10181000FB775943ADFAC36C91CBABB1F7E6FE6FE2 +:101820006C45E9C57F7AEFD1F9E0BFDE09A87741C1 +:10183000A86C4E7254804C9094962EF60AD439655A +:10184000EDD50881F920F337133DD1D32C016E0C6F +:1018500047BD2839F126870A6A8774D935D90F938D +:10186000011DF0FCD9D647E67703B0651232F1E7E7 +:101870003F07700CCEB13CEFD4D9B6028442F321BD +:10188000DB58EA402AC5DFF4AEB58F1DC195139829 +:10189000E8FED649D64FF1E85F25BCE8379E8BA01D +:1018A00016FE1BB640598476CB993D31AE2A2748A7 +:1018B000C88090CEAEF9F24E0DE312CE429C5E5837 +:1018C0005056954FD8BFE19EE74A0A63F80D421083 +:1018D000F88ED2327DC87C902AF7A18B300459460D +:1018E000BDE3418C411C25FCEC59E5D1B99AC5C931 +:1018F00018FF56A7664912FF1D80F4283306561EAE +:1019000021983AA987C90DBBA2DE573BFE53EAA72F +:101910009C22F2A2073AB3F6ECD2EFFA134A8117EF +:10192000F3F6447EF2367EF8E569C1A9D1AC144BDA +:10193000AA4E5104A73A55CF6811C1EF1B46921425 +:101940002D274E6143D23A10BBD89A98A3D3E167B2 +:101950000842F5BEF22EBF7285DD1DCF6AA12CA212 +:101960003A34CBF1C5877204EBC0BF5C634B814C4A +:1019700074BCC1109AD949581627381AF6F3CB5FB0 +:10198000ECDEE1A6E5909CBE51C690D4BFFA8CACCB +:10199000DBF4B09BE887412A4B86F92B59294F8B02 +:1019A00044642CFC3CA2C592E495594EE520840782 +:1019B000A4CB72FE6F5DF8394EE44D9EAAF1A20FE2 +:1019C000DDFE4279DA0FFFFFB0A5BA2AF75C24B436 +:1019D0004C555C5779C00E9D35E94CD8829639D963 +:1019E000C50F8B83B86D858446090552A1CC5BBFBA +:1019F000EAE82B8F3DF0985A9051612E131AD63792 +:101A0000D4035A86D20D7C233CC3E29385BBFF39B5 +:101A10005D81460A7C734A17B4C893193CC1933759 +:101A20005905E87B2A5AA24F825372D9042B6E06BD +:101A3000F2400AF6360212B5AF697521A0AC64FC1B +:101A40002307799350440B96676867C18E60C3BBC8 +:101A5000EEBE7A089FCBEEB0E98416781AE168BC36 +:101A6000A70D2828B05E060F59A071B8B4672BD314 +:101A700012522077A7F2185AE27B2BD83A9F4C7E5D +:101A8000E71A9BB3D7616C4966385C18EA234CB8F7 +:101A9000EE54F498F1906C5DCD6163A8BE2799A1D6 +:101AA0002F3328B59273D222069A118EC1B82BCB50 +:101AB000A6D936CD82ED668F4D4321A3E29A120757 +:101AC00025585FC49950AB16796ED8BB4F422A0A8D +:101AD000FD88B0F994ECFF87ED3B4EF1F4A3257A35 +:101AE0001CCCD3EBAD2D8A70AD0A71B4C7FE48177C +:101AF000F1668311A3FF4B253AF7DAEC97B7C3DD04 +:101B0000B6F3FF353FBF471ABBFE40700090A80BED +:101B1000119D046827592F663C941AF929F407206F +:101B2000CA1B3F966BCF530AB9B5B2026229920322 +:101B3000066801DCDC3A28115E2C18EEC716C800D6 +:101B40002C41890792503F1F60292AAF1E9D34A562 +:101B50002B9A16B737F0D9E189B04329E188DFFC29 +:101B600098122FEAE69608189A69F0DC85F549AED6 +:101B7000C1E203BF89591C06020BB9C61DA3172376 +:101B800042FD68766B007D5CDCDCBA28D7EF4093C1 +:101B9000657E615EF1320CD15866A3F364BB052506 +:101BA0006353EC71D28E3B026B4A5E3007E2299C94 +:101BB00056D214D4C7D1BCAE3DFBAB504A705CAF1B +:101BC000EF85B8095C9D39BC33611A1A077DBCA248 +:101BD0002B579F7C44A408EBF323672124DDFBBB38 +:101BE0000CA82897FDCB5C3BC59425AAAC4C43E8D8 +:101BF000D9520846E043A86772375B9B4CB7245024 +:101C00003777274A9AF137F520B9922B8EB72BC632 +:101C100045E3AC5CDA9F97CC3CEBE4691AF104171E +:101C20009A2AEFCED2A93FADEFCB3C472B59751C7A +:101C3000FEE608007C4367FF0AAAAEA18000E20529 +:101C400088AD1E8C19679F44B9BB76B5FB72396F9E +:101C5000E60F0B14996B163FF2189C17784575D355 +:101C6000FA1CBD78F97D1253A925180AE13C60B52C +:101C7000B1E6F9E028BD2781775348FB8098E5B0AD +:101C8000B7637FC9042AB46DCBA34A31320B47A88E +:101C90008C363C381A59602742F8FE80E0F1C18545 +:101CA0004958C575D45FEE84769612855302369BEB +:101CB000857AFFD04F291B1117886C1BF73F113C09 +:101CC0005FBDD54E5E64F12C22FBF307305A638B67 +:101CD00099BEBF0E8227093B240A501812D10D9CD1 +:101CE000E5AB43A11403B910C536526252F611FB9D +:101CF00018BB8278ED2AF5D5DF8D51D30378B5B6C0 +:101D0000A77FB8D9529586E56836AA5112B8E1770F +:101D1000EADC178C2FA084A2798122D8E83DD1C2B9 +:101D20002EA9585A324474770421F4AC9361ACF173 +:101D30009F35EE41B7A3093C2407910E61D3B8F457 +:101D4000F7DB20E3F7FB5D78F64F3CE844B92F5B07 +:101D500037E890F12C6B6AD28B8E11AD54CA69575B +:101D6000D040D865E91697B7610E9965CE342E60DC +:101D70006AE8C17799F04492FC389255F3DF126D0E +:101D8000C6C88F1842F42A4B3025F9745C1195129D +:101D900086DF8789892092D3FA8B7AF326E470262E +:101DA000F82794D34BA1EF70DB0FD86D54479B4BB2 +:101DB000E683F9496E12E95333846EF97EC429181B +:101DC0001649DB2498DB5619C156A634FC6CDFA0FB +:101DD0005D890318C8F7A2EDCA866DEDE7B8E25138 +:101DE000E36E001A48DA2D4FD0CD004D9428DB4F1A +:101DF0007ABFDA325F23F5A98AE5D9F36D293F6B03 +:101E000043AFE26FBF9C6844DBCC3ADA8332D991AE +:101E1000FD69F40EDF7512A4E100994B04CC57B3B1 +:101E2000DBDB96404ADA96B0FB3A3FD4711CAD0535 +:101E300053B3BE1BBC10281D0C7C4543EFA79C3B35 +:101E400077D52E42691AA20A0FD8D07F5C5E26E1B0 +:101E5000E93E2B183D827A889EF5F46A96F5C3F622 +:101E6000A155FA2421B43935A0EB748EF16B3D16DF +:101E700037AFF905AFB9D77CDBAC0B5F24D82A4E5E +:101E8000A6D41AC9ABD0EEF60ACD4677B46CC68399 +:101E90006FBB6ADE3D3404C3804B915E5324D3E7AD +:101EA00028B7FA719FFA98E9E379DFE3D1758BDF00 +:101EB000CA953D6C4C7B2953DECAA8FD0A528CECB6 +:101EC0003099F25C7BD0C95F47A93073C6871F5534 +:101ED000C3CF77016E405AA3AB294002C60F85ECF1 +:101EE00011A92561566776FBEA8F2498B45D6BC310 +:101EF00066B62648108A399947A8DF141C852C7FBE +:101F000084212B6CC351F47E12CC9FD9D5D060E3D1 +:101F10000A252943CAB6D7FDD0BD2AC3B07BD30F4B +:101F20006337305460D836F156598E32546BD680B0 +:101F300022148C41EF7A7C7E492FCC76A6A823B15F +:101F4000CCEF5E10A8568753FC678800417D24962D +:101F500091B486493F92B4622E9A1CF32442D9A8C8 +:101F6000A62ABFA6629FE4E709A0C48F2DF1A1B302 +:101F70007B7F42C363340135C9BCDB289B1A40C157 +:101F8000AF87A0F2BD220E09E19DF76899D4035BEB +:101F9000534C58EA05BF7B7C7204FB1AC53BB40462 +:101FA0009258929C5B9DD156AB1725BC4390B331A0 +:101FB0006FC818FCEC369F399E16BFE98EB95E02D9 +:101FC00051F0668AC999717057EC7331C7862FBF7B +:101FD0009D9517C04635E03C5CB51BAE8A452997F8 +:101FE00069F5DE293DAC33D9ADA5BF4C1ED4A8C2DE +:101FF00097891970778063CEEC44CE5506624D6B9D +:10200000E5F2553E56E08C2F8687F95E234DB0638E +:1020100025C9BDDE4FBCA643F2F679FD4F3DE674FF +:10202000CB48E2741C90A85A337609BA41244C8EEE +:10203000CBD225765E0F8A8E6E93BA8A3F3EBAA0C7 +:10204000C08634587DE825F006944BABBF45EE02C0 +:10205000C48464611C724E713A10436FA297762B50 +:102060004C95AC553E1D34C51E5C0B61CF40FC2C1D +:102070009ECF237756B63A9888CE8CF8C2CB6BF0B9 +:10208000BD09217B6F292A7CDBE78746F76FB06AA1 +:1020900092CB8220CE83A4FAEE1764D396D55871E2 +:1020A000A21710BC3F47D2D0702A264097DED05CE2 +:1020B0002631D124F32A4AAA41C6D05C60F866A929 +:1020C000B00D6B1687EEEF47A8F9EF1FD781C9D582 +:1020D00048B877348D51E72C481CDF09089DFD3640 +:1020E0005A585B6CA20BA63E9DE989DEE08898EF0A +:1020F000DD8E1F8A56AB61B4E339E587ECF62827FD +:10210000550B21D5A6FC7AB9FFEEA885378331B4EB +:102110004C525A5F007EF52DC3ADF653D5F06ADD03 +:102120001E6BA56261350CA0539410CD3A348562C4 +:1021300097533E61890F68D46C23A4058D0B8B6483 +:10214000E413B2D3EB9676BA28069E89BE0FB26826 +:10215000BD62C3EEDF9C0308E73794941CC107A758 +:10216000B6368B9CC963675F0B271598C324EE7541 +:1021700050DF1D0B4A6A99F5D2E7EB9759BD7245BE +:1021800004CADBAE24F48E4DD0EB48588B480AB11C +:102190000AFB9CB7EBD951DFC8239EE4407B1E7934 +:1021A0005B18D1FC226FEA610BBFF08EC2FBBFBC93 +:1021B000C5A17ACCC2278F2BBA30439E70DEFDD2E8 +:1021C0008158B50D40E2490B1ADF38D3844DFC1C11 +:1021D000F04112AE4017A2225AFEE01BE06898BF01 +:1021E000129B11DB957B71D71BFEEDCB251085472C +:1021F000E34EB8F8FBA67CA7EABF0929B9D327F1BB +:10220000055FEC4F2A3D565448489873A09D7BC00B +:10221000FCB1CFB22AB93245D4AA785676C2D3FCE3 +:102220002DB5B612900FAC93E978ADD025A5E2207C +:102230007B84E2349140AD4B1B59178A09954BA022 +:1022400031FCB51457303BC68D468A5138B1AE7754 +:102250008C4AEF9608FC32CD6CA707A26829889DAE +:10226000CB9D6D5846346411083734340AB5D9888B +:10227000A038BDB7AA2A3F7BDC7FFB1E8B732F6380 +:1022800078E19DC225C1AF72E9A48216BBAF686F29 +:1022900059ADBCD34827E88CC216B2846778FC508D +:1022A000BC3D3E5CE5C8E41816F9B8AD7AD6368C6C +:1022B000AA13C35C44CCBED58DAD6CD7661D9838CF +:1022C000706B287BCDBF0FA36464A870BB84FABE7B +:1022D000FA7F0F6141F47FC5FF6EC7D714674F6265 +:1022E0009625162719854B2D9FF2E88D4A905F7928 +:1022F000B77701D9625F128F1514B0C543B5558EFB +:1023000054ACC20F60AA13B5012D51BC6373638D29 +:102310006C59B3A84197DF2197E1EFA3C0866AB358 +:102320001B8DDC7C478491676B26E702F85BAE8CE3 +:1023300079BF63AA9B6D93026BBE00C3781A4E03EC +:10234000DCB494AECDFBB978AF99159CBB207FDB94 +:10235000DE03C70007DA299677ADA90EB39C1EDE0F +:10236000516418466616F775E28AE36D50A68188B7 +:102370004680F2C130516A5E45D4ED98FD841D4F10 +:10238000E3481CBAABC0952FE6DC9C98B60F7B687F +:102390000E3C324D1020D228F875EEA539E33D0DE4 +:1023A00061732FD8AA2E4CF0A83983945E397C2E05 +:1023B000A6A7C74946F9367F2D392680485AF0D757 +:1023C000F4AD024CE8FF4E9B19B423762D801262C7 +:1023D0006D1DBE2B222231929F6B5CC4440700CC42 +:1023E0002B13B8C2D4A19F32CE872C552B128E2628 +:1023F00031374C76E437F00A087A23B8768CE03A25 +:102400002B0F64844B5F019D9E7A3B37E338A86BAA +:102410007E3B5B71303EA563C50390E3877EE81980 +:102420007FD834ADF145620708E3088BD2F496BB40 +:1024300050A75EFDE27A4EE19EC413C3A66AA59042 +:102440003EAC420FAD56E8EDC19619E354FD2ACDDE +:1024500092B5EEB2F18B176D3352ECCBD98DDA9485 +:1024600057C319C0285E268CFD03F90C519603143E +:10247000DB15480C28DDFD61D8F6C257B1391C6D5B +:1024800035E2547AEB85380DD935BE49B3FB0105E9 +:102490004D2336C526B77A8D55A6C014C81A05CF68 +:1024A000BEB1588DC6B52E900A9A6556B3592441CF +:1024B000CB70BA03FD5547759E8CA55395B1D24A92 +:1024C0006143A6E343E8E489D4FAA1B7583C713EDE +:1024D0008A0B834E5BD1153129684914A945A84A56 +:1024E0002CD409A84522C86FF8E1D69013FC146ECD +:1024F000C35551800BE197856979E8FE7796E30C27 +:10250000772C8A542191AD8951E32BB9E15D4F7A43 +:102510002CBD48AD602183367F92F86EDB32CDE270 +:102520004C0DAA007431369A5F1D18023FA84C3436 +:10253000E31F4A0DE13B7C7C5883B755EAD2B510C6 +:10254000E1469D010CF75371C96A0AA78D55025DDA +:1025500048AB2A3AB646DAEED11891DF8F38EE69E9 +:10256000610AFBEB04D857FE071F1D11AB4D4BB999 +:10257000FAB301469DFB33CBA482D5E99A4A6CCAD3 +:1025800043699AD9AA28600634288A214B282F9BB0 +:102590002FA337ED7AB4653753E689EF0E302E0F4F +:1025A000D5A3E4AEEB888B85FC5864C39568D15203 +:1025B0007AD052D29FEE5F114BA32B56B299F77A85 +:1025C0008FC678A12876E088F70E74DDAD8B836323 +:1025D000E23D64372F66D2B11F1B314A5FD44518E4 +:1025E000331038E5362EBD3EFFE31021A6662D746C +:1025F0002642DA088497FA0A6240318042DEFB59AB +:10260000D3446F91B2433518A4A4E9A6647D227C1B +:1026100002A98727463B16CA1755C659AAC022AF3A +:102620007F088F38B96A1C1A1076ABF0E7CF1E9579 +:10263000206A72DCF25821AD673AAB9D3DD5109F00 +:102640007646C2E550C3F77D57B4F6BE874CD482B8 +:102650001F775679E41D72E5937A221467CEBAD4B7 +:1026600050D7C22B7BB96D0B35DE176814EC8C4349 +:102670002D0EF27F0E28C126351B68DE7209E91582 +:10268000D439FE23840467635CFA9CA9CF4259774E +:102690004AD15B45A3292C4CA9E9FF4ED70EFD0B6F +:1026A000CE115680A4B5CE386FE01F119356087333 +:1026B0000F438284CFD0A4DB0A7F7FEA7D58E70AEC +:1026C00010980AF58ECD2C62C468894D781911E9ED +:1026D000750F4CEACA151DA5457FDC803DB2B8E9EF +:1026E0001CE031294C1756A939C9A394ED0797323C +:1026F000713200ED4ABAE6AE35801EA1E636944846 +:102700008883C07567BAEAB7AF8643D629B3F74A5C +:1027100080573E064F3C0F0E033BF6ADFCD590B400 +:102720002330243B5E87518CC90381B485209CBF34 +:102730009C8389A81A4A1DD470D95C8830181390DC +:10274000EC5879D2A67B113028C80DCF7C812DBBE7 +:10275000A39A5071F8E1CEA5F63FFBB8C7CF3883F6 +:10276000E404A32AB0586F4792CCD94B2DCFCEE2C8 +:10277000A53833EBE5D9E5204A77646C9D20AD4858 +:102780008A462D09E9BC47341641F0AA63BFC176D9 +:102790004D3DE820D2BE04CF69D4D30D714703303C +:1027A000517987F6FBD1618F88C35AF42B438A682D +:1027B00011AE1D00B90BC787B99EF0A3E5D09FD31A +:1027C000B52F57F43F9D9FAA6E1AA9C4220D9EE211 +:1027D000338577E3BF53F2FB9ADF2F375B8656B220 +:1027E00079ED8C7E13C2338DC62C17B6FF1641854A +:1027F000F294D3CC62A0C41E34636086A09C51E8DE +:102800004218890588A6AEC0750BAEE9508540E137 +:102810005301429427259D39915D7C726E12E071BF +:1028200040DB5DF9343A26988467B84F3EA716EF2F +:1028300001F104593FBD399743B23159702B0A5009 +:10284000DF17924CF692456EDB9B014645E755FE3D +:10285000704132A0FDAE1FE6E7EB95810560554A59 +:10286000E2AC4CA212E3894DDCCCCDD19456E815F4 +:102870005DB026A4221CD540FFF537F03874B17244 +:102880008412633BF37CDA7A5707E6BEC99573314D +:102890005B502F36A8498EAD6AE44E7B10F99FCC71 +:1028A000D4FECE449384DF5D53E5AAE1A044525B9D +:1028B00013AFF715161DEB258DB3CF8D6B7D85F00E +:1028C0005F8ED6C82A344EE819A499E8C68093B31F +:1028D0005A6C9D912C01146F851A3E54B09305EDEE +:1028E000CDB400CE1C5AF80D40824CF98BBA2F0C97 +:1028F0009956253466D2831B405725F0FE5573F94F +:102900004E8B55C375EAA8FB2C6143040FE4308954 +:1029100020BD8478568E49CB03584F913E8411F1E7 +:102920008E9470D98134338A3C94E48F87B6ABFDA2 +:10293000BBDD253A1C920158FEA890ACA9ABF77DEF +:10294000695366ACA5FEC0CB4CC6B557492C7B1D60 +:1029500028C37FD56F24EE69DF53A8E8AB1D2D7621 +:102960007AE2031DD0FCC63D63C84BD97CB3A99461 +:102970000548695253720AD0297836C5520BECD6F5 +:10298000ACA0ECCD846A24120F75AA3679B7F7CCC7 +:102990008E0B2DDD3E70D420B7A72DD7E0673520F4 +:1029A000F4120F80F326E6C3CF7C511A48B8DA0E32 +:1029B00042B9F0B177E37FB6613BF09778F2F6EB7E +:1029C000FC1B3359E651DC957FDE25E60111CDFD78 +:1029D00040EC9944F8E3575A5EEABC321053E21FC8 +:1029E0003D6BCD43FDDAA4394063931218B5B19124 +:1029F00038AC365D947D5F94DA438651F118AF00B0 +:102A0000B9286D7C7A7BE735B14AC0D4E759685163 +:102A10005E4988105329CE69864D19170D39F8F291 +:102A2000676BB49952385BA9823F0C3D483F646C98 +:102A30008EBCE15C930379C1EFEB7EB9B5DEA27683 +:102A4000352A3C9E117D79A1C8303F2A2F9370888A +:102A50004452CAA7C96EEF2C04E3422264B9C0FBFA +:102A600092E0D648077A81DE69B34A058AD84FEAF0 +:102A7000A0AC964A5F736C88250C3BD4CEFFC2A6EF +:102A8000217899FC69B3B967D5C943F9A6352136D0 +:102A9000286C3C08A5164A00009765FEAAB2D43DF2 +:102AA0005ECD615E71E63B8D87153243BEBB4ACE7B +:102AB00080BDF6EAF35FD22575FB5863131ABEEAB0 +:102AC000E96E4308781A17E49658D73D8B8671ADA6 +:102AD000BB6A02680A253462CEF8B032A0EAF4BCC0 +:102AE000678EF967D232648810A09EC157CC015519 +:102AF000EF8BFA67E14DD1A81DDAFF81196F975A64 +:102B0000DA1C56CC79803CD4B890EAB0DB93861DB1 +:102B1000468AC2658D81ED361820730661C78E7BAB +:102B2000AA6A617346D5A33F55F9B3CC6DC14AB5C6 +:102B3000EE258F9BA942DE3B25D7B331DEE3E4F2DD +:102B4000E43845CD5F8DD2DAFCC2B8ABE28ED63D1B +:102B5000FE9A77156E74DFF2AB77E1800AA29E7859 +:102B6000A956F5F2DE7AED36DB288C51778FB76DFA +:102B70008B22C167A87027CEE574D87521C1CDAA74 +:102B8000B39DE158894DE47953FBA8772D945ABE43 +:102B9000EDF51F38E1CB6138B57B6FDB410B44D7D6 +:102BA00096D95793847DDCE5EBE21CE945C31AA571 +:102BB0006F586B1C1B4D0DFB2AD813167BFB18F4AA +:102BC000E41B125C0F20FDF1DBEFAC784AF6853494 +:102BD00055CAA235CF9BEDBBB544C39FC99C63CEFC +:102BE000C7EB96F583F107A80D4798F40D7D904843 +:102BF000B64787F1C1AFBEB027EE6F29419F2122B2 +:102C00007D7A187E9416CA4E2339AE7F2FA699235B +:102C100075101933FC35E0803F2D6E4346AACB6416 +:102C20001332E68A8EE93CC7385A14EDF2C229F60F +:102C3000E9B2EFBBDE2C68039E1814F4D8CAD2F3B5 +:102C4000F603649F6CD283021FF33C3CA699EE9777 +:102C50001DBA76E0F7181E23B65AFAE5118D29B48D +:102C600059F4F42B8B16B63A8D7A1A8128797C6642 +:102C7000CA611C83892E849BB9498AD6034FDB0E17 +:102C80009CF961E111C76C3A8C59E9D0D6D9C45E80 +:102C9000680B84E98918D9AA17091CE50BB1EAE980 +:102CA0008B40A2B64F49AAE4DDA627FAF2938AAC7C +:102CB000B4702669ACE3CA9A6E2FB98392FAD449EC +:102CC00063162E34DB5AE1EDD6B1D7DAF6EBA3C4A6 +:102CD0002AFA540255A4A4CFAF4E880B4095437AEC +:102CE00069ABA201B11F019C5D63708C80E746183F +:102CF000BFF714F98EFEC708961EBF256E0C52064C +:102D0000CF539D5E1009A0C18F8DB825EC85395237 +:102D10004A802F6770A57F209D10859EB780025E38 +:102D20001CB44C252D0086CE00B5CB7A94332C7480 +:102D30005F774272D67F569F770EBFC5FB9B4D399A +:102D4000A1B62B2C0AE3E61DB6E1B06BE1F0D68309 +:102D5000CBEE586D61916BF50DDF4E8584DD877B81 +:102D6000C17D25D5BE8FA9B007D0A5957CD843AA33 +:102D7000D6452814FBD8FB3115B0FBBB6A772C1263 +:102D8000831CDC45A9B507CC4969449F3556D06CF6 +:102D90008859C4F9FDA2FF1E8A1517621B82F01C18 +:102DA000D2BCFFCBBC669A42E5668EA94BAFF396C8 +:102DB0009B93770FC96B95C51A329C06AB6106C20F +:102DC00046F16B37B46DA955420A5B5532FCF45994 +:102DD000E1E0D190DBE6121869D4F430FEB04C7417 +:102DE0002F03F66BA9BF94B759CD09B661F331C86B +:102DF0006531F00C7A5DC1E4936CCFA1F851655553 +:102E0000AE1E982186271E569417F9F8310BC5D6A9 +:102E100001621A7700A6713AF1FF8F303381301CBE +:102E2000104389C0076B1CFBDAD64258A295AB8EC3 +:102E30005DB97FD7F2334A96C7E181FBA8AE44E97A +:102E400016025056EADDB0A7F911EE62241A0532D7 +:102E500067094AB3F53AA942407D75A0833D371111 +:102E60000C4BE1DE295001452F259B550C37540EA4 +:102E70000DC04A24B0A25C54A64C73D7A1DA9C1AA8 +:102E80008F836D927F3FD91C16B700E8DB03BE79B4 +:102E9000F710FD5E48DE116F67ECE589B45ACB513F +:102EA000B6554CB07C49E5B2982255BDC2FA011A1C +:102EB000E333964FE628269622920FBF8A21AABABC +:102EC000EDD60113A0F8893EE9026165D556397641 +:102ED000A84AB6D697E5FC6B3450453A5DA143A9A4 +:102EE000844B6567348FE0CC706E714F2B3E3A5146 +:102EF00005F52D2E9D44452CEF846CBC43F40D52FA +:102F00003A09D8CFE8ACD1E009A5C9EE41BD9E5938 +:102F100038F9915509E5FD72F19CA07B83E5A3A8E2 +:102F200017915600A3FCA86E1CCB0E7C310506241D +:102F3000F3377D7B81C2391063234DF8D6BE3AB694 +:102F40003DB4AC2738EABFD01F81AAEFF58DECB1B4 +:102F50003F981C4A30B40D420901EA1D997C6D6707 +:102F6000705358F03E07AAAAD70E47413512E8AE73 +:102F7000D6469C0A27E13D08C38B3815290B03234D +:102F8000E173C979DE50FD4560267D26E0405CA9ED +:102F900039DB5B845DE1EF49E67AC8EFE2758D5F6E +:102FA000E73247B62FA6B4E5E2A93E54BFA7004BCF +:102FB00056B0C0F7F9F90439ACCD28F2D75A41150B +:102FC000FD5CEA539430A512F9A8A1F88DE559A744 +:102FD0008EEBC64D9789E6AEC4C3668BD0100B3F0F +:102FE0001BCB0F288F38153C7C632FFA29A7DB6C8D +:102FF000C137E678E7878544DE8511954BC9658C36 +:10300000DC47F59AA55391826585C0350E13F255BC +:10301000089AFD1107EB791F11375C6BFF8DCE4EBF +:103020005EAA7C7A4A9781EFDB579E06C3819A2479 +:1030300052C44A08D7FEB2EE227489B5091417B2F9 +:1030400043F15A97764813411FA8854674C450230C +:10305000F0B5A17D2BDACB0776929E31387C341DFA +:1030600051E6476E8C80E9688A517154B0BA46F1D6 +:103070008D7C9EF79584F0BD46FEB1397ABE093944 +:10308000874D1A412698773F33660310C3E7A64B56 +:1030900095C69E5560834A1D1A1B285DDC26744424 +:1030A000BE7C00FDE8D8B80E9A2CAFB59B9E9392DB +:1030B0005D5C7D8C9E9159A899D377D0FD560EBD4D +:1030C000E84EF64C44721753C1B92F6EC30B3C63E4 +:1030D000A6BA24CDEE05D568876EE59FE4E4821498 +:1030E0007FD1C4129873BEC471836DD8F7A88A3497 +:1030F0000F50CE3D20F4570C0A99A179526F32B58A +:10310000645D8F54F2CE279CD7AD826062B192E0AD +:10311000F06BF804E852F319C34FB543B8E812CD89 +:103120009BAD7FCB1062AD2D5D0EEDABDBEAF350B6 +:10313000C82D1DA77849983E37CF92D1AF4A7B3929 +:10314000E381CCFA28E655DD57B9878AAF7FF8D6F8 +:10315000C5A1FFA690D80FDF62D127278CE4D07ECF +:103160009E4F8C64461D5D8F55B2B180C7EB239294 +:103170004A9F261936A992774A828C31CB25B88A84 +:103180005565923E750AEC0309115B8603E331CD68 +:1031900050F2D4BA02002DAFC4BF61F277FC5343A2 +:1031A0002B7C644B6552E37D74379252675F9D922E +:1031B0007550B7C25D857772DF9F3CB93521844970 +:1031C000C375DACAD13AE50A7D859F3DF3840BF4D5 +:1031D000E4366D459409553325680344625415F768 +:1031E0003D9E42AACC5EF309014E99F3E9A5F9BDD3 +:1031F000813CBE5C772A6794D940C5364C7E1394D7 +:10320000BD245667D323D404FE150261568F5ABCE1 +:10321000D7DCC2C126DCB728FEAB905198AB4D88F5 +:10322000E51E70F783DE4881CBBE1ABC3CB18EEC44 +:10323000D5FF7AD3E353B0C03E0A76E5EA90419CCD +:10324000A610F82978E3A9CB3427C7EC88AEB2578B +:1032500030BBCC80AF7CBF1FCF274B5CA150DF5170 +:103260001A3FE6ED7B43AEBD8D27C528429F542A09 +:103270000FEA9F147A817D847EBC5DF8D05B107F5D +:103280007E1B45C45AE33CE2944B07CFC88AA996FB +:10329000F55045EEBD381C85E668D2B8EBF6D0781F +:1032A00070C462DEC79A0BFC824C78721531C01371 +:1032B00044CB8AA6EADEE74B1CFE0B173CB1397EF5 +:1032C0004CE17998FF4532A98875A6D1E7F6BE6929 +:1032D0004B4FA3CE087E1239FED4F8F105BC96C33D +:1032E00020137332A3804D3896EFFB7298767CA43E +:1032F00019F75C3F7C552FB3C7237DF1C47EA6D15F +:103300002AC4000B173859569EB434DC7D074D7122 +:103310000A34570596B1860F3ABDFDC76CE29A1282 +:10332000D38443B4FE253BCECCC6C4D30D041720B2 +:10333000E7B4F296C1FC7DAEAA2F6A63193E817E86 +:103340005DA5664861FD9171B2FF771EF782CB8E55 +:103350007058382478D30A0055CE3DBABD70C56D7B +:103360009A713572BDA1651A3888F442C8AB6164A0 +:103370009AB6200E0E6966F97E6CDC67B3C7DD6C09 +:10338000F95F1358320EF481D89AA5DCA154803F1E +:10339000330310026141A35C95725A146C935D6310 +:1033A0001A2BED0E89A4888918746AE0C36831B4B9 +:1033B000054AC11EAD8FF1DA6343BEFAB41FC3EAFA +:1033C000EB775B98070A68110C63C30F69FD7BA458 +:1033D0002E9935AB99C1E19B48ED7FE010FF5CD59C +:1033E00024FB385009C0B3ECF9EC5F7AB804C9BECD +:1033F00015372A3A5D72C67AB2F3EC009826BD778B +:10340000913579E1C53DB3A052B0450D51F16893B6 +:10341000968B77A18B19D3AFB3E67FCB91585065CC +:10342000466470312824F6526CC54D90B2E67FA1F7 +:10343000DD8C864D9C6C751B92C9B38D6FC329F4CE +:103440009D507E91E9F43E1496E8B610547E932385 +:10345000E81C6FFCAD24C121A03D92EA717E49B306 +:10346000AA76F6781C71C86871CC55EAAF7F16C68B +:1034700068FA992314B7D30E549B31A7050A60D17B +:10348000D924F2B0C7DEC8EA444D4A51AB6A5A7932 +:103490002101732AADAFFEF7013D4C3F8CF5490386 +:1034A000ED6C056E2987D893FDAC74C587356A5ECF +:1034B000ECCA6F8657443065D3A1FF059CCAE53C32 +:1034C000DF7319595203730FB184F57F3E70B17EDB +:1034D0006BA7F42AFC885BAF8F24C0329B95D55331 +:1034E000CF3B6465318A0674A72B10558CF1DCED57 +:1034F000D8E68157349CEBEA4B2C99B50C5774E70E +:10350000D6D7F0E88A91A584B7F5CD5DB4EB15A3C5 +:10351000D00D977822C6625A107FFC55C0873B4277 +:10352000F225CBA79ECC15F9E4D021CCC78072DA66 +:10353000EEEB0BFE01B7E742139124ADE7579096EF +:10354000180EED9C6C47FF5DA1EA30B2286F048B2A +:103550009F96D6DFFB99A5429B5C183E65CF3FCE78 +:1035600020F64BA0BB6A3BCA8C43EF018C34D2BA25 +:10357000A41A82E0457088FD1E3E561638929D10B2 +:1035800043F0584E51F97896EF96B6F874A8DF3D9F +:1035900018E3D5590FB0BE3714F8D408904D275F03 +:1035A0003FE1029FE0B8CD88C522D510CE00DEE70E +:1035B0009767C7A312F6C43F65F74D0E867FBD7AA5 +:1035C0005800A545889B48CDD5BF04AA27FDB0DA91 +:1035D000791C509B9F0CC5B96F7C8A76C0EAA30604 +:1035E0007044A4861EA80420E83706CF897A99FF84 +:1035F0008736594E18BD428C708BAB999ADD1B50A3 +:10360000DBB03E71CF3EFBB58CF031AC4F38E5F806 +:1036100058CCE5887B1314587A66BEED71BF501004 +:10362000465C910BD795969F748ADC8B861EEC02C4 +:103630007038076F22EA8EE4AA6FB267FCC38BA7CB +:10364000F4875EBDCD8E1A72D762913B20AEE82121 +:1036500039C9AE25F67A3384A8CAD6F59A41FE4216 +:1036600069DF4EE41BACA815D8A041A32BC1355F80 +:103670007C7E1C5513B9D313DBA3ADA385F4B12C09 +:10368000C5782CF46B9CCD2A55656617ACE534459E +:103690002D0F527B0A1A79E53D89C6F8AA0E6905F5 +:1036A000E38EC48C1694183C8C6E9C077B520F35AD +:1036B000E0C6D99808973BFC514CFCF23355766133 +:1036C000808BE3E9E5C69A4E869F5988A9F3426547 +:1036D000383090EF11FD555428724BE22A7F67294C +:1036E000ACF86FE539210D3B7D38D3FB6F51B7CA7C +:1036F000DEACE832B524D0B141F5B6D112115BF899 +:10370000DD9411CCC87AF25DA0A42E383D9745CB4C +:103710006BC631831F4A5D3122AB4C8BC4924E1273 +:1037200023DDD1B67D6DE64989BDB6BC8A9D771093 +:10373000DD16568F85A16FA2BFBB89C84BF7BA179C +:103740004CB369EE8271839094550839050997C985 +:103750008A8AA70DF969BB257C670056811712ED8F +:10376000E7675FC0A0FA789AE065F14083A046372A +:103770005F88F564B4E9723454E2CAF4E8DA8AC5C1 +:10378000B7F236929465E3A173AD599EE718759729 +:103790006E9C04AC82E6B6C490B30CC3B8A31119F6 +:1037A0007EA32F3451D9D5359E75851066199B3768 +:1037B0005D25F9AAF2A3790EF39AED5D1B6A04E583 +:1037C000497448F52C797F6101B71FA13BEB3F5F3E +:1037D000496C98FCD0C98C37A331BB802D00417453 +:1037E0004E7FCED9E3A8A896CF4EC4502CB729B6A9 +:1037F000C41205CEDA8AC879C442744992508CF555 +:10380000E6B3402891200C9C79E47DC1C3A0C74158 +:10381000D98140CA81CD23403E033EFF08F1CD2B24 +:1038200094523AB6B55CAFAF0423AB7C98FDD1B6E9 +:103830004243CB64369AEA1DA5D493A3559FCBFC93 +:103840008D743F6DF7DA3EF855F3334F4AF30F9D11 +:10385000E30C99A838DEC9CEF8CAD634013C2BC097 +:10386000837FCC222FAF6F98E037183920D02C659A +:103870009C8559145468ED287C0F1EF444BD0F3903 +:1038800085304F10EFEAAAA58952CD09FB3B8DFD8B +:10389000B72EC7DD279ECC92BBD39D6A6F46C6F775 +:1038A00031C798B8FF3851CBD1BD18270EE1AB8690 +:1038B00063BF5909D50B66D593070F872E164E0E99 +:1038C000EABE80DF9EA8C1DCEDE08005B89CDDADDE +:1038D000D0B4931027E67B6D55728F97D2E670C3F4 +:1038E000BA54FD1BEB59C75794673E7D53A342E082 +:1038F0001576BA3FA92B06E3DB2165A4ABED5A5C34 +:10390000E18AD435289868CE67AAF1425008AAFF08 +:103910003B7B6A09264A31460F0D133B03CE47B164 +:103920007907E7DB311D4528691879BAD756F9EFD1 +:1039300093DB444D9B56E0EC6837F79F522FD6043B +:10394000503BD39E5C1F00415B98773C2EB77F179E +:103950009F1595B9DCCB791823A2CCB3177D63F7FB +:1039600037901A2E9D0022749278A2F148F828719F +:10397000196E7C18E14871C74C629E959C89FBC406 +:103980008F1115C06D921886A875B3B3F64371DB1D +:1039900016A2327133765AB305A342B929B080F525 +:1039A000E533E89D0E32466F91ADBBF65FE615CB71 +:1039B000814CEFF7714F943EB232920AD82BF1D17D +:1039C00081904E19BC95E41D80738EF08BD58A5D75 +:1039D00023BFB0400420BECBB738C4CA82A87F231F +:1039E00041FEB0B2C1BA11C367EE681CFE868509FC +:1039F00012CE59A5D203E386372C539426C25B7EA0 +:103A0000926C421673D4C1023537F88B1E3DDF37F6 +:103A10005C8C87ABDDB4180AEE6D644D71EE273B0C +:103A200017321F2B38FBE42FE302901E5C9CF899A1 +:103A3000810EB8A7263F0C6E39C87967F060C8A41C +:103A40005D416091E1AB8EC156E0E32D3C04AD00D9 +:103A500084CEB43C1F0C0C7F8809D623B0D63DAD74 +:103A60004A97BA6D3392CC3283F072199AC7813F6C +:103A70001B397D078E3B7F89589CB9E18C225C58AD +:103A80003A4F5E971B7FB6B5128034330711FBE6C1 +:103A9000891B6FCC1CFC3F7C7C00DBA819A3BF45B5 +:103AA0009D5911DD0C64DF9400E04A2421D30E50AF +:103AB0000AA28847BE27CEF1E5C93B5F8D9E305DE7 +:103AC000DF233B8372549268C6F6953611922D6EB1 +:103AD000C8192ADBE53A8ED08F7A6B7C1569A45F12 +:103AE0007FDB138EE964421F050D56C8315D1076E9 +:103AF000C74C7121DFDCE7030BF1279D0F50FB9AC8 +:103B0000554FA51E9CF8FBBE38F345776DB5FAC33B +:103B1000F4E4CA6106F2A10FC5AA5D8AD95E688F76 +:103B200049209FD9438299884BC843C74D31D45E01 +:103B30009D36B78BDB58E01D763820961E38EADCC0 +:103B4000808305B67B31B2DACE92F0A9DCD31011B6 +:103B5000655880F33B389BE1510344B317EF9CB5A4 +:103B6000B63BA01DC4E3B97809AB4E1FCABB028C9B +:103B7000073BDF61825DAE1EC712CD56D651EE9473 +:103B8000EC096AB8B08752C06232F35013FBFD6D86 +:103B9000B1805F284C5993969222804EEF048AD8C8 +:103BA000B0E84125F9C3D8677FB940989311BBEAC3 +:103BB000AEB37456A84AAE9B42F3797512C3D88B44 +:103BC00023AEF91F707331F96066574C90A8F60464 +:103BD000E5F2A9A9FD3C206F1E85E1DB7BE42630E0 +:103BE00086B70F58D313B26243073350F99A834E06 +:103BF0006C2EC2E0AE6F023D450EF256154FBA3143 +:103C0000EF7F6BC76CE8A9D5A082BDA23C1A3E9A93 +:103C1000E116B61FE406CB427A60CCEAFA9EBD52AA +:103C20005907562683398246F2BB4AA7356CCA012A +:103C300035495848E35675F2FE47F71359FF3D1EC4 +:103C400044865B852B8D5A1C63B2B832AB5CE68B25 +:103C50003F4A454B852FA77052D9F1447782E6162B +:103C6000F5A3638D88D71F8A3AF980A45C6680EE3D +:103C7000928F17BD1B7FE5F55FD912BCE2C99C147A +:103C800025CAEAEAFE4DDCD2FC5F49F0471E7D4EB4 +:103C9000931F9A81AF275B6E57F5DDF4963CFA725D +:103CA000E707C25F3664D4C47059E9504409029DE5 +:103CB00017DE65673DEBAA748FFC6ECA913362B65E +:103CC000243E79FFD9BECC9AFC7646E07F30DC5C9E +:103CD0005F7BD4BF9A54E383FA52A88D0F6F84FAA6 +:103CE000C3E21348DBC56FD0932E2B74C6B44F26A6 +:103CF0008E715C5D041141CB60358945F70B9F7E69 +:103D0000B2F6C44EB2B504117FDB7890E8DFC03F55 +:103D10008761CC2C6DAEEE29578EB68DC9BD680A71 +:103D20009EC4509C223F0BC74923990FD95CFCEAE3 +:103D30003012FE1C20AD47B86CB14EC7A5265A60A4 +:103D4000B718B490F6CC24E9273C5A477D18439223 +:103D5000F6726DB4BDF00FA2210C7AA4D2321FDF2F +:103D600046FC51485F0A97A367572AA8D8693A6961 +:103D7000E1E3CB0078A8F19A9EB631234FCF2964B6 +:103D8000F7F9D0CA2D9C1F09DF5AFAFFF46AF31C19 +:103D9000A6C33F7458CB5B603FD85A90EBC15A80A2 +:103DA000B997B3138C3E69B03AE7C2E0F8049FAA12 +:103DB0004D0DE6E0CD32213EF80862EADCD6CC8C2F +:103DC000E9F0293B83BDA9351B995A7772C05CE79E +:103DD00061B688190AA78D8E71A805B42CD5802AE2 +:103DE000D5C0F2CB11597461E0462AD0A6D7D57A56 +:103DF0003407AAA59797B98221F2D9492FB6D0E204 +:103E00008F90A5FB9FD92F9A02FF563B643FE7CEC8 +:103E1000519AC605CD2A005110276E17F97DE36827 +:103E20003FB12EB7C570CDAAFC480F662CB0E3D9C0 +:103E3000ACA28A1CBB4DBA09BF9CFEC6BF3BF12990 +:103E40007B8D7F2DAE11F76E943F97C31E69D0ED29 +:103E500043D7A68D5899FC5C602DD029205609289F +:103E600082D33C5394311DB3EB2082017626A715F3 +:103E7000188C9E254C611955AD67E0C28D0D32F14D +:103E8000162B1ED597142AE46622A4B889E3B8102D +:103E9000C2735A5A787AEB41A5621CB78917388DDC +:103EA0000128EC7C99FE512D1FDA1E3F6890B1E786 +:103EB00093FD2C155A6239619516F9A912DB5695B6 +:103EC000A2784D28A22F3E16403DB40C33AB63E7D9 +:103ED00086E36112BE06C4B00AF0910A0C223B2EA2 +:103EE0002D096B8C2EB88892434215231AC6AF64F5 +:103EF000F2E02BB33442D15208F45B00EFA810F784 +:103F0000D37ADE9EE14B7D188CD4E16D44CEDC0B80 +:103F1000D25BF215BA0D20DE35A50828C2A8B7E598 +:103F200097AF6B45F389798ADF665CFA6AFBE293A7 +:103F3000D0BDF81071F6A47CCFFCC83E69D9D25B25 +:103F4000B247E830F0D8F9241FBE04F0818BCDE6EB +:103F50009C1400B64C3CD72397E919E0A1C11B2063 +:103F6000ABC826C6FC151BED7EF881C947102A9AFE +:103F700088A319A0744B72D2F102C8260AF2022F4C +:103F8000D371D859FC9CA77A89C2CE5EEFA115CD1A +:103F9000E722AB7E7D7C4BE1BDF45868FB1752DF16 +:103FA000EE211E2BE70D16B37FC97A9C0D80431AB4 +:103FB0008F1DF581C1C470D15A3B62B61A76A3E455 +:103FC000892B5EF4A701A805F5D5397C3FBF04E72E +:103FD000347A195D5EC36538F14B1A1AB573DBC2CA +:103FE00072CD695DFCF2AB123754FBF9C1387E0724 +:103FF000FA92F907AC91F33AEBC4EF7C7ED7150C3B +:104000001B32F0ABDE11C7B8FFE852E69BC1746FFC +:104010008082C48FF7B962A5872190612D0733791B +:10402000E5BEE492399D7FE4C8B1178D55DBD663B8 +:104030008E397BF510B72779409E7897CABC5A070E +:10404000656A50B84D1CF7E3DFFAC5DE3C5E3DEC17 +:10405000278EEBB71CD80C2852FB25BAEAB0552A9C +:104060008091F24C4E1CBCDC7416BB701E9C2A3C2A +:104070003CCB56E847F0DE6748E20AEEC03C7E558E +:10408000E0C31D9CED8B77A35F20B82F6F086AF00B +:10409000401D055137308EF1F7642424A4BEB1537E +:1040A00082DD4039EA07A2ED0A5341B5A92B6AB770 +:1040B000E682E164821139D28FDAAFAFE84B5BE27E +:1040C000BC03B84065B46331106D22F56B20EBE2A0 +:1040D0001BF727B7613AF580762056EC65D5C3F615 +:1040E00030B5B2316315B3C6684B6262D91745ABC0 +:1040F000953FF9EADD4C1713AB21217183D06B8218 +:10410000FF36EA4DB4B6181F730EBB2AB752C7F07C +:104110008EA794673D6BDD0F6656AF043DBE483EEB +:10412000B7C78B9EE550DA2EF2E482F92A1EBA2434 +:10413000DF5F3888164D25D5C6030BF45C44D32CBD +:10414000648CD6D8315F076B40E39916D55500BA19 +:104150004E96E6E85011AE7EC2731AE2340F533524 +:104160002A0D73FEFA77AA1D132F5628D02FCA578F +:10417000A500632C21A542E9F214C8784A11B6EBD8 +:104180001AAD7F0C48019A46D152ED39B75001FD66 +:10419000B9D28736A92ABD0FDB908F0E741904158A +:1041A000278BE10BE08B08DE5B6081C8CBC7710C0D +:1041B000A08ABF471257962E533F9BBF9E9C071B5A +:1041C000BEB5E631603E96675A4D1111EDEA4CF4EA +:1041D000B1C457EE1588E6F1B0670969FB0E09D244 +:1041E0009D11D59B5901249C0E8463F088365D7720 +:1041F000C7264C5FB513F223B4356CFB9F9CE2538A +:104200008FDAD365577D44B0C858657C8ECC4EDFBD +:104210001F04FEDFB26496DF2A1272BC1D5F0BA67C +:10422000DCD1688B0522093D41156B2BB4272C0E80 +:10423000EAC587D77805E295010DD8979F1080D8F9 +:104240000DDF931E8720A448A61C1D49C6CE85DF1E +:1042500044773A59125E429D7AD982A4C38AA4BE99 +:10426000F7D2587B4651BE1C7844DD860223FABB48 +:104270005977AC1DD4FBF7AF065C6F5C54E208FCC9 +:104280007F73104B723D0CC041EBAA4C6A779A07C2 +:10429000F866BC9A6E0B691524D4396CDEDEEFCE5D +:1042A000EB9DFCCF953F632AFDFDC8FE810E09679B +:1042B000813867AEBCC61B9F660D07B73D89561295 +:1042C00088BBDEE3C4D269EBEDEECD3534B2C2C6B5 +:1042D000FDF98CE12633E7014FE2EF56AB7353D281 +:1042E0005774DE76D2C8EC1F5768342D14C814AD4D +:1042F000B8193C61571845374C53FC5A996EB09524 +:104300008AFB2563380C62E8D85A628259564759AD +:10431000B76FC4C23CC55F840DAF9F18099951881F +:1043200093B865CACC4A5BD3C35AB8872439140FF3 +:1043300009820DD1E7CE1E8D28C489379EFC6D21E0 +:104340003A988EEC85314024DE66B15E792DF358C3 +:104350004D09A1BCE686D20DBAF9C666BF36DA6150 +:10436000535B27766DB262014877D978233CC9C385 +:104370004BA50B9320BCB6B2DE13E9AE99A5F0FABB +:10438000DBCE56E2F1D8E0C966ECC21BB8CFE9E259 +:1043900007B1FF715DF327197B53850AE57B8A140A +:1043A000466AA7C728B5BF729B619AE4D0E6AEC43F +:1043B0000E6C52986922DFE54FB108505D0A0A9FE2 +:1043C000E10E837B90B175262CD0BBA6DCAB1C77AD +:1043D000FFEAAEC1C991736E6F83212F09D4035ACE +:1043E000CA0A43BF400CE2210AEBB85FFEB54C5C41 +:1043F000105E8D475D9BAA0DCC78B6F6EE3E786DCB +:10440000B892FDF957E3A4CE430AC050DD59F0F24B +:104410003D2056256F817EAA2222BAD9AC1E61C5E5 +:104420000697F32B1B1292F6155FA91F57BFD3589F +:10443000082E40707D4C25BB72F65733A35416C12D +:104440006D1B5D8E53E902E5DCCFD1E239476D1675 +:10445000605153CACC48CF1194476C020DE62D939E +:10446000060659CA01D8F0ED9D724BF1331CF1CC10 +:10447000BC46B55A61744715EDA8F70C5BBEA96739 +:10448000F4D81E51ACEBA30E540F1591A910623F46 +:10449000C843A29F9B22B9FEDEF6F990C86D359FF6 +:1044A000BFBC924A3E3D7876DBA2B5AC6F806FDD33 +:1044B000890BDEE01C8728657F1E55F7EB662968AF +:1044C00067B28E0C9E84EEF1163BBAB222670A8761 +:1044D000BB3A0F8058E1D102928FF0912E15C7950B +:1044E000D451E80F475A58E16397636F9585ACFD47 +:1044F0000C29E194941F37000D02C51953C9F6B079 +:10450000F3C8DB5D806BB3B190573922D5E936171C +:104510005F953FA6A719B7A0C6FBFE7AF7CD39076E +:10452000761EF60919F5699D063EC928AB01900271 +:104530000DD83A704C38BF33FBB67C25CC4F7F3E4C +:1045400022799BD02467CCF34337B4CCEA2C58E6CD +:10455000175FD1B9AD58A5CC2A2E4025F2B8807688 +:10456000C65F8E6944756CDB2F4891055477897C52 +:10457000F3DE99FE86EC8DCD4E5CD8864B73456B91 +:10458000F0680A1EE53E6073D40E44AE6CFC5F1208 +:10459000E894207D75F1A2C87A0820EE4D45A7EF7A +:1045A000499ADE6EBBE935521E4045E29FAB4D7223 +:1045B00088B2F8B9C87608712ABD2F5BD9B2B58721 +:1045C000110EB9089F4BB94F6D010FBD65601948B9 +:1045D000860411ECE127D24FC2A8CC05790EEE0C6F +:1045E00064818FEB7DF6655AA7CCCBC5CBE2F43A5C +:1045F00025E5C966D99B96FAE9E0BEDADF3CF457B7 +:104600009C285083F7C34E56179C55B0606E68D6F1 +:10461000483730959FE48C3F49E41D461A52315784 +:10462000126A011F5AC050D85A43C041C7D4C1BEF4 +:10463000CAE87883279BB4AB10112307A71A6886B2 +:10464000745B218D2C2BF2DFF34B5EC1B25929E94B +:10465000727631FFE02C6C9F635E7E4C9A3B84F453 +:104660007D539407DA225D360B0627487F923E88F9 +:10467000364373A1EBBC477561D60C825695715CCD +:10468000A269BCE0C12FFA7603D2F73C6E11E24D6D +:10469000489B20B64381ED626AE16DBC97CE42E84B +:1046A000C1DB79CE456A774A8B448CA3751893AEEB +:1046B00075760810942943122C55201AB37F0CC725 +:1046C00025B282B5A9AB8DDB44BD87ED6F026931A0 +:1046D0004BE825610AC7CB545481D45BD42EBB0769 +:1046E000193CD785B097F0EC8FBB98EC023ABFEB42 +:1046F000FE788DBA7554206BDD4E71FD5D7916F430 +:10470000B6A7455E972615391471C05D5A4787C410 +:104710003EAF555B49DD5EE5F98876EE4464743A58 +:10472000651F0374A279314267B644A8474BEDADCB +:104730008BAF33C4A71C712DD01569A4ABBE26B6B0 +:104740001C82DEC27922D7C6F3CF631FD7086C0361 +:104750005ACD082339500E8BC50B41FF9A29D4CD71 +:10476000EFC2D71A8E56B556A95D945568515F2889 +:1047700074140122A452CD786F7F5F28E3FB8C175D +:10478000687974AE7F0BB66E00EA40DA43E227D256 +:10479000BCDCD85A103F29DF98792F3562562A841D +:1047A00064FCD867A15F16D7CDC45809D0D7B85BD1 +:1047B000958D73CA39DA036946B3067D08703C7873 +:1047C000F0E208EBFE1D006931FDF3B8B1B0402501 +:1047D000EE87487700EB0C31308D3B59C3DAAE0AD7 +:1047E00030FAC2F049002269FDFA0FD5B65AB64D2B +:1047F000932ABF3FB8BD81E9F66E663977F158FE5E +:10480000D7CF5DCB16135A2A06720C023586745C1C +:10481000F1C11A878F800D47C7884828511BDD5B7F +:10482000FE790DF884A1A5250C8BFD23F92558B43C +:10483000EB43939D5CE13DB6797A76CB32DB8C0518 +:1048400024F8EDF40AB5FC3EDB11B6212A398CCDF3 +:10485000EDB2D0883DC14C25C790AB44AC2763581E +:10486000BBA51239BC562F1A9D19C546E0E4ADAE62 +:104870002BCBCF733194F52E47D00FD37382624781 +:10488000A62B57FD1EF9341E857FAEFAD94ABA9D74 +:10489000ADEE3BD447FB1038430E91378498861811 +:1048A0006E4079F4DB2781495588302FA5AB11B0D4 +:1048B000B03366899EA3C92435BAC3FED57AF115F3 +:1048C0002CE05872F4B7DCA2DBFFDBD4DBD4237A14 +:1048D000D4751BEB86CB0A04B577296F9EC8926905 +:1048E000F5739863376EB5F61C80AE88AC529C8821 +:1048F000F7A19F0112839AEE7AE21CA1F1530DA455 +:10490000A49AFB8A6E17FC764FDCB887C3C01FDB06 +:1049100045F7009EFD0BC25886B8E5192E9FAAD810 +:10492000245D4B355B93A393988FA6A2EC375CB1C3 +:104930003E7F4DBB0FBC72233A0A10A9EE2F202BED +:10494000FDA5C0735B46A3C806C968EA70CDF7AC85 +:10495000BD70291949D04BE045B0D10299D5BF7E31 +:1049600043A6D21710C47D0E0947E13B47A98A32FE +:10497000C8FBCB834FB8E1F13A03D03109CD851B99 +:1049800041BA72C4A7D18C1180EEF8B6B48474EC2D +:1049900090CDDCF0488A7C7E686DC89253C6BD9885 +:1049A000CE3053CA546A0199B0A93C396A53405F6A +:1049B000C4E0D522D6B3CA77F5610ED2B984C11F3F +:1049C000298AAA25DC0E519ADB421ADDE23AA706B3 +:1049D00006CC0B15AE7BEEF6A01ACED0927D2FA89A +:1049E0004C8D71DD928F2B92B065F4AE85E2FE5B4B +:1049F000B5635B047843D97CE1A57CC2B3FBBD42BF +:104A0000502655B3F7BD19512A6DF5FE843FE3D406 +:104A100018C83D44FCF27ECF4ADFECD8A972C5B677 +:104A2000CA927C0D561C929A9A695DE7DDBCCAF960 +:104A30004FB2C7359F1BCBD53094CC6E21F74C5F5E +:104A400076A80CAD3AC774F2D0EBD5FDFA76A3DDAB +:104A5000BBE718CD578E572C9E62216A2519A5D128 +:104A60001A809B195E193ADBDD830594194C2B954E +:104A70002E354079793DECF843CA86DCCE0B65884B +:104A80009BF6C50531ABEBEBCD585C7FAC2E9F9B05 +:104A9000EE3C36174ED23CC96C169FAC08D0DEE611 +:104AA000DAD257FF882737DE328658844B5981F592 +:104AB000A4B4E0D573A012379D50791D41C444843D +:104AC000C115BB22A4568449CD6CD4012FBBB03D87 +:104AD000E3E4C54993EE422E5FCE312A781CF360A1 +:104AE000EC590FB81BB8E728E344B996F08B21ECDA +:104AF00054260D1ECE67A5ED8F2E5E8B6ECCD07723 +:104B00004714A8B69A94955CAA87F5BEB8EC9E7037 +:104B100049EAEEF63E6A52B8245C444115E81E9814 +:104B200061090ADCA15E85B176EC31D9AAFCA9D66F +:104B300011B3D1F992214945210CC90DF742C6B4F0 +:104B4000DDAD961CDE10E7872E18E9C60B0BE1855C +:104B50008E919F6CCE9C1317FD35C13C0FA09162C6 +:104B60006887468D3FF7F5C08569D7823048615C1C +:104B7000E0F08E908931F0797D7655E58DE38B8A72 +:104B80008C657A7942CD0A4DDD0B390D872512DE11 +:104B900003C91A4F415C45B83DB0368DC2D68786F1 +:104BA0001D20F9EEF547569EA1B15552F7B61C20CF +:104BB000A67BB6DC81E788C8E14918F0899DEC9FA7 +:104BC000B54AAEA887CD0B2588B4DB5EEFBD01F3F7 +:104BD00003C8455C9226FA38CDB62B4DB6E4367B39 +:104BE000AF90C96E0098EFAD6C3DBB3F4A7DF0B70A +:104BF000A1000BD9F34C914DD64AC65612C8D60126 +:104C0000E8448DB082C53FA8164B77977BF1180E0C +:104C100007AAC1E785FCC93E7171183004B4AC8F96 +:104C20003960A90165DF16A39504414E26CA66CEF8 +:104C3000FCDB9E6D6D267A87B70A230F9CD19D9869 +:104C400067AB233CF2B8A996E4B1AD3900F58D9875 +:104C5000989C9D939952921C5C0D6C1C2CEAAE9210 +:104C6000B59C724E846D0A0F7F332F0A6EDCA0E56F +:104C700075E429E9C52520D5AE63BFFF2FA0A8257F +:104C80001AA53FC472FAC89B3C1129179DD990C53B +:104C9000FAA927F4DD3A8AC410219B694D3D31758C +:104CA000A997D39BAFC0663DA55B345D161DF88701 +:104CB00099F346389D7EA3BB0933572AF8BDF97E88 +:104CC00042758B1B2AC26435BE8C9B4C7C82B6001D +:104CD000511C5D959F4738FF0BC50D8D0B61AA4890 +:104CE00075C06410E93A2088DB2101A9034CC0B8E3 +:104CF000E3F6784BA96E3E6035EEB4060760F389A3 +:104D00000F1C39684DBF5EC2AE47600D653FA0A362 +:104D1000133B08B675CEADC79FD2D51175C819ED36 +:104D2000F2A28752D59239C6D389412CDD40DAE010 +:104D30005A12373D9DBBA2C41EB2BBA10F3692E7EB +:104D40003459DA4018ACC01F83EC19C359CDA04DBB +:104D5000712E893BD1C1ECEEBB53B2C55DA0C2D66A +:104D60001D47C380AAB5EEBA64C5107181669FB8AD +:104D700013A6DCFA07A6D84B3B459C12DC5677E815 +:104D8000BA7F235A02249F0E6544073322068BBA4A +:104D9000AAF86758610285CA4A2E3D0751384E4825 +:104DA000123FF9B4C023001FCF055CF9F23E100793 +:104DB00087F9626C5CBD393BF4EAB1E02B6D9AE097 +:104DC0002FD5866C579F423771F2AA99FC6B5FCF43 +:104DD0006995B2B050F9B60A234A460741AB580F5D +:104DE000712D679B54D0D6F4EED01F8A19AD56AA08 +:104DF000082B624138CE8C2E1CBAD41EE677C8DC54 +:104E000006B052DE388BC588FFE8488A68E036DF96 +:104E100077179E0E3F1F55E41DD0B435FD8CE789F2 +:104E200024D46E9849CF02C10B04373CF73DE652BB +:104E3000073106F432C1279E227E5FA9FCB1B0E59E +:104E40007FC94CED357604EB791DAB6EECFB7C3FF6 +:104E5000C274E78C60F748ACC456AB0AC2AC0F9181 +:104E60003D7BC683453327E5C0C1B98C8EBEB12AD0 +:104E700043EBBC3C08FA98C2C942A73DB852322E57 +:104E8000455F575F752031117358ADA9DD1A978AB8 +:104E90000AF19F41552125309C9BF270B7BD4A9184 +:104EA000EA07EE69BFB30DF33B3120294C97072485 +:104EB000A6252CD5FF3C9A9E7CA74F14C6FACF722C +:104EC000BF5043EAFFBC83A3CFACA4914F283FABB4 +:104ED000A4F26FE8EEE5C5E3999A58D95FFCA99270 +:104EE0003E0672BA9C2BD3DCED47D9315ED079D423 +:104EF00040257EF8A5DD34960A30FD393384EBB0C9 +:104F0000C9A38EB77968E2118A56C044B1C9DE8A56 +:104F1000C7C5930C07EDAF3707134571856F96D55D +:104F20007C2D71A1FC2627A12A96CBEE6BF2383599 +:104F300012B41B5EC598F68950725102064F274A7B +:104F4000E0ABA320C99F3ED5C8D53EA580C6ADAA7B +:104F5000E6383C934F4D1880D01A5018C93FF10CD9 +:104F6000602625AED570B8D2A6B45067F6F00C40D6 +:104F7000ACC40AAC39B15646784C52EC264FCE3808 +:104F8000F7313B2BC40336F18B87FEAE555C242BE7 +:104F900058D3DF8D3649D004632C6278BF329187B5 +:104FA000FCCE8FBFDA682CF5F5D3612F0CE37A06BF +:104FB0002EB5989A0BFF660DFD0D059984DC7215D0 +:104FC0002049E088F83A95FB9A2B6B07FBB45B1EEF +:104FD00048CDBEDCA848BDB5F88AF6B7F824D3BAE8 +:104FE0001820374E2011FCDFD54CB8930E66AA83EB +:104FF0007E5272CA1F054695A31F62991C2969D269 +:10500000EF212CC62592BB32577E435FC3A668783A +:105010003E24B49941D3350F336A979615023D9BD0 +:1050200016846AF8BF9AAEDFF2E0F20F93528E3B1D +:105030002B2E88C707D9CF24C4A191AA5BBF6AA22F +:1050400049A931FCBF956457179595ADBABD1B0BA7 +:10505000A610E26D459CF9DCC457559489F7F4E33A +:10506000D39DE8E0CCD38C90359A6BF7775C806168 +:105070002514B60F030B894394C8BC7B176C0857E3 +:1050800001241C431B2D1E8054C08BE42399F12A5C +:10509000ED461A82F6A92CD7682176FD362EFF112F +:1050A0005C8513C86B53A127733EF47596D891990C +:1050B00042090D504A0736723BFE9C96D878EDAEF9 +:1050C000EF673DAC6439DA99EC9CA3E66174D7577D +:1050D0007FDBD8DBA4E456FC5541AA42515CA516FF +:1050E0007DF0D713430E10ECDA0D21E35778EFADC6 +:1050F0002E86F45B8EAA9120A079C3D365B42C428E +:10510000A2D4EC70868E2093EA6103A72F2160BDA4 +:10511000A0ED402D70E0E5CD37B1895AE14D538CBB +:1051200039552C36DF62D517E59D784BD30BB5E7A3 +:105130008CC558A0ECFE2536B3DADDC332B5D6995E +:105140004B745A8B3C4B7394D9B8BF595CA095E80B +:10515000CB70B4EABB3A0BC7DB02189E6D99213DB8 +:105160003165357BB00EE393E11D466A955CED65D4 +:105170009ECC77AF92A5654C8DCE68E60858E4CEFC +:10518000912AAB742FC45F8A659DCA198DAAA5B5F3 +:105190007F5D8300E1FBCCDCE752C2C54A115B9422 +:1051A0004747999EC6499D4FDBC33FF4F3E0A6A154 +:1051B0000F4F035F15C71FA0960C9F64B3B365A77D +:1051C000460F2F80ABEC58BD79445D517AADC43C9D +:1051D00095309E07146186C30ACDBA8733360FBA5D +:1051E00091779B656F023C0CDCA6A8615CB5252E0F +:1051F0003DA576319FBB725CD69DA321D4B6CA294A +:10520000AE7DB39C409C21BCE413461F54EAB9C256 +:10521000CF231D78629B9205258DC83AEE932229F3 +:105220008F6863D8C10AED804185CE8B17E25D6936 +:10523000BD8D614BBDA53B9F01106B6E986CDEFF71 +:105240006B89C809A113C92C85E73A3F78182B83CD +:1052500031DA9BD16175F675AB2E187502B23B162B +:10526000AF3E0AE9DB63A37838CF7C25FC7980A3C5 +:10527000829CCA60B71E9BC94C869DC7CEB126DAF8 +:10528000B3008C9C3C4F7E744703BD699EF7F0963B +:10529000C24E31FCFCC5B845CFB4106DD4E020AC93 +:1052A000866B016F3245DD31FFFB49D86D0EFB9EE9 +:1052B00002FDBA15A17B0F3DA69DBDB386753FE1EA +:1052C0000F3227029B29FDE3C118F235EACC26EF05 +:1052D000BC5AA08A3FCFCEE479F8C739686BC8952D +:1052E000843200FDFB2040AA0061CD07AD192CEBF4 +:1052F0000D2F2619EA174B0B40708730B33AA8914F +:1053000021F69059274778F49676EE8CBFA0F911D4 +:1053100023F23B3FB7F3BF88B759F57402B4812835 +:10532000BE3F80E79FBB4C5C392F275AAD91717609 +:105330009550043FE5D62F35EC8A42C5541C31A761 +:10534000C5A4752062B82934617AB9A730E190E626 +:10535000FEBD141E6B1C0432D2EA73670FF02616D2 +:105360009B2534B5D501134FEDCC85A2E6883E923E +:10537000512A53326DA56A8DB37E510C1A25D5651D +:105380008BDAAA00691DD597F3981D2F62BE1E689F +:10539000DF3DAC48C8D2375D7D7CF01985BF412523 +:1053A000BFE2785EE13E4C8ACEB6BB186575B57D2E +:1053B0005F3B93553A7B50E7E06CC5597DE8C39954 +:1053C0005C7409133EC27362F32CC9445439FE2F36 +:1053D000F2AA74F42DA5ECD2C300872A198BD99BAD +:1053E0004D6734C69FD2BF5E33A3B8373C3E4B6A8D +:1053F000C99B93AE66D7D132FEB219059CA200D8E4 +:105400000A5D57C12DC6FFA308EEFCDEE036DC9036 +:10541000137D82263228A36A3F7555A60369484545 +:105420008C229A7D05922439E0802E561161DA672C +:10543000EAE128591EA86281F6CE21EF503903987F +:1054400082EF9C4D2827E0575929ABA38ADAA19116 +:10545000F29EAE0DBD9D10B268DF6434D9CFF990D5 +:105460005AEB5B26EC6FFAD671B34A287278421D6C +:105470003AB1C11F648EB38294A2A79C767C910836 +:105480005086C5D65697EFB0340540F78899C7EADD +:105490005886BB6475B793442F9A06A29C1E177E4C +:1054A0003F7274966DC6EA06AC4ABA5AADD6ABCE18 +:1054B0007751737ADD201460BAF215B46B1C37E3B0 +:1054C0003D0BEA4343697186351124048AF962E988 +:1054D0002B5D2CFBD8AC3D6E99662D3723FD6B33CD +:1054E000B16C7D60D209AD0E6071650670BF4A383F +:1054F0007B26B53B6D30FCC89EE2B0A7D37BEC9019 +:10550000B64B98D40E4F26B994FA6F85E980DCB07B +:10551000CF91F475D5711B4ED2644C6FFE2B2A27A8 +:1055200060BA999F7AE1D6DE6F7B2C900037A46336 +:10553000587F51427C984ECE1F9E4CA0B048892582 +:10554000025D5A702CD111CC719D80EEF9E550426C +:10555000406BC8C1FCC6403CD6ABC1BC8A06063114 +:105560008577F9C05C3E6824FFFED05182119573A7 +:10557000C8ABF016F6043239527AE54C726BA13B97 +:10558000A134D0AF02A80695DDD22A8C7FABA33B15 +:105590000F20B68E1B61B7AF9538C5E67E7A1BF239 +:1055A0004FB855C727F930BA2DABE5A993AF3ED216 +:1055B000D3F9F1FC24C83E6CDA76A1E96CA0C39063 +:1055C000C2019C9848FE2CFDB74CBCF6B627C62DF0 +:1055D000FB043D501F0820701957F78A586A8DD771 +:1055E000F837390345794038177A300F68208BEF48 +:1055F0006C6C266FD91D32B95290F6F5F01F512F01 +:10560000A32057B014819294842F4FCA145E4FEC9C +:10561000FCF3D361B58D7B8AFEAE2B9A06F48561CF +:105620001041CED19C323651E252F26F7961B58A87 +:10563000817DB47E1C5889210AE1AA526AFD3EFF91 +:10564000CE9BB20CF2129B811380C358E1B608B313 +:10565000A65807E6736ECB1B1CA6BDF39AE968C774 +:10566000D3E3A91669E2309F8928A066D22A328244 +:105670005422582E76F4CC295898355F365503AB12 +:105680008CF086AB36FCB9302612F104F810C7094D +:105690002DCE5E0D90491A0DFB081F920D14BF4EC2 +:1056A0009A6D00579D5EA56DC2E4CF42AA6AA46DB3 +:1056B0007C01C19C22E02CBC64F44AE78CA36B28DB +:1056C0009EC5625550FAD7B8BDF27F890CC33BD452 +:1056D0000D8B85A6384957EE4FD379F22456EE51FB +:1056E0009C5227DCBA04EDBF174788BF53C41E2F56 +:1056F0002A4B0F8762F20A6151486A0E007891B70F +:10570000ED0FCE73C41EFE2BB29322CDAACAE23394 +:10571000A9C4B7E8552DD8274D52DEE574CF7118CE +:105720006C4D847CD81CF51A10172546560A842C1B +:105730003C4E01639E46ED49C794200DE7DC8E8107 +:10574000A145DB32717A73F23047F79492F3CE229F +:10575000F7E5FA69C8BEA37A1B0B8BCF9A5DA4F359 +:105760006251CB4D6B9516B796B3E8317C6A2CE449 +:105770003F7A5DFEFC565A008858C1108A86A23CCA +:105780002D4073FB1E1D799D2F3F630EA218AD2384 +:10579000933D6E4BFA8D149DA417017D19D823A853 +:1057A000C858B47C78380B55EEEEE03E66F0CF3644 +:1057B000206F40F2D4ACD6CD124DDD01612A4D5E92 +:1057C0003B578A9629332E7C479039453B578C06A8 +:1057D000C849BC272780EBDFC0ABF78C4FC9A7C7F0 +:1057E0003E93D6B8A72B285785EB1C2F858A259D7D +:1057F000AC23ADCEA57D6CF99967D172D1CB4E7F2C +:1058000017F685E55F84FA5ED47796586440E4C75E +:1058100035CF8896E104AD018B34172873B628186C +:105820005333481E8DAF1BFDD5164B183ACBB12D07 +:10583000251A0E47A4C7F623104784291EF6561AC8 +:105840004974D848DB7A5E5BAF08068EBC634F5E56 +:10585000985FF913B8D38CC47B950D57B5E40590C8 +:105860005C7F697E2E3727CFD9D28EDF69DC24FAA0 +:1058700004B32C1CB7B6B0BA65C7E3B8BC52543FEA +:105880000EC80EB295C7518F9B5D309E3158D454CF +:10589000D97BED1F76F2FB961D992A8B4961B0F3F7 +:1058A00032821106B3F10471825C387916520F030B +:1058B000CC315ACA37705D0D5C4DC4EA5A6EB8B728 +:1058C00067F61EE98BEE6D07E026B5260D9175FA99 +:1058D00097DE54D38434DFA33B9AFCEF4C7320D67D +:1058E000D957779422804344195DEC64C15857809E +:1058F00059F62D834D6DC0BDA500F073040942A675 +:10590000D3D71BBDECE971862E56EBD29E6109EF11 +:105910004D7BBDD971449E6ABB23022034583FA6FB +:105920009B6C2980E33C995405F3F52326B513AC11 +:10593000892933005A2A6BF1A841EC126209DAE195 +:1059400000D56F8161EC6736F272FA3923D59E6C0F +:105950003BB5D9E9932E3AA6F612EB83B9FC2501A3 +:105960000CE1A36114D866C998B205180DFBFD7649 +:10597000B94DB5A3FF12064D4734AA458E8E548308 +:10598000A05CCD70D076BBE88077F90E7C9A57FC8E +:10599000AB0C4D0CF9BB37EA7AEB6A669788E7CD1A +:1059A00019418A3A3AEA2D14B77CE2490A3DEF2CB4 +:1059B0002A9E57C887DB5F8E042B39389178C159EE +:1059C0006319F180DD6EE4A81CE2A2C71E431B161A +:1059D000B2B7B4989CCD5F0FBF50EF25A46FE78599 +:1059E000E36F5F7F1A44986FD2AE680EA08AC0D072 +:1059F000B511B197A7D05E7FA4BC5A21FBA0EA33B2 +:105A000095C8B23530542BEDBB4281DB8806A8C85F +:105A100025607CB43A95C08AD8D8FFB049101B06DF +:105A2000D88B75898194D0074874B39D39565FA08F +:105A3000073B8EE5FB4F4D3EB68CA11B49055F87AA +:105A4000AE86C78E6CDB71AB46E747A7437D14BBC0 +:105A5000E39C32546DB56AF9A8AA0BCFCDC26AB7E0 +:105A600091AD9E94F5E057F16E4E8C64DA0818A360 +:105A7000C26C26DBD4268C7C50923A46859DC31B93 +:105A8000AB3AF78540019EDEA2C3636637540D6EC4 +:105A90009EAE282A5CD2E228CA6086A3D564BB7F6A +:105AA00040B0DF011ECEF020C661E8E3D5A8CEFEEF +:105AB00059B0145663C3D205FDF5090956310E16C7 +:105AC00085F6D76824842E42D5ACDA3E0C383129CD +:105AD00091C4F0F57CAA5F9707C74A9556ED25A2B9 +:105AE0000133D778E8F12BEF5D32630E6A3903C3D7 +:105AF000E1A4B07FDC2CAAD4BBF2324005967674C8 +:105B000056A29C92FF3181841FB68631F51479D15B +:105B100015A08D579E4EC8117D1DA9C8EE98460947 +:105B20000C921F7F4BF715F9FE39B67D9D96D4F484 +:105B3000788371CD8406AB044B93A1284D1FE51EDD +:105B4000065978C4EFF7E1724E72FFF29C53CE987B +:105B5000A9D1C80DACAB998F5D7BEA4B2A72A7988F +:105B6000C661E43158BBC4F323066F038C0997C5A3 +:105B7000E840FE34AE94087B3DEC9EE8B6F253F864 +:105B8000F41DE2D7604E2E0574233349C18D9E2B40 +:105B90002AB157D70CF28C602595D28B62C9AB3BEA +:105BA0003C1E8D33B7E382D91B5BA2032FAFD67E99 +:105BB00050F8B0980C2AFABC6DF323B515C236D054 +:105BC00063B44350B0E1A496BA44F53A89C6AE80B6 +:105BD00017A1D7917176F1AFF2646D32074036E7C5 +:105BE000E4BC02BA5A3FD70287561EC84DD593CDA2 +:105BF0009FFB51F95BE134444BE50863CC79300EEF +:105C000075CC0051D8AC96E5D6CAD5218743F7E4C8 +:105C1000CAF8B68BB504ECF828377DA17A5CF46736 +:105C2000C5A9FCBF3AC57F6D5289A5178863BDAE73 +:105C30005F4E4826B950059A0771392A59606BC4DE +:105C4000B5FF70EF723417CFCCB05A07F76775B74E +:105C5000676864BB1F5DE96B2F8A8A72755B8EBAB9 +:105C60009D1AF232D587FA70D07B4F869BF5E74FAD +:105C700095DDEF8F11F7FA269E3899E1B3F70821E9 +:105C800040EDCF74EDAB3EC55BBE5677EA925F3513 +:105C9000942F391E1299244AD0A0790E6AE3E14369 +:105CA000634DAABA23F4B1A3E9BB4D4B7331038909 +:105CB0003BE4D2D59B9C6B6372F3B71C4785854D43 +:105CC0002823AFD2A701BF91C799828D726736048E +:105CD0006B36ED7FBC797278710B38EED11C9A5619 +:105CE0000F27E137141D3F9E948E6BAE502A6E3AFB +:105CF000E93AA0798C50E31D791873EF5AFBCE84F2 +:105D00000A8A652FE92A53D49B51AEE49B8D387ED5 +:105D1000A72D949D2B72D49DD997C182078137BC42 +:105D2000F773EF9CC3DA668F9C13E33C56B1417066 +:105D30008E02521D043060731712A9933D19201A68 +:105D4000CEB9E4CAFB8F772DD8BAFD6E31F39F51DF +:105D50005654002A20B16BF5E1AE2FF540DA7D7381 +:105D6000DA931B73C2437B1D137C000DDD0EB4BCA4 +:105D7000AD8C47F3723817562BE008CF74D24C091C +:105D8000DC46036918A683390B73BED51EA304161F +:105D900034189490E40FF2F5D80B9C460599C2CDC7 +:105DA0007F94A21562B95542AD3F39EEF74B3A47A1 +:105DB0001D4C99746E2197AC11D4C28E403C277152 +:105DC000C3DF401010C46ACF31DF7AD7334E35DCE1 +:105DD000887F2C7ED55EF29246623DD0E239F896FD +:105DE000828723067AF3E39472D90DED9265BF534F +:105DF000BB648CE1ABC728CF380E9C4B497E57FE65 +:105E000094833C82DC8DE3B18F748CAE3231C3E07D +:105E10005ED04BFF704A49FCFA14DAB8BA86177E96 +:105E20001A38EC36F7F51DAEC447390E75179011C8 +:105E300087DCE48B76F311184B64AE8629C716977E +:105E400068116C2D08B5D6DA972C4774BEAF3B6D40 +:105E50005175668818C7BFEACEEE06776C75167066 +:105E60003926EC035D5224A4ADCD3C62E477118F5A +:105E70000F664798F9684A3B599DDD1A6B7A1701FE +:105E8000A59B73568F447AC6A8A4EBCF64B6FB20BB +:105E900069F721773BBA33595CF09BD3D8345FE97B +:105EA000727080A9902DCF96200DC2A06919C337BA +:105EB000C8C9E4985B9477488AE24235047413F2C7 +:105EC00042B338BDC2FAF676462CA026B7FAD04EB9 +:105ED000B2C1E2BC15B261E20DF3E59620A65DF712 +:105EE000EECC840A9EED973085A656DBAF628AB170 +:105EF0006FF95C6EB3AF68F8D3B2C6BDAC7CCB9221 +:105F0000F8C85DD883D9E8D47AAF05AE58C26EEA36 +:105F10006E2F737801F496922AD2E74AC038B3D430 +:105F200008E0DA86CF5D39D817D45C240D31FB1830 +:105F3000E4FC0B45B452E078F80C0BCB12F787BFAA +:105F400039DD2A02C76FC83D62EA61AB5AE4C2106C +:105F5000206023FE7EBCC9E6F8099F426C26EFF163 +:105F60003F275D53B522DE238ADE35B4F2214D652D +:105F70008721B985F06E61B9ACDC54C89A14512FF1 +:105F80006019744BF8C5A236A6E3DD9BFA3BB99ABB +:105F9000CBCF0C076943E19AC6C8DB4991E835DCF1 +:105FA00066F00A246508CA14C8AA7769320B7D31E5 +:105FB0006F265E827FFF823D72273FFA573EDE5A90 +:105FC000B10A46C188F1BF5559215708DB765C8676 +:105FD000A693E24FE86006915DEC7692C2C21E1B6A +:105FE000628C8BC5DF8DFAB5D32C84779600895BE4 +:105FF000F4956A737A8FCE5D2391B7C68EA986A475 +:10600000EC15A18EE251B9D8B6C1CC07CF4ADCBAA3 +:106010001AFD2341C0475D1DB042DB09EA0FE6C906 +:1060200026BFF509E9A3304D7E938898E56B20FDE6 +:106030007229FF4F9FDA6E370B18CE4FEB6B3A3950 +:106040000DEDAF3D9305309B00A021444C80F94EEF +:10605000DC84F8934CB6E7121C9E4CA97E4FC48397 +:10606000BCDA7343B646855F9B676AD540ACE1B640 +:10607000F8B3466B969DB14296271BA52C281EC7E8 +:1060800039E44BF91CDFA9F74BFBC681478BA34FC3 +:106090004D4A8F642AB936B9CC178AF1B7E4AF9A62 +:1060A000C06051FEC757F247B35DD0BC708C2D0E57 +:1060B000014FEDFAE4D7F2014C3EE3178D0C14C505 +:1060C0009533D99D67357EF06EFAC28796E3D0305E +:1060D000609F9E424D6F0A76BC97859A681D7DCB66 +:1060E000D668DDA6860B51D5415777452B2A09C4C2 +:1060F00082188AF60A5EBC876EB9E838E8475AE823 +:10610000C868C8A400D60753EB200A6FC69209B22C +:106110008E656FD1B238BDE07DF85E6859CE9D3591 +:106120007E119EC974ED0A435D95FE38A9D6766648 +:106130009AFEEAD5407C236F0FE0788246F6261F50 +:106140007F13879CF282DD9A3422CBBA1B30E68122 +:1061500005D21FBA4D79455DB5BB0B57E5CF003B66 +:106160008A138D2C8F2DD28A0E268A0B09B4A74450 +:10617000854D58F746A26C4C331F877E32D6AC57FC +:10618000F9B65977AE533A3B7A49C8E4EF4F1482D7 +:106190009A77A52D7BB56B879567C54966136C0803 +:1061A00031C8F9179F6F2BF4CA258F2E25B1E496BD +:1061B0001C83CA2D69C06E387A015E43CFE02B681C +:1061C00087998B2D48F6EFEBADF6D20E96FF3A6726 +:1061D000874B7BF9491BE62836791074920A93C8DD +:1061E0004A9C17B69D36A1D84A6598FCEA4B659B38 +:1061F0008F47A4D144EFA6A68A6454ADF3A1EE68FC +:106200008227594AD67D21249EEA544F5E2F973C1F +:10621000F7766079414D723930DE4A637AF1F32EB8 +:10622000403D770F4B28520C3808CEBD568CECE61B +:10623000658B0FF86DD38619AD4BABEEF460DAF1D8 +:10624000A65F102AEE72A668CDEE399265DB2CD9D6 +:10625000272E50827D80717F1E272253ECE45456F6 +:106260001EE82794E9FC8D887C7103386195E096DF +:106270004FDCB03A6146FEABE0C8D31EDC475FB7E7 +:106280009D85323B66E6416F542ABA95F01F06376A +:10629000F2DBF5A19E7B9E4898DC4C26DA3635C2AF +:1062A0000DF7C127422EA19C05476183143C77114D +:1062B000A19B90EA8631D9590EA4F077EC1E0861B3 +:1062C0006E46FFD2E1217DF3D96CB03152152E9785 +:1062D0002761A92EA1496BC9C2E463CD1541A6402F +:1062E0001BE815A0A8D78027F3F29510EDAB9BD53E +:1062F000612EDE853A75E6E3949BEB7284EF946839 +:10630000723BF64F305042CD3A59A1FA9225A6A6DB +:10631000398ACFB85A54FE65507EA8082092125987 +:10632000C4C5AAA894292FFACAF172824562130D36 +:106330000CA2642439E3D9E15E7D1E765A7E09DB26 +:10634000C32F90D39FD5B009CBA10BD605511570A3 +:10635000DD3DEC122F89539F88236C660AA3078DBD +:10636000F7E473ECC13655D3A6142CC523471EDDC4 +:10637000CCD94659DAD91DED76C8FB489DD4263FC5 +:106380008D7C161618A1F2A2F50E26D88234261599 +:106390000B71675A1EE9D8F2C3E53F6AC44E27B6AF +:1063A000BE1CB3169A2C1B7A1E735D96E6D0345E23 +:1063B00080467CD4ADED08A45D738C68C504BCEC4C +:1063C000767D52083169386E7A470E995FEE5AD25F +:1063D00092626040C750A97E5A0260736B33E2310B +:1063E0006B3A4871CD0CADE9231D7B71938FC1CF02 +:1063F0003BE221D238F9EDECBBF88AC4050B173F1C +:1064000050433A899427FBA9391A133166AA974F4A +:10641000C01C75DE44DE744435EDE8B24D27070E2E +:106420009F48076A160EB18319DD960DD18B17DCD4 +:10643000CA69266DD6186B67983E04CB49EEFC2BD3 +:106440006ACB1225864A236FAA8843F049F9F6429F +:10645000C79B54BFB23B970EE40F171348592398BC +:10646000747E5A57A71F554E3D4CB17BD82CB7C9E7 +:106470001ACC6EDEB9BE6365E4E9DB0711B8C30E62 +:106480004995BD81B29C298D9213BC814353C7AD00 +:10649000DE5CDB8FF79742CD897196254142D20FA2 +:1064A000AAC24879F42093B5AF5E59798B5C432337 +:1064B000225DCD878CCC44F7EA774845264552E6E5 +:1064C000CE036931B355521F56F2E63B528D042973 +:1064D0005101E93D9B299DEE0C2CD759960E5CD9B4 +:1064E0005DE94476B1FD779CF78E3E9D8A6B13BAC9 +:1064F000EDB41DB721854BB26E2C0A67D26B74BE0A +:10650000CD2594F7E45881364310CBF699B38F59D3 +:10651000B15BC046D23CBD8C45A42D8F451753F9C5 +:1065200031F0E7FA687D398AFF38703BE143978C98 +:106530005A441DCBE5A53D1501908969D2B2A760EB +:1065400047F88EA271C29CC082EA886AE24FFA8A3A +:1065500014E5B155F9858FA66051DBACD2F3E1FDAE +:10656000A69AB86F7D39475279BAA141182A1F5EA1 +:10657000FB33E1D1580693D8DD808A9E58C3FF953E +:10658000545FDAE76530338395B5240D9A2E1112E6 +:10659000B4EEF8DBFFBE9ECDEB0CC4C9A6AF8BD129 +:1065A000C8AA3FD901A04399103656DD2CDD5FA85B +:1065B00072D4709C4D3DE6C7BED2932872D8F3C901 +:1065C000F9D3709CAB494935EDD6E8B7DD92E1DBF4 +:1065D0002530502D9C72B4C2D156C8AB8A5F3304AB +:1065E00021027AFFFCE74DFF364CC7F062D942F03A +:1065F0003A382FB364C25D7064C48CBCBE88039605 +:106600007FC47B736BCCB648C18777C425A0C358C1 +:10661000C53CD133D138DD125485D4EE9B0A08CE67 +:106620007D1DF7912B0CB083026F6AD43C4F19D2B9 +:10663000D2694E1DF11C2911A2F953B1280CCCF0DE +:10664000CCECB9E691E48246DB710EAD72B9D1CBE8 +:10665000BF88A30881714DFAA2B40C8B9BA728D0E8 +:106660004188FA60B4AC8CB73BEA4F3298289CEE74 +:106670009C94C4C1B9E22DBD595D0D360D53D4545F +:106680006DD8BA5DFD69A535982BFFBD5297195499 +:10669000B90AE089E218CE4A7918886C7E288FE220 +:1066A00007FB209BBEE18A5A03435FCD67D321B32A +:1066B0009FA04306FE0B343C372C31307DDAF51BAE +:1066C00046F8A63DF2A2A57E909276E1254313FB03 +:1066D000A3673B36778846C73EAAFA260A785E72D9 +:1066E0000759C3FF0544D47D4F935673EE65F2C539 +:1066F0007D1AB063C4AEEF69DAA7D21173B8F47132 +:10670000D5A0AE73C02D632A3892F6B1BF15BE284E +:10671000ED5BD66B0F44F6CEED759338179B477A39 +:1067200080ED83878044E9EA954B9F478E1645BFED +:10673000E5537017746B67592FAAEAC53231847616 +:1067400035C36677F52EBA0126C088BFEFF5EBCBCF +:10675000CD30591580254D4F5B647D8A92FCB3077F +:106760007C91ED455A687F22506A4397F1EF2B18D0 +:10677000402446272B18551B699F9411697D0DE015 +:10678000E5943069174CCACC16F42244AA6F52BE65 +:106790000503B619A49164E09CAF8EBCC6BBD83982 +:1067A0001188A5B2E6E6CF21AE63A890438051B828 +:1067B00057F74ADEE7D011E9D51597C0620090A4DB +:1067C000005C2849874619F29A1439D10FFC6EE310 +:1067D000B1A9658C828A797E6C40A25C6FD925E66E +:1067E000FD89408815D5B974C01051599B6C9BF632 +:1067F000B00CEC0A183DB07B4BB63D8E71FC585581 +:1068000044B4256B88126FF31B10D153B1B00F4DF8 +:10681000BDDDFDE5D6D9A05EB185815631B29D0EB4 +:10682000CEC42860F449625750B64E28B0227A5D33 +:106830008A32BE4E7D93DB9ADDD3FCFD57201115C5 +:10684000BCEF0807F16F6A0064A421C8BDC7CA295C +:106850008492CABECBD506722061AED4C257430D16 +:10686000F9CAC5FB9312C8C42AFF3DF703A9847F68 +:10687000EF9E05E12F72B4B7EC14A5370673B2751D +:106880004F5041EF23FCE1FD08FA505849F494F8C9 +:10689000C5DAE3652D0464669C5D7F62B629799B49 +:1068A00057A34115712D5AB183D45A5C51091DB8B3 +:1068B00056C2B98E01D5702F2C5D611809E67DF89E +:1068C0002502FE9F15008293B6E2A10F13FF183731 +:1068D0006CF6B456DFA06D9C02B680674486629861 +:1068E000986C2D544C58539F665B4801A532892102 +:1068F0003B106813F8716C0169608C56E0F8EB0B83 +:10690000058F80CF60AEED6634EE8DC537D9E8CB0C +:10691000DED9958C052A4403D0CD81213EA3A5FA6A +:1069200021EA2E07BD69E555EBCC0905AA50F241D5 +:10693000BAFA54DA9AA9CBB241E50E116D8E01076D +:10694000D5B22A1CB12D1DF5B9A82C25173AE7930D +:10695000C569D87287238829760AC2B3309A36B9B6 +:10696000205E240609FAC191CD849732CD6A5C7607 +:106970009C4CAD64AFDD377F7168BADD21C900037F +:106980008C1AEE6B0AEAAFE5C2B4C516764D6FCF2E +:106990003ABAAD269C6E98E1BF4F1F9AEA8196E7FE +:1069A00049D935C2C8F324C94CE482D9096DC580E0 +:1069B000EA2B12FE2A96A68693344F7292D08B6BE6 +:1069C0000E59E93ABF0FE4A776ACF227E46CC83C55 +:1069D00029E120336F9D75B906FB8DA3A9300D0DFC +:1069E0002D24258356BD30B2F46AD263564D857985 +:1069F000C92666EEB08D7C5AF13ADE7D20309DAF1F +:106A0000763C7D30D2667A9DB48F8296FDE8B4865E +:106A100046DAE4B1F312155C8B6F938DFF64AD1C05 +:106A200076095005B273E762F8BABF007DB7C3DDDF +:106A3000D481B8B447DE3A87EFA3891EF31C3D43E7 +:106A40003E9E81CD3A9180AEA1562C0C81B0E1D70B +:106A500039428A02AAC94574EFCE1CE2635C809871 +:106A60006D03C51C12981F28EF64D51AA52CAEC261 +:106A7000CA666FD28CB8CDBFC1AB871CEA1AC59A63 +:106A800027354D01E6A3C3E3F3465B08D480216DAF +:106A90009DC849E80E6DB4F27397141D5D3ED65142 +:106AA0003AAA8891F0611AAE19F3D8C90E7619F88E +:106AB000A884A2BE538CA1EF9AE03986BBB5BBBABD +:106AC000FE02CC7F99E4D6782E3C0DA2F1362A5EE8 +:106AD0009548349A6F0085F1DC45AE49479D745C5A +:106AE000131E6F78293282C7067DA6E7B92F962D2F +:106AF0008E2074A60C1BD356C8C0AEC7D8A490670E +:106B00008FB918342162284B7A4D016011B7490DB5 +:106B10002C6A077EDA986C4A897D29C562B97FA8FC +:106B2000DE55A19A3827F17457A963F55E07E3A0F3 +:106B30005086526E9703BD99C9666830F6988CF6F8 +:106B4000B183DDF38AC88C998E15E817FB71DCC020 +:106B50005EA2146DC41288E924A567FCE564740C78 +:106B6000911BEFC6668B4D8B74CCB4E0121D64A7ED +:106B700086368A7F7FCDC5F197CC1CA6B2470F7CA5 +:106B800044FE3FC7B5810C179FB292D4F70928A4E1 +:106B9000E3453EBFA57CAD39FCD50A7557A15C0A1B +:106BA0001E460321C3B09848D6AC242EEA59B1FE44 +:106BB000579483E91ED5B77F93D685CCC3F5C66AB3 +:106BC000ADF3646699F41933A014C10DC230A2600C +:106BD0006DBEE0249B32BBF8139FE22F6CF9855405 +:106BE000232CF91D682164B0CF57857857AC051860 +:106BF000DFB1C490C99E6E6718BA36BA5DCF29FD61 +:106C0000028B80009119D3F6AF221C459D31884735 +:106C10008F552904720383E2E36A17700D5C252403 +:106C200003281E35B8ED386B8DE003D30ACCE2871C +:106C3000491AEA404DC0D68A0DCB3BCDA472E60975 +:106C4000A552BCA0CD4D242599B40286AC40964FE8 +:106C5000825912E5C3F75E6273B2705A3B60301519 +:106C60007B144E52D5C042529133F67E8C68D0C60A +:106C70007482991A21147F07FD8E2C6F75CA70B328 +:106C8000068CEA6EF7B658250010E18BD04CF2FC6A +:106C90005931D089786022FCD2D869ACBFEB894BDE +:106CA00059CCBE2E6D535629CB8DB08DD1A316ED88 +:106CB000369A0FCE650226F7F89D298927EFDF184F +:106CC000A6B9045CA5D048A5FF379C94BB4A86634F +:106CD000FD7217E1F6C9DF139C9A9ABF22CC3E578A +:106CE000ACB9DD95F232E501C0EDBA9D1DE4C06F8F +:106CF0003984627F38BEBBE4709681040C7F29061C +:106D00009848223DB8A8B0EABBE64C1F066B541069 +:106D100082548E778137BA918F9200F58B82384EEC +:106D20004FE8D95496F9C727E7DF175FE9FA22B78A +:106D300045D1D1D5C32B650CFC040EE9923A29F557 +:106D400034C7944FA2E732B74D02F7E06D0E044B03 +:106D5000167970E7522ABBAB5F9A98D79F0397B218 +:106D6000E81B81FB4FAF6E32F18E1A65D174BB8781 +:106D7000833B49BA7E1AC86BD6BFF68B29AFEFCBDF +:106D8000AF7761C9165724CFB30152483D9B8D940C +:106D9000C88E066193F646136829737F0F4C958061 +:106DA00072EE8B121F7DE1BB1635B2266B47E8A64B +:106DB0009D1AE45A85C25DFD95BF1F8996FC723508 +:106DC0002B3F529381AF5676CD33B3B211B3C98105 +:106DD0006FB7F4476255B430655DBB5DE345D3F8EA +:106DE000086184ED7968F8084503AFBC9C60E681D2 +:106DF0007AA93480AF74F6838267D0BE46960DDDE3 +:106E0000099A8A00251BB66CE9B22B38633A546A9A +:106E10002791D8D9A057082C0ABD13409B17ABEF78 +:106E20006053D8E662E831D579E3350447DE860958 +:106E300033097903BE4C3FE24FB56946BD1184EB7F +:106E4000A0CD604998B80DAFF167714D56B2DB43E4 +:106E5000CC8A1713D1BAD1A920EC129D06E73C4D7C +:106E60001043D442B4FC5AD213668E657FC00957D2 +:106E700087548B24CDFB1665E974607DD014AEC5B4 +:106E8000D377752B8D2D40F8B6215CDF9955FF7FA8 +:106E900020F0850ACC96E94E4BB3AB52B3FFFE3CD3 +:106EA0003D6F8108FD14A1F1375BF1D2017809BA79 +:106EB0002B3354D57B1C0667C3421D94FE115C9690 +:106EC00043FF063CE33AAF18CFD09F8C6BD67210CD +:106ED000256C423877F08981D8E33E8FD698A85B3D +:106EE000D09A9F469CBAF31CE5E0D38BCD11E318F2 +:106EF0005F0D08C2C4214918285C4B9B3009C7B7F5 +:106F0000488658967DB75CE0AB50ACA2869CED57A6 +:106F1000F1A67298CF191D0A1358A9F027E9894ADA +:106F2000C2562098EB3418733900F3A990234B090B +:106F300097798306474756DA076298AF435D274F34 +:106F4000DC74D31F2E76B6EB84D961C71D03480EBF +:106F5000CCE71C90D53119060054FB8B25BA9EA9AD +:106F60000213E59FB193F31ADEB345D7CC4A15CA95 +:106F700024F6BCD3BC903A99C975E5B75DC580824B +:106F80000F6CA5DB935362CC5615AB92081E537E53 +:106F900048D94C82719AF95BB61D544D4DF847D4CF +:106FA000FF0064F4E722DDA491907AE9122FFBF947 +:106FB000693DEE2A3F97151809C0BC35437655AE9A +:106FC000A2F365F39CE636F2E5BB1B64883BDC2349 +:106FD000E13916A4DF91F95D7621880216F4A34009 +:106FE00062F29ED6D2AC7372D1A92E6114C1045F35 +:106FF000B18D4A366BEDDFADC9D289B884490D59E0 +:10700000CDE90A2DAE70F8AB5B335C644194C19757 +:107010002A3C40E850FE88E15B8DE7EB5DFAEE2507 +:107020005A6468867D15D111F757E976486CD021EE +:1070300004F872AFDB7463C7CFEFF1363334F6D99F +:1070400099F316909C694FF5EC0A23292F8D1B2D7F +:10705000F7DA3F40C19DFCD3756974F8862A654D07 +:10706000AA693D7B90FD9BCEA9FCFF6DA22A74FB13 +:10707000CBA969337B370BF6C5EBE2C1AF07E86DEF +:10708000BDC19ED162266EB5AFE95EDA66A49BE90A +:10709000084D2B4BDC74A22E8F54F268219AC6F750 +:1070A000617E196A634895F7E9348BE0E7832E40E7 +:1070B0009534911ECB32564A3EECC0A3FC46E10704 +:1070C0002F464DFE3421A1BC9E8A9ACB25938C90ED +:1070D000E8598E0A89DF0C5804E46159131376913C +:1070E000757D124E58C8CC44DEAE0A658B324F71A6 +:1070F0001B2DA6A5E24DD4F480AD09C6279C4750B0 +:10710000BF9382F25D1B3A09DD584A58195888C16D +:10711000D66FF1E53F67391FD722D6125546DA6C94 +:107120003BEAA6F9D984BDCABD98D97408FE1E628F +:107130000C7644CB7638545A00D7A3EA1810F59F42 +:10714000D43A5E73577149971D98709C2955B25A6D +:10715000C0003C8F2E96F488710A5BAACE8A39470C +:10716000C8BD65E1EFA2B58530608683DD80A83EAD +:1071700026DF27B7E5A8F534D6CAFDCC52955314BF +:107180004EAB1A2B50E6093FDD8DD5A44D6817ADE7 +:10719000D8A827C6417BC7296B512848805DD48970 +:1071A000F1F21F7ABEF371DBAF38CBE834C0E8AE42 +:1071B000FF7567C6E660A2C4E8E75795DF168AC880 +:1071C0004A80788AB62BBB5A5ABEBB3BB0D8A85768 +:1071D00033D7CC3D9F96DA8C2B178D2D272C250C81 +:1071E0006DB4F8D9B30CE09DEDCBDE8498A21A3FC4 +:1071F00055C8AA928553553D578C50651077289FE6 +:1072000091FC18F02429BB60F2D5C524CE2C3FDBBD +:107210000C493692D75248309EE79CFF0E8AD5B271 +:1072200018362D1DC315854A8F884A05EF6A849D3F +:10723000291028CBA28F9BAD6AC014F0EF691DA660 +:107240004860F8E97FC38DFAC16A36DBADE4C8084F +:107250009676FCEBD8E87FE7D0A251153595B7516B +:10726000FECFE975DFE25781F2D5B0ABDD953B3952 +:107270005F42AE235C7261A1D55403347339CF836E +:10728000B0592FDF23A849F3650CA8D2C746614245 +:1072900019BD7A20796C684C764B573D1F109031A0 +:1072A00031B8F8789DADF8FA05290E094E45DAFA9D +:1072B000D621E05C124C62AA977ADD2A445339A1A8 +:1072C000062427AA5F73430A55A9E3D2067DF2F983 +:1072D000F4955D711514D44D6B52CFFD1989C7E13A +:1072E000B26E9FD2D93FE119CAEB7C05569374B0B8 +:1072F000A6246A204BB990F117136479DFD75DC6D5 +:10730000FA9F254941505387819CA3059366348F8A +:10731000AE9D4B3BCFEFC1B4D32F6CBA6060962EBD +:1073200086B67BCDAD12638C97AB3A35BCBC3B5C6B +:107330006B869B002BEFCEA76EAB87783879E1BBCD +:1073400007891BDF77F9F9F3AFAE09BB39152915AA +:10735000909B4DE8079C0566EE9F407B4C6BBB8481 +:107360002BA708A06010A1923C682F7FB7B8B0414E +:10737000359093496BF49781B592FC1B46BAFAD9C4 +:1073800034C969B4577A5CB446B8F8D3DF9B89AA8C +:10739000B2BFAF4C94E11290F584BD25C124110F0A +:1073A0004D23EA96FBE8764E5EECB507DD273A5DA5 +:1073B000DE6B9719AF59F7AFEA83382350A5445ACB +:1073C000B02E047EFD22894678A0EAA320E6DA6288 +:1073D0009CCB89EA42C840E3BA8C4C70FA7D5B14BE +:1073E000DDC163B072B1A1ABA10C3835777BBB5462 +:1073F000D5A38D5FF4373FCDE58D1CB6C438680F3B +:10740000E6116D13B207841C68D523DF0E1F2552C9 +:107410001355C7270E79D7A15CC9056CD9BC5D2966 +:10742000052FEDA1DC85B2712F5EEBA59826FE3A03 +:10743000B2ABCC5FDC83A686FD9F2DCDA502E8AC68 +:10744000A76223B9CD85E5C47F2E70ECCB96E04BC7 +:10745000E194CC12555D44B17AD71FEEFBE08EFF6C +:1074600033FB93DD209E8B505BAD4B29B91E44113D +:107470008D0FBBCB83001131B22EE44555DDF403F3 +:10748000F9C8F1E63E31860D4DE2B0914E44F83038 +:10749000BB5E61B4D0F910006FB59B7A72F7F9A0AA +:1074A000DE970BC555B8DC911568C3A23024781B54 +:1074B0002C8CFC6ABA3930BFF606545AF34C4A7326 +:1074C000075D7CD7CF3551CC3100B859A37337AAAB +:1074D0007B89FA75D4889862C55C313DB7E95ECF87 +:1074E0004A07243390D30B4B9B63A7491D8A34ABC7 +:1074F00063BA3CF31DB895DBDD9F0534452CF0E500 +:10750000A20878F13B89B3653EF2047698BCBF4D82 +:10751000C692ACA8BB08F0CA8BF949E65A47BA4EE6 +:10752000ED0E33A1699C98829530D367506F403837 +:10753000D3F3D945E48C7AF89B2C217DDF945E99B6 +:107540003634C630B765E22E0921B9E361CAE63E9A +:10755000C0B031B3A7E437BA6FF188AF0D6D99377A +:107560003A8448DC2B44FD78240B04629F9374BE5C +:10757000EAC085A143BD6914FD1D8BA28336098A2B +:10758000486F7A5C0C54089658898B0039D2C7B47E +:107590007887CCE1ADACD68D0D7851C0C8DD2A28F6 +:1075A000F0286FA0AD6F8F90A8C13FD73B8CEE3F06 +:1075B00099BC1F796F188C2A8E69214ECA38F8DF62 +:1075C0008AB510E0BE9B3B007EBB8EEDD296156B5C +:1075D0004190FDA28EAC33850D89BB41ECACFA0124 +:1075E000F5A6A6BBA6CAEE65E24EE32E139A097E67 +:1075F0006817B57FBAB08E2A2A2FAF3708AF444C30 +:1076000016D5F234D197F14402FE6F2CD9F4F4CDA3 +:107610001B472514122DE1BA22B36B04C7E41E7375 +:1076200045E17E8DB5822FE65BD2985FC22B53D7A2 +:107630008B18D54D58ADEC9455EE580999A417D632 +:10764000A5ADAB43130D052C1C1B6C0892FA2887C3 +:10765000FDD5C92C0421442AAAB5C438D2547B9440 +:10766000E2C99B7F1CD1150CF4F5102356171E4759 +:10767000E8AB2CDA73AD250AE209DC4F3E857BCD01 +:10768000B7B3F24F2B7CDE3118A217AE9C0A1A4812 +:1076900023139E158FD2913B8E462A259180E613A7 +:1076A0004705B4C70B16A37F41C4F3EE033DBF2AC1 +:1076B0002B34CFCF014E0278A3D926E634ED37C65E +:1076C0006A811292B44E9B0A04F8C44C643A81C495 +:1076D00041F08C3E7D3089CCFD597F00A227DB8AAA +:1076E000C4D550445E8BA3876FB55F01D0D2C4561A +:1076F0001FCAE386636874DF4E4146FCC589BEA09D +:10770000494C37F65176809FD14765C09077AC6A77 +:10771000FD43EFCE94A41D4AF11FAE0A13881C0B43 +:10772000467B3015252D48BABE4DF7D9E639DCF831 +:107730003CD6B7C2082A160004D450A074A8357DE0 +:10774000303BA55919C6ACD6AC077B57EAFA37D5FA +:10775000E19BB08A3776C0BD98738BCA8A67E4A86C +:107760008B4B4AB2FC737384F872D79ACA46C9B578 +:1077700065B09C43F86419AF2A3A7531C95E32B6D8 +:10778000B11BE6695D2A76AC6078BC6E73EF8B2323 +:1077900069681AE9A7E0D4914E86221A1CF2249B4C +:1077A000E76278CCC15E3BD44002C6CD2CE975DAE5 +:1077B000C4EE401C039695F3DF9B34705C30086D7B +:1077C000DD8477708F3637D86C961714F2ADED4E96 +:1077D000C7A09F15783C46F101022147DC845FFF7A +:1077E000D6379E87C0D91372EA8D896E78F4FEBCB5 +:1077F0008DC1C549DC9835C620567927BA9983D9F9 +:107800003A74A7B52A7AC1293118FBCE6BD7A538AF +:1078100073D0D3FAA235365759650A7318885FDEDC +:1078200073741F495A92F9C6E8D8584BD4E982AF0D +:10783000B8DDB116C96CABDC477F72C9C89AAD041C +:107840001BF8FB1365720354FDECE39B704FC0AC57 +:10785000EE91311062D02744770FCDF970D1C4F387 +:107860009D1FA4E8D7D787A0A81A84A24B71D5EC96 +:1078700048781BF12738A9DF534AC14F79BC90469D +:107880009FF3853D88B554BDD39064E8AD3F7CE05F +:1078900009AB2592B17EADAB89DB0F32CA71DC102A +:1078A000F916E16F4053378578C0DF8022AE91E74B +:1078B0005598B718467DCA3A2D5736195C2AC651D5 +:1078C0007C0E06F0074A4DF2781C9A4F11D1A4485D +:1078D000D77ED28EE33376F51E6203FB2CF2580777 +:1078E00059F443718D62C5E4B20C79E9C4158DFE7B +:1078F000126D88055C76D44B944F80C7EB6AA29FCB +:107900006E222724D21C0E9ECEB91BD6920409D912 +:10791000D67B43D156C86CA6AF70878F3AF82A7DC4 +:1079200006904C5906609E550CFD5A727DCE59C981 +:1079300000DBA23D145DA250E646C1358F57ECFF37 +:107940005375E419637CD38C22EC56507126E1A167 +:10795000126F27CFDB7C563BAB9BD74432958567B4 +:10796000DEB0C16C93D30A50DBCC19F7F791A44A6F +:10797000AD2083333D75E0745CB56075285DD2AC95 +:107980007D1A3FABDE58381896BBBF0F15BC420BB3 +:10799000305DAB45C25AB98CD19B6B958D84D47246 +:1079A00048575F6D03B0D7CCC12A88F13423357FA7 +:1079B000EF3F8908A56A5D9DEB47900CAFAEB91CFF +:1079C0002B428027F1EFCD35C154F979370184ADD1 +:1079D0005DEA2691E1C3F14C974F748AF93C2BFA8A +:1079E000C9DBCB1A4399609E2E85A3DD752A1375DA +:1079F000A21DC6F954A72611F7F4AFD365E91F13EA +:107A00006F9D7EF5682BE79A11887A2CF9E3043490 +:107A10004B2634A0F4ECE0793634F5197C62DF466D +:107A20000FF05750CDB12FDE0061D3B4871BDA962B +:107A3000342E55E8019F442CD9A06F1F6010D7DF6A +:107A4000A6B6B73AA71136E7BFB7F87B8357DB3046 +:107A500037A9ED8E058BDF2112CC6227D3F281A9E5 +:107A6000D72B619D3F0BDFBAC5549F1451E932E417 +:107A70006FD362160C7ECBEADD8F30159484CD5126 +:107A800055120991999151D0FA5B74805E2C492767 +:107A900044D4B8C1045137DB8D096A220C859A544D +:107AA0005194C3E2F6890D7FA93F27738C23BE80D2 +:107AB0002D0C22125DF3051AFACB2B598B73F94763 +:107AC000A915372E0EEC696726F0EF8C874C55AA66 +:107AD0008FA4DE38823C6233C2A293787CCF67EFFA +:107AE0005B07F6CD5AE0CF0F459CB65F1B3EE0A882 +:107AF000F21B1853D6D6B11379F30D9CC87580C309 +:107B0000F786C8CCE015B27C8F7AF302D57EB162DD +:107B1000CCBECF141359018D723EBAAB9122AA6428 +:107B2000ABE9461D54E4A7D9D8E44CF03F87BE0D1D +:107B3000343AF39D514ADF89310C90D31A7128A849 +:107B4000C84EFE8BAB27A7ACFFAFA081430D05C687 +:107B5000902147F3BCCAFCC984988D9CCC9E6B4E87 +:107B600079C60009F11934DA44CACB63387D618CD7 +:107B700054BC5C0A552241177DF26CD51A9AF5B9AE +:107B8000A64E9D5AC26CD9BE33AB18905073644553 +:107B9000002A6FFF7D0130A647C94C3F41869123E3 +:107BA000834CD0CBF92E25550A62D7B4DC460D9410 +:107BB0005978BBD7FDBEA63A14998A4A9662B9D7BE +:107BC00004A2CF5F2A510A7BEDCD301C7B9BA22201 +:107BD000E954BEB84E290FD4D7A5D509FF3862C9DC +:107BE0009FBC9E726A732E2C31E3141E42E1D12E8B +:107BF000840915C740E39040BFC115FBD630068D00 +:107C000014D9A93C6FD54A9142AAE2072D4FF62A12 +:107C1000FD47050FD9775E781606F7C604E587920B +:107C2000DA7A5D1EB51112C92176F81050A01969D3 +:107C3000007EC2E8CF87FAA24006AEC26A5781C171 +:107C4000DC9A2313FD72E3B30BC69977D826D2EDE5 +:107C5000A19CD03EBFD78AB4D2B07776D0DB213892 +:107C6000BEBA94E384D7D56B1708BE4B9762FC92DB +:107C700084081280BFA44D1FCF7D82DD6BE83D15C7 +:107C8000679676BE9D807E57DFA36CCCFBCFB6BFD8 +:107C9000EBE472700E6AA6AA4F7D626D63740FEDFD +:107CA0005C0537E76E88C5B77B79E7A3447D7BF831 +:107CB0008648241DB422E3C4C3FFE61EE6C5BEFC0D +:107CC000EE846C74657235FE132F1ECA3F7C31D46E +:107CD00070903774ED6B9BF4527B7122502A453FB4 +:107CE000CFBFEA09E75DB4268B23FA27824C16C47E +:107CF0007135BFD190874E64FFD5C3F1E40AF423F8 +:107D00001228553A675F5B6287C2D45CD6D74F12A0 +:107D1000FC6090F2A19B08EFA035602F289175427E +:107D2000257D8A7CB352D390A24444D661C5F98E96 +:107D3000ED3CD1E1C2D538F1F6F69A6A6F3434FDE4 +:107D40005F51ACB45B534361AFCA8CDB80AB24534F +:107D500084B263D69935BDBBBFC1DC456B93F7DAFE +:107D60008293E659367E55F2F9B58043654B823AE7 +:107D7000106738188774BBA38779537A8BB3B6869C +:107D80001E6E9EB9FE5246B2E708899F1099C981BE +:107D9000F80E7FDD21F74DD3D86D2CA9408244BC6D +:107DA0008C44D4D1EA6A36E570CF33F3D3F65C8ADB +:107DB00061C1A2CE85A4B616A6491A329A78DB1FF5 +:107DC000E87876F9C8C672FED08654F4DFD9D1318E +:107DD000549F6630EC4E3FB1AD11B84F9B69D5A0B2 +:107DE0001B591402B644B64C978B0B4CDCF6CD589D +:107DF000B68931656E804A09A5231B35E3E3D03E81 +:107E00006EBADA1AD024FD966ACDAA8F3AB4DC99FC +:107E100060F838F3A660499C7DB536575CDB0E846C +:107E20006A805933AC45C7446E953635238CC98A70 +:107E3000A9C7497CC5E4E3EAA0E09F6C9124A05463 +:107E400014EB2EA122F7A1DF5C40883CF92E6F5D78 +:107E5000D0082120E30CB9A2933123B9BE11E96AFD +:107E60005E549CF1CE2F68564B760B42F27CBC3EA2 +:107E7000282BD5F2803AF8E78579D529A992D573D0 +:107E8000141EFAB8C50B2B4B1E1A4CB6FDA40C11D0 +:107E9000D3A0083CD5C7A9C6C757ACDB4198DE1BA9 +:107EA00074D03946521FCE4FE444B2FCD27E549275 +:107EB000767CBE4CE932FED762162EF6C2D38E2FE8 +:107EC00075BE79C31533BBE79B626B8BB8954C4588 +:107ED00053AEF79DEAB795B09243863339B52FCAB2 +:107EE00025774BB803ED71AF6EE5ECA8415E2882B3 +:107EF0003DB59B2F1CFBBF70A412CF1EA80591EFB0 +:107F00001A0204831508DD52937316C7AD8D6CB742 +:107F10003848203F7F6F031BB1A8ECFCAB8F71C8C2 +:107F20006AACD83D7D9CA31CB8728030EAC76988D2 +:107F30007478FA96A4E2F9CC0158EF36C2B29347AE +:107F40009F18B1CAB5592E77ED69B649FFE268EBC3 +:107F5000CCBF8C60CEC1AE8B721A84157EEBBD098E +:107F600012D14A285E23192BAB7B904332F815516E +:107F70001B4E8E6D8710E7DF288E59CDDEC407D3E8 +:107F8000E0FFCC33515E1C41C25A5917B1E88C8DC9 +:107F9000202AC7A901E1DD6983A38CFAE30ECD4352 +:107FA000CACF4177CA1018AB1E4E9C209B1B829BE8 +:107FB000767367976A605E26927DCA2CE22B4B0926 +:107FC0005E7A1246909D4E92AC1089B78B4B69EB4E +:107FD000AF590F23A796414739FB191B5D2B936FB0 +:107FE0000F2F3CCE96106D8F16A6234920CD45C18C +:107FF0009D8EF1FDA262747E182F2522B000DFA1B4 +:10800000B2A54E9AED33F522D529FF17EEF7111DD3 +:10801000C49F32526AE41267F5F2CBB50CE6C62F64 +:10802000E851F43FAD804B8771440DF85CF457760E +:108030004C7D45AB4289432E75A704C3195B51CED5 +:10804000A4CA2A108FFEA71A9A5A3B5CB57DDE6936 +:1080500014B67C93AAC72B827223533EB7F251E821 +:10806000BA9B053B70AB1CD3393E7D94CE805D5DE1 +:108070000359720D468BEF356129CE253D2046D13F +:10808000F5FA5E0C0EBCE7F80FD75C121B91E9EC19 +:10809000990FEFE46085320D8FD2243CD53F89568D +:1080A000B0680B23FA01EED656600A2AC17EB407E7 +:1080B000F14C0F59ABAEC2B2DBF96EDD1A53DB32B5 +:1080C000F2906456B501119FCABFBAC5F718FAB647 +:1080D0009273DC2E9E988442EC9FFEEF165B7F0726 +:1080E00054664B0FB1947E443FCC46815EB8DD713F +:1080F0003B34F0B403FA172D932DC5F6FE1A8F64A6 +:10810000376C449438956A93478956259D602C3581 +:10811000156C950389A725F824D1C5B618A0074189 +:10812000121C7D028F6D731E2AACDCF7AB16BEC22B +:10813000614106C8F6659B886A3392D4FCC674C256 +:10814000B2379429DA4C9713184C562EA969DFE4FC +:108150009D141FD0CDBAC1AEF9DB0CA5E9B587D10E +:1081600096E84D48DF92B10C3C79288455E2A86E20 +:10817000C7AC3AFF1A79FC026A829BAC894A6C69E7 +:10818000C678CC9EF0987D3579141EF92BABC4B01F +:10819000BB42757AD859D973733C63BFC76A9F4293 +:1081A0005E1B349A1CB85557BDE829A33E5565E2BD +:1081B00059E28173AC0F2C99E1CA5E19931DBC542E +:1081C000755F9F1DB3B4EF6C5D71DA0B853FC6819F +:1081D000EEAF8C8D7311958B185A36D5D7C804180D +:1081E000D2B4BF7AF3B53554565DB7E17ED083265D +:1081F0002C9D7AD3C005CA98B74C10FC0D0C814D4C +:108200009B41099DD28E1442DF81BC9EC7BCC9BA76 +:10821000E8BE1525BA32CCE295450854E872120042 +:1082200063DD37E4CF6032AA9168E7A395DA1229BB +:10823000322E53CD06C023FA15B33B3E71D14567AC +:10824000685C62D64E725E36DC32E9B71FC1BAD9BD +:10825000E522B4CCE6A00FB20111E93E1B81F23158 +:108260007810D4BAD2C0577E448B070B14638703AF +:10827000BC299A8AB7CEE77A1019FCEFA6A44B6CFA +:108280005B17F228619BB7868D7F39F519EF6A98E5 +:10829000846D5710D2AB1A15853DF47ACD5841E85C +:1082A000E2CB292AB6480BFA976F4260309E5D6890 +:1082B0001E39B96EB4829AC400223EDD574093A89D +:1082C0005A0CC307E3E995BC6FF50A86C37498EBB3 +:1082D000C904823E42D980FBE589B9734988C32E1F +:1082E000F78E6B2A805A5D9BB99CB5D9B81E7E5615 +:1082F000A17DF09D7FD38E0ADF433B1FA53CB5AB2C +:1083000066B01AA3234C4FD906D335D62FF82825AB +:1083100007F7893A091511581DD7EF36E74A102D8E +:108320003216318B78FAAA01F6B28C81EE6AF154DA +:10833000A215C8DF8222E4B245695495ED4B2A1597 +:1083400009F8B182DE41074B5075B9D2FB12BCE986 +:10835000611E696EC61B5FAA4F7A4C5255B98DD308 +:10836000DE9B965EAB4F3F7761D87A4F7C04D2B4E8 +:10837000EA1547DB6F3EB6A4B05F0B0F3F93155570 +:108380006814AA9216C9A3E34C3A1CC2B778DB71F1 +:1083900065C7671A896691B534D45ECB08825231BD +:1083A00095D9BC5862962637CB6089298D17DB9802 +:1083B0006B66B1268A4907D84CC3B89BCC16074ECA +:1083C0008D32002FEB6C733B2890B668493755C14E +:1083D000DC3450BF261AAFCE8F3B7AE18F220BB030 +:1083E000206164998D1FBAE75F77DA5085E9286FBD +:1083F000CE8099586B446AA1066A5EA9473BDA5A57 +:10840000181746DC1A6DF59BE667D6C17D25DC0A98 +:108410008CDEEFE045AD9D23CB352C526655C00E6A +:108420003061C7F0E03DD54536D4D2DD5A79BA1572 +:108430005D03E6C7B4AABAF93C0488276D2001435E +:10844000407F7823F3504219A5E68B2CAAE9A48833 +:10845000A31585FCE61DA1A1DE41F4AFAD99673EF1 +:10846000346A87FE10D66997157700D48350333865 +:10847000F7FA316ED5243071C02EC5A5B1B2715E48 +:1084800012941D10466A1FDB7C9B442111E29C3232 +:1084900074215AA506B312206EAFA545FEDDE7E5AF +:1084A00091D39D12F30A81720972BD8EAE08D35525 +:1084B000F3CD5F35FF4B0987D3F69A041D929837A9 +:1084C000EE7A3CEF985409424B69E5E782B8F2AD89 +:1084D00044F61816B1BC0F00156E759BB093DE26DE +:1084E0001F25407AA216BB5F5412B6373DE67A5379 +:1084F0006069A65CC93C9FA1A73BA36C27FDCB1676 +:108500003BA0612807C733960A3B0E8671DEA21A8C +:10851000EE36DAF7E01DD2885A5DDABD56F0E04B50 +:1085200034493EC3404BE5FD697A4796DF84885E57 +:1085300071858D92C21F24D6E954B10106FAD35633 +:10854000134CD47A6C959F33549F6106DEDB4E8AC0 +:1085500083034B4B3D03FFB65B5481BFEC575A413D +:1085600018FFC8A37414E5D3CA1A3BB9EF1F1E8DB8 +:108570004497FEA4F9D97DC02BAA4223EB83B20E07 +:1085800017DAA4606474DDC20CF1528855A56A0F35 +:10859000E71C136AD6D99F781D22447AE7AEDA3BEE +:1085A00062CFA4F6139CA26EB0990DB25236EF9C26 +:1085B000FFEB78EA7997863E949BF6C8C8A6897641 +:1085C000CC4FD96D8F0798BE3D3748814372ACE4DC +:1085D000594A2456EEED0B2B3AFA058FBE6BD1D0DB +:1085E000A14A187C080C863B37D6A1EBC0F7F8925D +:1085F000AC8BB0B21FDD838B6C88C5A0AA91EAE278 +:10860000911B9B024180D980CAFC7E1E5A15A89AF4 +:10861000B171025B97F310053B9ADB38DEE67325F8 +:10862000F07051C11F98CAC5CEC5935F0B58DF5F6C +:10863000A9CE0E5749E933BEF52967D868DBEFAC00 +:10864000F93D51C72C16666D60AEB676A7D59BC7AF +:10865000548B2551F07E6728B247BB02E8BFC75B49 +:10866000E50120A145C9185E011CF26E9F3D92AC48 +:10867000A99B350C6CC3236D2EF717E3A4D75C3A86 +:10868000FED715A5A2479B2B5FE5DFF38E7EE1D9D0 +:1086900097F39F1D637934504FDC27D2DF4E3F9F05 +:1086A000E45F8A587A483F2464316C1BBA3EBFA706 +:1086B000688A14861DC302F0A74AF5CF44C7266B0B +:1086C0006045ECD565A95BB8DE495AB59B33115EB0 +:1086D000D55F90E735945DF6573D13E5C0C75B8ED7 +:1086E000182ECB47DD404C93FFF21285476EB887BA +:1086F0002E14984DC7BFB685D53832F473577CF029 +:108700000E421A6149086F41C1599A44C55F8117E9 +:1087100034E7F46520E96744BDDEE5FD150CA226CB +:10872000D5DBC817E6D15164F3067C9A571175E57D +:108730006BA3ACB4D915BB7F7A0A04D6E18180461D +:10874000D11A206DD7AFCE8E50A6EC806126B77DB2 +:1087500001AA1CB56E9C777B9B9D03A39F1AF9779A +:108760008A1DD35254B31B7E150342F39FDB373768 +:108770008FF86B4909230E34241552FE1654F9273D +:1087800024086572B0AB28370B1BDE54E3C1C84523 +:1087900029AE8B9CACB8E5765A46651B69B2309B16 +:1087A00092394AB15EE2DE8A4238E07F4369B9110C +:1087B000026491CD09C90ABC130374F9081F01872B +:1087C000267B3410F339CD5BFE0FF91095C958ACF8 +:1087D000C57FC2772D78FF7E8175BE49B22289D1CF +:1087E0009863625F2156BBB5939A24AE3664C0612C +:1087F000E57AEE09C384A40F91263B5B610F67A95C +:10880000B702151D492AD86D66547E33DDB8F36270 +:108810005A1C3BFAF5022B5C4C89D4DAFDFA34572A +:108820004B7677AF72C23F95881F280D56EB6B0BC6 +:10883000C45496B7158307C7D8B778FD81401B038A +:10884000C6C9F57486C7D19D369C976CA671475FE3 +:108850001BE33F97AB5211ACEFA7FF3DBDB20B4FEF +:108860001C969F389E08DE3920BC58A625F9FB4986 +:1088700066EBF1C0E922B56998B2B4FD5237C1E3A5 +:1088800044F42DFA967F96A2EA1C5BE190E95BEB3B +:10889000A750C6803497CE91C6AD0432515551D3FE +:1088A0001CEC77CAFD004AA64B8EFCD83349FBC6A8 +:1088B00060911837CA4D85BE1C3E606E0D8501194A +:1088C000128637A3DEAC0D72B8DA6356BBF2A33C56 +:1088D000464A246120F9D80B5B20B5B3B7E43611C2 +:1088E0005B33FB2848386EA873CAE5C7F5AD2E0088 +:1088F000D49076229BE1F589E1390233D2D3F2CCD0 +:1089000097928056E890FA7D428E86A7C8A7E80A1B +:108910009462B804A899652228CDF5335BEF293D10 +:10892000C38885A069B191EC42A685AC9F93EA6E9D +:1089300042B55CF830AA26730CE1CB7B0C7F57D88C +:1089400060B2901E2034A2B73B80A4CDE20179270B +:108950007120BE88585696B5CDB44DDB9FD44FE7F5 +:10896000733E5F81194B6CB4A80058433D22849F2D +:10897000044809FB0FEBA502B1AC3767A7E705BABE +:10898000DD53E939E1C9120B680EF63ECA6B6D6E14 +:108990001EB67653B4384C9C17605690057BACBC21 +:1089A0008C773A96776E74C3C2F814EECDC67D58B4 +:1089B000F88EDB43D924A008BA787F9CD0FC61FEF6 +:1089C000A2C453BDE9561AF904FBA95D8B3D8C1D69 +:1089D000AB2C4BC3204D28DDB18970BE76C595B355 +:1089E0004EF0C8F853EE854FC3530171A17523664D +:1089F000CD9CA72FCDB5CA102A935CE2B67E8977AD +:108A0000444B9C16B4C81BE6A092E6C502666CB740 +:108A100003F528DBC758E1318097F9C96A1FDA18D6 +:108A200025177A9174E4B6729BFD3A1028019502DD +:108A300054A27FAAC163C5C3784A9D8EC529DFAF02 +:108A4000568D88CB4A7A92E5BF5DF5BEC3D906380C +:108A5000BF71F35AA4ED6BE2576F115567D912F34A +:108A6000D744E81B300A45B787C36CF7F96AB3549B +:108A7000AFDF0F29FC6A725B505CBAB6F9DB308657 +:108A8000A43E439B5BCC5D55BBFD4BF9412EE441BD +:108A90007D8A489E3271C5C0A405658FC060089D5F +:108AA00006010248BD9DF710C41B4837023CF16D1A +:108AB0009FC1A875DF70DEF9E33BD8CF17C2C3F7BB +:108AC0003C7DABA29D918A33CB97CC025A8D1D83FE +:108AD000776780505D2CD61A4F453BB5F0ADB96D28 +:108AE000AF2B6A32A45D71D3D26BEC3F54A2FF79F5 +:108AF000172F4055BE69C1CDF0F3C198B11E147F48 +:108B0000CB8C534D17B8290E74CAD567F01610A335 +:108B100072C55E667D44113745F9ED1BE35CDB6B86 +:108B2000418E81A0DEADFAD0913F1C46ADADD55847 +:108B3000E0CC106BB612C0571F578400A05D8CD4D8 +:108B400098F486C2C1453DE583DB93A5BD82CD2562 +:108B500008CBE70D9E8056E9C9323AD90AEBB551E8 +:108B60005AED319AA0C89AEC2B8E397253D9CD4068 +:108B70004C7C02EB46C2B3778B392E24578B6E9711 +:108B8000E75279D21AA1C9CED81547EDAB77026466 +:108B9000F7DDB13D551A065005C99164F1F6024062 +:108BA00018260AF512081F1D4BEE9540B2DF813FD3 +:108BB0002870CD306445B0FEDDA5F60B4030145F63 +:108BC000E735070EE7F65C346E377BA74672735FB6 +:108BD000D6C8B74ECA21FBEEFA3AD00CAFE47B1CE4 +:108BE00042EDA0AE79804EED444E308DE3C022E1DF +:108BF00081A0EF6A7059336E4A45C3420F55A17A7E +:108C00004D3D376ACF1CFC821108C6414389C070B4 +:108C10008A14EEE02E33E8463AB6729829C8AF6B54 +:108C2000C2405A5FDD612D99E7B1809275D95BA88A +:108C30004C4FBB8B7609D7BCDFDD704B3D2D834C91 +:108C4000D8E6A9904CA60122A500C46A4318ABA798 +:108C5000AC89E289E89DCF1CB9F5809E2808C5E360 +:108C60009A9649D58518C5B4BBF68F43165C2C5728 +:108C70003BD2EC9DC854C5C68CA587BB7446C35374 +:108C80006370D3AE902C698FBFD1E5DDDC1D79BB5D +:108C900051B45C631DF3EC836EB71D82DF4E4B391C +:108CA0005B330A732E42F8CC476EE8F7EFA036012B +:108CB000C9267B74713D4D3AA40D82CCB39F94CCF0 +:108CC0003FD0255A9F8EC31A94C91E8BEF3341DAC9 +:108CD000F262DFA7EB4DB65B4EF4E8B7C0C4156295 +:108CE000C8C07C7A8530B3825B2DDB3D398B62B3A3 +:108CF0005D034D4B715641FB1F9F037961A104FC3D +:108D00004542B32D582B61A7AFD3BEC0E23B2FAD78 +:108D10000505EAC31576BC29D5A78185272EA14E66 +:108D2000EB5BE5F8F49648587E5F67E4FD7154B15B +:108D300000C445A6CFE95458E39EC83578AF70907B +:108D4000A3046BDD6EE513858817C1947D4E75878E +:108D5000C4A5896FCED071A1443A79A154ACD78211 +:108D600041C1DAE7BF763856201B47C28646EA3D46 +:108D7000408C418FE91F8D589B13601987CC313986 +:108D8000DD3E0791604DEC98794285D2A0342DE705 +:108D9000B9261B0000B412171157FBB4BD8CA63DB9 +:108DA0002EA16CE44050602CF4C56D9B299833567D +:108DB0003AD9A115F8F39FF64697C6F9E2492BDD9B +:108DC000CBF303378C46F041ACD80AC206A6C0CD1F +:108DD00018B35A9C006C8D71602C09258C4CBC75A5 +:108DE000916E305B422BE22A88B3006AB6D1246CC4 +:108DF000217061011DD30C14798170CB02DA2340FC +:108E0000EF758889553526D886B7D7F595067E91B2 +:108E1000E8DE0D46DB3567469A1283C7B469AA08B7 +:108E2000BC9EF6A8CC09DEF22F391321913952C32A +:108E3000C25A5B4B3E6EAAFD6C4A9B25641FDD84C3 +:108E4000A039EC65A061C07183BA3F8BC6BD0E34FA +:108E5000058964CC73C70E763BAB14529A662D3AE3 +:108E60006ABC8CA8E33E83C7AE06B1BB081D78BBC5 +:108E7000AF3219EB1D7041F588C4FB0D438C864A57 +:108E80005C7B81173AEAC848D808CF2CEE29061D2A +:108E90007CCC7110A37861C8DC2F654CA303E895E6 +:108EA0008AD5E8F220A2B39281B1F058758A327760 +:108EB000DD4BF8CD8446118D3FFD692DABBEE898A2 +:108EC000E056B2C9530D251AA47BA73092C1C846FB +:108ED0006410CE84B52D59991B414D037A2C53A2B1 +:108EE000304028ED7E25FF531F79E1D7E64792CC2D +:108EF00097C6FF73EBF22B198AC542AA7710BD1AE9 +:108F000026190BCD8058FBC93D845FB28F7FE6C325 +:108F1000E1AA16591EE6B3A61DC43DF393224A6189 +:108F2000688175FBA3BDABD66D44E90219774E137A +:108F3000CAC3FE5AA84BD155F29C543DF6FD690FA9 +:108F40005BBDC9240610BC50D4B2E1388776BA8F15 +:108F500010E9393DE3054A9CE3D3BD53700DE03F72 +:108F60009B129AC07042F46F758CB318FDC3FD223A +:108F700004452696DBF034420622B9D5DF4B269C09 +:108F800079FDE20CBDF28202DA95C395C8777EBE08 +:108F90001ECA8170A59AAF2E6EA32CE65215E2F080 +:108FA000B95C1DA3276919D824B912A5DE2F5DE588 +:108FB000FFD9388B9059167EECFF82B3E81AE797F9 +:108FC000BBFBBF2F5A665AD077B184CF4E32A31560 +:108FD0009F5C7D48CC907A7B91414D47D102E7B2AE +:108FE00068B092C512DD1456DAFE9402217CCD2BB6 +:108FF000364E4598C0818A548638BD54D0026D1CC7 +:10900000F78203FC04D6D2F6CD11A24D7C11006F7D +:10901000E1DBC7337F241FE18C8B42E2C1EA4BFCCA +:10902000C1A742F3EC87216ED9A3DF1606193EE2F1 +:10903000B91F46B62E1CD3329DFA8BB2DDBF22DAA1 +:10904000BBBC337349192D2D2C9C0DE114A2A167D3 +:10905000DE547AD2D2CB726D1F23249F0D4B224156 +:109060009F146339880386C3A418171AF46A87BE4D +:10907000C425023D5BC71784CF58E088E5721F9B6B +:10908000CEC00269020FAE2CC081504049D3A0501F +:109090008D1B607E453B9C09CF23702DA4F926765D +:1090A0009E0B5FECA4BC2F81647A6B8A13EE1CFBD1 +:1090B000756B75FC1E9A042E35A63B4CEBB28E9D4B +:1090C000EF2B321A4FECF413738F3E2ACE5831B97E +:1090D0009534F39CD48E62BD68A87B2518772066F2 +:1090E0001CC787D206AEBF3F9A94C9E03CEED57F3D +:1090F0009E794535F07D254CDC3F60697307B02DC6 +:10910000EA51EF2592789094CA5554381598F93D54 +:1091100018F9CBF44D079B6412053AD5F728923322 +:10912000F1B7732AE2F42F91BFC17567CA336F3567 +:109130005B5DCF2C0D8DB3FECB146BB59BAB82CAA0 +:1091400027DA15AD183F22048B51D1E3B3CB1C981D +:1091500093594929A25E0E7098A2E8A56EE6FF0910 +:10916000A18F52A0878DBEE2B840AD78E42C882F45 +:109170009184129821682F1D69A1A9DABF2EE88376 +:10918000C869665CB99F9B4DF8F43EF944742C0E97 +:109190000474D62E2C90C8CF0EE11F9193559AD10E +:1091A000627B986D0776CEDB4A1F1524B5A48A280A +:1091B0003FAEE6B286B0C4DB915F0E26C2167A449B +:1091C000DF9820DB87B4F2AAD2C553BC1D6CCBE379 +:1091D00097EFF9A0002C0AF91621F580E15258EE1C +:1091E000DDD6C83F41383560F7CAAFEF0EC6213D26 +:1091F000B06C4E6751C54C30F4BD64551AA2F403EF +:109200008D77BE4423FA441424D774E9702DD9D144 +:109210001CCF5EC8108F33A0B58CD91B8AA59010C7 +:10922000F59704EABD4C786934BE7B48411F9E1C0B +:10923000048581C1679B1FB7BB67E211D90DDEA30F +:10924000D75DA6192EF1058B6D0E1C88BC29D1485F +:109250006F437D654FCFE50E2230389C72F7335156 +:10926000EC6769364C04AE559DF2AEC0D903CE080A +:1092700062D457FF43A0EA002B998B454B35AF2DA5 +:10928000CEBA5C132510DEF5B1045BCB16F0EBDF34 +:1092900008EA83BBD2FFA9F60E3DB9ABCA42CFE7BD +:1092A000FEFF7C57537530465E84FB115086F4A94F +:1092B0005622667F45C8A8FE22F040ED1586816BD8 +:1092C000AFECB286E4EF9EFF1EE74E2BF80173145D +:1092D0003953D87BFB196FCBC0A4E1885DAB3D232C +:1092E00081374FECCF98163A105081749801D231E3 +:1092F000771A9FCBA490B6C49F752A741D84185CFE +:10930000D092CA5F1F161A11F6493688049FFFE8EB +:10931000071A1C689E806BC3363B7CE152273DE7F1 +:10932000343AE9F09D0BB014BB9DD7720C35ED5C5F +:1093300058DE9864FD1AA70D62D9883A42AA834F75 +:10934000F277AA6F48F3B63F979CA4746115E6F3D1 +:10935000E35CE11F1752AC80102390210FB6773DDC +:109360009162B36119481FEE27419854F785A7A968 +:109370007666B27BE5E1BF0C339A9F5820D6093957 +:10938000DC0F929615FD0D264AD2FFA9C90FD858B9 +:109390009FDF3F4F7A3011F7210141BE8A9B5F0763 +:1093A000424A054E06F38B7CF48320021B4070CBAF +:1093B000756699413BE7133F9E4399CF7D6F87CAFE +:1093C000B92CEA8050A7EF749F040E5329553C7BBB +:1093D000C676C097385135665CC022277DAB7DBB11 +:1093E000A102D77AC09627786581EFDE55888E3046 +:1093F0007637649DDF3002249B1BFB23B9A5D6E1A1 +:109400009B30D57A72AC1CBA584AB2A57F16AA33E3 +:1094100075FA279D7D6A8C289263853224419CCD04 +:109420009543742A2AE973FF2674947D46DE541608 +:10943000B2E279603267E8A00A5E434B805F9879B8 +:10944000B49BF7E68ADEECAAC4E592A7B5FD7EC21E +:109450002733B15374138B4CAD65E1A66F58CCAB79 +:10946000420167B1DD1843DDBFFA0DA8B93CB80170 +:10947000375FE170976FC50F6F03234373E7811A5E +:10948000EFD5B91622D14C6A8BC0B87C617670A337 +:10949000250CBB19612C8E13730CBF231039D4809B +:1094A000A03482E85F9529BA7EF19C003741EDA097 +:1094B00037070218D05B661C8167E8D22ECEF61BF8 +:1094C000035626B71DD329AF029ADCA821FCE0BBC6 +:1094D000C3D28D7B1718DE38926ED325773A89F781 +:1094E00018DDBCA8EA0048E0F99FE204CC30799D81 +:1094F000E8571059B782E2CA43497CF66725894983 +:10950000B5032171F37DAEA69ECDD51DFDD3207C84 +:10951000C54E43C7156F816AC4207630B3DC8A0418 +:10952000C7FDD6FF6B692DA4CEC615874FB857ABC4 +:109530009E5E7606B3A7CF0FC650090D65E1DB9F8F +:10954000E4D1B1C7BB3D3EBE834468418E635B5AE4 +:1095500050AB1ED7E66DCDF6696E65E90460946781 +:1095600099B31EBB180A0D1C1FBF9AD9040DAC2C51 +:10957000F6C8FF7E06FBDA912AF94C0A49F57F8E80 +:10958000FBE354FE9CB7BEA14B22178E6E3C6A9E35 +:10959000019C0F93E029AD48D06D0527C92D01240A +:1095A000CD5D9E7418025DD59523219C0E63BF96F8 +:1095B000E500C7A9AFD77B9CE9F45E7055127B1517 +:1095C000CE6AFCF3033E2E845DD0C1132A1545629A +:1095D000FA95AC2E801E8A57C34ACD0A311A84F9F7 +:1095E000DCE40C14922FC63FD4A1C44FB210539E9A +:1095F0000D28E3D8AA6E4891357D9F1E1006F852BB +:1096000034F79B367BADA2A1EBFB1B1D9E9B72D05A +:10961000F7EECF19B05B2C03F82E0971CE0525703B +:10962000F14FA39FC8D5BD066F2CE31EEDF717853C +:109630007C84650CD58BE38677D19E9BCBC1F18F63 +:10964000AFFF1BFE4CC9E9732B30381E05B3A84C85 +:10965000BD61B020B5EFF8EAFA3965D00408E6CE6E +:1096600063FB9552B7B75BD75EAEF0C0F52070E7ED +:10967000AA0087093B2AC5B1C633B5D864A45B3BB1 +:109680002A8782842F84ECD8E11440119557D51095 +:10969000BAB396248A6F8F5FB6DFF25FFC238B79B3 +:1096A00060A7E97BF266E9AF0F028B3A5B6A04F3CD +:1096B00032739131DA8249A584AA6F3EAABD018F27 +:1096C000F7C1EC4561CB00AF88F07D96842B2C016F +:1096D00056EB0C1945358F95480FFC7010B2086198 +:1096E00017E6D0D8D987A041D1D3E7C3232CD6E33E +:1096F00009DF3A760BC0CB8DDF5B1FE9A2188A3FEA +:1097000006391E05C72ACEFDBB19882C6249F4EB29 +:10971000D0DE98E47F59D345A222EDFC12717E98E9 +:10972000D28FA6C22A040A8150F39CB3B2D8BC7768 +:10973000C71C73EFCFA661EECD725228213E90C3B5 +:10974000D0E45B56FC060452AE281928C4B6110CAE +:109750009FABB7116E05455797A581ABC0FFA542DA +:10976000E80AF6EB89999112A30AF21B0F38BC4460 +:10977000B7EF0D1155DA142DB6F9967B8D763C7541 +:109780002EFD55261488D1E6E6AC932872071A629E +:109790005D1EC64E6174BD4F3A1FD5AEF80A3DB38B +:1097A00064FE480FF076BE6B4952DC6BB27DFA0B5B +:1097B00078FA40F34B64F2899E20E043F742D536B5 +:1097C0004CE9EDE259B7303B4C7B642C5F876F2F3F +:1097D000E80A4A4E08809FC1AFFEBCD2CA2A9E7FCB +:1097E0008912CA636264CDE2C71C39687074370499 +:1097F000B004A30C45A53CFEF711F067B47620B485 +:10980000A1823A40E6C4E1AB2C544EABFF0124DB0D +:10981000CC236446D64D71EFB783A725FA164C8347 +:10982000EEC42AB995956130A124B5E7EF9E3A7E42 +:10983000DFE5400A992A123E1DA3AD25F3488B01AE +:109840005AE8101F7A3EDAB8746BB0149E971CA6C3 +:10985000A01512438BB55B96F6ACC7689D69FBD328 +:1098600054184DF18C6C8E1CC44F3D9D98F3AC0B7D +:10987000FB6326F04B1225DC2D5FC9072B9E5BCCCA +:10988000565DE613A720E46D8373E598469A75DF6D +:10989000F584092D3AA3B7BA2E96C85DD36E7BD254 +:1098A000B42D254CFE6F0C210B27D65BF6D0516AE8 +:1098B0007AFE27622FD33874665D102E0A6E7C7E86 +:1098C000C6859A9EBC380A0A2C02E68633F1652CBE +:1098D00086B27237DED740F79F097AADB1B228D988 +:1098E000490603B2A126A711FC185FEDBB7E3D74AB +:1098F000B1C9106DD2A7058528E365076604708895 +:109900002DA7AE2443F41DCE19CF6E91C9689FB721 +:109910000B580735BD1DEB59607AA0DAC24B4B2EB0 +:10992000DE9B6B390ACB86CB4BF5B26AA6CBECA596 +:109930006C18E0D54190287E1E5B0996AB7873E8E1 +:10994000D981C7393E13083E34A47CD12D7E2668C8 +:10995000DEDCB2E6CACF52DE51339C7EED326C8C37 +:10996000CA37366B6C7C9689335F00F72BA6256E61 +:1099700066B20CBBF6DD52812F011A7F41820FD4F3 +:109980009C28651690C1A46853EF9BD4A20638A109 +:109990007A7E2505974B11161AE1965A8379F2972C +:1099A0002FAE31DE4536CE34A1BBA6119BD309972D +:1099B0005143F890F99E8F951ED640EF40253F57B2 +:1099C000AE1004F63B02FD3EB996ABDC50012279A5 +:1099D000175247E8984785869358451C348730AA24 +:1099E000FA204AB9719D58723D5986CA762E3D9B20 +:1099F000FAE331F7DA8E9F7361FAFF02C94480FB04 +:109A0000CD278E1B4EFAA2FCF010266E6BFA83DA7D +:109A1000101F59614EC5D7D32322F0FBB189C2F282 +:109A2000EEF056859F89C4FB889434AEFC8FDB46EC +:109A3000DADF48DC24C6513AB08C9FA14760CD22C2 +:109A4000A2721E660D0C0DF274D28D1F887FCEA8F7 +:109A5000F18667A73FAA6CD791F0218731797FCE35 +:109A60000FDCFB2F21E5872BFFD673DE99AB5CD390 +:109A700056178446E712239301B7A3E9642DA986FC +:109A80002FC1DBB872FAEAA9515095BC4A2C0F6677 +:109A9000D96E090A61901FE55DADEA9D2E7AA5BFDA +:109AA00065D788D408594E95A94149ED85F4D581EB +:109AB000D7CCA25F695FFD608FF8C6E0FC8E73E7CC +:109AC0003F0E2D9EB0A65ABEE833088BB2EB5CF277 +:109AD00039C1C836351EF09CE23B00814DE332AF00 +:109AE000AD064C638380E29496C317432E1B49EC6A +:109AF00026AA3FA70FC7DA0824EE893871290C5827 +:109B0000DF07761AD97AE69F4B96F22BFF93E4B5DE +:109B1000B37708B9178F2F1CF769C4C3A6CCB0431D +:109B2000C61241DC1E78F7455C5FB5D6C2FF2FD068 +:109B3000CB6495881B5E3CD46BB3CF322713E28095 +:109B40001C5CC9338FF42E5F28F132F1AB862CB048 +:109B500085F4DEA2B9CAB095C4213B90AB417B50DD +:109B60002AA2416F6C437A24A0C11C3B5C4DAB6CB4 +:109B7000A49D50AB9AE1CCF32850CC59A93F87174C +:109B8000E5FB4B6433AD0B431C8E28A2C5B6B4BCB9 +:109B9000A623C052AA07791AF6B3901BCC9B857EE8 +:109BA0000634BACD8A0FAAA9336248DC04221732E0 +:109BB000D7D1A123F1694950F41FAD6F06D661B129 +:109BC0004897AC82D188972F5818B5635EA3623747 +:109BD0006AFC5D4C9A4B171E72D09683800095BA32 +:109BE000ABA6E75CC751841C51ECBB79E56A66897A +:109BF00058CF36816C7184B7923F5652B4123223DB +:109C0000EF12883BA721D51E3E9A67F6EAA4C5FC51 +:109C10005370CEF0B020BE8620F209377F7BB3951B +:109C200027AC4CB017960AE0057A89E3BBCD4049D2 +:109C3000788EA57C115F05048061E60F5770089748 +:109C4000D75A5A648B696A44307B15933DC969F1D0 +:109C5000B948576642A7EF3405655A13418DBB6B6F +:109C600054FF40C1583F3234C97F1243A516AA930E +:109C70002506C354F11304BD0B5621DA575A745EFE +:109C8000923C4322C1FA22D7F30C95F6AA6CCB4D35 +:109C9000F40FC5D0D7EE720E3EB23698A7A5C451C8 +:109CA000D16D1B818981B6117C5AAD6845003DF6A6 +:109CB00029AF635842726F496BC85538B187850523 +:109CC00073852F402A7BDC88E5EB39601F8A479C2F +:109CD000CD4914C0A3CFBD7A9514EE92424859598C +:109CE000343F5647B1FC0FB4A8F57B3EAB45365C1C +:109CF000A441FE5D51691B04D3E5C56FE7A7C80DFC +:109D0000F355A54B2AD72C5F572DFABED0FF21EA79 +:109D1000CB7E6C32302870E9A8E1F0059722C73F6E +:109D20008A34383D6A6EB077785E8CCE399041EBDC +:109D3000C77A73FAFE2E8A78B81BC9C948A9410AA6 +:109D40003FB99FCC2716FA407EFF8E41BDDED65C20 +:109D5000DD425AB5AB6F7249713A8FB3396E317CBF +:109D60004557A0ED4E84EBD1A4EFE43704BB74C794 +:109D7000505B5DBC9EC8A9AFB1A29799B2B44742EF +:109D8000C768394CF90B6390045E031F7BA5838F72 +:109D9000F5AA1143D59441FA13F785B7F03D7ABD82 +:109DA00015F2B9769F0B6622AA48DBBB5303625BB0 +:109DB0001D5C32F71435D5050F4DF072BEA2AA799D +:109DC00054B443CC6B81E3ED40AE4A762E1AF36770 +:109DD000FED51735740F1BF138629E10361B84D4E4 +:109DE000C3E9A76938B21F39E421E7B6B6FFF70027 +:109DF00044CD63243DD2BEF1E2C143C0D7862AD010 +:109E00006C13B4559D5F7C56BB5C69FE16B588B07B +:109E10008E9275865C61518E3E94517E46D16E4F16 +:109E200069C511126A314B2939B6D7C2E133AA1C70 +:109E30005B746B1BB0BBE9F7A6FCD91B5C7672B5F3 +:109E4000AEE4BF7E5C090DB2D511A066096DD5D414 +:109E50001BA343C1EF8BA1E05662C11300DA3A485D +:109E600083C350BDB5B30B8DAE31ABA5153198EAA8 +:109E700047612A8E68C0C44A1CD9CD2187F2D31EFF +:109E800015E5D5AACD8A6EC59213171FDEDE5B7A63 +:109E90001B9EBD6753291068DC5EAC6505BADDC644 +:109EA0002FB2FA685444FFE6AE36A7B96BFBA46242 +:109EB000670C3C8BD2DC92822CC719F7DFBD5C1F8C +:109EC000FB67C36500A69168041129ECAF3185AA30 +:109ED0000B214A576B50FBFDB8F23C9739BD45FA50 +:109EE00071B6A8DEF9182863DEEC0A25A8DB5D74DC +:109EF00069E4867684DC4277299A37D0EBDBC82D7B +:109F00009AA07F0738E50994B50A170B7DD72DD5A0 +:109F100010D9EB6E2EB0AA4D613DD99EC9AE4F1F30 +:109F2000770981CAE6125014D8CF2B9B3E1E6CB025 +:109F3000965F8135012E8CAAB20B76DCEC222010C4 +:109F4000D8482BEE8E9A77BEB0578B019EF55559A7 +:109F5000B27F53AE324A24821119807E55990E1772 +:109F6000E7A4135E73E48517B591428D0117CE2ADD +:109F700022FFAD5D689F4B6913C86230B2E3E37B9B +:109F800008B624080492A593AB8308645E5DB8BD4F +:109F90000E5FEB2F25FD173808CD34049AE145E21A +:109FA000CE5DA9F1C24D8A5FC8E1C4E175999CE01C +:109FB000BCA11FCC2DDD5A9A507339435B41502709 +:109FC0009EABDDA3C3045EEEF927D5865290CFBCCD +:109FD000D314FF5B11F43E1114BDACD9CD2903128B +:109FE000A20D469A2932C23A0231EDC1C306DFCE34 +:109FF00044B1A840AF5BFBF22990F5D01F3C4FCA9B +:10A00000E77EA7269CC1E8B2F54697F1065D07E01A +:10A01000F2ABE2232008C9267F12279FB110A6A029 +:10A0200074CDB96F5D2962CDEF6CEE7F41067EF590 +:10A03000E2BEDBAAB773A459A0EA48B140BE8AB217 +:10A0400085CAA49FBC2AA3E0111378ADBA6E7C4CDC +:10A05000663A91B033D7F922B3FC5E2C3EB3BFBA57 +:10A0600096C8FD68BE2235C7AE5B70809176E65813 +:10A07000549570EA997735542098B37F4B992239DB +:10A080001FE09CE6017075699C3213D0EF3725798B +:10A09000583A274A830AE82FC904D332D67876B7CC +:10A0A0005D287E50644B6BC8A9DF4DE4D5A22436F1 +:10A0B000090D3E9A0CAB0B2D03C00DCF9F6A55675F +:10A0C00040CC0A0D4606763A29C2D386856879883F +:10A0D0000A35388BEDC9321B47D4D509BD9C31FBFD +:10A0E000CC87A9DF9BB983374F0E8B8A9769905B2A +:10A0F000D02316B8A652B2A75E4DF670B44D6407D1 +:10A10000E9B43EDD7CC30788CBC7147BCB9DB2CDC1 +:10A110001DA338D6E959F3A19A6571FF35CDF8171B +:10A120004A52CD684F4F5D94957552DB4DA5B7CC23 +:10A13000E1D833A20AE31E316A8562414F9EC80E00 +:10A1400078E6936AE6C0346B5CBF1818E256F90BE8 +:10A15000987F957EC9F248DA27EC2FBC092467CB9B +:10A1600025DC42BCBE755836A6178B27E7DAD1F539 +:10A170001F5A58DD459C75E870D9A82CC605394A88 +:10A18000C892AF3FB3BF3E30B59F9A32A82F13811C +:10A19000FEFCAABCBF69C48635976DAE256A88925D +:10A1A0009E9E6F08CD12FA24AEFB596D28415A17B6 +:10A1B000F25DE46A9F662B43A8BD39FAD9C0FA72F2 +:10A1C0001CD42E80E2764731AF88B8B9C131A2479E +:10A1D000FC731A1535DC378808BF4EDF94206150B8 +:10A1E00022FA38A188BF52D5EFC73E1D5835A73592 +:10A1F0005574E161023979FB5421F0E0B32F4EA48C +:10A200008ABB50846A89E9136CA3AD61B331931B97 +:10A2100069CD31C8E3DC6E628F0B190ED49F401CF0 +:10A220005CC6CCDCBE5B0101184421ADD5A3A95EA0 +:10A23000852A2C9EAD75CF20FBBD9E67481B0575FA +:10A24000AFB780355ADF0007F91C1A7BBAD3732FDA +:10A25000AD6EBEB37444DB0394874148753F49003B +:10A26000CB1C889FE91685434162B36C79F175B9BF +:10A27000C98763399484533D8486CBD9E16869E00A +:10A28000A195F75F90A5D6BA455928746795DD86E4 +:10A290003DEA18D6C91D85BD569C164B1051BB858D +:10A2A000D6D26FADDE498EA915EF4B5D84435FA416 +:10A2B000E933E90960639396C8E5FB9803B816BAD9 +:10A2C00069A27A36779DEF2CF42460253B268AC755 +:10A2D0005437EE3EA9FAD497C2A9801B16281FD086 +:10A2E000409992D34F5C028DFF4C9CB3C896A0E37B +:10A2F000C47BDB4FD4B1CBA100400F1AE023271160 +:10A300009AD1E577DBCB27E443DD2ED230075B32F1 +:10A3100098EA0004904BD78829B901789E3F7B7B4F +:10A3200095B0AE082F96D1798665FCAEDE970BF41A +:10A33000F1C4FD7DE426D260ACF8E248BA9840C38F +:10A3400054FFB8D6F2571545A0AFDE45A140CCE486 +:10A35000FC2BA51CDE351C8C88798983FD50E91AFD +:10A360005A44446FE10AE08AD335BD94CC9D9FB333 +:10A370007BD8624C220ED092B2B7E1DE39B2B8F28D +:10A3800070F87489C571F33192550459556BB0A1B9 +:10A39000B59192937399B2981516F84224FD6D12F7 +:10A3A000AD07AEBF239F3B3EF15B327F310E4F07BF +:10A3B000FC6CB2DBBF6FFD0968715B77DCF6DCF823 +:10A3C000D4AECBE70388D353292C83F06A2F805572 +:10A3D000C74AF81C7C61CBB7BA39679BBF14A53E4E +:10A3E0001AA8660352475EB7B202CA0BFDDF2C45BE +:10A3F000109937286E255A080ECD5E165B8F7AC8E5 +:10A40000E2EEB64DF6A1FA116381B93B47080FC9D8 +:10A41000F43AA9A63774730B7DC9C193808CE3F419 +:10A420004CCDE4C9BBE25C0756E6A43C9E206AC959 +:10A43000540C40F02386CD33F0870F02B704360763 +:10A440006159F2F386AC9AB88CBBD3BA4757F40B78 +:10A45000010738C81A063738919DBD34CF3596C2EA +:10A46000CCDCA89930084FF60B0A5C090BCEC297DA +:10A470003378086FB2BDE903286EB3CFAED0182A87 +:10A48000DBECC470B58C2581609CDF94F4F1CF9631 +:10A490008DF3D42EACD085E2A3F6CA5113A4FDEC03 +:10A4A0003FFA1D59896F22162F99BD419C84E8827D +:10A4B0009F7BDB808AB1DD8827A889DDCF7D5D0B9E +:10A4C0008D45A4FA8A4F1865312EC53B96E49C024F +:10A4D000FA320DDE42586338CE763868582FA4C55C +:10A4E00018165F74221C59197DA3BF8F57DE31BC2B +:10A4F0005109C5EE0DF7BED8063E766DA5424D9DBD +:10A500000E7891FF301AEC7186A81899AEA6CCECA3 +:10A51000F630F5F46AFF396D8976B0A38DCEB96D4A +:10A5200014A4F543E836EB0B64D8E574061CE9FA8D +:10A53000C688CCF181C93290134831ABC59A5277A5 +:10A54000512D55BC4E78B53A97DC8B3BC9CBDEB468 +:10A550007392DA2E9ECEC5D1BBE10C16301D982A1F +:10A56000CDF19954AF91D6EF197726289E4ECD5B49 +:10A57000D5D6A5BE375444F85D1A58C7D0FF0A6631 +:10A580006DB8AF61A866563C47F620E8E240EEBAE7 +:10A59000016C8D1E6075F8AB7B275DBB837699A837 +:10A5A000C4B65B0F4E41F8EC081EB4F9D0B1224896 +:10A5B00014E89312D894985EC88282D7C3C088B139 +:10A5C000C2D382BBC866652D0EA51C6CC2D11FDC30 +:10A5D000F823D5D8C60D74A132C8340DA497B400A1 +:10A5E000828B9A5E69FB2DB36958997618786275EB +:10A5F000529043BC2778C26EE9CE960FBD47596E84 +:10A60000F6DE57B2426C37A0A5AC093C63448D7EA0 +:10A61000630DD5C8FE372B3F7FB9226FC98C6CFA0A +:10A620005245688AAA13442BDD65D9F81CDE5D7893 +:10A63000A981620B63798CD9E621C88B5AED920E01 +:10A64000852021AAB806D80066DE683BAE986DEB7F +:10A65000202E4474415CDFB36F41F4D8D53FD1E67E +:10A660007B11461B3DD792E50252F9E574F6D6AC54 +:10A670000F8B8C447BC3E64F96077C6064A64558DD +:10A68000393DFAB8D82819779815FA635B05B16B8C +:10A690002A841DBD4109E1FD99D309719B20BF7337 +:10A6A000AE494635552EDAC0964DCDB9C6C9497F5B +:10A6B00095C128E5C27DE9107C7BDB10C998F53B8C +:10A6C000CB3E7DE67E9D09AE56A9842C8E999B8457 +:10A6D000739B35BBDC38062F984D93A534513EA3B0 +:10A6E00088645408B1812C546A8796C44F15086D4C +:10A6F0007011035761295EFCD44D9220242DDFF7A1 +:10A7000059184B669670AE3DADC907777B88955852 +:10A710009443BA41044E0158F2A8106F1BCFFA853A +:10A72000F3E184B508AC93CCD559E047A912BC221B +:10A730007D81EA0BAACEB3F06E68230177FAAAD026 +:10A740000B2205214216A5F4F79B80FF44574F4783 +:10A750008127A07EC78C1B4A1E954D3405C230BE92 +:10A7600095FE0C7D283AE5CAAEA847547635492BAC +:10A770006B301179EE6CAA30E3EF16BA6C537C643F +:10A78000095E63BCC680165A0B64BF9871BB1DE698 +:10A790001E4C0760D82B7FD5CEA325EA90D4A60BFC +:10A7A000E73C9451CBD97A80C676409D160759C9AB +:10A7B000BAEDB47AE5731F3E6F60A33112536F0098 +:10A7C000EF3F65662E7B96BCCEFBBF839BED65CDD0 +:10A7D00020E3785ACAE518279EEAEADBB0B8B64209 +:10A7E0008493CE988E9A64D3871C077ADCEDDF645D +:10A7F000E8C025C63B59746151C7F8BBB5EDA4D577 +:10A8000011D02D0D30736C367EDDC7D345CAA12023 +:10A81000E1F2F90FCE57958675F68DF0A82363A166 +:10A82000C8C77965D7617BB6336876CFEBFFF4B3E1 +:10A830003C9BF5612290FD4372758561B2A982E16E +:10A840005B5EC7C1CCEF8D2DEFA1A08C5DFFA83C56 +:10A85000DA97AEEFAC97A25051591D7A5D7DDA8739 +:10A86000F341AEFA6EC1AB6C4C20748B706DCF911E +:10A87000C21FC06B7D3D3146C29D163838B860D0CE +:10A8800075E12904FB4EDCE8E021F7D1472E6BA2ED +:10A8900088D334D0FBFD51108F9A02C4E132C69F99 +:10A8A0002BA18863DE0E28515BC674A52CF33F7E76 +:10A8B000B869891F1FED0133438B471EFFF15EB658 +:10A8C0009F1E31CFCCA07E7655ABAC94C1674BEACE +:10A8D00086D934A262A727C3F5B05BEF6ADD6C4F5F +:10A8E000BCADADA1C98B37852079A405BE4938A27E +:10A8F00054119D7DB9FAF5C634B6E3441B31BA3D17 +:10A90000666FBAA25C9B8C57556E072C15CE012D35 +:10A910001535C719525CDDE7ADE7CC5BD745578EDF +:10A920002F8245549E75F473698F17C94619E1A5A6 +:10A9300055C57BA7D63E8633EB88BDA524B8D26B20 +:10A940006E874D9BA0943042A8E3E837E6322C1B7B +:10A95000E2BB6F1CA25689072C47FEFB4F814DE7D7 +:10A9600036870AA82D7147D22857C24C29ED899DF8 +:10A970004C0574D998686F455DDD7D81099212A4FC +:10A9800060B59D2B9465E37A5862DAA1B29099780C +:10A99000A28390E270F942EF5C202F54C562DC4D37 +:10A9A0003DCA8B14B31D59BCD28B21B3F0872D3D0A +:10A9B000BBB246A51DEC4EC2F83171AAFCC5FDB173 +:10A9C0008A7FFFA55155D7207F15806E075CC9C3CC +:10A9D00017E991A9770718F1433ABCE9D81327E1A1 +:10A9E0005F0C021465C9012107FAB029231B611607 +:10A9F0003D853FEA2B76DAA3DFB78F4E1146CB4E6B +:10AA00006EDB7F063E00F263CFD55D73D9BA59B8CD +:10AA1000B12E1DF91351453A0968570594B747C33C +:10AA2000CE0EF08E7660F664280C453F77E837B39B +:10AA30009116C5043FBC861A6F2645C34548A046FB +:10AA400025AD41FE1233967826EFCAE17F69FA1EE2 +:10AA5000842A014FBFD95EC51D6904D5D194593EE2 +:10AA60003BAF6B6382EF90A18B1A8E5EB6BAE41097 +:10AA70007A4F7F5760AC17BAB73610B73454060414 +:10AA8000B7B7814D55DC0E965DB12C976CD2EFFBBC +:10AA900071A653EE41A37CC160C28E2568C02C7A9A +:10AAA0004BE442427CCC711ECF9697961EBFD5E6F2 +:10AAB000DAEC31EDD118F9406A680A50817D0ADB81 +:10AAC0004C46CD584FFD9C2A480D17AC691DB1C0AE +:10AAD000312B135C21FA3DBCAE163A97416C7B6377 +:10AAE00079DA8475F22817D6F520346F543FD92AC5 +:10AAF0008C8E0FF6F428B13D4AB60EDBF519EAA1AB +:10AB00004F195319F770D9A5A6BB19FE167DC8A316 +:10AB10007459EA17D728831E48C0D0752A804F3E43 +:10AB2000334B3BD9152FEAF5FC786D0567ECE6CA87 +:10AB300034052AE1E5220A9978340D2165F94A891C +:10AB400016D567AD991B0C3BB1CDE844C258985F50 +:10AB50005F7B62EE4C8CCE156CB421CC20E485AECC +:10AB6000C17A3AC7E42307B3C0EDD5C58AD19D3B6E +:10AB7000F752044DBBC599D3EB57F7B9D400E14F59 +:10AB8000E1CC56BF7BAD994B8FB18B04D4805D086F +:10AB9000009DD6C979CD0E436C587707B823F2B81B +:10ABA00011EE7BD9D84DE9A4E472617465AF4DDD37 +:10ABB0005CFE37B958B582F1E3EF24FE507510D929 +:10ABC000D2BE13C566ED6E40D717237390EB7F0896 +:10ABD000C0A23F246DF7041FF0A5205E996A416E64 +:10ABE000BC53F46D1AD2CD276B32B03EB9C4921467 +:10ABF0006D5FF086C6DF58125193127830FEFD2843 +:10AC0000A27356C9BDD18A19D31FAEC09A403D3A2E +:10AC1000EC4BEC642B2B366470565D876415FF2A71 +:10AC2000385DDBEC1D3E09CFD7D69CF7E40CB7DDD1 +:10AC3000440D450E7DE8DAE6774FDDA81D1D30781E +:10AC400088551FE563ADAF83FDC807DF512F79D36A +:10AC5000D2AFC1F64EEC833ABFE3970F8A76E6ADEA +:10AC600043A250C94F249B2FB1153F6BBE5A624976 +:10AC7000B895C42037D48CC0FDFA6F25001E4E5EF7 +:10AC8000576E93D6D245F9BF9D8F6F8FB7302EA3E5 +:10AC90003B0755D0365084C21820FF7967BCB1C934 +:10ACA0000B180DABCDFC19BB4B66F940182EA0AFAD +:10ACB0007809ED5CF11538FADBF0A9D33020B50541 +:10ACC000D97BFF9805E49BB2C6AE4750D07BE0DD50 +:10ACD0004BB06D1884183D05C5DC2F1F7F54979A23 +:10ACE0001F1881469693C7E9DACF0975C1CFD2A85C +:10ACF00069AF0972C7F9A57A49FB0FC89329EAB170 +:10AD000088D6C2D796D7CC198744F69FF5E6B18C82 +:10AD1000F8F7952DC0A045981D8D4D8E95562FB9ED +:10AD20001B851E0C30F46C804B47DF58C3EF4EDBA5 +:10AD30000FB1B06A84C6F6051B70270D3502E931E4 +:10AD4000C209EB49277A23B1D180D8EAA7C9669214 +:10AD5000EA98A036E557CDCBFC3EB1A61E35DC33D4 +:10AD6000571E140E663BDC084437322DB7863C2153 +:10AD70004BB842C56A37974BF46BE4D454DB824836 +:10AD80003D49240C9D15D6492D3A5700704A04328E +:10AD9000AD4FEB328BFF0AA3EA3F135AA5C40F391C +:10ADA0001FDDB1B63852802200307774703B7DDDF4 +:10ADB000D9352545BED943DECAFE49E90997C444C1 +:10ADC000F4FF21FF278A2AD17DA21E5598D86162FF +:10ADD00091FCF443F547D39B96EEC278EFC754F647 +:10ADE00028C21786FFF35D4FA3C05200BEF858DBA0 +:10ADF000480F9277E8842E3BCC161D6CAAF55F15A0 +:10AE00000365BCA26343DFCBC1E53BAB3EE04B84B3 +:10AE100084D40A0597E213A9855B34359DA8C2CF77 +:10AE20009871378B61ED8BC67B6A3FC6B90D1723CE +:10AE3000602A13B9636F58BDEC76747B668187DF37 +:10AE4000803A5ADFEE4F2AFAD3D5C6DFD44C30B859 +:10AE500052B7C76150D17FD27E1AE2DE00CC85871F +:10AE60006A1662CB2B56B89FEB685E6B779B8DA6FC +:10AE70003E00B660BCA55FA4043603635C4EF08759 +:10AE80000105A8E443A703AC545FCE9E0DE7A735A8 +:10AE9000C3A49BB3796C4D7B99AACBE4AF86A9F18F +:10AEA000A72515181308FCC28EE2E189BA0B3EFAF9 +:10AEB000D40C18BB51281119196B6798E9BD592C8E +:10AEC0004952386A7B889E6D280DA3892D59E2FA74 +:10AED0000C7D276722E5C6BC9D32E84D7642E4D85A +:10AEE000013CA9CFE0FD1833A1CF16614DCEFE4441 +:10AEF0002318AFE54E771566D72DFF6198420C51A8 +:10AF0000BA59BB0291BE900059176749888C1BD86B +:10AF100034D431E2293EB52F6B675282C79A7A3E0C +:10AF2000E1BDFE4A37DC52F7A19191A7A66CAD4175 +:10AF300087BA505337202BBAF1B569D592F29F7C6E +:10AF400080ADE4D17ABA7B01C471A710E1715DCF05 +:10AF5000253045FD9533D2AB434CECA1F5A94DAD61 +:10AF60004AFE97DBEBBDB0BDA2992B343A2AC02E26 +:10AF700035D78D4EF21E9C2243D98A8812C08E3F4F +:10AF80007CF15588472FD8FA17A5A544B66B46879C +:10AF9000AF1D7EDC99C3721BDC438DF6D554615A1C +:10AFA0008785256BAB8AA3CEE04F7609616A8D1247 +:10AFB000EC46807F5B0B0869ACAF7B8DFBB45DD04A +:10AFC000562D19F22CA668E40C2349726D8D90A9B8 +:10AFD000773195B715740A30F807F26A4FA09E8250 +:10AFE0007AA5AFA5BD4F312A2CB836140F7E8F300D +:10AFF0006F5EC7869DE3DF2493FD7264433E117A42 +:10B0000003AAB9A46E4CCE7E6E963BE310EA20B73D +:10B010005685250E494B94411DB3CA84ED7B7B7C3C +:10B02000D9A2BB9D66AB5D625FFB36AF6DCDF656B8 +:10B03000760EFB8FDE3EE79B26E50C80667DFFD912 +:10B04000D7F485B5A6D118D95999A718E408665D33 +:10B0500074916856CE929D3C4668D4EFC88617918D +:10B06000882EAF2797195EFEFA5D12D97497941A4D +:10B07000A062AE43EED6DFE37E59295FC4E6CAF193 +:10B08000CF2980FE9B409432A5A07F3502551E66D5 +:10B09000823E951076946B18E27086FA6051E383D5 +:10B0A0002B97028969C79CF03D1E207F482A03D94F +:10B0B000DA95E0AC2E163BD706C73502CA9A358E14 +:10B0C000521FC182C7FB6A48086113472483C347E4 +:10B0D0000690F07A66F6784AC1471613A9A7F65685 +:10B0E000F8A4A2FE1F5D55D6A4A4B0158B60077905 +:10B0F000A33ECC9C7A9C40E0E608F1B6EBCA92CB2A +:10B1000098252E426F7E944E87023BF525A3929E92 +:10B11000FB49CA3CB71C65C011AE71B8E6F9E0FA4C +:10B1200017AF5A2E50707B8697FC7B2D7E5A608518 +:10B13000D8B4B1F648DC74015A0F82BD48BA515BED +:10B1400091DB21F0092C9081597C717369DB1ED54C +:10B15000CF3BC2794B9F565F4378A67536DDE3F54A +:10B16000B26769E5D3CB4D00242653888EB60EDE38 +:10B17000267C37C8E83F37BE8B8249229BA31B2B16 +:10B18000850F77D7F44B5458BB852D3169D8817022 +:10B1900010D893D3F81DDE7B299A4DBE7741852BBD +:10B1A000ACE67E6E5A5B724A085BD9C4383425FA25 +:10B1B000483042EF287E69F6DE0BC63862E9F93B7B +:10B1C00044B11D652B88B334B313C0B7F63855E6C8 +:10B1D000EE5D578C332BD5F127B2C41DF78F44AEEB +:10B1E000C453DC3210D362936FDFD8F4A98C71A5FD +:10B1F000281B62C02B59384A9CDD5839FDBBB93C2D +:10B200001C7ECF0E46A00816E6BB1EB141F457A225 +:10B21000204EEC66C80CBECE0405CFA9A4BB0E52CE +:10B220007D6EE8367B8B3AF8E47BEE3CC0E3C94F99 +:10B23000EDABE0D6078C87784270C9169B5169F652 +:10B24000AD33F0396CE5BB88B7A21D39EDD49AE275 +:10B2500029E975F2F24F58A05E472F68DBA21F70F4 +:10B26000AB6E8010072F01580FA2E3183BBE6CB6DF +:10B27000676AB3B36BC67B4D7FCECFE5BAF207B931 +:10B280000808EB8A383462BD99CD3A4A6517A32A7B +:10B29000FAC490410E0C6F0FC3FA7E12D3A998EF37 +:10B2A000EED50F4D29022D251F670E2DBCA26BA8D0 +:10B2B000952033508E2712EA89DDB9A62046782CD6 +:10B2C00005DE3FBB382BC7AE0151BF6E5A53A79066 +:10B2D000BC9629133D4EE4E460E8F3A22DEEA73CB2 +:10B2E0005E7E936BFB5D6B9F7E716555ED8E11B23B +:10B2F000F7B8CDA1E04C75190FFCABD8878C59C3BA +:10B300003305E79500B8C1679A611AF672749330F5 +:10B310005C9805F4A3B40527C808F05A3E0B087ED4 +:10B320009BAE753348636A3974451348A230B52023 +:10B330005C5289482D96530E7CF956FD2D1182C41E +:10B34000E8A14B7388A341DCBB597462F39FC942E7 +:10B3500082D8BC3431ABB37ED0C26D244317FFD248 +:10B36000D68EF616C93B334A1AFDF79E584681BA67 +:10B37000BACA7A148D73717F539E8293D885199AB5 +:10B3800070DC4A48A00E0DA617F5C71D960117459B +:10B39000D1DE28FBF595526DBAB62CCDB37325DE00 +:10B3A0000ED722549D4F8CEED47EF5820D738DAD59 +:10B3B0000B613D8314D9453CC0D69A09A8315D6F15 +:10B3C000EF62FFCAEC74BABDA507C57DBF011A4282 +:10B3D000AC22235AFA6CEF74DE5FCB2E4EF4DF4FB3 +:10B3E000C68276EC98E735CCB8F8EC40B1D41EAE06 +:10B3F000D382C71B02266C00E5508D484E611CCAE3 +:10B4000062BF0A678BC0BDD7276D2CA17914A68DAA +:10B41000AD165F733F1E2227B2064F602D79ED20D7 +:10B42000149A2D15C03C5C467C007404BA4D8ABD4C +:10B430008693B0D3524EA09E20ADFD592F6D7E3A1B +:10B44000C6ECE22880F656A62DBFA825F539D152C4 +:10B450007CABE2AB741A4FAF108071DDEF53C03D8F +:10B4600005BB4BFDF602BE7EE175D61053CF96E7C5 +:10B47000032844EB39BF216751D2DBF4CFDE7928B2 +:10B48000DBE05B990EB47BA51D6C9F722112F9ACB9 +:10B490007D2C900A05232ADE552A5109597FA607DB +:10B4A000C6FECD26157DF460FA01E980A020846AED +:10B4B000FAB35312C8A0C93DE81902916A5230315B +:10B4C000FA4C78F9A402960F348CDE93B122FB215A +:10B4D00094048C2C17B9DFC0B923825B6E02E7405D +:10B4E000DFED1A69915065B5219DBC66A338D03255 +:10B4F0000C2ADA58A842D490A8E7847DAEDD35B88E +:10B50000CC4739C4729FB42A1C7DF1732A5BC13EBB +:10B510006D3A35AD60C2596E96DDFE810BBD78BCCB +:10B52000965EDEA10A6C8A2D7B7454A6BEFE78D688 +:10B530006A127D55A256DCC4C840FF58C52D820D45 +:10B540004E8A5C24A2E9CC496383E3CD6A23175079 +:10B55000DD3EA09CFDAFF7AAA9C22ADE9F56AA3302 +:10B56000F689CFBA51FC651080396914B97ECF7263 +:10B570009C32F0B1C2FB2B8074D37BFB9C1B4ACE68 +:10B580009AA2FC0696655EAEF824CF15926042C280 +:10B59000E8A0DF766400D9F3A3803738E99C18D39C +:10B5A000D7420117C4CDD4EE92F9DE1606A9AF6BCF +:10B5B00051CCB96E540549A46AE4E4116E47DF3FEB +:10B5C000401AD05328E6D10155C8F045767E05E9EA +:10B5D000CF9A23527CFCD7ABB9E70795F07BB476C2 +:10B5E0006E045D632A1AB60965F086423E42A07178 +:10B5F00065D69B3CD983DDC98976173B642FBFF0A4 +:10B60000DC6DFFFDEEF9C57C8F8FA5805CF53ADB24 +:10B61000C1406790A35AEE0B1B8EB20259DA7EC36B +:10B62000053E4BB4A8F0228FEA92B9826BF190AB41 +:10B630001F6097DFAE716746E4EF9C20D3D2C07CD9 +:10B64000E594D55525E064E410A11F6902D3E6EB2B +:10B650004AF08C43FF115FFCEAC25B9E549FECDE14 +:10B660007455797DDE8900A3D96727A14117BB1CDA +:10B67000703251578421F4E034D5DF742DFB4E45F0 +:10B68000F0F2DD7934A68812EB7232CE18B1EB52AB +:10B690002806A79564C659ABA3D5FA972C85EA145A +:10B6A0007BFA0C765AFD967207E56D9C67C799EE9A +:10B6B0007CB5C87D814E182259D5C1A3C4AF4FEBCC +:10B6C000E80F5160CB956C2C762EE41BF74DDF69AB +:10B6D0006DBAC06FB86A067EF4AF94A60D761FD619 +:10B6E0003640249FF4583489207AD668664CD2E0DC +:10B6F0004AD1FBBA9BE4E14EA0685B6D3C6958B14E +:10B70000AF977D87D3D6085FF23CCB09E1EFCF7DC1 +:10B710004F6765292EA5AD2B10CC915E8CE5B80D39 +:10B72000F7958F88D6F2496FD60A5F6A5327AFAC78 +:10B73000E8E7E7004B293C85AFF8F342798E3C718E +:10B7400095964014D76C796A645795C3F6213C7C72 +:10B75000175AD720FD77507416667CD97ED7C8A2B9 +:10B7600085A7A30338409C645A274C2332965B7C00 +:10B770004B7EAEBD0EB6FDD826F40841A776D45F49 +:10B78000647D9D873B9FC4CCF887A325DAFDA6F78F +:10B79000AA90EDD0CB00A804AF6F6AABD742A775D3 +:10B7A000B2AEA866075802B1F2C7B7CAD270F0AFFE +:10B7B000F83F81E43486240137240F45E75322BE45 +:10B7C0004C61D1D801215BAF362916FB68880FF98F +:10B7D000438B6A6D776E955DED2A06317857D5F407 +:10B7E0008585E5DB77A6DEA7C1D7E5FF68696FE24F +:10B7F00058450884D4B2876132E9F8F5602C88781E +:10B80000FED5AE1063485539C65088B4110A069F5C +:10B8100045BD20F371674FB2AE38D2717F19AD6D5F +:10B82000F2FC15CC1D029CAA65FE42CB6BA4CCDBBE +:10B83000A71CCF0CF677EBF71933F643BE9021B275 +:10B840006760DD8BF3B308D09C3A2DF7F28365294E +:10B850005B33F2877776A738CA492BC52A336567E9 +:10B860007BD6FAEB524340E28948DFC035E42F3102 +:10B8700021CB1CC10AE2C4440C1E7BF5EAAB73D693 +:10B8800081CB3DE7FACC3E1FFAD1140BB816A72F97 +:10B890008B7422F55315DEFC1B8AC287AEC5AE83BE +:10B8A000077A698A698A394F32263481D01F7ED55A +:10B8B0001983AB850D9567B4DCD7EC43691F138FF3 +:10B8C0000A062FA5DD790A3830B024E11F1DD5E026 +:10B8D000A2E9E8AECBDA1122550D2D3E7A9FB506CE +:10B8E000303F94DDCAF96D3E65F0CFC2275CE8BEFB +:10B8F0000A7B1B9D739266D1B6363C6F89C6580D84 +:10B90000B5CE9A1F7BADD42FE2DD8D413DBE2E4DCD +:10B91000B83D72EC0546672C8439501661B67C261A +:10B92000D3CC4E4D506A9227194F603F019C896DD0 +:10B93000D63ED1243C087F9A88611A34A2AA2D975A +:10B94000532317774BBC1E4FFA4F4110421F23F76A +:10B95000DFB9AEC8E187A64100C322B4077592B82B +:10B96000EA39B4E9AE8FB4E68CEC40B9464D6C824E +:10B970002F175BB07D1823F879AEFB4AF8731A4B8A +:10B98000693AC4A01B09E90062BFE93230240CDE29 +:10B99000441A77D2C59FA839ADA299D27A3525F23B +:10B9A000D9E91C67C3F5F3C0391F9A69A2E6672776 +:10B9B00034F8F8585FF28BC17D0F4CE57892544B08 +:10B9C000B43BB51E789536497B13BBA119DDD6066D +:10B9D000B5A72F74979EC81E169E7425FF95C6C2E4 +:10B9E000D0F1E8B81A3C67A93D871D630B20D76AE0 +:10B9F000B7CC5CC227298C98803766077B6712B763 +:10BA000083636F33867B18423B21679E3BE458DC9F +:10BA1000F6F759CAAF307F51D80169B0D95127EC38 +:10BA20001BEE60FE3DA842C498B35C1FBF7E856CD0 +:10BA30004B08DE1D615A62964CDDA2106CA4FC0E10 +:10BA40001710623613BC6947C7565FD84A9CF998ED +:10BA500078519AE301CB3BC42F907BC43547003427 +:10BA6000F6BA3A4FC436A553D406D99F09B736481B +:10BA7000A2148BF72CEC6AF43DD60D50EDA5DE0335 +:10BA800075C5DD32424579AC27907D2C5DFE793558 +:10BA9000B5836FF5D5C94984252B3AA429EBFC570A +:10BAA000F7AE1987591747C1D38F15F352BA176BE1 +:10BAB0002A643C8EC43CE5AB70FC6D3E207511A63B +:10BAC0001D4BBD18348D358BB78633D9B74F0C96C7 +:10BAD0000933371AB6E5804818741EE4E9612DC8A9 +:10BAE000291B999874A4BDDC6119B868EC8C56D0F8 +:10BAF000B63CA07C0E10F9D7DCBAF9D823C24FF3BC +:10BB00001CBCD1812202C757C710BDA0925A9D8A82 +:10BB10006ED514B07553FD0798DC3C598BA0692B8A +:10BB20001ABEF660F26CB5FC1961FBB8F9044174F9 +:10BB30008C7AABD2FB86DA1E699D2BCB718077881D +:10BB4000CC4E5085CCBDE26E407B5DE928FDD6220F +:10BB50002034AEBF00726D8C3F7CAE8BB5C45B1CD5 +:10BB6000B8D1A9BE306FBB76C179428BA4DE451136 +:10BB7000983C9CEBEEF18993B591E9D45606EE49D9 +:10BB8000356DD8618CBA35D8BED323F5D26159064C +:10BB90003C7B8938A6BE2931C07513B44B67B5BA52 +:10BBA000B014824910CAFEF62CDCB8F2FE733CA039 +:10BBB000D2DE87E355DF86C5CEA839878AFD7AD6DF +:10BBC0004FA25BB589EE5BFD29FDAA31C2A9615E7A +:10BBD000A7B4DA78DDBF73B4A2FAF6BCFC1E560037 +:10BBE00063C1CABDEFD2D763E84C0BF3A2DA7AFA8D +:10BBF000FA29DE6A1FE037840B34900F1068D622D2 +:10BC00000E640C5A3156219D392B98EE7885F592A9 +:10BC10003C36B8DE48F9DDC2FAD81D2804BDE1592A +:10BC20000F678F544B31439015B0BF2849231EEE48 +:10BC3000CBC68D4C500FCD572BB8CB099ADFC18B9B +:10BC400067A30BEF99010BE238CA3A9625BD6BB991 +:10BC5000BE5BB7E2A884CCDC97AF0207FB97719973 +:10BC6000889D0AD5100F446A61A6A022A3513AF814 +:10BC7000C370483B8BDED71516E9DAA158CC6306B2 +:10BC80002BEABE27B4BE227EA2A7AB0F5B7119B10F +:10BC90005785C71367CACC56DEC63949C8A03519BF +:10BCA00045F72859962B9610E0963935A55C0F3349 +:10BCB000EA857B91922169FAC523A61E4D5DD8E1E4 +:10BCC000D8C87D8A57BE13B588F603D7F1D3682A42 +:10BCD0007F87B7B65F0E915590B83C9E85B033F321 +:10BCE000D4FF9E4A92519F98E3D901DCBC26710D86 +:10BCF0009412FA00641891197F95BA8B25C706C66D +:10BD0000B92DD746DD2664D8F4A2A68550E82E2F9B +:10BD100056A89E4318A1BEFDD965394CF442949CA7 +:10BD20003DECF1055F132A28364A42ABD9F009B839 +:10BD3000685CCA3FB7C3F6CFF9AE60407C2F42DDE6 +:10BD4000F0C43667BEEBF2A9941226DACC2B401A67 +:10BD50003BADD2FD4818809B9632688B55FFCA6870 +:10BD6000AF63AB226510AD8884A6B9A7DBAD4AD41A +:10BD7000BF5AE31F8F86969288382F06E92C3BAB7B +:10BD8000B1A345A70FEBBE4453745B3AEE89071A83 +:10BD9000E4B31AA873F37FCE055E21D6E8F01B4EFC +:10BDA00065FEFC4CBDC16B4C239CFC136C944CD9C0 +:10BDB000B83F27DE487D430BC14CCA3CBA9C12A653 +:10BDC0008EAEF409F3FDE4493FBCA42ADF2E78C40B +:10BDD0008929EFA6A7159C149C61089CDF424A990B +:10BDE000306B899A5E44CEA548DADA1B31708D52E9 +:10BDF0007113F7B30A8559E2B062567599EC412088 +:10BE00007FFCAF01A939A6EB20531E25198F1CE238 +:10BE100077B7A724424F1C650AD98CC99CE0A59925 +:10BE200012E2CF8C3B2090E0A728D623E5421ED11A +:10BE30003A0408756C2C7C420311E5E5DA6AF59B3F +:10BE40005D7BFAAF7E02F28E89AE677C1067EFFCF5 +:10BE5000A6474D4A735377F140875F8B5611A7B4BD +:10BE600021230255D63BE1AB2A29B907C8C61CEDF0 +:10BE70001F2411F1B7266D39E7EBE00BF01E9B3E56 +:10BE8000C4E7357735CE9B71D62146FECC594D118E +:10BE9000637B96C41D456B1982E123249DA81888F5 +:10BEA000243310C05F3FB43267931D847EFB3E0D88 +:10BEB00065B3AFDEE7832E81E41AF91F7EB04492AA +:10BEC000C0C349013DCFB2EF5DF06668EFE549219F +:10BED0007FC5071E1EB94D15A10D8890F131175B66 +:10BEE000A5A257FE7AE17FEA68BE21990EC989E3CF +:10BEF000D3EC81A677D638A99E036ACC663D4D4621 +:10BF00008F79E9AE15309A985D657C1FF1C2078282 +:10BF100077C51BEBD784B960B2F050B0B82F0615C7 +:10BF200052EFD031ACC318927EA59B3EF3C4A50D51 +:10BF3000C0DE20382E6FE462B35FAF0D2F0238965B +:10BF40007DAF0E3FD4704CE3008E5897A2EF9A8ECF +:10BF50009118149DC27490DF871764FFFFAE9F3B5A +:10BF600054550D49102E4D9A4140E8F88D27917C8B +:10BF7000582C03390BDD9FC686E7F05C4F79F8B388 +:10BF8000314AF90EDB6304D66B6BB8373FD6C41168 +:10BF900074B4C22B8583C4E9675F284A2B73568E1D +:10BFA0003CDEB8AC56C7682E5FAE3500F3DABFCAC8 +:10BFB000C33C84D43C54B22B05604E141B69CD4164 +:10BFC0004ED9175C9C3A2C20C0320C666F3A7C0E1E +:10BFD0001E0C7FE71FE5EE7DE3B11FD6DDE788CAC3 +:10BFE000A69AC5A8AF098C351EE396EB5CA9002183 +:10BFF000A86E04713615C5CB25E802491A8C0FA32B +:10C00000021A55CF2FA0615083CB9276543E012760 +:10C01000C15D1E448AFBEA8AD370F586E625A2C379 +:10C02000A638F66533705B5AE90A654CAA9EE2F5BC +:10C03000C666EA58E5D440BD0E6437798C238C4E31 +:10C04000ADA30E64D591CFA4BB4A6C767985933DA0 +:10C050004292D140F24C10C5CD38D2453FA54D8D0E +:10C060005CBEF4B98C4311191945E7D1426E2F3BE0 +:10C07000F8B35C40AEF69F3C0C363473A7C78F3BD9 +:10C08000C6E0A5ECF6500525B07E58EF2728F8E26B +:10C090003EBB1EFE194CF4200084B2D8BACEA9478C +:10C0A0003D8D6D6FF8846CD27B4FD27A1D0BBE74C0 +:10C0B0003EDBDCEF3A228723367D76E7CC88A2137D +:10C0C0007A3FB8826B2E7F7BE51180CC86AF5E9A7B +:10C0D00067CE12ECCC741889AE5D34D02BD6FD142B +:10C0E0005E67DECA569F407DAB1230776912FD84D1 +:10C0F0005F95800E93D2352CE04C13847B7202FB4B +:10C100003F2914C62800CD4127B045E1031B81DF3C +:10C11000AFFA5933C2A4B998D7AAD5DBB20E27F02B +:10C12000A6BA6313D5825A58578E784A21A52AEEAB +:10C13000B328DA6693E8100637C288C6A0219A1E93 +:10C14000A63883E2B177E970AEE466B321F5AE318B +:10C150003516984D28C6B2707ED4F119EA928A2815 +:10C16000471606984F873F2D4AB57DE31EE19D2671 +:10C17000416FF864388AEE7E9333FC33855CB7CB2D +:10C180007261FF354225F209C3DF5B21E17E8E5AE1 +:10C190009C52C80FEE74FAF82AA3D890E7FAA3B815 +:10C1A000E5B8E2C17FA820639FA8A4F4D9ACC0DFA2 +:10C1B00040665D9CD3E6BE90FD103A20F8C817613A +:10C1C000C6356448EB1366A7CF09C6C5B89B6EE6B3 +:10C1D000B22E6B4310C2634ABFFA0DA51A0DB1BD52 +:10C1E00008DB1978EA2876EDEA03003EC4B560C59D +:10C1F000B8F27E4E06E856E0801042AC2F9814EC60 +:10C200004647472AD4D4C69AD922D086FBDAEA8F89 +:10C21000D2531063CA2130E0054BCC6AA0FE7A44A9 +:10C2200060CEFD6EE3DA61848CF2C04492A0489641 +:10C23000238E3569098613FA25E69F2367FB83DC85 +:10C240004F1C751F12A9D57231101EE664F607F057 +:10C2500033B0538DFA10D9762725D19D734E90E4D3 +:10C26000744BF571EF2928F0A3D1FE558E7BE3B313 +:10C27000D4C07E8C792237A4189E8769D087101984 +:10C2800038B929278B1BF4436FAA731B762432AD70 +:10C2900066569C12A4FC063D7C6759B7B9493647DF +:10C2A000E91A4D82144237B5E79B1072154E6702AA +:10C2B00000F7412B9651A9201672B86D25FDCFB617 +:10C2C0003EBEA2C013E135663BCAF12074DAB02449 +:10C2D000E3A437F67842D63AC0BA083030CDD2F36C +:10C2E000F241B0C80495A4508BE03EC75F7A537307 +:10C2F00091D4D7827C647DE882671A30150163236C +:10C30000C7ECFACB1DA3096E05212289BFB7729332 +:10C310004110BFBB63617E10CAA88121B3D6A8DCDF +:10C320008E491C2D83A016FEE735F5689605251469 +:10C33000D4AB2D3F867B81F79EE628768C0CD87E89 +:10C340000FC302EE290E61FA4B9ECE9DDF643B992E +:10C35000CCF8C58F08C74E53A31022ACF5A7240D07 +:10C36000D5A68AD823E3ECFFCBD82B42EB7D05572B +:10C370006731541BCFCD4080DD624EF5493816E061 +:10C38000B4700A91DBD7982C62FDCE87D2D2070B0E +:10C39000F4F49CA5DD1758AB5EECF15B351216E4A6 +:10C3A0006F59F5924D01C1DB90E89650DDA0E07B1E +:10C3B000753AC8B0F76153D2549C38B429B760BD00 +:10C3C000022F05F08D46DFBB9E510C98CA656A832B +:10C3D00035387F44270BC22F53284C16A572573F80 +:10C3E000ABAA9CE86C82A222E3D53ACEBDD8ED512F +:10C3F0002C0AEBDE3FB729353D537ACF3B454C3510 +:10C400006D7F057135A58EC9227A80938BE9D9DBC2 +:10C41000362A4F94B437FFC621D01E334583DC83C0 +:10C42000A05E64713ABAF34F3105F19F2F80AB746F +:10C43000FD009627358596D6CB81E4D1FD9A9725C8 +:10C4400056A1923F56EA5BA305D38DD04740401BCF +:10C45000D92A197B4EFCCBEC4CC8FB45D7919FA247 +:10C4600093636DBA17FDA60CB2ACBC3A5CDD8ED5F9 +:10C47000D4E6A50D52073C518CE15D83B21C62AF3E +:10C48000AD7054FE7EF5843C5FEBE306A363BB9A7C +:10C490003342D96ED0B6A2C0FE7868F2087CE009BB +:10C4A000C73512FADAC385D87E2E3684EB44C5E44C +:10C4B000D0CAE00B3DCBA4746F490F1FD1D6F3CE89 +:10C4C0008565424AFEB5D90162B945677354B2FA2F +:10C4D0005C7EEE85D812D6AE191EE84F6665F4CEA6 +:10C4E000F22537A07C0DD0FFA5967C4D121587CF85 +:10C4F0003396D993942921A67CA4CF471CE4B20794 +:10C50000A726F5DA930AC14FCD0A3CA024B2A69B18 +:10C51000E888D6912FC8D81D3A582EFE51C66AD148 +:10C52000AD8E0B767ABDCC05528CE05670E12BE1D6 +:10C530003994560AFC8D41A7B02EA984E38D5D5233 +:10C5400069E096942039BE78E0EDBB51013E7B84D2 +:10C5500014BE4FA5F96E21AD9084F16CF3358DD9E1 +:10C56000788D4BADFB5C95149D6EEA757B0416B619 +:10C57000E61F91F4A376E48DA64FA9DD3F38A338DA +:10C580003BB50FD2B2FE25C990CC63FA25583BFCCF +:10C59000FBEDC14F538290628C1C8769091DA0FB83 +:10C5A000915FFB8E1E2018BD2E828B11F59FF81017 +:10C5B000080512B7BF8823DF610068FC6D7B76C673 +:10C5C0009752AB3BC7B7A567335E42ACF408EA6746 +:10C5D00083D84C9AE9BF0940D08153C76F85275350 +:10C5E0006756139CFB855A442CF841711E0BA026FC +:10C5F000A3630636F9EE614C15619FCBFF39C62067 +:10C6000064FA546AADF8A0B3BDC6F1CE4F3A153501 +:10C61000F2EEF875A6AA64DFA3BC110BF5A0E6F252 +:10C620005C9970B35CB4A1E6372C00B4D554AE3637 +:10C630009EE39E4C070DCD79AD5B98D672CD986A7E +:10C6400007AE393D25BBAC3B3D79926766232F9CF5 +:10C6500041641BEE58945F129A5E074F8223CD59B6 +:10C66000E851793E899DAE4A0F327766E4DE8C99B7 +:10C67000423FAAC2ABDFC47FA9C869974CB324EE7E +:10C680009425DF45EE0206DFC6C6D318AD7ABC7826 +:10C69000935D0A2B6A1232143C2C36B2264ECF2AF6 +:10C6A000EEE73500A906F61B123C7D2CDFE6BB4207 +:10C6B0003E54B23202ED996285933ADF326A6BA042 +:10C6C0008021F0E79C4CBF16257C04DB899AF21888 +:10C6D000721418B503C9C0E1CFBF7E78A05E31885F +:10C6E00055E7CA30D294AA873FADFADF959C7EBF4A +:10C6F000B2FCDEE000F8D74BF21594BFE47CF28C7C +:10C7000080C17DD0D40D99D45578177822FEAEFC27 +:10C71000DADE7143DB76B14EE7C9CC5CD667549F55 +:10C7200098547093E7CEFDC7F6A58E68959326883A +:10C73000B94F21DCD0E023CDB7892C73429677C066 +:10C74000B48CBF369C5B39AAE43AA1146AE8012094 +:10C750001C45C7CAC25B3E658BFAD495BB1426AB99 +:10C76000D9356F2742C66AE09FBD84F2C16699AC95 +:10C770009D0FA08166B875DB8628CBC0F75146E9CE +:10C780005D107A8812983D0987A79BA974B222E7A9 +:10C79000E8E5B6B7975E6A4146091FBD74EA7EA810 +:10C7A000F4252115BDB553FB294CC202AD4BA01B8E +:10C7B000F12F5E4C4909390D2FF7ADACC384A49914 +:10C7C0003FA9D25F572F408D4EC4C0B51C5DFF32CC +:10C7D000296FDC954508073FB5EE2777D69FFDC248 +:10C7E0009695360DD09985D426B4677B3D112F716F +:10C7F00069C4DF4C1FF218BFA7CA1AE0540A31B748 +:10C80000BCB6B61BE1D5C8ED4B44ABD4CD497B35A6 +:10C8100036C7C706D85D7AAB94F12AACED7EBC3042 +:10C82000BED82ACE2595E0161E861FAA853C4F4508 +:10C83000CB59B1F906BCC4D362FB3FCDC944F54A1C +:10C840002AE4A088562972E70AFA9FE856999ED8EA +:10C85000771DB95FA0062468A7FD4D48D33AD7BE1F +:10C8600029151C9E80941DD8F2E7559375AF147C52 +:10C87000618025C366F33D9281EBD8F6CCF4F309D1 +:10C8800017FC1FD6279A0C4E063961325571B91222 +:10C890002424AAFDA84364B9D04614F4F28BA2392B +:10C8A000BCEB0BE25174975A27805459A14DB95AE9 +:10C8B000757F2B970705A649F33B41F09CF73B4852 +:10C8C00084A1008713708B372D266C824F96EB491D +:10C8D00088E6FAE9D9D5B17826FFBFA8D535F6584C +:10C8E0004EBCE47767C049D7C007373366F8C5B098 +:10C8F000B4D91905909A56837991028CD7F756E8E6 +:10C90000AF7C704963AEE27BC594D5407E8BC8781E +:10C910002F8D90AD05167F8EF936ACDDF6037B1FAB +:10C9200073324C7F841D146606C3FE8AD5FAC48810 +:10C9300084559071E4FFDAB1C37C3E2F4C51F05C1A +:10C94000AEB45ABE533DECEE83A0B8623F2A47B85E +:10C95000B6264DE06607E6B3E1C20CE3819A4AA130 +:10C96000830943B7EF2D5FE7CFFDCEBEA4897D23BA +:10C97000D6444841B7A2277D25158FBE4FD5CBE2BF +:10C9800092ECF6C705F684C17DCFCF3251733426C1 +:10C9900064BE625DDEF6FC3FB29AD9278A46D16456 +:10C9A00002C726C26F9C79CADFD11C1725CAD82CB2 +:10C9B00052F346515D667DE4C3009538E11084C1B1 +:10C9C000AA0BE3B124D803C6E78164BE1CB6A391C9 +:10C9D000F582BD4B246C2763377E89893303C4DC21 +:10C9E000D5E44A7DFCA85E734547D23AF2577AC82F +:10C9F0002A9431E3CAD5CEBEFC3BD5EB1F73177129 +:10CA0000BA334EAA0B3D8EAABB20AB39A8383340AF +:10CA1000826A17EDA26E8F6FBD2A6611822E846E18 +:10CA20004F91D0C217EA8515C6A9DF4BA967C9B1D6 +:10CA300083E45C3030DAABC279F5A56953915E5E70 +:10CA4000A5BE42E30FA2FD56D7432E1F7106621A00 +:10CA50009441452F3176EE65AF864E4799D9B7A3FD +:10CA600087B0CF188105AC1CB1D7328BDD5BFCE5FC +:10CA700081CD017FC57565DF366C3D4445F84C0CB2 +:10CA8000175C36D7787CD886F0ACA9CA308AC195B5 +:10CA90002655202114AE17B84F9979981ADBADEBC3 +:10CAA00035C181B1DA647BC3F21C2D4E66B24CA253 +:10CAB000B393A987011C7D2BD93E5D7A5113490D93 +:10CAC000611613D36C39A50D42F7DDBA0B27A217F7 +:10CAD0005C11A47E8F419FB9F63F5655D8262F4052 +:10CAE00095BBEFE939E6676BD3412157F18E8F0B88 +:10CAF000F441B4750DA55EED9BB6095B605C9AF9D7 +:10CB00004773ADDC882A44CFA4A8624D2ECBC0FA6F +:10CB100021D5A8E649BCE0AD0996D9B498B29EC724 +:10CB2000A2AD23F1D9C47C9D7D3CAB9CDEFDE747E3 +:10CB3000D1BEAB0FB540CF1D05285D21EB2BB3D97E +:10CB4000B3B3E05CD8A450992C23DE89C9369EAAE1 +:10CB5000D87EF3DAF03A395084DA60DAA7011EFCA5 +:10CB60008BCA202C26C66E656E3BFCD9B963888DB6 +:10CB7000D45301F3E5DC4C8FD829FD96D445E0165B +:10CB8000667E82C6868332EF7BB500233350B906BA +:10CB900080D0D00197985496EA486C06557A4F7C1D +:10CBA0006F87A453372CE200B1ECFD137972DF4F8D +:10CBB0005D2CF1FBE837F7D436B04D63A23C144945 +:10CBC00094699DB9EB67B49D490F701B8ED5DD3D0F +:10CBD000E753066BE382FF686B73FF39B5FBC24214 +:10CBE0000F3FC1197EB011837DEF6B9892293E6093 +:10CBF000407B43E103B4AFE61A71A2E2296DD2DEB5 +:10CC0000921D36E0EB48649236031344FDE0D410E5 +:10CC1000010CABCD2F08503AD9E07EF7DC18845ACE +:10CC20006D25D8D09F8D6568D47BE94989D9CB3CE7 +:10CC3000914671760EB8BADD32A9FCF73654B9D8F0 +:10CC40007FF2D13422ACDAAFB5E2BE68F3156AF4F4 +:10CC500080C4C10D45467CDDDD7ED061764BEA990E +:10CC6000702C6089C9A296798E489F30A482A7B79C +:10CC7000ACB29E273A802724D88C20C1FFCF99AF31 +:10CC8000B6A32DE27CF1645C520962D8437B4F96D7 +:10CC9000BD0D07CB82DD812D246BCFEA9DE4956B22 +:10CCA00041B8C7C978A4C4DBFBE5184B5D17709188 +:10CCB0005641831D7CBB1FF21568643D869F6E0341 +:10CCC00040976AAADD493480439870D5E70424432D +:10CCD0001E7B3DEC6EFFBEEA1CD0C62F5431881A75 +:10CCE000CFA1A5767B8B0CDFA32964704B5C86E318 +:10CCF000416A35B1A79E8D6BA1EAD1E30CF8AD7006 +:10CD0000A5E5CF4D3EF8004468DA445141F6498725 +:10CD1000543AE0BCBA14382DBF959B6EBC016067D5 +:10CD20009D7CB1CA722BDA85BAD47DF2305265E9A6 +:10CD3000617552B46B526438FAED796C7B65230CE3 +:10CD40003971137E6D593A5744FF9A655D89AA5E21 +:10CD500058D1160E9E6D98B95D7132EDEDDF663BD0 +:10CD6000D918BF61A369790108177CFE30F7644CBC +:10CD7000B125427606061272139CA25C0037CA40A7 +:10CD800005E24B8CF2B9DC04B44E9CFF13499C497C +:10CD90000C1A6EF742FC212D97E16C2C5B5492D952 +:10CDA0001E45FEB921416B7DDF4253C16E9534C5EE +:10CDB0000875BFC9D66B6E44ADFC030FBCB6552CCD +:10CDC00011F4061A62BBCA7A9C54082E5718CE5C1E +:10CDD0003D43C22D3AE45C9F06122BFFFE480652EB +:10CDE0005543FFE3E3D9E518D619FDA09C597E66AB +:10CDF000E2D42680078DB569FD397C0D4593E0D5D9 +:10CE00002050E1E23B0F7F1E1323A43BAC12A8D7B6 +:10CE1000E088D41D714436F3CFF731C126F7D748E7 +:10CE2000AE404E6C0E63E0AE1A39990C27184A4298 +:10CE3000FD2CB603FB4445837C8F7EC316E43BF296 +:10CE4000F2909AD6E134743B657F8102808D53AEB7 +:10CE500030387DD9CD692729D11AD8639D6FA0CBF1 +:10CE6000949336413015EF5CEB4B5D24946FAFED3E +:10CE7000E332A7A3EB2831153BD53F76F5D96CEE0D +:10CE80005E33CE69E1B137041B447462C674919578 +:10CE900033C06F2542F3DDAD09DBF727A0F22DBAD1 +:10CEA000713CCEED7D8AE3AAADA0F3EAFBD60FA8D4 +:10CEB0000CAFC260E45D9E435B6FA3C33B506E3C0E +:10CEC0002AD36D66DB33C70B38573ACCEA5823D8E0 +:10CED00097019C2B143E2DB41A1F86DAFF2DEF9478 +:10CEE000E479A4C99FF026AB4317907669B298E025 +:10CEF00014020830254285F72D9AB93CC9F1958373 +:10CF000067EABD79138D4E3155F502D6EC28AD5F39 +:10CF1000F4D91EC398BF81EF6D7D3AC410ACE2D541 +:10CF20009C0EDD0141F0FC49113EF825943DC126DF +:10CF3000A8EC52EF8FE5E9C3CBAE635F607B71B2C3 +:10CF4000A5925EE67D41A092A9BFBFE29BC6333A9F +:10CF500038DBDFE96B84FF8AB1E4C15269FEF51E5C +:10CF600016C417D43A8B9BA3C494B71EF52047551B +:10CF70007C605D273568F037A33D3FA10B5FFD2C3A +:10CF800012EDEB26615B88DFF861E1B4ADA8978212 +:10CF90001F9FE3C7E6B9796A8FE2A341FAB93DA1C1 +:10CFA000483624E0FE50FDB5954CE14C01B09106A9 +:10CFB00098961F1AA1CBA52147358E55215A8BB2C1 +:10CFC0009D6B64B1667F2C90885E36B03CC122A117 +:10CFD000F76F8E7F26E1F4F408F65023AE8EE4DC82 +:10CFE000F10049D19EAD2107D55A1BCA27B822228C +:10CFF0007CB59E73BFE173A6A04A5E787F1BA72213 +:10D0000016C8992C8EFC5251123919F030EA9E0242 +:10D0100079D94CD9FCA41499074C7142E3C9039007 +:10D02000AB22F78D267C1555CFC75B34CC9600CC50 +:10D030006A5ADF0ED2CF0554CC876E2689DE56E2BF +:10D040008C141C24C194D263673E7ACE10B1FF0CBD +:10D050007F2DE93BE101F265D63ADCF559FC7F848E +:10D060006C56BA2CA3F1C58693F2EBE58F86CBCA3A +:10D070000B40E14626AB31157F6DA9DFAB4799D355 +:10D08000408320D0150C8638087C6D689055A3F13C +:10D0900094F8A3EF62E69BEB963F6D213E777B828F +:10D0A0008DB8BC5B1600B43D69BC9DBB03216642D4 +:10D0B000C2A0512115FE6F3DD1E309AFA8289C7392 +:10D0C000EA1E47E1FD5172D243330329875AB94022 +:10D0D00012293544627CEEEFDBB1D8E14899EC4B84 +:10D0E0001A955E614B8E232065B12EFB475AC8D935 +:10D0F00098C7783A2839697749ADF9B170EBD48B84 +:10D100000A133052FCD8809FBAB198546DA94B6F66 +:10D1100097752824A73D70145663FB1D618ADA14A5 +:10D12000802DFE18E0EB1E983F41A5BC2C97218A6C +:10D130002563372109DFF6A40D4204AA6B00D1292B +:10D140008DBA79CE2CD2F18762A2E78FDCD6F2AB12 +:10D15000A81D11FD3647810545A3683F67D1D7B0AB +:10D160006C721B69A6B1C21EDF08B7C17EA302653F +:10D1700027693F69E2630A020F6A629A1E28D5DDB9 +:10D180008A991CC82EE19AB08DB486086522295D63 +:10D19000759B4828D2FB669D410254F7B4AF928E2E +:10D1A000A0FC01A4A202827EBFC1E57150F6948268 +:10D1B0004F9864FAA74E7DEB91107AF0B43B499BEF +:10D1C000E50D607082EC1D9B55E5CF865AD8CD33B6 +:10D1D000E614AE6AE3D5E66A1A9F801F491EC3A013 +:10D1E000180A192541798BF5D4517EB9E032F3D272 +:10D1F0000E91912D26F23B0D8C1586EA76C76D3186 +:10D20000AC3D11AC29059A637678FCA856B62FDBA5 +:10D21000E3FD8530DE90F1E4B60BD44C372765EBA7 +:10D22000754BD252CFCC17751AA6FFB397B1E2F85F +:10D23000776B51ECE581DB6E3E7575C8F9D9F6FF69 +:10D240007B8AEA0E8152688F5A0E3365658B684679 +:10D250004A80CA2F7B254065E691C84DEDDB68C545 +:10D2600012EFA661ADE65EE0E0995069B196E2E0AA +:10D2700062D266AD1BCC7F8B6EB57671404430397F +:10D2800015E86AA57956B97591EF0B147D7C1B9A48 +:10D29000259B1420D61B5B710BD88C42573CC74E84 +:10D2A00066C96BB69FEDF1D01948F4902D87428086 +:10D2B000252224DFA0AF6DAE2AC4D4188A94E58B52 +:10D2C000589B28560ECFA04D13F83ED3C6AB49E766 +:10D2D00017DEE86448C293B2F70ADF59D04B3CAB83 +:10D2E0003720AF768542288518263C4432C71DA6D4 +:10D2F00066E97D6D172A1491E8A485A3C11CC8694D +:10D300006BB941C09A38AD7A0B07577EF97E6885B4 +:10D310003B6A4944C5279740C289648754101C1E44 +:10D3200017F3B35D36C4DB91760C320D7996C9CE16 +:10D330002269180E59764C71E5F7D504EFBB7D9143 +:10D34000E1306C3EEF99254BF29815FB4FF6360510 +:10D35000A7CB0FA79A62945C2B47A85BC83B44B14C +:10D36000B0E62A57DF288BD7CA0A99CA2C0FBCB55A +:10D3700000E71E2CBBFD5D9F902A113E0F5DFDFD59 +:10D38000F51812815E6C7746E2E90458C0A18E95CB +:10D39000EF44D82964EC70B28FA90F294DEA60746C +:10D3A000B8B25FF4C0C0F6D34AD51D475C552024FF +:10D3B000FC017BF3DFB901157EA08DAFC4ECFB311E +:10D3C000E1E4B203B0BD29F19B712403879DAF4214 +:10D3D0007F0D0760C09F353C94875F40671DED3F20 +:10D3E000C4E02E96A785E7BF01FAD1EDE81A94664E +:10D3F000B99E59F96F8A215DB065F6453E61BD124F +:10D4000053A18E6C0DAE8215DA0ED6A686F8DD9687 +:10D41000A35FFC064E6EC765F334181BB7329C49F8 +:10D420009BE9710ADC19069FF863FEC348AEC38A04 +:10D430000608256E2DB6E223E9B707523BD5017BDE +:10D440007B7C1E7E824E6530C355FEF5A40F52A331 +:10D4500010E036E3E168CA43EE36A724443D652375 +:10D46000C30BCB55F656844555A076EBD34B1B48E2 +:10D4700064B53234A4782207D2E69E5B30D331D231 +:10D48000710183611B6FDB171EEFDFBD6A62B4B9E8 +:10D490007FEA8154ED2269FF40F6F2BAA34DCEF344 +:10D4A00082D3268E02575E33AF6B665A8D7DF3872B +:10D4B0001715CF69B5B4179ECFC98311AC2FF5628C +:10D4C00024298606AC518D535FEFED48FD7B4BF46C +:10D4D000401195C3FD6FC15D16582811511091AAD6 +:10D4E0007EAC01B168DCC7EF225BCE014E723B011E +:10D4F000122578742D1C96B671CED95C16A7271B01 +:10D50000AA92BB221B64DD831BCF308D83C51C2EEA +:10D510005DB7914A739F3675EE779A85617C5FD7C8 +:10D520007A64EE3A3FC78FA46DF89A4CA9B638C713 +:10D530000C0251FABC992F227DC7F5AC35633B94A0 +:10D54000FDE950D819040DC253B5AF17D82DAA3133 +:10D55000C5D9487049F119999A63027CB725E8103A +:10D560008752EBCD8BC3C91BEF0345833371F8ABF7 +:10D57000B348C2608EE4E3E4E8E33C1F3B790D3836 +:10D580006EF45092A17B276404997A02BA299AD743 +:10D59000690FDA32DC85090583F1B9F21AE37D3DC2 +:10D5A000E4EC613A050D5EFFD094E4A3997720186E +:10D5B0005F9B87CCEF80B1A7B17CB22194A7AD93DC +:10D5C00082B5901F0D24012C3A94D0E898D006B370 +:10D5D0008460360851BDFE7C3E3767CF8CC20B6637 +:10D5E000FC5E2E7747F341E2B85A7733AC64EFA480 +:10D5F0009BAF2925FCC00DB67E26C8730D5DB8779C +:10D600001E68533DD600409712D56A6C50A3172F61 +:10D61000C82A9DF6E3A04920F3DDE15E671CB2FB5A +:10D6200087671C7F1E6DDBF7E62A3B93447DF93943 +:10D6300029308DC908CAF4E006DA5DF4134064109D +:10D64000D0EDE0E026498BFCFDB951441ECCC80E5C +:10D65000DDAF3F9CE5BA7C77E24089C7D8B6183782 +:10D6600089FA0DCE7F18FF42BB22EBC42C9A1F2FE4 +:10D67000BB58CE7F2EB44156249CFD86E8EC5191D8 +:10D68000F80A0589C49E6F6AF2E82507D2B92A70A4 +:10D6900026A6CA778D39F904BDEA1A6CD94AC3D8CF +:10D6A000339D712B99FD9DA8E429014BD7D1A11E73 +:10D6B000FFD406060CA6E904DD2F7D6C7BF9771DEF +:10D6C000D2715918006140FAB467F840A350F2BD16 +:10D6D0009C7CB1177B4D7FE1F5D758BD9190A77326 +:10D6E00071270FA9997819F6EE24DD84EDF9B0B011 +:10D6F000D8B4FD48FCA6386FA0E926654DB32A08CA +:10D7000013B56124EA8ECA1FCCA68FE9EC128401FE +:10D710006D13EC996E8FB0FF700A50457C0BBA55B3 +:10D720008AB18A2FAB051EEC0D6D4203443E9DA7C6 +:10D7300087F7FA40D8DE5BE8752FF32A7944BE2FCD +:10D74000FA115A7F4ACF581125F26A082AE3117D4F +:10D75000AB9107A5A02B16569606369D57C74BE6EC +:10D76000A608BA913D736C9131DBCC98DA96FDE452 +:10D77000F4958044E764DE3F047C01FE6CE0AF7604 +:10D7800029055982E9B26D83F577EEED041A98C840 +:10D79000F49C0B38A9CF9E92C610E9E4EFE0E306B3 +:10D7A000D7E1FF7245CDC80FA3D5EF6E3E087F5578 +:10D7B00036D61FB05752DEAC8F01618F2593AF4B29 +:10D7C000D676C3A734093AE761435615ECE3216ED8 +:10D7D0004A1B083B584B132A2D9E9386D87093E31F +:10D7E000ED2E1CBC3F25C69D969BA33D8756B59745 +:10D7F000936C6CFD191FAA2FECC6E0B1E9D052C2A0 +:10D80000DA30563A2102A3DB2F8156924E40193866 +:10D810005A18135E7FADDCA61366369A6B6C1D2713 +:10D820001FEBCBB2E0EF9AE1191F7308960833BCE7 +:10D83000A098A140A78FDEAF5F9012E4E3F712A596 +:10D84000E8A3E511243551E7CE6D587E6D61C1B96D +:10D85000DE6194449A4DA04D0B857D84A69E82F690 +:10D8600002247B20BCAB468BF9E7E6D93E2B302562 +:10D8700031590F2356113E104493FF3B5531A1916E +:10D88000BD572ADD66F75787CDEC1F55EE61C6B54B +:10D890007A3662D75E5361DB002771262B3FB8A62C +:10D8A0004026A9A5414BBA5B404C07EC4B5E2DD9F5 +:10D8B00001C49C53F908D683FA503E866289DBC0C6 +:10D8C000DF84D4DEBF25482CCE2F70A089EC8FF9E1 +:10D8D000930B149F933025268152A31C79D7165A97 +:10D8E0004CE20083DEE482E37EFBD53967027C886C +:10D8F000A063069B42CDD7F8B3A8B99B4B2A0B96E1 +:10D9000071499003895B6B76BD941E1BAAE91A01CD +:10D910008C0F205AAED295FEFA0BE98409EEA33B98 +:10D920003618E19B506BC0E19617F60FC8FE2BF737 +:10D93000396E93BF99ECB4DFEBC04419E287ECF485 +:10D9400039B7DD22C6EEC4AB50B5D2382A36C1DABB +:10D95000CACE37D44CE1069FBB01F698E788DABD02 +:10D960008E57C7447F39B3EBD2B0B227F7A75C5AC2 +:10D97000923789DFDBA761A9D205FF01230F60176A +:10D98000DD0FC03D92B5333410EAFDFEFFB383973F +:10D99000589B5BDBC48254AC963860168F30BA87D4 +:10D9A000B30AEB543D34F7FDCFFE9DF141CFD8DBF8 +:10D9B000AFBAEDFA155061E81E549C7F67B2A62FEE +:10D9C000872C94A44227AB3FADA0A2DE67F4BE87AC +:10D9D000E46571191035872EB29386B725018FFD46 +:10D9E000795DF5D78D595C766D593B4F00D68144F2 +:10D9F000F4C3E6F499DC340480D84E8B1B01C1CF0C +:10DA00000BF073505E0E39DE1C51266478707F581F +:10DA1000F68EF83E850448614ACA601D479EB1A44F +:10DA20006F48B1988B8559F7AF3B4801B257B5366F +:10DA300013D7EE36F251B478C621D3831B27A2FA4E +:10DA4000496CF008D654F4483E9A0863B65F48948F +:10DA500058A40276915F743D6657620EB5D8DA46D7 +:10DA60005F3B91A454C09FC8A249F8F95E32E14CD3 +:10DA70000C8E466ACBDA0232BEDDAA94C93D2DFA7D +:10DA8000A7E7F1B91E45B078C83D6AE4FE15183A1B +:10DA9000E4483EB57670B90EDFADA25B7C0561B09F +:10DAA00040409DCDB5A8A09485FF2932219DB0DBD3 +:10DAB00094618613A2D4C533A935265D5714858396 +:10DAC000A89480AD6A2B8D45E24A93A9B2766D7613 +:10DAD000DCCCE3DA0628067FB179CD04421704E2F4 +:10DAE000ED6A774DFEE3AA6F735FCF80AEDF0AA3C6 +:10DAF000B845D0C038E23E57DF002C931740BD0830 +:10DB00008AE7CAF6707BD61A2016C940F8866CF8E8 +:10DB10002A7BB33712497FDF1A989086354CE28210 +:10DB20004407FBF9B4830ADF256AA1EB51C40D2F2A +:10DB30008B42C21E62651C5F56F5259EC6FA3D30BB +:10DB4000C4606FFF2E00462C17CC08FAAAAC8618CA +:10DB50009D366D34B17611CCC294966A44DA8BC28C +:10DB60001624B1B4A46AFD5A76BBA9A2226D4366FD +:10DB7000A150397442C817EBD0F7F2CC0934883879 +:10DB8000B938AF451C27BA7CFAE1DF8ED7B9B32F7D +:10DB9000CF9422BAF36F25BC7728A6BC9848E14EF3 +:10DBA000DF6F04A3CEC6DF9923AE76D0DDE6840115 +:10DBB000B6F8D1D88184F23421239147B37BCDEBE1 +:10DBC00029D1986EC1EA26DB1D6A350A9A14854070 +:10DBD000C673B62AD4407EEF1B3317AF064BE6D48C +:10DBE000FD831FF7F4BCC21279DA26CAE0EAF1DA43 +:10DBF000AD4D982183535E8FA57884004EC85E3169 +:10DC00001706DEA25292D128CDD83E0482F328B95D +:10DC100086AB1AFC4FBA4F637A3949A77A99F28BCF +:10DC2000C562DA02FBFC93192139E652A8E005E04F +:10DC30004B689CA761D14CD55B4F4D2174BC7E864F +:10DC400088866777644BB757894508F633D1DB0080 +:10DC50007A265E759A3585087DFBB37C85CDE7EB2A +:10DC6000C533C8FFBC57084902AF8B0A0705190323 +:10DC7000D4E40FBB0E155EB0B9592D85CCBA61B195 +:10DC80003B042196704BDE6B750ACEC1024D1FA876 +:10DC9000D77CC0B4451897E71ECF2DF77B191A53D0 +:10DCA0005283C883998CEFC0B9CFD2FCC1BCFF8727 +:10DCB0006EB2EEA7FF8819B1C2696B069440891253 +:10DCC000E60D5C39B59FA0EBB471DD6A0B9E4EA1E9 +:10DCD0006148975D8E8507EF87AA9B45A67FA400C4 +:10DCE0009EB85A8FBC0826F47128151DD8E553F448 +:10DCF00076BAD5B6E3B816EF306694A52B56DACFD0 +:10DD00000E4CBD09A0EB04C9B3455E17D5F080C623 +:10DD10006780C1B29609D12FE58BE480D0FE152231 +:10DD2000BCDFE74C46D0775689E68472E63B413A41 +:10DD30001797C5DE2C6A3793FA8C7EE8041EBFC69F +:10DD4000C71236C87E601976209BC3CEF668AE2710 +:10DD500008E1AD1A06B029370754AF4BDE1E254641 +:10DD6000B13C804D7B8DBCCFEFA3E2D1BA642F5480 +:10DD700089E6AADE44F07C370F7824EA466FA8874C +:10DD8000B241AF81EC3FE9A46BDDAC3BCA34CE229B +:10DD9000CB6EADDD2CC8C8CC7FDADE5A14047473A8 +:10DDA000D980512660E9C6BE007CF680013945D194 +:10DDB000D33F01E63497F58C4966A57C1F48E3FA0A +:10DDC0000F7001656C5AFC6E990F67D2781C082E93 +:10DDD000640BC8BFB60494130AC33D9ABECA89BA7D +:10DDE0000E8073664640D1BD97C6C30AB5705D7795 +:10DDF000A2A098BE72E12AEB808029978050135A26 +:10DE0000A0FCC09FF387894008C7AA32C09AEBFDE7 +:10DE1000898ACB13304FA51DBBA3599AF4B7A4210F +:10DE20003807CABD31EF228BA3957C9C978A4BD6CD +:10DE30004517DF707D90CDF3947CC8DAF9D4551A7C +:10DE4000CD417DE71A4B0D0E20A4A8C623801E2FBE +:10DE5000546E015A347AA9B58DBEBB5077101E722C +:10DE6000C1F274504A0ED26758C2CFB3576C86E0E5 +:10DE70004BC3E9D5F03F7CF5E42CBC2EBB1272ED10 +:10DE8000B0B0CD5E925A545E378F8B2642F08F0031 +:10DE90002AF72E65D25DF07EB81CDD45B869727137 +:10DEA000B4DF69B914B26D2A7F78FF6DF1EBED1C18 +:10DEB00070C88A3A68D79892E1E8FA9E7EF52D6993 +:10DEC000AD97013F0AF66944078218CAC57ACAA10C +:10DED0001C51CDA6A78A179B54EC9EA653AD51A109 +:10DEE0000CDE0B275B00CB98AEF12BCE1641CC3469 +:10DEF0001B79EBD5F3937E4025AC5735264E8F89A1 +:10DF00003267DF7657FD970477358D02424CCEAAF3 +:10DF1000003E161DF8EFDA0B367002769CC2AC316B +:10DF2000B840BB59737EEED1320904CF01099CBCC5 +:10DF300006492A22BE59D17B6C2B5C570BC8ECE8F2 +:10DF400058DAD40CD5F38B150152579C2C9B97971C +:10DF5000861847523B8B5B17E07864D0B05862203C +:10DF6000FFFFCD4BEDEBC50CDDBB94421130502AC9 +:10DF70007C7CBA21B6EBD7369C25BCDD53644E2899 +:10DF800029226A7656AC5D474D0F621C4B9A6C781D +:10DF90009A55E357DEB82371AE0F63E4F1ADA35891 +:10DFA00025A142357B530C0F1E1A3870E77537F6E2 +:10DFB000481632091EEAA31580BF09BE4F27A3CD1C +:10DFC0000EFEEB3BBD9286CA20E9846AF994D273B7 +:10DFD000B05C6E030233A678C207BB25B19CF7374D +:10DFE000918C03FC9A6328F25A7835B14627A8979A +:10DFF000A934F4147F2B44EDA456E2525326535611 +:10E000000C18D2586D85468D6AD242E28A095E8D1F +:10E010004C1A127EC5BE1A3132947BB07A0857B1C1 +:10E02000359297FF3CD6F86E81944D6462AEDE2641 +:10E03000C62FDB8471762CD4208C00A7A587D9DE6F +:10E040002A6E9696457763146EB3F2308281B56579 +:10E0500040F376D163AE90DCC84DADC2D2C31CFC98 +:10E06000022499A2F8BEE7322D05AD9FF807CD8BAB +:10E0700034ED992404F5E5B31C36D3FA2C40129AFA +:10E080001444F4F18C7F65EC6AC0268A2F60CDA021 +:10E090006467BD1960D1F43005AED61FB482C6CD19 +:10E0A0006D8F21CD02A809993F655B8581B092F300 +:10E0B0000FD4AC96116A7B8156E59E52CC2FC98E47 +:10E0C0007BEB2CC78E04B93EBDCDE36A1EECCDDDE3 +:10E0D000C7273C6E58C1AC6EA74EB4533CB6AC9645 +:10E0E000F8EC6EA478DE6492DBACAF276424782869 +:10E0F0001A57BA4086D80FB22A072DD26FBD934B5C +:10E100004FB84F4B5BCD801C009FCA63668D9B410F +:10E11000B1D1F3E6DBF91AE489FC183581342AAA77 +:10E1200076C81D005E7B48525218E102D4A5C97A18 +:10E130008F316CC44A64B340472B0E4D08E2F06740 +:10E14000521664DEBFA10D1EE69F9BD9A96857A792 +:10E15000B3F0B63E4CB984CD40C4B036C0A23463EF +:10E16000D579B43B3F1B7ED2184CAAC0B894CB9251 +:10E17000FB4E5DBD7C81F3A7C687C07CE1210B4FC0 +:10E180006B41F0006086C18B07433221A427CDD2BA +:10E1900031623C1B54DD75C3681F78A24819A7BCC7 +:10E1A0009F7C817BB2291F7B3665A931A9A4673684 +:10E1B0004616F77700853168AA724C43AEA83997A6 +:10E1C0000D6323AA85D5A7F54EB49789C9B81AB1AE +:10E1D00064F427A1BB2E1860A3F32FC5C13CECAAA1 +:10E1E0004C69625311B798992372007F700DAFA1EB +:10E1F00074F6F02BEB25A9447E4CCEA5BA28CED0E0 +:10E200004F881F723FBCDE7E6B33C4D3C547B64117 +:10E210007C0A3D70317D85AB65A2ED572AFF59E13F +:10E220002B77F5E95007AE1BE9440C8BD76C44E320 +:10E23000F5B218D6FF5EB3AB837C23FEC3CD068E4A +:10E2400007C47A8197FE4CD4E9F00D0DEA243DCF46 +:10E25000FC48808B02B10B5398C4FF8EBF3C25E471 +:10E260004FE2D6478E454D38086A30723EA2594F6C +:10E27000045118BAD77F4B96DA1F1AA465E6CEAFC1 +:10E2800023A7BB08D6EC483F8D84F26BCCFE660614 +:10E290003A0552F814942D79BB993F0B4D090C0D9A +:10E2A000FFB187065F36791B882B039CA737320A9C +:10E2B00095F0EBF64D6557130DB7950B94635FE042 +:10E2C000EA02169DB7C8EFEC371686EE9497F94E22 +:10E2D0009C02388A72B3C57C25D7FA88DD4332FCAC +:10E2E000CD8D71DB17252C866C7122D32662776861 +:10E2F000D248EDD28ED80BB77A1B0323B28939E20C +:10E3000013220A4C0CC3215F4B2707630BF550A364 +:10E31000DDD0DC68599C1A4922A144FE5C0839E82A +:10E3200082A5937E67755D5ABE67ACC9468014D6D8 +:10E3300004593D4CA8CEA0A0260434ADFD6ADAF6FF +:10E34000D81D53DAD11E4397C2D97A722D826E1925 +:10E35000C5D9C47F748C4804B7A5FF305CD3D2B351 +:10E36000ED10C70AD78C0647BB015B64FA338827D8 +:10E3700023CDE99483437E1AB57348F17893AB803B +:10E380007596946FFF138C0EC1BC6E44B60C46B9E3 +:10E39000003DECEFEA1AE75127EE57A43299FBBD96 +:10E3A0006577C9B4EBEE82A25CB5BB0D6989598271 +:10E3B000EBCD129BDF083E0292C487FA4C5F5EC031 +:10E3C000CD342077D2DA204DCD5DAA43C04BB13A8F +:10E3D000D8AC6508630CE683D9AC203F9431FDDEF0 +:10E3E000FA9B86F537C98A246FC76E791C07EBE163 +:10E3F0002BC034CEFB088D142BF114A5F8CB7E8BEB +:10E400009C1606610F91FDC0EFFEF4D1EB1EC11505 +:10E4100056DF29A4B2C5ACDCC49087D1BC78BF9FBD +:10E42000F4529F6ED55F7464950A2DE3C7FB855146 +:10E430005076AAFECCC6E1C14E1584F1F627DD5018 +:10E4400088DAB52C6F48E5E9CD66AEF20A6492F63B +:10E4500091D88A6F680F246CFC36817051A0E5B7A3 +:10E4600097D36AA156A99850BB646BBEA327E698C0 +:10E470003FCF75BE9139B763E00AFD1D51E998FAA7 +:10E48000C777D4D98B3494E2307543D53EC3DD1BB6 +:10E490006E6380B3F55B2B5B2C235AF077D3E65584 +:10E4A00014779BBE0ABF997296581A2C0C5EAB4922 +:10E4B0003951467900CA0391176DA5EFF88A79188A +:10E4C0006848A7609DDED4DCA8F87D0D7412465321 +:10E4D0005E13183C1E926290F4F39508A19C7F296C +:10E4E000D13989893E366D3A83462C0E72622F9956 +:10E4F0002CA1B93C786B733ECD672E14BAE9C809DC +:10E5000052C764194FF987DFC09A34FD9F3B6B4DAA +:10E510006EF80859A87FD52AD24D5ADD24E55FB59B +:10E52000B8D4138F4174A4C39779C4DD7CB48F270A +:10E53000F60C8EE6DB5C1658279EE6A6B7EB2A7A29 +:10E54000AF84B666B4A6C6B7DD67578C401D42C619 +:10E5500045786522A71016640EA9D2F10DA0EC5ED5 +:10E5600076BF41131836030A34A28B9CF0565E9492 +:10E5700083831D7E1722C21AE83CC7E3468186E1E9 +:10E58000D643ADC063DD9727EDC4511B0A8368A550 +:10E59000AEABAF96C0A00645404941F53C28645754 +:10E5A0000EFAC90BB8FC5E8055BA48349487E79ED2 +:10E5B000B4C1C1562B7F56DE7DF1B002A717A47BF4 +:10E5C000979B46A7B01FBC52C5CC17D65158F0E850 +:10E5D0000F9FF15153D919F6EF695C007E8C3F43D0 +:10E5E0003CFB3888D205BF71EB75C001C802820AB6 +:10E5F00037EFD8BAF1F6E2939F46684AD36635D42E +:10E6000046511606D52C4DD87F29DD9355405CBD6B +:10E610000D7188EBE5C88FA13481CD58407D63072B +:10E620007D96976996F4951FA173D9C34157621AD5 +:10E63000F7867045DC47A9FAD4F302BA4B56706CE2 +:10E640008E75ECF019B61D823C04A5E7BFCE2F5D98 +:10E65000BA5DF80AF7365B542AA4D092E7D1B1F438 +:10E66000197712F35625CA49D00D8CD3F3DD6C010E +:10E67000598280EAA2FF042D2070A17599052223FA +:10E68000AB6D43ACEE470B5E23663704E1D6F37601 +:10E69000088013B2328D2D8AC07700CEDCAB4313D5 +:10E6A000FEF3507419BB0BD9C412940CC15060B264 +:10E6B0000CD414E5F670DCC7DCD0F1B70AFD395E86 +:10E6C00009BA20EE6B3308A6DC5F9C0F0EABC98540 +:10E6D00032E454CD0A73EEFF2D0AAF0EAEDE479240 +:10E6E000AFFB60455E3075734026D2D2041316A08E +:10E6F0000487499252CBDB75F138E4DAD428990DBE +:10E70000E46ED964D4A6CD4CD5A0C6F7754A493A73 +:10E710002680A0F1E0D8681A6308C5A82EE309098D +:10E72000E63604304060340E4433022F8EC43E0976 +:10E7300003F3D62903E6935C28D9A8E6619397B73B +:10E7400052A7DB7256D07B2D555F9962B940DC41F0 +:10E75000AF3906937B931D816389E0802683CAEFDE +:10E76000B89FD7262140AFB8F52220347E34952EAD +:10E7700010A6937DABA6274B6478D774A4D6FC284B +:10E78000E2927E96B65160BEFFD8666D7F7BFA41FD +:10E790007EE8E6350F9E39DEA704FA751C1D17AF1B +:10E7A000514CC23DD1DAD8D58619A5EBFFB99B9063 +:10E7B00068508DAB63324C7B681BCC4E3C79A34BCD +:10E7C00047F64D26CB1BBD292F88636690AEBCB59E +:10E7D000CF9B4CD0250596CCAFFC76282AD311319F +:10E7E000490F75D199F86D5A1145BFD6D777C7B97A +:10E7F000171152445C5470ACC1D3D0AC1314B8722E +:10E800003A96120E465E921D2279C2A28E2ECB0639 +:10E81000857569C9CF19DFB2DCEF1910B0B558158D +:10E8200047639677C8623E831B11FFF72ADE258770 +:10E83000286A46926DF14A21AF30E8D0F5F482168D +:10E840001D14B066E1048B06417BF0743AB79F2734 +:10E85000630D6B47DD7FB49D5DB9E64F600CE09AB8 +:10E86000AB3EAA028EDB0A39AB75B822E0D365F065 +:10E8700062BAC0BE098BEA6988B0B0F1BA8CE6E42E +:10E88000CB35EC05C073723F8585F18767801FCF5C +:10E8900023BADC89219CA91D5718861E985AB843B3 +:10E8A00056377A05B834C04B399F542F5C621EB07E +:10E8B0001A8B78B6888F2EC6B335C0938F50831DC0 +:10E8C000CACD9E937C803B9FD24539172CB71279D5 +:10E8D000DA5AEF1DE3119731A04843CDF47103E8F4 +:10E8E000A3B7F281919141E6D3C3B7795DBA1823FA +:10E8F000C6835C71D98880CAF472D7021224BA3FE9 +:10E900001CF916447496EA0BA6D701CE532E6A1A48 +:10E91000D9D65B8E5ACDC32A6A335B1717DC9D1D8F +:10E92000981DA364D851E06654A94CE2D0082E0C7F +:10E9300072630953610B56EFF1CE350AA364056784 +:10E94000343F59F06CAC2394BF34EDF7CB93F1E92D +:10E95000C007273BF232E0B128113CAE1A6F52A13A +:10E96000DBD8C9721BA5D2C08E188C334217BA02ED +:10E9700034AEDDA8E6BFDA070304878BAE04675820 +:10E980007CF9DACA926296DFAF8A79B04800F9A1C1 +:10E990004EFBC9AAB9707D6CC3CFC8C5140E80F3F5 +:10E9A000115661B54AC77B5AB3A03F3342644B3519 +:10E9B000B4D77029A4B826D26AB79BD9917E3C1AE5 +:10E9C0001BBF476399D735A5E42D69765A9ACACCFF +:10E9D00008D3847EE639715698C471ECB1DB8B2D77 +:10E9E000DC4AEC5B025B310F0BF016F5BEA2639DB7 +:10E9F00028E889F2C2A4C1C46CBC3FF8FFF7FD70DF +:10EA0000B1D98AB15396415C923ED64C24762EE31E +:10EA100039FDD77443A777D4C5B816A1F00497275A +:10EA2000883D8435DA8B65B1B753E729B63346990B +:10EA300079788025DA2713B8F209B4B111F6A5A6C2 +:10EA4000F43467974A4A0BE55FC9FCE6F48E9BCB2A +:10EA50001EAFE441A8D97DC30D8132301E55728EA0 +:10EA60008835FE5AEC40AD3006B468BC08B9013DAB +:10EA700030B0C2A39A4DFD053DC3C8A6270FD8F9F3 +:10EA8000F192FAF2DAC61F621D61B3E45DA52BA014 +:10EA90002B7E18B070EB00D90BBA6C283E0DBCC0B1 +:10EAA000EC6C3E93FD3B7CFC39B6C15371D85ED70C +:10EAB000922EA4BFE2D2328967BA0DB5054C0B5E27 +:10EAC000B5922458ECF899B31142B3832859030046 +:10EAD00058B1A03CB8D20851D53FC5E12A315640C3 +:10EAE0001547C0791B9EDCAFE92B56AC7B0A5F351E +:10EAF0005ECF9D899D52222CF7CC809FAD19F8E501 +:10EB0000A1B7729C51F96C7E37C349F542DE2ACD1C +:10EB1000B8E5206C0CDF22247CD5090FEEB06F50D5 +:10EB2000FB7B8A636318501C6E33F2D5F8935ABF8F +:10EB3000EE95AAB9DBAA8E00227BA42665B5ABC6EA +:10EB400046A948908EDB6A19D698DE50B20492FB33 +:10EB5000584450ECDC08C55837E83E88EDCEA3AFEA +:10EB600047C655AE9BB99778F6C028AC8DC884D9F6 +:10EB700002237AEC164883B154AAFD484682032F3B +:10EB800045C552B9F6C46E413D238C098B48C22756 +:10EB900047CE0FFCAEA542BA71441A79F18AAFEFA5 +:10EBA000A607D8EE45C246C58499E39790130BBFDC +:10EBB00025122ECC5081839C9A38C35A8F28D52297 +:10EBC000F565D27CC1890299019BFE554675EF58C7 +:10EBD0006915FB663266B2E6E427DF4D4ABBF3688F +:10EBE00088DAAE00C98F25C7C5F40CB2A1443F3DF9 +:10EBF00048484C7A2198901F24DE861468D164CB53 +:10EC0000F6757D6321955A50E0EBF8CE1FDCC310FA +:10EC10009D6D299CDEB12338DE6B7D518CC3884508 +:10EC20001E492EFD6BCEE9488C5DA501DF4019E23F +:10EC3000A34CC051A7ED531A466D84B0EC9170E916 +:10EC40004984E8C84F97A4087728E64EF50C670377 +:10EC5000FFD219F2EEA40D83BD0113B28F24F53754 +:10EC6000ECE6F3B01C5625CADCF76C51AAEF475D01 +:10EC70009424A499FBC5C3DE5C88824AF46D9EF59A +:10EC8000B448EA9B24D792C48CD485A0C25B5D0BA8 +:10EC900014426904A50079F21F08BDC6D29991AB50 +:10ECA000A8B62A9F916CF4F8B0436E44B94975A098 +:10ECB00048E6DC14AC75D3D6B84B2CF10D8384F345 +:10ECC000E1534CB518F007836B76FDDF331E383DFA +:10ECD00010BC118F91720410B1FEA7C768885E63E3 +:10ECE0008BE471FD73256B79A83C552623CE4DD658 +:10ECF000C5B4EA0081BD39FE84A578D05DB39F4CD0 +:10ED0000FF79CE1EC28E49BDBA2B4F0A701095FFF7 +:10ED10008FB58D409507578EBD706FF6CE68B6944F +:10ED20005C70E63F8D5234342583D2C42D6A9DAC8D +:10ED3000C3F0A38AA8BD67453272481F684AB3F77B +:10ED4000AAEAAD458E407E76185575FF73E8F56DDD +:10ED5000E30E6F66BFBEC89247545176A21144219C +:10ED60004877BE70B15A03F33EF8FAEECFD09E3624 +:10ED7000ED9B8E1CB6AD296537504DAE60B652FC8A +:10ED80007A00D12F24E98ACDFAB67E77FF132F9B24 +:10ED90009E6A2D1CBD4CAAD8AC6194E38DD2D4B927 +:10EDA0009A0F8EA372A18195D7BC603D5C9A862193 +:10EDB000DE2F56AAFA20886BC8984550151D02C34D +:10EDC000BE2C3CF3116005CF841D26B6E7C13C8103 +:10EDD000EBD82E6BCF0478DDA2FF90590FFC468B49 +:10EDE0007315F42755D49070B004699E4A65464C5B +:10EDF000C948A29E273D4AEDE8C13D3C97471E3BCE +:10EE000034EE09F47FA6935AEFDE086770205FFBAB +:10EE1000DCAAD0080291A6C51C823FEDCD6175A584 +:10EE2000DACE8E1BC32A0DAF4731263C84FF070D77 +:10EE30009B700285B47AAECCADC91CE43D5EF09205 +:10EE4000EBFC36D7C180080367034898F2F15EA84F +:10EE5000C8547ABCCC0C79BDB6CB0EB217E955DFDD +:10EE60007615CD068D26DB1801B108195EFD77B544 +:10EE700034D22D2EFC11C205B2C433592B2898A5CB +:10EE800037310C1B694D1D50433AA459D37D8096F0 +:10EE90005383F1CB8A29FFD8473BB982E26D2938E9 +:10EEA00037F3988FCAAB284AD32C7EFB5FF5986462 +:10EEB00059C4F532C1440B97F873CCCB932F682516 +:10EEC000AA2CE4E5BE27E7617051AC4F15334C5CCA +:10EED000230457179F33A58D759A46891EBDBDD152 +:10EEE000D22A5AF0BE5155A437B911CB53AB633F68 +:10EEF000B9D2808394B3582BC55F2D08B833D04C5A +:10EF00004D8191B70EA450F175E5A2454D6655F5BA +:10EF100033551DD0F7A253D8F1B0FD685835EF69CD +:10EF2000E802DCB1E1F377B2BAB389A4B6C5C4385C +:10EF3000F7F63754860503E8FCB0593E398B4FD4B9 +:10EF4000AA8CA5B159F9178806C6C0AB62496D866F +:10EF500016EEE280F91A713D654AC7AADC744A626E +:10EF60001E28BC3520C499EE41C8014A7DCDACFBBA +:10EF7000988FEF2AC92A9B45190D04A25EB52F92DE +:10EF80001AC0737AF61DD4EDEAAAE659D90A0678B2 +:10EF9000FEFDEE1BDE1B8980DEF5E80AE648E30D88 +:10EFA00069492052F7AC203BF3AD4351F97E87DC31 +:10EFB0001CD8A9F1FB352A4C7A40B2552F2645962C +:10EFC0000C6E82DDE93F8DA2F06506FBB38A08CCAA +:10EFD0005E15699843391953455DD4E69F893E9C77 +:10EFE00015164022A754719D925A4780BF73C68C54 +:10EFF0007302388DEC6FF967D8D20714CBD63CEE8C +:10F00000B1A09FB65107785647A76801D8D8CF530B +:10F0100023E5C44838CFD2C6893F4B7A17DE25395D +:10F02000B68D4E5822609DB35111DD95C490671185 +:10F03000B73111C153F0617AD0A7A6A30B07D8DB73 +:10F04000E6736BC6112AF3605BD7971E677D62FA81 +:10F0500051F07D01D3212037E2A59DEB432941A842 +:10F06000AA3A2BF8965547EDDED9EDD86EA7144194 +:10F07000CB5F83A52C0AD42947EF492E10A89DEE1B +:10F08000AB75E3A633E520C98B2B387D2484F55975 +:10F090007E5C0B3740440E0C8C4E82A44762F01508 +:10F0A0003A0F9B42A3861DE7CBD1D36E0572E8F8D9 +:10F0B0002D823AECFFDAE8C211213BDB66A6E0CEF6 +:10F0C0005E259BA66F6427E75C227651C40DA5A33D +:10F0D0003261F5EBD94DCCF2275E154E7326086AE6 +:10F0E0009219718E1077F999E659239093A953A339 +:10F0F000D0A273D18C3F3CA14F4C3AAE595715AAC0 +:10F10000484F29D8EAB3A022F5CC025FA31F319C57 +:10F11000B45FA34132CBF580DEC580DE0813ECA0DE +:10F12000F3B799C8EE0215D98D3BD0C10C424068A7 +:10F130009CB460A319A21421842281E2AC444E3312 +:10F140008DE8D75C75F8643AE2BD48A93B253C09D7 +:10F15000B4AC6C7DF939643CE86EDB483D95765C77 +:10F160003276F0711EA3DF858230991FB24BD6B183 +:10F17000F191AF8F9032D9DF5178CF401853AD71F4 +:10F1800050D78CB71638F6451FFDBC96D78FD66D75 +:10F1900040427D4D688AC0C7C0ACDEE420EC290542 +:10F1A000FB1DC64910E00E43AEC8062DA6FB3BB3BF +:10F1B000F7ECA0FFA0647D819E13438265F23C9131 +:10F1C0009B771E23CE6D1022085A1C807203F358C1 +:10F1D000359B3553EDCC3656D1DF8B228F1351231F +:10F1E000A6454DE21DF25B63E2DDCFAEC2FDF1F05C +:10F1F0004A71DED902578A0206B5A0D8816A733EE9 +:10F2000067C5393933DEBE271E0B9924FBD1F2ECDA +:10F21000EB90002EBD197BA9FE608E1DCFB8D5B333 +:10F220007E7130A4C755B0C70030D7EE8DA1ABFBBF +:10F23000E15C67714F27A09E5B24FB84ED137DEB9F +:10F2400098AF539D9D5B44D4904E568F9C37344D60 +:10F25000769BA8930869A98965CFA1096DEB027710 +:10F26000230D8194423AA9F938DDE94AD99166140F +:10F27000CBE70FF25AEFB4411EC46519441E24B205 +:10F2800049DF3FC24590464555BD270438589C3656 +:10F290002FFB046D08232B344ABE5BD884D311B3F3 +:10F2A0001F421B6381D27BCEBA45685F815455D91A +:10F2B000CA8B1BA5D5CB68B32775FEF519F3D9000A +:10F2C000BDB1E51A81AC7E7526EBA2A44BACA17A48 +:10F2D000341F52C9177848F54A91F9AA7633581D58 +:10F2E0005B7FEF5F3A2DBDD1881ADEC5C3F602679A +:10F2F00007A5D7CB5FCBBE006859C8ECA9EF202883 +:10F300004A17BF74975E32576E90DB4A23921321DF +:10F310006AB16D59212ECFF9D8B9924C0DFEA93A98 +:10F32000318CD520E5931685DD6C3C8868C6A884B1 +:10F3300007B1F6BD3AAC5D4AD7219BA8E2998CEBA8 +:10F34000AE5F4934FC9126C28B21BAA351AC8DF239 +:10F35000D4994492F487D8E37C9AA05524F3AC99CD +:10F360003FC60788A9F0F71B6680F7216B3E76D66B +:10F37000DA3AE26EA86A85500AA35FEEB87786F59E +:10F38000E44CBDD850E6EB9CA1B5B763A47A7FEB03 +:10F39000E0672C906FC9A6025B1AACEF680D27C31B +:10F3A000F6B128CE8CE33424306C3B72C0687AC44A +:10F3B0005BE3261D4964FB2899A52E3F0607AE4B4B +:10F3C00049B409EC119A661B8E7406E53C90BAC0EC +:10F3D000DEF77523402700C2B20E459EF7DB584189 +:10F3E000E4EB9B4F2ECD4453427F51851C8CB4746B +:10F3F0001CA4866ABD9094AE19EDDCF1E50B558036 +:10F400001130BA3BF22F333A80F3B6A3F0657A7C21 +:10F41000BE6DF76A6C529A37FF0A3C5E9B55AA9FF5 +:10F420008EBE5842C4A0671235472D7D734CB92457 +:10F430006086BB43F106E62C9E888A4FACDA7E9448 +:10F4400068AC39B58343EA171AB8F0F6BA801CC322 +:10F45000F1EEAA25E40CA64FDA8D50580F8EA8873E +:10F4600024D5A55B9EA22FE0895045D581400D2B68 +:10F47000978CC624BDB293C41C8C9EFAB48ED9223C +:10F480000A587605E33A2AD60A06091BA4B8ABCC7B +:10F490009C8C2B6E83C9AC5D91549BB853657B18D3 +:10F4A0004564A29C3575085101EB384C70B67EBAA4 +:10F4B0008B59B4C766A87D85D222DA1FAC7F5BFB6F +:10F4C0001D7209FC277F4983489DE13D312CEA5399 +:10F4D0007950E53AAE1CFCE3185C7CCF3E9B7F2460 +:10F4E00029D7C776A022347AE8EC3D314DA6F392B5 +:10F4F000E7AE188231E6F5D5A08F89E0E4FBACF1E8 +:10F50000CBB9E649491D5481967B11E0699DF94DBF +:10F5100043D2EDE9D8E028FD1DF21ECEBCFB790CEC +:10F52000C0585E8241E516E746573215D5F06D0D9D +:10F5300027A5A406278BADBA205D85510DD560ABFC +:10F5400002EBC02BEC3F35E0C46AFF0E885DF9E3A7 +:10F55000900519425393DB831A55625001A8B11AE2 +:10F560004778FB08DD3400EBAEA0279524ADAEB0A4 +:10F57000FA7F26EBB186AB9222411F1FC8837B0620 +:10F58000E9735274F5A4923EF28DCBDB3C90B39DAF +:10F59000E3F57284A75F0EF1B502DFED518824BF59 +:10F5A0008C12E25AB503215D7CFE55792B08C77198 +:10F5B000B376128BC8BA12F4AA9FE766818C562CD8 +:10F5C000201A4D3CDA80DEFF5020F3D065700F2208 +:10F5D0005468B1994108F1B45007EA4686C6EBF584 +:10F5E0003176D01306B931009F66C2FEEED4AF7AF1 +:10F5F000D450B0BDF52B7FE692E30B1E49789E01F7 +:10F6000085EC9B11250CC6FC23775CEBFEDD54E8F2 +:10F61000EA308E39B69818D06992C9EFD5AEE61C9B +:10F62000AEFA7E2915D763EEF314671124C18F80DB +:10F630001394CF80A1F1B07470A32D7F5317C22E05 +:10F64000AD1D2F520E7562784B5BB8487CD74FE2E8 +:10F650007DC842E0CC8D76C4625451018B32129F3A +:10F660003C8E3E60876D292FFB2E6399996B66D186 +:10F670008470CC1D79175DC253903AD2B1281EEA2E +:10F68000CABCEFE5DEAC0832AE1A1D85284E4592A5 +:10F69000A7B1E749FD7A00F7B9B6F9625739C01941 +:10F6A000AD5C456342F7D8571A47D024AFE17321C8 +:10F6B00029D41D542862442AB20A21F9FDB6C8A9EA +:10F6C0005A3723F1CFF74A5F306F4E0FF961167C3E +:10F6D0000AE1E3B3A6698248D1980F53CD59019A44 +:10F6E0004866AB5C70D4BC27A137F6102EDD0D83C5 +:10F6F00050DAB760AA67273331E8764CC7B5700790 +:10F70000FB70F17C95512AF6C37CC16C0D53E76800 +:10F7100030E1009196522B6CFA3B7D67E6E1A5073C +:10F72000EF6F6BC3D48729B4D2863FF73AAB8A9F79 +:10F730006B3274F422CF01CF57CC0ED3BD3CE7E639 +:10F74000058177C2F1399430327C855756C8ED1067 +:10F75000503717944B44ECCCACD2418FBA05A74339 +:10F76000B61F7EFAD7FF6D38F6BB73B0D0508B252D +:10F7700051DADEE5CC57A786B8A5BA69F812646DF0 +:10F780008DCB049DF4599264BDFF9D07FC2F5DD481 +:10F79000DD132D17FB44A2A693B9E71FF65E9379FC +:10F7A0003B8F6DF6ECC73841332374828C7F023473 +:10F7B000AFD052C2B81EDDF7E30066DDB270CE5F97 +:10F7C0006C5EB93EB73196E6E9E3BDAB157E2878AD +:10F7D0006C9519773372E5D55ADADE347A39D4422A +:10F7E00029F7FB526D2D87D4A90E66138417D5CC4B +:10F7F0008E7669F0BEAFB95B0A6DB185C9ADD452E2 +:10F800004FCF4F23E8AC74E9769EB7C63E11B15195 +:10F81000D5A7C0EA8C3984437C34DBFFF0FA03C6F9 +:10F82000183BFF54CC01ED5507B5B2483D2D984A21 +:10F83000EE4579FD4ECCEDCBA2E285A454AB0D7F15 +:10F84000589E0D71B5DD6BA825768535C9F4C710B6 +:10F8500000B3B773A43664D316F13E43443E0C495B +:10F86000F70B9B2AE94F9D6E7CB27289279C273C3F +:10F87000EA2866D78D30AC2106C342AF505BEF1B40 +:10F88000E404270343FF90091D7A5C601AC7A27243 +:10F89000F2851D882B9AECCE50BC60DA0841CD8EE3 +:10F8A000537AF718C5DB983922E760F8C525B1F817 +:10F8B0007E8088BA2BC6B14775E213E436E5096E3F +:10F8C0008BA5D4533C6876258DD4A61A260845A06E +:10F8D000D6FED33C9B7E3612A6185F69B10E625DE0 +:10F8E0007D1EE3075AAC5EC73D8F2F21C2263D7EA9 +:10F8F000A54DE47C7F09A589BA3A906CE0A8FD8605 +:10F90000F18FC4E7C7C54A9AD71EA5D69B9E0B693F +:10F91000FC282054AF2D02782E1048B8A22F20B515 +:10F92000E98C3B80AD0C8B22218E0185B9FAB88B16 +:10F93000FB86624953E46B9BA7C35E90889AEFC92C +:10F940009D735E84F869543E431024D32BD44AAD92 +:10F950001FF3E9418DF0B5026285582FD60BE6C33F +:10F9600056DA877D993C87DF2738D4EE6D0AD8C6F2 +:10F970001EC651F7BC7DAACDFB8DBF7BEEDB522AA4 +:10F980000D23E663EA71C78811C1E84986CCE075AA +:10F99000DA1BE3033B2CAEF1AB5639ED97B992007D +:10F9A000B4868EEBD2D17B30404B37A303E689730C +:10F9B000FA5B6772EA1B271CFEF8CD90F8571D48CA +:10F9C000C9EACA9CDFC87A79A2B94ED4F91EFFA74A +:10F9D000AD145C4DE4960D72FB3426F0D65EC7651F +:10F9E00068AB92B43200198FB3760846A7CD06A152 +:10F9F000D0EB3D4993F28CDBF769D34BD21B1FD17F +:10FA000037D67E8F02E64293DA6258FA43782A921A +:10FA1000E080238F77165BE323811A7E09D67E77F9 +:10FA2000F141D7F1E01513DC6805B51E9139D09F7F +:10FA300042C17437681C177DAFD84A9B61D4AB0FA5 +:10FA40002E6302B95A47FF63AD1F12F887D8A98207 +:10FA5000D69D18043A30CEEE3E9501853A1FDC055E +:10FA6000251D19FCD12F38816ACB0794BB65F5267B +:10FA7000CA4424ECC4ADCE8B9738E13DB1369A62CE +:10FA8000687583BCD152C8E62C281BE3D9AFCF3FA1 +:10FA9000E2C39AE19452F6EE253C261A9E09674B82 +:10FAA0004448C933822796C52D0F796D0CF6913ADB +:10FAB00052CFD7324B7D40E17E90232BCDE2A9116E +:10FAC000F5B724873ACB4488BB62ABC7258EE4B038 +:10FAD0002A2353F6DE3F544007EDC13B3236D88D22 +:10FAE000E0553D55C753CF38209F664B52622E7666 +:10FAF000DFB63BDF3144FC089F18E8E4940F06A80A +:10FB000092E67B9B903879867B98A93C4EA2989888 +:10FB100086F9C2D5689A076489A2CD7653AB0A9458 +:10FB20006C629115EAFA0FDCD22C23F95B2C22953A +:10FB300036A866419197A7A38803DCDD98A23E7A98 +:10FB4000DA06C0193CAB4AC16DFDB70A5AA7470E89 +:10FB50003F6BC495ABA2670D78F31751EE6CD16083 +:10FB60008C3E903ACF2B2B752A633E8F7E7F791681 +:10FB7000ED09BDE7BEDAC005AB53F536E6F8801EE9 +:10FB80009C9CB2ABBB66CB4B75F74B23B8033BEFEA +:10FB9000E1B2F12C761BC93333215B3DC7F6B1D9F5 +:10FBA000FB4EE861DFC2A8C236286663DEB8E93CD6 +:10FBB0001B9B4A2BB5342EF6E2400919E213471B72 +:10FBC0008B6EF705BE2F69D9951868A26E80DFFD90 +:10FBD000177215469051F4F9BEBD6A668DB6888CD1 +:10FBE000205205504032AC8EBACD81D706551AEE60 +:10FBF000A68956026F21CFDEDB0183B5D59903B903 +:10FC00000E63F345592801D2560D84B8FC3BAA80F7 +:10FC1000F2BF3723290A9FB586CFB5DC02A6DC0CDC +:10FC20000EE8CA8F3D25B5CC060685540FAF363495 +:10FC3000C122629567D8B474AF6714674C2B9A7170 +:10FC400008983850759EF6059E0AABD66C16BD50C6 +:10FC5000474C9F3274B07CF741E03B14F991018E20 +:10FC6000A9329B96CE7EE61B1111C5D37135CA4AC7 +:10FC70004DEA6D56403FFEC69C3D86556A1BE20725 +:10FC80005F54846118695AE1AE6ADB4DE7E575BAE5 +:10FC90002FE77D106DBB1164382EC990FB356C29A0 +:10FCA0009F96ACBD139B27E317F8BF2C7E75230AE4 +:10FCB0007D444C7143508C4BDC4CC4B2BD43C110ED +:10FCC0001CBEA6A25E6CDD6EC5ECFF5B994E76EAAB +:10FCD000DC619CC4FD01679A14AB9F4F30F838710A +:10FCE000068974C6791F2EAFCBD51822C80E2C9466 +:10FCF00004B3AA78EEDF7508D234F7E2EFCD976A45 +:10FD0000D495BBC9998D7826E5E9DD3A2E046C2E91 +:10FD10004A29DD01E3E42187077DAAEE39FCE69F4D +:10FD2000EFA3DA92CCCD3E322FF955E438B1E0356D +:10FD3000C8A4E150192264A72D74CC9308CADF4FE0 +:10FD4000B3638BFE3809E55CAC0EEF40DD88B22A68 +:10FD5000BE26A6194C247681B468FAEA9855947B9D +:10FD6000C97DC4EF0DD12406443655CFBDDB9FCCF1 +:10FD7000966ACEE26C3807E059979C347961CE6080 +:10FD800045808BA341619C5C1C8E49DB3D5B91A44B +:10FD9000FDF0CF440404F0912BCB6E3661983028EF +:10FDA000052F4105A8B1905C204415B5DBFE047910 +:10FDB000B0D185E7B173F476841626232E5D9219AF +:10FDC000C306BF252C94D07514F257130CC55F8A57 +:10FDD000C748A07BD391A6C282157ED2581DA5E943 +:10FDE00019A7D0F2EED8313EC61E82428549FD24C5 +:10FDF000404BA3A134F9CA4C5AB63FD75A91ABDF56 +:10FE0000AF956254D42A223269EE6C4221E4A1BC3F +:10FE1000BED53354477D85F285DF00FED4AEA031D8 +:10FE2000AA3606456BDDFCD3835FBB0E43D4BBFF14 +:10FE3000E02831AB80BBA24055672BB73D3449FD6C +:10FE400014240B1F075B5656FC7D1E2A9B4207A4F9 +:10FE5000BE02CA3938CA33FA3765D9F64BA16026D3 +:10FE6000158E75010295465215E24052909729F180 +:10FE7000E2783AB45EC307B6477DFE083BF31B8FBA +:10FE80005857AE6F990C24638073BC6C634F7845F0 +:10FE9000284A684525903C4CB48CBEA299F28B82CE +:10FEA00052520D4ED3E97047AEFDBE35C6766F1681 +:10FEB0007F6DBD954243C7B673191C2D8958C0612B +:10FEC000F39433AC5328A3493269FC1B061D1DABC8 +:10FED000015E18E92C15A8176BD3BAC4AAAA22830D +:10FEE000A4283D7CCC3FB5873EEA779341AE10CB4A +:10FEF000C8F22ECB674406AE155D36E799E2648BF7 +:10FF0000D1FCEB0F27D9927A73D2F50CF9BC618A38 +:10FF100039B6A81046A0C8AEEDD8E8D2561DF59067 +:10FF2000D1805C2F37116C366505F7CB82B7DC18B2 +:10FF30002011C52957FDCAB7630E624885FF8C465C +:10FF400011C546AB7A1316A5472DDE5E55A846D1DE +:10FF5000D3D80996D4371D454E02EA0209CA053A9C +:10FF6000B395E75046AB4241E00F4247E4859DC35D +:10FF7000AFF5EF7AE69CAA6046318822F99B4DECFA +:10FF8000981ACB1CD995D03A10B0CD0C820DFCA894 +:10FF9000148B8C6A792169A3EC49A4D3E2FC5CBF81 +:10FFA000225173487D7491BBF30CD1E5CA8D129731 +:10FFB0005271828AC75C45D79A1A691F2A32E8486B +:10FFC000624311BC7C941F631B031B71EBCE623830 +:10FFD0005014AE5966AB0C9D6CD7ABAFF3A76B8ECC +:10FFE0005D44E15547BCF5E8B609480D6F0735811A +:10FFF0008C755B28573E3893BC27F1F88B1C744FE7 +:020000021000EC +:10000000E65666153B1FE5E3C97E8D68DF8ED96E27 +:10001000E55EBC87224DE8270562867A4CD7E50E5F +:100020007CDC55CC55D08EE507F6CA8FADA7B598C8 +:10003000F9E41A136CFD9A704CE93A9AC27E19BA27 +:10004000A749F0113AF6D03EDB73981C96B0EC56F7 +:100050005CDF720745B42CCE7CB7DAFA918BBEAB6D +:10006000200377D3420C556EAB2A4864BD9DAD2D5D +:1000700023B6B0390C1E649CF38FBED52698F49A33 +:100080004EC425927BE30922F6E68A968A71491FBF +:10009000B525C8C7322F00176840F3F8B0805BC69B +:1000A000EC8C7BBCFB0A81B8B638EC04A574827B6F +:1000B0002B8436BF553C5392A8A06A935D0588FDFA +:1000C0002E67D12AC9B4064576C34F555E2496489B +:1000D0005F422DB213F8292C78F6154018C64CFE55 +:1000E00034AD69B822B0C745F5381C35E3699C7D4D +:1000F000D110BD934982E1866329F8C6FEB73D4C15 +:100100008ED8CED9E3B1BE2C0E932B87A32FB9A9DD +:1001100076D8903F4A5E51E00A828CF97D53460BB7 +:10012000E9279E09FAC91350C3FD39220286A35557 +:100130001948F926DBD240D8C4AE95F3CDCA6E7FFC +:10014000939B6901417181ABA866CAD73B8FC65D9D +:100150001BA51634350E7D8993151DCC4EE4A2A740 +:1001600051BF58C50DD9460ED53CBF3ADEEED73348 +:100170008C1929D8B49CBA6F76D864C4BDEF5D00E1 +:1001800089F7752D33D8009EDE64F1BD1CD6A0B270 +:100190009419D3050841836ACECEC80F64AEE693A6 +:1001A000321E60FCB7D95A7FDC35717448AB2737F3 +:1001B0004EF8F7CCA849D0181D3A8EBB141783E629 +:1001C0005FD24D75ED7C99B51AA2F96021A1535902 +:1001D0004722BC06799C24CCACF9E0C7FB507F5C7D +:1001E000F8C0C364EF7D5A334BD7521E77D91692AD +:1001F0004CE5D38CED15A6917B73AC5FC8A30C01C5 +:100200000187E35AE530096BBA469B11D9CB4D20E3 +:10021000D480CF6F19D70295638DD5EF5D20235918 +:100220005093708114452FB617519EC9A45BBAE153 +:10023000D898153E6CC5061646DB51BA3B51B23410 +:10024000F71DADB8028E1D3D863081D66803D2BF42 +:1002500029ED903FA5D6446A4CC1A9CEDCA24C4101 +:100260007C8055B08C1E9C24C5274131A898A64897 +:1002700027E508D5EFE9A6632D73259EAFB8E5689D +:100280000234D80F7FE3358886134089E0409CD341 +:10029000032C2290E4924399A9B6E2EEAC411706F2 +:1002A0000229549E944950C86527A69BA7A1465190 +:1002B000AB6B04CE2A6898F886E480D81C10654899 +:1002C0007D09FEAB049C5EDF1F9EA9B68F0107F976 +:1002D00092A510A8CE30453352CCB1B8FCCE7247AF +:1002E000DE408B28A36E2B4E154328F23B2B58493A +:1002F0003D05F2561AEEE6C62A523B75AC70FEA8D2 +:10030000A4864FFDAF56B87DAED3767BA9D187A921 +:10031000CBCD08051802FA5F93A4AC12F1C5B33433 +:100320005115100179C938C068C7D4105DB1A3EF69 +:10033000B48A8E6DF2B9D54CD806D5581C3542F525 +:100340008205454737E26113398F289B70CE207EA6 +:100350000073C4E262FFAD278329EA78577D93B327 +:10036000901D9EA28DEF2F9D310F1810A500EBFB65 +:10037000E212F1DDF3E31BB536F3F93F57CBCA8147 +:10038000DE8569E8EE6C389407B58EE07C599239C9 +:10039000EBC1AC4D79A297BB004E356C802EDFE1EE +:1003A000EFE10D0D70DBD2B2645C641CF61D2B41D5 +:1003B0009DD8FD258A0BD42AC4DF626376747A1D2A +:1003C000A43A41A7DDEDFABE09CA6956D1958794D2 +:1003D000F2D57C64FAF86196F553484C791815B556 +:1003E00091A58142DEBC127C4913EABCC1F764329C +:1003F00097B6516D579F22908B54DDE9A56A7732ED +:10040000AD729E96FE9B77133FE3C6AAB75B6BD592 +:100410006E275CF56C26C9097D2A643957249899A2 +:1004200061FFFA8253FBB4CE7C6A14284702D97369 +:10043000A7D3ED7B1B9477CC78DAB735443BB882F1 +:100440006CEBFC2C1EFD0991F5B5612713B36F0A07 +:10045000F247A6F003733B31C45BD2C84BBDF8969C +:10046000F547D6872702B25F7D3D76836C8F589F14 +:10047000CBDA53E7FEE4CEA50C284EE0EF2D90F248 +:10048000D2B1ED4D1DBEF84B73590E381503F06017 +:10049000AADDC3BC52DC3B92EA3A59208AC6BB9221 +:1004A000DC2F01BE31122CA7C8FCE6C7801466FC05 +:1004B0003EBA80A7FE9E074059270341201576C803 +:1004C000B28757888C1E5E4FF1434226536C994782 +:1004D000F4D1C8EFCA13C83D500DEF7A164FA6A34A +:1004E00003250EBF91DD8E616101EEC39012964F20 +:1004F0001DA59BF7461D5A0CD46F5BE57B063ABAE7 +:1005000065141802EA2CA3CE4312C7B04F23FF2F65 +:1005100089F8828A540999AD45B4DD8CF36189D09C +:10052000F944CA73D4543F4F28821A0B673DA686FC +:10053000FD2545EBED582432A66AD51C0246A8D30A +:10054000E612CA847CC3638974B67D8819B0DB4621 +:10055000380B5D8291CF7C32B9C0876BE2E26BC40D +:10056000556BB5EB13624353362624ECF7B6628D18 +:1005700070F99143A8DED7B1411C21CEA24E29F4D7 +:100580009E2FAC4187D540790825374B08BC1527ED +:100590000B73853B760C8A5E0F0B1100287587DB89 +:1005A00021889CBADC951D81FAE665945CDDDEA1AC +:1005B000643759519E5F7C5F89A471A3CAB18A8C4C +:1005C0004F412468ECFED85BEDE0A2B553807199F1 +:1005D000CF10C63D8BD371AEA5339BD2BD15184449 +:1005E000BEA3661701AE5A30F7A82E029CE8E64F6C +:1005F000379018EEAE65FA953FF6AAA503F44418B5 +:10060000018B23F42BA69F19B732A6878CD4B7A7EA +:10061000A92DBB50A28162E1736E71CA7673D88A2C +:1006200046A9BDA123BB74FF3B7C0B20E7D0D85E5D +:1006300084602CEFEC3DEC5E455C71EDAE4ED4B4C5 +:10064000A826652078BADCFC536E805BA941B58D85 +:100650004A03A24D44CF3CFCA7FFA69773EB492A5F +:100660006E83B55BBC82C610C227E06139C985EADA +:10067000B479DA5F584F066A93861213ECAB039E87 +:10068000C89055CEE0197875EDC93FD52310F545D2 +:1006900042A63A65EFF3E581C4B4F99E3EFD71C60A +:1006A000CC56E493C0DC70289E2E060AB1DDD4003F +:1006B00072B25E2F0CD76A0DFF2AB91A780383D65F +:1006C000868A77915BCE24DC26189D29C3EE6A24A6 +:1006D000C31F170E5F9FC6226BCDFE69982B5AC1B0 +:1006E000F57F8DA0B42C9E7567F5CBB5B8C19FD8AA +:1006F0007A0C8D28526D4B4F69C37162120E1DA288 +:100700007AD7AA682DACCDD41FDD813F4C5C10098F +:10071000E7B8D8704CDC8D11CDCBAD9D4419FE737C +:10072000F3D6D78FABFF310EE9866CCC7C54EA7CD4 +:1007300025052ED4553FD26CF4A418286F5BD895AC +:10074000F95449F6E753D2C8D476B2587ADD7D968B +:100750000A4D73C05BDF7AB14D4298134201698E36 +:10076000A01236095A0277A7439F9DCDDC68D67642 +:10077000348F219B8CCF6B3FBE0C71C11DFD9C76CD +:10078000252F6D726BA5D30C6E918A067F9F4F1C2F +:10079000F79B3AA9F1D4B8965803BC3C8CAEAA0B8F +:1007A000D47AFB01A056B5BA0F5A4FDB706D55FADB +:1007B000BB3ED80117773698A9A4268C82658CA9F0 +:1007C00073E44F5C227335CBC20E6E570704BB191E +:1007D000BF0B88A4E5825321EF34482F7179C20FF3 +:1007E000F5F0CA1382D1B8037044045F5A7B9414A5 +:1007F0003CCCEA2573DDB1F7EF7D87612EA107754B +:100800003BCD529971006C8D12BC72A10D5FC9571E +:10081000157ED0A05952E30365FE8713E4D079AC6E +:100820002624D3537583788650A86B0F5030AC4A7A +:10083000F52307754410374AE6947C692EB9DB9797 +:100840009F02E16323291397BC65077C461BCFCE2B +:10085000A5E6A9F4E9A92C8152E754F9E583F22D24 +:100860007523158D97AD7FCC85F2037091C2EB890E +:100870007E89ABF1574602CBEDAC791CD30BA3EBD1 +:10088000E1E65594DF415837CAAE74B78E583F98A9 +:1008900003D3A568622129B241059E465B0E4286BC +:1008A000CEAAF583C22B86ED1E3AEC9BBF10FA83CD +:1008B000748595279E78537F78DF83157C59247043 +:1008C00047BD66DBC5675AD9913DA04B2A23CED9D7 +:1008D000EAE84B06A68EA6132651E101DF55FD047A +:1008E000533190C0C07810D1CFE0B238E20B62B57E +:1008F0007D4CC5B66EE7B30714121E67B2691C8142 +:10090000BFCD8A92C043869AA2754FB9AB3A82CDC9 +:100910002D71BD0BD24835C534158FD8577433604F +:100920005BF8AEEAC62BE19D670E759CCAFEFAFE27 +:100930000EEA458D028FE995938204AE75BE65F18E +:100940006853CA3A7B579A3CCCDAC104A7DDD57EFE +:10095000202ED19231EDD98D8B089FC4F9A14D8500 +:100960008F024AB98FB5BF8AA90B4891C59F7258AB +:1009700082706446309E19AAACFAC6048585EF5091 +:1009800051CF379E7F95917A9F089B6C563EC9D573 +:100990008211307375B6C4A0ADB9F312E72C83D8B9 +:1009A000A48C9F203AF8CF892BCFABF4583FB113DA +:1009B0003251C7CBF585C5B7D728B3F398F1E4F822 +:1009C000CA04A04E4ED58576953618DD8D9558BD56 +:1009D00058FD3FD77F2E2A0F62918BC05472D1B53C +:1009E000D1374F2B0DFC7FB8FAD3BE1CF1EDB46D9F +:1009F000063DBB7EA5E76F60769A3B05C95254471A +:100A0000D24CE5C649841BE98A395BD026785EC0A2 +:100A10001D33812DFFCF1949D520FB5B25299EE28F +:100A200006A8A5A7907DEF7D414A3CE497E93E5793 +:100A3000C07BACD23CA9A37AEB850BC108516B718A +:100A4000A4B9C3DA72133E5DA0D5239B3EA7D1D9CA +:100A5000A832E71058CAA16BDC90BD15DE1734BD73 +:100A6000D1476FFD98A0DFD7CFE95E061275E5107C +:100A7000A415D7B0122A1CBB3780555A9492BB5E7E +:100A8000BB135D04722AFDCDB09ACAD81E79C2ECA0 +:100A90003D811FB074AD4334A95861A217A0A5B021 +:100AA0005B5E557E65A76D0B54F2CBB4D361BC2160 +:100AB000D06003E714D140FEB17AB6E7A45127F91C +:100AC0002D675681323FDDC8556D59E59F2993EB5F +:100AD000504BF4943F689CF75452A93CCED453EC4D +:100AE00061990DD0B4ED5F39DA167D820E4F680B37 +:100AF0009C07D0DFD6C6DCD7CE95DEDB99BC52286A +:100B0000714D6902CC5610D779D68EF3B64B32852B +:100B100006C73E5F329F64540D0D75DDD2912FEEF6 +:100B2000C71FD8E1FF98E4904C67BE94C7594C2C7E +:100B300059CEF2390257032C32F45FE3B26C5E1ADD +:100B400094FD072348975BD1BA69AB1CF2ACA017A0 +:100B50004E56CBD6987913FD0EDA5B31EE22BD6A84 +:100B600067C6D728EBE55A344606D642CC34115630 +:100B7000040CB698FCEA2F6F3FCFBE79DC51F562CA +:100B8000CE4BA832B373952D828BAA6419BD21BEBA +:100B90001C8B33127BEDF71677C70015198C70E8A4 +:100BA000E2726835D728AB21BD681A8907C507CD21 +:100BB000350274EA7295418D7BCDC9ED39FD134440 +:100BC00044C9186E4B2A7B2E984766293F4715E08B +:100BD000E3417B0E8125BDD3FAD6BB670674B1C352 +:100BE000DD5EF63F167A99119542CE8147D0D17FCE +:100BF0005270E92F2E6FCCC6E3AE673312185874CB +:100C00006C22DE9BD73D9B191DE1410B212C94D614 +:100C1000A2F97CD772990A6B53DB6106FF757B875B +:100C2000D20E07EE10C6994BACCEF9B941EA42128A +:100C300062995F9DD72195FA2E522932D4E533F778 +:100C40006836F3D612C674857FFC9033E89CE3C8FF +:100C50006A39AEB41832B69751F55B001D69D1CA36 +:100C60004633E0B0B5F909D2D638AE34D1DEA2EDC4 +:100C70008EA686923DC718839C60C7F5940C22DB34 +:100C8000C10B2BF6B62FFE354BDE6AF8BA8F8356B2 +:100C90004724CD57E87CE1B6CC19FCFEB370F0696F +:100CA000AE44511EA3658475349054B9859577334D +:100CB0003EE4D0804FA12C3B09C42E1F6ECBF2FF27 +:100CC00078DA4B0D4B11D46006094FE1DFDC13CF0E +:100CD000C2F110E4D744D3EF11A21C7FACFC6E43E9 +:100CE00015FE0A10A43D60ECD697D03EC8F04EF534 +:100CF0007140EC170233BAF9816FABC24B4898EAE6 +:100D00001F39C13203B5FCF86B8B992ECB690201F8 +:100D1000852B5C5B558BE247B2D411C82E093F8B03 +:100D200010107F48C25BF15DB883DC0DBD9E5DEFA6 +:100D3000A3EC55E66A9233702667C12018F83C444C +:100D4000A481F8A93B2DDDE53B60508813759B7F9E +:100D5000605FEDC991F58A31E69DDFB35AFCF75C1F +:100D6000474468CA6B86C8EAE26C110778DF9CB515 +:100D7000E124CBCBAC8E2D4E5341803E7398DC6585 +:100D8000D20B0B4AECE515E5D4A56EE2880A9A571A +:100D9000414E344F2E84D0E50573FD597B05432920 +:100DA000A47AC126A367BA2698D6A7FC098BBAF6FF +:100DB000F87828E9F1B2CE6079C1493E71C40D32AC +:100DC00023343B47637ED70D0B6D311458234EF10E +:100DD0005813C912E815E3D153B0DD4AD8ECAF3946 +:100DE000693BFC6CB26D0519E7AAA725349B041377 +:100DF000EA645A18E5045681FBB4A825CC5B4AC8BE +:100E0000AA69A1BC52E76EECB4F266ECC73B38EEBF +:100E1000DAFFBBB4FD3D027B31A2B25005F7E443DB +:100E2000F3A84761B6A5BA73C4B5E3CA291312ED96 +:100E3000AB99EF7FA25028B3D830F80CB0CAAC2FD2 +:100E400011FFD4FFA5EA12711DDBF312037E54E7F4 +:100E5000F492F5D983A6395BAC4FCE784D4EABCC2E +:100E6000754410965D00135AF2F2FF5BFA4725278E +:100E70004376FC8B2F645F330EF4073D627EE09374 +:100E8000A2CD0C37B7EF630F3B154B7DF9DCC69154 +:100E9000CA7E76533C3BF666425D4C5305F4C782EE +:100EA00063BA1320AD310DF4263BAC9AF9BF47CBA2 +:100EB0007D01F834FA799EFE6E6FA9EC4FD4AD6CCB +:100EC000C419B7BB374F77519C609456ECBFDCF91F +:100ED0000A3D605BC80C3542BA3DA845EE5B648EA6 +:100EE000E9BA04C48C2722E187349BBF76F144CE53 +:100EF000F36F268050E9DFF56530F39DCF6F295001 +:100F000063686F410B25076554C99E42351BF9F391 +:100F1000BDC352A8486084C31E430E0B3461256DC7 +:100F2000248D14A7A6AF4113A27A37411B12FDE20C +:100F3000508AFD6618B72A456655C1517ACA376589 +:100F4000CE4AA419F840BB99D9E5BBDBBFB8AA9F2C +:100F5000FBE6DBCAEA8D170B076C7B9C5993826812 +:100F6000F33218DC80D52A17679533907D9979354F +:100F7000528C8C3012D3DD4E566581A8544057CD2B +:100F80002E87A380D87C460A6247285BD69017BC80 +:100F900043299BEDDCB74F2664CC9D30DBA22001BA +:100FA000722FE304101F6FF95C68FB6F8D55663C70 +:100FB000A739C5F36CFA0AD04001F8ABA8D481DB9D +:100FC0001D86A7B5EA100E7F5D6A6CAE50CEE9654E +:100FD000F68E3ED8FA73F512B52DE5BDD75006232F +:100FE000F8134A608E1B6F553C53957C661A4F3D33 +:100FF0004C80531177EFE8DC501CA5C13467EF47F4 +:1010000070B132600BCBE92E1C6A381D8ECB8E334B +:101010009D09BD432690D5AE2AA60559D8AA9C8124 +:10102000CD1BC2FD50E04AF172324F9392638CBBEC +:10103000F3836C0439800D35D152F99E7BA76E6B1A +:10104000D68BA199005DEBF537D86F3348F9A481B1 +:101050008B63A851200EEDE0122FAC2994F38C8005 +:1010600027EE935CB857C749DDB9EC6AC48D1CF70D +:1010700036F62EE6B1B5430D448CFA03A7A251F023 +:10108000CCE70F306A7579F3AF2A39E24880921BBA +:101090001965C3712CF02B7FE0FDA283579A6E5720 +:1010A0006BF7CAFD3D48E2423C506AF57EBA9EE8C5 +:1010B00090366F136AAE49A37DAD3A097FBF104BDE +:1010C0007C85E3DFF05D9735FE0F5EACA25C1DFA18 +:1010D00015C5793EA8C2C173C0F5F8DC3DFD85FF9A +:1010E00008C54B46B91AD81ACBEECD8A4D373B9876 +:1010F000782E50BCAC68721B8367AED949E0E7829A +:10110000BA8F4A61A94B8987748FAEB2D5F447BABA +:1011100046F0058725863975E42BF48DEE90F2D1E3 +:10112000C681121A3B4AD1DD9D5E9FF144D78222CF +:1011300021541D5C3AF6F7037DD0D7F3741A9BD483 +:10114000B072D5F847F4BB97798F02FFFB9665C064 +:101150004D4D3C7DDC483B51FEC79178053D3D3F00 +:1011600011C0A5EE5123392F2489AA7790A01B54D2 +:101170001F266E3FE2F1D25721DE3E391BB5DD87D7 +:10118000A37A47A30E5EAB9423FBA646E28846DD16 +:10119000688D2D277C28682CA330768EE9CB28B269 +:1011A000E5B2C5BD2032B406B3A5A5EB06D32FF436 +:1011B00037AF67CF07FDEE4EC97AD2C8763144B853 +:1011C0004E4BBFEEE7BAA310221D28699F3DB6859E +:1011D00062420DC6B00AB938AAE0B620C0D798421C +:1011E00086CFE577E7F2AB40BC553B758E6F65D592 +:1011F000A76ED4AF6F381BF76DB941C5F4925C7D13 +:10120000937FC2D47E7A04C57EAF16AFFFAC21CDEA +:10121000AA966FD02B0C796599323ED1EDE908A8DA +:1012200012E3E8E3AF590E5E8EA19AD25B46C7D4B3 +:1012300056BAD6DB184843623ECC0C00B3FAA9720A +:10124000DE1BD136F0C9D54E5D555330E72A5BC958 +:101250003AE8A7CA6EB212945131F5BA82C2F81CAC +:1012600092D34E7A5D5EB8B28BC46BD1F0F3DD825F +:101270005BFF1BCB2A8F3D49548EC0D720EA72FEFC +:10128000631D6F93BA15027DB65CAD5B063BFC56E1 +:10129000A21B830DA192B8AF98EB99FD469D79D71B +:1012A00018C05D479B300E7FBE196D05CC0AD480F7 +:1012B000078B1BCF7481E2DBB18C272CC9429D4088 +:1012C0009CFAB067486705DCD30B3B586FC5839425 +:1012D000A11A0925B3AFF5A64D25C199FB1E11D65C +:1012E00015E005B7A0E02740008765F588E565A60D +:1012F000DDB7E2ABEA0F0E63DCB3CE8C2EF5F3AABA +:101300004E223D0F44C21E6845758E5ECA11990F6C +:10131000BC989101E1284204D7F16DB300E3A1E745 +:10132000412216D80E27C8C76C0A2D5105EA6AF566 +:1013300073C7AE1142C292C188A9DD6EA91E2A8B65 +:10134000ECA578498353A09EBEC28C12E31BBD3925 +:10135000516D579FA1C135C2924F9E128278E7FE10 +:10136000696D71BD27BC9CEB40A193CC955229A21D +:10137000CE625459F9C5B69BAED063BFFE8763EF0A +:1013800063EDD4F1833124010ECB47C685880F8FDE +:101390005B6ED5AA2FAE3A6A4FF8FAFEA3DA5B84E9 +:1013A0002D7797E866AA6B16E8EB1253DA3D4D8C61 +:1013B0009473F1B30017B2B28FC3985044CCC3EC0E +:1013C000F41F2ACB1653649AE515AE4445E7E79C13 +:1013D000903DB27016DF53D21F5797F9162D5E91CC +:1013E000C535C2ADBE133E21BBF8DAAF940A28E082 +:1013F000114E6ED7B35D405C1D7BEF315DDCC15398 +:10140000248675637C084A2B8E06B8494AEC772DF2 +:10141000DE3CADA8AED203967CEE2B726BE17BEA8C +:101420007365899185A6BCD41D58F3694738BF01FF +:101430007254C77D55843D526E4AC7C4FA50377006 +:10144000C796C54F95512F5D6C7A63C26B7BCBA459 +:10145000C6B5E98162A2978130E9B2DD03598FFEFA +:10146000331C40966F5F0E6D27928814D63D521440 +:10147000B02CB9F222DF99A838D668E9B67C9F086B +:1014800089A9F80065FE4CEF54A85DEAFED68B17DB +:101490008F64C1390C35E5770AF1E56E2F1B427078 +:1014A00028A96FDDDDF9916F90BA6B962AAEFDD752 +:1014B0004AF999B1B61996C991FDE89D4A9F14352C +:1014C000E042184CC0B343F5117A354633AE3D982F +:1014D00085151644A5BA27EA4DBFD20A129DF58B91 +:1014E000ED398D9C31F5C1FFB647EDFD1261FBE290 +:1014F00086F705B963137115714BD57E87DBC45C24 +:10150000308C6369F77618BEF5B0933265CA04BAB9 +:10151000408A3615B74FAA19FB9F2C0BBED9A45091 +:101520006FB35DA7697C23B3642DA80B8D0F61B0E9 +:101530004E54A845A899C16898855218A949D01653 +:101540009994687E85E5F0386C698E16619DCC4B68 +:101550002713BC9FAA1484401645523A3FB2EDE3CC +:1015600036312CE26B37B11339BD661C4480FF0560 +:101570006F8DB84E6D764F7F173E0E5182A0B656D6 +:1015800039DD1AA277E13AD2531C71812286553C8B +:101590006791058FFF5DB094C31D282F3ADBFD3D99 +:1015A0003FF5236F2D507448B823E29F3BE9B69F67 +:1015B0005D518A6E666A66A0ABBA494021C1F9A046 +:1015C000CA25DE57AF5558665316FD719D17CD8F4E +:1015D0006F89B3F185ACFE4CF33FE4003BFCE2ECD9 +:1015E00063EAB30DFC9865CE32A8724007DD68A9A6 +:1015F0008DA66F65EE51C4C2B8305AEA0209A054F4 +:1016000090FB12EFE4BFC84044B535E10FE9F59215 +:10161000C64532DF53DD7AF96FBCF8B905CBF5D496 +:10162000CB555118FABAE011E754E0947DD4AA25BD +:101630001E08DB32B7D9C63F60A81B559B665715FD +:10164000891C1A3A90FC3853D8D5217FAA7FD974C7 +:1016500046CE0801F577CD4EDC2E94A0FEB5E338DA +:10166000B96A9C6FA484688B60E9DC6DD2470E8DEB +:10167000C21A7C27A76AA9CC1A5A0497D8E5AFDD0D +:10168000EAC32A10EAAE7E625B6B83B77AC36C4B07 +:10169000B9FEEC5F015D28806998A02A0BFD2176D8 +:1016A000C9CD3715C58A42200B164D9C11A02B9928 +:1016B000BE01C56F0D87352700AD4493CA129AA5A8 +:1016C0005BA68A9E6ED6F9F3D9BA5BF1406E461BD3 +:1016D00071B8C16DA06890F4E3E2C565BF676C5353 +:1016E000BAAA6A450987CBB88A24C17F3313F8594F +:1016F0009232B3E146AD8609543082F91E0BE1C740 +:10170000B20E863CB7D8A4E60D8CA7B0E568CFF73B +:101710000AA7FB752432935CCBFB07479CB0B770DC +:10172000A1D79E0571AA70391CA9BCA7178D4A3F85 +:10173000E21F0D59B0C370E3838E209CF321A8549F +:101740006883A15249B7055380A2A27C72FF4DDC89 +:101750009428A3A38A2F501A74E2B6657855F13104 +:1017600047A314A4D6DD1F53856E9BD265541B2559 +:1017700030FB435E73FEB4E3E8E5F906B85915247F +:10178000D3DCB8F8411D52B3AEF8948853AC5B304B +:10179000E85C01C78189888B6E25E9582145428D17 +:1017A000052D0385554BE1B0C883001A304D673DC8 +:1017B000530631B5905AE253BB8F985DAFCBE1D45D +:1017C000776DDFC48CDFA3528C86BB971EF77A3B04 +:1017D000C33D196278590ACEAAC99DB2343FBF836E +:1017E00012DEC6625716A3B5E74D6E4F081A81A5E3 +:1017F0007CEF101373C541120BEC1435C8CF7D0E6E +:10180000F334C7C18AF5F5600A63CE48684BE50634 +:10181000DC22B0BF4439697D747B1738F1ABAB2E45 +:10182000AECBA36D312D531645F652579295447B9E +:10183000D985A4B43E77F2246B117934414875D62A +:101840007D8540E39FFC2EE2E402F74D9A19E8976C +:10185000DF15380E0F629D453E435734491915A1D7 +:10186000543FF92B5B642F314453E47867A486849A +:1018700004B5950D76256F8CABAA5005F22F3FD895 +:1018800087AD5231505BA9036552F47C80820C6FA6 +:101890002301EDEABF033701A95504A8B494FD6DF7 +:1018A0007E1C377344873D6A91C0C8FB8E361ECAC2 +:1018B000C7788307B2B2AAE2CC607829950EEB2DE7 +:1018C0001F876364217D62AB9E67841573FDBF4EE5 +:1018D0006004B2591FA9EBEBBC1677747B9B3731C0 +:1018E0002606FC2E3EEDABFEE6B9C4958743CDB689 +:1018F0001365F333754C922A49AFADD337E635F40F +:101900004AB6D0325BA90DD99204F57E132C28F982 +:101910000FC706F61BA404F71F8CA06DEA0CD90CA8 +:10192000C3377B514F3C65E635CF284980510D17B1 +:10193000A0BC1ED3C2FB69BD4AC61FAA5EE6755F86 +:10194000B058946ADE746D5600540F8D48BB940FE6 +:101950000421FC15BF5BCFEA9088C2217F3A679BC8 +:10196000988B19C2CA7C45804592DE10101D2DCF80 +:101970000DC6846062A1B2FF06943D57DE07E0FD0C +:101980008AC0B0E5D9417F93AF214DF823F2E348F7 +:10199000DD89ED309DBF04CDD3DD1DBA0BED439342 +:1019A000B98AAABDF1987FA2EB9290B5B11A2E7DAB +:1019B00070223719E66D975BE317FA5190E1B47521 +:1019C0001E8A79A66A529823C05A14E23737658175 +:1019D000E12023BE89B97B4C1BC9077B4374792F57 +:1019E00034F327F5F37B2CE23C6A9193529F2AFF54 +:1019F000C3B5FCF3A6705C456B7CBF7CAB185B8DFC +:101A00002FF9CED16B0A11C59EF98E25446DE0ECFD +:101A10005A8F0026F429689545E48BE67164CF3F20 +:101A20002469D5B6FE27424284180BC5FCEE95BA50 +:101A300086DF79958D9986FBF4DEBFEC1EF2E922F4 +:101A400022A85CE4AD7EE71D6315DE6567297AF6A2 +:101A5000819950A9803AC811CC06C7F19E3752DD52 +:101A60009FDEA8C235C2B0139FA4F65804D806E57D +:101A70000FFF6BD6C8CF4F2EBF57D34FAD48215164 +:101A80003EFD7249F2BA29A443537625FC7C1A65BF +:101A9000E33EB360525A23629A5B52C83946A3A40C +:101AA000E63E667C2C3605CA35CF169EB846E8E978 +:101AB00036FEF68D4FB84FF31770C468DCB466FF7E +:101AC0004DA8C3A580712A84D0BB3472CEB9D14A47 +:101AD0005D11B0E036B49DD5FB49041F02B6820209 +:101AE00045F0EC132168C9DECB612CA0014208D778 +:101AF000C75791471C9C54B81B46105630F2707F54 +:101B00005E3CAA834BCFFF89D02EBE3D447F324638 +:101B100023D703ADFACDB07B808D7FA132BE5910A3 +:101B2000E16DE37072FF59BF83B644DBDB6818B91F +:101B3000BBA1B056C1FA22C8EE32842F7B37C4B1A4 +:101B4000C1F3E83F74D5C13B7A9D46A1CBDC69E87F +:101B5000226E05219F9F3E66221333B8A3D4CA8B01 +:101B6000FF0248BA4705365277C17A1993FCD4F67A +:101B7000611CBB8C944F751E3D0ECE94D5649AB7F4 +:101B80000FB24FDF39FB503872056372E10065BE5A +:101B9000A210439977483FEEA3DAE7ECE0107B8987 +:101BA000E286FDC0D5ED394233E7FFBD1F7C4437E7 +:101BB000818E6A6562B5A49FB742BC4DBDFDFE0D26 +:101BC0003F0080DDA86485F17B584572E8F45D2E06 +:101BD0003FCD0DC857EB7731C4C04555208431B691 +:101BE00039050833354FD38730FA6963D01BF9A61E +:101BF0002BAF74738944405A00BBD19315A4581479 +:101C0000C0F46A13FDD7801B6E68AB9FDDBE872CC6 +:101C100088713096E6FFA2D088FAD449E4FAF10F31 +:101C20002593F87CD571D839A6998033DE31F60238 +:101C30002E6D40A634EFF5AE6532BC4E9E291C29B0 +:101C4000310A4824F47EE708092D65251AD2BDB073 +:101C50005443D21B22316CC7523A45FB3ED92694DD +:101C6000952E7E17A36C9FF3133738AE3B5EDEF2E2 +:101C70002BCAFE3D933C9B1C4F73E53E3D00262541 +:101C8000536FCE5281203F5F86FAB041252E0E4120 +:101C9000D2A56C342991A88DF221F6B071D36E0DC6 +:101CA0005A6144EE694AD32DBB1808D2050EFAF8E2 +:101CB00074892CD2EA53A28268BB23858B66D20B2F +:101CC00085D2E52EBE3194EAC08D4E2896178F201E +:101CD0003DB1E697BD180911B1AAA70EA303EC10F8 +:101CE000621CC79A2480D42D2826CFD80B88BA9B93 +:101CF000D82EE96EFCFF1BEDAFB16DF7DDBB35A84B +:101D0000CA4CB267A9A950A01002EAEB41EC1C8AA8 +:101D10009136525CD1D4F085415722D8C5925DEC02 +:101D20001EA9CDFAC4FB7E905395359A43B17E75BA +:101D3000F0DFCC28C2CA0BEE9A21BB0153229805D2 +:101D4000AFA3CC53E25DE45A25DB621DCD62738103 +:101D5000E5B0E11BB9109E0722CE6900BAEEA52CB2 +:101D6000E7E68F2F1D3DD9D9C6202B0D938139046D +:101D70001CBFB498E033F55B33B7F12C3E239839A0 +:101D80004F903ED2B87993193FB8680A9843798644 +:101D9000ABAF87094F2F859D4618647500D424FF8B +:101DA00032DAB15623CB164D5AFC38DF08D11A96D9 +:101DB000F82E1B1C7E67EACC1F9B272B8476E185BF +:101DC0000148F012AB62DB591A46E5230C49D3FFF8 +:101DD000A194A062588D1AAE5ACF8FB073BDD2DADB +:101DE0002E85192CD391354921471C9B6BA731FABD +:101DF0000F2A3D32D9712F3B9653EEE165FB3DC072 +:101E0000C83231B88C86F98D2601C3EC201103BF8E +:101E1000F19D5E5BF83DC433383B44BCCC52451A5F +:101E2000359B9DA2AA4502A2DA41057381E3B6E47F +:101E30008C5B7F5CC67CD5D219DA13D4AC9EA8D05B +:101E4000E355B7CF2137FAEA52A1E62317F44C370E +:101E5000F2AC220ED30E9ED95CCDC650AF061494C0 +:101E60001CAB55004600702A7DF8C341FF567EA783 +:101E700033FFC0EB1B43058BBE91D972BE1A2CBB3E +:101E80002F528766ABAAB2D29911AD66B3A283EF87 +:101E9000FC024A9DD9AD3FCD8B4B354AC6970CF31A +:101EA000569D5DC832E59095A48799DA932E7BFD07 +:101EB0003C54F98D547DE893E7164C818895425542 +:101EC000FAEF6639B27500CAEC7F8CE4FF09BF43B4 +:101ED000CE8A5DB5172D9F17370115B27E11B5D685 +:101EE000FC53386D0FF10C5978FA069AD595C75AFC +:101EF00096B39DD326B95DD4E6FB37599612A33627 +:101F0000C62309B8BD82C5CD85DDD787AAD8B2E87A +:101F100093E8EF2DAFA31D5AE3CDCABA6886EBF65E +:101F20007A4FF43F3EA4F6F727D5FE3F8428701B76 +:101F300092D954519173EC88EFC1D463BAB2C2B94B +:101F4000ED4ACB574EBCDECABB7B741247590976AB +:101F5000D3D4C06EF0FB282FE00B34FCF7F992A429 +:101F600025987A2D55D00CE4444A46A7967F3E2109 +:101F7000FD43A9B62388588340B3550A8E65CAEF3E +:101F8000E97196533094CFCD91D62B163C2A8AC84E +:101F9000CD409F06B1DAFE822100976291EF136077 +:101FA000CBB7BEE4BCCC318C24FE54542D050E8638 +:101FB0005D61D1C69AACD77869D5ADBD4D57AE2617 +:101FC000FFAD3FA08EC2AED5B679D9A95AB0CCD854 +:101FD000C5834903C1B207A2A26FEDADC8A350E407 +:101FE0007D4AB5A3113F865180C9867954E8093FDF +:101FF000AA7D8C1B68580E0012DDF43CB830F44802 +:102000000F994E30A3D5066ACED6B8CF61102163A2 +:102010004B2B52CB737A74686BA5A8CAD4C6C02A5E +:1020200093A7AD67FCA2C3C18B7749129967A0B291 +:10203000620DC443D14B9E1BA3D1E24C964D412669 +:102040005BE50644EA2EA14ABDBD326E89BC523919 +:10205000ACF032F4BCFC9FFE0D657C76B359FE5BA0 +:10206000052FC13996A81E3EDFD93EE3C803201DC7 +:10207000250AC8FA7B62707F4BA3846D04B324AB3E +:1020800030DA48ADFFB336431D44E8D7EFB6D76822 +:10209000BABD9243EEDE2AF2D34EC499EB45BE1789 +:1020A00017671135C7063534C867F44A8DC12AD180 +:1020B00024985D87D00879C724D9B66A74BA9E7609 +:1020C000BC71D06B186FFB5C0502EED950570AD774 +:1020D000497C1BB6E28AC20CBFEC7B3D1D5AB4E9B9 +:1020E00042604B009DB7226F8D6DE57B97472CF9C1 +:1020F000E8DE60B185CD42087F6ACA17E12A7E8991 +:10210000E3519F2E7B0D418FB613E26EE2D903EEB1 +:10211000769CC7C823C4DDCB5EFF6BE022E6D417F4 +:10212000A6B25482CBCAC9064CE607A45386F889E6 +:10213000A773BB327BACBA9F21E0236234EE44EB41 +:10214000594DAB1991BAC8D8C4E11CFA3488E0B132 +:102150001A6492759894586E95A4AFB860071210DF +:102160000CB33C04AC4F1C6984CD5406C5ABE0C431 +:10217000372C4C88BC43B44559ADC4F85234833C29 +:10218000AE5C3F88C4BBD6D19AB8684F33BD20E05F +:1021900056909490150A77C1DF4E1288BAA90A2D7D +:1021A000DCCCCCA3A6B4BDEF658F1A155044AAAF02 +:1021B00095C1AAF028552A10AC2049AA7C77E3A142 +:1021C000A810B40485EF24705D5BCC7C69C98A09D2 +:1021D0001B34314CC5D297465522961DF14213D17E +:1021E000031BB0545E0C0890172278A58862987D76 +:1021F000ECE3CF7BA78C554B6B016C8D445F9D8FBF +:1022000082AEFC06AE37E760B6D298BCDABB2935A1 +:10221000D54C2D7F5C9E4A0CAB2AB74C01CD215486 +:10222000D1D1D3740177C0B54B50223EDC5CAAF209 +:10223000031E915BE750DA7923E46084F507C88ECA +:10224000B51868E7955F2C821AC48EE98553003C67 +:1022500046039734A3D6ADBD361F8A73BE366CC80D +:102260008063931FE605B6F466D4E15A18A23BC416 +:10227000A34A17DA00E9FF20FD16DC788953F380C2 +:1022800031022BD9DDA50E34F484DD28B9FDCF5001 +:10229000CA7564638D18DF95FFEAF7E0ADBB48F0BF +:1022A000A564589745D5AF84B3E02367CD65518FBA +:1022B000BDB8BD2FF75946C77E784F3B21ACDD2610 +:1022C0008D3E4AE554CFF948D94996F626A7CC3831 +:1022D0005EFD2A4814941D7A5141156CE472468EB5 +:1022E0007806A9BD6B6CAAADF056DF6D2A7E251A63 +:1022F0005A007FF0E71E8D322E2180BF9B91A87D72 +:10230000ABB10D5331CFDAAD3B52C18B74C9E85735 +:10231000870DC19FFD2398C17F55672A4AB7508B0F +:102320002FE82785C961F2647594BDF6A1A60ABBA2 +:102330005FBA2A8B7C93991A0AD5D20E9598EB38FE +:10234000932E77B9A3B22AE1AB5D30CC0204362AD2 +:102350009FEB4DE21D42ED15A70B2596D0EF94663D +:102360008E3BE72F8D07F4EA4E5C2F9818B2345F4E +:10237000EC4537E96357F1D76EEEB1BCF06DCB6930 +:102380007B057A1B3D086EB7A23B3B9F24310E9222 +:102390007CB82F2DB9FA9C6A092932CEBD6CF6E8BB +:1023A000668354A37854A2ACED6A7E5219CD0F8691 +:1023B000B0939E137338BF9B82509202AF4849EE90 +:1023C000FFA68BD732271C0B86B65B321CE93EE595 +:1023D000DA0AF9630ED6759C18ED9E884FB504C0D5 +:1023E00068B13D69573FFD735016FADFBBE2F993C0 +:1023F000D1A937314A875C89366A2E1F2913545375 +:10240000ED5E6CF37CCF35E98DA9C86490EC9DFB43 +:102410002F22456F0D7F1720425834C086B0B65D1D +:10242000A26390BF794472DAD271BD67CD7BABC035 +:10243000E4A67A6278576997880130EBFD3A330455 +:10244000ED5C82241B0C1C3A8382AD8B46C953BDC4 +:10245000A101AE6C36C03CBDDCCF9CEF871B92DE89 +:102460005F60C2E8C9790B715EA26B6315C458E264 +:10247000E7C2E462F8F19F3608BD1758B8BC583B74 +:1024800076D191A28FE4A77B89034C533583102822 +:102490001ADA9B07368BDF2CF4F4C9D6338C40064E +:1024A000698AC9DBE36CF920CC2AE87D11B30332D9 +:1024B000D887D1B725594D42CDA0210C7BA065C04E +:1024C000AA10EA22B745154558384D120E78CDBEF0 +:1024D000B856A7716539B8F1F59C2B4CF7FC24333D +:1024E000EDF94AFF26CADE10F0C984972592DC2C4C +:1024F000C65318B68B8541D37A53B28D783EFDAC66 +:10250000693512AA39B9EF65D479FB2E45136BCD25 +:10251000837AD37300644A4E3DBD8119C9041DBD41 +:10252000680117629C8374ED3B8503D9999D39CA74 +:10253000E3515D856BEB26B9AEF8289CF7F9998DD0 +:102540009CDB89D9EBD71CBDF384620AF77D2BF0A5 +:102550002857D545DE1D0791A4E853C06B40ED0513 +:1025600090FDBFF3CCA38728098E4AC9DDAE7768FA +:10257000ADB53D0079337700A5F7809A28FFCE2AC4 +:10258000EA5C2B075DB9DC3431C261AB6C70930E31 +:102590004C6B5FF0262C2C3BC671AE2404ECA27D64 +:1025A000A0A91A75BAC2F4BF9374631D42FD849F3B +:1025B000447987BA3708D3638D8814B485C25572BD +:1025C0009AC3DECC68BAD43DE1E23732AA8A558399 +:1025D0008AD49798281BA46167DD22332A52EBA185 +:1025E000389C86CAF3A61DFECF720D9225EAA9FF7C +:1025F0003E4248C6560131A95BC27E8CB68F9F050C +:102600009EE49CDF4937BA879BA67EF94212D977B0 +:10261000813DCF57456061528F32BBE7A20F221731 +:102620007C4C2646969481DFE7867D4A50569A4533 +:102630008A2B321AF2EA0EC806E05F26122FE9C38F +:102640009CCF3EA366454598F845272B4836E34383 +:102650003943284998A4E5F63D61BDC08425B359A6 +:10266000054F7ADAD40BF11AB565F97ED9DB078804 +:10267000A1CBA465C4DDF441264334AA61FFBF8722 +:10268000D52F0DCA985677C26B35F8ED4C2EF496BF +:10269000ED6297CB59CFE1D2656E56337A0D3D137B +:1026A0006FF1CDFF6BC819EE11F38F61CDC969B819 +:1026B000B6FC8456268A3D28ECA13AC83469AF6539 +:1026C00090AE6DC9AE11FEAA88A91DF914867B359E +:1026D000BA4C2EB4C4495DDB32FA01FCE4D8646024 +:1026E000C3926AEE4F3B9EA4F8D63E16212ED174BB +:1026F0002AFE2716A6BEF4550C952BAF95B6B8CA80 +:102700001F3D2CA98A8A73D2437B1C92E8F45A2974 +:102710006B9E5A8F6C3BCEE391DEB674AC35792656 +:10272000390202A34AE00F5FC085D2C9174E5AF999 +:10273000B4E4AD658445F3F559F234208940F8A33B +:10274000383ACF5F149F85E2321454589DB9708394 +:102750009B7A33028A2FBC8321EACFE7023AEF6DDE +:10276000B6A4CADDC170B6FD33F83B5D3B48055BDE +:10277000E0768F4F410A5950272931933F79A05F66 +:102780001402D2E574112FA1BF0F684796B062DF23 +:1027900097AE00D833145053C80D3E9446A6F73B6D +:1027A0007BCF00A8E1ADCEE541200FAD42A4DE9F76 +:1027B000FEBA09DC47F3569276431ED69A1819F1F1 +:1027C000B4D424139F12AFAAFD17DD1F886F258F85 +:1027D0008CD4044FC430FA08018B93BA125E69336B +:1027E0006465C7C6ACC6FA07224FADB642A9540706 +:1027F000CFA19849A68D62AAF3B5A45B29A50D7552 +:102800001A8032FD60B477CBDB3DC46F78361BA0F5 +:102810006E1482B4C7F9DE48111173A534BB0EF5EE +:102820001FAF13A77C0BAB13249672A531A10B65C8 +:102830008A954388006CDF5FA2AC8858DEAFCFD3A7 +:102840009C47079878C3EAFBC154A4DBFCFD1B6AD4 +:1028500098D76D2D661B30420642A555594DB86E6E +:102860007BE5D9BFA38D19AC3A570D869E66A1D7DB +:10287000385D15B2455EE1BF34CBCD904D767FE03B +:10288000A8A0ED5AEF81A85F7FA2168D43AA5747F3 +:1028900004AE40721384CCCE826A4E7667A1A4EF58 +:1028A00099DD41657FC5406ABE6D1A2D288D9A5C01 +:1028B000E91D4662BF70003AA2BA15B79718DD52FB +:1028C0005755E2A388593000609AA25C3A656B7054 +:1028D00088FF2A52BF3DAD6222F3C93705C464A701 +:1028E000E26EC4D788E1DC6F15054BE2B3B3CD844B +:1028F000F7423CDAB1ECB8D8217518A91EFE63CBBB +:10290000340E3014CCAA149AF9F2871F95A01B3C00 +:1029100075D3E6E99035E1DD1A407355098E032E33 +:10292000DE59EED046B9F4228C3FADA625D2D8DED2 +:10293000DE6D9225D0D68CEEB4E387E209F4E8CFC1 +:10294000BD086ABED3F2610E7F0A6A0BF57C24983B +:10295000E6AEB51D4D12AAE9C715141219974C130E +:1029600022C7135BFE9C5D8ECB20513D8DC3252D70 +:10297000D931DA0025D487EFB988D9E16A57E5EF74 +:10298000C86A4979E8E982BCC7801037CC79266BE0 +:102990009B2BC046406362B229AF11CB2433C2885F +:1029A0003D2167A664FE2A6E709E135347B9730ECD +:1029B000092CBF3F2285B31FD539EFA4FEC7F6719E +:1029C0003FF1D6DABE2136CD05B8E23A8AB1C08DE4 +:1029D000B7F1C58C63E4E64AEFA47A9BC3844FD772 +:1029E000D982777EA5E24CB32A7EFF6E69A6EF02FC +:1029F000B8FBF65040A0B7C5E9CFEC6E2A2887F5A2 +:102A000034BE68CDDC6BDFF2A5E0B5FDE1F4BA467B +:102A10006E6DF818E33724F0CDBEA19CC9309C99A7 +:102A2000A77A1E5F03EB507E3E30548BB6A715414C +:102A3000B7A52D250EF6601FA9F5393D81ACA43050 +:102A400053BDE3E5F3BB2C61C141D8B2E6BDFB5BEE +:102A50008190CBD1FFE7551D677D41594D629AD0DA +:102A60004A123877FB629DE94C106A3989249191AA +:102A700047FBE405A56DD427B26D701150291D9F49 +:102A8000B1A748888FF98B522B756325EAEA3E621D +:102A90005128AAF9438211B4276FB72F44911070BF +:102AA000D57BA4D5604F1B10587039F300C244D1B8 +:102AB000D9297F700A73C81F5A601590DBB8181B9C +:102AC0002D70291C1E88401D6552D6C825B3A181D2 +:102AD000DB2344DC5F83EA1D4D2AFE7EEE56384937 +:102AE00071A78DE3BC0FF78501AA697CE575BF6905 +:102AF000BEA62370DADD6881CECD3B192D22086E8B +:102B00000A5EC1C198DADF5548E80DF304AE9D5C5A +:102B1000B14923AA564BECB39BF965C5CE969F08E5 +:102B200081F6ABAA2D95B0DD01DF5BCCB2802C53D2 +:102B30002A772D6648A025A1F9A817DCDBB678888E +:102B4000E9F2CD8F3E900C9D452FF14CDFABDBC8F9 +:102B5000F050BAAD03C1214AF31D5199B8C785A8F9 +:102B600063732ADA3638B54A351E39719C8679D6B0 +:102B700057E0399F1F54A0050FB161F6F9B82DCC6D +:102B80006646863F54821102C54308D11FA43CA764 +:102B9000B35A54167C7A351C0288AD55687CE371B3 +:102BA0007BF93F1232535D1617169C38705461E062 +:102BB0005F983C6DA7B19337149C69438FE563E937 +:102BC000C44EEC527AFE9E6ABD48CB001D281AF115 +:102BD00045763D06F51D78F41307DADAB01B06A733 +:102BE0001D54FD28D6CD63EB73BDA3E7C9AE2BD52D +:102BF0008760CA538FAB8360619B29ECBE039657F5 +:102C00005273013332A10D646D6C69807F5529E1E7 +:102C100039DAA0050C3AFC8A1CA193254EBC13E0BE +:102C200024FCFC25DB20930906C71E80B4A328588A +:102C30009D533A3054FB157A755087A2CD0C0DEC9C +:102C4000F710820F5EF6282F2F71DCAFA0C57D89AB +:102C5000E58258308C9387C1B7708F11FB8367C4AE +:102C6000A37AE22790DE8FE4FC14A38CF39A2382EC +:102C7000472F43B29CC61642F18A7A9A3AEC68DD35 +:102C8000B2532F164E693FFE95D9008B01DD775761 +:102C90006B24DF1CBA3A8E671ADEB9E1D84D21C029 +:102CA000EFFFBE2A02EA1E79D0F1C75D4C879E066F +:102CB00099E1C8B6513B2F158E660C71491E59A477 +:102CC000800C55B222C3EC34962B3A84800FD62068 +:102CD0004C3122D0F5CA641A85AC2B31B78D9207DE +:102CE000AFD8242DC2CFDDD8E7DCB1C18E5400A50A +:102CF00047B01E9A1BF8738A74A9429AA8FE95D60B +:102D0000D5D8B963F6A53A988A64D8B6271385A8AA +:102D100082CF831BF61D2F37DB5288B598D2F4ABD8 +:102D2000646553D46958BF0D1F61840D19BB5AE700 +:102D3000D9E1CB30F0CD8C8B1C9022825F6D64E9A1 +:102D400089EC390F38F5B194507833DAE3622B15FA +:102D5000B47534C2D7DEB905C69173A1EA68EBDB5E +:102D60002FB606617F2166EEE8FB84B3C76A2A9D11 +:102D7000C998815499C11B92C38F6B086A5CB8CB08 +:102D8000EB58A6BFDCC786DD8833674D791D004C44 +:102D90001D71805BC4A8EF7F3D7A3AFDC861F519CB +:102DA0007A2D60CFEB9A9D7E5B5E866B106BAA33AB +:102DB00059C40C55111FE38D7A7A55082972ACADB0 +:102DC0008FBB9241062143E2A011C4F85570C06B3D +:102DD00042036FEB37D5DB1F348813A5C66BB47382 +:102DE000602A899C2899D56B9B11443A5EBAD1B56B +:102DF00099F9FA30DFB8ACA0E828F64737A2B67BDD +:102E00005690199845FF6CC0393C6AFA9CA6C0BC24 +:102E10004BAADF5712240240F7456235D3DD89E81B +:102E200090413DBCE428621422A9DEB82509FDE4E6 +:102E3000F9DF9B90F4F9C0C7B8C4FE3611A8458EDF +:102E40009C51B7B9C28914204A5D9AC76C100BC354 +:102E500094DC35C324E54CFD6A97ADAD4087E6A907 +:102E6000AD8DD1539AF5CC59CDD12A6E5362A0C104 +:102E70009EF17F174E73DC5879E2FADCB1254F8161 +:102E80007C61F1CCD54DF3EEEED86C5666A02C16D5 +:102E90003510EFEA4AA6CE0115D7B59105BD4B9D79 +:102EA000DA856FA049BB287C97EC3E5E0FAA40E60E +:102EB0009C45E5BEBB4D5EF9B125D7AF8BE51B54F4 +:102EC000DDF538D5B41CC3B241AC23C45C00F5B306 +:102ED0006C944323595C72B2F4A00CD0DA0DC6EEA8 +:102EE00021158AE60BC0E76A8D4B0A581F08616EF0 +:102EF0003F2A30E26067B3455FC40960215EF41386 +:102F0000FB13371075589FF3D6352FBB76C10816C3 +:102F10003A4BB8C66069A1817835B0B0F3D91E725A +:102F2000A4F54A6FF01B909E957F5B38680BAF4706 +:102F300012CC138C73FAE3F926BC95BB66FFDDCA8D +:102F40001A83E3DDD116DEEBB55EA90177DA4433EF +:102F50000803A36BF024CBB4E7180B861A0CA7293F +:102F60004110138EF549868ED677E6BDAC4F6D3590 +:102F7000E79A43C63E3B3E129FAF81E77049FB4E46 +:102F800095106568E724786C945F56471AB686EB0F +:102F9000697240CDB80C103265768495E6FB7309F2 +:102FA000B5746CE4B20E2067EEE357E6FC7A296F45 +:102FB0001E2E2DFDBD761E25C62E0821C7B2D65B5E +:102FC000813563C44337B12DB39E88939535CEE4E4 +:102FD000DD3EC2BBB51C6C3D1C18267DEA5A84B48C +:102FE0005A7027B576427C45107DADC391AF7726E8 +:102FF000BE741BAA1559DDE61F8179ABC25EE89944 +:10300000A3B1008850E205514E3E5B7129782889B2 +:103010007ECE1222224ADF63140881927ED7130EDD +:10302000FAB957122760C3CC0E4EA7A6252749E34D +:103030009E3385C175F0E3C723E7FABD587992F254 +:103040008ABECE9878A8E32CF2DB6A265F98CB4F35 +:1030500009914659D5C32F23604D37D7AD28B5DF29 +:1030600067F11F59248C033CA81B8D3CA416F3B8B0 +:1030700097EED7421D496303B57A052EAA394C68ED +:10308000343C7E6B4027B875C600DE4AA020D91DAF +:10309000A4DF4F5AA439E575A28951EA8D2A2C0B79 +:1030A00016E2088B20213A917765BED43BE5938CDC +:1030B000E66250C24C05B47DA6644550A5CDADDE98 +:1030C000D5FD6FECE1A5C9ECDF42523DFFDA31AE30 +:1030D000774E55B06C4E2D4CCC586A1E1C01B885ED +:1030E0005BC8A018F0CCF624E0BB8812170B037F56 +:1030F000993791903E344F989E46F2F96B0F2D65AB +:103100009A9328875FBEE0FF2AF2162D88A091C906 +:1031100071AC717851805CB515D7B069A47968B786 +:10312000F4CBB04A19EEBFE080F8EE13DF5967E048 +:10313000A2B650FC3B63427BCC76ACE51BFA8BC459 +:1031400097E572D0596C439A2D5E783EB48EA547B0 +:103150000901539F6678C3B2D04F1545A199D67027 +:103160005F2036D0DF35E2A6E61419A2C8EE76A1BC +:1031700085199A4875A3C43374DAF39EC09156B585 +:10318000F33209C7941F45AD50527BE1D5A8F62113 +:10319000055ACD898760004408F3078A346EADE98B +:1031A000F843C6DEF76CEA6B7ADDD9018B05CF9A5E +:1031B0009DEE8111C46B8E4B547C3F1A6F3A49FBD4 +:1031C000FD2D9DD06388DDC1197055534632BC1E5C +:1031D0008BF28AAEB397BEDCA625412DD446F7DE2E +:1031E000FC1BC41E7448B5C98177E986F0D993DC0D +:1031F000347479FD683B8C85780A2A0C4046748BC0 +:10320000F9B289C1F5CFC412A2FD407F1C39033247 +:10321000B0CE56491C84E490F3408E5CD4C3514038 +:10322000F757F1E51D56F8B9F08B73312F8201D7AE +:10323000122F6D3D5E194700564C977F8F0C9CBB3B +:10324000DC5CC86F1A314D9DE55E0C5E4E06DE44B7 +:10325000EF09945B8A521AF5BE9D8A7944665076CE +:10326000747A94C6B9079F89702743585960A3831D +:103270009A4537D4924A13D9A3FC498819002CC126 +:10328000330D6738A6611697AE7F73FAAFBAB55B98 +:10329000F3A6776D149B9CDF84F5C11CE3DD9C9E37 +:1032A000CEE260B522264A7AB4086FC056725D9AA3 +:1032B00083FA84C110278413038C37DF3CFDB06C84 +:1032C000E97AA53913A2D806660F6BB0E39CB4F374 +:1032D0005AB698C058690C650E2162D855B69FD36E +:1032E000B7142A6319E2BC0722175F47024D94A363 +:1032F0004B865B2898313AD0C10603B7723E44CD65 +:10330000BC0641A32C7BFE10871B65838B13F9D26F +:10331000A8A01A6F87C660D9A1EDC54893644783FA +:103320004537AA5E4E865693B6A8EC6A7B16CE1633 +:1033300004A4C1A46D153A4E59A5F50D6AD8FA58E2 +:10334000F10B506469EB75806F4692B15EDC4BB057 +:10335000A8F2594C3E5BFFFF627FBCE084A225B21D +:1033600089E48729FF28FC9C511936701E43586157 +:1033700093AB47A022A75E29A887231F0A162AB36A +:103380001E18B9670BF85A659C7F02F94962D15043 +:10339000FD6D5393130C2D0070D49D9277F54A82E6 +:1033A0009E1603557D6D6A03088A667942149CB2A5 +:1033B00028604A4966F085140CD159EC29647CA434 +:1033C0001C66F67ED4674430B02DB33FEE0BEBCFD6 +:1033D000959F965FF54A25C7B22BDD0CF89A4538C4 +:1033E000592355D12B861365C9926F460B08817DF1 +:1033F00006E0E41EE3A66FD35BDEED82BE6761FBF1 +:10340000EE0CD732BFAA42C814C5E68049F867035C +:10341000DA7395537291439912535B43D79890EAAC +:103420006C0D5F1DCF83ADA58384901CF0DCCB2693 +:1034300079F9D94969AC60A56E5CDF8E452A6BFECF +:10344000034A26A10EDD23E25875C7E51E57EB6C33 +:103450008F55C9665F7E4FA8CF3C8D9D537ED8B2F5 +:10346000B7B5CDE3ADE6EE9DDA8EEB754D028A4A37 +:103470008E2C32B8E3D995EDDC50919B3491143702 +:103480009285F77EB13541CA777AB986C4039B88A5 +:103490002D7AF8EC84493580C62B241220C53F04D0 +:1034A0009E6AD7F3278537EBF82F47E7195E5BBC99 +:1034B00012EE0F7328D0B1976412D6F1D4FDCB5120 +:1034C000421FEC0CB31D6273A2123AD4ED6261424A +:1034D000B7067BC5E223BFCEBD64242BD7601D4E4B +:1034E000A3905EE218984B8E0513643829EF2DE304 +:1034F0002F4B152A4CA6002529391AF6FE88E2140E +:103500003E4F128768C1F5EEB306A5A05ECC65FEFE +:103510008EAF9733CD17A444DBC6AFFB9AA2C55537 +:10352000216C0641203DDCB437CB95D3E0A0737D00 +:103530006011E3ACDA361F6D0A599369FD85E21E0E +:10354000A4CBF803F35A0E74EF66B4145CCE8E6904 +:10355000D678A5F5CA652781CE10F6383AAB125455 +:1035600003969EF7D8BE2ADB786ABE3A70D990DD02 +:103570006DE90CA763352DCEEB09502CC0A3352780 +:10358000839536C4927737CA5309E21CAF8D33D482 +:103590006219C39F78B413C2C7EB5CA9582B71E2C0 +:1035A000F7C228E7290CFADE0CBECC2BB416BB7A86 +:1035B0006BA3FA91C77FE72840551D027B886A8A72 +:1035C000481BEF5D125E37C28E527B7029B5BA027E +:1035D000AB5F5EC3A29C5831E689A0CC8237C01095 +:1035E000E86B1062D6676741F0C51FDFABC9747026 +:1035F000D12607ED48346690D9B2465B556B4B6DCA +:10360000DEFC3C4CAE195D9C3852FB62C07C72768D +:10361000B6DDFB31B276FE9ED747C2F2B47A51A630 +:103620004F618D9AB55B3B54E92045919CEF02DFD9 +:10363000FC21F272968071F63569E772EF36427EB0 +:10364000B888E9FDAE8836E8792F53C5057A6361FD +:10365000868F6DF37CA1378CEDA482F21F359672B4 +:103660005F63CAD91F29D4CD66532E5CB26C5173E7 +:10367000E3A9756CBB03595C0C2FC6534AEE3FFAA5 +:10368000B670E5A4C0526166505D193658C8AE9553 +:10369000B5A310E4495FAFD2155D0E81CB766641CC +:1036A000409886DC519C61599113DE2DC8C0936B04 +:1036B0003FC6C7E3A71D3CC46362E3D67695C9EF56 +:1036C00099D5508FB44363DAADCF97FD793C2796F7 +:1036D0005CFFEF77B9781D82A2DC1CC4C661B9FC1F +:1036E0001970ABD917391645FD182D5048A5F12F83 +:1036F000B549CC6AF875AAF07779CA3A80EE2B887A +:10370000AAB2E4CE9A02AFCA19038BD916D934658E +:1037100011C6E1EADD2C9C195EF195F563CF89199C +:103720004EA6E46CA2DB4ED7593859863859AE6F95 +:10373000461C87A719A7726FD1B6A0C12B1180ECC8 +:10374000B364562D763404F2C0AD1D007316F7EF46 +:10375000A381C9D8C39B12AF4ACEA1D2984E091DEE +:10376000826A3A425ACA1270A10BFFB5AAA7AE8468 +:103770004C42E23546F02EDD77F45291795B21E63A +:103780001A90D1E8C74D474691652323CE1CE85CCB +:10379000045A37EC966F71A50D9C9E3E83A5375851 +:1037A00027F643304091FF677DB25E595B5B22D3C1 +:1037B000F1C59D93D07EEB5B0CA371937934940992 +:1037C00031B329908D3F203DFC982936F4124FF3F8 +:1037D000022BD00690733CBC7397E9C4867CDAE672 +:1037E0007109BC64E6F9F0F30ECC5CBA74387C6AFB +:1037F0007162FBD387198E36A8F1C1DB4F1DE54EF0 +:10380000075396E454C450EAA2B8F1D7FDD82880F3 +:10381000DBE39F34586232349095D7D92B3A3CC4BD +:1038200072E9F76DDAE0F522360EDCD051D50034BE +:103830007441CDCC8A4552FD6D61E191145E6E26D6 +:10384000ADE92718453D1BB943A80024FD44666A2D +:10385000BC6F25725D9EA8C18686CDEB391BDBC986 +:103860008C800CDF9130D2C954232402707AC3D4E7 +:103870006A50B56A3F73F35E6D83B3C138E6AAFE42 +:10388000577F4635D52955FC3885BE911547ACDBA9 +:10389000879563C2D940E7CDCCCE0D850F41AFDC13 +:1038A000DD63C7E2E98A1D8B6C54821B0D554714FA +:1038B000F5DCF06BA4CF4BF6E1DCCF4418F07D4C87 +:1038C000F7CA72AE296131E8162FE6C8FB35B93F59 +:1038D000890B358B1EA614541E15404FE48471824B +:1038E000433E1DEFBF3410180837F8ED1573B5E3EC +:1038F00082F38B440A9A926CB3BED7A3BC6B771940 +:1039000016E5E968D7F93516A4742276AF882794AE +:10391000688FFF9F12B43AAD3A88C496D7281550E5 +:10392000AC7080E79E98DD8FA174F3B81B990C747E +:10393000CEF9DF695BA82ACC59C2004C077F977A81 +:103940005C72A421D2D935B7A4747AB93857B65F5E +:103950003D97FC0580DCA97E9237CB16EF1E0AB29C +:10396000F468C8B051146338A4445464748A41EEB6 +:10397000D24C63D122AE22DA1618681CB1E82A6D47 +:1039800052DADB8733A9A49BB96BFCE3FDCA9536F9 +:10399000748DFCF37ED1C4F5F5B31692B846BFC85A +:1039A000195F6448C6B19B0A1091251AB6EEC6226B +:1039B00000F49DC6CC3D7D616DE37C6E79A57E20D3 +:1039C000CCF5D3FD4F791B08D29D265AC39BDACE86 +:1039D000E842A4835A4EFF681EBE789B1E02BCFCC0 +:1039E0009597964794D21879345492FFB958BCB63B +:1039F000F08F5A8843889EAEE6453074815C84FE21 +:103A0000E6BB2676005B7AAC6CCE587AFE8E0F272A +:103A1000D75059C2553D2A01B5C1FFF1151567D5DB +:103A20000041A4FA1C3E4AA1A37C4AD541E0D675C8 +:103A30005CB786B1868AFA91B68E7B433216B6950C +:103A40004A52EE9A147CC9556F858128D99D9521DB +:103A50007C864628D7416776C053E2923E4EFDA948 +:103A600013F0635B5BEC48FCDE9CEC96A83CBE600C +:103A70001434A5CF82FF4B5A417DF58CFA3083EA8E +:103A80001267251EEAEE7E73A863A286E4469AB208 +:103A9000F3BD213061C5B41B93C0D2CAECB0EA2D8E +:103AA000DC8E16E6DCFCC5470434E4ACE8CCCF4839 +:103AB000920F48C74E5386E1EDF1DF24DFFC0DD0B5 +:103AC0005155A39C1AA82B761EDCB7845DD35300F6 +:103AD00077F7E1219DEDBAAEEF73331C2C4093379D +:103AE00049EA440523F2001A32FC31C36F383940E9 +:103AF000ED282C6DB3326D82FB3A961E20EA17B387 +:103B00001644D3B71281F749173DB725DEE9E59290 +:103B1000286DBEE0EE3B4E3AB5E98C56DA2D77744F +:103B2000BCC894104E743FA587DA87BA5BD91910C8 +:103B3000018BAE7E5F49429A127753F33C69DCE910 +:103B400005BC99E901D10F66C71525062FAEA3C1A3 +:103B50005146A564D172F500026DF118C15CF01CEC +:103B6000AEDF5BCB9011A1759E2DEFA7ACE206DD19 +:103B70006386AFBBB6844A5A81810B0C28038FD66B +:103B80002222A4A40D93A0BE09E8EF468371899573 +:103B900017DCE7E48566BF421748B47E10CEE8B66E +:103BA000687B8E4DD9A945B19A5100929BED9CC678 +:103BB000CA9668AD8E0884F9D16D3636DDBE177EA3 +:103BC000AB7BDED37B70A7B8B59052F647B25329D2 +:103BD000EE676D09ACB19274AA23AA9E1A3DCDE49A +:103BE000AF1BD5DD6C25226663F18A295FA588119C +:103BF0009CF3B39BA78018F3211BFCB21CD00CD6FE +:103C0000349E98A56EA8A9EF7BB7019F8D80B7035E +:103C1000CA6C863E2850BB14B5DB2BD865D3C92FA0 +:103C2000FD073E1BE4A4F79E00C07B81EE93540089 +:103C3000BA08390D12733B94954574B09EB02BB7FA +:103C40008DC8D20A434271EE4B06FD9DBA2B4A4401 +:103C5000BEEC230C52FFD14CAFF6C4EB532ED8EF81 +:103C60008E30748E393F12D9DC60FE9EA44ECA2578 +:103C7000C2BE054A4B93613BDDEDC9E3D37FD1B6AC +:103C8000BD384752FBAE940A7B9284AB52BA7C8C0F +:103C9000169C3C440EA7BC55A1C1E1DA14E13EB923 +:103CA000C9F1EA5340E53386450BABFF6800BBC260 +:103CB000DD2E282EACD62CCB7043CEA8F901BE0445 +:103CC0005132D76DCBE4C9CCDEA37CDB729072BAE3 +:103CD000F18E26121D282AD56E7917D2693BA901CB +:103CE000F33B1AD11E3A85D3F7865FE115F80A181F +:103CF000071D45A6C8F2822D8977CE6DB89F7F1B20 +:103D0000F8D58801BCFFC5DA7D31CD7DAB609D65FE +:103D10000FE762D0AF8A29E6AD73D6911FEEDB289C +:103D20003B60BD9F05B0CAAF7CD1A321CD650556D0 +:103D3000008BAC07D638427DB86737F5E39D5BABA7 +:103D40001EFBEAECA6183FD774092ACC9E2CF4B5CA +:103D5000CA131A47281855A7621CF0DD15BC6B2939 +:103D6000933FC0EB059258569829D2027148DF154F +:103D70009C52A925D86824D15A12B077832CA4FA72 +:103D80009A478C2DE38F59B88910386687D2EC0298 +:103D9000128596D38F76FD8494D4738BF04958C7DF +:103DA0002AD82848CAC55D8E9432E5540E0E02C842 +:103DB000300386C4827D3B7CA514F9566E61991749 +:103DC0006B951138D7066E66B16B1E4C14438C543C +:103DD000E7D5F4F1BDE82D96F890F8328298977EF9 +:103DE000460009AC32324B8279B1A1B74037465A0E +:103DF0009242E2014636E561E7ADB59F060B7D2AAA +:103E00001C4D15DD65661BA6F9530FD4778161A2A1 +:103E1000AE9AF9043C2C4D1883EABE4DD4A3F9F1B7 +:103E200056D80ECB6F909B527C5F1E52DC5F0F16F4 +:103E3000FBAB220D5729FAC776CA49B7A8A1287E3D +:103E4000DEF9E78B2B03851502A2A272614F2BD9F5 +:103E500065819BF7FC594299ACF9B7B0448B68185F +:103E60008DC3684FD797FFA348070CC63F6DBFB1FE +:103E70007060B563857AEFE2411156E30EE5CA1230 +:103E8000A7643EB2575EB7C91C0CA71419C8467484 +:103E9000686E2AE081245131C19BF746F604F22D69 +:103EA000EA790E0BE81ED906979C0C68F1C47FF0E6 +:103EB000D283727739A49BB6A61C24F750FAFA363F +:103EC00073AD8F6699B207022648776DC6ABD4D61C +:103ED000BF4F7BFE4645E21E6336CC5C4818E0AE21 +:103EE000B4AE6F0F2EAE5BEFDEF01411ED7830D272 +:103EF0007BBE172B10D22D08B2BC84614276A4522F +:103F0000692845ED21B18CF95672DF126849B5B6C2 +:103F1000B7CD9CB6794C2B253039B43F3BA805D0A2 +:103F2000638730350DE13FB45FE1B9A3630752DF2A +:103F30001BFB3D769E156AEC0373A8AE920392EDCF +:103F4000E9271869899EE5545CCD4EE046888CDAF5 +:103F5000FB5ED705FA5F1DDFC26B948A379FD4B42E +:103F60008DB0681E0F443506157403BAF10D802F0D +:103F70007A4C1B0994899FF587514D30F6630236C0 +:103F8000AF1E7E63DDE1976B160C46625641170942 +:103F9000FC4EE395C1AD863131729EB24C8FB25A60 +:103FA000E98C4822D2A6BEFBB7C01E35E1BD324D1A +:103FB000FCA4B9A354B2BA0C90E639146C979BC513 +:103FC000B06A589B6D68FC4A1D6F288D199D40BFD3 +:103FD0002E5F8ECCD945E5D2740DF1EEA9CEC29FED +:103FE0005933DCA6F425BEAD8E1595BE4A2B9A2E0C +:103FF000B5EE64C69B5DF9D1DFB81255EC8AE74394 +:10400000708110F659875D2AFF52C590295E04130E +:10401000EB8E1FC1A9FE0CEDA020C08C177748F7CE +:104020000AC22C4A248FFE82CF9377A29872CDBC0D +:104030003AEFDB7F07149418A898B568B44C62C8AF +:10404000EE542365D83A5C22B2AA3CAD674CF39497 +:10405000AFEB2DACE01D628D1A6DC46AEBA2B2D439 +:104060009EA6AAC7549ED438D0F994BFA75FD4E7C0 +:10407000A825C8BD0C5115A052F447555AAA328341 +:104080002EC6CA112AB6E7DC3EE0623E93A05A264D +:10409000E755DB547A587C511A5F6538C6DFCF92FA +:1040A000EA8CA4158FBB0FA5AB24D8DC580321875D +:1040B000B6EE8B79353EFF62649440AD4B1E947B27 +:1040C0003C78053E80EE3ABE82FD94B03335A93E81 +:1040D0008A00DD5D4243028AD0DA8ACB8BC7E1EAEF +:1040E000AEA0EDD2456094450AFD872ED36F40EB1C +:1040F00061951196EFAB64D3489B913EDE3A0992ED +:10410000DD76683E63279E04F0B2C1211036A2CF4F +:10411000FD1DD2AEF38DD107119EC6FD6F35914BBB +:10412000D72F91A4941F28915F00A5940436459839 +:10413000B48D7F0ECE050FF89B12BD0F365698CE6C +:10414000B8FD0C18F90A5C7170C1A24AC139044E5D +:10415000EECED7CB9DFE08EBBCE8BC9135BFE49119 +:10416000A12EE8487DF470EE295D553E2EE495635E +:10417000F94B0FA431868946EDDD543C9CEEB844E2 +:104180006370CA8FA33144CD0641186C0E78A829FC +:104190003D76A42A042190F0F0858DBA55482F0869 +:1041A000D9797F44FA7C750132AA9C8B3FD995E37B +:1041B000C27709E1A43B503660C6DDE4E7C7FAB236 +:1041C00030A24BF3418C614D0EFDBC78EA54C8F827 +:1041D000926876C0E1F22A51FA88E33FBA3BFE8941 +:1041E0000CF95E0B9E60DFC3705C4B694EA9AF712A +:1041F0005C301D8AE0415BDFB24ABB83FEEC66089F +:104200002056C95712052A0BBC868BD5A9D99429EB +:1042100038F4A30FA0F1C8E69408B9F06C38CEAB1F +:104220004BF837D137790D5362D3FB0132BF483099 +:104230009515E3BD25B489F7A138A312BA1ED25B48 +:1042400002A29F5877BAEFC5D45ADF8D76FEFBD213 +:10425000EB866A96C07AF7A74FD6028A4CF11460B3 +:104260001D7458A282D0B7F13558E34AF43B393E69 +:104270001F9A51441D29C4A092C36E58B340053201 +:104280002FBEE4ABEA97F8D783550FF8D2CFAC51E5 +:1042900018767AE7435B256F5FF146A5452DEFABB6 +:1042A000EAA18987F86D3361D7EF552B0F9250AA99 +:1042B0008599F00F11BB347002E013A1830B2C49D8 +:1042C0004492E0AE7DC279B7DD6F6B200DE508FA50 +:1042D0003D84B5D4F67ED3DAD567C83E7E9BACBBB1 +:1042E00072C8D394BEBCAB9E5C39217E39B553C72E +:1042F000ADF48C1FD462119DC694870E9BC53360AC +:104300006B8A70BFDA9AC2723FBF0F8E431ECD78A0 +:10431000E56FDAA4353D8147AF8C2C3B79320F3AFB +:104320001CD683F842C55146F3C9E4DAD5D50184D9 +:10433000CEA06A8D09AA4871BA9497E3F727897CC1 +:10434000629F5259D58D92113AA4D7B00461835B14 +:10435000C2DDBE7CA1861DFBAD82216C86669A7291 +:10436000CA7CA7C4171C7BA9F3106D69BE4B100251 +:104370001C82CA2A0B131C442A7F39F55D2759BCBD +:104380001D9D284447E51539F8FCD8F47030653890 +:1043900023DF751F9301F68D2214AD63AF23C8711F +:1043A000B1E1CB9408ED39922B7AF81925BAE8B32C +:1043B000EEDB5A5FA9C2D471B44422D9CDE5D7ABA4 +:1043C00054CCCA3DBA63B95C6B88B8E02A72690DF7 +:1043D00030C9B77E9E28B03DDD5898A825D00AEF99 +:1043E000782064BA6F0201452E4913AE898566258F +:1043F0001C3F1048A91F1134236E329B356B4D832F +:1044000034C8462F99DD34F2FBFB7FA3A2859E3B87 +:10441000E83B62E183F55DB1199347339D7CA90BBD +:104420004B80E78A67245C07153D2A5AB6BD1C6C91 +:104430008F30C6683C781E727F8E46209D82ABD43A +:1044400070344DE4C0045C0B8066303483CB23555C +:104450005A0C8792E79E59C3B1496071A9DC5B662B +:10446000A7EBC5A87A3648FDCE07D5D0D9C6B43E4D +:10447000FA1BBFED8E712BBB67CB5079F4C37C1850 +:10448000A9E913C0C0009CFCDB31641668F031C39D +:104490003430FF466A0780D824B3417D046EBF5A8A +:1044A0006E19D0CE9E9200247812E397281F4F06F3 +:1044B00029B630BD92B42B9D8E38FF4BDA9AB933B2 +:1044C000EDDAEA76B996DF062BE95F231478EF710F +:1044D0002D8CA64AF9809D429D86B107C04F80C6AB +:1044E000190A70669780B442BF3757D98723913F26 +:1044F0000F15BA9507F22AFDCB696381C2E54EEB31 +:10450000473F5A3955275487FA227150AF7790DBCD +:104510007085309152EAD26FEB1FC7170553CF3722 +:104520003A410CE0509BEBB72A55176F491548BE2E +:10453000E4A12EF59BBC600CA703796D6DA5E34C3F +:10454000BEFB2D7821C45FB3E588C1317D8E26E99D +:10455000F85BDA7E0D7CFDFE3AB332704F52D6C95D +:1045600059CF0BB84F266E5C7D3B735FC4848D388A +:1045700017EF3338C4BDF164F9A1B7A65CC7EB905F +:104580006E77B944A3439210B134453ABF1B31E66C +:10459000639F7C1A4AA0F9F7D40EAAD993EE1709A3 +:1045A000CAC2D6CF414BC9D09CF7803A86058167F5 +:1045B000CAAE349AFFCAADCD64B0C4E0C55660B28D +:1045C000C9B766163C7CB0B04FBA9BCA8E270EF4B2 +:1045D00069893BA3A939261ADDD02E125C2E9206DA +:1045E000373BC56B469ECE20E4371A06A1D008DFC4 +:1045F0007368F945906809DF8DA5DE9D0A87DE891D +:10460000657A9032E4CB22CBA791ADD5869386B163 +:10461000C5A4051641BD790B0797858A5C45DD4821 +:10462000EF10AB4374EBD7D0518698C2AE1DA1ED0D +:1046300014B495B1F6DB906C33F087FB824CF9F83B +:10464000F983F91A308CACED190E4A89333881E9B7 +:1046500091CC73D9A4FC8FEDA4148EC59974AE557A +:10466000B322D1690D209C4A5BDC0859882501439F +:1046700041E07B45FF6083C8B8B1D33140EEC4331D +:10468000E6460686C1FA5D97237F841F3A36D8EC4A +:104690003E5A697DFE43D4CCC1643B35375EEE8B18 +:1046A0001AA327CD8F17734CD0674B89F9BDA1A2F0 +:1046B000FCDF1D6DFF6121F15EDF6BF881801CBDA9 +:1046C000D5AA795A518731A2C69B6F3F8357AD1B3C +:1046D00031C5418C3CB61193891937FA6B5C00CB1C +:1046E000F16C098DCA0045430B169C3A8829007667 +:1046F000CFD56B1E1EC62FE21880D90A0B0FA0CB98 +:1047000027E0F6F472BB32A1BBF34FC6FE90D8D5BA +:104710005903B1830200396EEDDC0D36B322FD8EF4 +:10472000E9DA18B1290246550EB2C9E677370164B5 +:10473000B1E4076E048A3B857BD4F4854009CA3C0A +:104740008D7E8439D330E4BD94C8460790BF2F4393 +:104750002E73CEC6189A15DDC6BFBFF5AC454FEB1C +:104760009791E0CCDD9069F3872AA0B9BC8DBABAE5 +:104770003547B153B5AE27BBAC6A4E44B34A1A3481 +:10478000DB557FE7C41F72DB778DC5ED3D12DE0779 +:10479000BA9C1CD3166DBBF1BA24E46FA8EC72333B +:1047A0009BCFC623E28955895AC3785BC5AC7F800D +:1047B000AC0F79122A7CBD4647687E693765446430 +:1047C000418EEDE5D90D7DF92C6D8B2EF3BCC385A3 +:1047D0002F5CFFF725A2BA0F1AB77E2244B08F7262 +:1047E0000F0F028612ECC841D9C43F1CAE0A64D632 +:1047F00062BFFC7357D15CE866733A15684F036873 +:10480000EAA75E459FC7380F027D331E67ED3D77EF +:1048100060DD3B124698817CC6917D343F2678004E +:10482000CFEA91D51734727240330BB2470DAC61A9 +:10483000A645FFCEB24FD1F181D870C35ED7A9692A +:1048400004C98A62D79A08AB019E6E17A0DE4BA8F6 +:10485000666C1F3290D16ECDBF3F816D71D2B3E8CF +:104860007AF1462B769DFCDB3B053D1870AA67C0AC +:104870000B01A0C55FB91E8DAF71D963A27AC5C700 +:1048800053F452E11E27AFA7B6EFC81CE80AB94F90 +:104890004AADDC5C2416CDA9EA6FCF48EB40D2CDFF +:1048A000432F6735D2DCC464AB7E0DF2B01F6E4C73 +:1048B0002B06DDE239689C706A6F53972BDEEA1C89 +:1048C0008C90F29FC9DE45A302C768B3D10A982D28 +:1048D00016A70F5B849FF733DC4092B9656DD8D182 +:1048E0001C21CF772AF3AA554D06C60B49C38399DD +:1048F000D5D36C9C4B276FEF436AD98DFFE2336FA2 +:10490000C6CEF595852E91FBCFA21E901E28F729C5 +:10491000869E724246EA7D22B1FCFC1550D64F2697 +:104920006E815400A1BC622D68A712121EBFF11641 +:1049300098A02B5737B65B1711D898F5E7F20D1AE8 +:10494000D64288C25802D53C0CFA845C5FA6180F88 +:10495000AC42504BF652F47C5F9ED47F76D9B5E9D9 +:1049600030CB8B2554276B7B7A7AA44AEA2D66B923 +:10497000208012E716E23A2355CB435034F0BE981C +:104980007D1A78612A43F51FEABF2C739668DAF125 +:104990003865D949BD79D0E90DF4B139FE8253416A +:1049A000ADADCAEEE7750BD287FF31A2DA1AB2C6F7 +:1049B000F01BF8872D91A0D86128DFAFF8B6B5714C +:1049C0008C66EDAD7AC03946CBD6E0F12C1670D0AE +:1049D000FF1CD1746527FCC60FEF992AF41B84EDE8 +:1049E000E32A060B2FA476FD93EC513D7D36C16C76 +:1049F0003ECFF66801F43456000B1F48100B915E51 +:104A0000945F09040694BC27076676606A173F7CAA +:104A1000BD3CA393AFD24FC3D97D00471671897DAA +:104A20003EF11C09EA9A8607AB233564E1EA06FFEA +:104A3000D98FB173993DD2DAF7B02ADEC198518B84 +:104A40007D6AF0275C394478055C24C8D0D04CBC22 +:104A50003E4CA597A215A30952587AEC31AB3649C2 +:104A60004A2EEE11642A8C03904ADBBD7E0D861D12 +:104A70005A3CA24E711B4144F23FEE5104125127A1 +:104A8000D7643DCEA4DEEABF09312001445E06783A +:104A9000B73D03E898C4338DB48F56419D8FBBF961 +:104AA000F2C81D99DA64CF91AA629C4BE11F61693B +:104AB00041A3DEAE0227BB32417D7DCC562AFD5993 +:104AC0000CB330FA00159D8487899CF658D1461F97 +:104AD000FB222A16472577B18E9D9A104B39EF7C21 +:104AE000EC82F308AA4200BDB84D9EE609A5B26A61 +:104AF000C544EC054369CC8CCB812669335A18A791 +:104B00008ADEAB66B5041167E5218CFE03E005FD86 +:104B1000C54949703D516F5F91B054A234FFFA27E7 +:104B2000B626F6FC83F0D74166DC4EADA16199C292 +:104B30007F60561C9757500209C33611E0A0C9D2B6 +:104B40006C07109463926389CEAE7506ADEC0B4D85 +:104B50009B8A0840AD9C828D99D65E163A92578901 +:104B6000EFFC304680B5C2277213494CFC7806BE74 +:104B70009461F7ACDAB31F19096A8382464F755FF7 +:104B800050A69D002646E275E6DD55EAF439BC3DA7 +:104B900018083CC14BAD84A20C5C8C6A6F2362D5B3 +:104BA000D5927269A719687C209D5B35D404AA430D +:104BB0002E2B6F5C690B8A6FF41B3FACCE1C974C9D +:104BC000A28C6780FE2A9ABB599148B58A0A813E19 +:104BD000E3088D77DA3934907A71C1673C92F0EC52 +:104BE000BA0F61D859F71F37CF2B1714BF676F73F0 +:104BF000389AE43ECAFB523132E788B87D65F76BDC +:104C00006716FDE445A27056FE94261A0B0F6C2021 +:104C1000A4EEFDBC62E7EAB486E60788D1F5C7B921 +:104C20001DCE219D564CC8E32CC3D3AE912D2D6AC9 +:104C3000F363739B3817F1D95F659C882E0425B404 +:104C4000D9B3E1A16BBC51D2F951FA5587E4B294C2 +:104C500084E73F9EF1CC748B4E2CEEB47736E6DCC5 +:104C6000757C4F38F310DE157305DE544A83203D02 +:104C700047F3686EA56B3BF57AF4BE16B872F2ADD9 +:104C800095E2A1121CEAEE8A0B500176318BAC83BF +:104C9000260205CE88353ED290BB381BA6F96F8719 +:104CA000222FD84D19B850B6E9990FBF4454B8B85F +:104CB000CC26C6978CC87FEFBF4384AE740B12120C +:104CC000C2628AD2759B466D298B16095C35B43A4F +:104CD0007F500F76A18C97D9D442B255B3B3501000 +:104CE000EB6922B5DEC6417440A10ED195DED71C1A +:104CF000B0AC5E4AB53B5C4D4BD54BB750073D8CD5 +:104D000065CB074651FD6126DF847DC07EBB6726EB +:104D1000FFEE3E8BD219BA9D38E4B975F921F841FE +:104D2000B147A95C926E9BEF9E825A53005B30CFD5 +:104D30006DF4E12FC9605902E3A6B659DC784B4106 +:104D40005257FB34FB1AD09405CD1B261A17FFBC13 +:104D50007A493A99E19B758EAAF89B08593CE96417 +:104D6000E2EC9C634E6430854FBC86832FC5183EB1 +:104D7000AFB14DCFF3954D21CF19F39102618D5B0A +:104D80003C9F4D6E52030DDE13F33761938102DEBB +:104D900090ACCD23E058AC6CF5C186284C10278C24 +:104DA0005B95A8DB8CD2E6CF1B88D53BC636D343B8 +:104DB0000F9C99AF2C2101AAA92C57037A63F19576 +:104DC0008DFD127B8AF71D3F931ED15506ACE2D4B0 +:104DD00084908C2F234B13358A5146E0F21544F70B +:104DE0005FA52E5770A443F720FA025D5C8E2B104E +:104DF000AAD48D7346384F95ECEA2ED19D1F02CF71 +:104E00003D6C698A47B9CCEA1842094924356701E3 +:104E10005CFCD182DB6D769F54B7350796367919E5 +:104E2000281849BE01F2DD392D1854F62898F2E110 +:104E30002FAB45D42FB6CDDFC1B1A2998272A48C1D +:104E400023C218F6ACD0B03E3D5FF2BAFCD0DBEA2C +:104E50003B50AE562317A88DCF2C97E1E9F584FB84 +:104E6000DF98D207B1F6DF031EFA4588056C771A82 +:104E7000CE37D47352251498FBC811C624E7871A7D +:104E8000D646F46A4D52D4852056B59001AEA83C62 +:104E90007B1CC77EC9AB79B6481A636E670CE88D78 +:104EA000B5FAC16FBDC34447B41B3844354A13EA51 +:104EB00029A4999955A2B99BDBB8A8C0F0EECB7292 +:104EC000CC0C9F4B74125022547A02248CFE7CD15D +:104ED0000FF2DF3501D329941FF5A970D5AD5BF131 +:104EE0009BB9389875DCC20C18DC34A2AA1581472E +:104EF000315582E811C89F914F028DA9D2AA8D84A5 +:104F0000D498F5F3FA0B3D57312A29358D6ACDFA3D +:104F1000A8C26A8409EC7F0F73761BB5F2E1C66103 +:104F20001ECAEF235D1430C0E200EC876FDD00681D +:104F3000237AFA64C44BDF4C9C9A6B234B9C0E186B +:104F40002B55A8A135123A2F820F0B60A951291EAB +:104F5000236063C84C6F3E66B948C118F0FD741CED +:104F600051EAB9BCB5C5456DA8802B296BE7BC5784 +:104F70009C11F7C574B72A5A90E1A6394A797F3B4C +:104F8000D34FECB32BB97BBDF110CD67DDA5E5DBCD +:104F90005C0E5F82720F1B10416805B630BB23F6B2 +:104FA000AFA1B345498FFF53FD7C93C014A5323D9B +:104FB000366DC39002E309559583A3D6085A435230 +:104FC000B346C0BD2DB4229AA864E77FF239880D9C +:104FD0002E9600D3C6EA3E543FE5CD87B72DE37B3E +:104FE000B8C33E66168296FB372D14DA3FE054EACA +:104FF000BC51B1A6F9DC5FEE08F1C65C9F721E0AD7 +:10500000912C309CCA0F2E821651404A801949417A +:10501000BED18A482BAE760D96B4E2578BA8DEE758 +:1050200081EE06921AFB5B91FD2D7AAD46FCF2E90A +:105030000751D37EA40EF4CB82BCCA32D7DBBB4F60 +:105040009A0E590290851AD46DD893C55876A02728 +:10505000E3CD787BFEAAA13F1403B25B6D772A866D +:10506000BD17C051AE38B62577D5004B5034193333 +:1050700096B02A2471996DF7965996AB7A3668E303 +:105080006C4FFDF075B4A2192E346FDA6720478695 +:1050900084C88A7A0666819F5347C556275C328446 +:1050A0005061ED9DA98CDAEE351EA0001E2FDD6249 +:1050B0000E9DE4BB07BC76DE0C07259BCB894924FB +:1050C000836405B87DB577BBC9D7FDC568E6B17106 +:1050D000987570581733BFCAF0BD659AE6B18E0F48 +:1050E000EC5E6ED0E7BED1D8FDB2E09C39CDABBE50 +:1050F000EC2663B8DD39CA2B1184FDF53E2A05E99B +:105100004197A42F7C861C33652DA925075E23714A +:1051100060DBE0E69CDA6D91D410FC6C1784F03D06 +:10512000FF508C086490263D912F66DCC29B266858 +:10513000A45A24433BFA6E73F1CE3B5C2C3D5126BE +:1051400016D3902577A60376A0A3CFCD1B9772FE2A +:10515000FE81B6E6A939B4BAEB5A04ABFD913247E9 +:1051600034820666682481BE81C157964FB153745C +:10517000A9B9560482B8D6D7430C90D0A2CBBD9A19 +:10518000E273C6F893E4823683680CDF66FE4AC495 +:105190000DE0DF959E911504CC93ECD8D9460136ED +:1051A0009A7C9B716C0C4B96DA9F442460AEF04B5A +:1051B00032808DFAC1D09A41E634886F9129679880 +:1051C000BB7BB26BB5E09491A6A04ED72A9A0C0A8D +:1051D00014F001F77337CA979171F8F7BC01E53DF8 +:1051E000F63E59070663369600DF9B072F085AC91B +:1051F000CC171EAFA1C9BB923DD07450A4A1A50D80 +:10520000BACC480F622A986896B5D6837F2FE134CE +:105210003C4E6A4B103387B1D51FA08F8CD3115DE4 +:105220000255992F7E2232A6D6BE3D15B8F8C8C7C2 +:10523000B672842ED265BDD1FA2F667598517492DC +:1052400092228F6D64996E1CBD684CB7F9F22041B3 +:10525000DF77D312F73E8D9F003D5A3AE21A0D09CF +:10526000A85CEB1931174D05DB29444FF238AADE53 +:1052700038C859F530D899BB53D9CE557EE77995C2 +:1052800005AB550623A7C5810BEF8EE6154634BD49 +:10529000D4C551D6C8E351FF379F92720633E5F06B +:1052A0005F71A17432022582AC05C3C4BDAD153E49 +:1052B00045FE76E192F5426B851DD5B8AEDB025B0B +:1052C000BB435D87FC24501BCB3E6B565B062C42D8 +:1052D000CB9CDF7250F51243160C2B9B3BCDC5B611 +:1052E0009DB632F715DAF454AB24429EC5C355403F +:1052F000389BDABC9826616F291177EE08AD05D985 +:10530000D1CBA639C384B3602AE7253F31926C64C0 +:10531000B51AD560DFCC6C56C06CCBC06E90D7A3ED +:10532000A62A59D15CD05B08973DCAE0D880236A91 +:105330000EE09BA2981EEB53408E0BBEFC077C0335 +:1053400036C0B23B3587D3D9572D8E25ED1D45D7B5 +:10535000FC280FFF728F82C5BAF664B7F2A45273AD +:1053600004880041E3D3FC1AA8F7FFC3E65A575557 +:10537000037E44A07675E2DBD351A30B4C8131B49C +:1053800063A7E2F0CE6E6DB6BB066E708B09F704B4 +:1053900089D28BE042F2EBDB4333E36A42A7407BE6 +:1053A000B68271F80C4291532D8CDAB600E498C2A3 +:1053B0006335B0FE4AB3F4A9608E0315F2BDEF4128 +:1053C000417D58B9CA4D667993F3DADB4ADB18B0F0 +:1053D000511E5FE0DEB784277445D5CA35D27F837E +:1053E000F8FF843F042DF848A1B7E68312DBD948C3 +:1053F0005DF72A6AB8CFC483A130D433B272727613 +:10540000961663866DBF940F6511A1903BB42EB0C4 +:10541000C413787CC1C372CE8E4589D74EF1582211 +:1054200032D74426FBD875C0A8D10509ED8F468D2B +:105430000D8013F0D27E50FB3896D64F4D9CD95E2E +:10544000CEE06F8335F373AB63FD760F8A17FF826F +:1054500043D77421501535C18A8DDF6877B9742A16 +:105460006FDC0AA6193E825B0F940B790EBF8F6E1C +:105470006649BE36FD935DDC737FF5F18A4E97D8A1 +:10548000727D23035373960D74D9F9A7E6C43C7358 +:10549000B79B5B5400F1C2B6A3D1280E0632C60CEE +:1054A00017F0A73AE3B5FB0CED8E6F04E046D36B23 +:1054B000147B9D373220F7948FE911E59CCF60F87B +:1054C0004E1C630504C9D856CFB03C49B58600FCD4 +:1054D000990932FAE8727B07E0E6BBE63C0FE44D3F +:1054E000B1741B8D6ADC1F99C1D0DC78EC368A2838 +:1054F000F51CB2599F60A1483A3A8C21490A86D8D6 +:1055000085B8DC2D143664D0AA6C49ABA2D4BFC0D8 +:10551000F0C111FA0398C3264785D0167D2743DAD8 +:10552000776C34AE5CA57C456BCCFD74725DB8883D +:1055300006D7305D090A0B4CD82F1C6776B5C36EB1 +:10554000073016012EAE1E07960AD4D55FB8F79A1B +:10555000073C1B859C837EC3AEE40AF44CE11298A1 +:1055600060BAD7450CC1C0BF13128EBF36AD669767 +:10557000140D2BC8473E67E14F47C364B55836F258 +:1055800076D93A15EFB29E08451622F20106EAEDE9 +:10559000008460E9FBF78C3841D28C46292EEEBBA3 +:1055A00071235EE45B4865D3627D051786F00C4E7F +:1055B0006B8220A05C9DA7FF05FBF09DB4A707763A +:1055C00047B2CBEA538C9D027540E359A4B2638085 +:1055D0008A48DB7C5A51083DA59BF2A71BDA30981C +:1055E0004DD4A8AE2EE9B171F0061E6E9EB14156A3 +:1055F000CE0B3B1369AF1C0963FD1BC2B350D61021 +:105600009CA47AF9F5DBC620E8676FA4561590D7FD +:105610000E39ECCCD12648A69E7D7220DD9225273E +:10562000504A25344472F455662BD66640D635620E +:10563000C09F3F63ABE44A94FCB6A82E10653CBA09 +:1056400066A4DB493E4F31E8887EA4D73C7A1C290A +:10565000EA05A5E091A059013ACC85648276819B48 +:10566000A94FAE7894F9923C5E5AF73FEE874E25EB +:10567000BEAAFF147E0CB8F90E98C7E366539D08C6 +:105680004195B84B408B2E912D55BF766392235B8D +:10569000AFA7C102C8E9790CE654496D35FBA11EDC +:1056A0001FBD02D8931D84CADD4F8034ED0D15480F +:1056B000FF1A5F9D39C0BA314121293BAF7CB35FEE +:1056C0007DC0BC0E1CB31C2A4EFC9BC3DC4C2116B7 +:1056D000A6E4098E3B87D001A808021B8D2315B1D3 +:1056E00083F81AB178C2590B450CD993BA9A730B47 +:1056F000EB74400C9159F895ACC312D043E7799EF6 +:105700009FAC77DB58EABF3A3BBE9394C872A5FDC5 +:10571000870A17A64A830836B588825D98831047A2 +:105720009FC00FB31FBA1E13E135504088CDAD7E28 +:10573000664A5BF4AEC7DFB9284680B3EC1E8369C6 +:105740007A7DA19FEB31EB0D2CB0A9848F5F2B18D4 +:1057500063C143121603FA9DDCE0409BA94819ABD4 +:10576000590E9171DFF8B04B9F61A6FB65E9654961 +:1057700025C40D1F5997768A5D332ABCFFD4E4AB4C +:10578000D410045D8736F862747A56B3F9F0435743 +:10579000CBF6CEB3138E94490ECA7D18D7270C587A +:1057A000ADC54062B92DF10CBFF511691EE4B253CD +:1057B000C9A3814C028D02C219D67A40BF3B341571 +:1057C000FA7DE7DFCE8BBC2BEEA30C98B699AA1717 +:1057D000D21354C2C837AE58C36F84A6584910B20A +:1057E0002CB0FBC89F4B2B08B58662D6A6382B354C +:1057F000170091BF4417C0609B6C60D6CF3DA8A135 +:10580000D773E60E67DFFD67033EECEFE7430FFD5E +:10581000B837089700B2E6B006B5B96E073EE4D9CE +:10582000FAE893F767CAA8160E104906AD1ED0A471 +:105830002AAD9C912B43EC072D5E6BA7C18D907B0D +:1058400096B45845D218742591C7446344DA50DFA2 +:10585000F2232691C221A6435396A5D9B8CE28D4C7 +:10586000C0D91453671F5813D96B6796719C60D5C4 +:10587000E77568508BEC3F3EDF3374D800AE5EC1F5 +:105880005F7076FEFDC9577B0CF6B8BAA923EADD36 +:1058900048507474E0C38F601B308173CEB054C91C +:1058A0005B85260C8916D857983C4CAC775899B62E +:1058B0008A172D71A7F988282553891370F30B0FC8 +:1058C000F6E5A3CF36FFC0562238A5C38CE8955124 +:1058D0001DCCF40BC77764D5975841FCC16305E72D +:1058E0006FD018160F03F4236FEB8FF1148CF9E7C8 +:1058F0006916FCC4885A3C8D389D903BEB58046572 +:105900004A2FB5F36744987E1D12E592CE99701C1C +:10591000D7BCC0D3145595BED1E75E29CAF7602421 +:10592000CE4A1500DC78F75A313A2C5B835D77312B +:1059300029AAE76F79531C6AE80EE17F8ADEDD0D44 +:10594000B387C679487505744359EA7B69A88FCF38 +:10595000EE4D19BE9B046E92CB885C5E46738F3D04 +:105960006E893D94B9B78161F9DDF440B091DEF301 +:10597000F05221FF58CAF4EBCED210D16BD7714848 +:10598000358550DA3D9532BC2F54A6749BA81480FF +:10599000D15257AFC66C8E8210859FE8FF62735F4D +:1059A00027171FAA8850B9AB5374550CD1529D7656 +:1059B00082CAFAB087A74111C9EEFBD3D657CC7380 +:1059C000913AF26416E5057C4150505F434F4E46D4 +:1059D00049472020202020200000000000D800009F +:1059E0005E0D0000E20922B953594E41204346475B +:1059F000589EFA92AF06E0E62B001B4112130000FE +:105A00000000000000000000000000000000000096 +:105A1000050001000400020003000900090006005F +:105A200030002A0024001E00180012000C0006009E +:105A3000000030002A0024001E00180012000C0094 +:105A40000600000000000000000000000000000050 +:105A5000010001000100010001000100020002003C +:105A60000200020002000200030003000300030022 +:105A70000300030004000400040004000400040008 +:105A800005000500050005000500050000000100F7 +:105A90000200030004000500060007000800091EBC +:105AA0000A1E0B1E0C1E0D1E0E1E0F1E101E111E9A +:105AB00000010101020103010401050106010701C2 +:105AC0000801091F0A1F0B1F0C1F0D1F0E1F0F1FA0 +:105AD000101F111F0002010202020302040205024C +:105AE00006020702080209200A200B200C200D20C4 +:105AF0000E200F20102011200003010302030303D6 +:105B00000403050306030703080309210A210B21E7 +:105B10000C210D210E210F2110211121000401045F +:105B2000020403040404050406040704080409220B +:105B30000A220B220C220D220E220F2210221122E9 +:105B40000005010502050305040505050605070511 +:105B5000080509230A230B230C230D230E230F23EF +:105B6000102311230006010602060306040605069B +:105B700006060706080609180A180B180C180D184F +:105B80000E180F1810181118000701070207030755 +:105B90000407050706070707080709190A190B195B +:105BA0000C190D190E190F191019111900080108F7 +:105BB0000208030804080508060807080808091A67 +:105BC0000A1A0B1A0C1A0D1A0E1A0F1A101A111A99 +:105BD0000009010902090309040905090609070961 +:105BE0000809091B0A1B0B1B0C1B0D1B0E1B0F1B93 +:105BF000101B111B000A010A020A030A040A050A03 +:105C0000060A070A080A091C0A1C0B1C0C1C0D1C9E +:105C10000E1C0F1C101C111C000B010B020B030BA4 +:105C2000040B050B060B070B080B091D0A1D0B1DAA +:105C30000C1D0D1D0E1D0F1D101D111D000C010C46 +:105C4000020C030C040C050C060C070C080C0912C2 +:105C50000A120B120C120D120E120F121012111248 +:105C6000000D010D020D030D040D050D060D070DB0 +:105C7000080D09130A130B130C130D130E130F1336 +:105C800010131113000E010E020E030E040E050E6A +:105C9000060E070E080E09140A140B140C140D142A +:105CA0000E140F1410141114000F010F020F030F24 +:105CB000040F050F060F070F080F09150A150B151E +:105CC0000C150D150E150F151015111500100110DE +:105CD0000210031004100510061007100810091612 +:105CE0000A160B160C160D160E160F161016111698 +:105CF0000011011102110311041105110611071100 +:105D0000081109170A170B170C170D170E170F1785 +:105D100010171117001201120212031204120512B9 +:105D2000061207120812090C0A0C0B0C0C0C0D0CB5 +:105D30000E0C0F0C100C110C0013011302130313A3 +:105D400004130513061307130813090D0A0D0B0D91 +:105D50000C0D0D0D0E0D0F0D100D110D0014011475 +:105D60000214031404140514061407140814090E6D +:105D70000A0E0B0E0C0E0D0E0E0E0F0E100E110E47 +:105D8000001501150215031504150515061507154F +:105D90000815090F0A0F0B0F0C0F0D0F0E0F0F0F29 +:105DA000100F110F00160116021603160416051621 +:105DB00006160716081609100A100B100C100D1005 +:105DC0000E100F10101011100017011702170317F3 +:105DD0000417051706170717081709110A110B11E1 +:105DE0000C110D110E110F111011111100180118C5 +:105DF00002180318041805180618071808180906C9 +:105E00000A060B060C060D060E060F0610061106F6 +:105E1000001901190219031904190519061907199E +:105E2000081909070A070B070C070D070E070F07CC +:105E300010071107001A011A021A031A041A051A88 +:105E4000061A071A081A09080A080B080C080D0890 +:105E50000E080F0810081108001B011B021B031B72 +:105E6000041B051B061B071B081B09090A090B0954 +:105E70000C090D090E090F0910091109001C011C5C +:105E8000021C031C041C051C061C071C081C090A18 +:105E90000A0A0B0A0C0A0D0A0E0A0F0A100A110A46 +:105EA000001D011D021D031D041D051D061D071DEE +:105EB000081D090B0A0B0B0B0C0B0D0B0E0B0F0B1C +:105EC000100B110B001E011E021E031E041E051ED8 +:105ED000061E071E081E09000A000B000C000D001C +:105EE0000E000F0010001100001F011F021F031FF2 +:105EF000041F051F061F071F081F09010A010B01C8 +:105F00000C010D010E010F011001110100200120F3 +:105F10000220032004200520062007200820090273 +:105F20000A020B020C020D020E020F0210021102F5 +:105F3000002101210221032104210521062107213D +:105F4000082109030A030B030C030D030E030F03BF +:105F5000100311030022012202220322042205223F +:105F600006220722082209040A040B040C040D046B +:105F70000E040F041004110401230223032304233D +:105F80000523062300230723082309050A05110515 +:105F90000B050C050D050E050F051005FFFFFFFF96 +:105FA000FFFF3F00FFFFFFFFFFFF3F000303300540 +:105FB0002A05000500052A05300503000300070037 +:105FC000040009000700070007001C001C001C005B +:105FD0001C001C001C000E000E000E000E000E0027 +:105FE0000E0000000000000001000100010001009F +:105FF000000001000100010001000500050005008E +:1060000005000500050009000D000F00090009004A +:106010000900080001000700010000000300000063 +:1060200008001100190022002A0033003B00440040 +:106030004C0055005D0066006E0077007F007F0019 +:106040007F007F007F007F007F007F007F007F0058 +:106050007F007F007F007F007F007F007F007F0048 +:106060007F007F007F007F007F007F007F007F0038 +:106070007F007F007F007F007F007F007F007F0028 +:106080007F007F007F007F007F007F007F007F0018 +:106090007F007F007F007F007F007F007F007F0008 +:1060A0007F007F007F007F007F007F007F007F00F8 +:1060B0007F007F007F007F007F007F007F007F00E8 +:1060C0007F007F007F007F007F007F007F007F00D8 +:1060D0007F007F007F007F007F007F007F007F00C8 +:1060E0007F007F007F007F007F007F007F007F00B8 +:1060F0007F007F007F007F007F007F007F007F00A8 +:106100007F0077006E0066005D0055004C00440083 +:106110003B0033002A002200190011000800320061 +:10612000000000000000000000000000000000006F +:106130000000070000000000300030003000300098 +:10614000300030000F000F000F000F000F000F0095 +:10615000000007000A000E0015001C0025002F009B +:106160003C00490057006800780088009A00AB00A6 +:10617000BA00C800D400DF00E600E900EA00E7004A +:10618000DE00D300C300AF0098007E006100420033 +:10619000210000010E010B01ED00A4017C010000B3 +:1061A000E8037800DC0596000000FF0010006400A2 +:1061B000401F4B00010002003C006500010006008A +:1061C0000000120024000000000000000000180D74 +:1061D00000E401000000FF0D00FC000020020000B0 +:1061E000010001000800000000000E001300130071 +:1061F0001300130013001300130013001300130007 +:1062000013001300130013001300130013001300F6 +:1062100013001300130013001300130013001300E6 +:1062200013001300130013001300130013001300D6 +:1062300013001300130013001300130013001300C6 +:1062400013001300130013001300130013001300B6 +:1062500013001300130013001300130013001300A6 +:106260001300130013001300130013001300130096 +:106270001300130013001300130013001300130086 +:106280001300130013001300130013001300130076 +:106290001300130013001300130013001300130066 +:1062A0001300130013001300130013001300130056 +:1062B0001300130013001300130013001300130046 +:1062C0001300130013001300130013001300130036 +:1062D0001300130013001300130013001300130026 +:1062E0001300130013000E00000000000000000067 +:1062F000000000000000000000000000000000009E +:10630000000000000000000000000000000000008D +:10631000000000000000000000000000000000007D +:10632000000000000000000000000000000000006D +:10633000000000000000000000000000000000005D +:10634000000000000000000000000000000000004D +:10635000000000000100070032000F0007000300EA +:1063600001000100000001000000010007001C0006 +:106370000E00050009003000300030000100070069 +:1063800000003200030001000800010000000100CD +:1063900000000000010007001C000E0005000900BD +:1063A0000A000A000A00320032000800080001005A +:1063B0000100E80346009600640064003C001400FD +:1063C000140094417B3C90010F0024001200010056 +:1063D00012002400CD011E00780005000A000A000A +:1063E0006400140001008700140001000000000197 +:1063F0000001000100010001000100010001000195 +:106400000001000100010001000100010001000184 +:106410000001000100010001000100010001000174 +:106420000001000100010001000100010001000164 +:106430000001000100010001000100010001000154 +:106440000001000100010001000100010001000144 +:106450000001000100010001000100100010001007 +:10646000001000100010001000100F00800040000D +:10647000500014004000204EC0001400280000020C +:10648000C00000016666666666466646B200CD0CD0 +:10649000500066269A190100CD8C02000200060009 +:1064A00006008000800080008000800040008000A6 +:1064B000800066A633B333B333B3CD010A001900AD +:1064C0006400B3019A00000266069A0000026606A4 +:1064D00060EA60EAF0D8F0D80100600060002800AF +:1064E00014001400140028002800280028002800A8 +:1064F0002800280028000001800000010001290078 +:106500003D0029002900C8002800280028000003B9 +:10651000C0008001800100010001000100010001B4 +:1065200040002000200020001000040004000000B3 +:1065300000000A000A008001C00080018001800084 +:106540002000200020003800010080011E002600ED +:10655000C8003704E7080000000000000000010048 +:106560007300002300058101000081010000040088 +:1065700001010A027E001C0007002C013A1E1422B1 +:1065800028040100000000006400640037043704A0 +:10659000D303D30305004100000000000000000009 +:1065A0006400640037043704D303D3030000000001 +:1065B000000000000000000064006400E708E70835 +:1065C0008308830832003200000000000000000051 +:1065D00064006400E708E70883088308320032009B +:1065E0000000000032004B004600000000004600A2 +:1065F0002D0000000000000032003200000000000A +:106600000F000F00000000000100020003008600E0 +:1066100028000A460F008202FA0060008000400055 +:106620004000FFFF9A5950001E00000124000600A0 +:106630000600000001000000000001000100010050 +:1066400001000100010050000A000A0014001400BB +:106650000100040000004B00C800C8006F031F08C1 +:10666000320032000000000037046F0805001E00F1 +:1066700005000A000A0000000F00010001001400DC +:1066800004000F0005000B00FF000F0001001E00BA +:1066900001000000010001000A000100820000006A +:1066A0000000FF00BB00FD00000000000000000033 +:1066B00000000000000000000000000001000000D9 +:1066C0000000000000000F01040106040704080C8C +:1066D000090C0A080B080C080D100E10030000002E +:1066E00000000000000000000000000000000000AA +:1066F000000000000000000000000000000000009A +:106700000000000000000000000000000000000089 +:106710000000000000000000000000000000000079 +:106720000000000000000000000000000000000069 +:106730000000000000000000000000000000000059 +:1067400000000000000016E5057C444953504C4110 +:10675000592020202020202020200100000000E0DF +:1067600000000020000007830170DD1D0489002067 +:106770000000010101100000FE16000000007E096B +:1067800002047E0902040000000000000000000076 +:1067900000000000000000000000000000000000F9 +:1067A00000000000000000000000000000000000E9 +:1067B00000000000000000000000000000007E0952 +:1067C00002040000000000000000000000000000C3 +:1067D00000000000000000000000000000000000B9 +:1067E00000000000000000000000000000000000A9 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000000000000000000088 +:106810000000000000000000000000000000000078 +:106820000000000000000000000000000000000068 +:106830000000000000000000000000000000000058 +:106840000000000000000000000000000000000048 +:106850000000000000000000000000000000000038 +:106860000000000000000000000000000000000028 +:106870000000000000000000000000000000000018 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000000000F8 +:1068A00000000000000000000000000000000000E8 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000000000000000000098 +:106900000000000000000000000000000000000087 +:106910000000000000000000000000000000000077 +:106920000000000000000000000000000000000067 +:106930000000000000000000000000000000000057 +:106940000000000000000000000000000000000047 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000000000000027 +:106970000000000000000000000000000000000017 +:106980000000000000000000000000000000000007 +:1069900000000000000000000000000000000000F7 +:1069A00000000000000000000000000000000000E7 +:1069B00000000000000000000000000000000000D7 +:1069C00000000000000000000000000000000000C7 +:1069D00000000000000000000000000000000000B7 +:1069E00000000000000000000000000000000000A7 +:1069F0000000000000000000000000000000000097 +:106A00000000000000000000000000000000000086 +:106A10000000000000000000000000000000000076 +:106A20000000000000000000000000000000000066 +:106A30000000000000000000000000000000000056 +:106A40000000000000000000000000000000000046 +:106A50000000000000000000000000000000000036 +:106A60000000000000000000000000000000000026 +:106A70000000000000000000000000000000000016 +:106A80000000000000000000000000000000000006 +:106A900000000000000000000000000000000000F6 +:106AA00000000000000000000000000000000000E6 +:106AB00000000000000000000000000000000000D6 +:106AC00000000000000000000000000000000000C6 +:106AD00000000000000000000000000000000000B6 +:106AE00000000000000000000000000000000000A6 +:106AF0000000000000000000000000000000000096 +:106B00000000000000000000000000000000000085 +:106B10000000000000000000000000000000000075 +:106B20000000000000000000000000000000000065 +:106B30000000000000000000000000000000000055 +:106B40000000000000000000000000000000000045 +:106B50000000000000000000000000000000000035 +:106B60000000000000000000000000000000000025 +:106B70000000000000000000000001025FE00000D3 +:106B8000CEE03000CFE06B00D0E00000D1E00200AA +:106B9000D2E00300D3E05100D4E00000D5E00000D3 +:106BA000D6E00000D7E05700D8E03D00D9E019005A +:106BB000DAE0BE00DBE01E00DCE00A00DDE00A00F7 +:106BC000DEE06F00DFE03D00E0E02800E1E0BE0035 +:106BD000E2E03C00E3E01400E4E00A00E5E0B50098 +:106BE000E6E03300E7E04100E8E0BE00E9E06400F1 +:106BF000EAE02300EBE00A00ECE04400EDE02600D0 +:106C0000EEE0C300EFE01F00F0E01900F1E0060045 +:106C1000F2E00300F3E0C000F4E00000F5E0000063 +:106C2000F6E01000F7E03200F8E04C00F9E0C300B5 +:106C3000FAE05200FBE03200FCE01F00FDE0030040 +:106C4000FEE0F200FFE0000000E1000001E11300BF +:106C500002E1240003E1680004E1C30005E1AA00A9 +:106C600006E13F0007E1320008E1030009E1FF000F +:106C70000AE100000BE100000CE125000DE100003D +:106C80000EE10D000FE1000010E1000011E1000035 +:106C900012E1000013E1000014E1000015E1000022 +:106CA00016E1000017E1000018E1000019E1000002 +:106CB0001AE1D3001BE101001CE12C001DE10A00D8 +:106CC0001EE108001FE1E80020E1000021E10A00C8 +:106CD00022E1000023E1000024E1080025E100009A +:106CE00026E1000027E1300028E1000029E1000052 +:106CF0002AE111002BE100002CE100002DE1000051 +:106D00002EE100002FE1220030E1000031E105001A +:106D100032E1200033E1000034E1800035E1FA0087 +:106D200036E1400037E1000038E1800039E10F0032 +:106D30003AE100003BE100003CE100003DE10000E1 +:106D40003EE100003FE1000040E1000041E10000C1 +:106D500042E1000043E1000044E1000045E10000A1 +:106D600046E1000047E1000048E1000049E1000081 +:106D70004AE100004BE100004CE100004DE1000061 +:106D80004EE100004FE1000050E1000051E1000041 +:106D900052E1D20053E1020054E1020055E100004B +:106DA00056E1070057E1050058E1440059E10000B1 +:106DB0005AE100005BE100005CE100005DE10000E1 +:106DC0005EE100005FE1000060E1000061E10000C1 +:106DD00062E1000063E1000064E1000065E10000A1 +:106DE00066E1000067E1000068E1000069E1000081 +:106DF0006AE100006BE100006CE160006DE1C7003A +:106E00006EE104006FE1040070E1010071E1010036 +:106E100072E1010073E1000074E1080075E1FB001C +:106E200076E1000077E1000078E1010079E10800F7 +:106E30007AE100007BE100007CE100007DE144009C +:106E40007EE111007FE1000080E1080081E1FB00AC +:106E500082E1040083E1000084E1000085E100009C +:106E600086E1000087E1000088E1000089E1000080 +:106E70008AE100008BE100008CE100008DE1000060 +:106E80008EE100008FE1000090E1000091E1000040 +:106E900092E1000093E1000094E1000095E1000020 +:106EA00096E1110097E1000098E1000099E10000EF +:106EB0009AE100009BE100009CE100009DE10000E0 +:106EC0009EE100009FE10000A0E10000A1E10000C0 +:106ED000A2E10000A3E10000A4E10000A5E10000A0 +:106EE000A6E10000A7E10000A8E10000A9E1000080 +:106EF000AAE10000ABE10000ACE11100ADE100004F +:106F0000AEE10000AFE10000B0E10000B1E100003F +:106F1000B2E10000B3E10000B4E10000B5E100001F +:106F2000B6E10000B7E10000B8E10000B9E10000FF +:106F3000BAE10000BBE10000BCE10000BDE10000DF +:106F4000BEE10000BFE10000C0E10000C1E10000BF +:106F5000C2E11100C3E10000C4E10000C5E100008E +:106F6000C6E10000C7E10000C8E10000C9E100007F +:106F7000CAE10000CBE10000CCE10000CDE100005F +:106F8000CEE10000CFE10000D0E10000D1E100003F +:106F9000D2E10000D3E1C900D4E10100D5E19000C5 +:106FA000D6E18900D7E15A00D8E10000D9E100001C +:106FB000DAE10000DBE10000DCE10000DDE1D2000D +:106FC000DEE10100DFE19500E0E1A900E1E1390047 +:106FD000E2E10400E3E10200E4E10000E5E1000099 +:106FE000E6E10000E7E1D200E8E10400E9E10000A9 +:106FF000EAE17800EBE1F200ECE10200EDE10100F2 +:10700000EEE10100EFE10000F0E10000F1E1D2006B +:10701000F2E10400F3E10000F4E18800F5E1F3009F +:10702000F6E10200F7E10100F8E10100F9E10000FA +:10703000FAE10000FBE10000FCE10000FDE10000DE +:10704000FEE10000FFE1000000E2000001E20000BC +:1070500002E2000003E2000004E2000005E200009A +:1070600006E2000007E2000008E2000009E200007A +:107070000AE200000BE200000CE200000DE200005A +:107080000EE200000FE2000010E2000011E2AA0090 +:1070900012E2000013E2000014E2000015E200001A +:1070A00016E2000017E2000018E2010019E20000F9 +:1070B0001AE201001BE200001CE200001DE20000D9 +:1070C0001EE200001FE2000020E2C00021E20000FA +:1070D00022E2010023E2000024E2010025E2000098 +:1070E00026E2000027E2000028E2000029E200007A +:1070F0002AE2C0002BE200002CE200002DE200009A +:107100002EE200002FE2000030E2000031E2000039 +:1071100032E2000033E2000034E2000035E2000019 +:1071200036E2000037E2000038E2000039E20000F9 +:107130003AE200003BE200003CE200003DE20000D9 +:107140003EE200003FE2000040E2000041E20000B9 +:1071500042E2000043E2000044E2000045E2000099 +:1071600046E24C0047E2510048E24D0049E24D0042 +:107170004AE261004BE25F004CE25D004DE20F002D +:107180004EE211004FE2440050E24F0051E24F0046 +:1071900052E2BE0053E2BF0054E2030055E2000099 +:1071A00056E2000057E2000058E2000059E20000F9 +:1071B0005AE200005BE200005CE200005DE20000D9 +:1071C0005EE24C005FE2510060E24D0061E24D0082 +:1071D00062E2610063E25F0064E25D0065E20E006E +:1071E00066E2100067E2440068E24F0069E24F0087 +:1071F0006AE2BE006BE2BF006CE202006DE2FF00DB +:107200006EE2FF006FE2FF0070E2FF0071E2FF003C +:1072100072E2FF0073E2000074E2FE0075E2E70034 +:1072200076E2000077E2FE0078E2E70079E2000013 +:107230007AE202007BE218007CE200007DE20200BC +:107240007EE218007FE2000080E2E00081E20000C0 +:1072500082E2000083E2E00084E2000085E20000B8 +:1072600086E2000087E2000088E2000089E2000078 +:107270008AE200008BE204008CE204008DE2000050 +:107280008EE200008FE2040090E2040091E2000030 +:1072900092E2000093E2000094E2000095E2000018 +:1072A00096E2500097E2000098E2000099E20000A8 +:1072B0009AE200009BE200009CE200009DE20000D8 +:1072C0009EE208009FE20000A0E20000A1E20000B0 +:1072D000A2E20000A3E20200A4E21A00A5E2080074 +:1072E000A6E2FC00A7E2FF00A8E2FF00A9E2FF007F +:1072F000AAE20000ABE20000ACE21300ADE2010044 +:10730000AEE2FF00AFE20000B0E20100B1E2030034 +:10731000B2E24200B3E24500B4E24200B5E200004E +:10732000B6E20000B7E20000B8E20100B9E20500F1 +:10733000BAE20900BBE22800BCE22800BDE201007D +:10734000BEE20300BFE24200C0E24500C1E24200EB +:10735000C2E20000C3E20000C4E20000C5E2010096 +:10736000C6E20B00C7E20000C8E20000C9E200006C +:10737000CAE21E00CBE20100CCE20000CDE2000038 +:10738000CEE20000CFE20000D0E20000D1E2000037 +:10739000D2E22000D3E22000D4E20000D5E20000D7 +:1073A000D6E20000D7E20000D8E22200D9E22200B3 +:1073B000DAE22200DBE20000DCE20000DDE20000B5 +:1073C000DEE20000DFE21000E0E20000E1E2A00007 +:1073D000E2E28000E3E27000E4E20000E5E2200087 +:1073E000E6E20000E7E20000E8E22D00E9E2410009 +:1073F000EAE20000EBE20000ECE20000EDE2000057 +:10740000EEE2FF00EFE25D00F0E24000F1E2490051 +:10741000F2E25300F3E25900F4E25E00F5E26300A9 +:10742000F6E26800F7E26E00F8E27400F9E27E002E +:10743000FAE28A00FBE29800FCE2A800FDE2BB0051 +:10744000FEE2D000FFE2E70000E3FF0001E30400FA +:1074500002E3000003E3040004E3040005E3420048 +:1074600006E3000007E3690008E35A0009E340006F +:107470000AE340000BE300000CE300000DE304000E +:107480000EE3FA000FE3000010E3000011E3000038 +:1074900012E3800013E3A10014E36A0015E3000087 +:1074A0002DE3050046E3000047E3000048E3000049 +:1074B00049E302004AE37F004BE300004CE3000095 +:1074C0004DE300004EE300004FE3000050E30000F6 +:1074D00051E3000052E3000053E3000054E30000D6 +:1074E00055E3000056E3000057E3000058E30000B6 +:1074F00059E300005AE300005BE300005CE3000096 +:107500005DE300005EE300005FE3000060E3FF0076 +:1075100061E3F70062E3FF0063E3FF0064E3F70069 +:1075200065E3FF0066E3FF0067E3F70068E3FF0041 +:1075300069E3FF006AE3F7006BE3FF006CE3FF0021 +:107540006DE3F7006EE3FF006FE3FF0070E3F70009 +:1075500071E3FF0072E3FF0073E3F70074E3FF00E1 +:1075600075E3FF0076E3F70077E3FF0078E3FF00C1 +:1075700079E3F7007AE3FF007BE3FF007CE3F700A9 +:107580007DE3FF007EE3FF007FE3F70080E3FF0081 +:1075900081E3FF0082E3F70083E3FF0084E3FF0061 +:1075A00085E3F70086E3FF0087E3FF0088E3F70049 +:1075B00089E3FF008AE3FF008BE3F7008CE3FF0021 +:1075C0008DE3FF008EE3F7008FE3FF0090E3FF0001 +:1075D00091E3F70092E3FF0093E3FF0094E3F700E9 +:1075E00095E3FF0096E3FF0097E3F70098E3FF00C1 +:1075F00099E3FF009AE3F7009BE3FF009CE3FF00A1 +:107600009DE3F7009EE3FF009FE3FF00A0E3F70088 +:10761000A1E3FF00A2E3FF00A3E3F700A4E3FF0060 +:10762000A5E3FF00A6E3F700A7E3FF00A8E3FF0040 +:10763000A9E3F700AAE3FF00ABE3FF00ACE3F70028 +:10764000ADE3FF00AEE3FF00AFE3F700B0E3FF0000 +:10765000B1E3FF00B2E3F700B3E3FF00B4E3FF00E0 +:10766000B5E3F700B6E3FF00B7E3FF00B8E3F700C8 +:10767000B9E3FF00BAE3FF00BBE3F700BCE3FF00A0 +:10768000BDE3FF00BEE3F700BFE3FF00C0E3FF0080 +:10769000C1E3F700C2E3FF00C3E3FF00C4E3F70068 +:1076A000C5E3FF00C6E3FF00C7E3F700C8E3FF0040 +:1076B000C9E3FF00CAE3F700CBE3FF00CCE3FF0020 +:1076C000CDE3F700CEE3FF00CFE3FF00D0E3F70008 +:1076D000D1E3FF00D2E3FF00D3E3F700D4E3FF00E0 +:1076E000D5E3FF00D6E3F700D7E3FF00D8E3FF00C0 +:1076F000D9E3F700DAE3FF00DBE3FF00DCE3F700A8 +:10770000DDE3FF00DEE3FF00DFE3F700E0E3FF007F +:10771000E1E3FF00E2E3F700E3E3FF00E4E3FF005F +:10772000E5E3F700E6E3FF00E7E3FF00E8E3F70047 +:10773000E9E3FF00EAE3FF00EBE3F700ECE3FF001F +:10774000EDE3FF00EEE3F700EFE3FF00F0E30000FE +:10775000F1E30000F2E30000F3E30000F4E30000D3 +:10776000F5E30000F6E30000F7E30000F8E30000B3 +:10777000F9E30000FAE30000FBE30000FCE3000093 +:10778000FDE30000FEE30000FFE3000000E4000072 +:1077900001E4000002E4000003E4000004E400004F +:1077A00005E4000006E4000007E4210008E41000FE +:1077B00009E452000AE452000BE400000CE4D30098 +:1077C0000DE400000EE40A000FE4000010E4B6002F +:1077D00011E4040012E4FD0013E4010014E40000CD +:1077E00015E4030016E4000017E4050018E40500A2 +:1077F00019E405001AE407001BE404001CE405007A +:107800001DE406001EE407001FE4000020E402005F +:1078100021E4020022E4080023E4030024E403003E +:1078200025E4080026E4040027E4080028E4080012 +:1078300029E40C002AE40B002BE40A002CE40A00E3 +:107840002DE40A002EE407002FE4080030E40A00CB +:1078500031E4060032E4000033E4080034E40000C0 +:1078600035E4000036E4000037E4000038E40000AE +:1078700039E404003AE404003BE404003CE404007E +:107880003DE404003EE404003FE4040040E4000062 +:1078900041E4040042E4040043E4040044E404003E +:1078A00045E4040046E4040047E4040048E404001E +:1078B00049E404004AE404004BE406004CE40600FA +:1078C0004DE400004EE400004FE4000050E40000EE +:1078D00051E4000052E4120053E4410054E400007B +:1078E00055E4410056E4000057E4820058E40000EB +:1078F00059E4A8005AE4AA005BE400005CE45000EC +:107900005DE455005EE408005FE4A20060E42A0044 +:1079100061E40A0062E4450063E4150064E40D00DC +:1079200065E48A0066E48A0067E40A0068E41500FA +:1079300069E445006AE40D006BE42A006CE4A000F1 +:107940006DE40A006EE455006FE4500070E40D0031 +:1079500071E4AA0072E4A80073E40A0074E455001C +:1079600075E4500076E40D0077E42A0078E4A20084 +:1079700079E40A007AE415007BE445007CE40D001C +:107980007DE48A007EE48A007FE40A0080E445000A +:1079900081E4150082E40D0083E4A20084E42A005F +:1079A00085E40A0086E4510087E4550088E40C0071 +:1079B00089E4A8008AE4AA008BE408008CE454005F +:1079C0008DE455008EE401008FE4300090E4060061 +:1079D00091E4230092E465007BE0000093E4000062 +:1079E00094E4000095E40F0096E4FF0097E40000A3 +:1079F00098E4000099E400009AE400009BE4100081 +:107A00009CE400009DE430009EE463009FE40000DD +:107A1000A0E40100A1E40E00A2E40100A3E4200020 +:107A2000A4E40A00A5E4E000A6E4AE00A7E4000098 +:107A3000A8E40900A9E40000AAE40200ABE4A6005F +:107A4000ACE40000ADE40000AEE40000AFE40000F0 +:107A5000B0E40000B1E40000B2E40000B3E40000D0 +:107A6000B4E40400B5E4C200B6E40000B7E41100D9 +:107A7000B8E40000B9E4D300BAE40D00BBE4300080 +:107A8000BCE48600BDE41500BEE40000BFE40C00C9 +:107A9000C0E40000C1E40100C2E40000C3E401004E +:107AA000C4E40400C5E41000C6E43800C7E41000D4 +:107AB000C8E42E00C9E40A00CAE4E000CBE4AE004A +:107AC000CCE40200CDE43A00CEE40100CFE40100B2 +:107AD000D0E40200D1E40200D2E40800D3E40800BC +:107AE000D4E40900D5E40900D6E40000D7E400009E +:107AF000D8E40000D9E40000DAE40200DBE400008E +:107B0000DCE49200DDE44A00DEE49100DFE41200F0 +:107B1000E0E40200E1E48C00E2E40000E3E40000C1 +:107B2000E4E40100E5E45000E6E40200E7E40200DA +:107B3000E8E48C00E9E40000EAE40000EBE4A000E3 +:107B4000ECE41000EDE40200EEE4C300EFE41F00FB +:107B5000F0E40000F1E40000F2E40000F3E4FD00D2 +:107B6000F4E40100F5E40000F6E40000F7E40000AE +:107B7000F8E40000F9E4CF00FAE45F00FBE47F00E2 +:107B8000FCE4F000FDE40000FEE40F00FFE4F00080 +:107B900000E5000001E5000002E5000003E500004B +:107BA00004E5000005E5C00006E50F0007E57F00DD +:107BB00008E5000009E500000AE590000BE5090072 +:107BC0000CE509000DE509000EE549000FE5000090 +:107BD00010E5000011E5000012E5000013E50000CB +:107BE00014E5000015E5000016E5010017E50000AA +:107BF00018E5000019E500001AE500001BE540004B +:107C00001CE500001DE500001EE500001FE500006A +:107C100020E5000021E5000022E5010023E5000049 +:107C200024E5C00025E51F0026E5000027E500004B +:107C300028E5000029E500002AE500002BE500000A +:107C40002CE500002DE500002EE500002FE50000EA +:107C500030E5000031E5000032E5000033E50000CA +:107C600034E5000035E5000036E5000037E50000AA +:107C700038E5000039E500003AE500003BE500008A +:107C80003CE500003DE500003EE500003FE500006A +:107C900040E5000041E5000042E5000043E500004A +:107CA00044E5000045E5000046E5000047E500002A +:107CB00048E5000049E500004AE500004BE500000A +:107CC0004CE500004DE500004EE500004FE560008A +:107CD00050E54B0051E5090052E5000053E5000076 +:107CE00054E5000055E5000056E5000057E5370073 +:107CF00058E5370059E537005AE500005BE500001C +:107D00005CE500005DE500005EE500005FE5000069 +:107D100060E5000061E5000062E5000063E5000049 +:107D200064E5000065E5000066E5000067E5000029 +:107D300068E5000069E500006AE500006BE5000009 +:107D40006CE500006DE500006EE500006FE50000E9 +:107D500070E5000071E5000072E5000073E50000C9 +:107D600074E5000075E5000076E5000077E50000A9 +:107D700078E5000079E500007AE500007BE5000089 +:107D80007CE500007DE500007EE500007FE5000069 +:107D900080E5000081E5000082E5000083E5000049 +:107DA00084E5100085E5000086E5100087E5000009 +:107DB00088E5000089E510008AE500008BE51000E9 +:107DC0008CE500008DE50A008EE50A008FE50000D5 +:107DD00090E5000091E5000092E5000093E50000C9 +:107DE00094E5430095E5000096E5030097E5510012 +:107DF00098E5000099E500009AE505009BE5000084 +:107E00009CE500009DE500009EE500009FE5000068 +:107E1000A0E50000A1E50000A2E50000A3E5000048 +:107E2000A4E50000A5E50000A6E50000A7E5000028 +:107E3000A8E50000A9E50000AAE50000ABE5000008 +:107E4000ACE50000ADE50000AEE50000AFE50000E8 +:107E5000B0E50000B1E50000B2E50000B3E50000C8 +:107E6000C3E54400C4E53F00C5E50000C6E58D005C +:107E7000C7E5BF005FE00300000000000000000055 +:107E800000000000000000000000000000000000F2 +:107E900000000000000000000000000000000000E2 +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000000000000000000C2 +:107EC00000000000000000000000000000000000B2 +:107ED00000000000000000000000000000000000A2 +:107EE0000000000000000000000000000000000092 +:107EF0000000000000000000000000000000000082 +:107F00000000000000000000000000000000000071 +:107F10000000000000000000000000000000000061 +:107F20000000000000000000000000000000000051 +:107F30000000000000000000000000000000000041 +:107F40000000000000000000000000000000000031 +:107F50000000000000000000000000000000000021 +:107F60000000000000000000000000000000000011 +:107F70000000000000000000000000000000000001 +:107F800000000000000000000000000000000000F1 +:107F900000000000000000000000000000000000E1 +:107FA00000000000000000000000000000000000D1 +:107FB00000000000000000000000000000000000C1 +:107FC00000000000000000000000000000000000B1 +:107FD00000000000000000000000000000000000A1 +:107FE0000000000000000000000000000000000091 +:107FF0000000000000000000000000000000000081 +:108000000000000000000000000000000000000070 +:108010000000000000000000000000000000000060 +:108020000000000000000000000000000000000050 +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 +:108050000000000000000000000000000000000020 +:108060000000000000000000000000000000000010 +:108070000000000000000000000000000000000000 +:1080800000000000000000000000000000000000F0 +:1080900000000000000000000000000000000000E0 +:1080A00000000000000000000000000000000000D0 +:1080B00000000000000000000000000000000000C0 +:1080C00000000000000000000000000000000000B0 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000000090 +:1080F0000000000000000000000000000000000080 +:10810000000000000000000000000000000000006F +:10811000000000000000000000000000000000005F +:10812000000000000000000000000000000000004F +:10813000000000000000000000000000000000003F +:10814000000000000000000000000000000000002F +:10815000000000000000000000000000000000001F +:10816000000000000000000000000000000000000F +:1081700000000000000000000000000000000000FF +:1081800000000000000000000000000000000000EF +:1081900000000000000000000000000000000000DF +:1081A00000000000000000000000000000000000CF +:1081B00000000000000000000000000000000000BF +:1081C00000000000000000000000000000000000AF +:1081D000000000000000000000000000000000009F +:1081E000000000000000000000000000000000008F +:1081F000000000000000000000000000000000007F +:10820000000000000000000000000000000000006E +:10821000000000000000000000000000000000005E +:10822000000000000000000000000000000000004E +:10823000000000000000000000000000000000003E +:10824000000000000000000000000000000000002E +:10825000000000000000000000000000000000001E +:10826000000000000000000000000000000000000E +:1082700000000000000000000000000000000000FE +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000000000000000000CE +:1082B00000000000000000000000000000000000BE +:1082C00000000000000000000000000000000000AE +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F000000000000000000000000000000000007E +:10830000000000000000000000000000000000006D +:10831000000000000000000000000000000000005D +:10832000000000000000000000000000000000004D +:10833000000000000000000000000000000000003D +:10834000000000000000000000000000000000002D +:10835000000000000000000000000000000000001D +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED +:1083900000000000000000000000000000000000DD +:1083A00000000000000000000000000000000000CD +:1083B00000000000000000000000000000000000BD +:1083C00000000000000000000000000000000000AD +:1083D000000000000000000000000000000000009D +:1083E000000000000000000000000000000000008D +:1083F000000000000000000000000000000000007D +:10840000000000000000000000000000000000006C +:10841000000000000000000000000000000000005C +:10842000000000000000000000000000000000004C +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:10846000000000000000000000000000000000000C +:1084700000000000000000000000000000000000FC +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000000000000000DC +:1084A00000000000000000000000000000000000CC +:1084B00000000000000000000000000000000000BC +:1084C00000000000000000000000000000000000AC +:1084D000000000000000000000000000000000009C +:1084E000000000000000000000000000000000008C +:1084F000000000000000000000000000000000007C +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B +:10852000000000000000000000000000000000004B +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000000000002B +:10855000000000000000000000000000000000001B +:10856000000000000000000000000000000000000B +:1085700000000000000000000000000000000000FB +:1085800000000000000000000000000000000000EB +:1085900000000000000000000000000000000000DB +:1085A00000000000000000000000000000000000CB +:1085B00000000000000000000000000000000000BB +:1085C00000000000000000000000000000000000AB +:1085D000000000000000000000000000000000009B +:1085E000000000000000000000000000000000008B +:1085F000000000000000000000000000000000007B +:10860000000000000000000000000000000000006A +:10861000000000000000000000000000000000005A +:10862000000000000000000000000000000000004A +:10863000000000000000000000000000000000003A +:10864000000000000000000000000000000000002A +:10865000000000000000000000000000000000001A +:10866000000000000000000000000000000000000A +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000000EA +:1086900000000000000000000000000000000000DA +:1086A00000000000000000000000000000000000CA +:1086B00000000000000000000000000000000000BA +:1086C00000000000000000000000000000000000AA +:1086D000000000000000000000000000000000009A +:1086E000000000000000000000000000000000008A +:1086F000000000000000000000000000000000007A +:108700000000000000000000000000000000000069 +:108710000000000000000000000000000000000059 +:108720000000000000000000000000000000000049 +:108730000000000000000000000000000000000039 +:108740000000000000000000000000000000000029 +:108750000000000000000000000000000000000019 +:1087600000000000000000000000D841FBC1D84913 +:10877000000078DAED7D6D73DA4CB2E8F7FD157321 +:1087800073BF24779F64F52E91A7CEADC2801DF6EE +:1087900018DB052471B27B8A9285B0B5111247129D +:1087A0007EC9A9737FFBED1949A0167A05C9C639A0 +:1087B000A9DACDE306349AE99EE9E9F7FEAFBF10E6 +:1087C000F2E6666DD9F361FFCD472268AACACBC233 +:1087D0001F847E1CB86BE36EE82CDC2BDDF8610691 +:1087E000F0F57FC1C7F0C5DC5CE86B3B98988E6FF5 +:1087F00039B723776E6EBE63DFFA8667AD02CB753D +:10880000E0E337D33BCB272BDDD39766607AC49A5E +:108810009B4E602D2CD327D682047726F19FFCC077 +:108820005C12F855B076CC3959B81E39BFBC389BAC +:108830007D9A9D9C772FFE9DBCE5DE91F8B32FF1CC +:1088400067FCBB376C96EC9537BA6F4E9F56741A1F +:108850006FD630A95B3A8EE504899F2CF547F85610 +:108860009165514E7C68D12972DB0FC247E1B38517 +:108870006EFBE6F673DB746E833BF89C57B61FAE57 +:108880003CEB5E0FD84B132F72170B9F218B17B445 +:10889000EDA70B4F3728464EACC0C7AF0CE279C3EB +:1088A0007C79E50DFBF8BFA3AFDF584BFDD614FA7A +:1088B0001343B7CD5318C1F50A30DD739D7BD3F355 +:1088C00001223E7D0016419F6008650391B91EE8B4 +:1088D000247089A1AF74C30A74C73073B0B8B05D97 +:1088E0007D177DE2078913344134FF2A6A692CBE63 +:1088F000CFFE7283D1C05B67215414325097811E22 +:1089000036215148E1C7B05DE3C7A967FEE7DA74D5 +:108910008CA7EABBD0BF731F7CC29E268BCDE32DF4 +:108920006CA8EC3D92B99DF2F6DE764349D2F6D3BF +:10893000B513EEA4373C47FEFDD3CF37CD6C35AE33 +:1089400081AD76B30E02F8FCB5ECB5E487C59BEDBE +:10895000EEE9C6B3E6D78763E89AAC3C7761C18796 +:10896000AF003F8A540F3FDF0EC7CFB7D7849F8E2B +:1089700052869FBFC4387A337F72F4A565C0DA1778 +:10898000D6EDDAD3236444D72AE3437017CE3319E4 +:108990009A016CE4D6F5E8676F2E26A3C47A539843 +:1089A0003D753D036ED5F072267AC02ED9CDD85BC9 +:1089B00076F781904BC77E220FAEF7835DC673CBEF +:1089C000D76F6CF3C2B57C736405D62D9B1FBD7A3F +:1089D0002DE7CEBAB182CDBC2677D622A03736A0FD +:1089E000E0C39B02F617490AF8C3903EBCA02630AC +:1089F0006F1AF1F4FB218E082029F05CDBAFC795DC +:108A00006B5DE01B1A4A5A0663BDF85B771FAEBA6E +:108A1000FD02D6C1BE186F70BF252C3E39A643118A +:108A20007F66BBF7661EC9C32F73893E31037A5830 +:108A3000C281C8ADE9981EE0F0963E44E670E58537 +:108A4000E8DD8F52A93BEE8569C5778446A83208D8 +:108A50005115E21593C30FACE5DA5EFBA770808079 +:108A6000471570B18BF5F206C4097741E267C82259 +:108A70007AA8162AAA63FF3091355B9638008B934B +:108A800078D921AE6027AC6161189DB780B0C97AF2 +:108A9000B5F24C9FF2FB10F1F3DC8D0EBF26899FDF +:108AA00057DEF3F4393FF3B982CDCE1FF96657B8DC +:108AB00046377B1AB7996C089E49EB748840F03DA5 +:108AC00059D21F54A54CC603AF97FF089CD628491E +:108AD000287218BA312D1CF70456605B8E39366D3A +:108AE000FD118B0A298AC4BF2C254874C3137D1D30 +:108AF000B84B18D22037D1A320206CDEF24BDC1209 +:108B00007C33B7443FC2588C6292A0062698AD3B96 +:108B100073906457263D6485E7A732833B8F870CAB +:108B2000991B3D42E4C1B26DB2F64D2238732A7EE4 +:108B3000D1BB877DCB945BFFD7386282D4E411DB55 +:108B4000A291A13EE3B0654BBE7B49DFE99306D419 +:108B500072E8B064B995A82DC7B0D7732A9D6F8409 +:108B600071E253911A3EFAF09C14349DF592FE8402 +:108B7000FB48225C3114902D0EFE20FC47121F8210 +:108B8000F497CF7303B6299AE7AE2CCD8CFBEECFCA +:108B9000DC03CDBEABBA21E6F0E33FC80FD35C5196 +:108BA000FA33FB27686A4CC7227419F7E155F9E1DB +:108BB0009738C85CA34462784ED9FFEE740FC44E58 +:108BC0005893032BCD172AAB1C59CB995BF4192072 +:108BD0000A28CD3A89C6A66AAE118FFF6B90256927 +:108BE000B238802EBD08415BEC6772D54FFE9363AF +:108BF00034C14BEFE840D4506131DB43285D528CE7 +:108C000084C72860028D91B4ADFC1AE452A4468F4B +:108C100051488F94F137CBC0D304CD322E38127126 +:108C20005B4A30386C9E0EB8A24FFB44F7E8A7545D +:108C3000C0816BD37D78E6E3B67B19527410860A47 +:108C4000740D6E3F7E0EEA278D8EED5D801BCA8708 +:108C50000B033AA5768867FE343DF7D2193C5A419A +:108C60001F6EAF890DFF1C74232E989D5227E1C8FB +:108C7000E4E1CE748809A3D37B710E83139FBEE217 +:108C8000D738C21AD7902591A1EA2B45D520421595 +:108C9000250609A9913ED35FF51FE67A7566FAC1EC +:108CA000DA2B54E9CFAFBE9E95D20B06710848AFC0 +:108CB0000F6C54721B0EFBEB28F6FBF96B73B58E31 +:108CC00010F924C27E96D6115E60D33BCBF8516872 +:108CD000FA65BF20B50CC0017BE49734FFAA4A9324 +:108CE000544AE236EDAD09458913EA24DE3A69B605 +:108CF000B112F9AE6693B05F9161FF0319DC9BDEA0 +:108D0000135958DEF2815E6FE117773A5C7604B84A +:108D100039F05CF62BFA8C71671A3FFCF59218BAA1 +:108D20006DACED5055844BD20BFCD08B0332CFBDD4 +:108D30006EAFCD0FA40CD1B60BFC3BD3DCA9A8AA17 +:108D40002AF0729AC692D0913A8A2A740EB2346787 +:108D5000FAC7F6B0C4ECBAF923D41460FDD43603D4 +:108D6000F899F75E14B69874C308931B4AC23F4241 +:108D70005C329FD882C600D06FC2A903794C1B0910 +:108D80001BF5B0CA3D233AEB0B833BD8FCDF6CB933 +:108D9000A294C4A6699B4BD361C348B93CE693A98E +:108DA000CF93213C1EB9790ACC8A36A77F441F1184 +:108DB00022089AB2F5FD11BA29792D0903282561F7 +:108DC0004D909408FA8F12EEB4415E124F59FA6832 +:108DD000B4E00875BC92525D928EDA249E36E30BA5 +:108DE00052929481B736E80BB23DBC59262E05CE7F +:108DF000057E270BB71A9B2BD703016B613956DA17 +:108E00000695A011BAABD2FC878E0352151D0898A7 +:108E10007F3C52E9F6A6FAEE9B62CA25180749B8CC +:108E20004E0891723E57727EA3E67C8EB68190000A +:108E30003A795FF05CDEE37C9571D11722DA9449D0 +:108E400040CAFB26F908F7FBEFDF7FFFFEFBF7DFE9 +:108E5000BFEADF7977B020EF23E7CCADA58F6F179E +:108E600041DB7DC3561BE00429F32215E54A0226A7 +:108E7000BEF0B56C59494B3BF5E2B7E7899DE7A1D8 +:108E800000098226323C52A3E483EBCDFD3F12CE93 +:108E90001E26C1DF3119EAC3918787EC65214EC9CF +:108EA000EC6B3F7097CC360F7819CEF32419255F01 +:108EB0009001017DED839489510BFA520EF62A48F8 +:108EC0003052F2C27FAD40DE3944217551A4239265 +:108ED0001473021C774FA25274109323D60D282AC4 +:108EE0003D858C86E9702C6AD92F92C5652D5B1A59 +:108EF0004F3E59248CAB425AF7CF7A7263038814E1 +:108F0000A84E073386AA67B4C4F92DAB491347743A +:108F1000A053C6D8C79E6DADCEDD873C93D124F457 +:108F2000295EC501EF7E9631F191D051081D663F53 +:108F3000CB909C54ED1376A1CB9B7F0140FAB1E11D +:108F400089E8CE9C849A8D8554E8E4E1CD310EE524 +:108F500084E266A34EE4C57CC6C567047AC34BA50C +:108F6000159F5690C7268CD75F7BB906B96E8F4C7C +:108F7000D78E95320720E60578B496EB2599C76C15 +:108F80008B06367B74607A15843EDF6A681764A5A9 +:108F9000BA49AE7B3A78162B9C2C3514A3C1704D80 +:108FA000FAF1194BA9C4D43964E8ABFEDCEFEBC687 +:108FB00089A5FB13D3CEA3CA95E7CED7E17E9B9AB2 +:108FC0007E40AA50A9DF9FCCFADDDEEC64D89DCCB0 +:108FD0002683F38A4183F20B102446D8CE32298EA1 +:108FE0007AFAEA23012C114013A178221451D543B7 +:108FF0006A39F5B070A920C433B5C30DAF478314E7 +:1090000019F57BF3CAD47F8C2989672B23D7B1F854 +:10901000892510EC58BAE3954FEF40AA625F92EEB3 +:10902000BDE9D184263A2C61E356A39CA870520D69 +:10903000E2EDC5C89A0D85E215BE80A529D9B4E137 +:10904000563BE298F7786505C6DD6CB93CF0CE601A +:10905000C3543D279226D6382A8E6EBBB7CF134312 +:10906000DE11B85A17C53AFBA68819D464BEA4A766 +:10907000AE6F2D16DDF9BF9AE45093FE28E44EFD45 +:10908000E1E9E9ACDBFF7B35D4AB47C9A1004D2159 +:1090900077A288221453355894A6B5C8A2E6A096A4 +:1090A0007D771D7362FD34AF73E9E786910A992CD1 +:1090B00060E3518791081D8AD0B1C8F59E71E848D8 +:1090C000A77E2996A4650A59E25EB903F9F8FED68F +:1090D00024BEBFFD82F89685C3F16D8CFD3B98736D +:1090E00077617EB95DEBDEBC61410A98C8ECCBD9F3 +:1090F000E7EEB85F438C3A221ED5EF8D3F12400E4B +:1091000009B153537C120FCCA629E64D8ECB5C3AA5 +:10911000E7AB87DB89BB0E7A816773FB4572508BA7 +:109120008A9D1C26742833DDE4227C0B59999EE528 +:10913000568DBC12E55A177CD354CCC44C751DA671 +:10914000A368CF4B36BE19B2F187924D9190EA7E5B +:109150000C74E3EBD04D6BF3B8B144F89E7163F837 +:10916000B5F4FF844D33DFA4D93BE925139A893E3A +:10917000FFD7DA0FE873759DE82D9A119F6123ECF4 +:10918000581C8B0C8E9DEC044695DBC3E298A731EE +:10919000650738636AA5F6C9E9646A2D4DD8BEB97A +:1091A000EAECC5A8F84CC73622679345FA96FF1B30 +:1091B000AFBC238072D7016D9E45A22F618710D36B +:1091C000D657BE496ECCE0C1341D6A1187DFAC5959 +:1091D000BA4022C4D60041BB220BE06B189570C088 +:1091E0006F03E7FF144D9904111EAB7300456CD358 +:1091F0005E110B4B3D63E08CCDDB26E5A45E6F3644 +:10920000B8988D0767AF4F8D632252CF20032A8F06 +:10921000DFD6918E0E4C622D26D6829A2BC6618D9A +:1092200095ECBBD57D2057EE031C301C92597C3643 +:1092300013B93884BDC263D1EA2ECBBDA3172F0E5C +:1092400083AD1804A5D588AE3C8D63064F4D3DFD1A +:109250008A46CE20CD3CA5AB7A53DD35C1C94A9BA9 +:10926000E7CEFD19E6E0B1B9F9E5E78EEECB7C3249 +:109270006E93F319017D564D84860612403D4BC412 +:109280000A53F3AA914EAE13181B2F2435C106C8FA +:10929000D6DF4C9B04F454B2A54537488D33A974EE +:1092A000DA24E4C62CB62D05D37375CF371BB58CE5 +:1092B000F5BAE783D969B737BD1CCF7A97DDF1647A +:1092C000509DB11EA7059FE18B84082311C66AD467 +:1092D000C550DA148BC38042731E1A44280AFC83DB +:1092E000EC36E3683C125958C211ABC92E82F2AA7F +:1092F0006CF8A2A81E1E4F61D364BBEF39C59592CE +:10930000D8FFFEB7AF19E83EA78F93EF688B55C51E +:10931000769D5BEB18D02D48F97A7D5EE0CF4ACB85 +:10932000C8E73F778D1F7DCB0FA5FF3CF1822EF064 +:109330009CD643FABB15D0B8F253CB0E102FCE8E6D +:10934000ADDEDCC361E19428908891A7AE2EA82AF7 +:1093500049C50E43220AA506A8BED6D79E3B7F4725 +:109360000D940AD4C0CC886E4190AB4997E56A60F1 +:10937000D6A15B58416FEDDD9B2191A6772085DD5D +:10938000B9F69C791CAFF21D99DDF3B351C619A44F +:109390001FC3F608081B332E9913C4A3D67164AA01 +:1093A000BBF5B438EE480DD892221D5E09338AB958 +:1093B0009185EC981BFEC0981B145C981973134F91 +:1093C000406C6902C908A6C20970AD4C40EA24EBA2 +:1093D0006A154C40E0B59C09A8DAAE5345A9EEE801 +:1093E00096851D0CF0D91350CB3357AA25A228021D +:1093F0008AEC4FC3BCC609421A6E241105DE9344A1 +:109400004D71324ABC6C251BEFE5F1416598974AD6 +:10941000F75E2CD07FD5EFCDCBF8C1C624F9AFDDF8 +:109420002F83D9E5E9E964306D5E177B46F19D62D3 +:109430008744E8A9E1D86E55A78E378F94BD79CAC5 +:10944000FD00A59B87D32AF28D1CCE297185BED83D +:10945000B2F78B95F956CED5211CF8FED268CDF81F +:10946000FD7C0EDFEC1C4A0264602B3DBF0BD75B1A +:109470001E747AABE6A145EF0C6D689B37D7E4D13B +:109480005C6E1A56E737F01BF80DFC067E03BF81B1 +:109490002601E9051DE33942E6C7ACFBB366029D30 +:1094A000C04999893B4AC50A0D7B38D28B45D3A860 +:1094B0007C48D446A4C88557E8498F9374A883E7AD +:1094C000CE2451063E4D67776E69AE45EC33E70515 +:1094D000EED34F66FD50E08F8A6E72E105BDE471F8 +:1094E0007995B8947B2D5F1D2FAB7C9B3EF2D3C941 +:1094F00070A4701B8BD8C1311051A90E3A2CB9370A +:10950000990384053EDCD0A007DB7D08B327B7B6FE +:10951000325AEBE6D10A8BDBE308088A6597C08BE9 +:109520003F904BF8D67BB02872E9EF8042208CDE6A +:10953000D3D633F427A717A3A814889E1AE243555D +:109540006F2EC7BD641405C595C26D91522780A2C8 +:10955000555F11F5AD7617E6B9B908CE3C779D5B3E +:10956000274CE893E8F4979ACBB342E26078E25B49 +:10957000A05CC4A500810DFBCC39CFBCA4276BCF68 +:10958000AF1D5785E95701168FE0B660CBA5D8A669 +:1095900021AC6F9AB4AFF358BF7FC6DB619B5AF121 +:1095A000C9FA3931ED86037126FDD9A7E1771AACE6 +:1095B0005CDD69CC1D695205010CD188E59A7139D1 +:1095C0007CAB619431FD7E075165936D9F482AE421 +:1095D00024688762E3C72A813715AD43558D43DE82 +:1095E00063FD2A52FF232A6BBCA4C631BE264B7DE5 +:1095F00055A86F14AA1B5AA6B6A1A9A2F2B2F7C920 +:109600003682E294F64C682B22E9747851231EA925 +:1096100073FCF148A7B8C344693492C63D4388EE51 +:10962000D1255E1E5D52D32139978726F917D3D0F5 +:109630007FB056E6B791E59485D8C43554C34AA6A1 +:10964000AE574DA364C3D342D461AA0520E51BD114 +:109650001F2DBFF100C196037547D5D7531664205F +:1096600076DA340938EBE5F871B47ECC2363F84C34 +:1096700021EDB69910CB35C8044C970BDBD7199662 +:10968000798F73D28FF4105ED4584269F327497BE7 +:109690000609FDD237FAD67D93BCF372D203B6F930 +:1096A000E5B58BE88018423153E3D2E35B8D8F0F31 +:1096B0008BB5D3EC997C56A97B644A7F553735ED41 +:1096C000EB9D49AD65A19D6D6B0E4B345A808DECC1 +:1096D000B855FB3DD613D4F9BCBF9F41304EE3FCD7 +:1096E00059B2D7F88AB9A70764AF45A5FDE71BFBB8 +:1096F000714C540B6EA8D44DFCC3726881F2B82B28 +:10970000558518EF093C121635CF680A180DB34776 +:1097100068B7A0BDB2C8EECEE1B9F90FA541555565 +:10972000782EEB706DF9712F94B0D2F5EA0E964E4B +:10973000EFA2875AE1172F1A5F157BBA52ABA8CE5A +:109740008525A9D5E416369B617E4B9BFD593023B8 +:10975000A1BE580072433A86E483A3E4DAEB4D11CC +:1097600031E0C120FCD94FEC17BA7763C13DEE3D23 +:109770006D28FC076DC04D00B52E316E0C7626D8D5 +:1097800045BF64D1E91FC8290C613EEACB950DB8ED +:10979000B7C30E3E2C9DDC8717C14588DE073B67AB +:1097A000F70D401873E5B391D96B2CC7F04C98A80E +:1097B000BFFDC5F6FEB88179EA3FA25E573483D576 +:1097C000BAA56F0C8708EE3C777D7BC79E839F010F +:1097D000CA3E90C99DBBB6E7CCEF13FE34B8D38127 +:1097E000D30C2F66579FBA93C16C78D1AB7B03F132 +:1097F000756F9DFF093790C0296DE74F5FB1ED3B55 +:109800008CB60779BB21E0BBD4913A612DE38B4C38 +:109810008FE12FFC1C3B63B19B083426BA91A3BE99 +:10982000F420879B16C8E1643A1E5C9395E5F81F07 +:10983000C23ED8CC936879F0E37F5255267AE33F55 +:10984000DF80FC13787067B2F6446BBF7257A27F5B +:109850001C9579EF04AFDE2FB4EB1555FF4C6C006F +:10986000DDF3F4A7CD376F68DF0A56D761E82CDC4B +:109870000F5B14BED9B7335CE336C0D86A7455C2E7 +:10988000C2F7D179369BBBBAD67374B6A2CD81AD7F +:10989000A1F2C8629B972DE0658C120F0F4B3A1C0A +:1098A000E98FCC96924A3EDC154EF94C7AED26DDD6 +:1098B0001C6FD1A8BD92EE31F281320648F897C0F4 +:1098C000FD9CA0B0256A3D0B9DBB1D9032E6E8359E +:1098D000712A7DF335385B36D05DE2E57CCE5D4E96 +:1098E00099794EE1DA3499032B5D5FB9ABCFABBE0A +:1098F000FBE07CB5E6B8AE79BD94C6CD798231C9BE +:10990000CA5D91F58ACC6158F2C0C6AD563B2AE9D2 +:109910007E7EB91CC4320DAFC8E7AA656611EEE6BB +:1099200092D27898B109F7A37513D6B91D3A804F32 +:1099300090BA2B36D04BC83A42E1C9A29554C85BC5 +:10994000D0CC79EEFDD227AC5FE03B1A2BE5994BEA +:10995000DD6265E959DD8338262E12CDA979C08EE6 +:109960006B5EBCDFD6BC88AC97ACC0D4A653F87A8B +:10997000358799FAB5A5205E46B237B78754D4F239 +:10998000414624A2CF86342A909484024929BB1BE5 +:1099900056477BA1781A2A8FC16057A6D73BE95555 +:1099A00035D1E76B263B247F41433B28A83E2D80E1 +:1099B0004668C126A6CBD6B1B11F584A28DD872CF0 +:1099C000CFD1454B545EF3CD5CA0D7EF0DD7F5E674 +:1099D00096436BD2B0DE139E03CBE7E328CAD05583 +:1099E000E499B795BBFEF19CDA399A733861D3FFDD +:1099F000496B7A5EF375DC5B82D6B6BB9251916B94 +:109A0000958ADCFE54E48E92845C0D120AAD9AEEC7 +:109A10009E46FAE321E5AFBF113A403543B6B07B2D +:109A2000A044414D34BE3B3653362F704D65E97727 +:109A3000848A9D315218291590959D14EFF774086A +:109A40002D7B165553F5EBCE42E3EACC22275F5F20 +:109A50003CB44D08AA81575431A0C3B7840749AB21 +:109A60008307A59DC209AAA05544839A33818329FF +:109A7000A14A158B4774A49628D151EA5042CE9939 +:109A8000C5C178E0ABEE48ADA5CE39A589D08F53DE +:109A9000D736BDE6828D8278381A8F73CDE2719801 +:109AA000CEC4EEEEC6AD802D5FDA8FC9E52C76D63A +:109AB00050867DA9D52622C11DC8FBA13D829507F0 +:109AC0006CAB1ED394BE67F32C7B53DDB2221C52C9 +:109AD000740554759743407E473DE5C5E484268A66 +:109AE0003255F4C056567277CD292CB98769B3F632 +:109AF000DAA7F46DD892B28D44BB616F62FAA511FA +:109B0000BE8B1A5474E33FD7169CC4D8A2428D264C +:109B10001F0E714CF247670E39D95978C3A61055FC +:109B2000925EC41412F67E1F01352C76C087A3BD49 +:109B3000D217BBB6ED3E848E7A565F7638A21BE311 +:109B4000C6247AD89D684EDCFBA8CFF84AF70312EA +:109B50003CB89159ED43E33743E3C985218EC89260 +:109B600022E97D58647438AA9360D86E0C4688EF59 +:109B7000D38BD127EBF6AE340BF5B42C0B7543BF6A +:109B80004D7EA97E43FB4C3DDC59C6DD4E7A28A1B3 +:109B9000FF073A1BBA4DE3AB169EBB0C93572F46FB +:109BA000346825A8CA0878F945F347C3A2C8B06A43 +:109BB0003AEF3BC0235BFE9D5F2F93546EB5890245 +:109BC000CD7105C5F478F38C59567959A6B1C232D6 +:109BD000CF0F4935E65F3ED31856BA5FAAF1B304FA +:109BE00031FF6E6C5316CDBC77771B4E6837577CB0 +:109BF0000D17CD545F8DF447F897F65468280F245D +:109C0000F2F5873E313840098FD8D6FFB50AF535D1 +:109C10009D84F3A09F341F23D9B2A0D6DF4C7DBB17 +:109C200068F89B2EBC8EE9B5D5920086FD43BB66D5 +:109C3000F12505795AFB3756092357BAAC9D0A23FB +:109C4000282B0E40B5230F2EB680F4CEFF5DBB7ED1 +:109C5000D614D357DE5D45965AEFAE424942928400 +:109C6000637D70525598EF6E42F5969687A1D7E8BE +:109C70009EC945E79F4E6CDDF941C22AE6AC940AC5 +:109C8000BB958F3FF1BFC2CCCB6E60ED192A4C8AD9 +:109C90008258D5A62766D911326BD2CA9D32C3EA43 +:109CA000DCB403FDF97A46D0B7B5D02E62B388167E +:109CB000FA45D0B19B6818D16A3A6FBC87B8862A3A +:109CC000FB56C9336AA892AF24271D10C5957CE3C3 +:109CD0009AF2DF4BF59943AD98204C9190F4DFE96F +:109CE000669EB0E0FAA8E2786D7B66827D9442CFF2 +:109CF000545EFE056C9A8A20B568D37CFAEC84D158 +:109D000039A36533E2EFCA7A34ED50DE6526BCA58F +:109D100065DB16F36CD74D85E68F47D24D2E0AB61C +:109D200075B88AD4F2EA782C5AD56C02DD0074F446 +:109D30005C73B1AFBC2B16D8A8E1D105E309C48090 +:109D4000372C2CC3DAA38BA08A22F2F24AED0A88C0 +:109D50006DA2EE12C901A424A0244753C504A0E1BA +:109D600097A29ABE029A8398E42DBC8C7EA922DB2E +:109D7000B986B810F2BF087CB284BB2024A7228821 +:109D8000E89722FE0EA14044384065E1051ECDA5AE +:109D900023A379224846E5E485E4AC3B087BC96F00 +:109DA00044F1987409B1C8D08FCA8927B4894E6B21 +:109DB00025263726AAE138BA23492F711E8ADA7977 +:109DC000743D533FA736D0736B6905A55772ADA696 +:109DD0001E746CC206276C7432CDB09CD5A93B7939 +:109DE000BCFDA9A5FD44C3CC5483C983151877CD08 +:109DF0005C8071DAFAE77DD20B10BA5FF8D28B5C27 +:109E00003107A516C8ADD67A036D62DA52E58F44E4 +:109E1000EEEA2B2EFE91B38AD2D8E4564D72C1637E +:109E2000CFB656C0A40E09899C3E123A0AE5757B4E +:109E3000DA52D09D7114291F7C814B2B39D944CE25 +:109E400087B4E2859D7C1BEFD61C8E4AEF958979FD +:109E50004B2FBDCCFC9A8D8B2EA8797D70B54AD343 +:109E60001E41F8292F4A52033DF242FD7A0C8284AA +:109E70005E66123A54C50E9F87B791E875247A5FE3 +:109E8000A55CC2A44095940993825F5200957E5DC3 +:109E9000C55A95851615EBD0B4C46B79C1C03B0586 +:109EA00047929F9459C55027FA829E55BC9613112C +:109EB0002DEEF46E12951AAF57B48AAFCF0B019600 +:109EC0000F8A3C8519C842C90C6207ED191CBDB345 +:109ED000C841DB703DD8B3EE7430DBF8685F67FED5 +:109EE000F5D64F4B1145CE623F6DDD9ABE62FBA6A3 +:109EF0007E5ECB89A496941D8CE2A603257700C7CD +:109F000049D562B941DF6FFE38C1EB45A1E27192DC +:109F10009B6726F07A5EA9F8FAAA61E47C8D9773B4 +:109F20005CC59777725E9ED147AB1EF135AE22F1CC +:109F3000B5AA19153527A0947A9BDC9FE62710C295 +:109F40002E178BE7C9DCA5A1429667B230A43B5A15 +:109F500024C77123ED97461786B50BC80DADB963BD +:109F6000C689BDB7B4A249ED40540ED9CCD4E3CBD9 +:109F7000CDA56807BD6AD17408AAFA82D588A70D55 +:109F8000D6DA16958AB5B683FFE9B5B67FD5BF8F09 +:109F9000B186F8B4B486B858149B22AB99528EC6D9 +:109FA0002B2F533F68B97EA43611F3D29BE7671C71 +:109FB000943535C93FA86C5816A19A3017311B92B9 +:109FC000A91B77D4A474C8C19573FCE0C8CD917463 +:109FD0003B1CC1864208276FCF07A7D3776F9A0C27 +:109FE00074125FA6F595E37A4BDD3E4FB598BF74CA +:109FF00006F3DBD6129B2ED83B6307453446B2ED01 +:10A000003CB974089B407DE10117F6A89FEFD4701E +:10A0100066F4B3359F17A4169BCFD3CD6FFD34F7ED +:10A02000E533428520A7C6184DB2815EE748188700 +:10A03000F5D36C565A14B417AD5AF7C55836DCE34D +:10A04000E04B6F54BDB381766CD5EA001F75FB19E8 +:10A05000B4DA3FC7FF61AD0A6B2657AFAB3581A1BC +:10A06000EA944D2E6D01BF0F47359D358D457AC35E +:10A070007D24AEF327E13F52FDEBCF062A4D70DC85 +:10A08000611921B91B2AFBDCD082C203A7F186F536 +:10A09000838BD7D7358C9D1BD6A67EE0D43837A2CC +:10A0A000DA6A59FBB9DFD70DDAA3A42077A70A59DA +:10A0B000FAFD09B9A565CEF46D3879B552742F4013 +:10A0C000A2129C0BD28175A93601C080943E208FCC +:10A0D000F580C98DB3FF7441BB795A4BD35D077BC3 +:10A0E000E7D86D7DF8860B42BBB1A6E5E4E240EA15 +:10A0F000070BE4CCE1C8DFA4D99996474B4DAF4C90 +:10A1000056756EEBE1DC18B496EE3D2D4E07338AA2 +:10A11000B3F6581E9D573DC152955F30690ED0C5AC +:10A12000BA734648AD9130D76AA8F5ADEDDE9BF322 +:10A13000500BA01712FC315B143A4A3F3DDD78D634 +:10A140009C9CD107333618FB7C1EEB15D190B57C57 +:10A15000A1FC51063BE5F8A9F72BD28969C062FD45 +:10A16000C3F4FA5AD27DE1990B63FCA36A05C004DB +:10A170009928CF28FB81B0CAF22CCF95568F371F74 +:10A180000D13F031EA5ECF2E2E8793C1ECE4F37805 +:10A19000329D7C7805F1356C8D11E66AB442569E8D +:10A1A000EB446DA23D662B2368E440D50C1C046291 +:10A1B00048AF2BF0A328342D4F7BE2563B67CAF9FA +:10A1C000DE834BC7F2039A5A3DB272E53D56A11C9D +:10A1D000B6D06291297927BF26DF49624C4207AD8C +:10A1E0004403A9629968560516DE63D27244CDE233 +:10A1F0003AD35C214A0D446A3E5113518FD5C4773E +:10A20000E73D77B9022E55581B3ADAC75F5395815F +:10A210003769807428178EC3A6807772D03057C1F3 +:10A22000AC6C95EA28AFE82E11F8068A74F72D7FFA +:10A23000254C8DBB2FFEFAE68BEF4C16417FED1DB2 +:10A2400022459F5DF467E3EB59FFF398FC5FF265ED +:10A25000F2F964D617A60C7CCB73EFC85FC3CFE8C6 +:10A26000AFD29F7D995CCC26A7E16FFF4A848AA17B +:10A270006AA27A7CD2F7C1B5ACE2DD3D7458837234 +:10A280002ABC0259C22D7D4AEB8550B2D9FA1399E6 +:10A29000BA84B19C8F3B284CD1D95AEAB76691C792 +:10A2A000B0CC1E58E42184E96DDA61B01E17440F6A +:10A2B0000BDBB0B7623321EB28435BCFDCF85102F4 +:10A2C000CEAEE010569F7B1EA722DFD0DF42437F39 +:10A2D0008B0DFD2D35F4B77CC8DFF50DF6F947B4CD +:10A2E00092557E737076375EB9FB670F67A2D454C0 +:10A2F000179C7D22A9042E2FE15554DA4CD2FC0D77 +:10A30000BD6EA86EE672F6D617385466B038753949 +:10A31000DEB07CCE86E5B5DF1BB659A26537501797 +:10A32000382D6918AC4634A1A1B47A89EBA0F8F4B1 +:10A3300052B099147B1EC516565BB2F8DA979CD4BE +:10A340008AAB2D59AA1AE35DAFAA2E2F48D5A2CC0D +:10A35000052E2F2C76B7AB27E23CA513280DCC5C3D +:10A36000F8A7CEB24FA5DFE069EF22802BD3336888 +:10A37000239F5B33B637AF3CF3DE72D73E4C6C5352 +:10A380000FE44E0F50C9C7D09866863231AB4B6888 +:10A390002D6132B42E619453BA8DE2B4409F659121 +:10A3A0002C811B76B7DC2D2D982C26F8A1855CC559 +:10A3B000E66BC3E1F9D35A82F38810354CDE7CFB9F +:10A3C00061EB029713B6AEED7AE86A840DF3C26EC4 +:10A3D000F16D2EFBFD3971CBBB81D3C0476A9C4F19 +:10A3E000B162D96D81CB09DD56A4838EA7585A81FD +:10A3F0001D3EECDEF8DF9A30C98DA23A8E5DAA7D53 +:10A40000564D86AB6A136AD12097DDA54DDAAB3283 +:10A41000531672AF9B466EC56A69E2112377AFC2CD +:10A4200093992787CFBBD93AC281972B2A41929D16 +:10A4300074108531F48C1B836F328AA1D73BE9F10C +:10A44000CD9780799E2086F4E44BEB57B55A85343E +:10A450004923AE691A71AF99465C1D1A89C233D17E +:10A4600048689A46C26BA691508746AD96248805E7 +:10A4700015A515414528CD30632D2FE0168C23B24C +:10A480001BAA441B5DAB6143AF793CF69EF7EB8B97 +:10A49000A5608D3297B16D7C52A7535BAB0165AE61 +:10A4A00067DDE63B802B350A4EFD885C8643EEE790 +:10A4B000FE6D301693FF4853008D3BDDB965268154 +:10A4C0003F88F011F44BDAD1DB24D77F10690B7D84 +:10A4D000FB83685BE8C60DEE289D60FC6F0D847001 +:10A4E0001EDA6AAF620827ACBAE7DAEBA5D3609C44 +:10A4F0004CE8D232C26169CFD3B56EDB4F753ABB3F +:10A50000F3DA519498410BA9530E966B531472FCD5 +:10A51000E5D0B1820B971A062686EE0C9D3BEB86A2 +:10A520001D265AC377AFE0425A4E1F980F8D5EDA50 +:10A530002DC21F8F1E96C67DBBB5E2BCAB7A27BF6E +:10A54000649F8D0B7F4986D1D228C6682A8E43B678 +:10A5500038230C6935429DA4560B3D65E62DBD5848 +:10A56000C652ED728738C919D50C44C0AF96A7C43E +:10A570003795E69CA52347CD582A7562F97458276C +:10A5800016DC5B231119FCA96EEB15EE385AAF6C83 +:10A59000DAAED4EDAA21B75AE80330179E3A16B5C1 +:10A5A00075BD6768572C30B2EF330C4AF95122EF72 +:10A5B000F9AC02562F71FACA42B8B87A7D8E720C85 +:10A5C0007809647FDB17D951E7875F19D93C2F1CC5 +:10A5D0008C6C90A4AFDC55DF7D702EDCC0B88B0591 +:10A5E000FDC373B646303259B92B3287B1091B7C93 +:10A5F00013D358B96A5BCBA1BB8D94C7E334ED503C +:10A600002ACCA358B8D2FBA28EF57A1360573364D4 +:10A610005A3CDA70DD064AE2798F63F7611C2A81C1 +:10A62000CD67128FAF67E3CBAFB3F1E0CB603C19DE +:10A6300090B7E771D79531757FBEAB2B9F89475691 +:10A640007EE0C4A3A92C9F57A04627D1D8685231D9 +:10A650005FD132DD785A716CEB9AAC4C73DE86A117 +:10A66000CB670357CB5F3D5223577A09A576AD568A +:10A67000134D620B362BA5E7B45648EFE2F596D1A1 +:10A680008BABE739FBD4CE93B436ED2291E0F19950 +:10A69000891E876BCE3B52C73A123CDA332FBFA0DC +:10A6A000C451E026D732250E6DA565D8A5CA8BF119 +:10A6B00052E572381C47AD15F22AF2D62FC89BC25C +:10A6C0006A19AA4F0083B6E5980CC5612874CFF5C6 +:10A6D000BCE807CF919B22A9CAE1DEF3C83270EE35 +:10A6E0003EB4D1A2354C24C686016A3CA3C681A4DF +:10A6F0006DA0765B56E1284C036196F41E9601B975 +:10A700004D2F2ABB17BFBB8EF98D6B4666F8F6DE60 +:10A71000705D6F6E399471B3D471CF01047031F5EF +:10A72000C28BD8336F2BAB51C7E3319BB0B9FF0459 +:10A730006C916F5C1D31827F1E12F2AD9290DF9F93 +:10A7400084022F778E928A7C1D2AB66A8A376E8C95 +:10A7500061DD569AE9C085931E31D670AD38C1F6D9 +:10A76000BFAE736F3EB91EB9B174FF780B9C9430C5 +:10A770004149395096DB64A7028A7A116A728B6765 +:10A78000840D3A7A77BA776B7AF092BDEEB8A89BCF +:10A79000FCDADF441F1BE180408980060C2F5CCF70 +:10A7A0003037171DEB2BBDCFEDF692775BD4C92464 +:10A7B000B1B03A31C25C9BBAD5C20A0CDAC087EAA2 +:10A7C0007F57A6FEA3912E40B132C906ACD812FE27 +:10A7D0005525EF4B4A0301AC36E839D49DD87E535A +:10A7E00044CBD93445643D82612856AB64AFB6880A +:10A7F0003CEA848621D4D341CCED3489A2975E61B2 +:10A80000E7868ED4664B4416DF30D203CF7A1CE93C +:10A81000ABBDCBAD4A5ABEF912446C8ADA9E6B933B +:10A82000A133371F29EBED83EC4345198AF72BDA67 +:10A830006FF090A2AB7C8524E1BC64DD646651B20C +:10A84000395C72A38196D6416087C3208F41018312 +:10A850002206250CCA185430A81624BBE1EF340494 +:10A8600025E72BA036818282D0A5A00C6B0535E7A9 +:10A8700053D0543B928C4105832A06350C22047632 +:10A88000640E833C06050C262725A34E83328FBF1A +:10A890004354E65192356AFA22F32A82340425E7BA +:10A8A0002AA3A0054DE0780C0A181431286150C67F +:10A8B000A0824115831A06F10EC4DB137D87E32FB6 +:10A8C000500B47554598451D235515511BB5544C04 +:10A8D000167087C94868EB01A861B08340B4FB34A7 +:10A8E000096D3F00050C8A18943088CA2B73828446 +:10A8F000C1D4B70A0671474C7CAF70420781222E43 +:10A90000B68BFA52F21CBA783495C78D37D126042B +:10A9100050C6A0824115831A06112655BC1555D480 +:10A920003114C5DD3230F52D6E8AA98918C40D4267 +:10A930003519830A06550CA23977D066D43A6837A0 +:10A9400002C86350C0A0884109833206150CA25981 +:10A95000C9A9B6A662EA5B0D831DDC0395C3208FEF +:10A96000410183220693735678C4BB14DC5E154004 +:10A9700019830A06550C6A18EC20109D3200D19CF0 +:10A9800055742501286210377D4DF55645571280C4 +:10A990002A06350C224C6AA84CB5222126A6483C32 +:10A9A000FE1675780550C0A0884109833206150C43 +:10A9B000A2AB9243771380E8B2E4641CA586EE262E +:10A9C00000050C8A189430286310CD4A41DC0CC075 +:10A9D000D4B7B8552DE2F800224C2AE89401C86398 +:10A9E00050C060AA3B2F6EC18B2E2900150CAA18EF +:10A9F000D430D8C1DD7C71E35F445F41C4F4ED2005 +:10AA00006E0660EA5B11831206650C2A185431A8A1 +:10AA100061B083452C0E833C06050C8A18943028BF +:10AA2000633055AA2025DAA11B9D47DC0CC0D4B7A2 +:10AA3000E8C2E711E70790C7A0804111831206D151 +:10AA40009C35748E005431A861106152C3D19E5A56 +:10AA5000AABF356EEEACE18ED11AA2AF2AA19ED16B +:10AA600000A6BE9531A86050C5A0864184490971F1 +:10AA70007E00937386BD2F6050C4A0844119830A61 +:10AA800006550C6A18EC2010D117042815831A06F5 +:10AA90003B0814F0B3880A000A181431286110AD7D +:10AAA00048C4BAB888CE912822090A401E830206FB +:10AAB000450C4A18C4EF45F49534440500250CCAEA +:10AAC000184C3DAB6250C320C2A486A9A0A1532656 +:10AAD000CAE81C01286350C1A08A410D8308933243 +:10AAE000523601C4EFED6075085101B4230E833C6A +:10AAF0000653AA14D6A544AC4C89589B12B13A858A +:10AB00004E99A8A17304208F4101832206250CCA07 +:10AB1000185430987A2F52E444440500150CAA18B2 +:10AB20004C3D8B3029222A00C86350C0A05858BE23 +:10AB300044C5A08641B4EB528D3E78A47E022860C5 +:10AB400050C420A2A082A800A080411183A96765FB +:10AB50000C2A185431A86110AD4844121480220602 +:10AB6000250CCA185430A86250C3207E2FBAD9E1F0 +:10AB700090A918D43088A8DF41540090C7A0804124 +:10AB800011831206D18A140E736F0E736F3EC5F9CE +:10AB900031F7E631F7E631F7E631F7E6F17B797C1C +:10ABA0001F616EC669F8A6D3F04D87791D87791DA0 +:10ABB000A7A546C6371DE6759C8679AC82B9B782D3 +:10ABC000B9B782B9B782B9B782B9B782475631F7F8 +:10ABD00046123280A9FB48C520BEE9447CD3615EA1 +:10ABE00027625E27625E27625E27625E27E253C6A7 +:10ABF0000B987B0B987B0B29CE9FB29261EE2DA414 +:10AC000046C6DC5BC0D6307CB3CB889B01886FBA6C +:10AC10000EBEE93AF8A6EBE09BAE931A19615241D9 +:10AC2000A70C40CC6355CCBD55CCBD55CCBD55CC47 +:10AC3000BD35CCBD353CB286B937DAED00A6EE2382 +:10AC400034674DC6379D8C6F3A19DF7432BEE964A4 +:10AC50003CB28C6F3A19DF7432E6B1F8EE56F0DD93 +:10AC6000ADE0BB5BC177B782EF6E454C8D8CB937D9 +:10AC7000DAEDC0CC53F7918C4105832A06350CE2FE +:10AC80009B0EF33A1EF33A1EF33A1EDB7D357C77BA +:10AC90006BF8EED63A29CECF6350C0201E19ED7660 +:10ACA00000650CE2FB08698B00E29B4EC1371DE694 +:10ACB0007522E675A2921A19DF7498D789D81AC03E +:10ACC000A76C5012B63249D8CA24612B9384AD4C7C +:10ACD000121E59C65626B4DB014C59C6640C628B51 +:10ACE0009C842D7212B6C849D82227638B9C8C2D68 +:10ACF00072A9F7629B9B94B641612B1387AD4C5CA4 +:10AD0000EA596C65E2B09589C35626B4DB01D4B02C +:10AD1000298CC7A0804111831206650C2A18543172 +:10AD2000987A2FB614A56C50D8C6A8601BA3826D64 +:10AD30008C0AB6312A0AB63229D8CA8476BBA22830 +:10AD400029CB18B6C861EF1587DD571CB6C970D876 +:10AD500026C3619B0C876D325CEABDD8E6D649D923 +:10AD6000A0B08DB1836D8C1D3EF52CB632F1D8CAE2 +:10AD7000C4632B13D2CA958E90B28C618B1C8F2D1D +:10AD8000723CB6C8619B8C886D3222B6C988D826C1 +:10AD900023A6DE2B604B51CA0685DD4A3CF62BF11B +:10ADA000D8B1C463CF128F5D4B3CF62DF1D8B9C436 +:10ADB000AB29CB18B6C8E1146259C51639155BE446 +:10ADC000B06D5356B1454EC516B9D47BB1CD4D4A81 +:10ADD000D9A0046C6512B09549483D8BAD4C02B6C4 +:10ADE0003289D8CA84B47255125396316C9113B01B +:10ADF000454EC01639015BE4B06D5313B1454EC4E6 +:10AE000016B9D47BB1CD4DC1364605DB18156C6340 +:10AE100054B4D4B3D8E5AD6197B7865DDE485F50D2 +:10AE20001574B363275D12C0CEAE2480182B62ABBD +:10AE300088A9622707F23F638362474C7D8B1DDD43 +:10AE4000D8A0D8C106C58E841DDD12767423E540D6 +:10AE5000EDA06B5CC0D6646C4CC6B664748C057C8B +:10AE60009AF061C267091F25EC8BE391940460EAB4 +:10AE70005B09833206150CAA18D430D8C17E6F2422 +:10AE8000BB6115086B405801C2FA0F567FB0F683BC +:10AE9000951F74826401BBB225ECE896F0B7327658 +:10AEA00074CBD8D12D6347B78C1DDD327674235512 +:10AEB0004093D0A5AD623E855D03D833800F2D3E13 +:10AEC000B3F8C8E2138B0FAC863DD838A841E552E1 +:10AED000DF62FF360E6A50715083CA61FF368FFD04 +:10AEE000DBE85003286027BC88411C0B20E2580097 +:10AEF000EC0DE6B03798C3DE600E7B8339EC0DE6CF +:10AF000024ECC15652207668E370860E0E67E8285E +:10AF1000D8A1AD6087368E9BE8A0330E602A2E0E36 +:10AF2000CD59E8E05800ECB3153A985B62E7B08081 +:10AF30009DC302760E0BD8392C542EC5DC667E5A82 +:10AF400018BE4646FA6A950AC5DE695D2D69050197 +:10AF500078749F6455B9447BE039B347A34A6D12B6 +:10AF60002A3A7D40926066A0E97CBDB22D23AC1ADE +:10AF7000F42678ECE22263C9C2008286A7C71A478A +:10AF800018FA6A323F5BEB5E0BA99293FEECEC730E +:10AF900077FC7A5325C994A2A8A7AF3E92C99C30EA +:10AFA0002CED9133C92B5ABB6548BE3759D7F67B78 +:10AFB000C5026E475CD376AFBE44A978EBD5C3ED2E +:10AFC000D8A411C623775ED019F7DC7D08B3EEC88C +:10AFD00057FD87B95E91282B28FF5044F1FD1E1BB9 +:10AFE0009C2CC26C1C5AF5FCFCEAEB1959C2DB5EC6 +:10AFF0005B069799B5A21A39402D9F0FFDB167796D +:10B00000866D4E6831F9A93B70E634B3B8A164FE91 +:10B01000A8A0CCA6D0232B4D1F96AD0F5C623A732F +:10B0200016446FB009349FDDD0769EFF9EAB2B2374 +:10B0300078BB7599A6C69D403B871DD8E2AD6FD2FF +:10B04000D6637AC096E92EC2A6A1F88922F6281CFA +:10B0500061C6972C3594F1C5AEC5B0F41EEED81676 +:10B06000DE2853376EDD96E6AAEE03639694A7E6D4 +:10B0700026803192E6CB1426DB7B1CDB7973F72725 +:10B08000AC9E0F1355E0EF0FC7DF6D9C5E182CE5EB +:10B090003BCDEA4B2B524A6DA676458263DE797929 +:10B0A000FCDB384B40DFEC874792923B9B91EFF201 +:10B0B000DE1B577AE53E1278352DAEFB27E1E3BF64 +:10B0C000BFFDD940ED56E1C044BA8AB55B81260682 +:10B0D0006C0360B42F783B7D0E2751917AFC315D73 +:10B0E0004FF1DCF1A236EBAD7327B52A8484A5328B +:10B0F00040C43ED519D95A4ADE0B9F778D1FD183A4 +:10B1000054A827D12B0F48D0E272EDB6DCB364ED22 +:10B110003D5B09508D6FB104A867B21181D45726E9 +:10B12000ED0BDC84D236DE8C49A241F72CB17F3C9A +:10B13000E5DC0EEFF61B9A5D4451C82E909FD5FEBC +:10B1400058A951F3852B6B4612BF5F6CA5D397A40A +:10B150000A6515FA19CABB80BAFBB080A0B534DD08 +:10B1600075D09C0A4BEF96709654308EF43E2ACEE2 +:10B17000B0EB24705DB8799CA790F2E4810DEAD31E +:10B1800026C8DCFBA54F804F06FEBBE65B41B47CC6 +:10B19000D99CB2C5E81BA49220C26AF52B866BB578 +:10B1A0007656BCEBE436DA4248AA2C54DCF56A4504 +:10B1B00063A720247D6FFB1A3CE3DE43EA9BEC6926 +:10B1C0006B52F62CB5CA6DCE6AB52A92348EAB8816 +:10B1D000A79C3E63E2C133E02BB65ACBE34F927893 +:10B1E0006833C4CEEE66C96E8698C7A2798E3BA836 +:10B1F000894967B73530BF6315BA582FC7EE830F3B +:10B20000F7E60955ED0F699E4025D195EBFB16B584 +:10B21000836DBB2878B45809ADC04FD9CD0A3E83A1 +:10B22000B19819A1623DB417545333F05359556D79 +:10B23000ACBEE3052D271437864C97F6992F434B68 +:10B240006A1EDD7AFD51A915810F350666BEC4BFA1 +:10B250003F52EBC1206BAEA5C5CE84968BC2B07AAF +:10B260002EA19A313DB0264C34C89ED2419E0BE2AD +:10B2700059ABC068D945601A106C57BABDEC7AA6B4 +:10B280003E5B3DE6BAE9E027591519E163421FAD7F +:10B290008659ED38319BC3EDF72BE69751EFEDC2A0 +:10B2A000A5BA7733B697B09E9BE593B9A73F38E42C +:10B2B000C10AEE68B9455A4EE7B5F977C2A5E4ACC4 +:10B2C000A04CE895A467613EAC3A11DDE09F577051 +:10B2D000D19E5B4B2B282D9554AB4C151D9BB0C1BB +:10B2E000091BBD6E017541E65E59D52AEDF0DAA65F +:10B2F000FE52B7EDEFAC0D4DB1E1EBFBDFBE66509A +:10B3000062421F27DFC33E36B5EC5828FCE635A065 +:10B310005B140AFA3A6AD9E8DEADDFFB1304D1DC2C +:10B32000DE18135A2B37B3426E8CEFEF24F6F85524 +:10B33000EC1A2CF33BAD5D5159972343B2C03585D0 +:10B34000E4EB26907CFD4B2299EF68D2E1486677CA +:10B350000E65C06130412357B2110FC7CC54EC0DBC +:10B36000FB36C77EB1BB98D55FA4BA657AFAA5FE55 +:10B370000DAECD42ABFE96C5C37D59402FDD2353A4 +:10B38000A6B565D7A1CBA5DFE970FC31AC936B1AEC +:10B390002EEC693F305761195D736119162D3D4AD6 +:10B3A000E7005304D4D119D47477747263CEE59C4A +:10B3B0000076F4F7334451A609B047F542A5C023FF +:10B3C000D2C9D41D0541565A0A9DDC5CF2EC725F6D +:10B3D000B0BD43DE4E7ADDF3C1ECB4DB9B5E8E671D +:10B3E000A7C38BC1BBD44E7B1CCC6FCD1EBC8B7A4C +:10B3F0003B7AEE72653ABE5ED49CA8A425141BCAA3 +:10B40000B5E69B3644243968D8B8D5845756DB5006 +:10B4100059BE85A3953904BE81DE39808CC807DB0F +:10B42000468F143A647D1FF551754AD9BAA8D9627E +:10B43000EAB0EC568BD49F5E8C4A1C43A5ED06B651 +:10B44000964EE0C980D47560DDD3200358BCCFF49C +:10B4500045321CF9510B02E0DD964700C12B8AFCF6 +:10B460007B735BB69FFE02486CD29E04B4D26CAA7A +:10B470002B01101FFE33EB0DFBF51A14C82F59C416 +:10B48000994E3C721045F8A863AFD3DABCAA833B4F +:10B49000A05ABA3BE9C872DA8A4998D2F7653526CC +:10B4A000A5C10975AF69096795E703BF5A7352498A +:10B4B000145A8C4C78ECD9D68AF626CD556BE042DE +:10B4C000848378A5D3BD0C84F4336ED2F123A1C359 +:10B4D0001036CE7E262EA4EA1C45571DBE800727B7 +:10B4E000279B40AFB4E2854CDF2CDF91B2DD5D429B +:10B4F000B1B9B5648E1C72B814B8DBF84E8E6F7893 +:10B5000027A48BCF7A79F6BBD56ADE46BEA3E4BC0E +:10B51000FB506F2397CC6D2C5E7E866B9AAFA6EFA7 +:10B5200095D323C32B4DE99D396381D3B227C865D9 +:10B53000E3483E687BA0EEAB85F8E1F3BCB1876DD4 +:10B540004F5EA8B8458476DE8FE26D8ADE2FD6F096 +:10B5500046D7998024559C8056F17CD63C21825058 +:10B560007502394109DCA11390CAA222967DD30845 +:10B57000ED073D27C84FB7D9DF8000DA8961C12ABE +:10B580007D26586E25D7D1AC3FE8450A2788B16B98 +:10B590002788C55126800EC744378CF5726D87FA0F +:10B5A000A0E547FEE279ED5608526E267B55E0573E +:10B5B000B532F09A2AB46C6580ED652D431246A62B +:10B5C0008688CA40E1B7C93D30EB5D4C67838BB4D8 +:10B5D000D9E1DE581ED8480848414D0B4BD779CFEA +:10B5E00042E5BEB876407BD6E9DB8E39D55C1BC719 +:10B5F00097572288076AAA3195BEF446F91D84E65A +:10B6000096CF0EDE94F69BA0C1298744EC60F535F9 +:10B610001E1A7436189B26E379B4372FF1ADAA268B +:10B6200007B1AADDA7F190907E3C7786179F006650 +:10B63000E80258736132B1B2734C32D3A4F976F395 +:10B64000B2D2F43B6F937E366DB2FC8AC9C79A447E +:10B65000D7A45EABADD47098CF4913613E27FB668B +:10B660001A1FB9E35C38DCAA7A6BDC1857E7875CF1 +:10B67000374387F5E1F6C9CAB575CF0A9EE839A107 +:10B68000EEF444433B7FDB21CD330DD3BAAFDAE098 +:10B69000E918BBD9258BF91D72079D5104C548DBFC +:10B6A0003904D497402D62F0C7487F3C0D4D7BA5EF +:10B6B00096B39A26B3C86511BD87FA8BC969DA8833 +:10B6C0005849E614723A2BA1D267F5A5CA57D27A27 +:10B6D0008B57C466C5CA228ED86D8223762BDAB604 +:10B6E00045E995B144EEF058A2B8B1FB64FEC9FA41 +:10B6F000D94AAD924FC3EFF52A95704754A9A4DFFC +:10B700001BB32225809C3D4A94B41B221C45FB6B35 +:10B710009D8AE60D3163E24276BA185F6658585149 +:10B72000B1EA72B16872AF786B87C4C573423F17D4 +:10B730007B0BDCB08B57B7713E9228A69CB5F123EA +:10B74000976809A581FE9D361506FF87B5A28BF582 +:10B750008B03FDCB1D549B50031890B011A34537AC +:10B760009EB05E99D92632D8C3DC60E2AE4C0F564B +:10B77000E53321CD0DC7A188F3FFA0A9EDD18FE658 +:10B780002EFCC07183EDAFD93B9E920F101F2E345B +:10B7900023808DF19676C5FD37C2BFA31A0595F2B9 +:10B7A000005EEAFE0F62DBFF5AF45C6761DD7ED863 +:10B7B00020B98118464E909E23693E66276AD3DEE3 +:10B7C0000C3159F4379B9DD0223D13771DF402CFE5 +:10B7D000CEED0C4E7F54923DB97AB8DD0C43EE7538 +:10B7E0007B5DD5AF2D6BA8C8D9B3B30F34F31A4E18 +:10B7F000ED4EAB374C922C5C3364E16A91454426A4 +:10B80000B017A50A57872AED4605FEB01C5AEA254F +:10B8100064C8D112B3FDCBF04B32C2013E09AE1D5C +:10B820007E1717356003ED77CF0A8D716DC7754CA4 +:10B830005674244A7FA65C3BA0A9F9A6FF271136BF +:10B840001F3BE643F4691DFE9A27EC08CFC15E9FBB +:10B85000A6AE0D970BCDF86F24982B888763C5593A +:10B8600088FE68F97503708FA7E6C8537239F5A38F +:10B8700070A55653C06399F4EA0E163A748C266587 +:10B88000DEAB4FDDC96036BCE8BDF6428E0C3984B4 +:10B8900062A7BA7A746835A062B2D1B4BE4D36D10F +:10B8A0006C6504FB24F7D54C4712854419E2D76038 +:10B8B0004328744EE4D96CB8556661C7A96E9C796B +:10B8C000D67C323F03E48ED68FF4D6DC4F68F0CCC2 +:10B8D0005BCB677752B7373B1B0FFB335AF3B43B55 +:10B8E0001DCC469FAF67BDE9F8FC1FD247F90FEDAD +:10B8F00063E73F4271628F428FC8AEFF22924526B6 +:10B90000BE6A6889BCD2BA7141E2726267902367ED +:10B910009FE00559ED548B5F91B8BCF8194D3D700F +:10B920000A5AA95EE23FE8AB30488F398D0EF0AC81 +:10B930004D6024502159BC5F7507DA4B5A340A66B2 +:10B940005C5A544F15DA2FC922F3AD84F5C85CE96F +:10B95000AE7878BC8C7F5E23EDF2EB23891EDB8F03 +:10B96000F4A863E271847126BBAB57C849CB4C493C +:10B9700043FEEB7AC10709778F58282B6347B6BF80 +:10B980004F244222E208F7780530D5449E3B82E2FC +:10B99000EF69FF775EE8C28E3F482CF00749391EF9 +:10B9A000725978913AF0D652BF35C78FF99EC2B21C +:10B9B0004D93E80A94B56BA6E3C13559598E4FD61D +:10B9C0003E60520F63DCD85B378E5D9F1D36FAB93F +:10B9D0007EE3936BA686EDDA36DED3F878AD2406E7 +:10B9E0001F352F431DF270EBC8A4F31137C4CAEB07 +:10B9F000F6A2E4141D7CAE57D6CF1AC83F0F95F8B7 +:10BA0000567C0A86985645FB9E2F6A812068993B92 +:10BA10005F6DB4AC61E5809FC86337DAC47636A940 +:10BA200090A2A0BDCA3AA9A01D9BCF6E04F7A1B1F8 +:10BA30005BDCA0D463D76ABD5266D7E85B5116BB06 +:10BA4000DF644994B9B59B1BFF3ACAA1A7E6EFD7BB +:10BA5000B1FBC8CA33D87DA87A76E6B4D0C883696A +:10BA6000B46717FDD7EB1EDFDA7F28920860699F65 +:10BA7000461EAD266486C5524AABD614974AA969BC +:10BA800006E2EB1CAFA3289352604BA85C5C2268D3 +:10BA900024DF6DFA4BE6BB15E49E56CF7743AAD25E +:10BAA000F9B3A94A35837EFF8174A1024D4914B4CC +:10BAB000E3D494B2A2849B509414EE251B66899221 +:10BAC000DA4A1A92D4A9988825722852293B58B389 +:10BAD000BAC2841A0BCA7985D5AB2A1F25418F12A9 +:10BAE000B2B6A62994BD5AADC9D50A026A629806B3 +:10BAF000F91DB099758BA8E86CA5754B4A4BDBAC6A +:10BB000062C2A1880DC687223EBF627F0A6A08E131 +:10BB1000A8A250B58DC6B56208159157B510E1625F +:10BB2000A3E73A694690DB3DD6228A65AE866DA1D1 +:10BB3000C9C5F29C8AFB6A22B093869ADA63C96906 +:10BB4000555BB5FCFA57AD2A5CDD554BAF99932890 +:10BB50009DDA5796FA9AD7AB69B577B5D216E36AEC +:10BB6000591C1135A1F22DE1FFE75AF7CCAFFABD10 +:10BB70007950DFB6FE843CC0180BD75B7EA0015A1B +:10BB8000E1B0ECB30F84FB488CB51FB8CBCD6F5E32 +:10BB9000817F335C00434CF57C28996FD35811DBCF +:10BBA000762F7DA36FDD37696BBA9CF466FDE19754 +:10BBB000EA6626F5D82CBA8013429152C398DBAAC4 +:10BBC0006129743F1937865FEB5C552AAB4093E5DA +:10BBD0003CD38F1B6ED54D66FF47769DC5FD801704 +:10BBE000D4D11B2882805B87B4520401132B9D7231 +:10BBF0001ADAF28BA274F7EB14140D1CE626042E4D +:10BC000031EE4CE347C5A37D3CC6FFD8D5910A3E33 +:10BC10002EED6DDB6E2DB7C8F0FFDBC3566AF6DF85 +:10BC2000D3CD2688C233D0AF67D0A2A330CF86FD54 +:10BC300036BDDEAC7739BA9AF5BA57AF3D6CB76707 +:10BC4000B0C2AC0480BA5E9B56334F769DDC85054E +:10BC50008C0E3E8761799A1AD4948ED9E14D0059A1 +:10BC600064E0D411955A65A80F4F7B372BF8FAB4CE +:10BC7000479F025193DB8D9E6BDAFDD669C0FD466E +:10BC8000438ABFF8AB33675ED407BA38F09A7E3B7D +:10BC9000FB32B9625EE9D1657FB00DAF4631D95F45 +:10BCA000269F4FD86FFA9FC7C7AFE9A5305323C46B +:10BCB000BAD50485C791FE7888A7F49A96B0A8DA19 +:10BCC000D32961536BA7666BC34782E70E2FF73208 +:10BCD00077D737B639D557DF5DC7BCE69B09B7B90B +:10BCE0007E6FB8AE37B71C1AF0C06A347B0E9C0A60 +:10BCF0003E2EAE1CBEF47D00172A3D32550372B4B1 +:10BD00005D02BD9850DE674B2074093F69AFB86B88 +:10BD1000BE8668DEAE688749CAB54A52EE40920ACE +:10BD20001C77BC24E5EA90B45536E8746FFCEB9EB2 +:10BD3000EB5005DA748CA782A2D9757A3877593C12 +:10BD40006E625C5A189B96BFAF48BCA36DE5AC1CF5 +:10BD5000CE184FD641E03AD382D0E9F0177E4EDCC0 +:10BD60007471B637E09B9E9C1B364458D16319967C +:10BD700090D844547F20978EFDC40ED7C2F2E0F7CE +:10BD8000FF7CE3AC97D14BFFF986B04614B468034F +:10BD90001C081A7CFDA1769FF523882C39D94140D7 +:10BDA000710472816D2B793075CFD39F36DF00D54A +:10BDB0006C836DFCA1B3703F6CB1F82653A27991EE +:10BDC000F813C765133CA7396F1690EF9666BAE56E +:10BDD0002B73C5222A4C8BFB1877174D8C1CE7E977 +:10BDE00047122B4D85BE08BF8D7AB8FF49083CFB32 +:10BDF0000FF523FF1F1F419AF14DEFBEF2C67A499E +:10BE0000E53D0F7B35CA11B45A80D22DF455EC5F55 +:10BE10005A18B06F39C00316B4552D63E0C054EE04 +:10BE20002D2F58EB36316CD7F811E665D05EB38F05 +:10BE30008615B032B47F903B6F197EFB07316E8C54 +:10BE4000303D637B02FF00E41BF69A1580D3BD1BD7 +:10BE50000BBEF29EC8ED5AF7E609F7166563BCC043 +:10BE60008D3EFD8C5E441B4E5AF7D61C5E7743D93F +:10BE700016C061190BF256F87F822CBFABCB9FD452 +:10BE800064E6454EFB2335EFEF5FB660B1A2B56DBA +:10BE9000ABBFF40DCBB6756A23E9338292B79167D5 +:10BEA0002C5D9AF84A77CCDCF4E5345232AE41F698 +:10BEB0003CDD383726DD6C6CAB4E87DD8B517776F9 +:10BEC000D5BD189C33A672723980957D780581DFC7 +:10BED0000C1B3532405BADC810966D02ED376EB469 +:10BEE00052D0BAF7D0462BE1F3940964345BA97BB6 +:10BEF000EC452D79D84BA067AA20F96CCD56B4A695 +:10BF00004E7796484BB5886FED6811DF7E492DE27C +:10BF1000F0D29176D4EDA86AB9D643CFDF9EC55A48 +:10BF20006505A7E7260F19CA7914F20E1CEAD6F7A1 +:10BF3000FA0AB60A157B0EEF59B03578BCB202E3A7 +:10BF40006EB65C1E98F6C186A9288F2BAA56C7210B +:10BF5000EAE8B6FB2C864BBE5354FB2B2BD5639DD6 +:10BF60009DEB31A1562026D29E9BF7F9824815D42D +:10BF70006E8722E1583B7D6BB2EB83BFAA02E18062 +:10BF8000F8BDB41C8CF56453928BF5B2497723EA63 +:10BF9000771235F30B4BED1F6F838ADCE2A6951603 +:10BFA00053EA5DD1DA342B022A7B9667D8ED36D07E +:10BFB00034D82B2A56DC3FA6FE998975508B777AA8 +:10BFC00019A54D34DBF5FEC7567E10F1E1DF58CAE6 +:10BFD0006F8888519FF0791C5DF7D6724007E3DFC8 +:10BFE0002F97046615F8EF40650B1E4CD3A1E6F2BF +:10BFF000B0A89E1EF900E82715CB4B1DA5ED3FBD4F +:10C00000F63A4E80564FAB1D16E50F4BF403D50B99 +:10C010000FEDDE1D0068C9FF49BCE7E33E00E13BD0 +:10C02000FD3D921B93892A52AE90C9EF93E6F85AD0 +:10C030007A01A09C8AC645CB380AA83FF7FBBA71A3 +:10C0400062E9FE245F14DAE752EEF727B37EB737D2 +:10C050003B197627340B7FCFB6362F1DFB03F82113 +:10C06000802042314413F06B04FE485CAB052FE6A0 +:10C070004B3AA7BEB5581CD8E76B62DD2EF5F77DAD +:10C08000D30E744287A3BA7260E976B8E6BA01D2D9 +:10C09000FC1176FB920EF4B26EC4FDFE28440A45F4 +:10C0A000537EDFAFCC86C5CFDEADF8306DBE04FA6F +:10C0B000D5BA158B8AD69E012DCEDE955B49269585 +:10C0C0003A15DB958A92D44EFAB0D6A9D6525710BB +:10C0D0002AE76DF32515BD04B9832A6CC99A2A97FE +:10C0E000C1154585B27BB9467E58BCEC9C36229280 +:10C0F0007220E9796D378F98CF267D4E45C7A462AF +:10C100009F61912BA5BC54F5FDB9C54E9543379F52 +:10C110005875F7E734CB3D10031A57F1F5422BAFB2 +:10C1200057A41202C482DEEF88FD22316FFF60FD4A +:10C13000760B65C59BA7D3D2D551B119BA28692D05 +:10C140004D40293B3EBB1943BFD3156A660FD5CF7F +:10C150005910A43655976569F2D7FEA12D3B6D9312 +:10C160006B8BC149B9623FE0970D225155A5E5207F +:10C1700092DDAED7A8D7753A92E4E171FFEC97C78C +:10C18000FF09D92F0511AD95B35F7E8E2CE75BAE0D +:10C1900097CC724CB83ABDDD129931A2BFC77E7DF3 +:10C1A000F2AD6A01CD1D96CAA3465DC78564816B59 +:10C1B000A2C21F45F2751348BEFE2591CC770A1422 +:10C1C000F4CA489EBB3FCDEEC264E5BACF3C77BD12 +:10C1D000DAB7D09F54E806D916408F8269E7041871 +:10C1E0007CE8EEE8C314C8C9DAF36BD71BC0B747C5 +:10C1F00005583C86128074B961797440FC9B268D89 +:10C20000363C2FA92F531D1DB0D88577DD9BFDC867 +:10C21000F9DF6CF98170D9ACFB357B0B99C731061E +:10C22000BA6DC36873D6C1D35D0744DF942A782BF7 +:10C2300073DCFBA51F79D9AA26D11C8FD734729E37 +:10C24000A5165CA76C41AB7DE176283EB5962650DD +:10C25000A02DC247BDD868CB1DC635CC47C3349985 +:10C260004B2D08DDAC3B5BE32DFF2B6E00124478B9 +:10C27000AEB1119E25793E21769EC2E5DC685FE76E +:10C280005EF77C106BA3A7C38B41755DB4736C66BE +:10C2900095A4844D18A2AAEBA04AAB4D9868E2720F +:10C2A0006FE94D02D8CD7E73C77893CA6D2CBD99C6 +:10C2B000CF0627B0202A27F97B74D23A9EB81658A9 +:10C2C0000F49ADA7CEA1949FA328C9176359E00ACF +:10C2D000DDE72C7EE98D66DDFEDF5F9FEF7A6B0880 +:10C2E00002A4504F659DF223AD5EA57DCB5F09533F +:10C2F000E3EECC998F1FE13A3DA872DE7072254CB7 +:10C300007B9F68AD04F27F09AD9A30BEA6C0ECFCFD +:10C31000B2DB276FB977E4AF894F2BDE8A8A7A7C4C +:10C320002EEC83FB316CFAB6384C2FA162442CCB37 +:10C330009053CF5D124A175B7F225397B030FD8F29 +:10C3400049C4154514590E0B1DF8DE7C4851A4D183 +:10C35000869109DF9920D468645109F4EB86162987 +:10C36000D58AA254539C76D56C38DD02DD4E5FFC35 +:10C37000F50DEDEEB1080E3CE770C4057AD6A37357 +:10C38000CE4AA47C995C30F02D4F0FF9A66ACAE41E +:10C3900074CA3E8E3E9A0AFDE8578C174855CD7CEC +:10C3A000DC11B200F940BE5CCA02C2F41C6000118C +:10C3B0002FF8B883D614A18D1B63E014F813ABD00B +:10C3C00076C02C243EE99DF48EB77A6659E952A5D1 +:10C3D00021EE4CEB1D8608C98EF6EA2D1B8CF5EA82 +:10C3E000B9CBA5EBBC674AE65EA15E47480941D4DC +:10C3F000A46643BD7AA3FC402FF8687DE5AE3EAF4E +:10C40000FAEE8313FE6AFF30AFCDB507839295BB7A +:10C4100022A06FCC615C12479091331D3408F8DF85 +:10C42000851BC03905595FAFCACE8E21CFB1CC571D +:10C43000C11558F3AA76BCBCF3960733A44FBA07CC +:10C44000C7C23260D50C1523EB11C8F5F6D378F4CA +:10C450008E55343EEE12CCA5459605AD91F301E81C +:10C46000C8E6548F9FA905EA0A04C3653349052B22 +:10C47000DA3C26B46B9115506269D9B6C532B20860 +:10C480006CCFB02F64D5525D47A34E2717E52EA27F +:10C4900055A49657A75B5BABA1C69BC2E37B166313 +:10C4A0004E4AD6690AD73B51D915F091DCAEA2406D +:10C4B000D56412AA94D79253E69340B24E84921C4C +:10C4C0005A4DC6C06AC9A13B22AABA8F5A31F1A8F7 +:10C4D000223F8F9A3308EA6FE837F41BFA0DFD8686 +:10C4E000DA8530DFC53C19F16BC4CA119347EC1FE4 +:10C4F0005D0CE8CA409709EEFC2CE55D4DE8D23AA8 +:10C5000086CE7D19B7F26E5135A1B0AF3397DDA954 +:10C510004F9024ED459CF62BDD5E863A57977AD1F5 +:10C5200027C1939DEFF8B9821FBFC92AD5632F2376 +:10C53000C58DB0514834CC7E41CFFC611A18E889D2 +:10C5400054247BC37D04F4FE49F88FAEF3672D0DB0 +:10C5500021BB7C09D7394894CCDD7DBBA138D4A957 +:10C56000F679B56900CBF5F3C841A348B2454BA1B4 +:10C57000B87F33BC5DB7894D4B3390207E0FCB4ADB +:10C58000EEF67BC470D70ECD49D66FDC7B933CDCD6 +:10C5900059A05553AB98FFE407E692988F543AE7B9 +:10C5A000FA84CE9551C1334115707C5A176DB1B6DE +:10C5B000EDF72BE61BACEECE4B4499A2C6EF7B9475 +:10C5C000546C593FA1A4A106882DD2803A05CC40D5 +:10C5D000286005C9048D849B497BA1E81D8365BB48 +:10C5E0001E6847EBAD3D9A25F9DE709D7BF3C9F5DA +:10C5F0007E9D5C495169C640D0EB8538C9359E5156 +:10C600000F3C35340F1A0C9F0AC3EDFE1675DAA5E0 +:10C61000B9F8CCA77513561AACED7EE78FE63CE26D +:10C620009584CBACE37F179567690A726308CDE602 +:10C63000169DF4848A9112C7D9C425BD8232DFBB0E +:10C640002868CF4428AE694271AF9E505C9D0C991A +:10C65000CE739D28BE6942F1AF9E507C9D13F52C90 +:10C660005D0527F3335AE87662DA0DA7574EFAB321 +:10C67000B3CFDD719F96D0A81E08C81D5D20E09C39 +:10C680003004D1121A35132CE556C391165600B258 +:10C69000DCBD19069474972BDB0AD673504B56A653 +:10C6A000776E2DADE0CAC8F5E975CFCF4619920F68 +:10C6B000FD18B4C480B081A35015B2199AB0B10965 +:10C6C0001B9CD0D1AB892222B79B287C0415E3B4F4 +:10C6D000CCB44E45150E2E181753263C2191AFE9C8 +:10C6E000204A8423C56EAB17D6D949A4B49326B487 +:10C6F00076494ED8AD5AD4DAF5E5AA1B7C3F2C1FFB +:10C700006CFB65E24CE8C12681290CF4FAF6BE9B6D +:10C71000E5D77BCF67D7ACDC7571BF442592D24C8F +:10C72000B102DB57B27C6DB298C88A97F38870DD8E +:10C730003611AE7F4922141403AA4E840BD7F2CDD2 +:10C7400089A13B2C972BD790C87E46C3E09D8C8453 +:10C75000B20C8B5558E931ECF141C7652EE16D996A +:10C76000FEC0A5D5CE697A04ABB24F1C363C488AD0 +:10C770000EADAC6FF96409BA367C1A44192364D43F +:10C78000BD9E5D5C0E2783D9A4D7BD989D7C1E4FAE +:10C79000A6938A45D1951714222E360B8B1051A3E0 +:10C7A000407AC52CE5E632407AAEEEF9EDE580F44C +:10C7B0002EBBE3498D2C10F9A8B3402264D5C803E1 +:10C7C00069B745D27A39761FFC5A89A085E796F574 +:10C7D000AE261E8C499399D6BA6D3FD5E9B323BED8 +:10C7E000E8A9CB58459DCE0482D47E2914AD6A2990 +:10C7F00094D4DD53662243E946D13D4787D0B28FBA +:10C80000FF196C929654BEB3EE74F04B287D14471A +:10C810007BAB7D92DAA6DECE3C37C3D17038EEB961 +:10C82000E66291DB8CE4224BAD086DD2C31181C767 +:10C8300089419FB70CABB2D15F90C5AA55F02F26A6 +:10C84000A367C9AEDFF3E4669F0CEA3BBE8C876E3C +:10C85000EC507CED7E19CC2E4F4F278369F3558227 +:10C860009FE73850C490083335EC579D36CFC1ADA3 +:10C87000BEF67D4B77BE5AF3E02E57A98B4C18ECD1 +:10C880004719E7E12C1A24FC41D5321FB405ECAB63 +:10C89000AA830FAAC35E859A0B307EDD0CC6AF7FDC +:10C8A0005D8C37D09291467E7C72ED391CBD517EF5 +:10C8B000C487EB5B6C91590BCC8AFF1855F6228A22 +:10C8C000AF0CE9A2D4C06D60542837B897A39D0E71 +:10C8D0000B127998B604E3EB8655B97CD33106E4A4 +:10C8E0002B12D794BF7D53C130D7E71E353CECAF38 +:10C8F00097CB2766B898583FF7EC67CEC6082BD978 +:10C90000103A0AD117AC0231F5B087551CFE36C774 +:10C91000613B472ABA66E3A4460BC85673DB1F9EE9 +:10C920008A65A99CE2664FBB82461DF4375BD4AC96 +:10C9300091F4A0223F5ED5F420C7F596BA9DAECC07 +:10C94000FDD50AEE7A77BA07176E5B45BA2FD88BFA +:10C9500063575046B16E422741E259D40C26D3505A +:10C960003244129030F0CB55EDAEE61A3CA86A374F +:10C970009F53F97457BFA8677090A44E2583433C1A +:10C980008D1CB387281F380D79B77A78D13484AAE3 +:10C9900015BCC3418A37AE9CDC9E08407F57DCB68D +:10C9A00025BB451238AD5EE16E9117ABD2BE66D99C +:10C9B0005B41AD58B49AE79AC4771E86792E053547 +:10C9C0008471A42F55C338DFE47A05414D86E6A76C +:10C9D000417E076C68DDBC24D55DB7D24E697E8987 +:10C9E000AF58E09957AB229E6BF54CD72BC62F4919 +:10C9F000C9E0E26A98961A5A286A30A0B6BD50413A +:10CA0000ABCDBCE436282AC92D2F54942B5314C621 +:10CA10000F4511731ECA297ED70E0E52F0BB54AAC1 +:10CA200073A8D93A2E4817BF80446FA8D6E1B16ADF +:10CA300073DA970FD511C506DAD5C6A13A4D04E9C8 +:10CA4000FC9AD139C27344E7C4A5B50EACB63374B1 +:10CA50002CD6FE696ED288F350AD0F3CEB96AA2E11 +:10CA60000F77A613A5D5F88445A95A01EB53E92EF3 +:10CA700037D1F6810BFF5B57ED372BA8C7586B47B3 +:10CA80006AC82A330D5144375D71B9ADAC0060F608 +:10CA90001C6BCDDCA3994A45C5F22777A09C16B83C +:10CAA000A8B7D360E39170C08A56E3AA81878DB995 +:10CAB000AB32B0973DEDD2509064383DABB6C0EC90 +:10CAC0002CE96ED7CD4795D2F5B08AB161B5D8388B +:10CAD0008BAAD97AB1DBA003F63EF2C09EF537658A +:10CAE000826F680E27AD410D2798C60B25AACABED6 +:10CAF000BA8219A76C85FA06A5DBCCB41A69305C3A +:10CB0000AB3EE58C94C6634C686C219B11EB8FCADD +:10CB10002B48676C3A9731795D6CF80C90E4CD8BBB +:10CB2000A438461A8098D3EF4D910EEA39A58A654C +:10CB30003A2530A69375008241AEBB2DFEBA723005 +:10CB400024FBF95E1155DC510454DDEC2CB8F4EEF5 +:10CB50006AD5F11FB5A613F9BCBE6C876C11BE2354 +:10CB600070256DC98C1B8396333B340DF704985E9A +:10CB7000E821244BCBF35C8FDCD22269E42D88F0D2 +:10CB8000EC2F403DC8E4FC1612DEBD625FE181F788 +:10CB900057B2CC202B2697EB288CB7474EDB3E9E16 +:10CBA0003B6C7B70A55DEBE236E5DF5DC7FCC6350F +:10CBB0005349ECDB7BC375BDB9C5147CDA9ADDF54E +:10CBC0001C389D1CFD9B5E93E14BDFD36EDEB48E63 +:10CBD000370A9C2F2CA37F940DC97F02E6C837AE7D +:10CBE0004E1FF2562BAE6392F2CD90F43A9BA4FC0A +:10CBF000C124553BC74B53BE0E4D5BEDE44665C9A2 +:10CC000021552FEE75BB695997B67E60922DBFED09 +:10CC10006B012A4DF0609A4E28C42E981EF7A1B6DB +:10CC2000BBF4B0623B2D537B83CE662554957F9930 +:10CC30006A1B7ED53489FD5BFE9D0EC71FD9615FDF +:10CC400058341805549D55C80ACC282E97E691D81B +:10CC500030C78FF0592AF9A09A013CE9D1A8FBF717 +:10CC6000AFDA0C102E0BAEE56680616444DC073051 +:10CC7000232726DD0ED00FF41BCBB682A78D023EF4 +:10CC80005BE5A7EF7E7ABAF1AC3939B34159CE32C0 +:10CC9000DDDD01EF615F92493C2E99662890450DDC +:10CCA0005934F175C5FEF172813B208F78DC6A370B +:10CCB000FC0F0E5F773EF7F28BBB5411EF99A53452 +:10CCC0003463B0307BA2C390A6CF4C16406B2F606C +:10CCD000C71ECE3F2886C67AB9B6D35DA35E977CC1 +:10CCE0002F487C4365C4B73909A41BA10C15EBFD83 +:10CCF0004B4C2AE6F2D86AE940B7E532DC713D17C1 +:10CD000088314387677AF9B9F769361E5C5D8EA76B +:10CD100033AE3F3BF93C9D5E5E4C669369773A4883 +:10CD2000FC709790B086A5EEFFA06C99EB47BA30E7 +:10CD30006B2703C801D1CDBA3741A7A7B98AD190D3 +:10CD4000E4865AAA1EACA4290A46856B716D32E5A9 +:10CD500038FAECBFB76B47939B0E470398D5E8AA08 +:10CD60007056B48917F12D5A5A9BD9BEDEBBACBCA4 +:10CD7000F6D2323C17C8EF3A733F313D51784F67D6 +:10CD80009539A1B2F95C9EFC7DD09BCE2E66DF6604 +:10CD90005F87FDE9A7C2694521AFC40DD9C1378AB4 +:10CDA00087E08ECE4CF760069EEE3D85E2506272C3 +:10CDB0001AC99D1B2F944CEEF4723CE802089C7536 +:10CDC00048932CD85C8BC909A234CC86D8AE0B57BB +:10CDD000ED3D08DC51DFAE70CA3E796BD8BAEF5B2F +:10CDE000B0074363EDFFFA37C2BDCB9E5DC9E47A5D +:10CDF0009F27D3CBD1603C3B03827E1E0F665F062C +:10CE0000C55BEDD4D66F698B22CA23786201CF202F +:10CE10005F4C73D328CFF223CDC29C27D0C753F4E5 +:10CE200065CFAFA3D49DE1F0E2F4B2EE14E796979C +:10CE3000E0F9405D8356E5BFDDEA42BA65FB74F276 +:10CE4000FE7A153AA42B12BFA3D59DFEE78B61EFA6 +:10CE5000B25F1BC9E939D747B45C719FEEB7416D2A +:10CE60003BDE9D99AF17EAA2A9777939EE0F2FCA59 +:10CE7000385F06A6121AABC7586D1E5DF98E1032C8 +:10CE8000C2B70A302860F63EF93F4422374F81E9A5 +:10CE9000E79CA64EA73A27BABA9C0CA7C3CB8B7ABD +:10CEA000CC6815C7510082638F2FAB669E6447BC68 +:10CEB00092BF253B75313D1D0FBB1767E7B5F13CB0 +:10CEC000F52CDDB9B50FD9926ADDB94EBE0EAF6A49 +:10CED0004FD47FB05687CC52AC4AF3E9F586E87060 +:10CEE000455E0FCE2775683FBDDE12DF371D1F84FC +:10CEF000F25A84E72BCF7378D11F5CD7999AE5CC8F +:10CF0000CDC7C434A4FC59285527313E0859E34302 +:10CF1000912555DD7AA3C1B47B3EBB3AA759C3FD29 +:10CF2000C114263FE8D7DB814BB85EECF7709283E3 +:10CF3000FABB4FE06ADFE0BDE1B857FF341B9667EC +:10CF40001C7496A5AA84FF5E87CEDF8BE5B24212E1 +:10CF5000732533BAEAF667D3CBD9C5E07A3A3BF901 +:10CF60005672D10C1DDF84AB840B6F0CC0DB4A9F63 +:10CF7000B3501CEA48331F03766D1037951592980D +:10CF80004EE50D77D53D1FEDB9D3682ADE1E5BACAB +:10CF90000C514872859BF9F345B178B075CB61B9F6 +:10CFA000B59A4C2554DE49D77BDDB1D787DFB15A1E +:10CFB000F519D6D647AE0FD547CA1846CC27FA97EB +:10CFC0009F4FCEE1FAEF5ED596A6B756FFDA7CA268 +:10CFD000EC7E38EDF6F6E5B30BDDD883C1964E68EE +:10CFE000DC1D0D66E3324134A622339A130FABDE0B +:10CFF00045E4522B8AE5838B62740C40B10925F21B +:10D00000CCF754160E7AE7DDC964783AEC75EB1E5E +:10D010002CAC94561317CA565F65D5ACA13795EE64 +:10D0200033DFB0616E29D7CA93A32F2DA3E73A0B44 +:10D03000EB76E004DED3708EC229FABDD33378FDDF +:10D0400074FC6D16D603A6496AB468A87906EF6722 +:10D05000E9C968625B769AC11D76069BDE59C68F68 +:10D06000D0349A394A9655213108D0684AED421792 +:10D070007D5AC664D8CF19A4C3178E720B0B998042 +:10D0800062440D5880CFD08435CF19AB7828CBB906 +:10D09000B380C8A77129AD3060327324B164A03069 +:10D0A000442FF253E6E3B953384C54A29AD5B91A37 +:10D0B00001B3BFD5A31DF35F9574D3C4488E7BA283 +:10D0C000FBA66D39E6D8B4F5C782718AE9EE993FBF +:10D0D0004DCFBD74068F56D037CDD5C4867FB207ED +:10D0E000522A6CA0A2BD23962C88B90CB31F2D59CF +:10D0F0000210D707CEBA2173F6285295F9039B2C5C +:10D100003A446215F27EF29F1C237B04B9F0F9B514 +:10D11000F3C3711F72E8C8153EEA07D6726DAFFD02 +:10D12000B8456E361E8BC730C24454603E0EBBA954 +:10D13000B207510BC7E89E9FE7E04E9631CBA3D6CE +:0AD14000E8BFFCF7FF0799C7565A35 +:00000001FF diff --git a/include/linux/input/synaptics_tcm.h b/include/linux/input/synaptics_tcm.h index 19ed77061545..7fd90abfc844 100644 --- a/include/linux/input/synaptics_tcm.h +++ b/include/linux/input/synaptics_tcm.h @@ -35,6 +35,9 @@ #define I2C_MODULE_NAME "synaptics_tcm_i2c" #define SPI_MODULE_NAME "synaptics_tcm_spi" +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_D2T +#define WAKEUP_GESTURE +#endif struct syna_tcm_board_data { bool x_flip; @@ -45,6 +48,9 @@ struct syna_tcm_board_data { int power_gpio; int power_on_state; int reset_gpio; +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_D2T + int mdss_reset; +#endif int reset_on_state; unsigned int spi_mode; unsigned int power_delay_ms; @@ -58,6 +64,11 @@ struct syna_tcm_board_data { unsigned long irq_flags; const char *pwr_reg_name; const char *bus_reg_name; +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_D2T + const char *i2c_reg_name; + const char *lab_reg_name; + const char *ibb_reg_name; +#endif }; #endif |