From 49b336287fc95ea4979e63b785b668602744f4d1 Mon Sep 17 00:00:00 2001 From: Weixin Zhou Date: Tue, 19 Jan 2021 19:10:43 +0800 Subject: [PATCH] dirvers: input: touchscreen: add focaltech ft5436 Signed-off-by: Weixin Zhou Change-Id: I51437c0b5c81698d2b7e451d2843a55d23c3eb28 --- drivers/input/touchscreen/Kconfig | 8 + drivers/input/touchscreen/Makefile | 1 + .../focaltech_touch_ft5436/Makefile | 16 + .../focaltech_touch_ft5436/focaltech_common.h | 166 + .../focaltech_touch_ft5436/focaltech_config.h | 241 ++ .../focaltech_touch_ft5436/focaltech_core.c | 1745 +++++++++ .../focaltech_touch_ft5436/focaltech_core.h | 263 ++ .../focaltech_esdcheck.c | 464 +++ .../focaltech_touch_ft5436/focaltech_ex_fun.c | 1181 ++++++ .../focaltech_ex_mode.c | 307 ++ .../focaltech_touch_ft5436/focaltech_flash.c | 2011 ++++++++++ .../focaltech_touch_ft5436/focaltech_flash.h | 205 ++ .../focaltech_flash/Makefile | 7 + .../focaltech_upgrade_ft5436.c | 154 + .../focaltech_gesture.c | 460 +++ .../focaltech_touch_ft5436/focaltech_i2c.c | 193 + .../focaltech_point_report_check.c | 135 + .../include/firmware/fw_sample.h | 3223 +++++++++++++++++ 18 files changed, 10780 insertions(+) create mode 100644 drivers/input/touchscreen/focaltech_touch_ft5436/Makefile create mode 100644 drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_common.h create mode 100644 drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_config.h create mode 100644 drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_core.c create mode 100644 drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_core.h create mode 100644 drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_esdcheck.c create mode 100644 drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_ex_fun.c create mode 100644 drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_ex_mode.c create mode 100644 drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_flash.c create mode 100644 drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_flash.h create mode 100644 drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_flash/Makefile create mode 100644 drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_flash/focaltech_upgrade_ft5436.c create mode 100644 drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_gesture.c create mode 100644 drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_i2c.c create mode 100644 drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_point_report_check.c create mode 100644 drivers/input/touchscreen/focaltech_touch_ft5436/include/firmware/fw_sample.h diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index b74e4a897f07..ed7e7602924e 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -1401,6 +1401,14 @@ config TOUCHSCREEN_FTS Say Y here if you have Focaltech touch panel. If unsure, say N. +config TOUCHSCREEN_FT5436 + bool "Focaltech Touchscreen FT5436" + depends on I2C + default n + help + Say Y here if you have Focaltech touch panel. + If unsure, say N. + source "drivers/input/touchscreen/cyttsp5/Kconfig" endif diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index 9630077b8287..effe2cf060ad 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -126,4 +126,5 @@ obj-$(CONFIG_TOUCHSCREEN_VTL_CT36X) += vtl_ts/ obj-$(CONFIG_TOUCHSCREEN_GT1X) += gt1x/ obj-$(CONFIG_TOUCHSCREEN_HYN_CST2XX) += hyn_cst2xx/ obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_touch/ +obj-$(CONFIG_TOUCHSCREEN_FT5436) += focaltech_touch_ft5436/ obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5) += cyttsp5/ diff --git a/drivers/input/touchscreen/focaltech_touch_ft5436/Makefile b/drivers/input/touchscreen/focaltech_touch_ft5436/Makefile new file mode 100644 index 000000000000..df8d3e5ef10a --- /dev/null +++ b/drivers/input/touchscreen/focaltech_touch_ft5436/Makefile @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Makefile for the focaltech touchscreen drivers. +# + +# Makefile for the focaltech touchscreen drivers. + +obj-y += focaltech_core.o +obj-y += focaltech_ex_fun.o +obj-y += focaltech_ex_mode.o +obj-y += focaltech_gesture.o +obj-y += focaltech_esdcheck.o +obj-y += focaltech_point_report_check.o +obj-y += focaltech_i2c.o +obj-y += focaltech_flash.o +obj-y += focaltech_flash/ diff --git a/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_common.h b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_common.h new file mode 100644 index 000000000000..1d7ac55572fe --- /dev/null +++ b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_common.h @@ -0,0 +1,166 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2012-2019, Focaltech Ltd. All rights reserved. + * + * 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 V3.1 20190807" + +#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)) & (0xFFFFFFFF << (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 {{0x02, 0x54, 0x22, 0x54, 0x22, 0x00, 0x00, 0x54, 0x2C}} + +#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 12 +#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_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 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_FACTORY_MODE_DETACH_FLAG 0xB4 +#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(fmt, args...) do { \ + printk("[FTS_TS]%s:"fmt"\n", __func__, ##args); \ +} while (0) + +#define FTS_FUNC_ENTER() do { \ + printk("[FTS_TS]%s: Enter\n", __func__); \ +} while (0) + +#define FTS_FUNC_EXIT() do { \ + printk("[FTS_TS]%s: Exit(%d)\n", __func__, __LINE__); \ +} while (0) +#else /* #if FTS_DEBUG_EN*/ +#define FTS_DEBUG(fmt, args...) +#define FTS_FUNC_ENTER() +#define FTS_FUNC_EXIT() +#endif + +#define FTS_INFO(fmt, args...) do { \ + printk(KERN_INFO "[FTS_TS/I]%s:"fmt"\n", __func__, ##args); \ +} while (0) + +#define FTS_ERROR(fmt, args...) do { \ + printk(KERN_ERR "[FTS_TS/E]%s:"fmt"\n", __func__, ##args); \ +} while (0) +#endif /* __LINUX_FOCALTECH_COMMON_H__ */ diff --git a/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_config.h b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_config.h new file mode 100644 index 000000000000..d30ca81df9a9 --- /dev/null +++ b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_config.h @@ -0,0 +1,241 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2012-2019, FocalTech Systems, Ltd., all rights reserved. + * + * 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 _FT8607 0x86070809 +#define _FT8006U 0x8006D80B +#define _FT8006S 0x8006A80B +#define _FT8613 0x8613080C +#define _FT8719 0x8719080D +#define _FT8739 0x8739080E +#define _FT8615 0x8615080F +#define _FT8201 0x82010810 +#define _FT8006P 0x86220811 +#define _FT7251 0x72510812 +#define _FT7252 0x72520813 +#define _FT8613S 0x8613C814 +#define _FT8756 0x87560815 +#define _FT8302 0x83020816 +#define _FT8009 0x80090817 +#define _FT8656 0x86560818 +#define _FT8006S_AA 0x86320819 +#define _FT7250 0x7250081A + + +#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 _FT3327DQQ_XXX 0x3327D482 +#define _FT5446DQS_XXX 0x5446D482 + +#define _FT3518 0x35180481 +#define _FT3558 0x35580481 +#define _FT3528 0x35280481 +#define _FT5536 0x55360481 + +#define _FT5446U 0x5446D083 +#define _FT5456U 0x5456D083 +#define _FT3417U 0x3417D083 +#define _FT5426U 0x5426D083 +#define _FT3428 0x34280083 +#define _FT3437U 0x3437D083 + +#define _FT7302 0x73020084 +#define _FT7202 0x72020084 +#define _FT3308 0x33080084 + +#define _FT6346U 0x6346D085 +#define _FT6346G 0x6346A085 +#define _FT3067 0x30670085 +#define _FT3068 0x30680085 +#define _FT3168 0x31680085 +#define _FT3268 0x32680085 + +/*************************************************/ + +/* + * choose your ic chip type of focaltech + */ +#define FTS_CHIP_TYPE _FT5436 + +/******************* Enables *********************/ +/*********** 1 to enable, 0 to disable ***********/ + +/* + * show debug log info + * enable it for debug, disable it for release + */ +#define FTS_DEBUG_EN 0 + +/* + * Linux MultiTouch Protocol + * 1: Protocol B(default), 0: Protocol A + */ +#define FTS_MT_PROTOCOL_B_EN 0 + +/* + * Report Pressure in multitouch + * 1:enable(default),0:disable +*/ +#define FTS_REPORT_PRESSURE_EN 1 + +/* + * Gesture function enable + * default: disable + */ +#define FTS_GESTURE_EN 0 + +/* + * ESD check & protection + * default: disable + */ +#define FTS_ESDCHECK_EN 0 + + +/* + * Pinctrl enable + * default: disable + */ +#define FTS_PINCTRL_EN 0 + +/* + * Customer power enable + * enable it when customer need control TP power + * default: disable + */ +#define FTS_POWER_SOURCE_CUST_EN 1 + +/****************************************************/ + +/********************** Upgrade ****************************/ +/* + * auto upgrade + */ +#define FTS_AUTO_UPGRADE_EN 1 + +/* + * auto upgrade for lcd cfg + */ +#define FTS_AUTO_LIC_UPGRADE_EN 0 + +/* + * Numbers of modules support + */ +#define FTS_GET_MODULE_NUM 0 + +/* + * module_id: mean vendor_id generally, also maybe gpio or lcm_id... + * If means vendor_id, the FTS_MODULE_ID = PANEL_ID << 8 + VENDOR_ID + * FTS_GET_MODULE_NUM == 0/1, no check module id, you may ignore them + * FTS_GET_MODULE_NUM >= 2, compatible with FTS_MODULE2_ID + * FTS_GET_MODULE_NUM >= 3, compatible with FTS_MODULE3_ID + */ +#define FTS_MODULE_ID 0x0000 +#define FTS_MODULE2_ID 0x0000 +#define FTS_MODULE3_ID 0x0000 + +/* + * Need set the following when get firmware via firmware_request() + * For example: if module'vendor is tianma, + * #define FTS_MODULE_NAME "tianma" + * then file_name will be "focaltech_ts_fw_tianma" + * You should rename fw to "focaltech_ts_fw_tianma", and push it into + * etc/firmware or by customers + */ +#define FTS_MODULE_NAME "" +#define FTS_MODULE2_NAME "" +#define FTS_MODULE3_NAME "" + +/* + * 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_MODULE_NUM > 1, it's the fw corresponding with FTS_VENDOR_ID + */ +#define FTS_UPGRADE_FW_FILE "include/firmware/fw_sample.h" + +/* + * if FTS_GET_MODULE_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.h" + +/* + * if FTS_GET_MODULE_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.h" + +/*********************************************************/ + +#endif /* _LINUX_FOCLATECH_CONFIG_H_ */ diff --git a/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_core.c b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_core.c new file mode 100644 index 000000000000..d3ea520257e5 --- /dev/null +++ b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_core.c @@ -0,0 +1,1745 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2012-2019, FocalTech Systems, Ltd., all rights reserved. + * + * 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 +#include +#include +#include +#include +#include +#if defined(CONFIG_FB) +#include +#include +#elif defined(CONFIG_HAS_EARLYSUSPEND) +#include +#define FTS_SUSPEND_LEVEL 1 /* Early-suspend level */ +#endif +#include "focaltech_core.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FTS_DRIVER_NAME "fts_ts" +#define INTERVAL_READ_REG 200 /* unit:ms */ +#define TIMEOUT_READ_REG 1000 /* unit:ms */ +#if FTS_POWER_SOURCE_CUST_EN +#define FTS_VTG_MIN_UV 2800000 +#define FTS_VTG_MAX_UV 3300000 +#define FTS_I2C_VTG_MIN_UV 1800000 +#define FTS_I2C_VTG_MAX_UV 1800000 +#endif + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +struct fts_ts_data *fts_data; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static int fts_ts_suspend(struct device *dev); +static int fts_ts_resume(struct device *dev); + +/***************************************************************************** +* 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(void) +{ + int ret = 0; + int cnt = 0; + u8 idh = 0; + u8 idl = 0; + u8 chip_idh = fts_data->ic_info.ids.chip_idh; + u8 chip_idl = fts_data->ic_info.ids.chip_idl; + + do { + ret = fts_read_reg(FTS_REG_CHIP_ID, &idh); + ret = fts_read_reg(FTS_REG_CHIP_ID2, &idl); + if ((ret < 0) || (idh != chip_idh) || (idl != chip_idl)) { + FTS_DEBUG("TP Not Ready,ReadData:0x%02x%02x", idh, idl); + } else if ((idh == chip_idh) && (idl == chip_idl)) { + FTS_INFO("TP Ready,Device ID:0x%02x%02x", idh, idl); + return 0; + } + cnt++; + msleep(INTERVAL_READ_REG); + } while ((cnt * INTERVAL_READ_REG) < TIMEOUT_READ_REG); + + return -EIO; +} + +/***************************************************************************** +* Name: fts_tp_state_recovery +* Brief: Need execute this function when reset +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_tp_state_recovery(struct fts_ts_data *ts_data) +{ + FTS_FUNC_ENTER(); + /* wait tp stable */ + fts_wait_tp_to_valid(); + /* recover TP charger state 0x8B */ + /* recover TP glove state 0xC0 */ + /* recover TP cover state 0xC1 */ + fts_ex_mode_recovery(ts_data); + /* recover TP gesture state 0xD0 */ + fts_gesture_recovery(ts_data); + FTS_FUNC_EXIT(); +} + +int fts_reset_proc(int hdelayms) +{ + FTS_DEBUG("tp reset"); + gpio_direction_output(fts_data->pdata->reset_gpio, 0); + msleep(1); + gpio_direction_output(fts_data->pdata->reset_gpio, 1); + if (hdelayms) { + msleep(hdelayms); + } + + return 0; +} + +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(); +} + +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(); +} + +void fts_hid2std(void) +{ + int ret = 0; + u8 buf[3] = {0xEB, 0xAA, 0x09}; + + ret = fts_write(buf, 3); + if (ret < 0) { + FTS_ERROR("hid2std cmd write fail"); + } else { + msleep(10); + buf[0] = buf[1] = buf[2] = 0; + ret = fts_read(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_DEBUG("hidi2c change to stdi2c not support or fail"); + } + } +} + +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; +} + +static int fts_read_bootid(struct fts_ts_data *ts_data, u8 *id) +{ + int ret = 0; + u8 chip_id[2] = { 0 }; + u8 id_cmd[4] = { 0 }; + u32 id_cmd_len = 0; + + id_cmd[0] = FTS_CMD_START1; + id_cmd[1] = FTS_CMD_START2; + ret = fts_write(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_read(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,read:0x%02x%02x", chip_id[0], chip_id[1]); + return -EIO; + } + + id[0] = chip_id[0]; + id[1] = chip_id[1]; + return 0; +} + +/***************************************************************************** +* Name: fts_get_ic_information +* Brief: read chip id to get ic information, after run the function, driver w- +* ill know which IC is it. +* If cant get the ic information, maybe not focaltech's touch IC, need +* unregister the driver +* Input: +* Output: +* Return: return 0 if get correct ic information, 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 }; + + ts_data->ic_info.is_incell = FTS_CHIP_IDC; + ts_data->ic_info.hid_supported = FTS_HID_SUPPORTTED; + + + do { + ret = fts_read_reg(FTS_REG_CHIP_ID, &chip_id[0]); + ret = fts_read_reg(FTS_REG_CHIP_ID2, &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_hid2std(); + } + + ret = fts_read_bootid(ts_data, &chip_id[0]); + if (ret < 0) { + FTS_ERROR("read boot id fail"); + return ret; + } + + 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; + } + } + + 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; +} + +/***************************************************************************** +* Reprot related +*****************************************************************************/ +static void fts_show_touch_buffer(u8 *data, int datalen) +{ + int i = 0; + int count = 0; + char *tmpbuf = NULL; + + tmpbuf = kzalloc(1024, GFP_KERNEL); + if (!tmpbuf) { + FTS_ERROR("tmpbuf zalloc fail"); + return; + } + + for (i = 0; i < datalen; i++) { + count += snprintf(tmpbuf + count, 1024 - count, "%02X,", data[i]); + if (count >= 1024) + break; + } + FTS_DEBUG("point buffer:%s", tmpbuf); + + if (tmpbuf) { + kfree(tmpbuf); + tmpbuf = NULL; + } +} + +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; + u32 max_touches = fts_data->pdata->max_touch_number; +#endif + + FTS_FUNC_ENTER(); + mutex_lock(&fts_data->report_mutex); +#if FTS_MT_PROTOCOL_B_EN + for (finger_count = 0; finger_count < max_touches; 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); + + fts_data->touchs = 0; + fts_data->key_state = 0; + mutex_unlock(&fts_data->report_mutex); + FTS_FUNC_EXIT(); +} + +/***************************************************************************** +* Name: fts_input_report_key +* Brief: process key events,need report key-event if key enable. +* if point's coordinate is in (x_dim-50,y_dim-50) ~ (x_dim+50,y_dim+50), +* need report it to key event. +* x_dim: parse from dts, means key x_coordinate, dimension:+-50 +* y_dim: parse from dts, means key y_coordinate, dimension:+-50 +* Input: +* Output: +* Return: return 0 if it's key event, otherwise return error code +*****************************************************************************/ +static int fts_input_report_key(struct fts_ts_data *data, int index) +{ + int i = 0; + int x = data->events[index].x; + int y = data->events[index].y; + int *x_dim = &data->pdata->key_x_coords[0]; + int *y_dim = &data->pdata->key_y_coords[0]; + + if (!data->pdata->have_key) { + return -EINVAL; + } + for (i = 0; i < data->pdata->key_number; i++) { + if ((x >= x_dim[i] - FTS_KEY_DIM) && (x <= x_dim[i] + FTS_KEY_DIM) && + (y >= y_dim[i] - FTS_KEY_DIM) && (y <= y_dim[i] + FTS_KEY_DIM)) { + if (EVENT_DOWN(data->events[index].flag) + && !(data->key_state & (1 << i))) { + input_report_key(data->input_dev, data->pdata->keys[i], 1); + data->key_state |= (1 << i); + FTS_DEBUG("Key%d(%d,%d) DOWN!", i, x, y); + } else if (EVENT_UP(data->events[index].flag) + && (data->key_state & (1 << i))) { + input_report_key(data->input_dev, data->pdata->keys[i], 0); + data->key_state &= ~(1 << i); + FTS_DEBUG("Key%d(%d,%d) Up!", i, x, y); + } + return 0; + } + } + 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; + struct ts_event *events = data->events; + + for (i = 0; i < data->touch_point; i++) { + if (fts_input_report_key(data, i) == 0) { + continue; + } + + 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); + + if ((data->log_level >= 2) || + ((1 == data->log_level) && (FTS_TOUCH_DOWN == events[i].flag))) { + 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); + if (data->log_level >= 1) { + 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)) { + if (data->log_level >= 1) { + 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)) { + if (data->log_level >= 1) { + 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; + struct ts_event *events = data->events; + + for (i = 0; i < data->touch_point; i++) { + if (fts_input_report_key(data, i) == 0) { + 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].y); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, 758-events[i].x); + + input_mt_sync(data->input_dev); + + if ((data->log_level >= 2) || + ((1 == data->log_level) && (FTS_TOUCH_DOWN == events[i].flag))) { + FTS_DEBUG("[A]P%d(%d, %d)[p:%d,tm:%d] DOWN!", + events[i].id, + events[i].y, 758-events[i].x, + 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)) { + if (data->log_level >= 1) { + 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 + +static int fts_read_touchdata(struct fts_ts_data *data) +{ + int ret = 0; + u8 *buf = data->point_buf; + + memset(buf, 0xFF, data->pnt_buf_size); + buf[0] = 0x01; + + + if (data->gesture_mode) { + if (0 == fts_gesture_readdata(data, NULL)) { + FTS_INFO("succuss to get gesture data in irq handler"); + return 1; + } + } + + ret = fts_read(buf, 1, buf + 1, data->pnt_buf_size - 1); + if (ret < 0) { + FTS_ERROR("read touchdata failed, ret:%d", ret); + return ret; + } + + if (data->log_level >= 3) { + fts_show_touch_buffer(buf, data->pnt_buf_size); + } + + return 0; +} + +static int fts_read_parse_touchdata(struct fts_ts_data *data) +{ + int ret = 0; + int i = 0; + u8 pointid = 0; + int base = 0; + struct ts_event *events = data->events; + int max_touch_num = data->pdata->max_touch_number; + u8 *buf = data->point_buf; + + ret = fts_read_touchdata(data); + if (ret) { + return ret; + } + + data->point_num = buf[FTS_TOUCH_POINT_NUM] & 0x0F; + data->touch_point = 0; + + if (data->ic_info.is_incell) { + if ((data->point_num == 0x0F) && (buf[2] == 0xFF) && (buf[3] == 0xFF) + && (buf[4] == 0xFF) && (buf[5] == 0xFF) && (buf[6] == 0xFF)) { + FTS_DEBUG("touch buff is 0xff, need recovery state"); + fts_release_all_finger(); + fts_tp_state_recovery(data); + return -EIO; + } + } + + if (data->point_num > max_touch_num) { + FTS_INFO("invalid point_num(%d)", data->point_num); + return -EIO; + } + + 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; +} + +static void fts_irq_read_report(void) +{ + int ret = 0; + struct fts_ts_data *ts_data = fts_data; + +#if FTS_ESDCHECK_EN + fts_esdcheck_set_intr(1); +#endif + +#if FTS_POINT_REPORT_CHECK_EN + fts_prc_queue_work(ts_data); +#endif + + ret = fts_read_parse_touchdata(ts_data); + if (ret == 0) { + mutex_lock(&ts_data->report_mutex); +#if FTS_MT_PROTOCOL_B_EN + fts_input_report_b(ts_data); +#else + fts_input_report_a(ts_data); +#endif + mutex_unlock(&ts_data->report_mutex); + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_set_intr(0); +#endif +} + +static irqreturn_t fts_irq_handler(int irq, void *data) +{ + 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 (device_can_wakeup(&ts_data->client->dev)) + pm_stay_awake(&ts_data->client->dev); + fts_irq_read_report(); + if (device_can_wakeup(&ts_data->client->dev)) + pm_relax(&ts_data->client->dev); + + return IRQ_HANDLED; +} + +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); + pdata->irq_gpio_flags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT; + FTS_INFO("irq:%d, flag:%x", ts_data->irq, pdata->irq_gpio_flags); + ret = request_threaded_irq(ts_data->irq, NULL, fts_irq_handler, + pdata->irq_gpio_flags, + FTS_DRIVER_NAME, ts_data); + + return ret; +} + +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; + + 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->dev; + + 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, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->y_min, pdata->y_max, 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 + + ret = input_register_device(input_dev); + if (ret) { + FTS_ERROR("Input device registration failed"); + input_set_drvdata(input_dev, NULL); + input_free_device(input_dev); + input_dev = NULL; + return ret; + } + + ts_data->input_dev = input_dev; + + FTS_FUNC_EXIT(); + return 0; +} + +static int fts_report_buffer_init(struct fts_ts_data *ts_data) +{ + int point_num = 0; + int events_num = 0; + + + point_num = ts_data->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 + 1, GFP_KERNEL); + if (!ts_data->point_buf) { + FTS_ERROR("failed to alloc memory for point buf"); + return -ENOMEM; + } + + events_num = point_num * sizeof(struct ts_event); + ts_data->events = (struct ts_event *)kzalloc(events_num, GFP_KERNEL); + if (!ts_data->events) { + FTS_ERROR("failed to alloc memory for point events"); + kfree_safe(ts_data->point_buf); + return -ENOMEM; + } + + return 0; +} + +#if FTS_POWER_SOURCE_CUST_EN +/***************************************************************************** +* Power Control +*****************************************************************************/ +#if FTS_PINCTRL_EN +static int fts_pinctrl_init(struct fts_ts_data *ts) +{ + int ret = 0; + + ts->pinctrl = devm_pinctrl_get(ts->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 */ + +static int fts_power_source_ctrl(struct fts_ts_data *ts_data, int enable) +{ + int ret = 0; + + if (IS_ERR_OR_NULL(ts_data->vdd)) { + FTS_ERROR("vdd is invalid"); + return -EINVAL; + } + + FTS_FUNC_ENTER(); + if (enable) { + if (ts_data->power_disabled) { + FTS_DEBUG("regulator enable !"); + gpio_direction_output(ts_data->pdata->reset_gpio, 0); + msleep(1); + ret = regulator_enable(ts_data->vdd); + if (ret) { + FTS_ERROR("enable vdd regulator failed,ret=%d", ret); + } + + if (!IS_ERR_OR_NULL(ts_data->vcc_i2c)) { + ret = regulator_enable(ts_data->vcc_i2c); + if (ret) { + FTS_ERROR("enable vcc_i2c regulator failed,ret=%d", ret); + } + } + ts_data->power_disabled = false; + } + } else { + if (!ts_data->power_disabled) { + FTS_DEBUG("regulator disable !"); + gpio_direction_output(ts_data->pdata->reset_gpio, 0); + msleep(1); + ret = regulator_disable(ts_data->vdd); + if (ret) { + FTS_ERROR("disable vdd regulator failed,ret=%d", ret); + } + if (!IS_ERR_OR_NULL(ts_data->vcc_i2c)) { + ret = regulator_disable(ts_data->vcc_i2c); + if (ret) { + FTS_ERROR("disable vcc_i2c regulator failed,ret=%d", ret); + } + } + ts_data->power_disabled = true; + } + } + + FTS_FUNC_EXIT(); + return ret; +} + +/***************************************************************************** +* Name: fts_power_source_init +* Brief: Init regulator power:vdd/vcc_io(if have), generally, no vcc_io +* vdd---->vdd-supply in dts, kernel will auto add "-supply" to parse +* Must be call after fts_gpio_configure() execute,because this function +* will operate reset-gpio which request gpio in fts_gpio_configure() +* Input: +* Output: +* Return: return 0 if init power successfully, otherwise return error code +*****************************************************************************/ +static int fts_power_source_init(struct fts_ts_data *ts_data) +{ + int ret = 0; + + FTS_FUNC_ENTER(); + ts_data->vdd = regulator_get(ts_data->dev, "vdd"); + if (IS_ERR_OR_NULL(ts_data->vdd)) { + ret = PTR_ERR(ts_data->vdd); + FTS_ERROR("get vdd regulator failed,ret=%d", ret); + return ret; + } + + if (regulator_count_voltages(ts_data->vdd) > 0) { + ret = regulator_set_voltage(ts_data->vdd, FTS_VTG_MIN_UV, + FTS_VTG_MAX_UV); + if (ret) { + FTS_ERROR("vdd regulator set_vtg failed ret=%d", ret); + regulator_put(ts_data->vdd); + return ret; + } + } + + ts_data->vcc_i2c = regulator_get(ts_data->dev, "vcc_i2c"); + if (!IS_ERR_OR_NULL(ts_data->vcc_i2c)) { + if (regulator_count_voltages(ts_data->vcc_i2c) > 0) { + ret = regulator_set_voltage(ts_data->vcc_i2c, + FTS_I2C_VTG_MIN_UV, + FTS_I2C_VTG_MAX_UV); + if (ret) { + FTS_ERROR("vcc_i2c regulator set_vtg failed,ret=%d", ret); + regulator_put(ts_data->vcc_i2c); + } + } + } + +#if FTS_PINCTRL_EN + fts_pinctrl_init(ts_data); + fts_pinctrl_select_normal(ts_data); +#endif + + ts_data->power_disabled = true; + ret = fts_power_source_ctrl(ts_data, ENABLE); + if (ret) { + FTS_ERROR("fail to enable power(regulator)"); + } + + FTS_FUNC_EXIT(); + return ret; +} + +static int fts_power_source_exit(struct fts_ts_data *ts_data) +{ +#if FTS_PINCTRL_EN + fts_pinctrl_select_release(ts_data); +#endif + + fts_power_source_ctrl(ts_data, DISABLE); + + if (!IS_ERR_OR_NULL(ts_data->vdd)) { + if (regulator_count_voltages(ts_data->vdd) > 0) + regulator_set_voltage(ts_data->vdd, 0, FTS_VTG_MAX_UV); + regulator_put(ts_data->vdd); + } + + if (!IS_ERR_OR_NULL(ts_data->vcc_i2c)) { + if (regulator_count_voltages(ts_data->vcc_i2c) > 0) + regulator_set_voltage(ts_data->vcc_i2c, 0, FTS_I2C_VTG_MAX_UV); + regulator_put(ts_data->vcc_i2c); + } + + return 0; +} + +static int fts_power_source_suspend(struct fts_ts_data *ts_data) +{ + int ret = 0; + +#if FTS_PINCTRL_EN + fts_pinctrl_select_suspend(ts_data); +#endif + + ret = fts_power_source_ctrl(ts_data, DISABLE); + if (ret < 0) { + FTS_ERROR("power off fail, ret=%d", ret); + } + + return ret; +} + +static int fts_power_source_resume(struct fts_ts_data *ts_data) +{ + int ret = 0; + +#if FTS_PINCTRL_EN + fts_pinctrl_select_normal(ts_data); +#endif + + ret = fts_power_source_ctrl(ts_data, ENABLE); + if (ret < 0) { + FTS_ERROR("power on fail, ret=%d", ret); + } + + return ret; +} +#endif /* FTS_POWER_SOURCE_CUST_EN */ + +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, 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; +} + +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 < 0) { + FTS_ERROR("Unable to read %s, please check dts", name); + pdata->x_min = FTS_X_MIN_DISPLAY_DEFAULT; + pdata->y_min = FTS_Y_MIN_DISPLAY_DEFAULT; + pdata->x_max = FTS_X_MAX_DISPLAY_DEFAULT; + pdata->y_max = FTS_Y_MAX_DISPLAY_DEFAULT; + return -ENODATA; + } else { + pdata->x_min = coords[0]; + pdata->y_min = coords[1]; + pdata->x_max = coords[2]; + pdata->y_max = coords[3]; + } + + FTS_INFO("display x(%d %d) y(%d %d)", pdata->x_min, pdata->x_max, + pdata->y_min, pdata->y_max); + return 0; +} + +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 = 0; + + 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 < 0) + FTS_ERROR("Key number undefined!"); + + ret = of_property_read_u32_array(np, "focaltech,keys", + pdata->keys, pdata->key_number); + if (ret < 0) + FTS_ERROR("Keys undefined!"); + else if (pdata->key_number > FTS_MAX_KEYS) + pdata->key_number = FTS_MAX_KEYS; + + ret = of_property_read_u32_array(np, "focaltech,key-x-coords", + pdata->key_x_coords, + pdata->key_number); + if (ret < 0) + FTS_ERROR("Key Y Coords undefined!"); + + ret = of_property_read_u32_array(np, "focaltech,key-y-coords", + pdata->key_y_coords, + pdata->key_number); + if (ret < 0) + FTS_ERROR("Key X Coords undefined!"); + + FTS_INFO("VK Number:%d, key:(%d,%d,%d), " + "coords:(%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_y_coords[0], + pdata->key_x_coords[1], pdata->key_y_coords[1], + pdata->key_x_coords[2], pdata->key_y_coords[2]); + } + + /* 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"); + + pdata->pwr_gpio = of_get_named_gpio_flags(np, "focaltech,power-gpio", + 0, &pdata->irq_gpio_flags); + if (pdata->pwr_gpio < 0) + FTS_ERROR("Unable to get pwr_gpio"); + + gpio_direction_output(pdata->pwr_gpio, 1); + + ret = of_property_read_u32(np, "focaltech,max-touch-number", &temp_val); + if (ret < 0) { + FTS_ERROR("Unable to get max-touch-number, please check dts"); + pdata->max_touch_number = FTS_MAX_POINTS_SUPPORT; + } else { + if (temp_val < 2) + pdata->max_touch_number = 2; /* max_touch_number must >= 2 */ + else if (temp_val > FTS_MAX_POINTS_SUPPORT) + pdata->max_touch_number = FTS_MAX_POINTS_SUPPORT; + else + pdata->max_touch_number = temp_val; + } + + 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; +} + +#if defined(CONFIG_FB) +static void fts_resume_work(struct work_struct *work) +{ + struct fts_ts_data *ts_data = container_of(work, struct fts_ts_data, + resume_work); + + fts_ts_resume(ts_data->dev); +} + +static int fts_ts_early_suspend(struct tp_device *tp_d) +{ + struct fts_ts_data *ts_data; + + ts_data = container_of(tp_d, struct fts_ts_data, tp); + + cancel_work_sync(&ts_data->resume_work); + fts_ts_suspend(&ts_data->client->dev); + + return 0; +} + +static int fts_ts_late_resume(struct tp_device *tp_d) +{ + struct fts_ts_data *ts_data; + + ts_data = container_of(tp_d, struct fts_ts_data, tp); + + queue_work(ts_data->ts_workqueue, &ts_data->resume_work); + + return 0; +} + +#if 0 +static int fb_notifier_callback(struct notifier_block *self, + unsigned long event, void *data) +{ + struct fb_event *evdata = data; + int *blank = NULL; + struct fts_ts_data *ts_data = container_of(self, struct fts_ts_data, + fb_notif); + + if (!(event == FB_EARLY_EVENT_BLANK || event == FB_EVENT_BLANK)) { + FTS_INFO("event(%lu) do not need process\n", event); + return 0; + } + + blank = evdata->data; + FTS_INFO("FB event:%lu,blank:%d", event, *blank); + switch (*blank) { + case FB_BLANK_UNBLANK: + if (FB_EARLY_EVENT_BLANK == event) { + FTS_INFO("resume: event = %lu, not care\n", event); + } else if (FB_EVENT_BLANK == event) { + queue_work(fts_data->ts_workqueue, &fts_data->resume_work); + } + break; + case FB_BLANK_POWERDOWN: + if (FB_EARLY_EVENT_BLANK == event) { + cancel_work_sync(&fts_data->resume_work); + fts_ts_suspend(ts_data->dev); + } else if (FB_EVENT_BLANK == event) { + FTS_INFO("suspend: event = %lu, not care\n", event); + } + break; + default: + FTS_INFO("FB BLANK(%d) do not need process\n", *blank); + break; + } + + return 0; +} +#endif + +#elif defined(CONFIG_HAS_EARLYSUSPEND) +static void fts_ts_early_suspend(struct early_suspend *handler) +{ + struct fts_ts_data *ts_data = container_of(handler, struct fts_ts_data, + early_suspend); + + fts_ts_suspend(ts_data->dev); +} + +static void fts_ts_late_resume(struct early_suspend *handler) +{ + struct fts_ts_data *ts_data = container_of(handler, struct fts_ts_data, + early_suspend); + + fts_ts_resume(ts_data->dev); +} +#endif + +static int fts_ts_probe_entry(struct fts_ts_data *ts_data) +{ + int ret = 0; + int pdata_size = sizeof(struct fts_ts_platform_data); + struct device_node *np = ts_data->dev->of_node; + + FTS_FUNC_ENTER(); + FTS_INFO("%s", FTS_DRIVER_VERSION); + ts_data->pdata = kzalloc(pdata_size, GFP_KERNEL); + if (!ts_data->pdata) { + FTS_ERROR("allocate memory for platform_data fail"); + return -ENOMEM; + } + + if (ts_data->dev->of_node) { + ret = fts_parse_dt(ts_data->dev, ts_data->pdata); + if (ret) + FTS_ERROR("device-tree parse fail"); + } else { + if (ts_data->dev->platform_data) { + memcpy(ts_data->pdata, ts_data->dev->platform_data, pdata_size); + } else { + FTS_ERROR("platform_data is null"); + return -ENODEV; + } + } + + ts_data->ts_workqueue = create_singlethread_workqueue("fts_wq"); + if (!ts_data->ts_workqueue) { + FTS_ERROR("create fts workqueue fail"); + } + + spin_lock_init(&ts_data->irq_lock); + mutex_init(&ts_data->report_mutex); + mutex_init(&ts_data->bus_lock); + + /* Init communication interface */ + ret = fts_bus_init(ts_data); + if (ret) { + FTS_ERROR("bus initialize fail"); + goto err_bus_init; + } + + ret = fts_input_init(ts_data); + if (ret) { + FTS_ERROR("input initialize fail"); + goto err_input_init; + } + + ret = fts_report_buffer_init(ts_data); + if (ret) { + FTS_ERROR("report buffer init fail"); + goto err_report_buffer; + } + + ret = fts_gpio_configure(ts_data); + if (ret) { + FTS_ERROR("configure the gpios fail"); + goto err_gpio_config; + } + +#if FTS_POWER_SOURCE_CUST_EN + ret = fts_power_source_init(ts_data); + if (ret) { + FTS_ERROR("fail to get power(regulator)"); + goto err_power_init; + } +#endif + +#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_create_apk_debug_channel(ts_data); + if (ret) { + FTS_ERROR("create apk debug node fail"); + } + + ret = fts_create_sysfs(ts_data); + if (ret) { + FTS_ERROR("create sysfs node fail"); + } + +#if FTS_POINT_REPORT_CHECK_EN + ret = fts_point_report_check_init(ts_data); + if (ret) { + FTS_ERROR("init point report check fail"); + } +#endif + + ret = fts_ex_mode_init(ts_data); + if (ret) { + FTS_ERROR("init glove/cover/charger fail"); + } + + ret = fts_gesture_init(ts_data); + if (ret) { + FTS_ERROR("init gesture fail"); + } + + +#if FTS_ESDCHECK_EN + ret = fts_esdcheck_init(ts_data); + if (ret) { + FTS_ERROR("init esd check fail"); + } +#endif + + ret = fts_irq_registration(ts_data); + if (ret) { + FTS_ERROR("request irq failed"); + goto err_irq_req; + } + + ret = fts_fwupg_init(ts_data); + if (ret) { + FTS_ERROR("init fw upgrade fail"); + } + +#if defined(CONFIG_FB) + if (ts_data->ts_workqueue) { + INIT_WORK(&ts_data->resume_work, fts_resume_work); + } + ts_data->tp.tp_resume = fts_ts_late_resume; + ts_data->tp.tp_suspend = fts_ts_early_suspend; + tp_register_fb(&ts_data->tp); +#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 + + if (of_property_read_bool(np, "wakeup-source")) + { + device_init_wakeup(&ts_data->client->dev, 1); + enable_irq_wake(ts_data->irq); + } + + FTS_FUNC_EXIT(); + return 0; + +err_irq_req: +#if FTS_POWER_SOURCE_CUST_EN +err_power_init: + fts_power_source_exit(ts_data); +#endif + 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); +err_gpio_config: + kfree_safe(ts_data->point_buf); + kfree_safe(ts_data->events); +err_report_buffer: + input_unregister_device(ts_data->input_dev); +err_input_init: + if (ts_data->ts_workqueue) + destroy_workqueue(ts_data->ts_workqueue); +err_bus_init: + kfree_safe(ts_data->bus_tx_buf); + kfree_safe(ts_data->bus_rx_buf); + kfree_safe(ts_data->pdata); + + FTS_FUNC_EXIT(); + return ret; +} + +static int fts_ts_remove_entry(struct fts_ts_data *ts_data) +{ + FTS_FUNC_ENTER(); + +#if FTS_POINT_REPORT_CHECK_EN + fts_point_report_check_exit(ts_data); +#endif + + fts_release_apk_debug_channel(ts_data); + fts_remove_sysfs(ts_data); + fts_ex_mode_exit(ts_data); + + fts_fwupg_exit(ts_data); + + +#if FTS_ESDCHECK_EN + fts_esdcheck_exit(ts_data); +#endif + + fts_gesture_exit(ts_data); + fts_bus_exit(ts_data); + + free_irq(ts_data->irq, ts_data); + input_unregister_device(ts_data->input_dev); + + if (ts_data->ts_workqueue) + destroy_workqueue(ts_data->ts_workqueue); + +#if defined(CONFIG_FB) + tp_unregister_fb(&ts_data->tp); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + unregister_early_suspend(&ts_data->early_suspend); +#endif + + 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 FTS_POWER_SOURCE_CUST_EN + fts_power_source_exit(ts_data); +#endif + + kfree_safe(ts_data->point_buf); + kfree_safe(ts_data->events); + + kfree_safe(ts_data->pdata); + kfree_safe(ts_data); + + FTS_FUNC_EXIT(); + + return 0; +} + +static int fts_ts_suspend(struct device *dev) +{ + int ret = 0; + struct fts_ts_data *ts_data = fts_data; + + 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 + + if (ts_data->gesture_mode) { + fts_gesture_suspend(ts_data); + } else { + fts_irq_disable(); + + FTS_INFO("make TP enter into sleep mode"); + ret = fts_write_reg(FTS_REG_POWER_MODE, FTS_REG_POWER_MODE_SLEEP); + if (ret < 0) + FTS_ERROR("set TP to sleep mode fail, ret=%d", ret); + + if (!ts_data->ic_info.is_incell) { +#if FTS_POWER_SOURCE_CUST_EN + ret = fts_power_source_suspend(ts_data); + if (ret < 0) { + FTS_ERROR("power enter suspend fail"); + } +#endif + } + } + + fts_release_all_finger(); + ts_data->suspended = true; + FTS_FUNC_EXIT(); + return 0; +} + +static int fts_ts_resume(struct device *dev) +{ + struct fts_ts_data *ts_data = fts_data; + + FTS_FUNC_ENTER(); + if (!ts_data->suspended) { + FTS_DEBUG("Already in awake state"); + return 0; + } + + fts_release_all_finger(); + + if (!ts_data->ic_info.is_incell) { +#if FTS_POWER_SOURCE_CUST_EN + fts_power_source_resume(ts_data); +#endif + fts_reset_proc(200); + } + + fts_wait_tp_to_valid(); + fts_ex_mode_recovery(ts_data); + +#if FTS_ESDCHECK_EN + fts_esdcheck_resume(); +#endif + + if (ts_data->gesture_mode) { + fts_gesture_resume(ts_data); + } else { + fts_irq_enable(); + } + + ts_data->suspended = false; + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* TP Driver +*****************************************************************************/ + +static int fts_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + int ret = 0; + struct fts_ts_data *ts_data = NULL; + + FTS_INFO("Touch Screen(I2C BUS) driver prboe..."); + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + FTS_ERROR("I2C not supported"); + return -ENODEV; + } + + /* malloc memory for global struct variable */ + ts_data = (struct fts_ts_data *)kzalloc(sizeof(*ts_data), GFP_KERNEL); + if (!ts_data) { + FTS_ERROR("allocate memory for fts_data fail"); + return -ENOMEM; + } + + fts_data = ts_data; + ts_data->client = client; + ts_data->dev = &client->dev; + ts_data->log_level = 1; + ts_data->fw_is_running = 0; + i2c_set_clientdata(client, ts_data); + + ret = fts_ts_probe_entry(ts_data); + if (ret) { + FTS_ERROR("Touch Screen(I2C BUS) driver probe fail"); + kfree_safe(ts_data); + return ret; + } + + FTS_INFO("Touch Screen(I2C BUS) driver prboe successfully"); + return 0; +} + +static int fts_ts_remove(struct i2c_client *client) +{ + return fts_ts_remove_entry(i2c_get_clientdata(client)); +} + +static const struct i2c_device_id fts_ts_id[] = { + {FTS_DRIVER_NAME, 0}, + {}, +}; +static const struct of_device_id fts_dt_match[] = { + {.compatible = "focaltech,ft5436", }, + {}, +}; +MODULE_DEVICE_TABLE(of, fts_dt_match); + +static struct i2c_driver fts_ts_driver = { + .probe = fts_ts_probe, + .remove = fts_ts_remove, + .driver = { + .name = FTS_DRIVER_NAME, + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(fts_dt_match), + }, + .id_table = fts_ts_id, +}; + +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; +} + +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/focaltech_touch_ft5436/focaltech_core.h b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_core.h new file mode 100644 index 000000000000..5f2ce2571265 --- /dev/null +++ b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_core.h @@ -0,0 +1,263 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2012-2019, Focaltech Ltd. All rights reserved. + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "focaltech_common.h" +#include "../tp_suspend.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_DIM 10 +#define FTS_ONE_TCH_LEN 6 +#define FTS_TOUCH_DATA_LEN (FTS_MAX_POINTS_SUPPORT * FTS_ONE_TCH_LEN + 3) + +#define FTS_GESTURE_POINTS_MAX 6 +#define FTS_GESTURE_DATA_LEN (FTS_GESTURE_POINTS_MAX * 4 + 4) + +#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_X_MIN_DISPLAY_DEFAULT 0 +#define FTS_Y_MIN_DISPLAY_DEFAULT 0 +#define FTS_X_MAX_DISPLAY_DEFAULT 720 +#define FTS_Y_MAX_DISPLAY_DEFAULT 1280 + +#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 FTX_MAX_COMPATIBLE_TYPE 4 +#define FTX_MAX_COMMMAND_LENGTH 16 + + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +struct ftxxxx_proc { + struct proc_dir_entry *proc_entry; + u8 opmode; + u8 cmd_len; + u8 cmd[FTX_MAX_COMMMAND_LENGTH]; +}; + +struct fts_ts_platform_data { + u32 irq_gpio; + u32 irq_gpio_flags; + u32 reset_gpio; + u32 reset_gpio_flags; + u32 pwr_gpio; + u32 pwr_gpio_flags; + bool have_key; + u32 key_number; + u32 keys[FTS_MAX_KEYS]; + u32 key_y_coords[FTS_MAX_KEYS]; + 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 spi_device *spi; + struct device *dev; + 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 work_struct resume_work; + struct ftxxxx_proc proc; + spinlock_t irq_lock; + struct mutex report_mutex; + struct mutex bus_lock; + int irq; + int log_level; + int fw_is_running; /* confirm fw is running when using spi:default 0 */ + int dummy_byte; + bool suspended; + bool fw_loading; + bool irq_disabled; + bool power_disabled; + bool glove_mode; + bool cover_mode; + bool charger_mode; + bool gesture_mode; /* gesture enable or disable, default: disable */ + /* multi-touch */ + struct ts_event *events; + u8 *bus_tx_buf; + u8 *bus_rx_buf; + u8 *point_buf; + int pnt_buf_size; + int touchs; + int key_state; + int touch_point; + int point_num; + struct regulator *vdd; + struct regulator *vcc_i2c; +#if FTS_PINCTRL_EN + struct pinctrl *pinctrl; + struct pinctrl_state *pins_active; + struct pinctrl_state *pins_suspend; + struct pinctrl_state *pins_release; +#endif +#if defined(CONFIG_FB) + struct tp_device tp; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif +}; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +extern struct fts_ts_data *fts_data; + +/* communication interface */ +int fts_read(u8 *cmd, u32 cmdlen, u8 *data, u32 datalen); +int fts_read_reg(u8 addr, u8 *value); +int fts_write(u8 *writebuf, u32 writelen); +int fts_write_reg(u8 addr, u8 value); +void fts_hid2std(void); +int fts_bus_init(struct fts_ts_data *ts_data); +int fts_bus_exit(struct fts_ts_data *ts_data); + +/* Gesture functions */ +int fts_gesture_init(struct fts_ts_data *ts_data); +int fts_gesture_exit(struct fts_ts_data *ts_data); +void fts_gesture_recovery(struct fts_ts_data *ts_data); +int fts_gesture_readdata(struct fts_ts_data *ts_data, u8 *data); +int fts_gesture_suspend(struct fts_ts_data *ts_data); +int fts_gesture_resume(struct fts_ts_data *ts_data); + +/* Apk and functions */ +int fts_create_apk_debug_channel(struct fts_ts_data *); +void fts_release_apk_debug_channel(struct fts_ts_data *); + +/* ADB functions */ +int fts_create_sysfs(struct fts_ts_data *ts_data); +int fts_remove_sysfs(struct fts_ts_data *ts_data); + +/* 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 + + +/* 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_fwupg_init(struct fts_ts_data *ts_data); +int fts_fwupg_exit(struct fts_ts_data *ts_data); +int fts_upgrade_bin(char *fw_name, bool force); +int fts_enter_test_environment(bool test_state); + +/* Other */ +int fts_reset_proc(int hdelayms); +int fts_wait_tp_to_valid(void); +void fts_release_all_finger(void); +void fts_tp_state_recovery(struct fts_ts_data *ts_data); +int fts_ex_mode_init(struct fts_ts_data *ts_data); +int fts_ex_mode_exit(struct fts_ts_data *ts_data); +int fts_ex_mode_recovery(struct fts_ts_data *ts_data); + +void fts_irq_disable(void); +void fts_irq_enable(void); +#endif /* __LINUX_FOCALTECH_CORE_H__ */ diff --git a/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_esdcheck.c b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_esdcheck.c new file mode 100644 index 000000000000..b34bb26e8529 --- /dev/null +++ b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_esdcheck.c @@ -0,0 +1,464 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2012-2019, FocalTech Systems, Ltd., all rights reserved. + * + * 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 +#define ESDCHECK_INTRCNT_MAX 2 + +/***************************************************************************** +* 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 use */ + u8 intr : 1; /* 1- Interrupt trigger */ + u8 unused : 4; + u8 intr_cnt; + 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 nack_cnt; + u32 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 +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; + + FTS_DEBUG("check LCD ESD"); + if ( (tp_need_recovery == 1) && (lcd_need_reset == 0) ) { + tp_need_recovery = 0; + /* LCD reset, need recover TP state */ + fts_release_all_finger(); + fts_tp_state_recovery(ts_data); + } + + ret = fts_read_reg(FTS_REG_ESD_SATURATE, &val); + if ( ret < 0) { + FTS_ERROR("read reg0xED fail,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, need execute LCD reset"); + lcd_need_reset = 1; + tp_need_recovery = 1; + } + + return 0; +} +#endif + +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_release_all_finger(); + fts_tp_state_recovery(ts_data); + + FTS_FUNC_EXIT(); + return 0; +} + +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; + u8 chip_id = ts_data->ic_info.ids.chip_idh; + + for (i = 0; i < 3; i++) { + reg_addr = FTS_REG_CHIP_ID; + ret = fts_read(®_addr, 1, ®_value, 1); + if (ret < 0) { + FTS_ERROR("read chip id fail,ret:%d", ret); + fts_esdcheck_data.nack_cnt++; + } else { + if (reg_value == chip_id) { + break; + } else { + FTS_DEBUG("read chip_id:%x,retry:%d", reg_value, i); + fts_esdcheck_data.dataerror_cnt++; + } + } + msleep(10); + } + + /* if can't get correct data in 3 times, then need hardware reset */ + if (i >= 3) { + FTS_ERROR("read chip id 3 times fail, need execute TP reset"); + return true; + } + + return false; +} + +/***************************************************************************** +* Name: get_flow_cnt +* Brief: Read flow cnt(0x91) +* Input: +* Output: +* Return: 1(true) - Reg 0x91(flow cnt) abnormal: hold a value for 5 times +* 0(false) - 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; + + reg_addr = FTS_REG_FLOW_WORK_CNT; + ret = fts_read(®_addr, 1, ®_value, 1); + if (ret < 0) { + FTS_ERROR("read reg0x91 fail,ret:%d", ret); + fts_esdcheck_data.nack_cnt++; + } else { + if ( reg_value == fts_esdcheck_data.flow_work_cnt_last ) { + FTS_DEBUG("reg0x91,val:%x,last:%x", 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; + } + + /* Flow Work Cnt keep a value for 5 times, need execute TP reset */ + if (fts_esdcheck_data.flow_work_hold_cnt >= 5) { + FTS_DEBUG("reg0x91 keep a value for 5 times, need execute TP reset"); + return true; + } + + return false; +} + +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; + + /* 1. esdcheck is interrupt, then return */ + if (fts_esdcheck_data.intr == 1) { + fts_esdcheck_data.intr_cnt++; + if (fts_esdcheck_data.intr_cnt > ESDCHECK_INTRCNT_MAX) + fts_esdcheck_data.intr = 0; + else + return 0; + } + + /* 2. check power state, if suspend, no need check esd */ + if (fts_esdcheck_data.suspend == 1) { + FTS_DEBUG("In suspend, not check esd"); + /* 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("In apk/adb command mode, not check esd"); + return 0; + } + + /* 4. In factory mode, can't check esd */ + reg_addr = FTS_REG_WORKMODE; + ret = fts_read_reg(reg_addr, ®_value); + if ( ret < 0 ) { + fts_esdcheck_data.nack_cnt++; + } else if ( (reg_value & 0x70) != FTS_REG_WORKMODE_WORK_VALUE) { + FTS_DEBUG("not in work mode(%x), no check esd", reg_value); + 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_DEBUG("NoACK=%d, Error Data=%d, Hardware Reset=%d", + fts_esdcheck_data.nack_cnt, + fts_esdcheck_data.dataerror_cnt, + fts_esdcheck_data.hardware_reset_cnt); + fts_esdcheck_tp_reset(ts_data); + } + + return 0; +} + +static void esdcheck_func(struct work_struct *work) +{ + struct fts_ts_data *ts_data = container_of(work, + struct fts_ts_data, esdcheck_work.work); + + if (ENABLE == fts_esdcheck_data.mode) { + esdcheck_algorithm(ts_data); + queue_delayed_work(ts_data->ts_workqueue, &ts_data->esdcheck_work, + msecs_to_jiffies(ESDCHECK_WAIT_TIME)); + } + +} + +int fts_esdcheck_set_intr(bool intr) +{ + /* interrupt don't add debug message */ + fts_esdcheck_data.intr = intr; + fts_esdcheck_data.intr_cnt = (u8)intr; + return 0; +} + +static 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 check start"); + fts_esdcheck_data.flow_work_hold_cnt = 0; + fts_esdcheck_data.flow_work_cnt_last = 0; + fts_esdcheck_data.intr = 0; + fts_esdcheck_data.intr_cnt = 0; + queue_delayed_work(ts_data->ts_workqueue, + &ts_data->esdcheck_work, + msecs_to_jiffies(ESDCHECK_WAIT_TIME)); + } else { + FTS_DEBUG("ESD check stop"); + cancel_delayed_work_sync(&ts_data->esdcheck_work); + } + } + + FTS_FUNC_EXIT(); + return 0; +} + +int fts_esdcheck_suspend(void) +{ + FTS_FUNC_ENTER(); + fts_esdcheck_switch(DISABLE); + fts_esdcheck_data.suspend = 1; + fts_esdcheck_data.intr = 0; + fts_esdcheck_data.intr_cnt = 0; + FTS_FUNC_EXIT(); + return 0; +} + +int fts_esdcheck_resume( void ) +{ + FTS_FUNC_ENTER(); + fts_esdcheck_switch(ENABLE); + fts_esdcheck_data.suspend = 0; + fts_esdcheck_data.intr = 0; + fts_esdcheck_data.intr_cnt = 0; + FTS_FUNC_EXIT(); + return 0; +} + +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_switch(DISABLE); + fts_esdcheck_data.mode = DISABLE; + } + mutex_unlock(&input_dev->mutex); + + return count; +} + +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, +}; + +int fts_create_esd_sysfs(struct device *dev) +{ + int ret = 0; + + ret = sysfs_create_group(&dev->kobj, &fts_esd_group); + if ( ret != 0) { + FTS_ERROR("fts_create_esd_sysfs(sysfs) create fail"); + sysfs_remove_group(&dev->kobj, &fts_esd_group); + return ret; + } + return 0; +} + +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_data.intr = 0; + fts_esdcheck_data.intr_cnt = 0; + fts_esdcheck_switch(ENABLE); + fts_create_esd_sysfs(ts_data->dev); + FTS_FUNC_EXIT(); + return 0; +} + +int fts_esdcheck_exit(struct fts_ts_data *ts_data) +{ + sysfs_remove_group(&ts_data->dev->kobj, &fts_esd_group); + return 0; +} +#endif /* FTS_ESDCHECK_EN */ + diff --git a/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_ex_fun.c b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_ex_fun.c new file mode 100644 index 000000000000..b012c093b4d5 --- /dev/null +++ b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_ex_fun.c @@ -0,0 +1,1181 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2012-2019, Focaltech Ltd. All rights reserved. + * + * 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 +*****************************************************************************/ +#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_READ_STATUS 12 +#define PROC_SET_BOOT_MODE 13 +#define PROC_ENTER_TEST_ENVIRONMENT 14 +#define PROC_NAME "ftxxxx-debug" +#define PROC_BUF_SIZE 256 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +enum { + RWREG_OP_READ = 0, + RWREG_OP_WRITE = 1, +}; + +/***************************************************************************** +* Static variables +*****************************************************************************/ +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)) +static ssize_t fts_debug_write( + struct file *filp, const char __user *buff, size_t count, loff_t *ppos) +{ + u8 *writebuf = NULL; + u8 tmpbuf[PROC_BUF_SIZE] = { 0 }; + int buflen = count; + int writelen = 0; + int ret = 0; + char tmp[PROC_BUF_SIZE]; + struct fts_ts_data *ts_data = fts_data; + struct ftxxxx_proc *proc = &ts_data->proc; + + if ((buflen <= 1) || (buflen > PAGE_SIZE)) { + FTS_ERROR("apk proc wirte count(%d>%d) fail", buflen, (int)PAGE_SIZE); + return -EINVAL; + } + + if (buflen > PROC_BUF_SIZE) { + writebuf = (u8 *)kzalloc(buflen * sizeof(u8), GFP_KERNEL); + if (NULL == writebuf) { + FTS_ERROR("apk proc wirte buf zalloc fail"); + return -ENOMEM; + } + } else { + writebuf = tmpbuf; + } + + if (copy_from_user(writebuf, buff, buflen)) { + FTS_ERROR("[APK]: copy from user error!!"); + ret = -EFAULT; + goto proc_write_err; + } + + proc->opmode = writebuf[0]; + switch (proc->opmode) { + case PROC_SET_TEST_FLAG: + FTS_DEBUG("[APK]: PROC_SET_TEST_FLAG = %x", writebuf[1]); + if (writebuf[1] == 0) { +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); +#endif + } else { +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); +#endif + } + break; + + case PROC_READ_REGISTER: + proc->cmd[0] = writebuf[1]; + break; + + case PROC_WRITE_REGISTER: + ret = fts_write_reg(writebuf[1], writebuf[2]); + if (ret < 0) { + FTS_ERROR("PROC_WRITE_REGISTER write error"); + goto proc_write_err; + } + break; + + case PROC_READ_DATA: + writelen = buflen - 1; + if (writelen >= FTX_MAX_COMMMAND_LENGTH) { + FTS_ERROR("cmd(PROC_READ_DATA) length(%d) fail", writelen); + goto proc_write_err; + } + memcpy(proc->cmd, writebuf + 1, writelen); + proc->cmd_len = writelen; + ret = fts_write(writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("PROC_READ_DATA write error"); + goto proc_write_err; + } + break; + + case PROC_WRITE_DATA: + writelen = buflen - 1; + ret = fts_write(writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("PROC_WRITE_DATA write error"); + goto proc_write_err; + } + break; + + case PROC_SET_SLAVE_ADDR: + break; + + case PROC_HW_RESET: + snprintf(tmp, PROC_BUF_SIZE, "%s", writebuf + 1); + tmp[buflen - 1] = '\0'; + if (strncmp(tmp, "focal_driver", 12) == 0) { + FTS_INFO("APK execute HW Reset"); + fts_reset_proc(0); + } + break; + + case PROC_SET_BOOT_MODE: + FTS_DEBUG("[APK]: PROC_SET_BOOT_MODE = %x", writebuf[1]); + if (0 == writebuf[1]) { + ts_data->fw_is_running = true; + } else { + ts_data->fw_is_running = false; + } + break; + case PROC_ENTER_TEST_ENVIRONMENT: + FTS_DEBUG("[APK]: PROC_ENTER_TEST_ENVIRONMENT = %x", writebuf[1]); + if (0 == writebuf[1]) { + fts_enter_test_environment(0); + } else { + fts_enter_test_environment(1); + } + break; + + default: + break; + } + + ret = buflen; +proc_write_err: + if ((buflen > PROC_BUF_SIZE) && writebuf) { + kfree(writebuf); + writebuf = NULL; + } + return ret; +} + +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 buflen = count; + u8 *readbuf = NULL; + u8 tmpbuf[PROC_BUF_SIZE] = { 0 }; + struct fts_ts_data *ts_data = fts_data; + struct ftxxxx_proc *proc = &ts_data->proc; + + if ((buflen <= 0) || (buflen > PAGE_SIZE)) { + FTS_ERROR("apk proc read count(%d>%d) fail", buflen, (int)PAGE_SIZE); + return -EINVAL; + } + + if (buflen > PROC_BUF_SIZE) { + readbuf = (u8 *)kzalloc(buflen * sizeof(u8), GFP_KERNEL); + if (NULL == readbuf) { + FTS_ERROR("apk proc wirte buf zalloc fail"); + return -ENOMEM; + } + } else { + readbuf = tmpbuf; + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + + switch (proc->opmode) { + case PROC_READ_REGISTER: + num_read_chars = 1; + ret = fts_read_reg(proc->cmd[0], &readbuf[0]); + if (ret < 0) { + FTS_ERROR("PROC_READ_REGISTER read error"); + goto proc_read_err; + } + break; + case PROC_WRITE_REGISTER: + break; + + case PROC_READ_DATA: + num_read_chars = buflen; + ret = fts_read(NULL, 0, readbuf, num_read_chars); + if (ret < 0) { + FTS_ERROR("PROC_READ_DATA read error"); + goto proc_read_err; + } + break; + + case PROC_WRITE_DATA: + break; + + default: + break; + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + + if (copy_to_user(buff, readbuf, num_read_chars)) { + FTS_ERROR("copy to user error"); + ret = -EFAULT; + goto proc_read_err; + } + + ret = num_read_chars; +proc_read_err: + if ((buflen > PROC_BUF_SIZE) && readbuf) { + kfree(readbuf); + readbuf = NULL; + } + return ret; +} + +static const struct file_operations fts_proc_fops = { + .owner = THIS_MODULE, + .read = fts_debug_read, + .write = fts_debug_write, +}; +#else +static int fts_debug_write( + struct file *filp, const char __user *buff, unsigned long len, void *data) +{ + u8 *writebuf = NULL; + u8 tmpbuf[PROC_BUF_SIZE] = { 0 }; + int buflen = count; + int writelen = 0; + int ret = 0; + char tmp[PROC_BUF_SIZE]; + struct fts_ts_data *ts_data = fts_data; + struct ftxxxx_proc *proc = &ts_data->proc; + + if ((buflen <= 1) || (buflen > PAGE_SIZE)) { + FTS_ERROR("apk proc wirte count(%d>%d) fail", buflen, (int)PAGE_SIZE); + return -EINVAL; + } + + if (buflen > PROC_BUF_SIZE) { + writebuf = (u8 *)kzalloc(buflen * sizeof(u8), GFP_KERNEL); + if (NULL == writebuf) { + FTS_ERROR("apk proc wirte buf zalloc fail"); + return -ENOMEM; + } + } else { + writebuf = tmpbuf; + } + + if (copy_from_user(writebuf, buff, buflen)) { + FTS_ERROR("[APK]: copy from user error!!"); + ret = -EFAULT; + goto proc_write_err; + } + + proc->opmode = writebuf[0]; + switch (proc->opmode) { + case PROC_SET_TEST_FLAG: + FTS_DEBUG("[APK]: PROC_SET_TEST_FLAG = %x", writebuf[1]); + if (writebuf[1] == 0) { +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); +#endif + } else { +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); +#endif + } + break; + + case PROC_READ_REGISTER: + proc->cmd[0] = writebuf[1]; + break; + + case PROC_WRITE_REGISTER: + ret = fts_write_reg(writebuf[1], writebuf[2]); + if (ret < 0) { + FTS_ERROR("PROC_WRITE_REGISTER write error"); + goto proc_write_err; + } + break; + + case PROC_READ_DATA: + writelen = buflen - 1; + if (writelen >= FTX_MAX_COMMMAND_LENGTH) { + FTS_ERROR("cmd(PROC_READ_DATA) length(%d) fail", writelen); + goto proc_write_err; + } + memcpy(proc->cmd, writebuf + 1, writelen); + proc->cmd_len = writelen; + ret = fts_write(writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("PROC_READ_DATA write error"); + goto proc_write_err; + } + break; + + case PROC_WRITE_DATA: + writelen = buflen - 1; + ret = fts_write(writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("PROC_WRITE_DATA write error"); + goto proc_write_err; + } + break; + + case PROC_SET_SLAVE_ADDR: + break; + + case PROC_HW_RESET: + snprintf(tmp, PROC_BUF_SIZE, "%s", writebuf + 1); + tmp[buflen - 1] = '\0'; + if (strncmp(tmp, "focal_driver", 12) == 0) { + FTS_INFO("APK execute HW Reset"); + fts_reset_proc(0); + } + break; + + case PROC_SET_BOOT_MODE: + FTS_DEBUG("[APK]: PROC_SET_BOOT_MODE = %x", writebuf[1]); + if (0 == writebuf[1]) { + ts_data->fw_is_running = true; + } else { + ts_data->fw_is_running = false; + } + break; + case PROC_ENTER_TEST_ENVIRONMENT: + FTS_DEBUG("[APK]: PROC_ENTER_TEST_ENVIRONMENT = %x", writebuf[1]); + if (0 == writebuf[1]) { + fts_enter_test_environment(0); + } else { + fts_enter_test_environment(1); + } + break; + + default: + break; + } + + ret = buflen; +proc_write_err: + if ((buflen > PROC_BUF_SIZE) && writebuf) { + kfree(writebuf); + writebuf = NULL; + } + return ret; +} + +static int fts_debug_read( + char *page, char **start, off_t off, int count, int *eof, void *data ) +{ + int ret = 0; + int num_read_chars = 0; + int buflen = count; + u8 *readbuf = NULL; + u8 tmpbuf[PROC_BUF_SIZE] = { 0 }; + struct fts_ts_data *ts_data = fts_data; + struct ftxxxx_proc *proc = &ts_data->proc; + + if ((buflen <= 0) || (buflen > PAGE_SIZE)) { + FTS_ERROR("apk proc read count(%d>%d) fail", buflen, (int)PAGE_SIZE); + return -EINVAL; + } + + if (buflen > PROC_BUF_SIZE) { + readbuf = (u8 *)kzalloc(buflen * sizeof(u8), GFP_KERNEL); + if (NULL == readbuf) { + FTS_ERROR("apk proc wirte buf zalloc fail"); + return -ENOMEM; + } + } else { + readbuf = tmpbuf; + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + + switch (proc->opmode) { + case PROC_READ_REGISTER: + num_read_chars = 1; + ret = fts_read_reg(proc->cmd[0], &readbuf[0]); + if (ret < 0) { + FTS_ERROR("PROC_READ_REGISTER read error"); + goto proc_read_err; + } + break; + case PROC_WRITE_REGISTER: + break; + + case PROC_READ_DATA: + num_read_chars = buflen; + ret = fts_read(NULL, 0, readbuf, num_read_chars); + if (ret < 0) { + FTS_ERROR("PROC_READ_DATA read error"); + goto proc_read_err; + } + break; + + case PROC_WRITE_DATA: + break; + + default: + break; + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + + if (copy_to_user(buff, readbuf, num_read_chars)) { + FTS_ERROR("copy to user error"); + ret = -EFAULT; + goto proc_read_err; + } + + ret = num_read_chars; +proc_read_err: + if ((buflen > PROC_BUF_SIZE) && readbuf) { + kfree(readbuf); + readbuf = NULL; + } + return ret; +} +#endif + +int fts_create_apk_debug_channel(struct fts_ts_data *ts_data) +{ + struct ftxxxx_proc *proc = &ts_data->proc; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + proc->proc_entry = proc_create(PROC_NAME, 0777, NULL, &fts_proc_fops); + if (NULL == proc->proc_entry) { + FTS_ERROR("create proc entry fail"); + return -ENOMEM; + } +#else + proc->proc_entry = create_proc_entry(PROC_NAME, 0777, NULL); + if (NULL == proc->proc_entry) { + FTS_ERROR("create proc entry fail"); + return -ENOMEM; + } + proc->proc_entry->write_proc = fts_debug_write; + proc->proc_entry->read_proc = fts_debug_read; +#endif + + FTS_INFO("Create proc entry success!"); + return 0; +} + +void fts_release_apk_debug_channel(struct fts_ts_data *ts_data) +{ + struct ftxxxx_proc *proc = &ts_data->proc; + + if (proc->proc_entry) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + proc_remove(proc->proc_entry); +#else + remove_proc_entry(PROC_NAME, NULL); +#endif + } +} + +/************************************************************************ + * sysfs interface + ***********************************************************************/ +/* fts_hw_reset interface */ +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(0); + count = snprintf(buf, PAGE_SIZE, "hw reset executed\n"); + mutex_unlock(&input_dev->mutex); + + return count; +} + +static ssize_t fts_hw_reset_store( + struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + return -EPERM; +} + +/* fts_irq interface */ +static ssize_t fts_irq_show( + struct device *dev, struct device_attribute *attr, char *buf) +{ + ssize_t count = 0; + struct irq_desc *desc = irq_to_desc(fts_data->irq); + + count = snprintf(buf, PAGE_SIZE, "irq_depth:%d\n", desc->depth); + + return count; +} + +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("enable irq"); + fts_irq_enable(); + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_INFO("disable irq"); + fts_irq_disable(); + } + mutex_unlock(&input_dev->mutex); + return count; +} + +/* fts_boot_mode interface */ +static ssize_t fts_bootmode_store( + struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct input_dev *input_dev = fts_data->input_dev; + + FTS_FUNC_ENTER(); + mutex_lock(&input_dev->mutex); + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_INFO("[EX-FUN]set to boot mode"); + fts_data->fw_is_running = false; + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_INFO("[EX-FUN]set to fw mode"); + fts_data->fw_is_running = true; + } + mutex_unlock(&input_dev->mutex); + FTS_FUNC_EXIT(); + + return count; +} + +static ssize_t fts_bootmode_show( + struct device *dev, struct device_attribute *attr, char *buf) +{ + ssize_t count = 0; + struct input_dev *input_dev = fts_data->input_dev; + + FTS_FUNC_ENTER(); + mutex_lock(&input_dev->mutex); + if (true == fts_data->fw_is_running) { + count = snprintf(buf, PAGE_SIZE, "tp is in fw mode\n"); + } else { + count = snprintf(buf, PAGE_SIZE, "tp is in boot mode\n"); + } + mutex_unlock(&input_dev->mutex); + FTS_FUNC_EXIT(); + + return count; +} + +/* 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; + ssize_t num_read_chars = 0; + u8 fwver = 0; + + mutex_lock(&input_dev->mutex); + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + fts_read_reg(FTS_REG_FW_VER, &fwver); +#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; +} + +/* fts_rw_reg */ +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; +} + +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; + 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_read_reg(reg, &val); + rw_op.val = val; + } else { + char reg; + reg = rw_op.reg & 0xFF; + + rw_op.res = fts_read(®, 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_write_reg(reg, val); + } else { + rw_op.res = fts_write(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 */ +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] = { 0 }; + struct input_dev *input_dev = fts_data->input_dev; + + 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, FILE_NAME_LENGTH, "%s", buf); + fwname[count - 1] = '\0'; + + FTS_INFO("upgrade with bin file through sysfs node"); + mutex_lock(&input_dev->mutex); + fts_upgrade_bin(fwname, 0); + mutex_unlock(&input_dev->mutex); + + return count; +} + +/* 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 input_dev *input_dev = fts_data->input_dev; + + 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, FILE_NAME_LENGTH, "%s", buf); + fwname[count - 1] = '\0'; + + FTS_INFO("force upgrade through sysfs node"); + mutex_lock(&input_dev->mutex); + fts_upgrade_bin(fwname, 1); + mutex_unlock(&input_dev->mutex); + + return count; +} + +/* fts_driver_info interface */ +static ssize_t fts_driverinfo_show( + struct device *dev, struct device_attribute *attr, char *buf) +{ + int count = 0; + struct fts_ts_data *ts_data = fts_data; + struct fts_ts_platform_data *pdata = ts_data->pdata; + struct input_dev *input_dev = ts_data->input_dev; + + mutex_lock(&input_dev->mutex); + count += snprintf(buf + count, PAGE_SIZE, "Driver Ver:%s\n", FTS_DRIVER_VERSION); + + count += snprintf(buf + count, PAGE_SIZE, "Resolution:(%d,%d)~(%d,%d)\n", + pdata->x_min, pdata->y_min, pdata->x_max, pdata->y_max); + + count += snprintf(buf + count, PAGE_SIZE, "Max Touchs:%d\n", pdata->max_touch_number); + + count += snprintf(buf + count, PAGE_SIZE, "reset gpio:%d,int gpio:%d,irq:%d\n", + pdata->reset_gpio, pdata->irq_gpio, ts_data->irq); + + count += snprintf(buf + count, PAGE_SIZE, "IC ID:0x%02x%02x\n", + ts_data->ic_info.ids.chip_idh, ts_data->ic_info.ids.chip_idl); + mutex_unlock(&input_dev->mutex); + + return count; +} + +static ssize_t fts_driverinfo_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_show( + struct device *dev, struct device_attribute *attr, char *buf) +{ + int count = 0; + u8 val = 0; + 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_read_reg(FTS_REG_POWER_MODE, &val); + count += snprintf(buf + count, PAGE_SIZE, "Power Mode:0x%02x\n", val); + + fts_read_reg(FTS_REG_FW_VER, &val); + count += snprintf(buf + count, PAGE_SIZE, "FW Ver:0x%02x\n", val); + + fts_read_reg(FTS_REG_LIC_VER, &val); + count += snprintf(buf + count, PAGE_SIZE, "LCD Initcode Ver:0x%02x\n", val); + + fts_read_reg(FTS_REG_IDE_PARA_VER_ID, &val); + count += snprintf(buf + count, PAGE_SIZE, "Param Ver:0x%02x\n", val); + + fts_read_reg(FTS_REG_IDE_PARA_STATUS, &val); + count += snprintf(buf + count, PAGE_SIZE, "Param status:0x%02x\n", val); + + fts_read_reg(FTS_REG_VENDOR_ID, &val); + count += snprintf(buf + count, PAGE_SIZE, "Vendor ID:0x%02x\n", val); + + fts_read_reg(FTS_REG_LCD_BUSY_NUM, &val); + count += snprintf(buf + count, PAGE_SIZE, "LCD Busy Number:0x%02x\n", val); + + fts_read_reg(FTS_REG_GESTURE_EN, &val); + count += snprintf(buf + count, PAGE_SIZE, "Gesture Mode:0x%02x\n", val); + + fts_read_reg(FTS_REG_CHARGER_MODE_EN, &val); + count += snprintf(buf + count, PAGE_SIZE, "charge stat:0x%02x\n", val); + + fts_read_reg(FTS_REG_INT_CNT, &val); + count += snprintf(buf + count, PAGE_SIZE, "INT count:0x%02x\n", val); + + fts_read_reg(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; +} + +static ssize_t fts_dumpreg_store( + struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + return -EPERM; +} + +/* fts_dump_reg interface */ +static ssize_t fts_tpbuf_show( + struct device *dev, struct device_attribute *attr, char *buf) +{ + int count = 0; + int i = 0; + struct input_dev *input_dev = fts_data->input_dev; + + mutex_lock(&input_dev->mutex); + count += snprintf(buf + count, PAGE_SIZE, "touch point buffer:\n"); + for (i = 0; i < fts_data->pnt_buf_size; i++) { + count += snprintf(buf + count, PAGE_SIZE, "%02x ", fts_data->point_buf[i]); + } + count += snprintf(buf + count, PAGE_SIZE, "\n"); + mutex_unlock(&input_dev->mutex); + + return count; +} + +static ssize_t fts_tpbuf_store( + struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + return -EPERM; +} + +/* fts_log_level interface */ +static ssize_t fts_log_level_show( + struct device *dev, struct device_attribute *attr, char *buf) +{ + int count = 0; + struct input_dev *input_dev = fts_data->input_dev; + + mutex_lock(&input_dev->mutex); + count += snprintf(buf + count, PAGE_SIZE, "log level:%d\n", + fts_data->log_level); + mutex_unlock(&input_dev->mutex); + + return count; +} + +static ssize_t fts_log_level_store( + struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int value = 0; + struct input_dev *input_dev = fts_data->input_dev; + + FTS_FUNC_ENTER(); + mutex_lock(&input_dev->mutex); + sscanf(buf, "%d", &value); + FTS_DEBUG("log level:%d->%d", fts_data->log_level, value); + fts_data->log_level = value; + mutex_unlock(&input_dev->mutex); + FTS_FUNC_EXIT(); + + 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 */ +static DEVICE_ATTR(fts_upgrade_bin, S_IRUGO | S_IWUSR, fts_fwupgradebin_show, fts_fwupgradebin_store); +static DEVICE_ATTR(fts_force_upgrade, S_IRUGO | S_IWUSR, fts_fwforceupg_show, fts_fwforceupg_store); +static DEVICE_ATTR(fts_driver_info, S_IRUGO | S_IWUSR, fts_driverinfo_show, fts_driverinfo_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); +static DEVICE_ATTR(fts_boot_mode, S_IRUGO | S_IWUSR, fts_bootmode_show, fts_bootmode_store); +static DEVICE_ATTR(fts_touch_point, S_IRUGO | S_IWUSR, fts_tpbuf_show, fts_tpbuf_store); +static DEVICE_ATTR(fts_log_level, S_IRUGO | S_IWUSR, fts_log_level_show, fts_log_level_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, + &dev_attr_fts_upgrade_bin.attr, + &dev_attr_fts_force_upgrade.attr, + &dev_attr_fts_driver_info.attr, + &dev_attr_fts_hw_reset.attr, + &dev_attr_fts_irq.attr, + &dev_attr_fts_boot_mode.attr, + &dev_attr_fts_touch_point.attr, + &dev_attr_fts_log_level.attr, + NULL +}; + +static struct attribute_group fts_attribute_group = { + .attrs = fts_attributes +}; + +int fts_create_sysfs(struct fts_ts_data *ts_data) +{ + int ret = 0; + + ret = sysfs_create_group(&ts_data->dev->kobj, &fts_attribute_group); + if (ret) { + FTS_ERROR("[EX]: sysfs_create_group() failed!!"); + sysfs_remove_group(&ts_data->dev->kobj, &fts_attribute_group); + return -ENOMEM; + } else { + FTS_INFO("[EX]: sysfs_create_group() succeeded!!"); + } + + return ret; +} + +int fts_remove_sysfs(struct fts_ts_data *ts_data) +{ + sysfs_remove_group(&ts_data->dev->kobj, &fts_attribute_group); + return 0; +} diff --git a/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_ex_mode.c b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_ex_mode.c new file mode 100644 index 000000000000..c0c970b12e48 --- /dev/null +++ b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_ex_mode.c @@ -0,0 +1,307 @@ +/* + * + * FocalTech ftxxxx TouchScreen driver. + * + * Copyright (c) 2012-2019, Focaltech Ltd. All rights reserved. + * + * 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: Focaltech Driver Team +* +* 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 +*****************************************************************************/ +enum _ex_mode { + MODE_GLOVE = 0, + MODE_COVER, + MODE_CHARGER, +}; + +/***************************************************************************** +* 4.Static variables +*****************************************************************************/ + +/***************************************************************************** +* 5.Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* 6.Static function prototypes +*******************************************************************************/ +static int fts_ex_mode_switch(enum _ex_mode mode, u8 value) +{ + int ret = 0; + u8 m_val = 0; + + if (value) + m_val = 0x01; + else + m_val = 0x00; + + switch (mode) { + case MODE_GLOVE: + ret = fts_write_reg(FTS_REG_GLOVE_MODE_EN, m_val); + if (ret < 0) { + FTS_ERROR("MODE_GLOVE switch to %d fail", m_val); + } + break; + case MODE_COVER: + ret = fts_write_reg(FTS_REG_COVER_MODE_EN, m_val); + if (ret < 0) { + FTS_ERROR("MODE_COVER switch to %d fail", m_val); + } + break; + case MODE_CHARGER: + ret = fts_write_reg(FTS_REG_CHARGER_MODE_EN, m_val); + if (ret < 0) { + FTS_ERROR("MODE_CHARGER switch to %d fail", m_val); + } + break; + default: + FTS_ERROR("mode(%d) unsupport", mode); + ret = -EINVAL; + break; + } + + return ret; +} + +static ssize_t fts_glove_mode_show( + struct device *dev, struct device_attribute *attr, char *buf) +{ + int count = 0; + u8 val = 0; + struct fts_ts_data *ts_data = fts_data; + struct input_dev *input_dev = ts_data->input_dev; + + mutex_lock(&input_dev->mutex); + fts_read_reg(FTS_REG_GLOVE_MODE_EN, &val); + count = snprintf(buf + count, PAGE_SIZE, "Glove Mode:%s\n", + ts_data->glove_mode ? "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_glove_mode_store( + struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int ret = 0; + struct fts_ts_data *ts_data = fts_data; + + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!ts_data->glove_mode) { + FTS_DEBUG("enter glove mode"); + ret = fts_ex_mode_switch(MODE_GLOVE, ENABLE); + if (ret >= 0) { + ts_data->glove_mode = ENABLE; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (ts_data->glove_mode) { + FTS_DEBUG("exit glove mode"); + ret = fts_ex_mode_switch(MODE_GLOVE, DISABLE); + if (ret >= 0) { + ts_data->glove_mode = DISABLE; + } + } + } + + FTS_DEBUG("glove mode:%d", ts_data->glove_mode); + return count; +} + + +static ssize_t fts_cover_mode_show( + struct device *dev, struct device_attribute *attr, char *buf) +{ + int count = 0; + u8 val = 0; + struct fts_ts_data *ts_data = fts_data; + struct input_dev *input_dev = ts_data->input_dev; + + mutex_lock(&input_dev->mutex); + fts_read_reg(FTS_REG_COVER_MODE_EN, &val); + count = snprintf(buf + count, PAGE_SIZE, "Cover Mode:%s\n", + ts_data->cover_mode ? "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_cover_mode_store( + struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int ret = 0; + struct fts_ts_data *ts_data = fts_data; + + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!ts_data->cover_mode) { + FTS_DEBUG("enter cover mode"); + ret = fts_ex_mode_switch(MODE_COVER, ENABLE); + if (ret >= 0) { + ts_data->cover_mode = ENABLE; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (ts_data->cover_mode) { + FTS_DEBUG("exit cover mode"); + ret = fts_ex_mode_switch(MODE_COVER, DISABLE); + if (ret >= 0) { + ts_data->cover_mode = DISABLE; + } + } + } + + FTS_DEBUG("cover mode:%d", ts_data->cover_mode); + return count; +} + +static ssize_t fts_charger_mode_show( + struct device *dev, struct device_attribute *attr, char *buf) +{ + int count = 0; + u8 val = 0; + struct fts_ts_data *ts_data = fts_data; + struct input_dev *input_dev = ts_data->input_dev; + + mutex_lock(&input_dev->mutex); + fts_read_reg(FTS_REG_CHARGER_MODE_EN, &val); + count = snprintf(buf + count, PAGE_SIZE, "Charger Mode:%s\n", + ts_data->charger_mode ? "On" : "Off"); + count += snprintf(buf + count, PAGE_SIZE, "Charger Reg(0x8B):%d\n", val); + mutex_unlock(&input_dev->mutex); + + return count; +} + +static ssize_t fts_charger_mode_store( + struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int ret = 0; + struct fts_ts_data *ts_data = fts_data; + + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!ts_data->charger_mode) { + FTS_DEBUG("enter charger mode"); + ret = fts_ex_mode_switch(MODE_CHARGER, ENABLE); + if (ret >= 0) { + ts_data->charger_mode = ENABLE; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (ts_data->charger_mode) { + FTS_DEBUG("exit charger mode"); + ret = fts_ex_mode_switch(MODE_CHARGER, DISABLE); + if (ret >= 0) { + ts_data->charger_mode = DISABLE; + } + } + } + + FTS_DEBUG("charger mode:%d", ts_data->glove_mode); + return count; +} + + +/* read and write charger mode + * read example: cat fts_glove_mode ---read glove mode + * write example:echo 1 > fts_glove_mode ---write glove mode to 01 + */ +static DEVICE_ATTR(fts_glove_mode, S_IRUGO | S_IWUSR, + fts_glove_mode_show, fts_glove_mode_store); + +static DEVICE_ATTR(fts_cover_mode, S_IRUGO | S_IWUSR, + fts_cover_mode_show, fts_cover_mode_store); + +static DEVICE_ATTR(fts_charger_mode, S_IRUGO | S_IWUSR, + fts_charger_mode_show, fts_charger_mode_store); + +static struct attribute *fts_touch_mode_attrs[] = { + &dev_attr_fts_glove_mode.attr, + &dev_attr_fts_cover_mode.attr, + &dev_attr_fts_charger_mode.attr, + NULL, +}; + +static struct attribute_group fts_touch_mode_group = { + .attrs = fts_touch_mode_attrs, +}; + +int fts_ex_mode_recovery(struct fts_ts_data *ts_data) +{ + if (ts_data->glove_mode) { + fts_ex_mode_switch(MODE_GLOVE, ENABLE); + } + + if (ts_data->cover_mode) { + fts_ex_mode_switch(MODE_COVER, ENABLE); + } + + if (ts_data->charger_mode) { + fts_ex_mode_switch(MODE_CHARGER, ENABLE); + } + + return 0; +} + +int fts_ex_mode_init(struct fts_ts_data *ts_data) +{ + int ret = 0; + + ts_data->glove_mode = DISABLE; + ts_data->cover_mode = DISABLE; + ts_data->charger_mode = DISABLE; + + ret = sysfs_create_group(&ts_data->dev->kobj, &fts_touch_mode_group); + if (ret < 0) { + FTS_ERROR("create sysfs(ex_mode) fail"); + sysfs_remove_group(&ts_data->dev->kobj, &fts_touch_mode_group); + return ret; + } else { + FTS_DEBUG("create sysfs(ex_mode) succeedfully"); + } + + return 0; +} + +int fts_ex_mode_exit(struct fts_ts_data *ts_data) +{ + sysfs_remove_group(&ts_data->dev->kobj, &fts_touch_mode_group); + return 0; +} diff --git a/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_flash.c b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_flash.c new file mode 100644 index 000000000000..83bf8f4a6039 --- /dev/null +++ b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_flash.c @@ -0,0 +1,2011 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2012-2019, Focaltech Ltd. All rights reserved. + * + * 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" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FTS_FW_REQUEST_SUPPORT 1 +/* Example: focaltech_ts_fw_tianma.bin */ +#define FTS_FW_NAME_PREX_WITH_REQUEST "focaltech_ts_fw_" + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +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_module module_list[] = { + {FTS_MODULE_ID, FTS_MODULE_NAME, fw_file, sizeof(fw_file)}, + {FTS_MODULE2_ID, FTS_MODULE2_NAME, fw_file2, sizeof(fw_file2)}, + {FTS_MODULE3_ID, FTS_MODULE3_NAME, fw_file3, sizeof(fw_file3)}, +}; + +struct upgrade_func *upgrade_func_list[] = { + &upgrade_func_ft5422, +}; + +struct fts_upgrade *fwupgrade; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static bool fts_fwupg_check_state( + struct fts_upgrade *upg, enum FW_STATUS rstate); + +/************************************************************************ +* 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 +***********************************************************************/ +static int fts_fwupg_get_boot_state( + struct fts_upgrade *upg, + 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 = NULL; + + FTS_INFO("**********read boot id**********"); + if ((!upg) || (!upg->func) || (!upg->ts_data) || (!fw_sts)) { + FTS_ERROR("upg/func/ts_data/fw_sts is null"); + return -EINVAL; + } + + if (upg->func->hid_supported) + fts_hid2std(); + + cmd[0] = FTS_CMD_START1; + cmd[1] = FTS_CMD_START2; + ret = fts_write(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_read(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]); + + ids = &upg->ts_data->ic_info.ids; + 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; +} + +static int fts_fwupg_reset_to_boot(struct fts_upgrade *upg) +{ + int ret = 0; + u8 reg = FTS_REG_UPGRADE; + + FTS_INFO("send 0xAA and 0x55 to FW, reset to boot environment"); + if (upg && upg->func && upg->func->is_reset_register_BC) { + reg = FTS_REG_UPGRADE2; + } + + ret = fts_write_reg(reg, FTS_UPGRADE_AA); + if (ret < 0) { + FTS_ERROR("write FC=0xAA fail"); + return ret; + } + msleep(FTS_DELAY_UPGRADE_AA); + + ret = fts_write_reg(reg, 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 +***********************************************************************/ +static int fts_fwupg_reset_to_romboot(struct fts_upgrade *upg) +{ + int ret = 0; + int i = 0; + u8 cmd = FTS_CMD_RESET; + enum FW_STATUS state = FTS_RUN_IN_ERROR; + + ret = fts_write(&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(upg, &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; +} + +static u16 fts_crc16_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; +} + +static u16 fts_pram_ecc_calc_host(u8 *pbuf, u16 length) +{ + return fts_crc16_calc_host(pbuf, length); +} + +static int fts_pram_ecc_cal_algo( + struct fts_upgrade *upg, + u32 start_addr, + u32 ecc_length) +{ + int ret = 0; + int i = 0; + int ecc = 0; + u8 val[2] = { 0 }; + u8 tmp = 0; + u8 cmd[FTS_ROMBOOT_CMD_ECC_NEW_LEN] = { 0 }; + + FTS_INFO("read out pramboot checksum"); + if ((!upg) || (!upg->func)) { + FTS_ERROR("upg/func is null"); + return -EINVAL; + } + + 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_write(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 < FTS_ECC_FINISH_TIMEOUT; i++) { + msleep(1); + ret = fts_read(cmd, 1, val, 1); + if (ret < 0) { + FTS_ERROR("ecc_finish read cmd fail"); + return ret; + } + if (upg->func->new_return_value_from_ic) { + tmp = FTS_ROMBOOT_CMD_ECC_FINISH_OK_A5; + } else { + tmp = FTS_ROMBOOT_CMD_ECC_FINISH_OK_00; + } + if (tmp == val[0]) + break; + } + if (i >= 100) { + FTS_ERROR("wait ecc finish fail"); + return -EIO; + } + + cmd[0] = FTS_ROMBOOT_CMD_ECC_READ; + ret = fts_read(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(void) +{ + int ret = 0; + u8 reg_val = 0; + + FTS_INFO("read out pramboot checksum"); + + ret = fts_read_reg(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 fts_upgrade *upg, u32 saddr, u32 len) +{ + if ((!upg) || (!upg->func)) { + FTS_ERROR("upg/func is null"); + return -EINVAL; + } + + if (ECC_CHECK_MODE_CRC16 == upg->func->pram_ecc_check_mode) { + return fts_pram_ecc_cal_algo(upg, saddr, len); + } else { + return fts_pram_ecc_cal_xor(); + } +} + +static int fts_pram_write_buf(struct fts_upgrade *upg, 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 ((!upg) || (!upg->func) || !buf) { + FTS_ERROR("upg/func/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 (ECC_CHECK_MODE_XOR == upg->func->pram_ecc_check_mode) { + ecc_tmp ^= packet_buf[FTS_CMD_WRITE_LEN + j]; + } + } + + ret = fts_write(packet_buf, packet_len + FTS_CMD_WRITE_LEN); + if (ret < 0) { + FTS_ERROR("pramboot write data(%d) fail", i); + return ret; + } + } + + if (ECC_CHECK_MODE_CRC16 == upg->func->pram_ecc_check_mode) { + ecc_in_host = (int)fts_pram_ecc_calc_host(buf, len); + } else { + ecc_in_host = (int)ecc_tmp; + } + + return ecc_in_host; +} + +static int fts_pram_start(void) +{ + u8 cmd = FTS_ROMBOOT_CMD_START_APP; + int ret = 0; + + FTS_INFO("remap to start pramboot"); + + ret = fts_write(&cmd, 1); + if (ret < 0) { + FTS_ERROR("write start pram cmd fail"); + return ret; + } + msleep(FTS_DELAY_PRAMBOOT_START); + + return 0; +} + +static int fts_pram_write_remap(struct fts_upgrade *upg) +{ + int ret = 0; + int ecc_in_host = 0; + int ecc_in_tp = 0; + u8 *pb_buf = NULL; + u32 pb_len = 0; + + FTS_INFO("write pram and remap"); + if (!upg || !upg->func || !upg->func->pramboot) { + FTS_ERROR("upg/func/pramboot is null"); + return -EINVAL; + } + + if (upg->func->pb_length < FTS_MIN_LEN) { + FTS_ERROR("pramboot length(%d) 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(upg, 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(upg, 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(); + if (ret < 0) { + FTS_ERROR("pram start fail"); + return ret; + } + + return 0; +} + +static int fts_pram_init(void) +{ + 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_read(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_write(wbuf, 3); + if (ret < 0) { + FTS_ERROR("write flash type fail"); + return ret; + } + + return 0; +} + +static int fts_pram_write_init(struct fts_upgrade *upg) +{ + int ret = 0; + bool state = 0; + enum FW_STATUS status = FTS_RUN_IN_ERROR; + + 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(upg, &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(); + 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(upg); + if (ret < 0) { + FTS_ERROR("reset to romboot fail"); + return ret; + } + } + + /* check the length of the pramboot */ + ret = fts_pram_write_remap(upg); + 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(upg, FTS_RUN_IN_PRAM); + if (!state) { + FTS_ERROR("not in pramboot"); + return -EIO; + } + + ret = fts_pram_init(); + if (ret < 0) { + FTS_ERROR("pramboot init fail"); + return ret; + } + + return 0; +} + +static bool fts_fwupg_check_fw_valid(void) +{ + int ret = 0; + + ret = fts_wait_tp_to_valid(); + if (ret < 0) { + FTS_INFO("tp fw invaild"); + return false; + } + + FTS_INFO("tp fw vaild"); + return true; +} + +/************************************************************************ +* Name: fts_fwupg_check_state +* Brief: confirm tp run in which mode: romboot/pramboot/bootloader +* Input: +* Output: +* Return: return true if state is match, otherwise return false +***********************************************************************/ +static bool fts_fwupg_check_state( + struct fts_upgrade *upg, 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(upg, &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(void) +{ + int ret = 0; + u8 cmd = FTS_CMD_RESET; + + FTS_INFO("reset in boot environment"); + ret = fts_write(&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_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(void) +{ + int ret = 0; + bool fwvalid = false; + bool state = false; + struct fts_upgrade *upg = fwupgrade; + + FTS_INFO("***********enter into pramboot/bootloader***********"); + if ((!upg) || (NULL == upg->func)) { + FTS_ERROR("upgrade/func is null"); + return -EINVAL; + } + + fwvalid = fts_fwupg_check_fw_valid(); + if (fwvalid) { + ret = fts_fwupg_reset_to_boot(upg); + if (ret < 0) { + FTS_ERROR("enter into romboot/bootloader fail"); + return ret; + } + } else if (upg->func->read_boot_id_need_reset) { + ret = fts_fwupg_reset_in_boot(); + if (ret < 0) { + FTS_ERROR("reset before read boot id when fw invalid fail"); + return ret; + } + } + + if (upg->func->pramboot_supported) { + FTS_INFO("pram supported, write pramboot and init"); + /* pramboot */ + ret = fts_pram_write_init(upg); + 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(upg, 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( + 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_read(&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(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_write(&cmd, 1); + if (ret < 0) { + FTS_ERROR("erase cmd fail"); + return ret; + } + msleep(delay); + + /* read status 0xF0AA: success */ + flag = fts_fwupg_check_flash_status(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(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 }; + int ecc = 0; + int ecc_len = 0; + u32 packet_num = 0; + u32 packet_len = 0; + u32 remainder = 0; + u32 addr = 0; + u32 offset = 0; + struct fts_upgrade *upg = fwupgrade; + + FTS_INFO( "**********read out checksum**********"); + if ((NULL == upg) || (NULL == upg->func)) { + FTS_ERROR("upgrade/func is null"); + return -EINVAL; + } + + /* check sum init */ + wbuf[0] = FTS_CMD_ECC_INIT; + ret = fts_write(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_write(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(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; + } + } + + ecc_len = 1; + if (ECC_CHECK_MODE_CRC16 == upg->func->fw_ecc_check_mode) { + ecc_len = 2; + } + + /* read out check sum */ + wbuf[0] = FTS_CMD_ECC_READ; + ret = fts_read(wbuf, 1, val, ecc_len); + if (ret < 0) { + FTS_ERROR( "ecc read cmd write fail"); + return ret; + } + + if (ECC_CHECK_MODE_CRC16 == upg->func->fw_ecc_check_mode) { + ecc = (int)((u16)(val[0] << 8) + val[1]); + } else { + ecc = (int)val[0]; + } + + return ecc; +} + +/************************************************************************ + * 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( + 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_tmp = 0; + int ecc_in_host = 0; + u8 cmd = 0; + u8 val[FTS_CMD_FLASH_STATUS_LEN] = { 0 }; + u16 read_status = 0; + u16 wr_ok = 0; + struct fts_upgrade *upg = fwupgrade; + + FTS_INFO( "**********write data to flash**********"); + if ((!upg) || (!upg->func || !buf || !len)) { + FTS_ERROR("upgrade/func/buf/len is invalid"); + 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_tmp ^= packet_buf[FTS_CMD_WRITE_LEN + j]; + } + + ret = fts_write(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_read(&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); + } + } + + ecc_in_host = (int)ecc_tmp; + if (ECC_CHECK_MODE_CRC16 == upg->func->fw_ecc_check_mode) { + ecc_in_host = (int)fts_crc16_calc_host(buf, len); + } + + return 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 + ***********************************************************************/ +static int fts_flash_read_buf(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] = { 0 }; + + 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_write(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_read(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 + ***********************************************************************/ +static int fts_flash_read(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(); + if (ret < 0) { + FTS_ERROR("enter into pramboot/bootloader fail"); + goto read_flash_err; + } + + ret = fts_flash_read_buf(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(); + if (ret < 0) { + FTS_ERROR("reset to normal boot fail"); + } + return ret; +} + +static int fts_read_file(char *file_name, u8 **file_buf) +{ + int ret = 0; + char file_path[FILE_NAME_LENGTH] = { 0 }; + struct file *filp = NULL; + struct inode *inode; + mm_segment_t old_fs; + loff_t pos; + loff_t file_len = 0; + + if ((NULL == file_name) || (NULL == file_buf)) { + FTS_ERROR("filename/filebuf is NULL"); + return -EINVAL; + } + + snprintf(file_path, FILE_NAME_LENGTH, "%s%s", FTS_FW_BIN_FILEPATH, file_name); + filp = filp_open(file_path, O_RDONLY, 0); + if (IS_ERR(filp)) { + FTS_ERROR("open %s file fail", file_path); + return -ENOENT; + } + +#if 1 + inode = filp->f_inode; +#else + /* reserved for linux earlier verion */ + inode = filp->f_dentry->d_inode; +#endif + + file_len = inode->i_size; + *file_buf = (u8 *)vmalloc(file_len); + if (NULL == *file_buf) { + FTS_ERROR("file buf malloc fail"); + filp_close(filp, NULL); + return -ENOMEM; + } + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + ret = vfs_read(filp, *file_buf, file_len , &pos); + if (ret < 0) + FTS_ERROR("read file fail"); + FTS_INFO("file len:%d read len:%d pos:%d", (u32)file_len, ret, (u32)pos); + filp_close(filp, NULL); + set_fs(old_fs); + + return ret; +} + +int fts_upgrade_bin(char *fw_name, bool force) +{ + int ret = 0; + u32 fw_file_len = 0; + u8 *fw_file_buf = NULL; + struct fts_upgrade *upg = fwupgrade; + + FTS_INFO("start upgrade with fw bin"); + if ((!upg) || (!upg->func) || !upg->ts_data) { + FTS_ERROR("upgrade/func/ts_data is null"); + return -EINVAL; + } + + upg->ts_data->fw_loading = 1; + fts_irq_disable(); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); +#endif + + ret = fts_read_file(fw_name, &fw_file_buf); + if ((ret < 0) || (ret < FTS_MIN_LEN) || (ret > FTS_MAX_LEN_FILE)) { + FTS_ERROR("read fw bin file(sdcard) fail, len:%d", fw_file_len); + goto err_bin; + } + + fw_file_len = ret; + FTS_INFO("fw bin file len:%d", fw_file_len); + if (force) { + if (upg->func->force_upgrade) { + ret = upg->func->force_upgrade(fw_file_buf, fw_file_len); + } else { + FTS_INFO("force_upgrade function is null, no upgrade"); + goto err_bin; + } + } else { +#if FTS_AUTO_LIC_UPGRADE_EN + if (upg->func->lic_upgrade) { + ret = upg->func->lic_upgrade(fw_file_buf, fw_file_len); + } else { + FTS_INFO("lic_upgrade function is null, no upgrade"); + } +#endif + if (upg->func->upgrade) { + ret = upg->func->upgrade(fw_file_buf, fw_file_len); + } else { + FTS_INFO("upgrade function is null, no upgrade"); + } + } + + if (ret < 0) { + FTS_ERROR("upgrade fw bin failed"); + fts_fwupg_reset_in_boot(); + goto err_bin; + } + + FTS_INFO("upgrade fw bin success"); + ret = 0; + +err_bin: +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); +#endif + fts_irq_enable(); + upg->ts_data->fw_loading = 0; + + if (fw_file_buf) { + vfree(fw_file_buf); + fw_file_buf = NULL; + } + return ret; +} + +int fts_enter_test_environment(bool test_state) +{ + return 0; +} +#if FTS_AUTO_LIC_UPGRADE_EN +static int fts_lic_get_vid_in_tp(u16 *vid) +{ + int ret = 0; + u8 val[2] = { 0 }; + + if (NULL == vid) { + FTS_ERROR("vid is NULL"); + return -EINVAL; + } + + ret = fts_read_reg(FTS_REG_VENDOR_ID, &val[0]); + if (fts_data->ic_info.is_incell) + ret = fts_read_reg(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(struct fts_upgrade *upg, u16 *vid) +{ + u8 val[2] = { 0 }; + u8 *licbuf = NULL; + u32 conf_saddr = 0; + + 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(u8 *ver) +{ + int ret = 0; + + if (NULL == ver) { + FTS_ERROR("ver is NULL"); + return -EINVAL; + } + + ret = fts_read_reg(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(struct fts_upgrade *upg, u8 *ver) +{ + int ret = 0; + + 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; +} + +static bool fts_lic_need_upgrade(struct fts_upgrade *upg) +{ + 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(); + if ( !fwvalid) { + FTS_INFO("fw is invalid, no upgrade lcd init code"); + return false; + } + + ret = fts_lic_get_vid_in_host(upg, &vid_in_host); + if (ret < 0) { + FTS_ERROR("vendor id in host invalid"); + return false; + } + + ret = fts_lic_get_vid_in_tp(&vid_in_tp); + if (ret < 0) { + FTS_ERROR("vendor id in tp invalid"); + return false; + } + + FTS_DEBUG("vid in tp:0x%04x, host:0x%04x", 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(upg, &initcode_ver_in_host); + if (ret < 0) { + FTS_ERROR("init code in host invalid"); + return false; + } + + ret = fts_lic_get_ver_in_tp(&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; +} + +static int fts_lic_upgrade(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(upg); + 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(upg->lic, upg->lic_length); + if (ret < 0) { + fts_fwupg_reset_in_boot(); + } else { + fts_lic_get_ver_in_tp(&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(u8 *ver) +{ + int ret = 0; + + if (NULL == ver) { + FTS_ERROR("ver is NULL"); + return -EINVAL; + } + + ret = fts_read_reg(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(struct fts_upgrade *upg, u8 *ver) +{ + 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; +} + +/* + * return: < 0 : error + * == 0: no ide + * == 1: ide + */ +static int fts_param_ide_in_host(struct fts_upgrade *upg) +{ + u32 off = 0; + + if ((!upg) || (!upg->func) || (!upg->fw)) { + FTS_ERROR("fts_data/upgrade/func/fw is NULL"); + return -EINVAL; + } + + if (upg->fw_length < upg->func->paramcfgoff + FTS_FW_IDE_SIG_LEN) { + FTS_INFO("fw len(%x) < paramcfg offset(%x), no IDE", + upg->fw_length, upg->func->paramcfgoff + FTS_FW_IDE_SIG_LEN); + return 0; + } + + off = upg->func->paramcfgoff; + if (0 == memcmp(&upg->fw[off], FTS_FW_IDE_SIG, FTS_FW_IDE_SIG_LEN)) { + FTS_INFO("fw in host is IDE version"); + return 1; + } + + FTS_INFO("fw in host isn't IDE version"); + return 0; +} + +/* + * return: < 0 : error + * 0 : no ide + * 1 : ide + */ +static int fts_param_ide_in_tp(u8 *val) +{ + int ret = 0; + + ret = fts_read_reg(FTS_REG_IDE_PARA_STATUS, val); + if (ret < 0) { + FTS_ERROR("read IDE PARAM STATUS in tp fail"); + return ret; + } + + if ((*val != 0xFF) && ((*val & 0x80) == 0x80)) { + FTS_INFO("fw in tp is IDE version"); + return 1; + } + + FTS_INFO("fw in tp isn't IDE version"); + return 0; +} + +/************************************************************************ + * fts_param_need_upgrade - check fw paramcfg need upgrade or not + * + * Return: < 0 : error if paramcfg need upgrade + * 0 : no need upgrade + * 1 : need upgrade app + param + * 2 : need upgrade param + ***********************************************************************/ +static int fts_param_need_upgrade(struct fts_upgrade *upg) +{ + int ret = 0; + u8 val = 0; + int ide_in_host = 0; + int ide_in_tp = 0; + u8 ver_in_host = 0; + u8 ver_in_tp = 0; + bool fwvalid = false; + + fwvalid = fts_fwupg_check_fw_valid(); + if ( !fwvalid) { + FTS_INFO("fw is invalid, upgrade app+param"); + return 1; + } + + ide_in_host = fts_param_ide_in_host(upg); + if (ide_in_host < 0) { + FTS_INFO("fts_param_ide_in_host fail"); + return ide_in_host; + } + + ide_in_tp = fts_param_ide_in_tp(&val); + if (ide_in_tp < 0) { + FTS_INFO("fts_param_ide_in_tp fail"); + return ide_in_tp; + } + + if ((0 == ide_in_host) && (0 == ide_in_tp)) { + FTS_INFO("fw in host&tp are both no ide"); + return 0; + } else if (ide_in_host != ide_in_tp) { + FTS_INFO("fw in host&tp not equal, need upgrade app+param"); + return 1; + } else if ((1 == ide_in_host) && (1 == ide_in_tp)) { + FTS_INFO("fw in host&tp are both ide"); + if ((val & 0x7F) != 0x00) { + FTS_INFO("param invalid, need upgrade param"); + return 2; + } + + ret = fts_param_get_ver_in_host(upg, &ver_in_host); + if (ret < 0) { + FTS_ERROR("param version in host invalid"); + return ret; + } + + ret = fts_param_get_ver_in_tp(&ver_in_tp); + if (ret < 0) { + FTS_ERROR("get IDE param ver in tp fail"); + return ret; + } + + FTS_INFO("fw paramcfg version in tp:%x, host:%x", + ver_in_tp, ver_in_host); + if (ver_in_tp != ver_in_host) { + return 2; + } + } + + return 0; +} + +static int fts_fwupg_get_ver_in_tp(u8 *ver) +{ + int ret = 0; + + if (NULL == ver) { + FTS_ERROR("ver is NULL"); + return -EINVAL; + } + + ret = fts_read_reg(FTS_REG_FW_VER, ver); + if (ret < 0) { + FTS_ERROR("read fw ver from tp fail"); + return ret; + } + + return 0; +} + +static int fts_fwupg_get_ver_in_host(struct fts_upgrade *upg, u8 *ver) +{ + 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(0x%0x) < fw ver offset(0x%x)", + upg->fw_length, upg->func->fwveroff); + return -EINVAL; + } + + FTS_INFO("fw version offset:0x%x", upg->func->fwveroff); + *ver = upg->fw[upg->func->fwveroff]; + return 0; +} + +static bool fts_fwupg_need_upgrade(struct fts_upgrade *upg) +{ + int ret = 0; + bool fwvalid = false; + u8 fw_ver_in_host = 0; + u8 fw_ver_in_tp = 0; + + fwvalid = fts_fwupg_check_fw_valid(); + if (fwvalid) { + ret = fts_fwupg_get_ver_in_host(upg, &fw_ver_in_host); + if (ret < 0) { + FTS_ERROR("get fw ver in host fail"); + return false; + } + + ret = fts_fwupg_get_ver_in_tp(&fw_ver_in_tp); + if (ret < 0) { + FTS_ERROR("get fw ver in tp fail"); + return false; + } + + 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, run in following steps + * 1. check fw version(A6), not equal, will upgrade app(+param) + * 2. if fw version equal, will check ide, will upgrade app(+param) + * in the follow situation + * a. host&tp IDE's type are not equal, will upgrade app+param + * b. host&tp are both IDE's type, and param's version are not + * equal, will upgrade param + * Input: + * Output: + * Return: return 0 if success, otherwise return error code + ***********************************************************************/ +int fts_fwupg_upgrade(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(upg); + 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(upg->fw, upg->fw_length); + if (ret < 0) { + fts_fwupg_reset_in_boot(); + } else { + fts_fwupg_get_ver_in_tp(&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 { + if (upg->func->param_upgrade) { + ret = fts_param_need_upgrade(upg); + if (ret <= 0) { + FTS_INFO("param don't need upgrade"); + break; + } else if (1 == ret) { + FTS_INFO("force upgrade fw app(times:%d)", upgrade_count); + if (upg->func->upgrade) { + ret = upg->func->upgrade(upg->fw, upg->fw_length); + if (ret < 0) { + fts_fwupg_reset_in_boot(); + } else { + break; + } + } + } else if (2 == ret) { + FTS_INFO("upgrade param area(times:%d)", upgrade_count); + ret = upg->func->param_upgrade(upg->fw, upg->fw_length); + if (ret < 0) { + fts_fwupg_reset_in_boot(); + } else { + fts_param_get_ver_in_tp(&ver); + FTS_INFO("success upgrade to fw param version %02x", ver); + break; + } + } else + break; + } else { + break; + } + } + } while (upgrade_count < 2); + + return ret; +} + +/************************************************************************ + * fts_fwupg_auto_upgrade - upgrade main entry + ***********************************************************************/ +static void fts_fwupg_auto_upgrade(struct fts_upgrade *upg) +{ + int ret = 0; + + FTS_INFO("********************FTS enter upgrade********************"); + if (!upg || !upg->ts_data) { + FTS_ERROR("upg/ts_data is null"); + return ; + } + + ret = fts_fwupg_upgrade(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(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********************"); +} + +static int fts_fwupg_get_vendorid(struct fts_upgrade *upg, int *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 }; + + FTS_INFO("read vendor id from tp"); + if ((!upg) || (!upg->func) || (!upg->ts_data) || (!vid)) { + FTS_ERROR("upgrade/func/ts_data/vid is null"); + return -EINVAL; + } + + fwvalid = fts_fwupg_check_fw_valid(); + if (fwvalid) { + ret = fts_read_reg(FTS_REG_VENDOR_ID, &vendor_id); + if (upg->ts_data->ic_info.is_incell) + ret = fts_read_reg(FTS_REG_MODULE_ID, &module_id); + } else { + fwcfg_addr = upg->func->fwcfgoff; + ret = fts_flash_read(fwcfg_addr, cfgbuf, FTS_HEADER_LEN); + vendor_id = cfgbuf[FTS_CONIFG_VENDORID_OFF]; + if (upg->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 = (int)((module_id << 8) + vendor_id); + return 0; +} + +static int fts_fwupg_get_module_info(struct fts_upgrade *upg) +{ + int ret = 0; + int i = 0; + struct upgrade_module *info = &module_list[0]; + + if (!upg || !upg->ts_data) { + FTS_ERROR("upg/ts_data is null"); + return -EINVAL; + } + + if (FTS_GET_MODULE_NUM > 1) { + /* support multi modules, must read correct module id(vendor id) */ + ret = fts_fwupg_get_vendorid(upg, &upg->module_id); + if (ret < 0) { + FTS_ERROR("get vendor id failed"); + return ret; + } + FTS_INFO("module id:%04x", upg->module_id); + for (i = 0; i < FTS_GET_MODULE_NUM; i++) { + info = &module_list[i]; + if (upg->module_id == info->id) { + FTS_INFO("module id match, get module info pass"); + break; + } + } + if (i >= FTS_GET_MODULE_NUM) { + FTS_ERROR("no module id match, don't get file"); + return -ENODATA; + } + } + + upg->module_info = info; + return 0; +} + +static int fts_get_fw_file_via_request_firmware(struct fts_upgrade *upg) +{ + int ret = 0; + const struct firmware *fw = NULL; + u8 *tmpbuf = NULL; + char fwname[FILE_NAME_LENGTH] = { 0 }; + + if (!upg || !upg->ts_data || !upg->ts_data->dev) { + FTS_ERROR("upg/ts_data/dev is null"); + return -EINVAL; + } + + snprintf(fwname, FILE_NAME_LENGTH, "%s%s.bin", \ + FTS_FW_NAME_PREX_WITH_REQUEST, \ + upg->module_info->vendor_name); + + ret = request_firmware(&fw, fwname, upg->ts_data->dev); + if (0 == ret) { + FTS_INFO("firmware(%s) request successfully", fwname); + tmpbuf = vmalloc(fw->size); + if (NULL == tmpbuf) { + FTS_ERROR("fw buffer vmalloc fail"); + ret = -ENOMEM; + } else { + memcpy(tmpbuf, fw->data, fw->size); + upg->fw = tmpbuf; + upg->fw_length = fw->size; + upg->fw_from_request = 1; + } + } else { + FTS_INFO("firmware(%s) request fail,ret=%d", fwname, ret); + } + + if (fw != NULL) { + release_firmware(fw); + fw = NULL; + } + + return ret; +} + +static int fts_get_fw_file_via_i(struct fts_upgrade *upg) +{ + upg->fw = upg->module_info->fw_file; + upg->fw_length = upg->module_info->fw_len; + upg->fw_from_request = 0; + + return 0; +} + +/***************************************************************************** + * Name: fts_fwupg_get_fw_file + * Brief: get fw image/file, + * If support muitl modules, please set FTS_GET_MODULE_NUM, and FTS_- + * MODULE_ID/FTS_MODULE_NAME; + * If get fw via .i file, please set FTS_FW_REQUEST_SUPPORT=0, and F- + * TS_MODULE_ID; will use module id to distingwish different modules; + * If get fw via reques_firmware(), please set FTS_FW_REQUEST_SUPPORT + * =1, and FTS_MODULE_NAME; fw file name will be composed of "focalt- + * ech_ts_fw_" & FTS_VENDOR_NAME; + * + * If have flash, module_id=vendor_id, If non-flash,module_id need + * transfer from LCD driver(gpio or lcm_id or ...); + * Input: + * Output: + * Return: return 0 if success, otherwise return error code + *****************************************************************************/ +static int fts_fwupg_get_fw_file(struct fts_upgrade *upg) +{ + int ret = 0; + bool get_fw_i_flag = false; + + FTS_DEBUG("get upgrade fw file"); + if (!upg || !upg->ts_data) { + FTS_ERROR("upg/ts_data is null"); + return -EINVAL; + } + + ret = fts_fwupg_get_module_info(upg); + if ((ret < 0) || (!upg->module_info)) { + FTS_ERROR("get module info fail"); + return ret; + } + + if (FTS_FW_REQUEST_SUPPORT) { + ret = fts_get_fw_file_via_request_firmware(upg); + if (ret != 0) { + get_fw_i_flag = true; + } + } else { + get_fw_i_flag = true; + } + + if (get_fw_i_flag) { + ret = fts_get_fw_file_via_i(upg); + } + + upg->lic = upg->fw; + upg->lic_length = upg->fw_length; + + FTS_INFO("upgrade fw file len:%d", upg->fw_length); + if ((upg->fw_length < FTS_MIN_LEN) + || (upg->fw_length > FTS_MAX_LEN_FILE)) { + FTS_ERROR("fw file len(%d) fail", upg->fw_length); + return -ENODATA; + } + + return ret; +} + +static void fts_fwupg_init_ic_detail(struct fts_upgrade *upg) +{ + if (upg && upg->func && upg->func->init) { + upg->func->init(upg->fw, upg->fw_length); + } +} + +/***************************************************************************** + * Name: fts_fwupg_work + * Brief: 1. get fw image/file + * 2. ic init if have + * 3. call upgrade main function(fts_fwupg_auto_upgrade) + * Input: + * Output: + * Return: + *****************************************************************************/ +static void fts_fwupg_work(struct work_struct *work) +{ + int ret = 0; + struct fts_upgrade *upg = fwupgrade; + +#if !FTS_AUTO_UPGRADE_EN + FTS_INFO("FTS_AUTO_UPGRADE_EN is disabled, not upgrade when power on"); + return ; +#endif + + FTS_INFO("fw upgrade work function"); + if (!upg || !upg->ts_data) { + FTS_ERROR("upg/ts_data is null"); + return ; + } + + upg->ts_data->fw_loading = 1; + fts_irq_disable(); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); +#endif + + /* get fw */ + ret = fts_fwupg_get_fw_file(upg); + if (ret < 0) { + FTS_ERROR("get file fail, can't upgrade"); + } else { + /* ic init if have */ + fts_fwupg_init_ic_detail(upg); + /* run auto upgrade */ + fts_fwupg_auto_upgrade(upg); + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); +#endif + fts_irq_enable(); + upg->ts_data->fw_loading = 0; +} + +int fts_fwupg_init(struct fts_ts_data *ts_data) +{ + int i = 0; + int j = 0; + int ic_stype = 0; + 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 (!ts_data || !ts_data->ts_workqueue) { + FTS_ERROR("ts_data/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; + } + + ic_stype = ts_data->ic_info.ids.type; + 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 function match, can't upgrade"); + kfree(fwupgrade); + fwupgrade = NULL; + return -ENODATA; + } + + fwupgrade->ts_data = ts_data; + INIT_WORK(&ts_data->fwupg_work, fts_fwupg_work); + queue_work(ts_data->ts_workqueue, &ts_data->fwupg_work); + + return 0; +} + +int fts_fwupg_exit(struct fts_ts_data *ts_data) +{ + FTS_FUNC_ENTER(); + if (fwupgrade) { + if (fwupgrade->fw_from_request) { + vfree(fwupgrade->fw); + fwupgrade->fw = NULL; + } + + kfree(fwupgrade); + fwupgrade = NULL; + } + FTS_FUNC_EXIT(); + return 0; +} diff --git a/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_flash.h b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_flash.h new file mode 100644 index 000000000000..cfebe2d12489 --- /dev/null +++ b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_flash.h @@ -0,0 +1,205 @@ +/************************************************************************ +* Copyright (C) 2012-2019, Focaltech Systems (R)£¬All Rights Reserved. +* +* File Name: focaltech_flash.h +* +* Author: Focaltech Driver Team +* +* 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_SET_PRAM_ADDR 0xAD +#define FTS_ROMBOOT_CMD_SET_PRAM_ADDR_LEN 4 +#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_PRAM_SADDR 0x000000 +#define FTS_DRAM_SADDR 0xD00000 + +#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_APP_DATA_LEN_INCELL 0x7A +#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_REG_UPGRADE2 0xBC +#define FTS_UPGRADE_AA 0xAA +#define FTS_UPGRADE_55 0x55 +#define FTS_DELAY_UPGRADE_AA 10 +#define FTS_UPGRADE_LOOP 30 +#define FTS_HEADER_LEN 32 +#define FTS_FW_BIN_FILEPATH "/sdcard/" +#define FTS_FW_IDE_SIG "IDE_" +#define FTS_FW_IDE_SIG_LEN 4 +#define MAX_MODULE_VENDOR_NAME_LEN 16 + +#define FTS_ROMBOOT_CMD_ECC_NEW_LEN 7 +#define FTS_ECC_FINISH_TIMEOUT 100 +#define FTS_ROMBOOT_CMD_ECC_FINISH 0xCE +#define FTS_ROMBOOT_CMD_ECC_FINISH_OK_A5 0xA5 +#define FTS_ROMBOOT_CMD_ECC_FINISH_OK_00 0x00 +#define FTS_ROMBOOT_CMD_ECC_READ 0xCD +#define AL2_FCS_COEF ((1 << 15) + (1 << 10) + (1 << 3)) + +#define FTS_APP_INFO_OFFSET 0x100 + +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, +}; + +enum ECC_CHECK_MODE { + ECC_CHECK_MODE_XOR, + ECC_CHECK_MODE_CRC16, +}; + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +/* IC info */ +struct upgrade_func { + u64 ctype[FTX_MAX_COMPATIBLE_TYPE]; + u32 fwveroff; + u32 fwcfgoff; + u32 appoff; + u32 licoff; + u32 paramcfgoff; + u32 paramcfgveroff; + u32 paramcfg2off; + int pram_ecc_check_mode; + int fw_ecc_check_mode; + bool new_return_value_from_ic; + bool appoff_handle_in_ic; + bool is_reset_register_BC; + bool read_boot_id_need_reset; + bool hid_supported; + bool pramboot_supported; + u8 *pramboot; + u32 pb_length; + int (*init)(u8 *, u32); + int (*upgrade)(u8 *, u32); + int (*get_hlic_ver)(u8 *); + int (*lic_upgrade)(u8 *, u32); + int (*param_upgrade)(u8 *, u32); + int (*force_upgrade)(u8 *, u32); +}; + +struct upgrade_setting_nf { + u8 rom_idh; + u8 rom_idl; + u16 reserved; + u32 app2_offset; + u32 ecclen_max; + u8 eccok_val; + u8 upgsts_boot; + u8 delay_init; + bool spi_pe; + bool half_length; + bool fd_check; + bool drwr_support; +}; + +struct upgrade_module { + int id; + char vendor_name[MAX_MODULE_VENDOR_NAME_LEN]; + u8 *fw_file; + u32 fw_len; +}; + +struct fts_upgrade { + struct fts_ts_data *ts_data; + struct upgrade_module *module_info; + struct upgrade_func *func; + struct upgrade_setting_nf *setting_nf; + int module_id; + bool fw_from_request; + u8 *fw; + u32 fw_length; + u8 *lic; + u32 lic_length; +}; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +extern struct upgrade_func upgrade_func_ft5422; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +int fts_fwupg_reset_in_boot(void); +int fts_fwupg_enter_into_boot(void); +int fts_fwupg_erase(u32 delay); +int fts_fwupg_ecc_cal(u32 saddr, u32 len); +int fts_flash_write_buf(u32 saddr, u8 *buf, u32 len, u32 delay); +int fts_fwupg_upgrade(struct fts_upgrade *upg); +#endif diff --git a/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_flash/Makefile b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_flash/Makefile new file mode 100644 index 000000000000..17c9595ca5c9 --- /dev/null +++ b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_flash/Makefile @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Makefile for the focaltech touchscreen drivers. +# + +obj-y += focaltech_upgrade_ft5436.o + diff --git a/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_flash/focaltech_upgrade_ft5436.c b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_flash/focaltech_upgrade_ft5436.c new file mode 100644 index 000000000000..7ed7315f0d93 --- /dev/null +++ b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_flash/focaltech_upgrade_ft5436.c @@ -0,0 +1,154 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2012-2019, Focaltech Ltd. All rights reserved. + * + * 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_ft5422.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-15 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_flash.h" + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static int fts_ft5422_init(u8 *buf, u32 len) +{ + if ((!buf) || (len < FTS_MIN_LEN)) { + FTS_ERROR("upg is null/fw length fail"); + return -EINVAL; + } + + upgrade_func_ft5422.fwveroff = len - 2; + return 0; +} + +/************************************************************************ +* Name: fts_ft5422_upgrade +* Brief: +* Input: +* Output: +* Return: return 0 if success, otherwise return error code +***********************************************************************/ +static int fts_ft5422_upgrade(u8 *buf, u32 len) +{ + int ret = 0; + u32 start_addr = 0; + u8 cmd[4] = { 0 }; + int ecc_in_host = 0; + int ecc_in_tp = 0; + + if (NULL == buf) { + FTS_ERROR("fw buf is null"); + return -EINVAL; + } + + if ((len < FTS_MIN_LEN) || (len > (60 * 1024))) { + FTS_ERROR("fw buffer len(%x) fail", len); + return -EINVAL; + } + + /* enter into upgrade environment */ + ret = fts_fwupg_enter_into_boot(); + 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; + ret = fts_write(cmd, 2); + if (ret < 0) { + FTS_ERROR("upgrade mode(09) cmd write fail"); + goto fw_reset; + } + + cmd[0] = FTS_CMD_DATA_LEN; + cmd[1] = BYTE_OFF_16(len); + cmd[2] = BYTE_OFF_8(len); + cmd[3] = BYTE_OFF_0(len); + ret = fts_write(cmd, FTS_CMD_DATA_LEN_LEN); + if (ret < 0) { + FTS_ERROR("data len cmd write fail"); + goto fw_reset; + } + + ret = fts_fwupg_erase(FTS_REASE_APP_DELAY); + if (ret < 0) { + FTS_ERROR("erase cmd write fail"); + goto fw_reset; + } + + /* write app */ + start_addr = upgrade_func_ft5422.appoff; + ecc_in_host = fts_flash_write_buf(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(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(); + if (ret < 0) { + FTS_ERROR("reset to normal boot fail"); + } + + msleep(200); + return 0; + +fw_reset: + FTS_INFO("upgrade fail, reset to normal boot"); + ret = fts_fwupg_reset_in_boot(); + if (ret < 0) { + FTS_ERROR("reset to normal boot fail"); + } + return -EIO; +} + +struct upgrade_func upgrade_func_ft5422 = { + .ctype = {0x02}, + .fwveroff = 0x0000, + .fwcfgoff = 0xD780, + .appoff = 0x0000, + .pramboot_supported = false, + .hid_supported = true, + .init = fts_ft5422_init, + .upgrade = fts_ft5422_upgrade, +}; diff --git a/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_gesture.c b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_gesture.c new file mode 100644 index 000000000000..b65cf39451d2 --- /dev/null +++ b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_gesture.c @@ -0,0 +1,460 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2012-2019, Focaltech Ltd. All rights reserved. + * + * 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" + +/****************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define KEY_GESTURE_U KEY_U +#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 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +/* +* gesture_id - mean which gesture is recognised +* point_num - points number of this gesture +* coordinate_x - All gesture point x coordinate +* coordinate_y - All gesture point y coordinate +* mode - gesture enable/disable, need enable by host +* - 1:enable gesture function(default) 0:disable +* active - gesture work flag, +* always set 1 when suspend, set 0 when resume +*/ +struct fts_gesture_st { + u8 gesture_id; + u8 point_num; + u16 coordinate_x[FTS_GESTURE_POINTS_MAX]; + u16 coordinate_y[FTS_GESTURE_POINTS_MAX]; +}; + +/***************************************************************************** +* 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) +{ + int count = 0; + u8 val = 0; + struct fts_ts_data *ts_data = fts_data; + + mutex_lock(&ts_data->input_dev->mutex); + fts_read_reg(FTS_REG_GESTURE_EN, &val); + count = snprintf(buf, PAGE_SIZE, "Gesture Mode:%s\n", + ts_data->gesture_mode ? "On" : "Off"); + count += snprintf(buf + count, PAGE_SIZE, "Reg(0xD0)=%d\n", val); + mutex_unlock(&ts_data->input_dev->mutex); + + return count; +} + +static ssize_t fts_gesture_store( + struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct fts_ts_data *ts_data = fts_data; + + mutex_lock(&ts_data->input_dev->mutex); + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_DEBUG("enable gesture"); + ts_data->gesture_mode = ENABLE; + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_DEBUG("disable gesture"); + ts_data->gesture_mode = DISABLE; + } + mutex_unlock(&ts_data->input_dev->mutex); + + return count; +} + +static ssize_t fts_gesture_buf_show( + struct device *dev, struct device_attribute *attr, char *buf) +{ + int count = 0; + int i = 0; + struct input_dev *input_dev = fts_data->input_dev; + struct fts_gesture_st *gesture = &fts_gesture_data; + + mutex_lock(&input_dev->mutex); + count = snprintf(buf, PAGE_SIZE, "Gesture ID:%d\n", gesture->gesture_id); + count += snprintf(buf + count, PAGE_SIZE, "Gesture PointNum:%d\n", + gesture->point_num); + count += snprintf(buf + count, PAGE_SIZE, "Gesture Points Buffer:\n"); + + /* save point data,max:6 */ + for (i = 0; i < FTS_GESTURE_POINTS_MAX; i++) { + count += snprintf(buf + count, PAGE_SIZE, "%3d(%4d,%4d) ", i, + gesture->coordinate_x[i], gesture->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; +} + +static ssize_t fts_gesture_buf_store( + struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + return -EPERM; +} + + +/* sysfs gesture node + * read example: cat fts_gesture_mode ---read gesture mode + * write example:echo 1 > fts_gesture_mode --- write gesture mode to 1 + * + */ +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, +}; + +static int fts_create_gesture_sysfs(struct device *dev) +{ + int ret = 0; + + ret = sysfs_create_group(&dev->kobj, &fts_gesture_group); + if (ret) { + FTS_ERROR("gesture sys node create fail"); + sysfs_remove_group(&dev->kobj, &fts_gesture_group); + return ret; + } + + return 0; +} + +static void fts_gesture_report(struct input_dev *input_dev, int gesture_id) +{ + int gesture; + + FTS_DEBUG("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); + } +} + +/***************************************************************************** +* Name: fts_gesture_readdata +* Brief: Read information about gesture: enable flag/gesture points..., if ges- +* ture enable, save gesture points' information, and report to OS. +* It will be called this function every intrrupt when FTS_GESTURE_EN = 1 +* +* gesture data length: 1(enable) + 1(reserve) + 2(header) + 6 * 4 +* Input: ts_data - global struct data +* data - gesture data buffer if non-flash, else NULL +* Output: +* Return: 0 - read gesture data successfully, the report data is gesture data +* 1 - tp not in suspend/gesture not enable in TP FW +* -Exx - error +*****************************************************************************/ +int fts_gesture_readdata(struct fts_ts_data *ts_data, u8 *data) +{ + int ret = 0; + int i = 0; + int index = 0; + u8 buf[FTS_GESTURE_DATA_LEN] = { 0 }; + struct input_dev *input_dev = ts_data->input_dev; + struct fts_gesture_st *gesture = &fts_gesture_data; + + if (!ts_data->suspended || !ts_data->gesture_mode) { + return 1; + } + + + ret = fts_read_reg(FTS_REG_GESTURE_EN, &buf[0]); + if ((ret < 0) || (buf[0] != ENABLE)) { + FTS_DEBUG("gesture not enable in fw, don't process gesture"); + return 1; + } + + buf[2] = FTS_REG_GESTURE_OUTPUT_ADDRESS; + ret = fts_read(&buf[2], 1, &buf[2], FTS_GESTURE_DATA_LEN - 2); + if (ret < 0) { + FTS_ERROR("read gesture header data fail"); + return ret; + } + + /* init variable before read gesture point */ + memset(gesture->coordinate_x, 0, FTS_GESTURE_POINTS_MAX * sizeof(u16)); + memset(gesture->coordinate_y, 0, FTS_GESTURE_POINTS_MAX * sizeof(u16)); + gesture->gesture_id = buf[2]; + gesture->point_num = buf[3]; + FTS_DEBUG("gesture_id=%d, point_num=%d", + gesture->gesture_id, gesture->point_num); + + /* save point data,max:6 */ + for (i = 0; i < FTS_GESTURE_POINTS_MAX; i++) { + index = 4 * i + 4; + gesture->coordinate_x[i] = (u16)(((buf[0 + index] & 0x0F) << 8) + + buf[1 + index]); + gesture->coordinate_y[i] = (u16)(((buf[2 + index] & 0x0F) << 8) + + buf[3 + index]); + } + + /* report gesture to OS */ + fts_gesture_report(input_dev, gesture->gesture_id); + return 0; +} + +void fts_gesture_recovery(struct fts_ts_data *ts_data) +{ + if (ts_data->gesture_mode && ts_data->suspended) { + FTS_DEBUG("gesture recovery..."); + fts_write_reg(0xD1, 0xFF); + fts_write_reg(0xD2, 0xFF); + fts_write_reg(0xD5, 0xFF); + fts_write_reg(0xD6, 0xFF); + fts_write_reg(0xD7, 0xFF); + fts_write_reg(0xD8, 0xFF); + fts_write_reg(FTS_REG_GESTURE_EN, ENABLE); + } +} + +int fts_gesture_suspend(struct fts_ts_data *ts_data) +{ + int i = 0; + u8 state = 0xFF; + + FTS_FUNC_ENTER(); + if (enable_irq_wake(ts_data->irq)) { + FTS_DEBUG("enable_irq_wake(irq:%d) fail", ts_data->irq); + } + + for (i = 0; i < 5; i++) { + fts_write_reg(0xD1, 0xFF); + fts_write_reg(0xD2, 0xFF); + fts_write_reg(0xD5, 0xFF); + fts_write_reg(0xD6, 0xFF); + fts_write_reg(0xD7, 0xFF); + fts_write_reg(0xD8, 0xFF); + fts_write_reg(FTS_REG_GESTURE_EN, ENABLE); + msleep(1); + fts_read_reg(FTS_REG_GESTURE_EN, &state); + if (state == ENABLE) + break; + } + + if (i >= 5) + FTS_ERROR("make IC enter into gesture(suspend) fail,state:%x", state); + else + FTS_INFO("Enter into gesture(suspend) successfully"); + + FTS_FUNC_EXIT(); + return 0; +} + +int fts_gesture_resume(struct fts_ts_data *ts_data) +{ + int i = 0; + u8 state = 0xFF; + + FTS_FUNC_ENTER(); + if (disable_irq_wake(ts_data->irq)) { + FTS_DEBUG("disable_irq_wake(irq:%d) fail", ts_data->irq); + } + + for (i = 0; i < 5; i++) { + fts_write_reg(FTS_REG_GESTURE_EN, DISABLE); + msleep(1); + fts_read_reg(FTS_REG_GESTURE_EN, &state); + if (state == DISABLE) + break; + } + + if (i >= 5) + FTS_ERROR("make IC exit gesture(resume) fail,state:%x", state); + else + FTS_INFO("resume from gesture successfully"); + + FTS_FUNC_EXIT(); + return 0; +} + +int fts_gesture_init(struct fts_ts_data *ts_data) +{ + 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(ts_data->dev); + + memset(&fts_gesture_data, 0, sizeof(struct fts_gesture_st)); + ts_data->gesture_mode = FTS_GESTURE_EN; + + FTS_FUNC_EXIT(); + return 0; +} + +int fts_gesture_exit(struct fts_ts_data *ts_data) +{ + FTS_FUNC_ENTER(); + sysfs_remove_group(&ts_data->dev->kobj, &fts_gesture_group); + FTS_FUNC_EXIT(); + return 0; +} diff --git a/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_i2c.c b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_i2c.c new file mode 100644 index 000000000000..f2e335c3db4f --- /dev/null +++ b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_i2c.c @@ -0,0 +1,193 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2012-2019, FocalTech Systems, Ltd., all rights reserved. + * + * 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: Focaltech Driver Team +* +* Created: 2016-08-04 +* +* Abstract: i2c communication with TP +* +* Version: v1.0 +* +* Revision History: +* +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define I2C_RETRY_NUMBER 3 +#define I2C_BUF_LENGTH 256 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/***************************************************************************** +* functions body +*****************************************************************************/ +int fts_read(u8 *cmd, u32 cmdlen, u8 *data, u32 datalen) +{ + int ret = 0; + int i = 0; + struct fts_ts_data *ts_data = fts_data; + struct i2c_msg msg_list[2]; + struct i2c_msg *msg = NULL; + int msg_num = 0; + + /* must have data when read */ + if (!ts_data || !ts_data->client || !data || !datalen + || (datalen >= I2C_BUF_LENGTH) || (cmdlen >= I2C_BUF_LENGTH)) { + FTS_ERROR("fts_data/client/cmdlen(%d)/data/datalen(%d) is invalid", + cmdlen, datalen); + return -EINVAL; + } + + mutex_lock(&ts_data->bus_lock); + memset(&msg_list[0], 0, sizeof(struct i2c_msg)); + memset(&msg_list[1], 0, sizeof(struct i2c_msg)); + memcpy(ts_data->bus_tx_buf, cmd, cmdlen); + msg_list[0].addr = ts_data->client->addr; + msg_list[0].flags = 0; + msg_list[0].len = cmdlen; + msg_list[0].buf = ts_data->bus_tx_buf; + msg_list[1].addr = ts_data->client->addr; + msg_list[1].flags = I2C_M_RD; + msg_list[1].len = datalen; + msg_list[1].buf = ts_data->bus_rx_buf; + if (cmd && cmdlen) { + msg = &msg_list[0]; + msg_num = 2; + } else { + msg = &msg_list[1]; + msg_num = 1; + } + + for (i = 0; i < I2C_RETRY_NUMBER; i++) { + ret = i2c_transfer(ts_data->client->adapter, msg, msg_num); + if (ret < 0) { + FTS_ERROR("i2c_transfer(read) fail,ret:%d", ret); + } else { + memcpy(data, ts_data->bus_rx_buf, datalen); + break; + } + } + + mutex_unlock(&ts_data->bus_lock); + return ret; +} + +int fts_write(u8 *writebuf, u32 writelen) +{ + int ret = 0; + int i = 0; + struct fts_ts_data *ts_data = fts_data; + struct i2c_msg msgs; + + if (!ts_data || !ts_data->client || !writebuf || !writelen + || (writelen >= I2C_BUF_LENGTH)) { + FTS_ERROR("fts_data/client/data/datalen(%d) is invalid", writelen); + return -EINVAL; + } + + mutex_lock(&ts_data->bus_lock); + memset(&msgs, 0, sizeof(struct i2c_msg)); + memcpy(ts_data->bus_tx_buf, writebuf, writelen); + msgs.addr = ts_data->client->addr; + msgs.flags = 0; + msgs.len = writelen; + msgs.buf = ts_data->bus_tx_buf; + for (i = 0; i < I2C_RETRY_NUMBER; i++) { + ret = i2c_transfer(ts_data->client->adapter, &msgs, 1); + if (ret < 0) { + FTS_ERROR("i2c_transfer(write) fail,ret:%d", ret); + } else { + break; + } + } + mutex_unlock(&ts_data->bus_lock); + return ret; +} + +int fts_read_reg(u8 addr, u8 *value) +{ + return fts_read(&addr, 1, value, 1); +} + +int fts_write_reg(u8 addr, u8 value) +{ + u8 buf[2] = { 0 }; + + buf[0] = addr; + buf[1] = value; + return fts_write(buf, sizeof(buf)); +} + +int fts_bus_init(struct fts_ts_data *ts_data) +{ + FTS_FUNC_ENTER(); + ts_data->bus_tx_buf = kzalloc(I2C_BUF_LENGTH, GFP_KERNEL); + if (NULL == ts_data->bus_tx_buf) { + FTS_ERROR("failed to allocate memory for bus_tx_buf"); + return -ENOMEM; + } + + ts_data->bus_rx_buf = kzalloc(I2C_BUF_LENGTH, GFP_KERNEL); + if (NULL == ts_data->bus_rx_buf) { + FTS_ERROR("failed to allocate memory for bus_rx_buf"); + return -ENOMEM; + } + FTS_FUNC_EXIT(); + return 0; +} + +int fts_bus_exit(struct fts_ts_data *ts_data) +{ + FTS_FUNC_ENTER(); + if (ts_data && ts_data->bus_tx_buf) { + kfree(ts_data->bus_tx_buf); + ts_data->bus_tx_buf = NULL; + } + + if (ts_data && ts_data->bus_rx_buf) { + kfree(ts_data->bus_rx_buf); + ts_data->bus_rx_buf = NULL; + } + FTS_FUNC_EXIT(); + return 0; +} \ No newline at end of file diff --git a/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_point_report_check.c b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_point_report_check.c new file mode 100644 index 000000000000..1296af1551db --- /dev/null +++ b/drivers/input/touchscreen/focaltech_touch_ft5436/focaltech_point_report_check.c @@ -0,0 +1,135 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2012-2019, FocalTech Systems, Ltd., all rights reserved. + * + * 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: Focaltech Driver Team +* +* Created: 2016-11-16 +* +* Abstract: point report check function +* +* Version: v1.0 +* +* Revision History: +* +*****************************************************************************/ + +/***************************************************************************** +* 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; + u32 max_touches = fts_data->pdata->max_touch_number; +#endif + + FTS_FUNC_ENTER(); + mutex_lock(&ts_data->report_mutex); + +#if FTS_MT_PROTOCOL_B_EN + for (finger_count = 0; finger_count < max_touches; 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_sync(&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/focaltech_touch_ft5436/include/firmware/fw_sample.h b/drivers/input/touchscreen/focaltech_touch_ft5436/include/firmware/fw_sample.h new file mode 100644 index 000000000000..60120df3213d --- /dev/null +++ b/drivers/input/touchscreen/focaltech_touch_ft5436/include/firmware/fw_sample.h @@ -0,0 +1,3223 @@ +0x2, 0x20,0x7, 0x2, 0xb9,0xe2,0xeb,0xaa,0x8, 0x22,0x22,0x2, 0x0, 0x4a,0xb4,0x2, +0x4, 0xa9,0xb7,0xea,0x22,0x24,0xff,0xa9,0x97,0xea,0x22,0x2, 0x68,0x1c,0xb4,0x2, +0x4, 0xa9,0xb6,0xea,0x22,0x24,0xff,0xa9,0x96,0xea,0x22,0x2, 0x88,0x1c,0x7f,0x60, +0xa9,0xc2,0xea,0x74,0x1, 0x12,0x13,0xcb,0x7f,0x6, 0x12,0x5, 0xb4,0x7f,0x6, 0x2, +0x9, 0xa1,0x22,0x2, 0x88,0x38,0xe4,0x2, 0x2a,0x20,0x32,0x2, 0x0, 0x5a,0x12,0x10, +0xa2,0x2, 0x13,0xae,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x2, 0x0, 0x76,0x1, 0x2, +0x4, 0x8, 0x10,0x20,0x40,0x80,0x2, 0x3c,0x93,0x32,0xff,0x2, 0x0, 0x69,0xb2,0x86, +0x22,0xff,0xff,0x2, 0x10,0x52,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0xf, 0x7e,0xf, 0x3b,0x10, +0x69,0x30,0x0, 0x4, 0x7a,0x73,0x3b,0x20,0x7e,0x73,0x3b,0x20,0xa, 0x37,0x5e,0x34, +0x0, 0x4, 0x68,0x4, 0xd2,0xe, 0x80,0x2, 0xc2,0xe, 0x7e,0x34,0x0, 0x1f,0x79,0x30, +0x0, 0x4, 0xc2,0xc3,0x12,0x12,0xd3,0x12,0x89,0xef,0x7e,0x1f,0x3b,0x10,0x69,0x31, +0x0, 0x2, 0x5e,0x34,0x0, 0x40,0x68,0x2e,0x6c,0xaa,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x1f,0x3b,0x10,0x7f,0x71,0x2d,0xf0,0x69,0x17,0x0, 0x9c,0x59,0x10,0x3b,0x14,0xb, +0xa0,0xbe,0xa0,0x3, 0x78,0xe4,0x69,0x11,0x0, 0xa4,0x7a,0x17,0x3b,0x1c,0x69,0x31, +0x0, 0xa2,0x7a,0x37,0x3b,0x1a,0xa9,0xc1,0xc4,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7d,0x13, +0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10,0xc2,0xc6,0xd2,0xee,0x22,0xff,0xff,0x54,0x2c, +0xca,0x79,0x7f,0x50,0x7c,0xeb,0x7e,0x34,0x0, 0x24,0x7e,0x8, 0x0, 0x2c,0x7e,0x24, +0x0, 0x2, 0x12,0x69,0x9f,0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x4a,0xe5,0x2c, +0xbe,0xb0,0x76,0x28,0x2, 0x21,0x4a,0x7e,0xe1,0x2c,0xbe,0xe0,0x76,0x38,0x2, 0x21, +0x78,0x7e,0x34,0x1e,0x7a,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x5e,0x79,0x35,0x0, +0x4, 0xbe,0xe0,0x81,0x68,0x2, 0x21,0x71,0x74,0x23,0x7a,0x5b,0xb0,0x74,0x1c,0x61, +0x84,0x74,0x1, 0x7a,0x5b,0xb0,0x61,0x84,0x7c,0xbe,0x14,0xbe,0xb0,0x75,0x40,0x2, +0x61,0x33,0x7e,0xa0,0x3, 0xa4,0x2e,0x54,0x1, 0x8c,0x89,0x54,0x2, 0x2, 0xfb,0x2, +0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xed,0x2, 0x2, +0xfb,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x25,0x2, 0x3, 0x33,0x2, 0x3, 0x9, 0x2, +0x2, 0xfb,0x2, 0x3, 0x17,0x2, 0x3, 0x17,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x41,0xfb,0x7e,0x34,0x1e, +0x7a,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x17,0x61,0x3f,0x7e,0x34,0x1e,0x4e,0x79, +0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x5e,0x61,0x3f,0x7e,0x34,0x1e,0x4e,0x79,0x35,0x0, +0x2, 0x7e,0x34,0x1d,0xe7,0x61,0x3f,0x7e,0x34,0x1d,0xcb,0x79,0x35,0x0, 0x2, 0x7e, +0x34,0x1d,0xfb,0x61,0x3f,0x7e,0x34,0x1e,0x3f,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e, +0x26,0x61,0x3f,0x7e,0x34,0x1e,0x7a,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x5e,0x79, +0x35,0x0, 0x4, 0xbe,0xe0,0x16,0x28,0x2, 0x61,0x4e,0x7c,0xfe,0x61,0x62,0x7e,0xf0, +0x16,0xbe,0xe0,0x72,0x50,0x2, 0x61,0x62,0xa, 0x3e,0x9e,0x34,0x0, 0x72,0xb, 0x34, +0x2c,0xf7,0x7e,0x70,0x3, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x1e,0x9e,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7a,0x5b,0xb0,0x2e,0x34,0x1e,0x9f,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x39,0xb5,0x0, 0x1, 0xda,0x79,0x22,0xca,0x3b,0x7f,0x30,0x74, +0x1, 0x12,0x14,0x13,0x29,0x73,0x0, 0xf3,0x2e,0x70,0xff,0x92,0x1, 0x29,0xb3,0x0, +0xf4,0x12,0x13,0xe4,0x7f,0x3, 0x12,0xd, 0x72,0x7f,0x3, 0x12,0x6, 0xba,0x29,0x73, +0x0, 0xa, 0xa, 0x37,0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, 0x24,0x29,0x73,0x0, 0xa3, +0xa, 0x27,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x69,0x33,0x0, 0xff,0x4d,0x32,0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, 0x2, 0x29,0x73, +0x0, 0xa, 0xa, 0x47,0x29,0x73,0x0, 0x5, 0xa, 0x57,0x9d,0x54,0xf5,0x35,0x29,0xb3, +0x0, 0xa5,0x70,0xb, 0x29,0xb3,0x0, 0xf8,0x29,0x73,0x0, 0xf7,0x12,0xb, 0xad,0x29, +0x73,0x0, 0xa5,0x2e,0x70,0xff,0x92,0x1, 0xe5,0x35,0x12,0xb, 0x1e,0x69,0x33,0x0, +0xfd,0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, 0x28,0x69,0x23,0x0, 0xfb,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x29,0x73,0x0, 0xfa,0xa, 0x37,0x2d, +0x32,0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, 0x2a,0x29,0x73,0x0, 0xf9,0xa, 0x37,0x7e, +0xf, 0x3b,0x10,0x79,0x30,0x0, 0x2c,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3b,0x10,0x79, +0x30,0x0, 0x34,0x7e,0x34,0x1, 0xb, 0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, 0x2e,0x29, +0x73,0x0, 0x5, 0xa, 0x37,0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, 0x10,0x69,0x33,0x0, +0xa8,0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, 0x1c,0x69,0x33,0x0, 0xaa,0x7e,0xf, 0x3b, +0x10,0x79,0x30,0x0, 0x1e,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x69,0x13,0x1, 0x1, +0x2d,0x12,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x7e,0xf, 0x3b,0x10,0x2d,0x12,0x79, +0x30,0x0, 0x44,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0xda,0x3b,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,0x21,0x16,0x7f,0x7, 0x12, +0xe, 0xed,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, 0x7e,0xf, 0x3, 0xfc,0x79,0x30,0x0, 0x4, 0x7c,0x4f,0x6c,0x55,0xa, 0x3f,0x2d, +0x32,0x7e,0xf, 0x3, 0xfc,0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x3, 0xfc,0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xf, 0x45,0x6c,0xaa,0xbe,0xa0,0x4, 0x50,0x18, +0x7e,0x70,0x4, 0xac,0x7a,0x7c,0xb7,0x7e,0x1f,0x3, 0xfc,0x69,0x41,0x0, 0x26,0x60, +0x42,0x1e,0x44,0x14,0x78,0xfb,0x80,0x3b,0xbe,0xa0,0x8, 0x50,0x1b,0xa, 0x3a,0x1b, +0x36,0x3e,0x34,0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x3, 0xfc,0x69,0x41,0x0, 0x28,0x60, +0x22,0x1e,0x44,0x14,0x78,0xfb,0x80,0x1b,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x3e,0x34, +0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x3, 0xfc,0x69,0x41,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,0x8d,0xa9,0xc6, +0xcb,0xda,0xf8,0x22,0x29,0x70,0x0, 0x96,0x29,0x90,0x0, 0x98,0x29,0x60,0x0, 0x97, +0x29,0x80,0x0, 0x8d,0xbe,0x80,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe,0x80,0x8, +0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x80,0x10,0x38,0x5, 0x7e,0xa0,0x2, 0x80, +0xd, 0xbe,0x80,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, 0xbe,0x90, +0x3, 0x28,0x3, 0x7e,0x90,0x3, 0xbe,0x80,0x3f,0x28,0x3, 0x7e,0x80,0x3f,0xbe,0x60, +0x1, 0x28,0x3, 0x7e,0x60,0x1, 0xbe,0x70,0x2, 0x28,0x2, 0x6c,0x77,0xa, 0x28,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7c,0x89,0x6c,0x99,0x3e,0x44,0x3e, +0x44,0x3e,0x44,0x2d,0x42,0xa, 0x26,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x24,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, +0x2, 0x29,0xb0,0x0, 0x8c,0x7c,0x4b,0x6c,0x55,0x29,0xb0,0x0, 0x8b,0xa, 0x3b,0x2d, +0x32,0x7e,0x7f,0x3b,0x8, 0x79,0x37,0x0, 0x80,0x69,0x30,0x0, 0xa0,0x7e,0x7f,0x33, +0xfc,0x79,0x37,0x0, 0xc, 0x69,0x30,0x0, 0x9e,0x5e,0x34,0xe0,0xf, 0x29,0xb0,0x0, +0x8c,0xa, 0x2b,0x1b,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x32,0x7e, +0x7f,0x3b,0x8, 0x79,0x37,0x0, 0x82,0xa, 0x2a,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x29,0xb0,0x0, 0x99,0xa, 0x3b,0x2d,0x32,0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, +0x6, 0x69,0x30,0x0, 0x9c,0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0x8, 0x69,0x30,0x0, +0x9a,0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0xa, 0x22,0x7f,0x60,0x74,0x1, 0x12,0x14, +0x13,0x29,0x36,0x0, 0xf5,0x29,0x26,0x0, 0xa3,0x29,0x16,0x0, 0xa4,0xbe,0x20,0x2, +0x28,0x3, 0x7e,0x20,0x2, 0xbe,0x10,0x40,0x28,0x3, 0x7e,0x10,0x40,0x7e,0x34,0x0, +0x4, 0x7c,0xb2,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x7, 0xa, 0x31,0x7e,0x2f, +0x3b,0x10,0x79,0x32,0x0, 0x12,0x7c,0x73,0xac,0x70,0xa, 0x21,0x12,0x1e,0xee,0x7c, +0x27,0xa, 0x32,0x7e,0x2f,0x3b,0x10,0x79,0x32,0x0, 0x14,0x7c,0x73,0xac,0x70,0x29, +0x26,0x0, 0xf6,0xa, 0x22,0xad,0x32,0xa, 0x21,0x8d,0x32,0x7d,0x43,0x7c,0x73,0xac, +0x70,0xa, 0x21,0x12,0x1e,0xee,0x7c,0xa7,0x7c,0x2a,0x7c,0xb9,0x2c,0xab,0xbe,0xa0, +0xc, 0x50,0x3, 0x7e,0xa0,0xc, 0xbe,0x20,0xc, 0x50,0x3, 0x7e,0x20,0xc, 0xa, 0x20, +0xa, 0x31,0x12,0x1e,0xee,0x7d,0xe3,0xa, 0x3a,0xb, 0x34,0xad,0x3e,0xb, 0x34,0xbe, +0x34,0x2, 0x0, 0x40,0x4, 0x7e,0x34,0x1, 0xff,0x29,0x46,0x0, 0xf7,0x7e,0x50,0x2, +0xac,0x45,0xa, 0xf2,0xad,0xfe,0x2d,0x2f,0xb, 0x24,0xbe,0x24,0x2, 0x0, 0x40,0x4, +0x7e,0x24,0x1, 0xff,0xa, 0x13,0x7e,0x7f,0x3b,0x10,0x79,0x17,0x0, 0xa, 0x1e,0x24, +0x7c,0x45,0x6c,0x55,0x1e,0x34,0x2d,0x32,0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, 0xc, +0xa, 0x3a,0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30, +0x0, 0x4, 0x7e,0x2f,0x3, 0xfc,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f, +0x3, 0xfc,0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x3, 0xfc,0x79,0x32, +0x0, 0x8, 0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d, +0x32,0x7e,0x2f,0x3, 0xfc,0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e, +0xf, 0x3, 0xfc,0x79,0x30,0x0, 0xe, 0x6d,0x11,0x7e,0x1f,0x3, 0xfc,0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xe0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xb2,0x82,0x22,0xff,0xff, +0x7f,0x21,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x3, 0xfc,0x79,0x37,0x0, +0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x7f,0x3, 0xfc,0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, +0x6, 0x7e,0x7f,0x3, 0xfc,0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c, +0x55,0x7e,0xb, 0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x3, 0xfc,0x79,0x37,0x0, 0xc, +0x29,0x70,0x0, 0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x3, 0xfc,0x79,0x37,0x0, 0xa, +0x69,0x30,0x0, 0xa, 0x7e,0x7f,0x3, 0xfc,0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, +0x7e,0x7f,0x3, 0xfc,0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x3, 0xfc, +0x79,0x37,0x0, 0x12,0x29,0x70,0x0, 0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x3, 0xfc, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0,0x12,0xf, 0x45,0x7e,0x1f,0x3, 0xfc,0x69,0x11, +0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11,0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, +0x16,0x79,0x12,0x0, 0x2, 0x69,0x11,0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, +0x22,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, +0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31,0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb, +0x22,0xca,0x3b,0x7c,0x57,0x7c,0x4b,0x5e,0x40,0x3, 0x69,0x30,0x0, 0x4, 0x5e,0x60, +0x3f,0x6c,0xaa,0xa, 0x4a,0x69,0xf0,0x0, 0xa, 0x69,0xe0,0x0, 0x8, 0x2d,0xf4,0x7e, +0x7b,0xb0,0xa, 0xfb,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0xa, 0xea,0x69,0xd0, +0x0, 0xe, 0x69,0xc0,0x0, 0xc, 0x2d,0xde,0x7e,0x6b,0xb0,0xa, 0x4b,0x2d,0x4f,0x7e, +0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, 0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0, +0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x33,0xf8,0x2d,0xfd,0x79,0x47,0x1, 0x8c,0xb, 0xa0, +0xbe,0xa0,0xe, 0x78,0xae,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x69,0xf0,0x0, 0x2, +0xb, 0xa, 0xe0,0x2d,0xf4,0xb, 0x7a,0x40,0x7e,0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, +0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0,0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x33, +0xf8,0x2d,0xfd,0x79,0x47,0x1, 0x80,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xc9,0x7e,0x90, +0xf0,0xac,0x94,0x74,0x28,0xac,0xb5,0x7d,0xf5,0x2d,0xf4,0x7e,0x2f,0x33,0xf8,0x2d, +0x5f,0x79,0x32,0x1, 0x88,0x69,0x30,0x0, 0x6, 0x7e,0x30,0xf0,0xac,0x34,0x74,0x28, +0xac,0x5b,0x2d,0x21,0x7e,0xf, 0x33,0xf8,0x2d,0x12,0x79,0x30,0x1, 0x8a,0xda,0x3b, +0x22,0x29,0x60,0x0, 0xb, 0xa, 0x46,0x29,0x60,0x0, 0x4, 0xa, 0x26,0x2d,0x24,0x7c, +0x65,0x29,0xb0,0x0, 0x6, 0xbc,0xb6,0x28,0x2, 0x7c,0x6b,0x29,0x70,0x0, 0x5, 0x29, +0xb0,0x0, 0x7, 0xbc,0xb7,0x28,0x2, 0x7c,0x7b,0x6c,0xaa,0x6d,0x22,0x7e,0x90,0x2, +0xac,0x9a,0x7e,0x7f,0x3b,0x8, 0x2d,0xf4,0x79,0x27,0x0, 0x2, 0xb, 0xa0,0xbe,0xa0, +0x23,0x78,0xea,0x6c,0xaa,0x80,0x55,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x57,0x0, +0x4c,0xbe,0x50,0x23,0x50,0x23,0x29,0x47,0x0, 0xb4,0xa, 0xd4,0x7d,0x4d,0x7c,0x89, +0x6c,0x99,0x7d,0xd4,0x7e,0x90,0x2, 0xac,0x95,0x7e,0x7f,0x3b,0x8, 0x2d,0xf4,0xb, +0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xa, 0x4a,0x7f,0x70,0x2d,0xf4,0x29, +0x47,0x0, 0x4c,0xa, 0xd4,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x3b,0x8, 0x2d,0xf4, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0xa0,0xbc,0x6a,0x38,0xa7, +0x6c,0xaa,0x80,0x1d,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x67,0x0, 0x6f,0xa, 0x46, +0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x3b,0x8, 0x2d,0xf2,0x79,0x47,0x0, 0x48,0xb, +0xa0,0xbc,0x7a,0x38,0xdf,0x22,0x7c,0x7b,0x7e,0x7f,0x3b,0x10,0x69,0x47,0x0, 0xc, +0x6c,0x88,0x3e,0x44,0x69,0x7, 0x0, 0xa, 0x69,0x57,0x0, 0x2, 0x1e,0x54,0x1e,0x54, +0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x3, 0x7e,0x14, +0x0, 0x4, 0x70,0x2, 0x41,0x9b,0x3e,0x14,0x14,0x78,0xfb,0x7c,0xa3,0xa, 0xda,0xad, +0xd0,0x7d,0xcd,0x6d,0x11,0x79,0x17,0x0, 0x8c,0x7c,0xb7,0x70,0x2, 0x41,0xb4,0x1e, +0xd4,0x14,0x78,0xfb,0xbe,0xd4,0x1, 0x0, 0x38,0x2, 0x41,0xc2,0x7e,0xd4,0x1, 0x0, +0x41,0xce,0xbe,0xd4,0x0, 0x10,0x40,0x2, 0x41,0xce,0x7e,0xd4,0x0, 0x10,0x7d,0x3d, +0x12,0x12,0x9f,0xa, 0x1b,0x7e,0x1f,0x3b,0x10,0x79,0x11,0x0, 0x90,0x7e,0x1f,0x3b, +0x10,0x79,0xd1,0x0, 0x8e,0x7e,0x7f,0x3b,0x10,0x69,0x37,0x0, 0x8, 0xad,0x3c,0x8d, +0x3d,0x79,0x37,0x0, 0x92,0x7e,0x14,0x0, 0x6, 0x7e,0x1f,0x3b,0x10,0x79,0x11,0x0, +0x94,0x7d,0x24,0x9d,0x20,0xa, 0x3a,0xad,0x32,0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, +0x96,0x7e,0x34,0x0, 0x10,0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, 0x98,0x22,0x7c,0x5b, +0x7e,0xf, 0x3b,0x10,0x69,0x40,0x0, 0x22,0x30,0x1, 0x6b,0x6d,0xff,0x7d,0x3f,0xbe, +0x50,0x10,0x28,0x2e,0x7e,0x54,0xff,0xff,0x79,0x50,0x0, 0x42,0x9e,0x50,0x10,0x6c, +0xaa,0x80,0x11,0x7e,0xe4,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb, +0x2d,0x3e,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e,0x6f,0x3b,0x10,0x79,0x36,0x0, 0x40, +0x80,0x25,0x79,0xf0,0x0, 0x40,0x6c,0xaa,0x80,0x11,0x7e,0xf4,0x0, 0x1, 0x7c,0xba, +0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x2d,0x3f,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e, +0x7f,0x3b,0x10,0x79,0x37,0x0, 0x42,0x7d,0x34,0x2e,0x34,0x0, 0xc, 0x7e,0x7f,0x3b, +0x10,0x79,0x37,0x0, 0x16,0x22,0x6d,0x33,0x79,0x30,0x0, 0x40,0x7e,0xf, 0x3b,0x10, +0x79,0x30,0x0, 0x42,0x7e,0x1f,0x3b,0x10,0x79,0x41,0x0, 0x16,0x22,0x7c,0x17,0x7c, +0x3b,0x6d,0x33,0x7e,0x2f,0x3b,0x10,0x79,0x32,0x0, 0x40,0x7e,0x2f,0x3b,0x10,0x79, +0x32,0x0, 0x42,0x7e,0x7f,0x3b,0x10,0x69,0x57,0x0, 0x12,0x7c,0xab,0x69,0x37,0x0, +0x2, 0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x5e, +0x34,0x0, 0x3, 0x7c,0xb7,0x7e,0x44,0x0, 0x4, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7c,0x29,0xa, 0x22,0xa, 0x3a,0x12,0x1e,0xee,0xa, 0x23,0x2d,0x32,0x7c,0xb7,0x7c, +0x61,0x6c,0x77,0xa, 0xb, 0x1e,0x4, 0x2d,0x3, 0x79,0x7, 0x0, 0xc, 0x7c,0x73,0xac, +0x72,0xa, 0x2a,0x12,0x1e,0xee,0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, 0x16,0x6d,0x33, +0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, +0x7e,0x2f,0x3, 0xfc,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x3, 0xfc, +0x79,0x32,0x0, 0x8, 0x29,0x70,0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, +0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x3, 0xfc,0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x3, 0xfc,0x79,0x32,0x0, +0xa, 0x29,0x70,0x0, 0x4, 0xa, 0x37,0x7e,0x2f,0x3, 0xfc,0x79,0x32,0x0, 0xe, 0x29, +0xb0,0x0, 0x5, 0x54,0x1, 0x7c,0x2b,0x6c,0x33,0x7e,0x1f,0x3, 0xfc,0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xc0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xca,0x79,0x7c,0xab,0x5e, +0xa0,0x3, 0x6c,0x77,0x7e,0x50,0x2, 0xac,0x57,0x69,0xd0,0x0, 0xe, 0x69,0xc0,0x0, +0xc, 0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d, +0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e,0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e, +0x7f,0x33,0xf8,0x2d,0xf2,0x79,0x47,0x2, 0x54,0xb, 0x70,0xbe,0x70,0xe, 0x40,0xc4, +0x69,0x40,0x0, 0x4, 0x7e,0xf0,0xf0,0xac,0xfa,0x7e,0x1f,0x33,0xf8,0x2d,0x37,0x79, +0x41,0x2, 0x50,0x69,0x30,0x0, 0x6, 0x74,0xf0,0xa4,0x7e,0xf, 0x33,0xf8,0x2d,0x15, +0x79,0x30,0x2, 0x52,0xda,0x79,0x22,0xa9,0xd6,0xcb,0xc2,0x1c,0x69,0x30,0x0, 0x4, +0x7e,0x2f,0x3, 0xfc,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x3, 0xfc, +0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x3, 0xfc,0x79,0x32,0x0, 0x8, +0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e, +0x2f,0x3, 0xfc,0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x3, +0xfc,0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4, +0x7e,0x1f,0x3, 0xfc,0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xf, 0x45,0xa9,0xc6, +0xcb,0x22,0x69,0x30,0x0, 0xae,0x7e,0x2f,0x3b,0x10,0x79,0x32,0x0, 0x6, 0x29,0x50, +0x0, 0xa6,0xa, 0x55,0x7d,0x23,0x1e,0x24,0x9d,0x25,0x7e,0x2f,0x3b,0x10,0x79,0x22, +0x0, 0x18,0x7d,0x23,0x1e,0x24,0x1b,0x25,0x7e,0x2f,0x3b,0x10,0x79,0x22,0x0, 0x38, +0x69,0x20,0x0, 0xfd,0x1e,0x34,0x9d,0x32,0x9e,0x34,0x0, 0xa, 0x7e,0x2f,0x3b,0x10, +0x79,0x32,0x0, 0x26,0x29,0x70,0x0, 0xa7,0xa, 0x37,0x7e,0x2f,0x3b,0x10,0x79,0x32, +0x0, 0x1a,0x29,0x70,0x0, 0xb, 0xa, 0x27,0x29,0x70,0x0, 0x4, 0x2d,0x32,0x7e,0x2f, +0x3b,0x10,0x79,0x32,0x0, 0x8, 0x2, 0x9, 0xa1,0xca,0x3b,0xf5,0x24,0x7f,0x41,0x7f, +0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0xe5,0x24,0xbe,0xb0,0x23,0x28, +0x3, 0x75,0x24,0x23,0x6c,0xaa,0x80,0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b, +0xb0,0xbe,0xb1,0x26,0x40,0xd, 0x74,0x23,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, +0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, 0x3b,0x2e,0x35,0x28,0x7a,0x71,0x82,0x7a,0x61, +0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13,0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24, +0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f, +0x3, 0xfc,0x79,0x22,0x0, 0x4, 0x69,0x20,0x0, 0x8, 0x7e,0x2f,0x3, 0xfc,0x79,0x22, +0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55,0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25, +0x2d,0x25,0x7e,0x2f,0x3, 0xfc,0x79,0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25, +0x7e,0xf, 0x3, 0xfc,0x79,0x20,0x0, 0xe, 0x7e,0xf, 0x3, 0xfc,0x79,0x30,0x0, 0xa, +0x6d,0x11,0x7e,0x1f,0x3, 0xfc,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xf, 0x45, +0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x33,0xfc,0x79,0x30, +0x0, 0xe, 0xc2,0x1b,0xe4,0x7a,0xb3,0x33,0xf7,0x5e,0xa0,0x3, 0xa, 0x1a,0x3e,0x14, +0x7e,0x1f,0x3b,0x8, 0x1b,0x1a,0x10,0x7e,0xf, 0x3b,0x8, 0x2e,0x14,0x0, 0x84,0xb, +0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x74,0x1, 0x12,0x13,0x8b,0x7e,0xf, 0x33, +0xfc,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xa9,0xd3,0xcd,0x7e,0xf, 0x33, +0xfc,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x22,0x7f,0x10,0xa9, +0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e,0x2f,0x3, 0xfc,0x79,0x12,0x0, 0x4, 0x69,0x11, +0x0, 0x4, 0x7e,0x2f,0x3, 0xfc,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f, +0x3, 0xfc,0x79,0x12,0x0, 0x8, 0x7e,0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad, +0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x3, 0xfc,0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x3, 0xfc,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xf, +0x45,0xa9,0xc6,0xcb,0x22,0xa9,0xd7,0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x3, +0xfc,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x3, 0xfc,0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, 0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7, +0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0xd2,0x1c,0x7e,0xf, 0x3, 0xfc,0xb, 0xa, 0x30, +0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe,0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x3, 0xfc,0x1b,0x1a,0x10,0x22,0xca,0x3b,0xf5,0x24, +0x7f,0x41,0x7f,0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0xbe,0xb1,0x27,0x40,0xd, 0x74, +0x1c,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, 0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, +0x3b,0x2e,0x35,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13, +0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24,0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22, +0x5, 0x63,0x31,0x20,0x18,0x13,0xf, 0xd, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, +0xca,0xf8,0x7d,0xe2,0x7d,0xd3,0x7c,0xfb,0xbe,0x30,0x1, 0x28,0x6, 0x7e,0xf4,0x0, +0x10,0x80,0xf, 0xbe,0x30,0x0, 0x28,0x6, 0x7e,0xf4,0x0, 0x8, 0x80,0x4, 0x7e,0xf4, +0x0, 0x4, 0x7d,0x1f,0x6d,0x0, 0x6d,0x33,0x7e,0x24,0x0, 0x10,0x12,0x1f,0x8d,0x7f, +0x1, 0x7d,0x3d,0x6d,0x22,0x12,0x1f,0x20,0x7d,0x1e,0x12,0x1f,0x3a,0x74,0x4, 0xac, +0xbf,0x7e,0xf, 0x3b,0x10,0x2d,0x15,0x79,0x30,0x0, 0x82,0x79,0x20,0x0, 0x80,0xda, +0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, +0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0x1b,0x7e,0xf, 0x33,0xfc,0xb, 0xa, 0x30,0x7c, +0x57,0x7a,0x53,0x33,0xf7,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xc2,0xc6,0x6d,0x33,0x7e, +0xf, 0x33,0xfc,0x79,0x30,0x0, 0xe, 0x12,0x12,0xd3,0x12,0x89,0xef,0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x74,0x3, 0x12,0x13,0x8b,0xa9,0xd1,0xc4,0x7e,0xf, 0x3b,0x8, 0x2e,0x14, +0x0, 0x84,0xb, 0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x7e,0x14,0x0, 0x1, 0x7e, +0x1f,0x3b,0x8, 0x1b,0x1a,0x10,0x7e,0xf, 0x3b,0x10,0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0xc2,0xf, 0xe4,0x7a,0xb3,0x3b,0x20,0x7e,0x1f,0x3b,0x8, +0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0x74,0x2, 0x2, 0x13,0x8b,0x7c,0x6b, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x33,0xf8,0x2d,0xf4,0xb, +0x7a,0x20,0x7f,0x70,0x2d,0xf4,0x1b,0x7a,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xe5,0x6c, +0xaa,0x80,0x20,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x33,0xf8,0x2d,0xf2,0x69,0x27, +0x0, 0x38,0xa, 0xf7,0xa, 0x4a,0x2d,0x4f,0x3e,0x44,0x7f,0x70,0x2d,0xf4,0x1b,0x7a, +0x20,0xb, 0xa0,0xbc,0x6a,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x5e,0xa0,0x3, 0x6c, +0x77,0x7e,0x50,0x2, 0xac,0x57,0x7f,0x60,0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6, +0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e, +0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e,0x7f,0x33,0xf8,0x2d,0xf2,0x79,0x47,0x2, 0x54, +0xb, 0x70,0xbe,0x70,0xe, 0x40,0xca,0xda,0x79,0x22,0x29,0x50,0x0, 0xf5,0xac,0x5b, +0x7e,0xf, 0x3b,0x10,0x69,0x30,0x0, 0xc, 0xa, 0x56,0x3e,0x54,0xbe,0x24,0x2, 0x0, +0x40,0x4, 0x7e,0x24,0x1, 0xff,0xbd,0x25,0x28,0x1f,0x2e,0x14,0x0, 0xc, 0x6c,0x66, +0x1b,0xa, 0x30,0x1e,0x24,0x7c,0x45,0x6c,0x55,0x7e,0xf, 0x3b,0x10,0x2e,0x14,0x0, +0xc, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50, +0x28,0xac,0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d, +0x24,0x7e,0x7f,0x33,0xf8,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x44,0xa, 0x4a,0x7f, +0x60,0x2d,0xd4,0x7e,0x6b,0xb0,0x7c,0x8b,0x6c,0x99,0x4d,0x24,0x79,0x27,0x1, 0x8c, +0xb, 0xa0,0xbe,0xa0,0xe, 0x40,0xc7,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50,0x28,0xac, +0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d,0x24,0x7e, +0x7f,0x33,0xf8,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x55,0xa, 0x4a,0x7f,0x60,0x2d, +0xd4,0x7e,0x6b,0xb0,0xa, 0x4b,0x4d,0x24,0x79,0x27,0x1, 0x8c,0xb, 0xa0,0xbe,0xa0, +0xe, 0x40,0xc9,0x22,0xa9,0xd6,0xcb,0x54,0x3f,0x5e,0x70,0x1f,0x7c,0x2b,0x6c,0x33, +0x3e,0x14,0x3e,0x14,0x2e,0x14,0x0, 0x5, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x2d,0x31,0x7e,0xf, 0x3, 0xfc,0x79,0x30,0x0, 0x2, 0x7e,0xf, +0x3, 0xfc,0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x22,0x12,0x5f,0xfc,0x7c,0x6b,0x12, +0xbd,0x89,0x7c,0x7b,0x6c,0xaa,0xbe,0x60,0x15,0x68,0x4, 0xa5,0xbf,0x15,0x1f,0xbc, +0x76,0x68,0x5, 0x7e,0xa0,0xf1,0x80,0xb, 0x12,0xbf,0xae,0xbe,0xb0,0x51,0x68,0x3, +0x7e,0xa0,0xf2,0x7c,0xba,0x12,0xbf,0xa9,0x4c,0xaa,0x68,0x2, 0x80,0xfe,0x22,0x7d, +0x23,0x6c,0x66,0x7e,0x30,0x2, 0xac,0x36,0x2e,0x14,0x20,0xc7,0x7a,0x31,0x82,0x7a, +0x21,0x83,0xe4,0x93,0xa, 0x1b,0xbd,0x12,0x28,0x7, 0xb, 0x60,0xbe,0x60,0x14,0x40, +0xe2,0x7e,0x70,0x2, 0xac,0x67,0x2e,0x34,0x20,0xc8,0x7a,0x71,0x82,0x7a,0x61,0x83, +0xe4,0x93,0x22,0x7e,0xf, 0x3b,0x8, 0x2e,0x14,0x0, 0x84,0xb, 0xa, 0x30,0x5e,0x70, +0xdf,0x1b,0xa, 0x30,0x74,0x3, 0x12,0x13,0x8b,0x7e,0x14,0x0, 0x3, 0x7e,0x1f,0x3b, +0x8, 0x1b,0x1a,0x10,0x7e,0x1f,0x3b,0x8, 0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78, +0xf3,0xe4,0x2, 0x13,0x8b,0x2e,0x34,0x4, 0x0, 0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, +0x60,0x7e,0x34,0x4, 0x0, 0x9d,0x32,0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, 0x62,0x7e, +0x34,0x0, 0x1, 0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, 0x64,0xa, 0x3b,0x7e,0xf, 0x3b, +0x10,0x79,0x30,0x0, 0x66,0x22,0x7c,0xa5,0xbe,0x34,0x0, 0x0, 0x28,0x10,0xa, 0x1b, +0x3e,0x14,0x7d,0x23,0x7c,0x45,0x6c,0x55,0x2d,0x21,0xa, 0x3a,0x80,0x8, 0xa, 0x2b, +0x3e,0x24,0x7c,0x67,0x6c,0x77,0x2d,0x32,0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0x4, +0x22,0x7c,0xa7,0x7e,0x1f,0x3b,0x8, 0x69,0x41,0x0, 0x8a,0x5e,0x44,0x10,0xf, 0xa, +0x1a,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c, +0xab,0xe4,0x2d,0x51,0x4d,0x45,0x79,0x41,0x0, 0x8a,0x22,0x7e,0xf, 0x3b,0x8, 0x69, +0x30,0x0, 0x84,0x5e,0x70,0xe7,0x1b,0xb1,0x68,0xc, 0x14,0x68,0xc, 0xb, 0xb1,0x78, +0x5, 0x4e,0x70,0x10,0x80,0x3, 0x4e,0x70,0x8, 0x79,0x30,0x0, 0x84,0x22,0x7e,0x34, +0x0, 0x1f,0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, 0x4, 0xa9,0xd2,0xcd,0x7e,0xf, 0x3b, +0x10,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x22,0xbe,0xb0,0x0, 0x28,0xa, +0xa9,0xd7,0xca,0xa9,0xd3,0xcb,0xa9,0xd2,0xcb,0x22,0xa9,0xc7,0xca,0xa9,0xc3,0xcb, +0xa9,0xc2,0xcb,0x22,0x30,0x1, 0xa, 0x54,0x3, 0xa, 0x3b,0x2e,0x34,0x2, 0x0, 0x80, +0x2, 0x6d,0x33,0x7e,0xf, 0x3b,0x10,0x79,0x30,0x0, 0x3a,0x22,0x7e,0xf, 0x3b,0x8, +0x69,0x30,0x0, 0x8a,0x60,0x5, 0x4e,0x60,0x10,0x80,0x3, 0x5e,0x60,0xef,0x79,0x30, +0x0, 0x8a,0x22,0xbe,0xb0,0x0, 0x28,0x9, 0xa9,0xd6,0xca,0xd2,0xcd,0xa9,0xd1,0xcb, +0x22,0xa9,0xc6,0xca,0xc2,0xcd,0xa9,0xc1,0xcb,0x22,0x7e,0x34,0x0, 0xf, 0x7e,0xf, +0x3b,0x10,0x79,0x30,0x0, 0x4, 0xc2,0xc3,0xd2,0xeb,0x22,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,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,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,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,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,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,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,0x0, 0x1, 0x2, 0x3, 0x4, +0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14, +0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, +0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, +0x5, 0x6, 0x7, 0x8, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x0, 0x1, 0x2, +0x3, 0x4, 0x1c,0x1d,0x1e,0x1f,0x20,0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x10,0x11,0x12, +0x13,0x14,0x15,0x16,0x17,0x18,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, +0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x6, +0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x0, 0x0, 0x0, 0x1, +0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, +0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, +0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15, +0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x1, +0x1, 0x10,0x1c,0x2, 0x10,0x1c,0x0, 0x1, 0x1, 0x4, 0xf, 0x1c,0x0, 0x1, 0x1, 0x6, +0x1b,0xf, 0x7, 0xe, 0x1c,0x8, 0x23,0x15,0x0, 0x1, 0x1, 0xa, 0x10,0x19,0xb, 0x14, +0x1c,0xc, 0xf, 0x18,0x0, 0x1, 0x1, 0xe, 0x23,0x15,0xf, 0xd, 0x19,0x0, 0x1, 0x1, +0x11,0xd, 0x14,0x12,0x10,0x19,0x13,0x1c,0x10,0x14,0x1a,0x10,0x15,0x10,0x19,0x16, +0x23,0x1c,0x72,0x23,0x15,0x73,0x23,0x1c,0x74,0x23,0x1c,0x75,0xe, 0x1c,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,0x1f,0x3c,0x9f,0x22,0x9f,0x20, +0x7f,0x2, 0x80,0x3, 0x12,0x1f,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,0x75,0x84,0x1, 0x7e,0x44,0x3f,0xff,0xe4,0x7a, +0x49,0xb0,0x1b,0x44,0x78,0xf9,0x7e,0xf8,0x3b,0x62,0x75,0xc, 0x0, 0x75,0xd, 0x0, +0x75,0xe, 0x2, 0x75,0xf, 0x0, 0xc2,0x8, 0xc2,0x9, 0x75,0x1e,0x0, 0xc2,0x10,0xc2, +0x11,0x75,0x18,0x0, 0xc2,0xa, 0xc2,0x12,0x75,0x1f,0x0, 0x75,0x5a,0x0, 0xc2,0x14, +0x75,0x5b,0x0, 0xc2,0x16,0x75,0x5c,0x0, 0xc2,0x17,0xc2,0x18,0xc2,0xc, 0x75,0x1c, +0x0, 0x75,0x1d,0x64,0xc2,0x19,0xc2,0x1a,0x75,0x5d,0x0, 0xd2,0x5, 0xd2,0x6, 0xd2, +0x7, 0xd2,0x1b,0xc2,0xe, 0xd2,0xf, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x21,0x58,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, 0x3f,0xec,0x0, 0x0, 0x0, 0x47,0x0, 0xcb,0x1, 0x0, 0x0, 0x10,0xfd,0xc7,0xfb, +0x7e,0xfb,0xfb,0x1, 0xbb,0xc, 0x9e,0x19,0x0, 0x21,0x45,0x0, 0xe, 0x1, 0xf, 0x2, +0x10,0x3, 0x11,0x4, 0x12,0x5, 0x13,0x6, 0x14,0x7, 0x15,0x8, 0x16,0x9, 0x17,0xa, +0x18,0xb, 0x19,0xc, 0x1a,0xd, 0x1b,0xdf,0x22,0xc3,0x21,0xa9,0x20,0x94,0x1f,0x81, +0x1e,0x70,0x1d,0x62,0x1c,0x55,0x1b,0x4a,0x1a,0x41,0x19,0x38,0x18,0x31,0x17,0x2b, +0x16,0x25,0x15,0x21,0x14,0x1c,0x13,0x19,0x12,0x16,0x11,0x13,0x10,0x11,0xf, 0x10, +0xe, 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,0x43,0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, +0xb0,0xb, 0x14,0x4d,0x44,0x78,0xf5,0x22,0x32,0x1, 0x19,0x1, 0x0, 0x2, 0xf8,0x4, +0xe7,0x5, 0xce,0x6, 0xc2,0x7, 0xb5,0x8, 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,0x0, 0x4, 0x36,0xae,0x0, 0x0, 0x0, 0x0, +0x0, 0x1, 0x34,0x4f,0x1, 0x0, 0x1, 0x25,0xf6,0x1, 0x0, 0x1, 0x39,0xe3,0x0, 0x0, +0x2, 0x3a,0x35,0x0, 0x0, 0x0, 0x2, 0x3a,0x37,0x0, 0x0, 0x0, 0x1, 0x3a,0x39,0x0, +0x0, 0x1, 0x3b,0x5f,0x0, 0x0, 0x1, 0x3b,0x60,0x0, 0x0, 0x2, 0x30,0x19,0x0, 0x0, +0x0, 0x1, 0x30,0x3c,0x0, 0x0, 0x1, 0x31,0xcd,0x0, 0x0, 0x1, 0x31,0xce,0x0, 0x0, +0x3c,0x38,0xb1,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 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, 0x38,0x2d,0x1, 0x0, 0x2, 0x38,0x30,0x0, 0x0, 0x0, 0x1, 0x34,0x88,0x0, 0x0, +0x1, 0x34,0x89,0x0, 0x0, 0x1, 0x34,0x8a,0x0, 0x0, 0x1, 0x38,0x34,0x1, 0x0, 0x1, +0x38,0xae,0x0, 0x0, 0x1, 0x3b,0x61,0x0, 0x0, 0x6, 0x3b,0x4b,0x3f,0x1f,0x50,0x11, +0x20,0x10,0x0, 0x1, 0x3b,0x51,0x24,0x0, 0x1, 0x3b,0x58,0x0, 0x0, 0x1, 0x3b,0x59, +0x0, 0x0, 0x1, 0x3b,0x5a,0x0, 0x0, 0x1, 0x3b,0x5b,0x0, 0x0, 0x1, 0x3b,0x5c,0x0, +0x0, 0x1, 0x0, 0x5e,0x0, 0x0, 0x1, 0x3, 0xfb,0x0, 0x0, 0x1, 0x31,0xf9,0x0, 0x0, +0x2, 0x32,0x1a,0x0, 0x0, 0x0, 0x1, 0x32,0x58,0x0, 0x0, 0x4, 0x39,0x88,0x0, 0x0, +0x0, 0x0, 0x0, 0x1, 0x3b,0x52,0x0, 0x0, 0x1, 0x3b,0x53,0x0, 0x0, 0x2, 0x3b,0x54, +0x0, 0x0, 0x0, 0x1, 0x3b,0x56,0x64,0x0, 0x1, 0x3b,0x57,0x0, 0x0, 0x1, 0x3b,0x62, +0x0, 0x0, 0x1, 0x3b,0x5d,0x0, 0x0, 0x1, 0x3b,0x5e,0x0, 0x0, 0x2, 0x2b,0xb9,0x2b, +0xbf,0x0, 0x1, 0x2f,0x7f,0x2, 0x0, 0x1, 0x2f,0xa8,0x0, 0x0, 0x1, 0x3b,0x36,0x0, +0x0, 0x1, 0x3a,0x86,0xff,0x0, 0x1, 0x3a,0x87,0x0, 0x0, 0x1, 0x3a,0x88,0x0, 0x0, +0x1, 0x3a,0x89,0x40,0x0, 0x1, 0x3a,0x8a,0x40,0x0, 0x4, 0x33,0xf8,0x0, 0x0, 0x50, +0x0, 0x0, 0x4, 0x33,0xfc,0x0, 0x0, 0x64,0x0, 0x0, 0x4, 0x3b,0x8, 0x0, 0x0, 0x6c, +0x0, 0x0, 0x4, 0x3b,0xc, 0x0, 0x0, 0x68,0xc0,0x0, 0x4, 0x3b,0x10,0x0, 0x0, 0x68, +0x0, 0x0, 0x4, 0x3b,0x21,0x0, 0x0, 0x40,0x0, 0x0, 0x4, 0x3, 0xfc,0x0, 0x0, 0x60, +0x0, 0x0, 0x0, 0x3, 0xe8,0x0, 0xc, 0x1, 0xf4,0x3, 0x20,0x0, 0xa, 0x1, 0x4a,0x2, +0xbc,0x0, 0x9, 0x0, 0xc8,0x1, 0xf4,0x0, 0x6, 0x0, 0x3c,0x1, 0x2c,0x0, 0x6, 0x0, +0x3c,0x0, 0x64,0x0, 0x6, 0x0, 0x3c,0x0, 0x50,0x0, 0x6, 0x0, 0x0, 0x0, 0xe, 0x1c, +0x23,0x5, 0xdc,0x0, 0x32,0x3, 0xe8,0x0, 0x28,0x0, 0x0, 0x0, 0x1e,0x12,0x46,0xd1, +0x12,0x5f,0xa6,0x12,0x23,0x36,0x12,0x28,0x6e,0x12,0x6c,0xe8,0x2, 0x23,0x2f,0x74, +0x1, 0x7a,0xb3,0x38,0x38,0x22,0x12,0x71,0xc7,0x12,0x23,0x6b,0x2, 0x23,0x3f,0x7e, +0x34,0x0, 0x3, 0x6d,0x22,0x2, 0x23,0x48,0x7d,0x43,0x7e,0xa3,0x34,0x38,0xbe,0xa0, +0x5, 0x50,0x16,0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x34,0x3b,0x59,0x23,0x34,0x3d, +0x7c,0xba,0x4, 0x7a,0xb3,0x34,0x38,0xc3,0x22,0xd3,0x22,0x6d,0x33,0x7e,0x24,0x6, +0xfc,0x12,0x23,0x48,0x7e,0x34,0x0, 0x1, 0x7e,0x24,0x7, 0x7a,0x2, 0x23,0x48,0x7e, +0x34,0x60,0xa3,0x12,0x23,0xc9,0x12,0x26,0x8a,0x12,0x68,0x48,0x12,0x71,0x7e,0x12, +0x46,0xd1,0x12,0x5f,0x9f,0x12,0xc8,0x76,0x12,0x23,0x36,0x12,0x28,0x6e,0x12,0x5f, +0x93,0x12,0x6c,0xe8,0x2, 0x23,0x2f,0x7e,0x34,0x61,0x4f,0x7e,0x24,0x0, 0xff,0xb, +0x1a,0x30,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x61,0x51,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0x30,0x7a,0x37,0x2a,0x5c,0x7e,0x34,0x61,0x53,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30, +0x22,0x7e,0x34,0x61,0x55,0x12,0x23,0xc9,0x7a,0x37,0x28,0x95,0x7e,0x34,0x61,0xba, +0x12,0x23,0xc9,0x7a,0x37,0x28,0x99,0x7e,0x34,0x61,0xb8,0x12,0x23,0xc9,0x7a,0x37, +0x28,0x97,0x7e,0x34,0x62,0x12,0x12,0x23,0xc9,0x7a,0x37,0x28,0x9b,0x7e,0x34,0x61, +0xbc,0x12,0x23,0xc9,0x7a,0x37,0x28,0x9d,0x7e,0x34,0x61,0xbe,0x12,0x23,0xc9,0x7a, +0x37,0x28,0x9f,0x7e,0x34,0x61,0xc0,0x12,0x23,0xc9,0x7a,0x37,0x28,0xa1,0x7e,0x34, +0x61,0xc2,0x12,0x23,0xc9,0x7a,0x37,0x28,0xa3,0x90,0x61,0xc4,0xe4,0x93,0x7a,0xb3, +0x28,0xa5,0xe4,0x7a,0xb3,0x28,0xa8,0x12,0xb7,0xaa,0x3e,0x34,0x7e,0x8, 0x25,0xf7, +0xe4,0x2, 0x21,0x16,0x12,0x25,0xf2,0x7e,0xb3,0x38,0x3f,0xb4,0x1, 0x16,0x7e,0x34, +0x62,0x34,0x12,0x23,0xc9,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x36,0x12,0x23,0xc9, +0x7a,0x37,0x2a,0x5c,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x37,0x7e,0x34,0x62,0x3e,0x12, +0x23,0xc9,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x40,0x12,0x23,0xc9,0x7a,0x37,0x2a, +0x5c,0x7e,0x34,0x62,0x42,0x12,0x23,0xc9,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x62,0x44, +0x12,0x23,0xc9,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x62,0x46,0x12,0x23,0xc9,0x7a,0x37, +0x2a,0x53,0x7e,0xb3,0x2a,0x2, 0x70,0x21,0x7e,0x27,0x2a,0x5a,0x7d,0x32,0x7e,0x14, +0x0, 0x4, 0xad,0x13,0x7d,0x31,0x12,0x25,0x6f,0xbe,0x34,0x0, 0x50,0x28,0x4, 0x7e, +0x34,0x0, 0x50,0x2d,0x32,0x7a,0x37,0x2a,0x5a,0x22,0x7e,0x54,0x0, 0x54,0x7e,0x44, +0x0, 0xff,0x69,0x32,0x0, 0x4, 0x69,0x22,0x0, 0x2, 0xb, 0x2a,0x10,0x7a,0x1d,0x26, +0x7a,0x15,0x24,0x7e,0x34,0x0, 0x20,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x6, 0x12, +0x69,0x9f,0x7e,0x34,0x61,0x4f,0x12,0x23,0xc9,0x1e,0x34,0x1e,0x34,0x7a,0x73,0x39, +0x29,0x7e,0x34,0x61,0x51,0x12,0x23,0xc9,0xe, 0x34,0xe, 0x34,0x7a,0x73,0x39,0x2a, +0x7e,0x34,0x61,0x55,0x12,0x23,0xc9,0x12,0x25,0x6f,0x7a,0x73,0x39,0x2b,0x7e,0x34, +0x61,0x57,0x12,0x23,0xc9,0x12,0x25,0x6f,0x7a,0x73,0x39,0x2c,0x7e,0x34,0x61,0x59, +0x12,0x23,0xc9,0x12,0x25,0x6f,0x7a,0x73,0x39,0x2d,0x7e,0x34,0x61,0x5b,0x12,0x23, +0xc9,0x12,0x25,0x6f,0x7a,0x73,0x39,0x2e,0x7e,0x34,0x0, 0x59,0xca,0x39,0x7e,0x34, +0x61,0x5f,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x39,0x2f,0x12,0x20,0xf1,0x1b,0xfd,0xe5, +0x25,0x7a,0xb3,0x39,0x5a,0xe5,0x28,0x7a,0xb3,0x39,0x49,0x22,0xb, 0x28,0x30,0x1e, +0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x22,0x90,0x60,0x99,0xe4,0x93,0x7a,0xb3,0x2a, +0x4d,0x90,0x60,0x9e,0xe4,0x93,0x7a,0xb3,0x2a,0x4e,0x7e,0x34,0x61,0x55,0x12,0x23, +0xc9,0x12,0xc8,0xe9,0x12,0x23,0xc9,0x7a,0x37,0x2a,0x51,0x7e,0x14,0x61,0x59,0x12, +0x5f,0xec,0x7a,0x27,0x2a,0x53,0x7a,0x37,0x2a,0x55,0x90,0x60,0x9d,0xe4,0x93,0x7a, +0xb3,0x2a,0x59,0x12,0x23,0xa7,0x12,0xc8,0xc1,0x7e,0x34,0x62,0x12,0x12,0x23,0xc9, +0x7a,0x37,0x2a,0x60,0x90,0x60,0x9f,0xe4,0x93,0x7a,0xb3,0x2a,0x64,0x90,0x60,0xa0, +0xe4,0x93,0x7a,0xb3,0x2a,0x65,0x7e,0x34,0x60,0xa1,0x12,0x23,0xc9,0x7a,0x37,0x2a, +0x66,0x7e,0x34,0x61,0x5b,0x12,0x23,0xc9,0x7a,0x37,0x2a,0x62,0xe4,0x7a,0xb3,0x16, +0x92,0x22,0x12,0x23,0xa7,0x12,0xc8,0xc1,0x7e,0x34,0x61,0x55,0x12,0x23,0xc9,0x12, +0xc8,0xe9,0x12,0x23,0xc9,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x61,0x59,0x12,0x23,0xc9, +0x7a,0x37,0x2a,0x53,0x22,0xca,0xf8,0x7e,0xf3,0x39,0xe8,0xbe,0xf0,0x5, 0x78,0xb, +0x74,0x1, 0x7a,0xb3,0x39,0xe8,0x12,0x0, 0x9, 0x80,0x52,0xbe,0xf0,0x4, 0x78,0x13, +0x12,0xc8,0x61,0x12,0x23,0xc9,0x12,0x26,0x8a,0xe4,0x7a,0xb3,0x2b,0x2, 0x12,0x84, +0xd5,0x80,0x3a,0xbe,0xf0,0x6, 0x78,0x19,0x12,0xc8,0x61,0x12,0x23,0xc9,0x12,0x26, +0x8a,0x12,0x51,0x16,0xe4,0x7a,0xb3,0x2b,0x1e,0x12,0x7d,0xf0,0x12,0xc9,0xd, 0x80, +0x1c,0xbe,0xf0,0x7, 0x78,0x1d,0x12,0xc8,0x61,0x12,0x23,0xc9,0x12,0x26,0x8a,0x12, +0x2f,0xe8,0x50,0xfb,0x12,0x7e,0x16,0x12,0x5f,0xaf,0x12,0x28,0x6e,0x74,0x2, 0x7a, +0xb3,0x39,0xe8,0xda,0xf8,0x22,0x7e,0x34,0x3, 0xe8,0x6d,0x22,0x7a,0x27,0x3b,0x25, +0x7a,0x37,0x3b,0x27,0x22,0x7e,0xb3,0x39,0x4e,0x14,0x68,0x5d,0x14,0x78,0x2, 0xe1, +0x36,0x14,0x68,0x6d,0x24,0x3, 0x68,0x2, 0xe1,0x2e,0x12,0xc9,0x55,0x38,0x8, 0x30, +0x13,0xf, 0x12,0xc9,0x4d,0x68,0xa, 0x12,0x58,0xdc,0xe4,0x7a,0xb3,0x3a,0xcd,0x80, +0x75,0x7e,0xb3,0x39,0x2f,0x30,0xe0,0x6e,0x7e,0x73,0x39,0x30,0xa, 0x27,0x7e,0x34, +0x4, 0x0, 0xad,0x32,0x7e,0xb3,0x39,0x79,0xb4,0x1, 0xb, 0x7e,0x34,0x62,0x64,0x12, +0x23,0xc9,0x2e,0x34,0x4, 0x0, 0xbe,0x37,0x3a,0xcb,0x50,0x4a,0x12,0x58,0xdc,0x12, +0x5d,0x3e,0xe4,0x7a,0xb3,0x3a,0xcf,0x80,0x3d,0x12,0xc9,0x55,0x28,0x33,0xe4,0x7a, +0xb3,0x39,0x4e,0x7e,0xb3,0x3a,0xcd,0xb4,0x1, 0x3, 0x12,0x5d,0x3e,0xd2,0x1a,0x80, +0x20,0x7e,0x34,0x60,0xa5,0x12,0x23,0xc9,0x12,0x26,0x8a,0x12,0x82,0x80,0x12,0x23, +0x7f,0xe4,0x7a,0xb3,0x39,0x4e,0x7a,0xb3,0x3b,0x57,0xd2,0x1a,0x80,0x8, 0x12,0x5d, +0x3e,0xe4,0x7a,0xb3,0x3b,0x57,0x12,0x83,0x70,0x2, 0x27,0x3c,0xca,0xd8,0xca,0x79, +0x7e,0xb3,0x39,0x4e,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x28,0x5e,0x6c,0xdd,0x6c,0xff, +0x12,0x97,0x5c,0x7d,0xf3,0x12,0x2f,0xe8,0x50,0xfb,0x74,0x1, 0x7a,0xb3,0x3a,0xce, +0x12,0x45,0x6e,0x12,0x13,0xfc,0x12,0x0, 0x1e,0x74,0xa, 0x12,0x4f,0x4a,0x12,0xc8, +0xb9,0x7e,0xe7,0x2b,0xd, 0x7a,0xe5,0x24,0x7e,0xe3,0x2a,0xfa,0x74,0x4, 0x7a,0xb3, +0x2a,0xfa,0x7e,0xe7,0x2b,0xd, 0x5e,0xe4,0x0, 0x3f,0x7a,0xe7,0x2b,0xd, 0x7e,0xb3, +0x2a,0xfa,0x12,0xbf,0x62,0x7c,0x7b,0x74,0x4, 0xac,0x7b,0x7e,0x24,0x0, 0x4, 0x12, +0x1e,0xee,0x7d,0x23,0x7d,0x3f,0x12,0x25,0x6f,0xad,0x32,0x7a,0x37,0x2b,0x7, 0x12, +0x56,0xe7,0x12,0x26,0x86,0x7e,0xb3,0x39,0x79,0xb4,0x1, 0x4, 0x74,0x10,0x80,0x2, +0x74,0xf, 0x12,0x97,0xa8,0x12,0x57,0xbb,0x80,0xf, 0x80,0x7, 0x12,0x82,0xac,0xe4, +0x12,0x82,0xe4,0x20,0x93,0xf6,0x12,0x83,0x98,0x30,0x1b,0xf7,0x30,0x1a,0xf4,0xd2, +0x1, 0x12,0x4f,0xae,0xe4,0x12,0x14,0x13,0xb, 0xd0,0x12,0x54,0x8a,0x12,0x97,0xbf, +0x7e,0xa3,0x3a,0xcd,0x4c,0xaa,0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x3a,0xce,0x4c,0xaa, +0x68,0xb, 0x7e,0xb3,0x39,0x79,0x70,0x5, 0xe4,0x7a,0xb3,0x3a,0xcd,0x12,0x28,0x63, +0x78,0x18,0x7e,0xb3,0x3a,0xcd,0x60,0x12,0xe4,0x7a,0xb3,0x3a,0xcd,0x7a,0xb3,0x2a, +0x2, 0x7a,0xb3,0x2a,0x3, 0x7e,0xf0,0x1, 0x80,0x1d,0x12,0x28,0x63,0x68,0x10,0x7e, +0xb3,0x3a,0xcd,0x70,0xa, 0x7e,0xf0,0x1, 0xe4,0x7a,0xb3,0x39,0x4e,0x80,0x8, 0xbe, +0xd0,0x32,0x50,0x3, 0x2, 0x27,0xb2,0xe4,0x7a,0xb3,0x2b,0x4, 0x7e,0x35,0x24,0x7a, +0x37,0x2b,0xd, 0x7a,0xe3,0x2a,0xfa,0x4c,0xff,0x68,0x3, 0x12,0x28,0x6e,0xda,0x79, +0xda,0xd8,0x22,0x7e,0x73,0x33,0xf7,0xa, 0x37,0x5e,0x34,0x0, 0x2, 0x22,0xe4,0x7a, +0xb3,0x34,0x3a,0x7a,0xb3,0x34,0x39,0x12,0x56,0xa2,0xb4,0x1, 0x4, 0x74,0x1, 0x80, +0x2, 0x74,0x3, 0x7a,0xb3,0x34,0x3a,0x22,0xca,0x3b,0x12,0x2f,0xe8,0x50,0xfb,0x7e, +0xf3,0x2b,0xf, 0x7c,0xbf,0x12,0xac,0x55,0x12,0xbc,0xe, 0x7e,0xb3,0x2b,0x1f,0xf5, +0x28,0x7e,0xb3,0x2b,0x20,0xf5,0x29,0x7e,0xb3,0x39,0x50,0xb4,0x1, 0xf, 0x12,0x6c, +0xa1,0x7e,0xb3,0x16,0x91,0x70,0x6, 0x12,0x28,0x6e,0xc3,0x21,0x92,0x12,0x29,0x95, +0x3e,0x34,0xca,0x39,0x7e,0x18,0x6, 0xfc,0x7e,0x8, 0x4, 0x7e,0x12,0x20,0xf1,0x1b, +0xfd,0x12,0x29,0x95,0x3e,0x34,0xca,0x39,0x7e,0x18,0x7, 0x7a,0x7e,0x8, 0x4, 0x0, +0x12,0x20,0xf1,0x1b,0xfd,0x7e,0xb3,0x39,0x50,0xb4,0x3, 0x7, 0x12,0xa8,0x62,0x7a, +0x37,0x3a,0x2b,0x74,0x1, 0x7a,0xb3,0x16,0x90,0x12,0x5f,0xa6,0x12,0xa8,0x4e,0x7e, +0xc3,0x3, 0xfb,0x12,0x6b,0xb9,0xe4,0x12,0x14,0x13,0x12,0x28,0x6e,0x7e,0x8, 0x4, +0x7e,0x7a,0xd, 0x2a,0x7e,0x18,0x6, 0x76,0x7e,0xb3,0x2b,0x72,0x12,0x85,0x70,0x7e, +0x8, 0x4, 0x0, 0x7a,0xd, 0x2a,0x7e,0x18,0x5, 0xf8,0x7e,0xb3,0x25,0xf0,0x12,0x85, +0x70,0x7e,0xd3,0x2b,0x1f,0x7e,0xe3,0x2b,0x20,0xe5,0x28,0x7a,0xb3,0x2b,0x1f,0xe5, +0x29,0x12,0x7e,0x2a,0x50,0x5, 0x7c,0xbc,0x12,0x6f,0x53,0x7e,0x34,0x8, 0xa, 0x7e, +0x4, 0xd, 0xc8,0x7d,0x20,0x7d,0x10,0x12,0x7b,0xeb,0x7a,0xd3,0x2b,0x1f,0x7a,0xe3, +0x2b,0x20,0x7c,0xbf,0x12,0xab,0xf5,0x12,0xa7,0xc8,0x7e,0xb3,0x3b,0x57,0x4, 0x7a, +0xb3,0x3b,0x57,0x7e,0x73,0x3b,0x57,0xbe,0x70,0xfa,0x28,0x6, 0x74,0x64,0x7a,0xb3, +0x3b,0x57,0x7e,0xb3,0x16,0x90,0x60,0x9, 0x7e,0xb3,0x16,0x91,0x60,0x3, 0xd3,0x80, +0x1, 0xc3,0xda,0x3b,0x22,0x7e,0x73,0x2a,0x74,0xa, 0x27,0x7e,0x73,0x2a,0x73,0xa, +0x37,0x2d,0x32,0x22,0x12,0x50,0x9, 0x7e,0xb3,0x39,0x50,0xb4,0x3, 0x6c,0x12,0xbb, +0x5a,0x12,0x26,0x86,0x12,0x47,0xc8,0x7e,0xb3,0x39,0xe4,0x30,0xe7,0xe9,0x12,0x28, +0x88,0x12,0x29,0x95,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x0, 0x7e,0x8, 0x4, 0xfc, +0x12,0x20,0xf1,0x1b,0xfd,0x12,0x29,0x95,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x7e, +0x7e,0x8, 0x5, 0x7a,0x12,0x20,0xf1,0x1b,0xfd,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x18, +0x12,0x3f,0xb9,0x12,0x79,0xd3,0x12,0x2f,0xf3,0x12,0xa6,0x96,0x12,0x7e,0xc5,0x12, +0x2f,0x43,0x12,0x2a,0x29,0x12,0x57,0xf8,0x12,0x50,0x42,0x12,0xb3,0x8a,0x7e,0xb3, +0x39,0xe4,0x54,0x7f,0x7a,0xb3,0x39,0xe4,0x80,0x8d,0x12,0x2f,0xd8,0x2, 0x0, 0x46, +0x7a,0xb3,0x2b,0x2, 0x7a,0xb3,0x2b,0x1e,0x22,0x12,0x33,0x82,0x12,0x2c,0x1d,0x12, +0xa4,0x50,0x12,0x2c,0x1d,0x12,0x37,0xbd,0x12,0x38,0x94,0x12,0x2c,0x1d,0x12,0x63, +0x71,0x12,0x2c,0x1d,0x12,0x2c,0x1d,0x2, 0x2a,0x4a,0xca,0x3b,0x75,0x24,0x0, 0x6c, +0xcc,0x6c,0xdd,0x7e,0xc4,0x0, 0x3c,0xca,0xc9,0x7e,0x18,0x38,0xed,0x7e,0x8, 0x38, +0xb1,0x12,0x20,0xf1,0x1b,0xfd,0x7e,0xf3,0x28,0x84,0xa, 0xcf,0x3e,0xc4,0xca,0xc9, +0x7e,0x18,0x26,0xfa,0x7e,0x8, 0x1f,0x34,0x12,0x20,0xf1,0x1b,0xfd,0x6c,0x88,0x6c, +0xee,0x61,0x1e,0x7e,0xc4,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0x99,0x80,0x4c,0x74,0x2, +0xac,0xb9,0x9, 0xb5,0x1f,0x34,0xbe,0xb0,0xff,0x68,0x3d,0x7c,0xb9,0x12,0x2d,0xb6, +0x60,0x36,0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x35,0xa, 0x27,0x74,0x2, 0xac,0xbe, +0x9, 0x75,0x38,0xee,0xa, 0x37,0x12,0x8f,0x29,0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f, +0x34,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x38,0xed,0x12,0x67,0xb1,0x2d,0x13, +0xbd,0xc1,0x28,0x4, 0x7d,0xc1,0x7c,0xc9,0xb, 0x90,0xbc,0xf9,0x38,0xb0,0xbe,0xc0, +0xff,0x68,0x39,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x1f,0x34,0x9, 0x73,0x1f,0x35, +0x12,0x2c,0x63,0xbe,0x37,0x2a,0x5a,0x48,0x23,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0x53, +0x1f,0x34,0x74,0x2, 0xac,0xbd,0x19,0x55,0x1f,0x70,0x9, 0x53,0x1f,0x35,0x19,0x55, +0x1f,0x71,0x74,0xff,0x19,0xb3,0x1f,0x34,0xb, 0x80,0xb, 0xd0,0xb, 0xe0,0x7e,0x73, +0x38,0xb0,0xbc,0x7e,0x28,0x2, 0x41,0x83,0x7c,0xe8,0x80,0x6d,0x6d,0xdd,0x7e,0x80, +0xff,0x6c,0x99,0x80,0x3c,0x7c,0xb9,0x12,0x2d,0xb6,0x60,0x33,0x12,0x2f,0xde,0xbe, +0xb0,0xff,0x68,0x2b,0x9, 0x73,0x1f,0x35,0x12,0x92,0xc0,0x7f,0x71,0xb, 0x7a,0x50, +0xbe,0x54,0x0, 0x0, 0x58,0x5, 0x6d,0x55,0x1b,0x7a,0x50,0xb, 0x7a,0xc0,0xbd,0xcd, +0x8, 0xd, 0x12,0x2f,0xde,0xf5,0x24,0x9, 0xc3,0x1f,0x35,0x7d,0xdc,0x7c,0x89,0xb, +0x90,0xbc,0xf9,0x38,0xc0,0xbe,0x80,0xff,0x68,0x1d,0x7e,0x71,0x24,0x74,0x2, 0xac, +0xbd,0x19,0x75,0x1f,0x70,0x19,0xc5,0x1f,0x71,0x7e,0xa0,0xff,0x7e,0x70,0x2, 0xac, +0x78,0x19,0xa3,0x1f,0x34,0xb, 0xd0,0xb, 0xe0,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbe, +0x38,0x8a,0x90,0x60,0x9a,0xe4,0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18, +0x1f,0x70,0x7e,0x8, 0x1f,0x34,0x12,0x20,0xf1,0x1b,0xfd,0x7c,0xfd,0x12,0x8b,0x9c, +0x7e,0x8, 0x38,0xed,0x74,0xff,0x12,0x21,0x16,0xbe,0xf0,0x0, 0x28,0x35,0xa, 0x3f, +0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xf1,0x1b, +0xfd,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x38,0xed,0x12, +0x20,0xf1,0x1b,0xfd,0x6c,0xee,0x80,0x7, 0x7c,0xbe,0x12,0x33,0x1c,0xb, 0xe0,0xbc, +0xfe,0x38,0xf5,0x7a,0xf3,0x38,0xb0,0x7a,0xf3,0x28,0x84,0x90,0x60,0x99,0xe4,0x93, +0xbe,0xb3,0x28,0x84,0x50,0x4, 0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xca,0x79,0x6c, +0xff,0x6c,0xee,0x80,0x2e,0x7c,0xbe,0x12,0x2d,0xb6,0x60,0x25,0x7e,0x34,0x0, 0x2, +0xca,0x39,0xac,0x7e,0x2e,0x34,0x26,0xfa,0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e, +0x14,0x26,0xfa,0x6d,0x0, 0x12,0x20,0xf1,0x1b,0xfd,0x7c,0xbf,0x12,0x33,0x1c,0xb, +0xf0,0xb, 0xe0,0x12,0x3f,0xb2,0x38,0xcd,0x7a,0xf3,0x28,0x84,0xda,0x79,0x22,0x7c, +0xba,0x7c,0x79,0x12,0x92,0xc0,0xb, 0x1a,0x30,0x22,0xca,0x3b,0x6d,0xee,0x7e,0xc3, +0x2a,0x6e,0x7e,0xd3,0x2a,0x6d,0x7e,0xb3,0x39,0x79,0xb4,0x1, 0x3, 0xe4,0xa1,0xa0, +0x7e,0xb3,0x28,0x84,0x70,0x2, 0xa1,0xf, 0x7e,0xb3,0x2a,0x3, 0x60,0x2, 0x80,0x7f, +0x7e,0xa3,0x26,0xfa,0x7e,0x73,0x26,0xfb,0x7a,0x71,0x24,0x6c,0xee,0x6d,0xff,0x6c, +0xff,0xa, 0x47,0x80,0x20,0x12,0x2c,0x5f,0xbe,0x34,0x0, 0x96,0x8, 0x1d,0xb, 0xe0, +0xbe,0xa0,0x0, 0x28,0x6, 0x7c,0xba,0x14,0x12,0x2d,0xa6,0x12,0x2f,0x3a,0x58,0x3, +0x12,0x2d,0xa3,0x1b,0x44,0xbe,0x44,0x0, 0x0, 0x58,0xda,0xe5,0x24,0xa, 0x4b,0x80, +0x1e,0x12,0x2c,0x5f,0xbe,0x34,0x0, 0x96,0x8, 0x21,0xb, 0xe0,0xbe,0xa0,0x0, 0x28, +0x6, 0x7c,0xba,0x14,0x12,0x2d,0xa6,0x12,0x2f,0x3a,0x58,0x3, 0x12,0x2d,0xa3,0x7d, +0x24,0xb, 0x24,0x7d,0x42,0xa, 0x3c,0xbd,0x23,0x48,0xd6,0xbe,0xe0,0x3, 0x50,0x2, +0x80,0xd, 0xa, 0x2f,0x7d,0x3f,0x12,0x1e,0xee,0xbe,0x34,0x0, 0x28,0x8, 0x7, 0xe4, +0x7a,0xb3,0x31,0xcd,0xa1,0xa0,0x6d,0xdd,0xbe,0xa0,0x0, 0x28,0x8, 0x7c,0xba,0x14, +0x12,0x2d,0xb0,0x2d,0xd3,0xa, 0x3d,0x1b,0x34,0xa, 0xca,0xbd,0xc3,0x58,0x8, 0x7c, +0xba,0x4, 0x12,0x2d,0xb0,0x2d,0xd3,0x7e,0x70,0x8, 0x80,0x2a,0x7e,0x50,0x2, 0xac, +0x57,0x7d,0xc2,0x2e,0xc4,0x21,0x28,0x7d,0x1c,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4, +0x93,0x1a,0xcb,0xbd,0xcd,0x8, 0xf, 0x7d,0xc2,0x2e,0xc4,0x21,0x29,0x7d,0x2c,0x12, +0x87,0x7a,0x1a,0xcb,0x2d,0xec,0x7c,0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xce,0x7c,0xba, +0x12,0x2d,0xb0,0x12,0x21,0x48,0xbe,0x34,0xa, 0xf0,0x8, 0x4, 0x2e,0xe4,0x0, 0x28, +0xbe,0xe4,0x0, 0xfa,0x28,0x4, 0x7e,0xe4,0x0, 0xfa,0x7e,0xb3,0x31,0xcd,0xa, 0x3b, +0xbd,0x3e,0x50,0x8, 0x7d,0x3e,0x7c,0xb7,0x7a,0xb3,0x31,0xcd,0x7e,0xb3,0x31,0xcd, +0xda,0x3b,0x22,0x7c,0xba,0x4, 0x7c,0x79,0x12,0x2c,0x63,0x2d,0xf3,0xb, 0xf0,0x22, +0x7e,0x71,0x24,0x2, 0x2c,0x63,0x7c,0x7b,0x12,0x31,0xa2,0x9, 0xa2,0x27,0x72,0x7c, +0xb7,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0x5e,0x12,0x97,0xb6,0x5c,0xba,0x22,0xca, +0x3b,0x7f,0x40,0x7e,0xe3,0x28,0x84,0x6c,0xdd,0x7e,0xc0,0x1, 0x80,0x1a,0xa, 0x3d, +0x2d,0x39,0x7d,0x28,0x7e,0x1b,0x60,0xa, 0x2c,0x7f,0x4, 0x2d,0x12,0x7e,0xb, 0x70, +0xbc,0x76,0x40,0x2, 0x7c,0xdc,0xb, 0xc0,0xbc,0xec,0x38,0xe2,0xa, 0x3d,0x2d,0x39, +0x7d,0x28,0x7e,0x1b,0xd0,0x6c,0xff,0x7e,0xc0,0x1, 0xe1,0x1d,0x75,0x2d,0x0, 0x6d, +0x33,0x7a,0x35,0x2e,0x7a,0x35,0x25,0x7a,0x35,0x27,0x7e,0x18,0x1f,0x70,0x7a,0x1d, +0x29,0x74,0xff,0x7e,0x34,0x1f,0x71,0x7e,0x24,0x0, 0x0, 0x7a,0x1b,0xb0,0x7e,0x1d, +0x29,0x7a,0x1b,0xb0,0xe4,0x7e,0x1d,0x29,0x39,0xb1,0x0, 0x3, 0x7e,0x1d,0x29,0x39, +0xb1,0x0, 0x2, 0x7e,0x1d,0x29,0x12,0x67,0xba,0x44,0x1, 0x7a,0x1b,0xb0,0x75,0x24, +0x0, 0x80,0x6c,0x12,0xb7,0xcd,0x9, 0x93,0x26,0xfb,0xe5,0x24,0x12,0xc8,0x8a,0xbc, +0xbc,0x78,0x5a,0x5, 0x2d,0xa, 0x3a,0x2e,0x35,0x25,0x7a,0x35,0x25,0xa, 0x39,0x2e, +0x35,0x27,0x7a,0x35,0x27,0x12,0x2c,0x5f,0xbe,0x35,0x2e,0x8, 0x6, 0x12,0x2c,0x5f, +0x7a,0x35,0x2e,0x7e,0x1d,0x29,0x7e,0x1b,0xb0,0xbc,0xba,0x28,0x3, 0x7a,0x1b,0xa0, +0x7e,0x1d,0x29,0x29,0xb1,0x0, 0x2, 0xbc,0xba,0x50,0x4, 0x39,0xa1,0x0, 0x2, 0x7e, +0x1d,0x29,0x29,0xb1,0x0, 0x1, 0xbc,0xb9,0x28,0x4, 0x39,0x91,0x0, 0x1, 0x7e,0x1d, +0x29,0x29,0xb1,0x0, 0x3, 0xbc,0xb9,0x50,0x4, 0x39,0x91,0x0, 0x3, 0x5, 0x24,0xbe, +0xe1,0x24,0x38,0x8f,0xe5,0x2d,0xbe,0xb0,0x0, 0x28,0x50,0x7e,0xd, 0x29,0x12,0x65, +0xe4,0xe5,0x2d,0xa, 0x2b,0x7e,0x15,0x25,0x8d,0x12,0x7a,0x15,0x25,0x7e,0x35,0x27, +0x8d,0x32,0x7a,0x35,0x27,0x7e,0x55,0x25,0x12,0x2f,0x32,0x19,0xa3,0x32,0x1c,0x7e, +0x55,0x27,0x12,0x2f,0x32,0x19,0xa3,0x32,0x1d,0x7e,0x37,0x32,0x1a,0x4d,0x33,0x68, +0x18,0x7e,0x55,0x25,0x7e,0x35,0x27,0x12,0x2c,0x63,0x7e,0x25,0x2e,0x7e,0x70,0x2, +0xac,0x7f,0x2e,0x37,0x32,0x1a,0x1b,0x38,0x20,0xb, 0xf0,0xb, 0xc0,0xbc,0xdc,0x40, +0x2, 0xc1,0xc, 0x12,0x64,0xb4,0x7c,0xbf,0xda,0x3b,0x22,0x7c,0xb8,0x7c,0x79,0x2, +0x2c,0x63,0x7c,0xab,0x7e,0x70,0x2, 0xac,0x7f,0x22,0xa, 0x2d,0x1b,0x24,0xa, 0x3a, +0xbd,0x32,0x22,0x12,0x95,0x8b,0x12,0x2c,0x6a,0x7a,0xb3,0x2a,0xc, 0x22,0x12,0x5f, +0x80,0x12,0x88,0xc, 0x7e,0xb3,0x39,0x50,0xb4,0x1, 0x6b,0x12,0xbb,0x5a,0x7e,0x34, +0x60,0xa5,0x12,0x23,0xc9,0x12,0x26,0x8a,0x12,0x97,0x63,0x12,0x8a,0xb6,0x12,0x28, +0x88,0x50,0xde,0x12,0x3f,0xb9,0x12,0x79,0xd3,0x7e,0xb3,0x39,0x4d,0xb4,0x1, 0x4, +0xe4,0x12,0x4e,0xbe,0x12,0x2f,0xf3,0x12,0xa6,0x96,0x12,0x62,0xbb,0x40,0xc2,0x12, +0x7e,0xc5,0x12,0x62,0xbb,0x40,0xba,0x12,0x2f,0x43,0x12,0x2a,0x29,0x12,0x0, 0x66, +0x12,0x96,0x89,0x12,0x99,0x1, 0x12,0x72,0x2f,0x12,0x8c,0x3b,0x12,0x8f,0x54,0x12, +0x99,0x9c,0x12,0x76,0xd7,0x12,0xc1,0x6, 0x12,0x4c,0x5e,0x12,0x62,0xa5,0x12,0x26, +0x95,0x12,0x58,0x82,0x80,0x8b,0x12,0x2f,0xd8,0x2, 0x2f,0xcc,0x7e,0xb3,0x39,0x4d, +0xb4,0x1, 0x4, 0xe4,0x2, 0x4e,0xbe,0x22,0x12,0x2f,0xe8,0x50,0xfb,0x22,0x7e,0x70, +0x2, 0xac,0x79,0x9, 0xb3,0x1f,0x34,0x22,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x2, 0xc3, +0x22,0xd3,0x22,0x12,0x24,0x44,0xe4,0x7a,0xb3,0x3b,0x5d,0x2, 0x2f,0xfe,0xe4,0x7a, +0xb3,0x28,0x93,0x12,0x31,0xdd,0x7e,0xb3,0x16,0x91,0xb4,0x1, 0x8, 0x7e,0x73,0x28, +0x84,0x7a,0x73,0x28,0x92,0x7e,0x18,0x4, 0xfc,0x7a,0x1f,0x6, 0xf8,0x12,0xc8,0x81, +0x12,0x30,0x46,0x12,0x78,0x2d,0x7e,0xb3,0x16,0x90,0xb4,0x1, 0x18,0x7e,0x73,0x26, +0x83,0x7a,0x73,0x26,0xf3,0x7e,0x73,0x26,0x85,0x7a,0x73,0x26,0xf5,0x7e,0x73,0x26, +0x84,0x7a,0x73,0x26,0xf4,0x22,0x7e,0x8, 0x26,0x86,0x7e,0x34,0x0, 0x3, 0xe4,0x12, +0x21,0x16,0x7e,0x8, 0x26,0x89,0x7e,0x34,0x0, 0x3, 0x12,0x21,0x16,0x7a,0xb3,0x26, +0x83,0x7a,0xb3,0x26,0x84,0x7a,0xb3,0x26,0x85,0x7a,0xb3,0x26,0xf0,0x7a,0xb3,0x26, +0xf1,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0x6f,0x12,0x31,0xb4,0x6c,0x55,0x12,0x31, +0xc, 0x7a,0xb3,0x26,0x85,0x7e,0x18,0x26,0x5b,0x12,0x31,0xc4,0x6c,0x55,0x12,0x31, +0xc, 0x7a,0xb3,0x26,0x84,0x6c,0x77,0x80,0x14,0x12,0x31,0x95,0x60,0x5, 0x3e,0x24, +0x14,0x78,0xfb,0x12,0x31,0x9e,0x2e,0x24,0x26,0x86,0x12,0x31,0xa9,0x7e,0x63,0x26, +0x84,0xbc,0x67,0x38,0xe4,0x6c,0x77,0x80,0x14,0x12,0x31,0x95,0x60,0x5, 0x3e,0x24, +0x14,0x78,0xfb,0x12,0x31,0x9e,0x2e,0x24,0x26,0x89,0x12,0x31,0xa9,0x7e,0xa3,0x26, +0x85,0xbc,0xa7,0x38,0xe4,0x7e,0xb3,0x26,0x84,0xa4,0x7a,0xb3,0x26,0x83,0x7e,0x18, +0x26,0xe6,0x12,0x31,0xb4,0x7e,0x50,0x1, 0x12,0x31,0xc, 0x7a,0xb3,0x26,0xf2,0x7e, +0x18,0x26,0xdc,0x12,0x31,0xc4,0x7e,0x50,0x1, 0x12,0x31,0xc, 0x7c,0xab,0x7a,0xa3, +0x26,0xf1,0x7e,0xb3,0x26,0xf2,0xa4,0x7a,0xb3,0x26,0xf0,0x22,0xca,0x69,0xca,0xf8, +0x7c,0x4b,0x6c,0xaa,0x6d,0xff,0x6c,0xff,0x80,0x70,0x7e,0xd0,0x2, 0xac,0xdf,0x7f, +0x60,0x2d,0xd6,0xb, 0x6a,0xe0,0x4c,0x55,0x68,0x6, 0x6e,0xe4,0xff,0xff,0xb, 0xe4, +0xbd,0x3e,0x58,0x54,0x4c,0xff,0x78,0x8, 0x6d,0x44,0x69,0xf0,0x0, 0x2, 0x80,0x1b, +0x7c,0xb4,0x14,0xbc,0xbf,0x7f,0x56,0x78,0x9, 0x1b,0xb5,0xb, 0x5a,0x40,0x6d,0xff, +0x80,0x9, 0x1b,0xb5,0xb, 0x5a,0x40,0x69,0xf6,0x0, 0x2, 0x4c,0x55,0x68,0xc, 0x6e, +0x44,0xff,0xff,0xb, 0x44,0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd,0x4e,0x58,0x19,0xbd, +0xfe,0x18,0x15,0xa, 0xba,0x7e,0x6d,0x24,0x2d,0xdb,0x7a,0x6b,0xf0,0xb, 0xa0,0x90, +0x60,0x9b,0xe4,0x93,0xbc,0xba,0x28,0x6, 0xb, 0xf0,0xbc,0x4f,0x38,0x8c,0x7c,0xba, +0xda,0xf8,0xda,0x69,0x22,0x7c,0xb7,0x54,0x7, 0x7e,0x24,0x0, 0x1, 0x22,0x7c,0xa5, +0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x22,0x7e,0x29,0x60,0x4c,0x6a,0x7a,0x29, +0x60,0xb, 0x70,0x22,0x7a,0x1d,0x24,0x7e,0xf, 0x6, 0xf8,0x7e,0xb3,0x2a,0x6e,0x7e, +0x37,0x2a,0x53,0x22,0x7a,0x1d,0x24,0x7e,0xa3,0x2a,0x6e,0x74,0x2, 0xa4,0x7e,0xf, +0x6, 0xf8,0x2d,0x15,0x7e,0xb3,0x2a,0x6d,0x7e,0x37,0x2a,0x51,0x22,0x6c,0x33,0x80, +0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x27,0x72,0xb, 0x30,0x90,0x60,0x9a,0xe4,0x93,0x12, +0x31,0xa2,0xb, 0x24,0xa, 0x33,0xbd,0x32,0x48,0xe7,0xe4,0x7a,0xb3,0x28,0x84,0x7a, +0xb3,0x28,0x85,0x6d,0x33,0x7a,0x37,0x28,0x86,0x7a,0x37,0x28,0x88,0x7a,0x37,0x28, +0x8a,0x7a,0x37,0x28,0x8e,0x7e,0xd4,0x1f,0x36,0x5e,0xd4,0xff,0xfe,0x6d,0xcc,0x7e, +0x1f,0x13,0x8a,0x7a,0x37,0x1f,0x76,0x7d,0x3d,0x7a,0x37,0x1f,0x7a,0x7e,0x34,0x15, +0x9e,0x7a,0x37,0x1f,0x78,0x7e,0x73,0x2a,0x6d,0x7a,0x73,0x1f,0x73,0x7e,0x73,0x2a, +0x6e,0x7a,0x73,0x1f,0x72,0x7e,0x37,0x2a,0x5c,0x7a,0x37,0x1f,0x7c,0x7e,0x37,0x2a, +0x5e,0x7a,0x37,0x1f,0x7e,0x7e,0x37,0x2a,0x60,0x7a,0x37,0x1f,0x80,0x90,0x60,0x9a, +0x93,0x7a,0xb3,0x1f,0x74,0x7e,0x73,0x3b,0x5e,0x7a,0x73,0x1f,0x75,0x7e,0x8, 0x1f, +0x72,0x7e,0x18,0x1f,0x82,0x12,0x8, 0x0, 0x7e,0x73,0x1f,0x82,0x7a,0x73,0x28,0x84, +0x7e,0x73,0x1f,0x83,0x7a,0x73,0x28,0x85,0x7e,0x37,0x1f,0x84,0x7a,0x37,0x28,0x86, +0x7e,0x37,0x1f,0x86,0x7a,0x37,0x28,0x88,0x7e,0x37,0x1f,0x8c,0x7a,0x37,0x28,0x8a, +0x7e,0x37,0x1f,0x8e,0x7d,0x23,0x7a,0x53,0x28,0x8c,0xa, 0x36,0x7a,0x73,0x28,0x8d, +0x7e,0x37,0x1f,0x88,0x7a,0x37,0x28,0x8e,0x7e,0x37,0x1f,0x8a,0x7d,0x23,0x7a,0x53, +0x28,0x90,0xa, 0x36,0x7a,0x73,0x28,0x91,0x6c,0x33,0x80,0x20,0x7c,0xb3,0x7e,0x70, +0x1, 0x12,0x33,0x1f,0x74,0x2, 0xac,0xb3,0x49,0x45,0x15,0x9e,0xa, 0x38,0x7c,0x27, +0x19,0x25,0x26,0xfa,0x7c,0x29,0x19,0x25,0x26,0xfb,0xb, 0x30,0x7e,0x23,0x28,0x84, +0xbc,0x23,0x38,0xd8,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac,0xb3,0x7f,0x16,0x2d,0x35, +0xb, 0x1a,0x40,0xa, 0x38,0x7c,0x27,0x19,0x25,0x27,0x36,0x7c,0x29,0x19,0x25,0x27, +0x37,0xb, 0x30,0x7e,0x23,0x28,0x85,0xbc,0x23,0x38,0xdd,0x22,0x7e,0x70,0x1, 0x7c, +0x67,0x7c,0x7b,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xb7,0x54,0x7, 0xa, 0x2b,0x2e, +0x24,0x0, 0x5e,0x12,0x87,0x7a,0x7c,0x7b,0x4c,0x66,0x68,0xf, 0xa, 0x2a,0x2e,0x24, +0x27,0x72,0x7e,0x29,0xb0,0x4c,0xb7,0x7a,0x29,0xb0,0x22,0x7c,0xb7,0x64,0xff,0xa, +0x2a,0x2e,0x24,0x27,0x72,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0x7c,0xab, +0x7e,0xb3,0x3b,0x5b,0x70,0x1b,0x7e,0xb3,0x28,0xa8,0x70,0x15,0x12,0xc9,0x4d,0x68, +0x10,0x7e,0xb3,0x2a,0x6b,0xbe,0xb0,0x1, 0x68,0x7, 0x7c,0xba,0x6c,0x77,0x2, 0x33, +0x1f,0x22,0xca,0xd8,0xca,0x79,0xc2,0x0, 0x6d,0x88,0x7a,0x87,0x3a,0x84,0xe4,0x7a, +0xb3,0x1f,0x58,0xe5,0x5a,0xbe,0xb0,0xff,0x50,0x2, 0x5, 0x5a,0x7e,0xb3,0x28,0x84, +0x60,0xc, 0x12,0x9d,0xd6,0xb, 0x1a,0x80,0xbe,0x87,0x7, 0xfa,0x28,0xa, 0xc2,0x13, +0x6d,0x88,0x7a,0x87,0x3a,0x45,0x81,0xb3,0x12,0x98,0x44,0x60,0x12,0x7e,0x34,0x62, +0xe, 0x12,0xc9,0x16,0x7a,0x87,0x3a,0x3b,0x12,0x35,0x1d,0x7a,0x87,0x3a,0x45,0x7e, +0x87,0x3a,0x3b,0x4d,0x88,0x68,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x6c,0xff,0x80, +0x77,0xe4,0xa, 0x3f,0x19,0xb3,0x1f,0x34,0x12,0x35,0x37,0x7e,0x8, 0x1f,0x52,0x7c, +0xbd,0x7c,0x7e,0x12,0x35,0x8a,0x7d,0x93,0x7e,0x87,0x3a,0x45,0xbd,0x89,0x50,0x4, +0x7a,0x97,0x3a,0x45,0x7e,0x87,0x3a,0x84,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x3a,0x84, +0xe5,0x5a,0xbe,0xb0,0x5, 0x38,0x1f,0x7e,0x8, 0x3a,0x47,0x12,0x35,0x44,0x50,0x7, +0x12,0x35,0x2e,0xd2,0x0, 0x80,0x2f,0x7e,0x8, 0x3a,0x47,0x7e,0x18,0x1f,0x52,0x12, +0x98,0x96,0x50,0x22,0x80,0x10,0x12,0x35,0x1d,0xbd,0x89,0x38,0x19,0x7e,0x8, 0x1f, +0x52,0x12,0x97,0xcf,0x50,0x10,0x12,0x35,0x2e,0x7e,0x8, 0x1f,0x58,0x7e,0x18,0x1f, +0x52,0x12,0x98,0x1e,0xd2,0x0, 0xb, 0xf0,0x7e,0x73,0x28,0x84,0xbc,0x7f,0x38,0x81, +0x30,0x0, 0x36,0x6c,0xff,0x80,0x1c,0x12,0x35,0x37,0x7e,0x8, 0x1f,0x58,0x12,0x35, +0x44,0x40,0x9, 0xa, 0x3f,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x5, 0x7c,0xbf,0x12,0x33, +0x5e,0xb, 0xf0,0x7e,0x73,0x28,0x84,0xbc,0x7f,0x38,0xdc,0x75,0x5a,0x0, 0x7e,0x34, +0x62,0xe, 0x12,0x23,0xc9,0x7a,0x37,0x3a,0x3b,0x7e,0x63,0x1f,0x58,0x7e,0x70,0x6, +0xac,0x67,0xb, 0x34,0xca,0x39,0x7e,0x18,0x1f,0x58,0x7e,0x8, 0x3a,0x47,0x12,0x20, +0xf1,0x1b,0xfd,0x7e,0x37,0x3a,0x3b,0x4d,0x33,0x78,0x39,0x90,0x62,0x9, 0xe4,0x93, +0xa, 0x3b,0xbe,0x37,0x3a,0x45,0x38,0x43,0x7c,0x7b,0x1e,0x70,0xa, 0x37,0xbe,0x37, +0x3a,0x84,0x38,0x37,0x90,0x60,0x51,0x12,0x35,0x25,0x7e,0x73,0x26,0xf7,0xa, 0x37, +0xbd,0x32,0x8, 0x27,0x90,0x60,0x50,0x12,0x35,0x25,0x7e,0x73,0x26,0xf6,0xa, 0x37, +0xbd,0x32,0x8, 0x17,0x6c,0xff,0x80,0x7, 0x7c,0xbf,0x12,0x33,0x5e,0xb, 0xf0,0x7e, +0x73,0x28,0x84,0xbc,0x7f,0x38,0xf1,0xd2,0x0, 0x80,0x6, 0x6d,0x33,0x7a,0x37,0x3a, +0x45,0xa2,0x0, 0x92,0x13,0x12,0x36,0xc2,0xda,0x79,0xda,0xd8,0x22,0x90,0x62,0x9, +0xe4,0x93,0xa, 0x8b,0x22,0xe4,0x93,0x7c,0x7b,0x1e,0x70,0xa, 0x27,0x22,0x74,0x1, +0xa, 0x8f,0x19,0xb8,0x1f,0x34,0x22,0x74,0x2, 0xac,0xbf,0x9, 0xd5,0x26,0xfa,0x9, +0xe5,0x26,0xfb,0x22,0x7c,0xbd,0x7c,0x7e,0x7c,0x6b,0xc2,0x1, 0x6c,0xaa,0x80,0x30, +0x7e,0x50,0x6, 0xac,0x5a,0x7f,0x70,0x2d,0xf2,0xb, 0xf4,0x29,0xb7,0x0, 0x2, 0xbc, +0xb6,0x40,0x1b,0x7e,0x7b,0xb0,0xbc,0xb6,0x38,0x14,0x29,0xb7,0x0, 0x3, 0xbc,0xb7, +0x40,0xc, 0x29,0xb7,0x0, 0x1, 0xbc,0xb7,0x38,0x4, 0xd2,0x1, 0x80,0x9, 0xb, 0xa0, +0x7e,0xb, 0xb0,0xbc,0xba,0x38,0xc9,0xa2,0x1, 0x22,0xca,0x3b,0x7c,0xc7,0x7c,0xfb, +0x7f,0x40,0x6d,0x33,0x7a,0x35,0x24,0x7e,0xa3,0x2a,0x6d,0x7e,0x73,0x2a,0x6e,0x4c, +0xcc,0x78,0x5, 0x7e,0xc0,0x1, 0x80,0xd, 0x7c,0xb7,0x14,0xbc,0xbc,0x78,0x6, 0xa, +0x6c,0x1b,0x65,0x7c,0xcd,0x4c,0xff,0x78,0x5, 0x7e,0xf0,0x1, 0x80,0xb, 0x7c,0xba, +0x14,0xbc,0xbf,0x78,0x4, 0xa, 0x7f,0x1b,0x75,0x7f,0x4, 0x7e,0x34,0x0, 0x6, 0xe4, +0x12,0x21,0x16,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x1b,0x34,0x7a,0x4b,0x70,0x7e,0x73, +0x2a,0x6e,0xa, 0x37,0x1b,0x34,0x39,0x74,0x0, 0x1, 0x7c,0xec,0x80,0x1f,0x75,0x26, +0x0, 0x7c,0xdf,0x80,0xd, 0x12,0x36,0xb0,0x12,0x91,0x24,0x70,0xa, 0x12,0x36,0xb7, +0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xee,0xe5,0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, +0x58,0xdc,0x7c,0xec,0x80,0x26,0x75,0x26,0x0, 0x1a,0x3f,0xb, 0x34,0x7c,0xd7,0x80, +0xd, 0x12,0x36,0xb0,0x12,0x91,0x24,0x70,0xd, 0x12,0x36,0xb7,0xb, 0xd0,0x7e,0x73, +0x2a,0x6d,0xbc,0x7d,0x18,0xeb,0xe5,0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58, +0xd5,0x1a,0x3c,0xb, 0x34,0x7c,0xe7,0x80,0x1f,0x75,0x26,0x0, 0x7c,0xdf,0x80,0xd, +0x12,0x36,0xb0,0x12,0x91,0x24,0x70,0xa, 0x12,0x36,0xb7,0x1b,0xd0,0xbe,0xd0,0x0, +0x58,0xee,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e,0x73,0x2a,0x6e,0xbc,0x7e,0x18,0xd9, +0x1a,0x3c,0xb, 0x34,0x7c,0xe7,0x80,0x24,0x75,0x26,0x0, 0x1a,0x6f,0xb, 0x64,0x80, +0xd, 0x12,0x36,0xb0,0x12,0x91,0x24,0x70,0xd, 0x12,0x36,0xb7,0xb, 0xd0,0x7e,0x73, +0x2a,0x6d,0xbc,0x7d,0x18,0xeb,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e,0x73,0x2a,0x6e, +0xbc,0x7e,0x18,0xd4,0x7e,0x35,0x24,0x7d,0x23,0x39,0x54,0x0, 0x5, 0xda,0x3b,0x22, +0x7c,0xbd,0x7c,0x7e,0x7f,0x4, 0x22,0x5, 0x26,0x7e,0x35,0x24,0xb, 0x34,0x7a,0x35, +0x24,0x22,0x30,0x13,0x13,0x12,0x9f,0x4a,0x68,0x6, 0x7e,0xb3,0x3b,0x5b,0x60,0x8, +0x7e,0x34,0xb, 0xb8,0x7a,0x37,0x3a,0x43,0x22,0xca,0xf8,0x6c,0xff,0x80,0x17,0x7c, +0xbf,0x12,0x38,0x82,0xbe,0x37,0x2a,0x5c,0x58,0xa, 0x7c,0xbf,0x12,0x37,0x4, 0xac, +0x7f,0x12,0x9f,0x67,0xb, 0xf0,0x7e,0x73,0x28,0x84,0xbc,0x7f,0x38,0xe1,0x12,0x2c, +0x1d,0xda,0xf8,0x22,0x6c,0x77,0x12,0x33,0x1f,0x7e,0x70,0x2, 0x22,0xca,0xd8,0xca, +0x79,0x7e,0x34,0x62,0x27,0x12,0x37,0xb5,0x12,0xa5,0xf8,0x50,0x2, 0xe1,0xb0,0x7e, +0x34,0x62,0x2b,0x12,0x23,0xc9,0x7a,0x35,0x2a,0x90,0x62,0x26,0xe4,0x93,0x70,0x2, +0xe1,0xb0,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x7, 0x7e,0x34,0x62,0x29,0x12,0x37,0xb5, +0x7e,0x37,0x28,0x8a,0xbe,0x34,0x4, 0x4c,0x8, 0x66,0x6c,0xdd,0x80,0x5a,0xc2,0x0, +0x7c,0xbd,0x12,0x38,0x82,0x7a,0x35,0x26,0x7c,0xbd,0x7e,0x70,0x1, 0x12,0xa4,0xe3, +0x7a,0x35,0x24,0x9e,0x35,0x26,0x7a,0x35,0x24,0x7e,0x35,0x26,0x3e,0x34,0x3e,0x34, +0x12,0x9f,0x33,0x7a,0x35,0x28,0xbe,0x75,0x28,0x58,0x3, 0x7a,0x75,0x28,0x7e,0x35, +0x28,0xbe,0x35,0x24,0x8, 0xa, 0x7e,0x35,0x2a,0xbe,0x35,0x26,0x8, 0x2, 0xd2,0x0, +0x7c,0xbd,0x12,0xb9,0x97,0x50,0x2, 0xc2,0x0, 0x30,0x0, 0xa, 0x7c,0xbd,0x12,0x37, +0x4, 0xac,0x7d,0x12,0x9f,0x67,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d,0x38,0x9e, +0xda,0x79,0xda,0xd8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x70,0x22,0x12,0xa5,0xe1, +0x12,0x62,0xdb,0x12,0x9e,0x4d,0x12,0x37,0xd, 0x2, 0x37,0xcc,0xca,0x3b,0x12,0x2c, +0x1d,0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x38,0x2d,0x60,0x9, 0xe4,0x7a,0xb3, +0x38,0x2f,0x7a,0xb3,0x37,0xb4,0x7e,0xb3,0x38,0x2d,0x70,0x6b,0x6c,0x99,0x80,0x5f, +0x74,0x2, 0xac,0xb9,0x9, 0x85,0x26,0xfa,0x9, 0xf5,0x26,0xfb,0x7c,0xb9,0x12,0xb9, +0x97,0x40,0x4a,0x6c,0xee,0x80,0x3e,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x37,0xb5,0x9, +0xc5,0x37,0xb6,0xa, 0x28,0xa, 0x3d,0x12,0x38,0x7a,0x78,0x27,0xa, 0x2f,0xa, 0x3c, +0x12,0x38,0x7a,0x78,0x1e,0x7c,0xb9,0x12,0x38,0x82,0x7e,0x14,0x62,0x2b,0x12,0x5f, +0xec,0xbd,0x32,0x58,0xe, 0x7c,0xb9,0x6c,0x77,0x12,0x33,0x1f,0x7c,0xb8,0x7c,0x7f, +0x12,0x9f,0x6f,0xb, 0xe0,0x7e,0x73,0x38,0x2f,0xbc,0x7e,0x38,0xba,0xb, 0x90,0x7e, +0x73,0x28,0x84,0xbc,0x79,0x38,0x99,0x7e,0x73,0x37,0xb4,0x7a,0x73,0x38,0x2f,0xa, +0x37,0x3e,0x34,0xca,0x39,0x7e,0x18,0x37,0xf1,0x7e,0x8, 0x37,0xb5,0x12,0x20,0xf1, +0x1b,0xfd,0xe4,0x7a,0xb3,0x38,0x2d,0xda,0x3b,0x22,0x9d,0x32,0x12,0x21,0x48,0x4d, +0x33,0x22,0x7c,0xab,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0x26,0xfa,0x9, 0x73,0x26, +0xfb,0x2, 0x2c,0x63,0xca,0x79,0x6c,0x88,0x80,0x70,0x74,0x2, 0xac,0xb8,0x9, 0xf5, +0x26,0xfa,0x9, 0x75,0x26,0xfb,0x7a,0x71,0x24,0x7c,0xbf,0x12,0x3f,0x59,0x50,0x58, +0x6c,0xee,0x80,0x4f,0xbc,0xe8,0x68,0x49,0x7e,0x70,0x2, 0xac,0x7e,0x12,0x9f,0x5a, +0x6c,0x99,0x90,0x60,0xaa,0xe4,0x93,0x70,0x18,0x7e,0xb3,0x2a,0x70,0x14,0xbe,0xb1, +0x26,0x78,0xe, 0xa, 0x2f,0x12,0x3c,0xd, 0xbe,0x34,0x0, 0x1, 0x18,0x3, 0x7e,0x90, +0x1, 0xbe,0x90,0x1, 0x78,0x1b,0x7c,0xbe,0x12,0x38,0x82,0x7d,0xf3,0x7c,0xb8,0x12, +0x38,0x82,0xbd,0x3f,0x8, 0x4, 0x7c,0xbe,0x80,0x2, 0x7c,0xb8,0x6c,0x77,0x12,0x33, +0x1f,0xb, 0xe0,0x12,0x3f,0xb2,0x38,0xac,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78, +0x38,0x88,0xda,0x79,0x22,0xca,0xd8,0xca,0x79,0x7e,0xa3,0x2a,0x6e,0x7e,0x47,0x28, +0x99,0xe4,0x7a,0xb3,0x28,0xa6,0x7e,0xb3,0x26,0xf0,0xbe,0xb0,0x0, 0x28,0x4c,0x7e, +0x73,0x28,0x85,0xbe,0x70,0x0, 0x28,0x43,0x6c,0xff,0x80,0x3b,0x7e,0x50,0x2, 0xac, +0x5f,0x9, 0xd2,0x27,0x36,0x9, 0xe2,0x27,0x37,0x7e,0x50,0x2, 0xac,0x5e,0x49,0x12, +0x4, 0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x53,0xbd,0x12,0x58,0x19,0x12,0x3a,0x37,0x49, +0x12,0x4, 0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x51,0xbd,0x12,0x58,0x8, 0x74,0x1, 0x7a, +0xb3,0x28,0xa6,0x80,0x6, 0xb, 0xf0,0xbc,0x7f,0x38,0xc1,0xe4,0x7a,0xb3,0x28,0xa7, +0x7e,0xb3,0x26,0x83,0x70,0x40,0x12,0x9f,0x42,0x28,0x3b,0x6c,0xff,0x80,0x33,0x7e, +0x50,0x2, 0xac,0x5f,0x9, 0xd2,0x26,0xfa,0x9, 0xe2,0x26,0xfb,0x12,0x3a,0x37,0x49, +0x2, 0x5, 0x7a,0x6d,0x11,0x9d,0x14,0xbd,0x1, 0x48,0xd, 0x7e,0x10,0x2, 0xac,0x1e, +0x49,0x20,0x5, 0x7a,0xbd,0x21,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa7,0x80,0x6, +0xb, 0xf0,0xbc,0x7f,0x38,0xc9,0x12,0x3a,0x40,0xe4,0x7a,0xb3,0x28,0xa9,0x7e,0x37, +0x28,0x88,0x2e,0x37,0x28,0x86,0xbe,0x37,0x28,0x9f,0x28,0x6, 0x74,0x1, 0x7a,0xb3, +0x28,0xa9,0x74,0x1, 0x7a,0xb3,0x28,0xaa,0x6c,0xff,0x80,0x1f,0x12,0x3a,0x2d,0x49, +0x25,0x25,0xf7,0x7d,0x43,0x9d,0x42,0x7d,0x34,0x12,0x21,0x48,0xbe,0x37,0x28,0x9d, +0x8, 0x7, 0xe4,0x7a,0xb3,0x28,0xaa,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0x28,0x84,0xbc, +0x7f,0x38,0xd9,0x6c,0xff,0x80,0x9, 0x12,0x3a,0x2d,0x59,0x35,0x25,0xf7,0xb, 0xf0, +0x7e,0x73,0x28,0x84,0xbc,0x7f,0x38,0xef,0xda,0x79,0xda,0xd8,0x22,0x7c,0xbf,0x12, +0x38,0x82,0x74,0x2, 0xac,0xbf,0x22,0xa, 0x1d,0xa, 0x2a,0x2d,0x21,0x3e,0x24,0x22, +0xca,0xd8,0xca,0x79,0xc2,0x0, 0x6c,0xdd,0x7e,0x57,0x28,0x99,0x7d,0xf5,0x7e,0xe7, +0x28,0x97,0x7e,0x37,0x3a,0x43,0x4d,0x33,0x68,0x4, 0x7d,0xf5,0xe, 0xf4,0x6c,0xff, +0x7e,0xa3,0x2a,0x6e,0x7c,0x8a,0x7e,0xb3,0x28,0xa5,0x14,0x68,0x21,0x14,0x68,0x14, +0x24,0xc2,0x68,0x8, 0x24,0xfb,0x68,0x16,0x24,0x45,0x78,0x10,0x7c,0xfa,0x7e,0x83, +0x2a,0x6d,0x80,0xa, 0x7e,0x73,0x2a,0x6d,0x2c,0x87,0x80,0x2, 0x6c,0x88,0x6c,0x99, +0x80,0xf, 0x7c,0xb9,0x12,0x38,0x82,0xbe,0x34,0x2, 0x58,0x8, 0x2, 0xb, 0xd0,0xb, +0x90,0x7e,0x33,0x28,0x84,0xbc,0x39,0x38,0xe9,0xbe,0xd0,0x3, 0x40,0x2, 0x81,0x1, +0x7e,0xa3,0x28,0x85,0xbe,0xa0,0x0, 0x38,0xb, 0xbe,0x30,0x0, 0x28,0x37,0x7e,0xb3, +0x26,0x83,0x70,0x31,0x6c,0x99,0x80,0x29,0xa, 0x29,0xa, 0x3f,0x2d,0x32,0x3e,0x34, +0x49,0x23,0x5, 0x7a,0xbd,0x2f,0x8, 0x17,0x49,0x3, 0x4, 0xfc,0xbd,0xe, 0x58,0xf, +0x6d,0x33,0x9d,0x3e,0x12,0x9f,0x33,0xbd,0x3, 0x8, 0x4, 0xd2,0x0, 0x80,0x6, 0xb, +0x90,0xbc,0x89,0x38,0xd3,0x6d,0xee,0x9e,0xe7,0x2a,0x4f,0xbe,0xe7,0x7, 0xf8,0x8, +0x2, 0xc2,0x0, 0x30,0x0, 0x20,0x7e,0xb3,0x3b,0x5b,0x4, 0x7a,0xb3,0x3b,0x5b,0x7e, +0x23,0x3b,0x5b,0xbe,0x20,0xa, 0x28,0x1d,0x74,0xa, 0x7a,0xb3,0x3b,0x5b,0x74,0x1, +0x7a,0xb3,0x28,0xa8,0x80,0xf, 0x7e,0x23,0x3b,0x5b,0xbe,0x20,0x0, 0x28,0x6, 0x1e, +0x20,0x7a,0x23,0x3b,0x5b,0x6c,0xee,0xbe,0x30,0x0, 0x38,0x5, 0xbe,0xa0,0x0, 0x28, +0x69,0x7e,0xb3,0x28,0xa7,0xb4,0x1, 0x9, 0x7e,0xb3,0x28,0xaa,0xbe,0xb0,0x1, 0x68, +0x59,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x52,0x6c,0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac, +0x79,0x9, 0xa3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0x12,0x3c,0x6, 0xbe,0x34,0x0, 0x96, +0x8, 0x5, 0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x84,0xbc,0xb9,0x38, +0xdb,0x6c,0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3,0x27,0x36,0x9, 0xd3, +0x27,0x37,0x12,0x3c,0x6, 0xbe,0x34,0xff,0x6a,0x58,0x5, 0x7e,0xe0,0x1, 0x80,0xa, +0xb, 0x90,0x7e,0xb3,0x28,0x85,0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x17,0xa, 0xe9, +0xa, 0x5f,0x2d,0x5e,0x3e,0x54,0x49,0x55,0x5, 0x7a,0xbd,0x5f,0x8, 0x5, 0x7e,0xe0, +0x1, 0x80,0x6, 0xb, 0x90,0xbc,0x89,0x38,0xe5,0x4c,0xee,0x78,0x25,0x7e,0xb3,0x3b, +0x5c,0x4, 0x7a,0xb3,0x3b,0x5c,0x7e,0x73,0x3b,0x5c,0xbe,0x70,0x5, 0x28,0x22,0x74, +0x5, 0x7a,0xb3,0x3b,0x5c,0x7e,0xb3,0x28,0xa8,0x60,0x2, 0xd2,0x18,0x12,0xb2,0x80, +0x80,0xf, 0x7e,0x73,0x3b,0x5c,0xbe,0x70,0x0, 0x28,0x6, 0x1e,0x70,0x7a,0x73,0x3b, +0x5c,0xda,0x79,0xda,0xd8,0x22,0x7c,0xba,0x7c,0x7d,0x2, 0x2c,0x63,0xe5,0x25,0xa, +0x3b,0x9d,0x32,0x2, 0x21,0x48,0x7e,0x30,0x64,0x7e,0x20,0x64,0x6c,0x11,0x80,0x4a, +0xa, 0x31,0xb, 0x34,0x7c,0x7, 0x80,0x38,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26, +0xfa,0x12,0x3c,0x8b,0x9, 0xb3,0x26,0xfa,0x12,0x3c,0xf, 0x7c,0x97,0x7e,0x70,0x2, +0xac,0x70,0x9, 0xb3,0x26,0xfb,0x12,0x3c,0x8b,0x9, 0xb3,0x26,0xfb,0x12,0x3c,0xf, +0x7c,0x87,0xbc,0x39,0x28,0x2, 0x7c,0x39,0xbc,0x28,0x28,0x2, 0x7c,0x28,0xb, 0x0, +0x7e,0xb3,0x28,0x84,0xbc,0xb0,0x38,0xc0,0xb, 0x10,0x7e,0xb3,0x28,0x84,0xbc,0xb1, +0x38,0xae,0xa5,0xbb,0x64,0x2, 0x6c,0x33,0xa5,0xba,0x64,0x2, 0x6c,0x22,0xbc,0x23, +0x28,0x4, 0x7c,0xa2,0x80,0x2, 0x7c,0xa3,0x7c,0xba,0x22,0xa, 0x2b,0x7e,0x70,0x2, +0xac,0x71,0x22,0xca,0x3b,0x6c,0xff,0x12,0xc8,0xf2,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x2, 0x80,0x2, 0xa1,0x7b,0x6c,0xcc,0xa1,0x6d,0x12,0x67,0xed,0xf5,0x27,0x9, 0xb3, +0x26,0xfb,0xf5,0x28,0x75,0x25,0x2, 0x75,0x26,0x2, 0x7c,0xbc,0x12,0x3d,0x7e,0xd2, +0x0, 0x12,0x3e,0xf9,0xe5,0x27,0x60,0xc, 0xa, 0x2e,0x1b,0x24,0xe5,0x27,0xa, 0x3b, +0xbd,0x32,0x48,0x3, 0x75,0x25,0x1, 0xe5,0x28,0x60,0xc, 0xa, 0x2d,0x1b,0x24,0xe5, +0x28,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x26,0x1, 0x75,0x24,0x0, 0x80,0x38,0xe5, +0x24,0xbc,0xbc,0x68,0x30,0x12,0xb7,0xcd,0x7a,0xa1,0x29,0x9, 0xb3,0x26,0xfb,0xf5, +0x2a,0xa, 0x2a,0xe5,0x27,0x12,0x3c,0xf, 0xbe,0x34,0x0, 0x3, 0x18,0x17,0xe5,0x2a, +0xa, 0x2b,0xe5,0x28,0x12,0x3c,0xf, 0xbe,0x34,0x0, 0x3, 0x18,0x8, 0x75,0x25,0x1, +0x75,0x26,0x1, 0x80,0x7, 0x5, 0x24,0x12,0x9f,0x52,0x38,0xc3,0xe5,0x27,0x7e,0x71, +0x28,0x12,0xa8,0x1, 0x50,0x6, 0x12,0x3e,0xa9,0x12,0x4f,0xe9,0xe5,0x25,0x7e,0x71, +0x26,0x7c,0x6c,0x7c,0x5f,0x12,0x92,0xd6,0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, 0x16, +0x7e,0x70,0x9, 0xac,0x7c,0x7d,0x13,0x2e,0x14,0x27,0x76,0x6d,0x0, 0x2e,0x34,0x27, +0x78,0x6d,0x22,0x12,0x8a,0xa7,0x12,0x3e,0xa9,0xb, 0xf0,0xb, 0xc0,0x7e,0x73,0x28, +0x84,0xbc,0x7c,0x28,0x2, 0x81,0xa9,0x7a,0xf3,0x28,0x84,0xda,0x3b,0x22,0xca,0x3b, +0x7c,0x5b,0x7e,0x43,0x28,0x84,0xbe,0x40,0x1, 0x28,0x2, 0xc1,0x79,0x7e,0xa3,0x2a, +0x6e,0x7e,0x70,0x2, 0xac,0x75,0x9, 0xd3,0x26,0xfa,0x9, 0xc3,0x26,0xfb,0x7c,0xbd, +0x7c,0x7c,0x12,0x92,0xc0,0x7f,0x1, 0x90,0x60,0xaa,0xe4,0x93,0x70,0x12,0x7c,0xfc, +0x7c,0x9d,0x7e,0x83,0x2a,0x70,0x7e,0xe3,0x2a,0x6f,0xa, 0xca,0x6d,0xbb,0x9d,0xbc, +0xa, 0xa8,0x1b,0xa5,0xa, 0x5f,0xbd,0x5a,0x58,0x2, 0xc1,0x79,0xa, 0x59,0x1b,0x54, +0xbe,0x54,0x0, 0x0, 0x48,0x4e,0x7c,0xb9,0x14,0x12,0x3e,0xd7,0x50,0x46,0x7c,0xb9, +0x14,0x12,0x3e,0x7c,0xb, 0x1a,0xe0,0x7d,0x3b,0x12,0x3f,0x3b,0x8, 0x11,0x9d,0xae, +0xbe,0xa4,0x0, 0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12,0x3f,0x33,0x7c, +0xb8,0x24,0xfe,0xbc,0xbf,0x78,0x1d,0x90,0x60,0xaa,0xe4,0x93,0x70,0x4, 0x7d,0xfd, +0x1b,0xf4,0x7d,0x5f,0x12,0x3e,0x83,0xb, 0x1a,0x30,0xbd,0x3a,0x8, 0x6, 0x12,0x3e, +0x85,0x1b,0x1a,0xa0,0xa, 0xa9,0xb, 0xa4,0xa, 0x5e,0xbd,0xa5,0x58,0x4b,0x7c,0xb9, +0x4, 0x12,0x3e,0xd7,0x50,0x43,0x7c,0xb9,0x4, 0x12,0x3e,0x7c,0xb, 0x1a,0xe0,0x7d, +0x3c,0x12,0x3f,0x3b,0x8, 0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58,0x4, 0x6d,0x55, +0x80,0x2, 0x7d,0x5a,0x12,0x3f,0x33,0x7c,0xb8,0x24,0xfe,0xbc,0xbf,0x78,0x1a,0x90, +0x60,0xaa,0xe4,0x93,0x70,0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12,0x3e,0x83,0xb, +0x1a,0x50,0xbd,0x5a,0x8, 0x3, 0x1b,0x1a,0xa0,0xda,0x3b,0x22,0x12,0x3e,0x8c,0x7d, +0xd3,0x7d,0x5d,0x3e,0x54,0x7e,0x1f,0x13,0x8a,0x2d,0x35,0x22,0x7c,0x5b,0x7e,0x43, +0x2a,0x6e,0x90,0x60,0xab,0xe4,0x93,0x7c,0xab,0x90,0x60,0xaa,0xe4,0x93,0x70,0x8, +0x7c,0x75,0xac,0x74,0xa, 0x2a,0x2d,0x32,0x22,0x12,0x3f,0x51,0x60,0x28,0x6c,0x22, +0x80,0x1c,0x7c,0xb2,0x12,0x3e,0xd7,0x50,0x13,0x7c,0xb2,0x12,0x3e,0x8c,0x7d,0x3, +0x12,0x3f,0x49,0x49,0x55,0x3b,0x41,0x7d,0x40,0x12,0xc8,0xad,0xb, 0x20,0x7e,0x73, +0x2a,0x75,0xbc,0x72,0x38,0xdc,0x22,0x7c,0xab,0x6c,0x77,0x80,0x11,0xa, 0x27,0x2e, +0x24,0x60,0xac,0x12,0x87,0x7a,0xbc,0xba,0x78,0x2, 0xd3,0x22,0xb, 0x70,0x90,0x60, +0xa7,0xe4,0x93,0xbc,0xb7,0x38,0xe6,0xc3,0x22,0x12,0x3f,0x51,0x60,0x34,0x6c,0x22, +0x80,0x28,0x7c,0xb2,0x12,0x3e,0xd7,0x50,0x1f,0x7c,0xb2,0x12,0x3e,0x8c,0x3e,0x34, +0x7e,0x7f,0x13,0x8a,0x2d,0xf3,0xb, 0x7a,0x30,0x12,0x3f,0x49,0x59,0x35,0x3b,0x41, +0x30,0x0, 0x5, 0x6d,0x33,0x1b,0x7a,0x30,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72, +0x38,0xd0,0x22,0x2d,0x31,0x7d,0x20,0x1b,0x1a,0x50,0x22,0x3e,0x34,0x7f,0x40,0x2d, +0x93,0xb, 0x4a,0xa0,0xbe,0xe4,0x0, 0x0, 0x22,0x7c,0xa3,0xb, 0x30,0x74,0x2, 0xa4, +0x22,0x6c,0x33,0x90,0x60,0xa7,0xe4,0x93,0x22,0x7c,0xab,0x90,0x60,0xab,0xe4,0x93, +0xbc,0xb7,0x78,0x9, 0x7c,0xba,0x12,0x3e,0xd7,0x50,0x2, 0xd3,0x22,0xc3,0x22,0xca, +0xf8,0x7c,0xfb,0x7e,0x70,0x2, 0x12,0xa4,0xe3,0x7f,0x71,0x7c,0xbf,0x12,0x38,0x82, +0x12,0xc6,0x97,0x7f,0x17,0x12,0x1f,0x8d,0x7c,0xb7,0xda,0xf8,0x22,0xca,0xd8,0xca, +0x79,0x6c,0xff,0x6c,0xee,0x80,0xf, 0x7c,0xbe,0x12,0x3f,0x6f,0x7c,0xdb,0xbc,0xfd, +0x58,0x2, 0x7c,0xfd,0xb, 0xe0,0x12,0x3f,0xb2,0x38,0xec,0x7c,0xbf,0xda,0x79,0xda, +0xd8,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7e,0x22,0x90,0x60,0xa7,0xe4,0x93,0x60,0x2b, +0x6c,0x33,0x80,0x1f,0x7c,0xb3,0x12,0x3e,0xd7,0x40,0x16,0x7c,0xb3,0x12,0x3e,0x8c, +0x7d,0x43,0x6d,0x55,0x7d,0x4, 0x3e,0x4, 0x7e,0x1f,0x13,0x8a,0x2d,0x30,0x1b,0x1a, +0x50,0xb, 0x30,0x7e,0x23,0x2a,0x75,0xbc,0x23,0x38,0xd9,0x22,0x12,0x68,0x48,0x12, +0x24,0xca,0x12,0x71,0x7e,0x12,0x23,0x1d,0x7e,0xb3,0x39,0x50,0x24,0xfd,0x68,0x9, +0xb, 0xb1,0x78,0xf4,0x12,0x2f,0x4e,0x80,0xef,0x12,0x29,0xa4,0x80,0xea,0xca,0xf8, +0x7c,0xab,0xbe,0xa0,0x34,0x38,0x2, 0x21,0x1f,0xbe,0xa0,0x35,0x78,0x6, 0x7e,0xb3, +0x2b,0x10,0x41,0x3e,0xbe,0xa0,0x36,0x68,0x5, 0xbe,0xa0,0x37,0x78,0x1d,0x7e,0x35, +0x8, 0x7d,0x23,0xb, 0x24,0x7a,0x25,0x8, 0x2e,0x37,0x36,0xac,0x7e,0x39,0xb0,0xbe, +0xa0,0x37,0x68,0x2, 0x41,0x3e,0x75,0x1b,0x36,0x41,0x3e,0xbe,0xa0,0x38,0x68,0x5, +0xbe,0xa0,0x39,0x78,0x1b,0x7e,0xf3,0x3a,0x8, 0x7c,0xbf,0x4, 0x7a,0xb3,0x3a,0x8, +0xbe,0xa0,0x39,0x78,0x3, 0x75,0x1b,0x38,0xa, 0x3f,0x9, 0xb3,0x2b,0x21,0x41,0x3e, +0xbe,0xa0,0x3a,0x68,0x5, 0xbe,0xa0,0x3b,0x78,0x1b,0x7e,0xf3,0x3a,0xa, 0x7c,0xbf, +0x4, 0x7a,0xb3,0x3a,0xa, 0xbe,0xa0,0x3b,0x78,0x3, 0x75,0x1b,0x3a,0xa, 0x3f,0x9, +0xb3,0x2b,0x44,0x41,0x3e,0xbe,0xa0,0xfb,0x78,0x6, 0x7e,0xb3,0x2b,0x12,0x41,0x3e, +0xbe,0xa0,0x5e,0x78,0x26,0x7e,0xf, 0x3b,0x8, 0x69,0x30,0x0, 0x8e,0xa, 0x56,0x1e, +0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x1, 0x3, 0x3, 0x54,0xc0,0xa, 0x36,0x5e, +0x34,0x0, 0x3, 0x7c,0xa7,0x4c,0xba,0x44,0x80,0x41,0x3e,0xbe,0xa0,0x3c,0x68,0x5, +0xbe,0xa0,0x3d,0x78,0x1b,0x7e,0xf3,0x3a,0xc, 0x7c,0xbf,0x4, 0x7a,0xb3,0x3a,0xc, +0xbe,0xa0,0x3d,0x78,0x3, 0x75,0x1b,0x3c,0xa, 0x3f,0x9, 0xb3,0x2a,0x7a,0x41,0x3e, +0xbe,0xa0,0x3e,0x68,0x5, 0xbe,0xa0,0x3f,0x78,0x1b,0x7e,0xf3,0x3a,0xe, 0x7c,0xbf, +0x4, 0x7a,0xb3,0x3a,0xe, 0xbe,0xa0,0x3f,0x78,0x3, 0x75,0x1b,0x3e,0xa, 0x3f,0x9, +0xb3,0x2a,0x9d,0x41,0x3e,0xbe,0xa0,0x40,0x40,0xd, 0xbe,0xa0,0x4d,0x38,0x8, 0xa, +0x3a,0x9, 0xb3,0x39,0xe4,0x41,0x3e,0xbe,0xa0,0x4e,0x68,0x5, 0xbe,0xa0,0x4f,0x78, +0x1e,0x7e,0xf3,0x3a,0x29,0x7c,0xbf,0x4, 0x7a,0xb3,0x3a,0x29,0xbe,0xa0,0x4f,0x78, +0x3, 0x75,0x1b,0x4e,0xa, 0x3f,0x2e,0x37,0x36,0xaa,0x7e,0x39,0xb0,0x41,0x3e,0xbe, +0xa0,0x51,0x68,0x5, 0xbe,0xa0,0x52,0x78,0x28,0x7e,0x14,0x60,0x0, 0x6d,0x0, 0x2e, +0x4, 0x0, 0xff,0x7e,0xb3,0x3a,0x34,0xa, 0x3b,0x6d,0x22,0x2f,0x10,0x7e,0x1b,0x70, +0x4, 0x7a,0xb3,0x3a,0x34,0xbe,0xa0,0x52,0x78,0x3, 0x75,0x1b,0x51,0x7c,0xb7,0x41, +0x3e,0xbe,0xa0,0x5c,0x68,0x5, 0xbe,0xa0,0x5d,0x78,0x1a,0x7e,0xf3,0x39,0xfd,0x7c, +0xbf,0x4, 0x7a,0xb3,0x39,0xfd,0xbe,0xa0,0x5d,0x78,0x3, 0x75,0x1b,0x5c,0x7c,0xbf, +0x12,0xb3,0xa, 0x41,0x3e,0xbe,0xa0,0x60,0x40,0xd, 0xbe,0xa0,0x6c,0x38,0x8, 0xa, +0x3a,0x9, 0xb3,0x3a,0xc9,0x41,0x3e,0xbe,0xa0,0x6d,0x78,0x4, 0xe5,0xe, 0x80,0x7e, +0xbe,0xa0,0xf4,0x68,0x5, 0xbe,0xa0,0xf5,0x78,0x18,0x7e,0x35,0xa, 0x7d,0x23,0xb, +0x24,0x7a,0x25,0xa, 0x9, 0xb3,0x36,0xb2,0xbe,0xa0,0xf5,0x78,0x61,0x75,0x1b,0xf4, +0x80,0x5c,0xbe,0xa0,0xf0,0x68,0x5, 0xbe,0xa0,0xf1,0x78,0x9, 0x7c,0x1a,0x2e,0x10, +0x20,0xa5,0xe7,0x80,0x49,0xbe,0xa0,0xf2,0x68,0x5, 0xbe,0xa0,0xf3,0x78,0x1b,0x7e, +0x15,0x10,0x3e,0x14,0x7e,0x1f,0x36,0xae,0x2d,0x31,0xb, 0x1a,0x30,0xbe,0xa0,0xf2, +0x78,0x4, 0xa, 0x56,0x80,0x28,0x7d,0x53,0x80,0x24,0xbe,0xa0,0xf6,0x78,0x4, 0xe5, +0xf, 0x80,0x1b,0xbe,0xa0,0xf7,0x78,0xd, 0x7e,0x34,0x62,0x48,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x50,0x80,0x9, 0xbe,0xa0,0xfd,0x78,0x3, 0xe4,0x80,0x1, 0xe4,0xda,0xf8, +0x22,0x7c,0x7b,0x6c,0xaa,0x12,0x45,0x2e,0x78,0x9, 0x7c,0xb7,0x12,0x89,0x15,0x7c, +0xab,0x80,0xa, 0xb4,0x4, 0x7, 0x7c,0xb7,0x12,0x40,0xe, 0x7c,0xab,0x7c,0xba,0x22, +0x30,0x90,0x19,0xc2,0x90,0xe5,0x19,0x70,0x9, 0x75,0x19,0x1, 0xe5,0x91,0xf5,0x1b, +0x80,0x11,0x7e,0x71,0x91,0xe5,0x1b,0x12,0x42,0x8b,0x5, 0x1b,0x30,0x91,0xb, 0xc2, +0x91,0x5, 0x1b,0xe5,0x1b,0x12,0x42,0x41,0xf5,0x91,0x22,0x7c,0x6b,0x12,0x45,0x2e, +0x78,0x5, 0x7c,0xb6,0x2, 0x88,0x6a,0xb4,0x4, 0x5, 0x7c,0xb6,0x2, 0x42,0xa0,0x22, +0xca,0xf8,0x7c,0x6b,0xa5,0xbe,0x0, 0x9, 0x7c,0xb7,0x12,0x88,0x3f,0xd2,0x8, 0xa1, +0x22,0xa5,0xbe,0x1, 0x3d,0x7a,0x73,0x39,0xe5,0xa5,0xbf,0xad,0x2, 0x80,0x2f,0xa5, +0xbf,0xae,0x4, 0xd2,0x9, 0xa1,0x22,0xa5,0xbf,0xaa,0x5, 0x12,0xc9,0x4, 0x80,0x1e, +0xa5,0xbf,0xab,0xa, 0x7e,0x34,0x5, 0x7a,0x7a,0x37,0x36,0xac,0x80,0x10,0xa5,0xbf, +0xac,0x2, 0x80,0x2, 0xa1,0x22,0x7e,0x34,0x4, 0xfc,0x7a,0x37,0x36,0xac,0x6d,0x33, +0x61,0x9e,0xbe,0x60,0x4, 0x40,0x20,0xbe,0x60,0x8, 0x38,0x1b,0x12,0x45,0x25,0xa5, +0xbe,0x7, 0x7, 0x6d,0x33,0x7a,0x35,0xa, 0xa1,0x22,0xa5,0xbe,0x8, 0x2, 0x80,0x2, +0xa1,0x22,0x12,0x0, 0x6e,0xa1,0x22,0xa5,0xbe,0xa, 0x9, 0x43,0xc, 0x20,0x7a,0x73, +0x39,0xee,0xa1,0x22,0xa5,0xbe,0xb, 0x8, 0x12,0x45,0x25,0x12,0x7, 0xfb,0xa1,0x22, +0xbe,0x60,0x1b,0x40,0x7, 0xbe,0x60,0x1c,0x38,0x2, 0x81,0xba,0xbe,0x60,0x1e,0x40, +0xd, 0xbe,0x60,0x23,0x38,0x8, 0x12,0x45,0x27,0x43,0xc, 0x40,0xa1,0x22,0xbe,0x60, +0x15,0x40,0x1a,0xbe,0x60,0x18,0x38,0x15,0x12,0x45,0x27,0xd2,0x8, 0xa5,0xbe,0x15, +0x2, 0x80,0x2, 0xa1,0x22,0x74,0x7, 0x7a,0xb3,0x39,0xe8,0xa1,0x22,0xa5,0xbe,0x19, +0x7, 0xe4,0x7a,0xb3,0x39,0xfd,0xa1,0x22,0xbe,0x60,0x24,0x40,0x7, 0xbe,0x60,0x2c, +0x38,0x2, 0x81,0xba,0xa5,0xbe,0x2d,0x1b,0x12,0x45,0x27,0x20,0x9, 0x2, 0xa1,0x22, +0x7e,0x63,0x3a,0x10,0x7c,0x46,0x6c,0x55,0xa, 0x37,0x2d,0x32,0x3e,0x34,0x7a,0x35, +0x8, 0xa1,0x22,0xbe,0x60,0x2f,0x40,0xa, 0xbe,0x60,0x33,0x38,0x5, 0x43,0xc, 0x8, +0x81,0xba,0xa5,0xbe,0x34,0xf, 0x43,0xc, 0x10,0xbe,0x70,0x64,0x38,0x2, 0x81,0xba, +0x7e,0x70,0x64,0x81,0xba,0xbe,0x60,0x38,0x68,0x4, 0xa5,0xbe,0x39,0x21,0x43,0xc, +0x1, 0x7e,0xf3,0x3a,0x9, 0x7c,0xbf,0x4, 0x7a,0xb3,0x3a,0x9, 0xa, 0x2f,0x19,0x72, +0x2b,0x21,0xa5,0xbe,0x39,0x2, 0x80,0x2, 0xa1,0x22,0x75,0x1b,0x38,0xa1,0x22,0xbe, +0x60,0x3a,0x68,0x4, 0xa5,0xbe,0x3b,0x21,0x43,0xc, 0x2, 0x7e,0xf3,0x3a,0xb, 0x7c, +0xbf,0x4, 0x7a,0xb3,0x3a,0xb, 0xa, 0x2f,0x19,0x72,0x2b,0x44,0xa5,0xbe,0x3b,0x2, +0x80,0x2, 0xa1,0x22,0x75,0x1b,0x3a,0xa1,0x22,0xa5,0xbe,0xfb,0x9, 0x43,0xc, 0x4, +0x7a,0x73,0x2b,0x12,0xa1,0x22,0xa5,0xbe,0x50,0x6, 0x7a,0x73,0x3a,0x34,0xa1,0x22, +0xbe,0x60,0x3c,0x68,0x4, 0xa5,0xbe,0x3d,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x3a,0xd, +0x7c,0xbf,0x4, 0x7a,0xb3,0x3a,0xd, 0xa, 0x2f,0x19,0x72,0x2a,0x7a,0xa5,0xbe,0x3d, +0x2, 0x80,0x2, 0xa1,0x22,0x75,0x1b,0x3c,0xa1,0x22,0xbe,0x60,0x3e,0x68,0x4, 0xa5, +0xbe,0x3f,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x3a,0xf, 0x7c,0xbf,0x4, 0x7a,0xb3,0x3a, +0xf, 0xa, 0x2f,0x19,0x72,0x2a,0x9d,0xa5,0xbe,0x3f,0x2, 0x80,0x2, 0xa1,0x22,0x75, +0x1b,0x3e,0xa1,0x22,0xbe,0x60,0x40,0x40,0xd, 0xbe,0x60,0x42,0x38,0x8, 0x12,0x45, +0x27,0x75,0xd, 0x1, 0x80,0xa, 0xa5,0xbe,0x43,0xb, 0x12,0x45,0x27,0x75,0xd, 0x2, +0x12,0x45,0x36,0x80,0x7d,0xa5,0xbe,0x44,0x8, 0x12,0x45,0x27,0x12,0x47,0x2e,0x80, +0x71,0xbe,0x60,0x45,0x68,0x4, 0xa5,0xbe,0x46,0x5, 0x12,0x45,0x27,0x80,0x63,0xbe, +0x60,0x4e,0x68,0x4, 0xa5,0xbe,0x4f,0x20,0x43,0xd, 0x4, 0x7e,0xf3,0x3a,0x2a,0x7c, +0xbf,0x4, 0x7a,0xb3,0x3a,0x2a,0xa, 0x2f,0x2e,0x27,0x36,0xaa,0x7a,0x29,0x70,0xa5, +0xbe,0x4f,0x3f,0x75,0x1b,0x4e,0x80,0x3a,0xa5,0xbe,0x6d,0x5, 0x7a,0x71,0xe, 0x80, +0x31,0xbe,0x60,0xf0,0x40,0x25,0xbe,0x60,0xf3,0x38,0x20,0x7c,0x16,0x2e,0x10,0x20, +0x7c,0xb7,0xa5,0xf7,0xa5,0xbe,0xf3,0x1a,0x7e,0x15,0x12,0x7e,0x5, 0x10,0x3e,0x4, +0x7e,0x1f,0x36,0xae,0x2d,0x30,0x1b,0x1a,0x10,0x80,0x7, 0xa5,0xbe,0xf6,0x3, 0x7a, +0x71,0xf, 0xda,0xf8,0x22,0xd2,0x8, 0xa, 0x26,0x19,0x72,0x39,0xe4,0x22,0x7e,0xb3, +0x39,0xe4,0xc4,0x54,0x7, 0x22,0x12,0x47,0xbf,0xb4,0x1, 0x14,0xca,0x39,0x7e,0x18, +0x3a,0x24,0x7e,0x8, 0x25,0xee,0x12,0x20,0xf1,0x1b,0xfd,0x12,0x47,0x7, 0x80,0x12, +0xca,0x39,0x7e,0x18,0x3a,0x24,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xf1,0x1b,0xfd,0x12, +0x47,0x25,0x2, 0x45,0x65,0x7a,0x1f,0x2a,0xfc,0x7a,0xf, 0x2a,0xf8,0x22,0x7a,0xb3, +0x2b,0x0, 0x70,0x14,0x12,0x47,0x25,0x12,0x45,0x65,0x7e,0x18,0x6, 0x76,0x7a,0x1f, +0x6, 0xf4,0x7e,0x18,0x4, 0x7e,0x80,0x10,0xb4,0x1, 0x11,0x12,0x47,0x7, 0x12,0x45, +0x65,0x12,0xc8,0x81,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x22,0x74,0x1, 0x12, +0x0, 0x1e,0xe4,0x12,0x45,0x6e,0x12,0x45,0xb5,0xe4,0x12,0x0, 0x1e,0x74,0x1, 0x12, +0x45,0x6e,0x2, 0x45,0xb5,0xca,0x3b,0x7e,0xd3,0x2a,0x73,0x7e,0xc3,0x2a,0x74,0x7e, +0x8, 0x1f,0x44,0x12,0x86,0xf7,0x7e,0x8, 0x1f,0x8a,0x7e,0x34,0x0, 0x46,0x12,0x21, +0x16,0x7e,0x8, 0x1f,0xd0,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x21,0x16,0x7e,0x8, 0x1f, +0xda,0x7e,0x34,0x0, 0xa, 0x12,0x21,0x16,0x7e,0xf3,0x2a,0xfc,0x7e,0x18,0x2a,0xdc, +0x7a,0x1d,0x24,0x7e,0x18,0x1f,0xd0,0x7a,0x1d,0x28,0x7c,0xbd,0x7c,0x7c,0x7e,0x8, +0x2a,0xb9,0x12,0xbe,0x9e,0x6c,0xee,0x80,0x27,0xa, 0x3e,0x9, 0xa3,0x2a,0xdc,0xa, +0x3a,0x12,0x97,0xb2,0x7c,0xab,0xbe,0xa0,0x1c,0x50,0x13,0xa, 0x3e,0x12,0x46,0xc9, +0xa, 0x4a,0x19,0xb4,0x1f,0x44,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0x8a,0xb, 0xe0, +0xbc,0xce,0x38,0xd5,0x6c,0xee,0x80,0x24,0xa, 0x3e,0x9, 0xa3,0x2a,0xb9,0xbe,0xa0, +0x23,0x50,0x17,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0x12,0x46,0xc9,0xa, 0x4a,0x19,0xb4, +0x1f,0x60,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0xa6,0xb, 0xe0,0xbc,0xde,0x38,0xd8, +0x7e,0xb3,0x2a,0xfd,0x7e,0x8, 0x1f,0xe4,0x60,0x9, 0x7e,0x18,0x1f,0xd0,0x12,0xbb, +0x8f,0x80,0x3, 0x12,0xbe,0x44,0x6c,0xee,0x7e,0x18,0x1f,0xe4,0x7a,0x1f,0x1f,0x34, +0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xd0,0x7a,0x37,0x1f,0x38,0x74,0x2, 0xac,0xbe, +0x49,0x35,0x1f,0xda,0x7a,0x37,0x1f,0x3a,0x7e,0x70,0xe, 0xac,0x7e,0x2e,0x34,0x1f, +0x44,0x6d,0x22,0x7a,0x1f,0x1f,0x3c,0x7e,0x70,0xe, 0xac,0x7e,0x2e,0x34,0x1f,0x8a, +0x7a,0x1f,0x1f,0x40,0x7e,0x8, 0x1f,0x34,0x7c,0xbf,0x7c,0x7e,0x12,0x8, 0xd1,0xb, +0xe0,0xbe,0xe0,0x5, 0x40,0xb2,0xda,0x3b,0x22,0x2e,0x37,0x2a,0xfe,0x7e,0x39,0xb0, +0x22,0x74,0x1, 0x7a,0xb3,0x39,0x50,0x12,0x6f,0xb6,0x12,0x14,0x2a,0x12,0xbd,0xb8, +0xe4,0x12,0xa, 0x66,0x7e,0x24,0x3, 0xd4,0x12,0x50,0x32,0x74,0x1, 0x12,0x45,0x6e, +0x12,0x85,0xc8,0x7e,0x34,0xd0,0xc, 0x12,0x1, 0xe, 0x12,0x45,0x9d,0x7e,0x34,0x0, +0x1, 0x12,0xc8,0xbb,0x2, 0x12,0x6a,0x7e,0x1f,0x25,0xf2,0x7e,0xf, 0x25,0xee,0x22, +0x7a,0xb3,0x2b,0x0, 0x70,0x5, 0x12,0x47,0x25,0x80,0x6, 0xb4,0x1, 0x6, 0x12,0x47, +0x7, 0x12,0x45,0x65,0x22,0x7e,0x1f,0x2b,0x74,0x7e,0xf, 0x2b,0x70,0x22,0x12,0x47, +0xbf,0xb4,0x1, 0x17,0xca,0x39,0x7e,0x18,0x25,0xee,0x7e,0x8, 0x3a,0x24,0x12,0x20, +0xf1,0x1b,0xfd,0x12,0xc8,0xfb,0x12,0x47,0x7, 0x80,0x1a,0xca,0x39,0x7e,0x18,0x2b, +0x70,0x7e,0x8, 0x3a,0x24,0x12,0x20,0xf1,0x1b,0xfd,0x7e,0x37,0x2b,0x76,0x7a,0x37, +0x36,0xaa,0x12,0x47,0x25,0x2, 0x45,0x65,0xe5,0xd, 0x60,0x52,0xe5,0xd, 0x30,0xe0, +0x6, 0x53,0xd, 0xfe,0x12,0x56,0xe7,0xe5,0xd, 0x30,0xe1,0x14,0x53,0xd, 0xfd,0x7e, +0xb3,0x3a,0x28,0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x12,0xc9,0x1e,0x12,0x87,0x0, +0xe5,0xd, 0x30,0xe2,0x29,0x53,0xd, 0xfb,0xe4,0x7a,0xb3,0x3a,0x29,0x7e,0xb3,0x3a, +0x28,0x70,0xa, 0x74,0x1, 0x12,0x0, 0x1e,0x12,0x47,0x25,0x80,0x7, 0xe4,0x12,0x0, +0x1e,0x12,0x47,0x7, 0x12,0x45,0x65,0x7e,0xb3,0x2a,0xfc,0x2, 0x86,0x66,0x22,0x7e, +0xb3,0x3a,0x28,0x7e,0x34,0x0, 0x4, 0x22,0x30,0x8, 0x3b,0xc2,0x8, 0x12,0x26,0x15, +0x7e,0x73,0x39,0xe9,0x7a,0x73,0x2a,0x4d,0x7e,0x73,0x39,0xea,0x7a,0x73,0x2b,0x1d, +0x7e,0x73,0x39,0xea,0x7a,0x73,0x2b,0x1, 0x7e,0xb3,0x39,0xeb,0x60,0x18,0x7e,0x34, +0x0, 0x2, 0x12,0x49,0xbb,0x7e,0x34,0x0, 0x1, 0x12,0x49,0xbb,0x6d,0x33,0x12,0x49, +0xbb,0xe4,0x7a,0xb3,0x39,0xeb,0x12,0x47,0x68,0x2, 0x48,0xc, 0xe5,0xc, 0x70,0x2, +0x21,0x29,0xe5,0xc, 0x30,0xe0,0x10,0x53,0xc, 0xfe,0x12,0x81,0xe1,0x12,0x83,0xd1, +0x7e,0x8, 0x2a,0x6d,0x12,0x9, 0xa1,0xe5,0xc, 0x30,0xe1,0x6, 0x53,0xc, 0xfd,0x12, +0xbe,0x55,0xe5,0xc, 0x30,0xe2,0x32,0x53,0xc, 0xfb,0x7e,0xb3,0x2b,0x12,0x60,0x9, +0x7e,0x8, 0x2a,0x6d,0x12,0x6, 0xba,0x80,0xb, 0x7e,0xb3,0x2b,0x65,0x7e,0x73,0x2b, +0x64,0x12,0xb, 0xad,0x7e,0x73,0x2b,0x12,0x2e,0x70,0xff,0x92,0x1, 0x90,0x60,0x51, +0xe4,0x93,0x9e,0xb3,0x2a,0x77,0x12,0xb, 0x1e,0xe5,0xc, 0x30,0xe3,0x45,0x53,0xc, +0xf7,0x7e,0x73,0x3a,0x16,0x7a,0x73,0x2b,0xf, 0x12,0xab,0xd3,0x7a,0xb3,0x0, 0x5e, +0xbe,0xb0,0xff,0x68,0xb, 0x43,0xc, 0x20,0x7e,0x73,0x0, 0x5e,0x7a,0x73,0x39,0xee, +0x12,0x6c,0x17,0x12,0x4f,0xf7,0x7e,0x73,0x3a,0x17,0xbe,0x73,0x2b,0x62,0x68,0x6, +0x7a,0x73,0x2b,0x62,0xd2,0x10,0x30,0x10,0x7, 0x12,0x6f,0xb4,0xe4,0x12,0xa, 0x66, +0x12,0x6c,0xe8,0xe5,0xc, 0x30,0xe4,0xf, 0x53,0xc, 0xef,0x7e,0x43,0x3a,0x18,0x7e, +0x50,0xa, 0xac,0x45,0x12,0x50,0x32,0xe5,0xc, 0x30,0xe6,0x4e,0x53,0xc, 0xbf,0x7e, +0x73,0x3a,0x4, 0xbe,0x70,0x7, 0x28,0x6, 0x74,0x7, 0x7a,0xb3,0x3a,0x4, 0xa9,0xd5, +0xcb,0x74,0xe, 0x12,0x49,0x2a,0x7c,0x7b,0x5e,0x70,0xf, 0x7e,0x63,0x3a,0x4, 0xa, +0x26,0x2e,0x24,0x0, 0x3, 0x12,0x8b,0xb, 0x7c,0x65,0x4c,0x76,0x74,0xe, 0x12,0x49, +0xb5,0x12,0x49,0x2a,0x12,0x4b,0xb1,0x7e,0x73,0x3a,0x7, 0x7a,0x73,0x2b,0x14,0x7e, +0x73,0x3a,0x6, 0x7a,0x73,0x2b,0x1f,0x12,0xc9,0xd, 0xe5,0xc, 0x30,0xe5,0xa, 0x53, +0xc, 0xdf,0x7e,0xb3,0x39,0xee,0x2, 0x50,0x80,0x22,0xf5,0xfd,0xe5,0xfe,0x22,0xca, +0x79,0xa9,0xd5,0xcb,0x74,0x2, 0x7e,0x70,0x3f,0x12,0x49,0xb5,0x74,0xf, 0x12,0x49, +0x2a,0x7c,0xfb,0x74,0xf, 0x7c,0x7f,0x5e,0x70,0xfe,0x12,0x49,0xb5,0x74,0xc, 0x12, +0x49,0x2a,0x7c,0xfb,0x54,0x7f,0x68,0x8, 0x74,0xc, 0x7e,0x70,0xf8,0x12,0x49,0xb5, +0x90,0x61,0x18,0xe4,0x93,0x7c,0xab,0xbe,0xa0,0x7, 0x38,0xb, 0x12,0x4f,0x3b,0x7c, +0xb7,0xa, 0x7b,0xb, 0x75,0x80,0x16,0x90,0x61,0x17,0xe4,0x93,0xb4,0x1, 0xe, 0xbe, +0xa0,0x7, 0x28,0x9, 0x12,0x4f,0x3b,0xa, 0x77,0x2e,0x74,0x0, 0x7, 0x74,0xe, 0x7c, +0x7f,0x12,0x49,0xb5,0x74,0x7, 0x12,0x49,0x2a,0x7c,0xfb,0x5e,0xf0,0xfb,0x90,0x60, +0x2, 0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x3e,0x34,0x4c,0xf7,0x74,0x7, 0x7c,0x7f,0x12, +0x4b,0xae,0xda,0x79,0x22,0xf5,0xfd,0x7a,0x71,0xfe,0x22,0xca,0xd8,0xca,0x79,0x7d, +0xd3,0x90,0x60,0x50,0xe4,0x93,0x7c,0xfb,0x90,0x60,0x51,0xe4,0x93,0x7c,0x8b,0xa, +0x38,0xa, 0xcf,0x2d,0xc3,0xb, 0xc4,0x7d,0x3c,0x7c,0xe7,0x12,0x26,0x86,0xa9,0xd0, +0xc4,0xa9,0xd5,0xcb,0x74,0x7, 0x12,0x49,0x2a,0x7c,0x8b,0x74,0x7, 0x7e,0x70,0xf, +0x12,0x4b,0xae,0x7e,0x54,0x0, 0x78,0x7e,0x1f,0x3b,0xc, 0x79,0x51,0x0, 0x6, 0x7e, +0x54,0x0, 0x80,0x7e,0x1f,0x3b,0xc, 0x79,0x51,0x0, 0x8, 0x7e,0x54,0x0, 0xc, 0x7e, +0x1f,0x3b,0xc, 0x79,0x51,0x0, 0x10,0xbe,0xd4,0x0, 0x2, 0x78,0xb, 0x7e,0x1f,0x3b, +0xc, 0x12,0x4b,0xa6,0x44,0x1, 0x80,0x20,0x7e,0x1f,0x3b,0xc, 0x12,0x4b,0xa6,0x44, +0x8, 0x1b,0x1a,0x50,0x4d,0xdd,0x7e,0x1f,0x3b,0xc, 0x78,0x7, 0x12,0x4b,0xa6,0x54, +0xfb,0x80,0x5, 0x12,0x4b,0xa6,0x44,0x4, 0x1b,0x1a,0x50,0x7e,0x1f,0x3b,0x8, 0x69, +0xe1,0x0, 0x84,0x69,0x51,0x0, 0x90,0x7d,0xf5,0x2e,0x34,0x0, 0x90,0x5e,0xa0,0xf6, +0x1b,0x1a,0x50,0x7e,0xb3,0x39,0x5a,0xbe,0xb0,0x6, 0x40,0x3, 0xb4,0xff,0xe, 0x12, +0x4b,0xbb,0x54,0xe6,0x12,0x4b,0xb8,0x4e,0x54,0x1, 0xa4,0x80,0xc, 0x12,0x4b,0xbb, +0x5e,0x54,0xfe,0xe6,0x12,0x4b,0xb8,0x44,0xa4,0x1b,0x1a,0x50,0xbe,0xd4,0x0, 0x2, +0x78,0x2d,0x7e,0x1f,0x3b,0xc, 0x12,0x4b,0xa6,0x5e,0x54,0x0, 0xf, 0x1b,0x1a,0x50, +0x7e,0x1f,0x3b,0xc, 0x12,0x4b,0xa6,0x44,0x50,0x1b,0x1a,0x50,0x7e,0x34,0x0, 0x2, +0x12,0x4c,0x3f,0x12,0x4c,0x18,0x12,0x4b,0xf5,0x7a,0x37,0x36,0xb2,0x61,0x62,0x6c, +0xdd,0x61,0x5c,0x4c,0xdd,0x78,0x4, 0x6c,0x99,0x80,0x2b,0xbc,0xfd,0x40,0x12,0xa, +0xcd,0x9, 0x9c,0x2a,0xb8,0xbe,0x90,0x23,0x40,0x3, 0x7e,0x90,0x22,0xb, 0x90,0x80, +0x15,0xa, 0x3f,0xa, 0xcd,0x9d,0xc3,0x9, 0x9c,0x2a,0xdb,0xbe,0x90,0x1c,0x40,0x3, +0x7e,0x90,0x1b,0x2e,0x90,0x24,0x7e,0x1f,0x3b,0xc, 0x12,0x4b,0xa6,0x5e,0x54,0x0, +0xf, 0x1b,0x1a,0x50,0xa, 0xc9,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x7e,0x1f, +0x3b,0xc, 0x12,0x4b,0xa6,0x4d,0x5c,0x1b,0x1a,0x50,0xe5,0xe, 0x60,0x7, 0xe5,0xe, +0xbe,0xb0,0x64,0x28,0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x4, 0xe5,0xe, 0xa, 0x3b,0x12, +0x4c,0x3f,0x12,0x4c,0x18,0xbe,0xd4,0x0, 0x1, 0x78,0x10,0x12,0x4c,0x18,0x12,0x4b, +0xf5,0x74,0x2, 0xac,0xbd,0x59,0x35,0x36,0xb4,0x80,0xf, 0x12,0x4b,0xf5,0xa, 0x5e, +0xa, 0x2d,0x2d,0x25,0x3e,0x24,0x59,0x32,0x36,0xb4,0xb, 0xd0,0xbc,0xed,0x28,0x2, +0x41,0xc3,0xa9,0xd5,0xcb,0x74,0x7, 0x7c,0x78,0x12,0x4b,0xae,0xa9,0xc0,0xc4,0x7e, +0x1f,0x3b,0x8, 0x79,0xe1,0x0, 0x84,0x7e,0x1f,0x3b,0x8, 0x79,0xf1,0x0, 0x90,0x6d, +0x33,0x7e,0xf, 0x3b,0xc, 0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x3b,0xc, 0x79,0x30,0x0, +0x8, 0x7e,0xf, 0x3b,0xc, 0x79,0x30,0x0, 0x10,0x7e,0xf, 0x3b,0xc, 0x79,0x30,0x0, +0xe, 0xda,0x79,0xda,0xd8,0x22,0x2e,0x34,0x0, 0xe, 0xb, 0x1a,0x50,0x22,0x12,0x49, +0xb5,0x75,0xfd,0xff,0xa9,0xc5,0xcb,0x22,0x1b,0x1a,0x50,0x7e,0x1f,0x3b,0x8, 0x2e, +0x34,0x0, 0x84,0xb, 0x1a,0x50,0x22,0x6d,0x33,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, +0x12,0x12,0x69,0x9f,0xe5,0x34,0x20,0xe7,0x1b,0xa9,0xd5,0xcb,0x74,0x3, 0x7e,0x71, +0x27,0x12,0x49,0xb5,0x74,0xb, 0x7e,0x71,0x2f,0x12,0x49,0xb5,0x74,0xc, 0x7e,0x71, +0x30,0x12,0x4b,0xae,0x22,0x7e,0xf, 0x3b,0xc, 0x69,0x30,0x0, 0xa, 0x7d,0x23,0x6d, +0x33,0x69,0x10,0x0, 0xc, 0x6d,0x0, 0x2f,0x10,0x74,0x7, 0x1e,0x34,0x1e,0x24,0x50, +0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x22,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3b,0xc, +0x79,0x30,0x0, 0x4, 0x7e,0xf, 0x3b,0xc, 0x69,0x30,0x0, 0x12,0x5e,0x34,0x0, 0x1, +0x68,0xf2,0x7e,0x34,0x0, 0x1, 0x79,0x30,0x0, 0x12,0x22,0x7e,0x34,0x0, 0x1, 0x7d, +0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74,0xfa,0x12,0x4f,0x4a,0x7c,0x23,0x1b, +0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24,0x4d,0x33,0x78,0xe6,0x22,0xca,0x3b, +0x75,0x24,0x0, 0x6c,0xff,0x12,0x4f,0xe9,0x75,0x28,0x3, 0x6c,0xee,0x75,0x29,0x0, +0x7e,0x48,0x29,0xbc,0x7e,0xb3,0x2a,0xb, 0x70,0xe, 0x7e,0xb3,0x2a,0x7, 0x70,0x8, +0x7e,0xb3,0x2a,0x8, 0x70,0x2, 0xc1,0x90,0x30,0xb, 0x6, 0x7e,0x68,0x33,0x5f,0x80, +0x4, 0x7e,0x68,0x33,0x21,0x7f,0x6, 0x12,0xc8,0xe0,0x7e,0x73,0x2a,0x4, 0x7a,0x6b, +0x70,0x6c,0xdd,0xc1,0xf, 0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29,0xc, 0x7c,0xbc,0x54, +0xf, 0x12,0xc8,0x8a,0xf5,0x28,0x7c,0xbc,0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2, 0xc1, +0xd, 0xe5,0x28,0xbe,0xb0,0x3, 0x78,0x2, 0xc1,0xd, 0x7e,0x8, 0x0, 0x28,0x7c,0xbc, +0x12,0xa1,0x2b,0x50,0x2, 0xc1,0xd, 0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xd, 0xf5, +0x25,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xe, 0xc4,0x54,0xf0,0xf5,0x26,0x7e,0x73, +0x2a,0x4d,0xbc,0x7c,0x28,0x54,0x7e,0xb3,0x2a,0x9, 0x70,0x2a,0x75,0x2a,0xf, 0x7e, +0x8, 0x0, 0x25,0xa, 0x3c,0x2e,0x34,0x33,0xd, 0x6d,0x22,0x74,0x1, 0x12,0x8f,0xd7, +0x75,0x2a,0x20,0x7e,0x8, 0x0, 0x26,0xa, 0x3c,0x2e,0x34,0x33,0x17,0x6d,0x22,0x74, +0x10,0x12,0x8f,0xd7,0x80,0xe, 0xa, 0x3c,0x9, 0xb3,0x33,0xd, 0xf5,0x25,0x9, 0xb3, +0x33,0x17,0xf5,0x26,0xa, 0x3c,0x12,0xc8,0x8c,0xb4,0x1, 0xe, 0xe4,0xa, 0x3c,0x19, +0xb3,0x33,0xd, 0x19,0xb3,0x33,0x17,0x12,0x4f,0xe9,0x7e,0xb3,0x2a,0x64,0xb4,0xff, +0x13,0x75,0x25,0x0, 0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xc, 0xbe,0xb0,0xff,0x68, +0x3, 0x75,0x25,0x1, 0x7e,0x90,0x9, 0xac,0x9d,0x49,0xb4,0x29,0x8, 0x49,0xa4,0x29, +0xa, 0xe5,0x28,0x60,0x5, 0xe5,0x28,0xb4,0x1, 0x2, 0x5, 0x29,0xe5,0x28,0xb4,0x1, +0x2c,0x75,0x27,0x0, 0x80,0x1d,0x7e,0x71,0x27,0x74,0x9, 0xac,0x7b,0x9, 0xb3,0x33, +0xa1,0x54,0xf, 0xbc,0xbc,0x78,0xa, 0x49,0xb3,0x33,0x9d,0x49,0xa3,0x33,0x9f,0x80, +0xc, 0x5, 0x27,0x90,0x60,0x99,0xe4,0x93,0xbe,0xb1,0x27,0x38,0xd9,0x5e,0xb4,0xf, +0xff,0x5e,0xa4,0xf, 0xff,0x9, 0x74,0x29,0xc, 0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab, +0xe4,0x2d,0xa5,0xbe,0x70,0xff,0x68,0x16,0xe5,0x28,0xbe,0xb0,0x1, 0x68,0x2, 0x5, +0x24,0xb, 0xf0,0xe5,0x28,0xa, 0x5b,0x12,0xbb,0xe9,0x2d,0xb5,0x80,0x4, 0x2e,0xb4, +0xc0,0x0, 0x7e,0x70,0x6, 0xac,0x7e,0x7f,0x6, 0x2d,0x13,0x79,0xb0,0x0, 0x2, 0x7f, +0x6, 0x2d,0x13,0x79,0xa0,0x0, 0x4, 0xe5,0x25,0x7f,0x6, 0x2d,0x13,0x39,0xb0,0x0, +0x6, 0xe5,0x26,0x2d,0x3d,0x7d,0x2c,0x39,0xb1,0x0, 0x7, 0xb, 0xe0,0xb, 0xd0,0x7e, +0x73,0x2a,0x4d,0xbc,0x7d,0x28,0x2, 0x81,0xa5,0xe5,0x24,0x39,0xb6,0x0, 0x1, 0x7e, +0xb3,0x39,0x79,0xb4,0x1, 0x9, 0x7e,0xb3,0x2a,0x8, 0xb4,0x1, 0x49,0x80,0x44,0xbe, +0xf0,0x0, 0x38,0x6, 0x7e,0xb3,0x2a,0x8, 0x60,0x3c,0x30,0xa, 0x28,0x12,0x4e,0xb9, +0x7e,0x34,0x0, 0x1e,0x12,0x4c,0x3f,0x7e,0x10,0xa, 0x7e,0x34,0x0, 0x5, 0x12,0x4c, +0x3f,0x30,0xa, 0x4, 0x1b,0x10,0x78,0xf2,0xe4,0x12,0x4e,0xbe,0x7e,0x34,0x0, 0x3, +0x12,0x4c,0x3f,0xc2,0xa, 0xb2,0xb, 0xe5,0x29,0xbe,0xb0,0x0, 0x28,0x5, 0x75,0x18, +0x0, 0xd2,0xa, 0x12,0x4e,0xb9,0x7e,0xb3,0x2a,0x7, 0x60,0x5, 0x7f,0x4, 0x12,0x71, +0xfd,0xe4,0x7a,0xb3,0x2a,0xb, 0x7a,0xb3,0x2a,0x7, 0x7a,0xb3,0x2a,0x8, 0x80,0x4, +0xe4,0x12,0x4e,0xbe,0x12,0x8f,0x3c,0xca,0x59,0x7e,0x18,0x29,0x8, 0x7e,0x8, 0x33, +0x9d,0x12,0x20,0xf1,0x1b,0xfd,0x4c,0xff,0x78,0xc, 0x12,0x77,0xcf,0x7e,0x8, 0x33, +0x9d,0x74,0xff,0x12,0x21,0x16,0xda,0x3b,0x22,0x12,0x4f,0x65,0x74,0x1, 0x70,0x3, +0xd2,0x86,0x22,0xc2,0x86,0x22,0x12,0x4f,0xf0,0xc2,0x0, 0x12,0xba,0x85,0xc2,0x2, +0x12,0x4f,0xa5,0xc2,0x0, 0x12,0x4f,0xfe,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x49,0x2a, +0x7a,0x1b,0xb0,0x74,0xf, 0x6c,0x77,0x12,0x49,0xb5,0xe5,0xfc,0x7a,0xb, 0xb0,0x43, +0xfc,0x10,0x2, 0x4b,0xb1,0x24,0xab,0x68,0x10,0x24,0xef,0x68,0x1c,0x24,0xde,0x68, +0x26,0x24,0xde,0x78,0x2f,0x74,0x5, 0x80,0x2d,0x7e,0xb3,0x34,0x4f,0xb4,0x5, 0x2a, +0x12,0x4c,0x3b,0x12,0xba,0x3d,0x2, 0x4f,0xd2,0x7e,0xb3,0x34,0x4f,0xb4,0x5, 0x1a, +0x12,0x4c,0x3b,0x75,0xe9,0xff,0x22,0x7e,0xb3,0x34,0x4f,0xb4,0x5, 0xc, 0x12,0x4c, +0x3b,0x2, 0x4f,0xcc,0x74,0x1, 0x7a,0xb3,0x34,0x4f,0x22,0xa, 0x3a,0x2e,0x34,0x0, +0x3, 0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x22,0x7c,0xab,0x80,0xe, 0x7e,0x70, +0x3, 0x80,0x1, 0x0, 0x7c,0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7,0x7c,0x6a,0x1b,0xa0, +0xa5,0xbe,0x0, 0xea,0x22,0x7e,0xb3,0x3a,0x39,0x4, 0x7a,0xb3,0x3a,0x39,0xe5,0x1a, +0xb4,0x1, 0x8, 0xe4,0x7a,0xb3,0x3a,0x39,0x75,0x1a,0x0, 0x7e,0x73,0x3a,0x39,0x7a, +0x73,0x39,0x38,0x22,0x7c,0x6b,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x49,0xb5,0x7a,0x61, +0xfc,0x12,0x4b,0xb1,0x12,0x6a,0xe2,0xd2,0x0, 0x12,0x4f,0xfe,0x12,0x4f,0xbf,0x12, +0x14,0x13,0x2, 0x13,0xcb,0xa9,0xd0,0xce,0xa2,0x2, 0xa9,0x91,0xc9,0x22,0x30,0x1, +0x6, 0x12,0x4f,0xbf,0x2, 0x13,0xcb,0x12,0x4f,0xf0,0xc2,0x2, 0x2, 0x4f,0xa5,0xd2, +0x2, 0x12,0x4f,0xa5,0x74,0x1, 0x22,0xd2,0x1, 0x2, 0x4f,0xae,0x75,0xe7,0x6b,0x2, +0x4f,0xd2,0xe4,0x7e,0x34,0xd7,0xfc,0x7e,0x24,0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34, +0xd7,0xfd,0x7a,0x1b,0xb0,0x75,0xe9,0xff,0x22,0x75,0x25,0x0, 0x75,0x26,0x0, 0x22, +0xe4,0x12,0x14,0x13,0x2, 0x13,0xcb,0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0xa2,0x0, +0xa9,0x97,0xc1,0xa2,0x0, 0xa9,0x97,0xc2,0x22,0x12,0xc9,0x4, 0x12,0xc8,0xfb,0x6d, +0x33,0x7a,0x35,0xa, 0x12,0x50,0x5f,0x12,0x50,0x39,0x74,0x50,0x7a,0xb3,0x3a,0x18, +0x7e,0x24,0x3, 0x20,0x12,0x50,0x32,0xe4,0x12,0xc8,0x78,0x6d,0x33,0x7a,0x37,0x3b, +0x54,0x22,0x7d,0x32,0x74,0xfa,0x2, 0x13,0x5, 0x7e,0x73,0x2b,0x62,0x7a,0x73,0x3a, +0x17,0x22,0xa2,0xe, 0xe4,0x33,0x7a,0xb3,0x3a,0x12,0x7e,0x73,0x3a,0x16,0xbe,0x73, +0x2b,0xf, 0x68,0xa, 0xe5,0xc, 0x70,0x6, 0x12,0x50,0x5f,0x12,0x50,0x39,0x22,0x7e, +0x73,0x2b,0xf, 0x7a,0x73,0x3a,0x16,0x7e,0x73,0x2b,0x1f,0x7a,0x73,0x3a,0x6, 0x7e, +0x73,0x2b,0x20,0x7a,0x73,0x3a,0x5, 0x7e,0x73,0x2b,0x14,0x7a,0x73,0x3a,0x7, 0x22, +0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x61,0xc5,0xe4,0x93,0x7c,0xab,0xbe,0xd0,0x80, +0x78,0x18,0x7e,0xe0,0xff,0x6c,0xff,0x80,0xb, 0x12,0x50,0xf1,0x38,0x4, 0x7c,0xeb, +0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0x80,0x1a,0xbe,0xd0,0x81,0x78,0x15,0x6c, +0xee,0x6c,0xff,0x80,0xb, 0x12,0x50,0xf1,0x40,0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0, +0xbc,0xaf,0x38,0xf1,0xbc,0xad,0x38,0x2, 0x6c,0xdd,0x7c,0xbd,0x12,0x6c,0x68,0x12, +0x50,0x77,0x7e,0x73,0x2b,0x1f,0x7a,0x73,0x3a,0x6, 0x12,0x51,0xd, 0x7e,0x73,0x2b, +0xf, 0x7a,0x73,0x3a,0x16,0x12,0x50,0x39,0x7a,0xd3,0x39,0xee,0xda,0x79,0xda,0xd8, +0x22,0x7e,0x90,0x5, 0xac,0x9f,0x9, 0xb4,0x26,0x33,0xbc,0xbe,0x22,0x30,0x0, 0x3, +0x12,0x50,0x77,0xa2,0x1, 0x92,0x2, 0x12,0x51,0xcc,0x2, 0x51,0xd, 0x7e,0x73,0x2b, +0x20,0x7a,0x73,0x3a,0x5, 0x22,0x74,0x40,0x12,0x7e,0x2a,0x50,0x9, 0xd2,0x0, 0xd2, +0x1, 0x12,0x50,0xfd,0x80,0x1c,0x74,0x1, 0x12,0x51,0x50,0x7e,0x43,0x3a,0x3, 0x7e, +0x50,0x64,0xac,0x45,0x12,0x96,0xdd,0x7a,0xb3,0x2b,0x1f,0x7e,0xf, 0x3b,0x21,0x12, +0x55,0xa2,0x12,0x51,0xd, 0x7e,0x73,0x2b,0x1f,0x7a,0x73,0x3a,0x6, 0x2, 0x50,0x77, +0xca,0x3b,0x7c,0xdb,0xe4,0x7a,0xb3,0x2b,0x14,0x12,0x4f,0xf7,0x7e,0xc0,0xa, 0x12, +0x56,0x75,0x30,0xf, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x1f,0x3b,0x21,0x12,0x96, +0xfc,0x7d,0x73,0xbe,0x74,0xff,0xff,0x78,0x9, 0x12,0x51,0xc0,0x2e,0x34,0x0, 0x3, +0x80,0x18,0xbe,0x74,0x80,0x0, 0x28,0x7, 0x12,0x51,0xc0,0xb, 0x35,0x80,0xb, 0xbe, +0x74,0x40,0x0, 0x28,0xc, 0x12,0x51,0xc0,0xb, 0x34,0x1b,0xa, 0x30,0x1b,0xc0,0x78, +0xbe,0xbe,0xd0,0x1, 0x78,0x9, 0x7e,0x1f,0x3b,0x21,0x12,0x95,0xda,0x7d,0x73,0x7e, +0x1f,0x3b,0x10,0x69,0x31,0x0, 0x1a,0x7a,0x73,0x2b,0x14,0x7d,0x37,0xda,0x3b,0x22, +0x7e,0xf, 0x3b,0x10,0x2e,0x14,0x0, 0x1a,0xb, 0xa, 0x30,0x22,0xca,0x3b,0x7e,0x34, +0xff,0xff,0x7a,0x35,0x35,0x7e,0xb3,0x39,0xf9,0xf5,0x2a,0x7e,0xb3,0x2a,0x6d,0xf5, +0x2b,0x7e,0xb3,0x2a,0x6e,0xf5,0x2c,0x7e,0xb3,0x2a,0x70,0xf5,0x2d,0x7e,0xb3,0x2a, +0x6f,0xf5,0x2e,0x7e,0x34,0x27,0x10,0x7a,0x35,0x2f,0x7e,0x18,0x40,0x0, 0x7a,0x1d, +0x31,0x12,0x56,0x6e,0x30,0xf, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x8, 0x34,0x0, +0x12,0x56,0x66,0x6c,0xff,0x80,0x35,0x12,0x54,0x45,0x6c,0xee,0x80,0x19,0x7e,0x11, +0x2c,0xac,0x1e,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x3f,0x2d,0x10,0x7e,0x1d,0x31,0x2d, +0x31,0xb, 0x1a,0x10,0x12,0x54,0x4e,0xe5,0x2e,0xbc,0xbe,0x38,0xe1,0xe5,0x2e,0x12, +0x54,0x5d,0x74,0x2, 0xac,0xbf,0x59,0x35,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf, +0x38,0xc5,0x12,0x7f,0xdf,0x68,0xb, 0x7e,0x34,0x10,0x0, 0x12,0x54,0x83,0x59,0x35, +0x33,0xfe,0x6c,0xff,0x80,0x74,0x12,0x54,0x45,0x6c,0xee,0x80,0x12,0x12,0x56,0x3f, +0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x12,0x54,0x4c,0xe5, +0x2a,0xbc,0xbe,0x38,0xe8,0xe5,0x2a,0x12,0x54,0x5d,0x74,0x4, 0xac,0xbf,0x59,0x35, +0x3, 0x6f,0xe5,0x2a,0xbe,0xb1,0x2d,0x50,0x33,0x12,0x54,0x45,0x7e,0xe1,0x2a,0x80, +0x12,0x12,0x56,0x3f,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4, +0x12,0x54,0x4c,0xe5,0x2d,0xbc,0xbe,0x38,0xe8,0xe5,0x2a,0xa, 0x3b,0x6d,0x22,0xe5, +0x2d,0xa, 0x1b,0x6d,0x0, 0x9f,0x1, 0x12,0x54,0x61,0x80,0x4, 0x7e,0x34,0x10,0x0, +0x74,0x4, 0xac,0xbf,0x59,0x35,0x3, 0x71,0xb, 0xf0,0xe5,0x2e,0xbc,0xbf,0x38,0x86, +0xe5,0x2d,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x28,0x12,0x1f,0x3c,0x6c,0xff,0x80, +0x2e,0x74,0x2, 0xac,0xbf,0x49,0x25,0x34,0x0, 0xa, 0x5f,0xad,0x53,0x7e,0x14,0x10, +0x0, 0x9d,0x15,0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80, +0x14,0x78,0xf4,0x7d,0x21,0x74,0x2, 0xac,0xbf,0x59,0x25,0x34,0x0, 0xb, 0xf0,0xe5, +0x2d,0xbc,0xbf,0x38,0xcc,0xe5,0x2b,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x51,0x12, +0x1f,0x3c,0x6c,0xff,0x80,0x5c,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x6f,0xa, 0x1f, +0xad,0x13,0x7e,0xf4,0x10,0x0, 0x9d,0xf1,0xad,0xf2,0x74,0xc, 0x1e,0xf4,0x1e,0xe4, +0x50,0x4, 0x4e,0xf4,0x80,0x0, 0x14,0x78,0xf3,0x7d,0x2f,0x74,0x4, 0xac,0xbf,0x59, +0x25,0x3, 0x6f,0xe5,0x2a,0xbe,0xb1,0x2d,0x50,0x26,0x74,0x4, 0xac,0xbf,0x49,0x25, +0x3, 0x71,0x2e,0x14,0x10,0x0, 0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, +0x4e,0x20,0x80,0x14,0x78,0xf4,0x7d,0x21,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x71, +0xb, 0xf0,0xe5,0x2b,0xbc,0xbf,0x38,0x9e,0x7e,0x73,0x39,0xfb,0xa, 0x37,0x6d,0x22, +0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0xf4,0x0, 0x64,0x7d,0x1f,0x12,0x1f,0x3a, +0x7d,0xe3,0x7a,0xe5,0x35,0x7e,0x73,0x39,0xfc,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f, +0x11,0x14,0x78,0xfb,0x7d,0x1f,0x12,0x1f,0x3a,0x7d,0x63,0x6c,0xff,0x80,0x20,0x74, +0x2, 0xac,0xbf,0x49,0x45,0x34,0x0, 0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59, +0x35,0x34,0x0, 0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x34,0x0, 0xb, 0xf0,0xe5, +0x2d,0xbc,0xbf,0x38,0xda,0x6c,0xff,0x80,0x3a,0x74,0x4, 0xac,0xbf,0x49,0x45,0x3, +0x6f,0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35,0x3, 0x6f,0x80,0x8, 0xbd, +0x46,0x50,0x4, 0x59,0x65,0x3, 0x6f,0x49,0x45,0x3, 0x71,0xbe,0x45,0x35,0x28,0x9, +0x7e,0x35,0x35,0x59,0x35,0x3, 0x71,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x3, +0x71,0xb, 0xf0,0xe5,0x2b,0xbc,0xbf,0x38,0xc0,0x30,0x2, 0x6, 0x7e,0xd, 0x31,0x12, +0x55,0xa2,0xda,0x3b,0x22,0x9f,0x11,0x7a,0x1f,0x24,0xf4,0x22,0x7d,0x13,0x6d,0x0, +0x7e,0x1f,0x24,0xf4,0x2f,0x10,0x7a,0x1f,0x24,0xf4,0xb, 0xe0,0x22,0xa, 0x1b,0x6d, +0x0, 0x7e,0x1f,0x24,0xf4,0x12,0x1f,0x3c,0x7a,0x1f,0x24,0xf4,0x7e,0x25,0x2f,0x74, +0xc, 0x7d,0x13,0x7d,0x32,0x6d,0x22,0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14, +0x2, 0x1f,0x3a,0x7e,0xa1,0x2c,0x74,0x2, 0xa4,0x22,0xca,0x3b,0x7e,0x8, 0x1f,0x34, +0x12,0x56,0x66,0x7e,0x1f,0x33,0xf8,0x7a,0x1d,0x26,0x7e,0xb3,0x2a,0x74,0xf5,0x2d, +0x7e,0xb3,0x3a,0xce,0xb4,0x1, 0x6, 0x7e,0x38,0x3a,0xd0,0x80,0x4, 0x7e,0x38,0x5, +0xf8,0x6d,0x33,0x7a,0x35,0x2a,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x3a,0xcf,0x70, +0xe, 0x7e,0xb3,0x3a,0xcd,0x70,0x8, 0x74,0x1, 0x7a,0xb3,0x3a,0xcf,0xa1,0x5e,0x7e, +0xb3,0x3a,0xcf,0x70,0x6, 0x74,0x1, 0x7a,0xb3,0x3a,0xcf,0x7e,0xb3,0x3a,0xce,0xb4, +0x1, 0x17,0x75,0x2c,0x0, 0x80,0x9, 0x12,0x54,0x83,0x12,0x55,0x92,0x12,0x56,0x2e, +0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xf0,0x80,0x1b,0x75,0x2c,0x0, 0x80,0xf, 0x12,0x54, +0x83,0x12,0x55,0x92,0x3e,0x24,0x3e,0x24,0x1e,0x24,0x12,0x56,0x2e,0xe5,0x2d,0xbe, +0xb1,0x2c,0x38,0xea,0x7e,0x34,0x61,0x59,0x12,0x23,0xc9,0x7a,0x35,0x2e,0x7e,0x18, +0x1f,0x34,0x7f,0x1, 0x12,0x7a,0x3c,0x75,0x2c,0x0, 0x80,0x16,0x12,0x54,0x83,0x12, +0x55,0x8b,0xbe,0x35,0x2a,0x8, 0x9, 0x12,0x54,0x83,0x12,0x55,0x8b,0x7a,0x35,0x2a, +0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xe3,0x12,0x55,0x9a,0x40,0x25,0x7e,0xb3, +0x3a,0xce,0xb4,0x1, 0x1e,0x5, 0x1f,0xe5,0x1f,0xbe,0xb0,0xa, 0x40,0x15,0x75,0x1f, +0x0, 0xe5,0x2d,0xa, 0x3b,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x26,0x7f,0x3, 0x12,0x20, +0xf1,0x1b,0xfd,0x74,0x2, 0x12,0x0, 0x1e,0x12,0x55,0x9a,0x50,0xb, 0x74,0x2, 0x7a, +0xb3,0x33,0xf7,0xe4,0x7a,0xb3,0x3a,0xcf,0xda,0x3b,0x22,0x49,0x35,0x1f,0x34,0x2, +0x21,0x48,0x7f,0x13,0x2d,0x35,0xb, 0x1a,0x20,0x22,0x7e,0x37,0x2b,0x7, 0xbe,0x35, +0x2a,0x22,0x12,0x55,0xac,0xb, 0x34,0x7a,0x73,0x2b,0x20,0x22,0xca,0x79,0x7f,0x10, +0x9f,0x0, 0x12,0xc9,0x5d,0x4c,0xaa,0x78,0x6, 0x7e,0x34,0x0, 0x40,0x80,0x6c,0x6c, +0x99,0x80,0x38,0xa, 0xe9,0x2e,0xe4,0x60,0xac,0x7d,0x7e,0x7a,0xf1,0x82,0x7a,0xe1, +0x83,0xe4,0x93,0x7c,0x8b,0x90,0x60,0xaa,0xe4,0x93,0x70,0xe, 0x7e,0xf3,0x2a,0x6e, +0xac,0xf8,0x7e,0xb3,0x2a,0x70,0xa, 0xfb,0x2d,0xf7,0x7d,0xef,0x3e,0xe4,0x7f,0x61, +0x2d,0xde,0xb, 0x6a,0xd0,0x6d,0xcc,0x2f,0x6, 0xb, 0x90,0xbc,0xa9,0x38,0xc4,0xbe, +0x8, 0x0, 0x0, 0x78,0x2, 0xb, 0xc, 0xa, 0x5a,0x6d,0x44,0x7f,0x10,0x7f,0x2, 0x12, +0x1f,0x3c,0x7f,0x1, 0xb, 0xc, 0x7e,0x34,0xc4,0x0, 0x7e,0x24,0x0, 0x9, 0x12,0x1f, +0x3c,0xbe,0x34,0x0, 0xfa,0x28,0x4, 0x7e,0x34,0x0, 0xfa,0xda,0x79,0x22,0x7e,0xd, +0x26,0x2d,0x15,0xb, 0xa, 0x30,0x9d,0x32,0x59,0x35,0x1f,0x34,0x5, 0x2c,0x22,0x7e, +0x11,0x2c,0xac,0x1f,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x10,0x7e,0x1d,0x31, +0x2d,0x31,0xb, 0x1a,0x20,0x7a,0x27,0x24,0xf2,0x74,0x2, 0xac,0xbe,0x49,0x35,0x34, +0x0, 0xad,0x23,0x74,0xc, 0x22,0x7e,0x34,0x0, 0x38,0xe4,0x2, 0x21,0x16,0x7e,0x8, +0x2a,0x6d,0x12,0xd, 0x72,0xe4,0x12,0x0, 0xe, 0x74,0x1, 0x7e,0x70,0x99,0x12,0x13, +0x61,0x2, 0x0, 0x4e,0xb4,0x3, 0x5, 0x12,0x56,0x94,0x80,0x2, 0xe4,0x22,0x12,0x56, +0x79,0x74,0x1, 0x22,0x12,0x7f,0xc4,0xe4,0x12,0x0, 0xe, 0x7e,0x8, 0x2a,0x6d,0x2, +0xd, 0x72,0x12,0x8a,0x51,0x38,0x2, 0xe4,0x22,0x12,0x8a,0x49,0x49,0x55,0x34,0x3b, +0xbe,0xb0,0x2, 0x38,0x3, 0x2, 0x56,0xbb,0x2, 0x56,0x84,0x7e,0xd7,0x2b,0xd, 0xbe, +0xb0,0x1, 0x28,0x2, 0xe4,0x22,0x12,0x89,0xe2,0x12,0x56,0xe7,0x7a,0xd7,0x2b,0xd, +0x7e,0x73,0x2a,0xfa,0xa, 0x37,0x3e,0x34,0x3e,0x34,0xe4,0x7e,0x50,0x1, 0x12,0x13, +0x36,0x12,0x57,0xbb,0x74,0x1, 0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0x5, 0xb4,0xca,0x3b, +0x7e,0xe3,0x2a,0x74,0x7e,0xf3,0x2a,0xfa,0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x56, +0xe7,0x12,0xc8,0xb9,0x12,0x29,0x95,0x7e,0x17,0x2a,0xfe,0x6d,0x0, 0x12,0x21,0x16, +0x7e,0xd0,0x7, 0x12,0x26,0x86,0x6c,0xcc,0x80,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x67,0x12,0xc8,0xd6,0x4c,0x76,0x7a,0x29, +0x70,0xb, 0xc0,0x12,0x86,0xe8,0xa, 0x3c,0xbd,0x32,0x48,0xde,0x12,0x57,0xaa,0x30, +0x1b,0xfd,0x12,0x87,0x83,0x7e,0xb3,0x2a,0x73,0x7c,0x7e,0x12,0x10,0xee,0x74,0x2, +0x12,0x0, 0x1e,0x6c,0xcc,0x80,0x29,0x74,0x2, 0xac,0xbc,0x49,0x35,0x6, 0xfc,0xbe, +0x34,0x15,0x40,0x50,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, 0x3e,0x34,0x14, +0x78,0xfb,0x7c,0xb7,0x64,0xff,0x12,0xc8,0xd6,0x5c,0x7b,0x7a,0x29,0x70,0xb, 0xc0, +0x12,0x86,0xe8,0xa, 0x3c,0xbd,0x32,0x48,0xce,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0x83, +0x12,0x85,0xe3,0x74,0x2, 0x12,0xc9,0x1e,0x12,0x86,0x66,0x74,0x2, 0x12,0x0, 0x1e, +0x7a,0xf3,0x2a,0xfa,0x12,0x56,0xe7,0xda,0x3b,0x22,0x74,0x2, 0x12,0x0, 0x1e,0x7e, +0xb3,0x2a,0xfc,0x12,0x86,0x66,0x74,0x2, 0x12,0x0, 0x1e,0x74,0x5, 0x7e,0x70,0x9b, +0x12,0x13,0x61,0x12,0x57,0xcd,0x7e,0xb3,0x2a,0xfc,0x2, 0xe, 0x94,0x6c,0xaa,0x80, +0x1e,0xa, 0x3a,0x9, 0x73,0x2a,0xdc,0x12,0x97,0xb2,0x7c,0x7b,0xa, 0x47,0x7e,0x50, +0x2, 0xac,0x5a,0x7e,0xf, 0x3b,0x8, 0x2d,0x12,0x79,0x40,0x0, 0x48,0xb, 0xa0,0x7e, +0x63,0x2a,0x74,0xbc,0x6a,0x38,0xda,0x22,0xca,0xd8,0xca,0x79,0x7e,0x73,0x2a,0x6e, +0x7e,0xf3,0x2a,0x6d,0xac,0xf7,0x7d,0x37,0x3e,0x34,0x7e,0x8, 0x1f,0x34,0xe4,0x12, +0x21,0x16,0x7e,0xb3,0x39,0xff,0xb4,0x1, 0x64,0x7e,0x73,0x3a,0x0, 0xbe,0x70,0x0, +0x28,0x5b,0x6c,0xdd,0x80,0x3c,0x12,0x26,0x86,0x12,0x28,0x88,0x6d,0x33,0x80,0x28, +0x7e,0x35,0x24,0x3e,0x34,0x49,0x33,0xd, 0xc8,0x12,0x21,0x48,0x7a,0x35,0x26,0x7e, +0x35,0x24,0x7d,0x13,0x3e,0x14,0x49,0x21,0x1f,0x34,0xbe,0x25,0x26,0x58,0x7, 0x7e, +0x25,0x26,0x59,0x21,0x1f,0x34,0xb, 0x34,0x7a,0x35,0x24,0xbe,0x75,0x24,0x38,0xd0, +0xb, 0xd0,0x7e,0x73,0x3a,0x0, 0xbc,0x7d,0x38,0xbc,0x7d,0x37,0x3e,0x34,0xca,0x39, +0x7e,0x18,0x1f,0x34,0x7e,0x8, 0xd, 0xc8,0x12,0x20,0xf1,0x1b,0xfd,0xda,0x79,0xda, +0xd8,0x22,0x7e,0x8, 0x3a,0x3b,0x12,0x58,0xb9,0x7e,0x8, 0x3a,0x43,0x12,0x58,0xb9, +0x12,0x58,0xce,0x12,0x58,0xd5,0x2, 0x58,0x99,0x7e,0x37,0x3a,0x3b,0xbe,0x34,0x0, +0x0, 0x28,0x15,0x7e,0x73,0x3b,0x57,0xbe,0x70,0x5, 0x50,0xc, 0x7e,0xb3,0x39,0x79, +0x70,0x6, 0x12,0x58,0xdc,0x12,0x5d,0x3e,0x22,0xb, 0xa, 0x30,0xe5,0x5d,0xa, 0x2b, +0xbd,0x32,0x28,0x4, 0x9d,0x32,0x80,0x2, 0x6d,0x33,0x1b,0xa, 0x30,0x22,0x7e,0x8, +0x2b,0xb7,0x2, 0x58,0xb9,0x7e,0x8, 0x3b,0x3f,0x2, 0x58,0xb9,0x6d,0x33,0x7a,0x37, +0x3a,0xcb,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x7e,0xb3,0x2a,0x3, 0xbe,0xa0,0x1, +0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47,0x28,0x86,0xbe,0x44,0x0, 0x1e,0x28, +0x2, 0x80,0x10,0x7e,0xf3,0x2f,0x80,0x4c,0xff,0x68,0x17,0x7e,0x47,0x2b,0xb7,0x4d, +0x44,0x78,0xf, 0x12,0x58,0xdc,0x74,0x1, 0x7a,0xb3,0x3a,0xcd,0x7a,0xb3,0x39,0x4e, +0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e,0x37,0x2b,0xb7,0x7a,0x37,0x2f, +0x82,0x7e,0xb3,0x2f,0x80,0xb4,0x3, 0x1f,0x7e,0x37,0x2b,0xb7,0xbe,0x34,0x0, 0x0, +0x28,0x15,0x74,0x4, 0x7a,0xb3,0x2f,0x80,0x7e,0x37,0x2f,0x98,0x7e,0x27,0x2f,0x9a, +0x12,0x59,0xf4,0x21,0xed,0x80,0x0, 0x12,0xc3,0xe, 0x21,0xed,0x7e,0xc7,0x29,0x8, +0x7e,0xd7,0x29,0xa, 0x4c,0xff,0x78,0x19,0x70,0x57,0xbe,0xa0,0x1, 0x78,0x52,0x7d, +0x3c,0x7d,0x2d,0x12,0xc2,0xa9,0x12,0x59,0xf0,0x74,0x1, 0x7a,0xb3,0x2f,0x80,0x80, +0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x2f,0x88,0x9e,0x27,0x2f,0x90,0x7e,0x14, +0x62,0x8a,0x12,0x5a,0xad,0xbd,0x23,0x38,0x13,0x7e,0x27,0x2f,0x96,0x9e,0x27,0x2f, +0x8e,0x7e,0x14,0x62,0x8c,0x12,0x5a,0xad,0xbd,0x23,0x28,0x15,0x74,0x3, 0x7a,0xb3, +0x2f,0x80,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a,0xc7,0x2f,0x98,0x7a,0xd7,0x2f, +0x9a,0x7e,0xb3,0x2f,0x80,0x60,0x26,0x7d,0x3c,0x7d,0x2d,0x7e,0x17,0x2b,0xbb,0x7e, +0x7, 0x2b,0xbd,0x12,0x5c,0xaa,0xa, 0x2b,0x7e,0x73,0x2f,0x7f,0xa, 0x37,0xbd,0x32, +0x58,0xb, 0x12,0x59,0xf0,0x7a,0xc7,0x2b,0xbb,0x7a,0xd7,0x2b,0xbd,0xda,0xf8,0x22, +0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d,0x24,0x12,0x5f,0xc3,0x7d,0x31,0x12, +0xaf,0x7d,0x2, 0x5a,0x5, 0x7e,0x3, 0x2f,0xa8,0xbe,0x0, 0xf0,0x50,0x2, 0x41,0x9e, +0x41,0x93,0x6c,0x99,0x7e,0xb3,0x2f,0x7f,0xbe,0xb0,0x20,0x50,0x5, 0x4, 0x7a,0xb3, +0x2f,0x7f,0x7e,0x1f,0x2b,0xbf,0x7a,0x1f,0x1f,0x34,0x7e,0x80,0x1, 0x80,0x49,0x74, +0x4, 0xac,0xb8,0x49,0x35,0x2b,0xbf,0x49,0x25,0x2b,0xc1,0x7e,0x17,0x1f,0x34,0x7e, +0x7, 0x1f,0x36,0x12,0x5c,0xaa,0x7c,0x1b,0x7e,0x3, 0x2f,0x7f,0xbc,0x1, 0x38,0x26, +0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34,0x2b,0xbf,0x7e,0x14,0x1f,0x34,0x74, +0x4, 0x12,0x1f,0xc1,0x7e,0x34,0x1f,0x34,0x7e,0x30,0x4, 0xac,0x39,0x2e,0x14,0x2b, +0xbf,0x74,0x4, 0x12,0x1f,0xc1,0xb, 0x80,0x7e,0x3, 0x2f,0xa8,0xbc,0x8, 0x38,0xaf, +0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x2f,0xa8,0x7e,0x3, 0x2f,0x7f,0xbe,0x0, +0x20,0x50,0xb, 0x7e,0x3, 0x2f,0xa8,0xbe,0x0, 0xec,0x40,0x2, 0x41,0x12,0x22,0x7d, +0x34,0x9e,0x34,0x0, 0x40,0x7d,0x2e,0x9d,0x23,0x7e,0x14,0x61,0x49,0x7e,0x4, 0x0, +0xff,0xb, 0xa, 0x30,0x22,0x7d,0xe3,0x9f,0x11,0x7e,0x14,0x61,0x43,0x12,0x5d,0xdc, +0x90,0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3e,0x22,0x90,0x61,0x36,0xe4,0x93,0xb4, +0x1, 0x6, 0x7e,0x83,0x2a,0x6f,0x80,0x4, 0x7e,0x83,0x2a,0x70,0x12,0x92,0xb4,0xbe, +0xe4,0x0, 0x3f,0x38,0x1e,0x7e,0x24,0x0, 0x3f,0x9d,0x2e,0x7e,0x14,0x61,0x47,0x12, +0x5a,0xad,0x12,0x5b,0xee,0x90,0x61,0x45,0x12,0x5b,0xe5,0x48,0x2, 0x7f,0x10,0x9f, +0x1, 0x7f,0x10,0x12,0xc9,0x5d,0xbe,0xa0,0x0, 0x28,0x36,0x7d,0x14,0x9e,0x14,0x0, +0x3f,0xbd,0x1e,0x38,0x15,0x12,0x5c,0x96,0xbd,0x1e,0x40,0xe, 0x12,0x5a,0x9f,0x12, +0x5b,0xd8,0x48,0x34,0x7f,0x10,0x1b,0x1c,0x80,0x2e,0x12,0x5c,0x96,0xbd,0x1e,0x50, +0x31,0x7d,0x34,0x9e,0x34,0x0, 0x20,0x12,0x5a,0xa5,0x12,0x5b,0xee,0x7d,0x1f,0x80, +0x1d,0x4c,0xaa,0x78,0x1d,0x12,0x5c,0x8f,0xbd,0x5e,0x38,0x16,0x12,0x5a,0x9f,0x12, +0x5b,0xd8,0x48,0x4, 0x7f,0x10,0x1b,0x1c,0xa, 0xb, 0x7d,0x1f,0x9d,0x10,0x6d,0x0, +0x2f,0x10,0xbe,0xe4,0x0, 0x3f,0x28,0x6f,0x12,0x5c,0x8f,0xbd,0x5e,0x28,0x68,0x7d, +0xd4,0xb, 0xd4,0x1e,0xd4,0x7d,0x5d,0x1b,0x54,0xbd,0x5e,0x40,0xc, 0x7d,0x35,0x9d, +0x3e,0x6d,0x22,0x7e,0x14,0x61,0x4b,0x80,0xa, 0x7d,0x3e,0x9d,0x3d,0x6d,0x22,0x7e, +0x14,0x61,0x4d,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x10,0x12,0x1f,0x31,0x12,0x5b,0xf2, +0xbd,0x5e,0x7d,0x1f,0x40,0xc, 0x1e,0x14,0x1b,0x14,0x6d,0x0, 0x9f,0x1, 0x7f,0x10, +0x80,0x6, 0x1e,0x14,0x6d,0x0, 0x2f,0x10,0x90,0x61,0x45,0x12,0x5b,0xe5,0x58,0x4, +0x7f,0x10,0x80,0x13,0x90,0x61,0x46,0xe4,0x93,0xa, 0xb, 0x7d,0x1f,0x9d,0x10,0x6d, +0x0, 0xbf,0x10,0x8, 0x2, 0x7f,0x10,0x22,0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65, +0x1a,0x24,0x90,0x61,0x46,0xe4,0x93,0xa, 0x1b,0x6d,0x0, 0xbf,0x10,0x22,0xad,0x32, +0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x7e,0x73,0x38,0x37,0x7a,0x73,0x38, +0xad,0x7e,0x27,0x3b,0x1e,0x7e,0x14,0x61,0xc8,0x12,0x5a,0xad,0x1e,0x34,0xbd,0x32, +0x50,0x6, 0x74,0x1, 0x7a,0xb3,0x38,0x37,0x7e,0x14,0x61,0xc8,0x12,0x5a,0xad,0xbd, +0x32,0x50,0x8, 0xe4,0x7a,0xb3,0x38,0x35,0x12,0x5d,0x45,0x7e,0x37,0x38,0x3d,0xbd, +0x32,0x50,0x4, 0x7a,0x27,0x38,0x3d,0x12,0xc9,0x45,0x38,0xa, 0x12,0xc9,0x3d,0x38, +0x5, 0x12,0xc9,0x35,0x28,0x3d,0x12,0x5d,0x4c,0x7e,0x14,0x61,0xc8,0x12,0x5a,0xad, +0x1e,0x34,0x1e,0x34,0xbd,0x32,0x28,0x21,0x7e,0xb3,0x38,0x35,0x4, 0x7a,0xb3,0x38, +0x35,0x7e,0x73,0x38,0x35,0xbe,0x70,0x32,0x28,0x14,0x74,0x32,0x7a,0xb3,0x38,0x35, +0x12,0xc8,0xcc,0x7a,0xb3,0x38,0xaa,0x80,0x5, 0xe4,0x7a,0xb3,0x38,0x35,0x7d,0x32, +0x2, 0xa9,0x92,0x2, 0x5c,0x86,0x12,0x5d,0xa3,0xe4,0x7a,0xb3,0x38,0x43,0x22,0x7d, +0x54,0x9e,0x54,0x0, 0x3f,0x22,0x7d,0x4, 0x9e,0x4, 0x0, 0x1f,0x7e,0xd4,0x60,0xd1, +0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0x10,0x2d,0x10,0x22,0x7d,0x51,0x7d,0x12,0x9d,0x35, +0x12,0x21,0x48,0x7c,0xa7,0x12,0x5f,0x79,0x7c,0xb7,0xbc,0xba,0x50,0x3, 0x7c,0xba, +0x22,0x22,0x7d,0x13,0x7e,0x54,0x62,0x58,0x12,0x5c,0xf1,0x50,0x21,0x7e,0x54,0x62, +0x5a,0x12,0x5c,0xf1,0x28,0x18,0x7e,0x14,0x62,0x5c,0x12,0x5a,0xad,0xbd,0x32,0x50, +0xd, 0x7e,0x14,0x62,0x5e,0x12,0x5a,0xad,0xbd,0x32,0x28,0x2, 0xe4,0x22,0x74,0x1, +0x22,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x30,0xbd,0x31,0x22,0x12,0x5b,0xf9,0x2, 0x5d, +0x1, 0x7e,0xb3,0x38,0x37,0x60,0xf, 0x74,0x1, 0x7a,0xb3,0x38,0x3f,0x7e,0xb3,0x38, +0xad,0x70,0x3, 0x12,0x5d,0xad,0x7e,0xb3,0x38,0x3f,0xb4,0x1, 0xc, 0x74,0x3, 0x12, +0x5d,0x35,0x12,0x23,0xc9,0x3e,0x34,0x80,0x7, 0xe4,0x12,0x5d,0x35,0x12,0x23,0xc9, +0x7a,0x37,0x2a,0x62,0x22,0x7a,0xb3,0x30,0x27,0x7e,0x34,0x61,0x5b,0x22,0x74,0x1, +0x7a,0xb3,0x39,0x4e,0x22,0x74,0x2, 0x7a,0xb3,0x38,0x37,0x22,0x7e,0xb3,0x38,0x43, +0xb4,0x1, 0x3, 0x2, 0x5d,0x45,0x7e,0xb3,0x38,0xa9,0x4, 0x7a,0xb3,0x38,0xa9,0x7e, +0xb3,0x38,0x37,0xb4,0x2, 0x18,0x7e,0xb3,0x38,0xa8,0x4, 0x7a,0xb3,0x38,0xa8,0xb4, +0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x38,0xa9,0x74,0x1, 0x7a,0xb3,0x38,0x37,0x7e,0x73, +0x38,0xa8,0xbe,0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x38,0x43,0x12,0x5d,0x45, +0x12,0x5d,0xad,0x12,0x5d,0xa3,0x7e,0x73,0x38,0xa9,0xbe,0x70,0xa, 0x28,0x3, 0x2, +0x5d,0xa3,0x22,0xe4,0x7a,0xb3,0x38,0xa9,0x7a,0xb3,0x38,0xa8,0x22,0xe4,0x7a,0xb3, +0x38,0x35,0x6c,0xaa,0x80,0xd, 0x6d,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x38, +0x4c,0xb, 0xa0,0x12,0x5f,0xf4,0x38,0xee,0xe4,0x7a,0xb3,0x38,0x36,0x6d,0x33,0x7a, +0x37,0x38,0x3d,0x7a,0x37,0x38,0x32,0x22,0x7e,0x14,0x62,0x8e,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0xf0,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb7,0x2f,0x9c,0x7e,0xc7,0x2f,0x9e, +0x7e,0x97,0x2f,0x84,0x7e,0xd7,0x2f,0x86,0x7e,0xa7,0x2f,0x98,0x7e,0xe7,0x2f,0x9a, +0xe4,0x7e,0x73,0x2f,0xa8,0x1b,0x70,0x7d,0x2b,0x7d,0x1c,0x12,0x5f,0x28,0x70,0x2, +0xe1,0x1b,0x7e,0x73,0x2f,0xa8,0xbe,0x70,0xa, 0x28,0x13,0xe4,0x7e,0x70,0x9, 0x7e, +0x27,0x2f,0xa0,0x7e,0x17,0x2f,0xa2,0x12,0x5f,0x28,0x70,0x2, 0xe1,0x1b,0x7e,0x73, +0x2f,0xa8,0xbe,0x70,0x14,0x28,0x13,0xe4,0x7e,0x70,0x13,0x7e,0x27,0x2f,0xa4,0x7e, +0x17,0x2f,0xa6,0x12,0x5f,0x28,0x70,0x2, 0xe1,0x1b,0x7e,0x34,0x62,0x72,0x12,0x5f, +0x20,0xbd,0xfc,0x28,0x4c,0x7e,0x34,0x62,0x70,0x12,0x5f,0x20,0xbd,0xfb,0x50,0x41, +0x7e,0xb3,0x2f,0x81,0x70,0x3b,0x7e,0x34,0x62,0x76,0x12,0x23,0xc9,0x12,0x5d,0xd8, +0x7d,0x8f,0x9d,0x83,0xbe,0x87,0x2f,0x82,0x50,0x27,0x7e,0x34,0x62,0x74,0x12,0xc9, +0x16,0x9d,0xf8,0xbe,0xf7,0x2f,0x82,0x28,0x18,0x7d,0xfc,0x3e,0xf4,0xbd,0xfb,0x40, +0x2, 0xe1,0x1b,0xbd,0xa9,0x50,0x5, 0x7e,0xf0,0x20,0x80,0x7f,0x7e,0xf0,0x21,0x80, +0x7a,0x7e,0x34,0x62,0x7a,0x12,0x5f,0x20,0xbd,0xfb,0x28,0x6f,0x7e,0x34,0x62,0x78, +0x12,0x5f,0x20,0xbd,0xfc,0x50,0x64,0x7e,0xb3,0x2f,0x81,0x70,0x5e,0x7e,0x34,0x62, +0x7e,0x12,0x23,0xc9,0x12,0x5d,0xd8,0x7d,0xaf,0x9d,0xa3,0xbe,0xa7,0x2f,0x82,0x50, +0x4a,0x7e,0x34,0x62,0x7c,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xa0,0x9d,0xfa,0xbe,0xf7, +0x2f,0x82,0x28,0x37,0x7d,0xfb,0x3e,0xf4,0xbd,0xfc,0x50,0x2f,0xbd,0xed,0x50,0x5, +0x7e,0xf0,0x22,0x80,0x26,0x12,0x5f,0xe4,0x49,0x35,0x2b,0xbb,0x49,0x15,0x2b,0xbd, +0x49,0x25,0x2b,0xab,0x49,0x5, 0x2b,0xad,0x9d,0x10,0xbe,0x14,0x0, 0x20,0x18,0x8, +0x9d,0x32,0xbe,0x34,0x0, 0x10,0x58,0x3, 0x7e,0xf0,0x23,0x7c,0xbf,0xda,0xf8,0x22, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0x22,0x7d,0x41,0x7d,0x2, 0x7c,0x37,0x7c,0x2b, +0x74,0x4, 0xac,0xb2,0x49,0x35,0x2b,0xbf,0x49,0xf5,0x2b,0xc1,0x74,0x4, 0xac,0xb3, +0x49,0x25,0x2b,0xbf,0x49,0x55,0x2b,0xc1,0x12,0x8f,0x29,0x7d,0x3f,0x9d,0x35,0x12, +0x21,0x48,0x9d,0x34,0x12,0x21,0x48,0x7e,0x54,0x62,0x6a,0x7e,0x44,0x0, 0xff,0xb, +0x2a,0x20,0xbd,0x32,0x50,0x11,0x12,0x5f,0x79,0x7e,0x14,0x62,0x6a,0x12,0x5f,0xec, +0xbd,0x32,0x50,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x7d,0x31,0x9d,0x30,0x2, 0x21,0x48, +0x12,0xc8,0x76,0x12,0x58,0xdc,0x7a,0x37,0x3b,0x54,0x12,0x5f,0x9f,0x12,0x28,0x6e, +0x2, 0x5f,0x93,0x74,0x3, 0x7a,0xb3,0x2f,0xa9,0xe4,0x7a,0xb3,0x30,0x4, 0x22,0x7e, +0x34,0xd, 0xac,0x12,0x26,0x8a,0x12,0x84,0xd5,0x12,0x7d,0xf0,0x2, 0x5f,0xaf,0x30, +0x12,0x10,0x12,0x7e,0x2e,0x50,0x3, 0x12,0x6d,0x9e,0x12,0x7d,0x6c,0x12,0xb1,0x2c, +0xc2,0x12,0x22,0x7e,0xa3,0x2f,0xa8,0xbe,0xa0,0xf0,0x50,0x17,0x74,0x4, 0xa4,0x59, +0x35,0x2b,0xbf,0x12,0x5f,0xe4,0x59,0x25,0x2b,0xc1,0x7e,0xb3,0x2f,0xa8,0x4, 0x7a, +0xb3,0x2f,0xa8,0x22,0x7e,0xa3,0x2f,0xa8,0x74,0x4, 0xa4,0x22,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0x22,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xba,0x22,0x74,0x12,0x22,0xff, +0x70,0x8f,0x1, 0xfe,0x79,0x86,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x46,0x54,0x53,0x35,0x58,0x34,0x36,0x50,0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x15,0xea,0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x10,0x17,0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x16,0x15,0x14,0x13,0x12,0x11,0x10,0xf, 0xe, 0xd, 0xc, +0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x5, 0x0, 0x4, 0xff,0x23,0x1c,0x2, 0xdf,0x2, 0x6, 0x2, 0x4, 0x1e,0x10,0x0, +0x4, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x1, 0x1, 0x0, 0x0, 0x16,0xf, 0x0, 0x0, 0x0, +0x0, 0x2, 0x94,0x2, 0xf6,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x2c,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, +0xb0,0x0, 0x14,0x1, 0x19,0x18,0x1, 0xf4,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x78,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x0, 0x4, 0x2d,0x20,0x1, 0x20,0x2, 0x0, 0x0, +0x0, 0x0, 0x1, 0xf4,0xd5,0x40,0x10,0x17,0x27,0x10,0x25,0x6, 0x80,0x10,0x25,0x6, +0x78,0x8, 0x10,0x4, 0x20,0x1, 0x0, 0x2, 0xf6,0x2a,0x2a,0x1, 0xa0,0x1, 0xa0,0x0, +0xc0,0x0, 0xc0,0x4, 0x0, 0x42,0x42,0x2, 0x60,0x2, 0x60,0x0, 0xb2,0x0, 0xb2,0x0, +0xc8,0x0, 0xb4,0x0, 0xa0,0x0, 0x96,0x0, 0x96,0x0, 0x96,0xa, 0x0, 0x1, 0x7c,0x1, +0x5, 0xb, 0x1e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x12,0x0, 0x1, 0x54,0x1, 0x0, 0x15, +0x1, 0x79,0x1, 0x14,0x0, 0x0, 0x1, 0x1, 0xf, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 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, 0x96,0x2, 0x26,0x0, 0x50,0x0, 0x2e, +0x0, 0x4, 0x0, 0x4, 0x1, 0x4, 0x1, 0x90,0x0, 0xc8,0x0, 0x50,0x1, 0xf4,0x0, 0x96, +0x1, 0x2c,0x1, 0x2c,0x4, 0x18,0x2, 0x2d,0xd5,0x20,0x20,0x2, 0x2f,0xda,0x20,0x28, +0x2, 0x30,0xdb,0x20,0x41,0x2, 0x40,0xfb,0x30,0x18,0x2, 0x2d,0xd5,0x20,0x18,0x2, +0x2d,0xd5,0x20,0x18,0x2, 0x2d,0xd5,0x20,0x18,0x2, 0x2d,0xd5,0x20,0x4, 0x5, 0x25, +0x26,0x27,0x28,0x29,0x4, 0x0, 0x70,0x1, 0x2c,0x64,0x0, 0xc8,0x1, 0x5e,0x0, 0x64, +0x0, 0x64,0x0, 0x96,0x0, 0x64,0xb, 0xb8,0x8, 0x5, 0x6, 0x80,0x1, 0x90,0x1, 0x2c, +0x1, 0xc2,0x3, 0x20,0xf, 0xa0,0x1, 0x3, 0x20,0x4, 0xb0,0x3, 0x20,0x1, 0x2, 0x2, +0x4, 0x4, 0x6, 0x40,0x1, 0x2c,0x1, 0x18,0x1, 0x90,0x1, 0x90,0x1, 0x90,0x1, 0x90, +0x1, 0x2c,0x1, 0x90,0x1, 0x7c,0x1, 0x7c,0x0, 0x50,0x0, 0x46,0x0, 0x78,0x0, 0x78, +0x0, 0x78,0x1, 0x18,0x1, 0x18,0xa, 0x5, 0x0, 0x50,0x2, 0xa6,0x0, 0x50,0x3, 0xb0, +0x0, 0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, 0xc8,0x0, 0x2f,0x0, 0x1e,0x0, 0x80, +0x0, 0xbd,0x0, 0x80,0x0, 0x3c,0x3, 0xe8,0x1, 0x0, 0x0, 0x5e,0x0, 0x3c,0x3, 0xe8, +0x0, 0x20,0x2, 0xd6,0x0, 0x0, 0x4, 0x0, 0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88, +0x1, 0x2c,0x0, 0xa0,0x0, 0xa0,0x10,0x0, 0xc, 0x0, 0xa, 0xe, 0x5, 0x7, 0x7, 0xa, +0x6, 0x6, 0xc, 0x64,0xc8,0x7e,0x73,0x28,0x93,0x7a,0x73,0x28,0x94,0x7e,0x73,0x2a, +0x2, 0x7a,0x73,0x2a,0x3, 0xe4,0x7a,0xb3,0x2a,0x6, 0x22,0xc2,0x0, 0x7e,0xb3,0x16, +0x91,0x60,0x6, 0x7e,0xb3,0x16,0x90,0x70,0x7, 0x12,0x62,0xd3,0x28,0x2, 0xd2,0x0, +0xa2,0x0, 0x22,0x7e,0x73,0x28,0x84,0xbe,0x70,0x1, 0x22,0xca,0x3b,0x7e,0x77,0x2a, +0x5c,0x12,0xa5,0xa8,0x7d,0x63,0x3e,0x34,0x3e,0x34,0x7e,0xe4,0x0, 0xa, 0x12,0x63, +0x69,0x7e,0xb3,0x28,0xa8,0x60,0xf, 0x7e,0x37,0x38,0x30,0xbd,0x36,0x48,0x7, 0x3e, +0x34,0x3e,0x34,0x12,0x63,0x69,0xbe,0x64,0x4, 0x4c,0x8, 0xf, 0x12,0xa5,0xf8,0x50, +0x6, 0x7e,0xb3,0x28,0xa8,0x60,0x4, 0x74,0xa, 0x80,0x13,0x7e,0xb3,0x28,0xa8,0x60, +0xc, 0x7e,0xb3,0x38,0x2e,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x80,0x1, 0xe4,0x7a,0xb3, +0x38,0x2e,0x7e,0xe7,0x2a,0x5c,0x7d,0x3e,0x12,0x4f,0x43,0x7e,0x53,0x38,0x2e,0xbe, +0x50,0x0, 0x28,0x12,0xbd,0x3f,0x58,0x4, 0x7d,0xf3,0x80,0x6, 0xbd,0xef,0x8, 0x2, +0x7d,0xfe,0x7a,0xf7,0x2a,0x5c,0x12,0x62,0xd3,0x28,0x3, 0x12,0x36,0xd9,0x7a,0x67, +0x38,0x30,0x7a,0x77,0x2a,0x5c,0xda,0x3b,0x22,0x7d,0x2e,0x12,0x1e,0xee,0x7d,0xf3, +0x22,0xca,0x79,0xc2,0x0, 0x7e,0xf0,0x3, 0x12,0x64,0x88,0x7e,0xe3,0x2a,0x3, 0x7e, +0x34,0x1f,0x34,0x7a,0x37,0x32,0x1a,0x12,0x62,0xd3,0x38,0x2, 0x81,0x4d,0x12,0x65, +0x1, 0x92,0xd, 0x12,0x64,0x56,0x7c,0xbf,0x12,0xb3,0xd1,0x4c,0xee,0x68,0xe, 0x7e, +0xa3,0x31,0xf7,0x4c,0xaa,0x78,0xa, 0x7e,0xb3,0x31,0xf8,0x70,0x4, 0xd2,0x0, 0x80, +0x25,0xbe,0xe0,0x1, 0x28,0xb, 0xe5,0x1d,0xbe,0xb0,0x8, 0x28,0x4, 0xd2,0x0, 0x80, +0x15,0xd2,0x0, 0x7e,0xb3,0x28,0x84,0xbc,0xbe,0x78,0xb, 0x20,0xd, 0x8, 0x4c,0xaa, +0x78,0x4, 0x6c,0xff,0xc2,0x0, 0x20,0x0, 0x5, 0x7c,0xbf,0x12,0xb3,0xd1,0x7e,0x8, +0x31,0xfc,0x12,0x2d,0xcf,0x7a,0xb3,0x31,0xfb,0xbe,0xb3,0x28,0x84,0x50,0x3d,0x7e, +0x33,0x31,0xfb,0x80,0x29,0x7e,0x70,0x2, 0xac,0x73,0x9, 0x23,0x32,0x1c,0x9, 0x13, +0x32,0x1d,0x2e,0x37,0x32,0x1a,0xb, 0x38,0x50,0x7e,0x93,0x2a,0x6e,0xac,0x92,0xa, +0x31,0x2d,0x43,0x12,0xc8,0xad,0x7c,0xb3,0x7e,0x70,0x1, 0x12,0x33,0x1f,0x7c,0x3, +0x1b,0x30,0xa5,0xb8,0x0, 0xcf,0x74,0x1, 0x7a,0xb3,0x31,0xf9,0x7e,0xa3,0x31,0xfb, +0x7a,0xa3,0x28,0x84,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x32,0x1c,0x7e,0x8, 0x26, +0xfa,0x12,0x20,0xf1,0x1b,0xfd,0x12,0x3c,0x16,0xf5,0x1d,0x80,0x6, 0x75,0x1d,0x64, +0x12,0xb9,0x8b,0xda,0x79,0x22,0x6c,0xaa,0x12,0x64,0xf5,0x12,0x64,0x81,0x7e,0xb, +0xb0,0x54,0xfe,0x12,0x64,0x7e,0x7e,0xb, 0xb0,0x54,0x7, 0x12,0x64,0x7e,0x7e,0xb, +0xb0,0x54,0xfb,0x7a,0xb, 0xb0,0xb, 0xa0,0xbe,0xa0,0x1e,0x40,0xdb,0x22,0x7a,0xb, +0xb0,0x7f,0x1, 0x2e,0x14,0x0, 0x5, 0x22,0x12,0x67,0xdc,0x28,0x8, 0x7e,0xb3,0x28, +0x84,0x70,0x2, 0xf5,0x1c,0x7e,0xb3,0x28,0x84,0x70,0x18,0xe5,0x1c,0xbe,0xb0,0xfa, +0x50,0x2, 0x5, 0x1c,0xe5,0x1c,0xbe,0xb0,0x5, 0x40,0x8, 0xe4,0x7a,0xb3,0x32,0x58, +0x75,0x1c,0xfa,0x22,0x6c,0xaa,0x12,0x64,0xf5,0x29,0x81,0x0, 0x5, 0x7c,0x98,0x5e, +0x90,0x1, 0x3e,0x90,0x12,0x64,0x81,0x7c,0xb8,0x54,0xfd,0x4c,0xb9,0x7a,0xb, 0xb0, +0x29,0xb1,0x0, 0x5, 0x30,0xe0,0x16,0x30,0xe2,0x13,0xc4,0x23,0x54,0x1f,0xb4,0x1, +0xc, 0x7f,0x1, 0xb, 0x16,0x7e,0xb, 0xb0,0x1e,0xb0,0x7a,0xb, 0xb0,0xb, 0xa0,0xbe, +0xa0,0x1e,0x40,0xc2,0x22,0x7e,0x70,0x6, 0xac,0x7a,0x2e,0x34,0x32,0x59,0x6d,0x22, +0x22,0xca,0x3b,0x7e,0xe3,0x28,0x84,0x6c,0xdd,0x6c,0xff,0x74,0x6, 0xac,0xbd,0x12, +0x67,0xcf,0x30,0xe0,0x37,0x6c,0xcc,0x80,0x27,0x12,0x67,0xed,0x7a,0xb3,0x1f,0x70, +0x9, 0xa3,0x26,0xfb,0x7a,0xa3,0x1f,0x71,0x7f,0x7, 0x12,0x65,0x57,0x50,0xf, 0x7f, +0x7, 0x7e,0xb3,0x1f,0x71,0x6c,0x77,0x12,0x65,0x5a,0x50,0x2, 0xb, 0xf0,0xb, 0xc0, +0xbc,0xec,0x38,0xd5,0xbe,0xf0,0x2, 0x40,0x3, 0xd3,0x80,0x8, 0xb, 0xd0,0xbe,0xd0, +0x1e,0x40,0xb6,0xc3,0xda,0x3b,0x22,0x7e,0x70,0x1, 0x7c,0x87,0x7c,0x9b,0x29,0xa0, +0x0, 0x3, 0x29,0x60,0x0, 0x1, 0x7e,0x70,0x1, 0xbe,0x80,0x1, 0x78,0x7, 0x29,0xa0, +0x0, 0x2, 0x7e,0xb, 0x60,0xa, 0x7, 0xa, 0x29,0x2d,0x2, 0xa, 0x16,0xbd,0x1, 0x48, +0xc, 0xa, 0x17,0xa, 0x3a,0x2d,0x31,0xbd,0x23,0x18,0x2, 0xd3,0x22,0xc3,0x22,0xca, +0x3b,0x12,0x67,0xe4,0x75,0x54,0x0, 0x7e,0xa1,0x54,0x74,0x6, 0xa4,0x12,0x67,0xcf, +0x30,0xe1,0x2e,0x7f,0x7, 0x7c,0xbc,0x12,0x65,0xde,0x50,0x25,0x7f,0x7, 0x7c,0xbe, +0x12,0x65,0x57,0x50,0x1c,0x7f,0x7, 0x7c,0xbd,0x6c,0x77,0x12,0x65,0x5a,0x50,0x11, +0x7f,0x7, 0x7c,0xbf,0x6c,0x77,0x12,0x65,0x5a,0x50,0x6, 0x29,0xb7,0x0, 0x4, 0x80, +0xa, 0x5, 0x54,0xe5,0x54,0xbe,0xb0,0x1e,0x40,0xbd,0xe4,0xda,0x3b,0x22,0x7e,0x70, +0x1, 0x2, 0x65,0x5a,0xca,0x79,0x7f,0x70,0x7e,0xb4,0xff,0xff,0x6c,0xee,0xc2,0x1, +0xc2,0x2, 0x29,0x67,0x0, 0x2, 0x7e,0x7b,0x70,0xbc,0x76,0x78,0xe, 0x29,0x67,0x0, +0x3, 0x29,0x77,0x0, 0x1, 0xbc,0x76,0x78,0x2, 0xd2,0x2, 0x6c,0xff,0x12,0x67,0xc2, +0x6d,0xaa,0x29,0xb6,0x0, 0x5, 0x20,0xe1,0x2, 0xc1,0x9e,0x7f,0x6, 0x7e,0x7b,0xb0, +0x12,0x65,0xde,0x50,0x2d,0x7f,0x6, 0x29,0xb7,0x0, 0x2, 0x12,0x65,0xde,0x50,0x22, +0x7f,0x6, 0x29,0xb7,0x0, 0x1, 0x6c,0x77,0x12,0x65,0x5a,0x50,0x15,0x7f,0x6, 0x29, +0xb7,0x0, 0x3, 0x6c,0x77,0x12,0x65,0x5a,0x50,0x8, 0x7c,0xef,0xd2,0x1, 0x6d,0xbb, +0x80,0x55,0x7e,0x6b,0x70,0xa, 0x27,0x7e,0x7b,0x70,0x12,0x67,0xb1,0x2d,0xa3,0x29, +0x76,0x0, 0x2, 0xa, 0x27,0x29,0x77,0x0, 0x2, 0x12,0x67,0xb1,0x2d,0xa3,0x29,0x76, +0x0, 0x1, 0xa, 0x27,0x29,0x77,0x0, 0x1, 0x12,0x67,0xb1,0x2d,0xa3,0x29,0x76,0x0, +0x3, 0xa, 0x27,0x29,0x77,0x0, 0x3, 0x12,0x67,0xb1,0x2d,0xa3,0xbd,0xab,0x50,0x4, +0x7d,0xba,0x7c,0xef,0xbe,0xa4,0x0, 0x4, 0x38,0x4, 0xd2,0x1, 0x80,0x9, 0xb, 0xf0, +0xbe,0xf0,0x1e,0x50,0x2, 0xc1,0xd, 0x20,0x1, 0xb, 0x20,0x2, 0x8, 0xbe,0xb4,0x0, +0x8, 0x50,0x2, 0xd2,0x1, 0x20,0x1, 0x2, 0xe1,0x5f,0x74,0x6, 0xac,0xbe,0x12,0x67, +0xc6,0x29,0x76,0x0, 0x5, 0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xbe,0xb0,0x1f,0x50,0x16, +0x7f,0x6, 0x2e,0x14,0x0, 0x5, 0x7c,0x67,0x2e,0x60,0x8, 0x5e,0x60,0xf8,0x5e,0x70, +0x7, 0x4c,0x76,0x7a,0xb, 0x70,0x20,0x2, 0x11,0x29,0xb6,0x0, 0x4, 0xbe,0xb0,0xfa, +0x50,0x8, 0x7f,0x16,0xb, 0x36,0x4, 0x7a,0x1b,0xb0,0x29,0x67,0x0, 0x3, 0x29,0x76, +0x0, 0x3, 0xbc,0x76,0x28,0x6, 0x29,0x76,0x0, 0x3, 0x80,0x4, 0x29,0x77,0x0, 0x3, +0x39,0x76,0x0, 0x3, 0x29,0x67,0x0, 0x2, 0x29,0x76,0x0, 0x2, 0xbc,0x76,0x28,0x6, +0x29,0x76,0x0, 0x2, 0x80,0x4, 0x29,0x77,0x0, 0x2, 0x39,0x76,0x0, 0x2, 0x29,0x67, +0x0, 0x1, 0x29,0x76,0x0, 0x1, 0xbc,0x76,0x50,0x6, 0x29,0x76,0x0, 0x1, 0x80,0x4, +0x29,0x77,0x0, 0x1, 0x39,0x76,0x0, 0x1, 0x7e,0x7b,0x60,0x7e,0x6b,0x70,0xbc,0x76, +0x50,0x5, 0x7e,0x6b,0x70,0x80,0x3, 0x7e,0x7b,0x70,0x7a,0x6b,0x70,0x80,0x31,0x6c, +0xff,0x74,0x6, 0xac,0xbf,0x9, 0xb5,0x32,0x5e,0x30,0xe1,0x7, 0xb, 0xf0,0xbe,0xf0, +0x1e,0x40,0xee,0xbe,0xf0,0x1e,0x50,0x33,0x74,0x1, 0x39,0xb7,0x0, 0x4, 0x12,0x67, +0xc2,0x7e,0x34,0x0, 0x6, 0xca,0x39,0x7f,0x17,0x7f,0x6, 0x12,0x20,0xf1,0x1b,0xfd, +0x12,0x67,0xb8,0x44,0x1, 0x7a,0x1b,0xb0,0x12,0x67,0xb8,0x44,0x2, 0x7a,0x1b,0xb0, +0x30,0x2, 0x8, 0x12,0x67,0xb8,0x44,0x4, 0x7a,0x1b,0xb0,0xda,0x79,0x22,0x7e,0x39, +0x70,0xa, 0x37,0x9d,0x32,0x2, 0x21,0x48,0x7f,0x16,0x2e,0x34,0x0, 0x5, 0x7e,0x1b, +0xb0,0x22,0x74,0x6, 0xac,0xbf,0x7d,0xd5,0x2e,0xd4,0x32,0x59,0x6d,0xcc,0x22,0x7d, +0xf5,0x2e,0xf4,0x32,0x59,0x6d,0xee,0x29,0xb7,0x0, 0x5, 0x22,0x7e,0x73,0x2a,0x3, +0xbe,0x70,0x0, 0x22,0x7c,0xf5,0x7c,0xe6,0x7c,0xd7,0x7c,0xcb,0x22,0x7e,0x70,0x2, +0xac,0x7c,0x9, 0xb3,0x26,0xfa,0x22,0x7e,0x37,0x3b,0x25,0xb, 0x34,0x7a,0x37,0x3b, +0x25,0x7e,0x37,0x3b,0x27,0xbe,0x37,0x3b,0x25,0x28,0x3, 0x2, 0x68,0xf, 0x22,0xe5, +0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0x2, 0x67,0xf7,0xca,0x7b,0xca,0x6b, +0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82, +0x12,0x68,0x19,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda, +0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xe4,0x12,0x6a,0xb1,0x12,0xba,0xfc,0x12, +0x26,0x86,0x12,0x6f,0xf8,0x12,0x49,0x2f,0x12,0xba,0x33,0x12,0xbb,0x13,0x12,0x0, +0xa, 0x12,0xbb,0x1f,0x12,0x6a,0x3c,0x12,0xbb,0x2f,0xd2,0xaf,0x12,0xba,0x8e,0x12, +0x68,0x96,0x12,0x4b,0xc7,0x12,0x6a,0xe2,0x7e,0x8, 0x3b,0x29,0x12,0x6a,0x8b,0x90, +0x60,0x50,0xe4,0x93,0xca,0xb8,0x90,0x60,0x51,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0xff, +0xff,0xda,0xb8,0x2, 0x12,0x34,0xd2,0xc8,0x43,0xed,0xf, 0xc2,0xea,0x75,0xb3,0x13, +0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0x6a,0x2c,0xe4,0x12,0x68,0xb9,0x2, 0x68,0xb0, +0xa9,0xc5,0xca,0xe4,0x7a,0xb3,0x3b,0x62,0x22,0xca,0xf8,0x7c,0xfb,0x74,0x2, 0x12, +0x69,0x37,0x4c,0xff,0x78,0x5, 0x5e,0x70,0xdf,0x80,0x3, 0x4e,0x70,0x20,0x74,0x2, +0x12,0x68,0xda,0xda,0xf8,0x22,0x74,0x6, 0x7d,0x30,0x7d,0x23,0x7c,0x6b,0xa, 0x14, +0x7c,0x73,0x7d,0x52,0x7c,0xab,0x7e,0xb3,0x3b,0x62,0xb4,0xa5,0x42,0x12,0x69,0xd7, +0x75,0xb5,0x1, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3, +0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x61, +0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x71,0xb5,0xa9,0x36,0xb3,0xfc,0xa9, +0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xa9,0xd2,0xb4,0x22, +0x74,0x4, 0x7d,0x30,0x2, 0x68,0xda,0x7c,0x6b,0x6c,0x77,0x6c,0xaa,0x7e,0xb3,0x3b, +0x62,0xb4,0xa5,0x52,0x12,0x69,0xd7,0x75,0xb5,0x5, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6, +0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36, +0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75, +0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc, +0xa9,0xc6,0xb3,0x7e,0x71,0xb5,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x7e,0xa1,0xb5,0xa9,0xd2,0xb4,0x7c,0x47,0x6c,0x55,0xa, 0x3a,0x4d,0x32,0x22,0x7d, +0x42,0x7f,0x60,0x7d,0x3, 0x12,0x6a,0x2c,0x74,0x2, 0x12,0x69,0x37,0x7d,0xf3,0x4e, +0xf4,0x0, 0x1, 0x4e,0xf4,0x0, 0xa, 0x12,0x69,0xd0,0x7a,0x45,0x36,0x7d,0x30,0x6d, +0x22,0x7f,0x6, 0x12,0x69,0xe8,0x5e,0xf4,0xff,0xfd,0x12,0x69,0xd0,0x2, 0x68,0xb0, +0x74,0x2, 0x7d,0x3f,0x2, 0x68,0xda,0xa9,0xc2,0xb4,0xa9,0xc6,0xb3,0x22,0x74,0x6, +0x12,0x69,0x37,0x7d,0x3, 0x6c,0x11,0x22,0x12,0x69,0xf6,0x7e,0x35,0x36,0x12,0xbb, +0x73,0xa9,0xd2,0xb4,0xd3,0x22,0x7d,0x52,0xf5,0x3a,0x7c,0xb6,0x7c,0xa5,0xa, 0x44, +0xf5,0x39,0x7f,0x21,0xf5,0x38,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0x6a,0x21,0xe5,0x3a, +0x12,0x6a,0x21,0xe5,0x39,0x12,0x6a,0x21,0xe5,0x38,0x12,0x6a,0x21,0xe4,0x2, 0x6a, +0x21,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22,0xa9,0xd5,0xca,0xa9, +0xd1,0xea,0xa9,0xc1,0xea,0x74,0xa5,0x7a,0xb3,0x3b,0x62,0x22,0xe4,0x7a,0xb3,0x39, +0xe4,0x7e,0x8, 0x33,0x21,0x12,0xc8,0xe0,0x7e,0x8, 0x33,0x5f,0x7e,0x34,0x0, 0x3e, +0x12,0x21,0x16,0x7e,0x18,0x33,0x21,0x7a,0x1d,0x14,0x12,0x6a,0x6d,0x2, 0x6a,0x60, +0x75,0x19,0x0, 0x75,0x1b,0x0, 0x7e,0xb3,0x39,0xe4,0xf5,0x91,0x22,0x2, 0x6a,0x70, +0x90,0x60,0x0, 0xe4,0x93,0x54,0xfe,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0xc2,0xc9, +0x54,0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xd2,0xad,0x22,0xd2,0xc9,0x75,0xf2,0x30, +0x75,0xf3,0x80,0x75,0xf4,0xc, 0x75,0xf5,0x1, 0x6c,0xaa,0xe5,0xf5,0x54,0x80,0xb4, +0x80,0xf9,0xe5,0xf6,0x12,0xb0,0xd3,0xb, 0xa0,0xbe,0xa0,0xd, 0x40,0xed,0xc2,0xc9, +0x22,0xa9,0xc4,0xca,0xa9,0xc5,0xca,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x83,0xc8,0xa9, +0xd0,0xce,0xa9,0xc0,0xc9,0xd2,0x2, 0x12,0x4f,0xa5,0xa9,0xc2,0xea,0x75,0xc1,0x6, +0x75,0xc2,0xc, 0xd2,0x0, 0x12,0x4f,0xfe,0xa9,0xc1,0xc4,0xa9,0xd2,0xc4,0xa9,0xc2, +0xe1,0x22,0xca,0xf8,0xa2,0xaf,0xe4,0x33,0x7c,0xfb,0xd2,0x0, 0x12,0xba,0x85,0xa9, +0xd0,0xcb,0xc2,0xaf,0xa9,0xd0,0x9e,0x75,0x9d,0x0, 0xa9,0xd0,0x9e,0x75,0x9c,0x20, +0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0xa9,0xd0,0xcd,0x74,0x41,0x12,0x4f,0x4a,0xa9,0xd0, +0x9e,0xa9,0xd7,0x9e,0x2e,0xf0,0xff,0x92,0xaf,0xda,0xf8,0x22,0x7e,0x23,0x2b,0xf, +0x7e,0x33,0x3a,0x15,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x0, 0xac, +0x23,0x2d,0x10,0xbe,0x14,0x0, 0xa, 0x50,0x4, 0x7e,0x14,0x0, 0xa, 0x7e,0x63,0x2b, +0x10,0xbe,0x14,0xf, 0x3c,0x40,0x4, 0x7e,0x14,0xf, 0x3c,0xbe,0x14,0x7, 0x8, 0x40, +0x3, 0xe4,0x80,0x21,0xbe,0x14,0x3, 0x84,0x40,0x16,0x90,0x61,0x1b,0xe4,0x93,0x7c, +0x7b,0xbe,0x70,0x1, 0x28,0x4, 0x74,0x1, 0x80,0xb, 0x7a,0x73,0x2b,0x10,0x80,0x9, +0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x7e,0x73,0x2b,0x10,0xbc,0x76,0x68, +0x2, 0xd2,0x10,0x7e,0x24,0x1, 0xf4,0x7d,0x31,0x8d,0x32,0x7c,0x17,0xbe,0x10,0x7, +0x28,0x3, 0x7e,0x10,0x7, 0x7e,0x1f,0x3b,0x8, 0x69,0x51,0x0, 0x86,0x54,0x1f,0xa, +0x1, 0x12,0xa4,0x47,0x3e,0x4, 0x2d,0x5, 0x79,0x1, 0x0, 0x86,0x6d,0x0, 0x7e,0x34, +0xb8,0x0, 0x7e,0x24,0x0, 0xb, 0x2, 0x1f,0x8d,0x7e,0xa3,0x0, 0x5e,0xbe,0xa0,0xff, +0x68,0x48,0xbe,0xa3,0x3, 0xfb,0x68,0x42,0x74,0x5, 0xa4,0x12,0x6f,0x88,0x12,0x6c, +0xb, 0x12,0x6f,0x4a,0x12,0x6c,0xb, 0x12,0x6f,0x41,0x12,0x7e,0x2e,0x50,0x9, 0x7e, +0xb3,0x0, 0x5e,0x12,0x6f,0x53,0x80,0x6, 0x12,0x6c,0xb, 0x12,0x6e,0x45,0x12,0x6c, +0x17,0x12,0x6e,0x3e,0x7e,0x73,0x2b,0x14,0xa, 0x37,0x7e,0xf, 0x3b,0x10,0x79,0x30, +0x0, 0x1a,0x7e,0x73,0x0, 0x5e,0x7a,0x73,0x3, 0xfb,0x22,0x7e,0xa3,0x0, 0x5e,0x74, +0x5, 0xa4,0x22,0x7a,0xb3,0x2b,0xf, 0x12,0x6b,0x1c,0x7a,0x37,0x2b,0x1b,0x22,0x12, +0x6c,0x13,0x30,0x10,0xa, 0x12,0x6f,0xb4,0x30,0x0, 0x4, 0xe4,0x12,0xa, 0x66,0x30, +0x0, 0x9, 0x12,0x6f,0xc6,0x12,0x6c,0xeb,0x2, 0x7f,0x43,0x22,0x7e,0xb, 0x70,0x7a, +0x73,0x2b,0xf, 0x29,0x70,0x0, 0x4, 0x7a,0x73,0x2b,0x62,0x29,0x70,0x0, 0x1, 0x7a, +0x73,0x2b,0x14,0x29,0x70,0x0, 0x3, 0x7a,0x73,0x2b,0x20,0x12,0x6c,0x17,0x12,0x6e, +0x3e,0xd2,0x0, 0xc2,0x1, 0x2, 0x50,0xfd,0xca,0xf8,0x7c,0xfb,0x74,0x5, 0xac,0xbf, +0x12,0x6f,0x88,0x12,0x6f,0x4a,0x12,0x6e,0x45,0x12,0x6f,0x41,0x7a,0xf3,0x0, 0x5e, +0x7c,0xbf,0x12,0x6f,0x53,0x12,0x6c,0x17,0x74,0x5, 0xac,0xbf,0x9, 0xb5,0x26,0x37, +0x12,0x6f,0x9b,0x12,0x6c,0xeb,0x12,0x23,0x2f,0xe4,0x7a,0xb3,0x16,0x91,0xda,0xf8, +0x22,0x7e,0xb3,0x38,0x34,0x60,0x6, 0x14,0x7a,0xb3,0x38,0x34,0x22,0x12,0xa9,0x57, +0x90,0x61,0xc5,0xe4,0x93,0xbe,0xb0,0x4, 0x28,0x3, 0x12,0x6c,0xeb,0x7e,0xb3,0x39, +0x34,0x70,0xe, 0x7e,0xb3,0x3b,0x61,0xb4,0x1, 0x7, 0xe4,0x12,0x6c,0x68,0x12,0xc8, +0xcc,0x12,0x5c,0xfb,0x12,0xaa,0xa1,0x7e,0xa3,0x39,0x34,0x7a,0xa3,0x3b,0x61,0xbe, +0xb0,0xff,0x68,0x3, 0x2, 0x6c,0x68,0x22,0x12,0x6f,0x91,0x7e,0xb3,0x2b,0xf, 0xca, +0x3b,0x7c,0xeb,0x6c,0xff,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xc0, +0x7e,0x73,0x3a,0x15,0xa, 0xb7,0x7e,0xb3,0x2b,0x10,0xf5,0x36,0x12,0xc9,0x2d,0xbe, +0xd0,0x4, 0x38,0x5, 0xe4,0x7a,0xb3,0x38,0x40,0xa, 0x3e,0xad,0x3b,0x7d,0xa3,0x2d, +0xac,0x75,0x35,0x0, 0x7e,0xa3,0x38,0x40,0xbc,0xad,0x40,0x2, 0x80,0x19,0xbe,0xa0, +0x0, 0x28,0x19,0x74,0x5, 0xa4,0x9, 0x75,0x26,0x33,0xbc,0x7e,0x78,0xe, 0x7c,0xbd, +0x14,0xbe,0xb3,0x38,0x40,0x78,0x5, 0xe4,0x7a,0xb3,0x38,0x40,0x7e,0xc3,0x38,0x40, +0x80,0x41,0x7e,0xb3,0x38,0x40,0x4, 0x7a,0xb3,0x38,0x40,0x7e,0x90,0x5, 0xac,0x9c, +0x9, 0xa4,0x26,0x33,0xbc,0xae,0x68,0x29,0xe5,0x35,0xa, 0xdb,0x19,0xcd,0x38,0x44, +0xa, 0x9a,0xad,0x9b,0x2d,0x9c,0x7e,0xa1,0x35,0x7c,0xba,0x4, 0xf5,0x35,0x7c,0xba, +0x7d,0x39,0x7d,0x2a,0x7e,0x31,0x36,0x12,0x10,0x0, 0xb, 0xf0,0xbe,0xf0,0x3, 0x50, +0x6, 0xb, 0xc0,0xbc,0xdc,0x38,0xbb,0x7a,0xf3,0x38,0x41,0xda,0x3b,0x22,0xca,0xf8, +0x6c,0xff,0x80,0x34,0x7e,0x73,0x0, 0x5e,0xbc,0x7f,0x68,0x2a,0x7e,0x30,0x5, 0xac, +0x3f,0x12,0x6e,0x1a,0xca,0x39,0x7e,0x30,0x38,0xac,0x3f,0x12,0x6e,0x33,0x12,0x20, +0xf1,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x30,0x8c,0xac,0x3f,0x12,0x6e, +0x28,0x12,0x20,0xf1,0x1b,0xfd,0xb, 0xf0,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xbf,0x38, +0xc3,0x7e,0x23,0x0, 0x5e,0x7e,0x30,0x5, 0xac,0x23,0x12,0x6e,0x1a,0xca,0x39,0x7e, +0x23,0x0, 0x5e,0x7e,0x30,0x38,0xac,0x23,0x12,0x6e,0x33,0x12,0x20,0xf1,0x1b,0xfd, +0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x23,0x0, 0x5e,0x7e,0x30,0x8c,0xac,0x23,0x12, +0x6e,0x28,0x12,0x20,0xf1,0x1b,0xfd,0xda,0xf8,0x22,0x2e,0x14,0x26,0x33,0x6d,0x0, +0x12,0x6c,0x3c,0x7e,0x34,0x0, 0x38,0x22,0x2e,0x14,0x1, 0x3f,0x6d,0x0, 0x7e,0x18, +0x3, 0x6f,0x22,0x2e,0x14,0x0, 0x5f,0x6d,0x0, 0x7e,0x18,0x34,0x0, 0x22,0x7e,0x8, +0x2a,0x6d,0x2, 0x3, 0x8b,0x9, 0x75,0x26,0x35,0x7a,0x73,0x2b,0x1f,0x22,0xca,0x3b, +0x7a,0xd, 0x2f,0x7c,0xcb,0x7e,0xb3,0x2b,0x1d,0xf5,0x33,0x7e,0xb3,0x2b,0xf, 0xf5, +0x34,0x7e,0xd3,0x2b,0x14,0x7e,0xe3,0x2b,0x1f,0x7e,0xf3,0x2b,0x20,0x7e,0x34,0x0, +0x38,0xca,0x39,0x7e,0x18,0x34,0x0, 0x7e,0x8, 0x24,0xf2,0x12,0x20,0xf1,0x1b,0xfd, +0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x3, 0x6f,0x7e,0x8, 0x25,0x2a,0x12,0x20, +0xf1,0x1b,0xfd,0x7c,0xbc,0x12,0x6f,0x53,0x74,0x1, 0x7a,0xb3,0x2b,0x1d,0x74,0x5, +0xac,0xbc,0x12,0x6f,0x4a,0x74,0x5, 0xac,0xbc,0x12,0x6e,0x45,0x74,0x5, 0xac,0xbc, +0x12,0x6f,0x41,0x74,0x5, 0xac,0xbc,0x9, 0x75,0x26,0x37,0xbe,0x73,0x2b,0x62,0x68, +0x6, 0x7a,0x73,0x2b,0x62,0xd2,0x10,0xc2,0x0, 0x12,0xb1,0xb1,0x12,0x6c,0x1f,0x12, +0x56,0x6e,0x30,0xf, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x14,0x40,0x0, 0x7d,0x31, +0x7e,0x2f,0x13,0x86,0x7d,0x25,0x7e,0x4, 0xd, 0xc8,0x12,0x7b,0xeb,0x12,0xc8,0x6c, +0x7a,0x55,0x35,0x7e,0xd, 0x2f,0x7e,0x18,0xd, 0xc8,0x12,0xb0,0x29,0x12,0xb0,0xdd, +0xe5,0x33,0x7a,0xb3,0x2b,0x1d,0xe5,0x34,0x7a,0xb3,0x2b,0xf, 0x7a,0xd3,0x2b,0x14, +0x7a,0xe3,0x2b,0x1f,0x7a,0xf3,0x2b,0x20,0x7e,0x34,0x0, 0x38,0xca,0x39,0x7e,0x18, +0x24,0xf2,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xf1,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca, +0x39,0x7e,0x18,0x25,0x2a,0x7e,0x8, 0x3, 0x6f,0x12,0x20,0xf1,0x1b,0xfd,0xda,0x3b, +0x22,0x9, 0x75,0x26,0x36,0x7a,0x73,0x2b,0x20,0x22,0x9, 0x75,0x26,0x34,0x7a,0x73, +0x2b,0x14,0x22,0xca,0xf8,0x7c,0xfb,0x7e,0x34,0x0, 0x38,0xca,0x39,0xac,0x7f,0x2e, +0x34,0x0, 0x5f,0x6d,0x22,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xf1,0x1b,0xfd,0x7e,0x34, +0x0, 0x8c,0xca,0x39,0xac,0x7f,0x2e,0x34,0x1, 0x3f,0x6d,0x22,0x7e,0x8, 0x3, 0x6f, +0x12,0x20,0xf1,0x1b,0xfd,0xda,0xf8,0x22,0x9, 0x75,0x26,0x33,0x7a,0x73,0x2b,0xf, +0x22,0x12,0x6f,0xc6,0x74,0x1, 0x7a,0xb3,0x38,0x34,0x22,0x7e,0xa3,0x2b,0x62,0xbc, +0xab,0x68,0x6, 0x7a,0xb3,0x2b,0x62,0xd2,0x10,0x30,0x10,0x7, 0x12,0x6f,0xb4,0xe4, +0x2, 0xa, 0x66,0x22,0xc2,0x10,0x7e,0x8, 0x2a,0x6d,0x12,0x3, 0x8b,0x7e,0x8, 0x2a, +0x6d,0x74,0x3, 0x2, 0x11,0x7a,0x7e,0x8, 0x38,0x48,0x7e,0x34,0x0, 0x60,0xe4,0x12, +0x21,0x16,0x6c,0xaa,0x7e,0x44,0xff,0xff,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x38, +0x4a,0x59,0x43,0x38,0x52,0xb, 0xa0,0xbe,0xa0,0x8, 0x40,0xe8,0x7e,0x8, 0x38,0x36, +0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x21,0x16,0xa9,0xd0,0x99,0xa9,0xc6,0xdf,0x22,0x7e, +0x34,0x0, 0x4, 0xca,0x39,0x7e,0x34,0x61,0x2d,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b, +0x70,0x12,0x20,0xf1,0x1b,0xfd,0x7e,0x34,0x2a,0xe, 0x7a,0x37,0x2b,0x76,0xe4,0x7a, +0xb3,0x2b,0x74,0x7a,0xb3,0x2b,0x75,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x70,0x4d, +0x7e,0x8, 0x25,0xee,0x12,0x20,0xf1,0x1b,0xfd,0x7e,0x34,0x2b,0x78,0x7a,0x37,0x25, +0xf4,0xe4,0x7a,0xb3,0x25,0xf2,0x74,0x1, 0x7a,0xb3,0x25,0xf3,0x22,0x7e,0x34,0x61, +0x29,0x7e,0x24,0x0, 0xff,0x22,0xe4,0x7a,0xb3,0x39,0xe4,0x7a,0xb3,0x39,0xe5,0x90, +0x60,0x50,0x93,0x7a,0xb3,0x39,0xe6,0x90,0x60,0x51,0xe4,0x93,0x7a,0xb3,0x39,0xe7, +0xe4,0x7a,0xb3,0x39,0xe8,0x90,0x60,0x99,0x93,0x7a,0xb3,0x39,0xe9,0xe4,0x7a,0xb3, +0x39,0xea,0x7a,0xb3,0x39,0xeb,0x90,0x61,0xc4,0x93,0x7a,0xb3,0x39,0xed,0x7e,0x34, +0x61,0x4f,0x12,0x23,0xc9,0x1e,0x34,0x1e,0x34,0x7a,0x73,0x39,0xf1,0x7e,0x34,0x61, +0x55,0x12,0x23,0xc9,0x1e,0x34,0x1e,0x34,0x7a,0x73,0x39,0xf2,0x74,0x64,0x7a,0xb3, +0x3a,0x3, 0x90,0x61,0x18,0xe4,0x93,0x7a,0xb3,0x3a,0x4, 0x90,0x61,0x17,0xe4,0x93, +0x7a,0xb3,0x39,0xf0,0x90,0x61,0x19,0xe4,0x93,0x7a,0xb3,0x3a,0x6, 0x90,0x61,0x24, +0xe4,0x93,0x7a,0xb3,0x3a,0x5, 0x90,0x61,0x1d,0xe4,0x93,0x7a,0xb3,0x3a,0x7, 0x90, +0x61,0x25,0xe4,0x93,0x7a,0xb3,0x3a,0x2, 0xe4,0x7a,0xb3,0x39,0xfd,0x74,0xfa,0x7a, +0xb3,0x39,0xfb,0x74,0x1e,0x7a,0xb3,0x39,0xfc,0x74,0x1, 0x7a,0xb3,0x39,0xfa,0x74, +0x17,0x7a,0xb3,0x39,0xf9,0x74,0x1, 0x7a,0xb3,0x39,0xfe,0xe4,0x7a,0xb3,0x39,0xff, +0x7a,0xb3,0x3a,0x0, 0x7e,0x8, 0x3a,0x8, 0x7e,0x34,0x0, 0x2c,0x12,0x21,0x16,0x7e, +0x34,0x60,0xd6,0x12,0x23,0xc9,0xa, 0x36,0x7a,0x73,0x3a,0x13,0x7e,0x34,0x60,0xd6, +0x12,0x23,0xc9,0x7a,0x73,0x3a,0x14,0x90,0x60,0xd4,0x93,0x7a,0xb3,0x3a,0x15,0x90, +0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x3a,0x16,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x70, +0x4d,0x7e,0x8, 0x3a,0x24,0x12,0x20,0xf1,0x1b,0xfd,0x74,0x5, 0x7a,0xb3,0x3a,0x31, +0x74,0x1, 0x7a,0xb3,0x3a,0x28,0x7e,0x34,0x0, 0x28,0xca,0x39,0x7e,0x34,0x61,0xd5, +0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x26,0x33,0x12,0x20,0xf1,0x1b,0xfd,0x22,0x12,0x70, +0x56,0x12,0x7f,0xfa,0x12,0x0, 0x42,0x12,0xc8,0x81,0x7e,0x18,0x4, 0x0, 0x7a,0x1f, +0x6, 0xf8,0x7e,0xf, 0x6, 0xf8,0x7e,0x1f,0x6, 0xf4,0x12,0x84,0x40,0x7e,0x18,0x8, +0xa, 0x7a,0x1f,0x13,0x86,0x7e,0x18,0xd, 0xc8,0x7a,0x1f,0x13,0x8a,0x7e,0xf, 0x13, +0x8a,0x7e,0x1f,0x13,0x86,0x12,0x84,0x1d,0x12,0x84,0x1a,0x12,0x25,0x78,0x12,0x77, +0x91,0x12,0x71,0xd5,0x2, 0x71,0xc7,0xe4,0x7a,0xb3,0x34,0x38,0x7a,0xb3,0x34,0x39, +0x7a,0xb3,0x34,0x3a,0x22,0x12,0x77,0xcf,0x7e,0x24,0x0, 0x3, 0xad,0x32,0x7e,0x8, +0x28,0xae,0x74,0xff,0x12,0x21,0x16,0x12,0xa1,0xfc,0x7e,0x8, 0x29,0xbc,0x12,0x71, +0xfd,0x7e,0x8, 0x2a,0x2, 0x7e,0x34,0x0, 0xb, 0xe4,0x2, 0x21,0x16,0x6c,0xaa,0x80, +0x20,0x74,0x3, 0x12,0xb0,0xd3,0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, 0xa, 0x12,0x74, +0xc9,0x7f,0x70,0x2d,0xf3,0x79,0x47,0x0, 0x14,0x2d,0x31,0x79,0x41,0x0, 0x28,0xb, +0xa0,0x12,0x72,0x27,0x38,0xdb,0x22,0x90,0x60,0x99,0xe4,0x93,0xbc,0xba,0x22,0xca, +0xf8,0x7e,0x68,0x29,0xbc,0x6c,0xaa,0x80,0x19,0x7e,0x70,0xff,0x12,0x74,0xe4,0xe4, +0xa, 0x4a,0x19,0xb4,0x1f,0x34,0x74,0xff,0x19,0xb4,0x1f,0x46,0x19,0xb4,0x1f,0x50, +0xb, 0xa0,0x12,0x72,0x27,0x38,0xe2,0x7e,0x73,0x2a,0x2, 0xa5,0xbf,0x0, 0x23,0x7e, +0xb3,0x3b,0x5f,0x70,0x2, 0x81,0x3e,0x6c,0xaa,0x80,0x10,0x7e,0x44,0x7f,0xff,0x12, +0x74,0xee,0x79,0x40,0x0, 0x14,0x12,0x74,0xdb,0xb, 0xa0,0x12,0x72,0x27,0x38,0xeb, +0x81,0x3e,0x7e,0xb3,0x3b,0x5f,0x70,0x3d,0xbe,0x70,0x0, 0x28,0x38,0x6c,0xaa,0x80, +0x2a,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34,0x28,0xae,0x12,0x74,0xee,0x79,0x30,0x0, +0x14,0x49,0x34,0x28,0xb0,0x7f,0x6, 0x2d,0x12,0x79,0x30,0x0, 0x28,0x74,0x1, 0xa, +0x3a,0x19,0xb3,0x1f,0x34,0x19,0xa4,0x28,0xb2,0xb, 0xa0,0x7e,0xb3,0x2a,0x2, 0xbc, +0xba,0x38,0xce,0x81,0x3e,0x6c,0xaa,0x80,0x17,0x12,0x74,0xc9,0x3e,0x34,0x59,0x43, +0x15,0x4e,0x59,0x43,0x15,0x50,0x59,0x43,0x15,0x76,0x59,0x43,0x15,0x78,0xb, 0xa0, +0x12,0x72,0x27,0x38,0xe4,0x6c,0xaa,0x80,0x3d,0x6c,0xff,0x80,0x32,0x7e,0x70,0x2, +0xac,0x7f,0x7f,0x6, 0x2d,0x13,0x69,0x30,0x0, 0x14,0xbe,0x34,0x7f,0xff,0x68,0x1d, +0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x14,0x12,0x74,0xd3,0x59,0x32,0x15,0x4e, +0x69,0x30,0x0, 0x28,0x59,0x32,0x15,0x50,0x12,0x74,0xf8,0x80,0x7, 0xb, 0xf0,0x12, +0x74,0xc1,0x38,0xc9,0xb, 0xa0,0x7e,0xb3,0x3b,0x5f,0xbc,0xba,0x38,0xbb,0x6c,0xaa, +0x80,0x24,0xa, 0x3a,0x9, 0xb3,0x1f,0x46,0xb4,0xff,0x19,0x6c,0xff,0x80,0x10,0xa, +0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x5, 0x12,0x74,0xf8,0x80,0x7, 0xb, 0xf0,0x12, +0x74,0xc1,0x38,0xeb,0xb, 0xa0,0x12,0x72,0x27,0x38,0xd7,0x6c,0xaa,0x80,0x1a,0x7e, +0x70,0x9, 0xac,0x7a,0x49,0x43,0x28,0xae,0x12,0x74,0xd3,0x59,0x42,0x15,0x76,0x49, +0x33,0x28,0xb0,0x59,0x32,0x15,0x78,0xb, 0xa0,0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38, +0xde,0x7e,0x34,0x15,0x4e,0x7a,0x37,0x1f,0x40,0x7e,0x34,0x15,0x76,0x7a,0x37,0x1f, +0x42,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x44,0x7e,0x73,0x3b,0x5f,0x7a,0x73,0x1f, +0x3e,0x7e,0x73,0x2a,0x2, 0x7a,0x73,0x1f,0x3f,0x7e,0x8, 0x1f,0x3e,0x12,0x4, 0xad, +0x6c,0xaa,0x80,0x59,0x7e,0x70,0xff,0x6c,0xff,0x80,0x19,0x7e,0x50,0x2, 0xac,0x5f, +0x49,0x12,0x15,0x9e,0xa, 0x2a,0xbd,0x21,0x78,0x8, 0xa, 0x3f,0x9, 0x73,0x1f,0x46, +0x80,0x7, 0xb, 0xf0,0x12,0x74,0xc1,0x38,0xe2,0xbe,0x70,0xff,0x68,0x2d,0x12,0x74, +0xe4,0x74,0x1, 0xa, 0x47,0x19,0xb4,0x1f,0x34,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x24, +0x28,0xae,0x7e,0x30,0x2, 0xac,0x37,0x2d,0x1d,0x7d,0xc, 0x79,0x20,0x0, 0x14,0x49, +0x44,0x28,0xb0,0x7e,0x50,0x2, 0xac,0x57,0x12,0x74,0xdb,0xb, 0xa0,0x7e,0x63,0x2a, +0x2, 0xbc,0x6a,0x38,0x9f,0x6c,0xaa,0x80,0x20,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xbe, +0xb0,0x1, 0x68,0x13,0x12,0x74,0xc9,0x7f,0x6, 0x2d,0x13,0x79,0x40,0x0, 0x14,0x2d, +0x3d,0x7d,0x2c,0x79,0x41,0x0, 0x28,0xb, 0xa0,0x12,0x72,0x27,0x38,0xdb,0x7e,0xf3, +0x2a,0x2, 0x7a,0xf3,0x3b,0x5f,0x6c,0xaa,0x80,0x68,0xa, 0x3a,0x9, 0xb3,0x1f,0x34, +0xb4,0x1, 0x2c,0x12,0x74,0xba,0x29,0xb1,0x0, 0xa, 0xb4,0x1, 0x6, 0x74,0x3, 0x39, +0xb1,0x0, 0xa, 0x12,0x74,0xba,0x29,0x31,0x0, 0xa, 0xa5,0xbb,0x3, 0x6, 0xe4,0x7a, +0x1b,0xb0,0x80,0x32,0xa5,0xbb,0x0, 0x2e,0x74,0x2, 0x7a,0x1b,0xb0,0x80,0x27,0x12, +0x74,0xba,0x29,0xb1,0x0, 0xa, 0xbe,0xb0,0x2, 0x68,0x2, 0x70,0x14,0x74,0x1, 0x7a, +0x1b,0xb0,0x7c,0x2f,0xb, 0xf0,0x7e,0x30,0x9, 0xac,0x23,0x19,0xa1,0x28,0xb2,0x80, +0x5, 0x74,0x3, 0x7a,0x1b,0xb0,0x12,0x74,0xba,0x7e,0x1b,0xb0,0x39,0xb1,0x0, 0xa, +0xb, 0xa0,0x12,0x72,0x27,0x38,0x93,0xda,0xf8,0x22,0xa, 0x3a,0x2d,0x3d,0x7d,0x2c, +0x22,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbf,0x22,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, +0xac,0x7a,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x3e,0x24,0x22,0x7f,0x6, 0x2d,0x12,0x79, +0x40,0x0, 0x28,0x22,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x72,0x28,0xb2,0x22,0x7e,0x50, +0x2, 0xac,0x5a,0x7f,0x6, 0x2d,0x12,0x22,0xa, 0x3a,0x19,0xf3,0x1f,0x46,0x74,0x1, +0x19,0xb4,0x1f,0x50,0x22,0xca,0xd8,0xca,0x79,0x70,0xc, 0x7e,0x8, 0x30,0x3d,0x12, +0x76,0x61,0x74,0xff,0x12,0x21,0x16,0x6c,0xff,0xc1,0x4e,0x7e,0x50,0x9, 0xac,0x5f, +0x49,0xd2,0x29,0x62,0x1e,0xd4,0x1e,0xd4,0x1e,0xd4,0x1e,0xd4,0x49,0xc2,0x29,0x64, +0x1e,0xc4,0x1e,0xc4,0x1e,0xc4,0x1e,0xc4,0x9, 0xe2,0x29,0x66,0x2e,0x24,0x28,0xae, +0x12,0x25,0x6c,0x1b,0x28,0x30,0x7e,0x50,0x9, 0xac,0x5f,0x2e,0x24,0x28,0xb0,0x12, +0x25,0x6c,0x1b,0x28,0x30,0x74,0x9, 0xac,0xbf,0x19,0xe5,0x28,0xb2,0x74,0x9, 0xac, +0xbf,0x9, 0x75,0x29,0x67,0x19,0x75,0x28,0xb3,0x74,0x9, 0xac,0xbf,0x9, 0x75,0x29, +0x68,0x19,0x75,0x28,0xb4,0x7c,0xae,0x5e,0xa0,0xf, 0xa, 0x2a,0x12,0x76,0x61,0xbd, +0x23,0x48,0x2, 0xc1,0x4c,0x7c,0xea,0xa, 0x3e,0x9, 0xb3,0x29,0xbc,0xbe,0xb0,0x3, +0x78,0x2, 0xc1,0x4c,0xb4,0x1, 0x7, 0x74,0xff,0x12,0x76,0x5a,0xc1,0x4c,0xa, 0x3e, +0x9, 0x13,0x30,0x3d,0xa5,0xb9,0xff,0x38,0x74,0x1, 0x12,0x76,0x5a,0x74,0x9, 0xac, +0xbf,0x59,0xd5,0x28,0xae,0x74,0x9, 0xac,0xbf,0x59,0xc5,0x28,0xb0,0x6c,0xdd,0x12, +0x8f,0xcd,0x7e,0x50,0x9, 0xac,0x5d,0x7e,0x30,0x1b,0xac,0x3e,0x2d,0x12,0x2e,0x14, +0x30,0x47,0x74,0x9, 0x12,0x1f,0xc1,0xb, 0xd0,0xbe,0xd0,0x3, 0x78,0xe1,0x80,0x6c, +0xbe,0x10,0x3, 0x40,0x4, 0xe4,0x12,0x76,0x5a,0xa, 0x3e,0x9, 0x3, 0x30,0x3d,0x7e, +0x10,0x9, 0xac,0x1, 0x7e,0x30,0x1b,0xac,0x3e,0x7d,0xb1,0x2d,0xb0,0x59,0xdb,0x30, +0x47,0x59,0xcb,0x30,0x49,0x7e,0xb3,0x2a,0x9, 0x70,0x13,0xe4,0x12,0x76,0x72,0x12, +0x76,0x69,0x74,0x1, 0x7e,0x30,0x1b,0xac,0x3e,0x12,0x76,0x72,0x80,0x1d,0x49,0x3b, +0x30,0x47,0x12,0x76,0x69,0xa, 0x3e,0x9, 0x43,0x30,0x3d,0x7e,0x50,0x9, 0xac,0x45, +0x7e,0x70,0x1b,0xac,0x7e,0x2d,0x32,0x49,0x33,0x30,0x49,0x74,0x9, 0xac,0xbf,0x59, +0x35,0x28,0xb0,0xa, 0x3e,0x2e,0x34,0x30,0x3d,0x12,0xb7,0xc5,0xb, 0xf0,0x12,0x74, +0xc1,0x28,0x2, 0xa1,0x1b,0xda,0x79,0xda,0xd8,0x22,0xa, 0x3e,0x19,0xb3,0x30,0x3d, +0x22,0x90,0x60,0x99,0xe4,0x93,0xa, 0x3b,0x22,0x74,0x9, 0xac,0xbf,0x59,0x35,0x28, +0xae,0x22,0x2e,0x14,0x30,0x47,0x6d,0x0, 0x7c,0xab,0x6d,0x33,0x6c,0x55,0x4c,0xaa, +0x7e,0x90,0x9, 0x78,0xd, 0xac,0x95,0x7f,0x70,0x2d,0xf4,0xb, 0x7a,0x40,0x2d,0x34, +0x80,0xc, 0xac,0x95,0x7f,0x70,0x2d,0xf4,0x69,0x47,0x0, 0x2, 0x2d,0x34,0xb, 0x50, +0xbe,0x50,0x3, 0x40,0xd9,0x7e,0x24,0x0, 0x3, 0x8d,0x32,0x22,0x7c,0xab,0x7e,0x8, +0x29,0xbc,0x12,0x72,0x27,0x28,0x1f,0xa, 0x3a,0x7f,0x70,0x2d,0xf3,0x7e,0x7b,0xb0, +0xb4,0x2, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0x7b,0xb0,0x74,0x3, 0x2d,0x31, +0x7d,0x20,0x39,0xb1,0x0, 0xa, 0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x61,0x43,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0x40,0x90,0x61,0x35,0xe4,0x93,0x70,0x2, 0xe1,0x83,0x90, +0x60,0xa7,0xe4,0x93,0x70,0x2, 0xe1,0x83,0x6c,0xff,0xe1,0x7c,0x7e,0x70,0x9, 0xac, +0x7f,0x9, 0xe3,0x29,0xc, 0x5e,0xe0,0xf, 0x49,0xc3,0x29,0xa, 0x7e,0x14,0x60,0xd1, +0x12,0x5f,0xec,0x2d,0x24,0xbd,0xc2,0x40,0x42,0x49,0xd3,0x29,0x8, 0x7d,0x3d,0x12, +0xa8,0x1b,0x7c,0xdb,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xbd,0x38,0xe, 0x7d,0x34,0x1b, +0x34,0x12,0x77,0x88,0x7c,0xbe,0x12,0x76,0xac,0x80,0x3f,0x7e,0x70,0x2, 0xac,0x7d, +0x2e,0x34,0x60,0xc5,0x12,0x91,0x1c,0x74,0x9, 0xac,0xbf,0x59,0xd5,0x29,0x8, 0x7e, +0x34,0x60,0xcf,0x12,0x23,0xc9,0x12,0x77,0x88,0x80,0x1f,0xbd,0xc4,0x40,0x1b,0x7d, +0x54,0x2e,0x54,0x0, 0xa, 0xbd,0xc5,0x40,0x5, 0x7c,0xbe,0x12,0x76,0xac,0x7d,0xc4, +0x1b,0xc4,0x74,0x9, 0xac,0xbf,0x59,0xc5,0x29,0xa, 0xb, 0xf0,0x12,0x74,0xc1,0x28, +0x2, 0xc1,0xfc,0xda,0x79,0xda,0xd8,0x22,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0xa, +0x22,0x7e,0x8, 0x26,0x5b,0x7e,0x34,0x2, 0x3a,0xe4,0x12,0x21,0x16,0x90,0x60,0x9c, +0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26,0x8c,0x74,0xff,0x12,0x21,0x16,0x90,0x60, +0x9c,0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26,0xb4,0x74,0xff,0x12,0x21,0x16, +0x90,0x60,0x9a,0x12,0x77,0xd2,0x7e,0x8, 0x27,0x76,0x74,0xff,0x2, 0x21,0x16,0x90, +0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b,0x22,0x6d,0x33,0x6c,0xaa,0x80, +0x14,0xa, 0x2a,0x9, 0xb2,0x2a,0xdc,0x54,0x1, 0x78,0x5, 0x4e,0x70,0x1, 0x80,0x3, +0x4e,0x70,0x10,0xb, 0xa0,0x7e,0x53,0x2a,0x74,0xbc,0x5a,0x38,0xe4,0x6c,0xaa,0x80, +0x1f,0xa, 0x2a,0x9, 0xb2,0x2a,0xb9,0xbe,0xb0,0xd, 0x38,0x5, 0x4e,0x70,0xc0,0x80, +0xd, 0xbe,0xb0,0x1b,0x38,0x5, 0x4e,0x60,0x8, 0x80,0x3, 0x4e,0x60,0x50,0xb, 0xa0, +0x12,0x78,0x26,0x38,0xdc,0x22,0x7e,0xb3,0x2a,0x73,0xbc,0xba,0x22,0xca,0x3b,0x7e, +0xb4,0x7f,0xff,0x7d,0xab,0x7d,0x8b,0x6d,0x22,0x7d,0x32,0x7d,0x9b,0x75,0x24,0x0, +0x6c,0x99,0x7e,0x78,0x4, 0xfc,0x7e,0x8, 0x5, 0x7a,0xe4,0x7a,0xb3,0x8, 0x8, 0x7a, +0xb3,0x8, 0x9, 0x7a,0xb3,0x26,0xf6,0x7a,0xb3,0x26,0xf8,0x7a,0xb3,0x26,0xf7,0x7a, +0xb3,0x26,0xf9,0x6c,0xaa,0x80,0x5f,0x12,0x79,0x9c,0xb, 0x6a,0xc0,0xbd,0xca,0x58, +0x2, 0x7d,0xac,0xbd,0xc3,0x8, 0x2, 0x7d,0x3c,0x2d,0x71,0x7d,0x60,0xb, 0x3a,0xd0, +0xbd,0xd9,0x58,0x2, 0x7d,0x9d,0x7e,0x67,0x2a,0x53,0x7e,0x74,0x0, 0x3, 0xad,0x76, +0xbd,0xc7,0x8, 0x2, 0x5, 0x24,0x12,0x79,0x89,0xb, 0x3a,0xd0,0xbd,0xcd,0x8, 0xb, +0x7e,0xb3,0x26,0xf7,0x4, 0x7a,0xb3,0x26,0xf7,0x80,0x19,0x12,0x79,0x92,0xb, 0x3a, +0xc0,0x6e,0xd4,0xff,0xff,0xb, 0xd4,0xbd,0xcd,0x58,0x9, 0x7e,0xb3,0x26,0xf9,0x4, +0x7a,0xb3,0x26,0xf9,0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xbc,0xba,0x38,0x99,0x7a,0xa7, +0x7, 0xfe,0x7a,0x37,0x8, 0x2, 0xe5,0x24,0x7a,0xb3,0x8, 0x9, 0x7a,0x97,0x8, 0x6, +0x12,0x79,0x81,0x2d,0xf5,0x6c,0xaa,0x80,0x50,0x12,0x79,0x9c,0xb, 0x6a,0xd0,0xbd, +0xd8,0x58,0x2, 0x7d,0x8d,0xbd,0xd2,0x8, 0x2, 0x7d,0x2d,0x7e,0x67,0x2a,0x51,0x7e, +0x74,0x0, 0x3, 0xad,0x76,0xbd,0xd7,0x8, 0x2, 0xb, 0x90,0x12,0x79,0x89,0xb, 0x3a, +0xc0,0xbd,0xdc,0x8, 0xb, 0x7e,0xb3,0x26,0xf6,0x4, 0x7a,0xb3,0x26,0xf6,0x80,0x17, +0x12,0x79,0x92,0xb, 0x3a,0xd0,0x6d,0x99,0x9d,0x9c,0xbd,0xd9,0x58,0x9, 0x7e,0xb3, +0x26,0xf8,0x4, 0x7a,0xb3,0x26,0xf8,0xb, 0xa0,0x12,0x78,0x26,0x38,0xab,0x7a,0x87, +0x7, 0xfc,0x7a,0x27,0x8, 0x0, 0x7a,0x93,0x8, 0x8, 0x12,0x79,0x81,0x2d,0x15,0x6c, +0xaa,0x80,0xe, 0x12,0xc7,0xac,0xb, 0x7a,0x90,0xbd,0x9b,0x58,0x2, 0x7d,0xb9,0xb, +0xa0,0x12,0x78,0x26,0x38,0xed,0x7a,0xb7,0x8, 0x4, 0xbd,0x8a,0x58,0x2, 0x7d,0xa8, +0x7a,0xa7,0x7, 0xf8,0xbd,0x32,0x58,0x2, 0x7d,0x32,0x7a,0x37,0x7, 0xfa,0xda,0x3b, +0x22,0x7e,0xa3,0x2a,0x74,0x74,0x2, 0xa4,0x22,0x7e,0x74,0x62,0x10,0x7e,0x64,0x0, +0xff,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x2d,0x7f,0x7d,0x6e,0x22,0x7e,0xf0,0x2, 0xac, +0xfa,0x7f,0x67,0x2d,0xd7,0x22,0xca,0x3b,0x7f,0x31,0x7a,0xd, 0x24,0x7e,0x35,0x28, +0x7a,0x35,0x2e,0x7e,0xd, 0x24,0x7f,0x13,0x12,0x7a,0x3c,0x7e,0x35,0x28,0x7a,0x35, +0x2a,0x12,0x79,0x81,0x7e,0xd, 0x24,0x2d,0x15,0x7f,0x13,0x2d,0x35,0x12,0x7a,0xf6, +0xda,0x3b,0x22,0x7e,0x37,0x2a,0x4f,0x1e,0x34,0x7a,0x35,0x28,0x7e,0x8, 0x4, 0xfc, +0x7e,0x18,0x4, 0x0, 0x12,0x79,0xa6,0x7e,0x37,0x28,0x99,0xe, 0x34,0x7a,0x35,0x28, +0x7e,0x8, 0x5, 0x7a,0x7e,0x18,0x4, 0x7e,0x12,0x79,0xa6,0x12,0x7a,0x15,0x12,0xa6, +0x1e,0x2, 0x7a,0x4, 0xe4,0x7a,0xb3,0x3b,0x5e,0x7e,0xb3,0x28,0xa8,0x60,0x5, 0xe4, +0x7a,0xb3,0x3b,0x5e,0x22,0xca,0x3b,0x7e,0xf3,0x2a,0x6e,0x12,0xc8,0xf2,0x6c,0xcc, +0x80,0x13,0x7c,0x7c,0xac,0x7f,0x3e,0x34,0x7e,0xf, 0x13,0x8a,0x2d,0x13,0x7c,0xbd, +0x12,0xa6,0xa6,0xb, 0xc0,0xbc,0xec,0x38,0xe9,0xda,0x3b,0x22,0xca,0x3b,0x7f,0x61, +0x7f,0x50,0x7e,0x73,0x2a,0x6e,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, +0x12,0x20,0xf1,0x1b,0xfd,0x6c,0xdd,0x12,0x7d,0x37,0x7a,0xb3,0x1f,0x6c,0x6c,0xcc, +0x80,0x4a,0x12,0x7a,0xe5,0x78,0x43,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35,0xb, +0x1a,0xe0,0x7d,0x3f,0x12,0x21,0x48,0x7d,0x13,0x7d,0x3e,0x12,0x21,0x48,0xbd,0x31, +0x58,0x2, 0x7d,0xfe,0xbe,0xe5,0x2e,0x8, 0x5, 0x7e,0xe5,0x2e,0x80,0xb, 0x6d,0x33, +0x9e,0x35,0x2e,0xbd,0x3e,0x8, 0x2, 0x7d,0xe3,0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x2f, +0x41,0x7e,0xb3,0x1f,0x6c,0x4, 0x7a,0xb3,0x1f,0x6c,0xb, 0xc0,0x7e,0x73,0x2a,0x70, +0xbc,0x7c,0x38,0xae,0x7e,0x73,0x1f,0x6c,0x4c,0x77,0x68,0x1d,0x12,0x7d,0x54,0x8, +0x2, 0x7d,0x7f,0x6c,0xcc,0x80,0xa, 0x12,0x7a,0xe5,0x78,0x3, 0x12,0x7d,0x3f,0xb, +0xc0,0x7e,0x73,0x2a,0x70,0xbc,0x7c,0x38,0xee,0xb, 0xd0,0xbe,0xd0,0x2, 0x50,0x2, +0x41,0x57,0xda,0x3b,0x22,0xa, 0xec,0x9, 0x7e,0x2a,0xdc,0xa, 0x37,0x5e,0x34,0x0, +0x1, 0xa, 0xed,0xbd,0x3e,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x14,0x23,0xd, +0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20,0x7a,0x1d,0x2c,0x7e,0x73, +0x2a,0x6d,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, 0x12,0x20,0xf1,0x1b, +0xfd,0x6c,0xdd,0x12,0x7d,0x37,0x7a,0xb3,0x1f,0x34,0x6c,0xcc,0x80,0x4f,0x12,0x7b, +0xdb,0x40,0x48,0x12,0x7b,0xd1,0x50,0x43,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35, +0xb, 0x1a,0x10,0x7d,0x3f,0x12,0x21,0x48,0x7d,0x3, 0x7d,0x31,0x12,0x21,0x48,0xbd, +0x30,0x58,0x2, 0x7d,0xf1,0xbe,0x15,0x2a,0x8, 0x5, 0x7e,0x15,0x2a,0x80,0xb, 0x6d, +0x0, 0x9e,0x5, 0x2a,0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x7d,0x31,0x1a,0x26,0x1a,0x24, +0x2f,0x41,0x7e,0xb3,0x1f,0x34,0x4, 0x7a,0xb3,0x1f,0x34,0xb, 0xc0,0x12,0x7b,0xca, +0x38,0xac,0x7e,0x73,0x1f,0x34,0x4c,0x77,0x68,0x34,0x12,0x7d,0x54,0x8, 0x2, 0x7d, +0x7f,0xbe,0x75,0x2a,0x8, 0x5, 0x7e,0x75,0x2a,0x80,0xb, 0x6d,0xee,0x9e,0xe5,0x2a, +0xbd,0xe7,0x8, 0x2, 0x7d,0x7e,0x6c,0xcc,0x80,0xf, 0x12,0x7b,0xdb,0x40,0x8, 0x12, +0x7b,0xd1,0x50,0x3, 0x12,0x7d,0x3f,0xb, 0xc0,0x12,0x7b,0xca,0x38,0xec,0xb, 0xd0, +0xbe,0xd0,0x3, 0x50,0x2, 0x61,0x23,0xda,0x3b,0x22,0x7e,0x73,0x2a,0x6f,0xbc,0x7c, +0x22,0x7c,0x1d,0x2e,0x10,0x2d,0xa5,0xe7,0xbc,0xab,0x22,0xa, 0xec,0x9, 0xae,0x2a, +0xb9,0x7c,0x1d,0x2e,0x10,0x2c,0xa5,0xe7,0xbc,0xab,0x22,0x7e,0xb3,0x2a,0x6d,0xca, +0x3b,0x7c,0xdb,0x7a,0x5, 0x39,0x7d,0x71,0x7a,0x25,0x37,0x7a,0x35,0x35,0x12,0x7e, +0x2e,0x50,0x7c,0x6c,0xcc,0x80,0x11,0x7e,0x73,0x2a,0x6e,0x12,0x7d,0x16,0x12,0x7c, +0xfc,0x7e,0x34,0x34,0x0, 0x12,0x7d,0x1f,0x12,0x7b,0xca,0x38,0xea,0x6c,0xcc,0x80, +0x58,0x7e,0xa3,0x2a,0x6e,0x7c,0x7a,0x12,0x7d,0x16,0x75,0x3b,0x0, 0x80,0x27,0x7e, +0xb3,0x39,0xf9,0xbe,0xb1,0x3b,0x7e,0x70,0x4, 0x28,0x8, 0xac,0x7c,0x49,0x43,0x3, +0x6f,0x80,0x6, 0xac,0x7c,0x49,0x43,0x3, 0x71,0x7e,0x71,0x3b,0x74,0x2, 0xac,0x7b, +0x59,0x43,0x34,0x50,0x5, 0x3b,0x7e,0xb3,0x2a,0x70,0xbe,0xb1,0x3b,0x38,0xd0,0x12, +0x7f,0xdf,0x68,0xb, 0x7e,0x34,0x10,0x0, 0x74,0x2, 0xa4,0x59,0x35,0x34,0x4e,0x12, +0x7c,0xfc,0x7e,0x34,0x34,0x50,0x12,0x7d,0x1f,0xbc,0xdc,0x38,0xa4,0x80,0x2c,0x7a, +0xd3,0x25,0xb6,0x7e,0x73,0x2a,0x70,0x7a,0x73,0x25,0xb7,0xe4,0x7a,0xb3,0x25,0xb9, +0x74,0x6, 0x7a,0xb3,0x25,0xb8,0x7a,0x77,0x25,0xba,0x7a,0x77,0x25,0xbe,0x7e,0x8, +0x25,0xb6,0x7e,0x73,0x2b,0x1f,0xa, 0x37,0x12,0xe, 0x37,0x7d,0x37,0x12,0x8a,0x5a, +0x7e,0x35,0x39,0x7a,0x37,0x25,0xbe,0xe4,0x7a,0xb3,0x25,0xb8,0x12,0x7d,0xd, 0x7a, +0xd3,0x25,0xb6,0x7e,0xb3,0x2b,0x1d,0x70,0xf, 0xe4,0x7a,0xb3,0x25,0xb9,0x7a,0x77, +0x25,0xba,0x7e,0x34,0x0, 0x20,0x80,0x16,0x74,0x1, 0x7a,0xb3,0x25,0xb9,0x7e,0x35, +0x35,0x7a,0x37,0x25,0xba,0x7e,0x35,0x37,0x7a,0x37,0x25,0xbc,0x6d,0x33,0x7a,0x37, +0x25,0xc0,0x7e,0x8, 0x25,0xb6,0x12,0xd, 0x7, 0xda,0x3b,0x22,0x74,0xc, 0x7a,0xb3, +0x25,0xb8,0x74,0x1, 0x7a,0xb3,0x25,0xb6,0xe4,0x7a,0xb3,0x25,0xb9,0x7e,0x73,0x2a, +0x6e,0x7a,0x73,0x25,0xb7,0x22,0xac,0x7c,0x3e,0x34,0x7d,0xf7,0x2d,0xf3,0x22,0x7a, +0x37,0x25,0xba,0x7d,0x3f,0x7a,0x37,0x25,0xbc,0x7a,0x37,0x25,0xbe,0x7e,0x8, 0x25, +0xb6,0x12,0x7, 0x9b,0xb, 0xc0,0x22,0x7e,0xf4,0x7f,0xff,0x9f,0x44,0xe4,0x22,0x74, +0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0xe0,0x9d,0xe7,0x7f,0x15,0x2d,0x35, +0x1b,0x1a,0xe0,0x22,0xa, 0x17,0x6d,0x0, 0x7f,0x14,0x12,0x1f,0x8d,0x7d,0x73,0x12, +0x21,0x48,0x7d,0xe3,0x7d,0x3f,0x12,0x21,0x48,0xbd,0x3e,0x22,0x7e,0xf, 0x13,0x8a, +0x7e,0x18,0x8, 0xa, 0xca,0x3b,0x7a,0x1d,0x2a,0x7f,0x30,0x12,0xc8,0x6c,0x7a,0x55, +0x32,0x7e,0xb3,0x2b,0x1d,0xf5,0x2f,0xe4,0x7a,0xb3,0x2b,0x1d,0x7f,0x3, 0x7e,0x1d, +0x2a,0x12,0x84,0x1d,0x12,0x7f,0xc4,0x12,0x4f,0xf7,0x75,0x2e,0x0, 0x12,0x56,0x75, +0x30,0xf, 0xfd,0x74,0x1, 0x12,0x7e,0x73,0x7e,0x14,0x40,0x0, 0x7d,0x21,0x7d,0x7, +0x12,0x7b,0xeb,0x12,0x7e,0x7b,0x6d,0x33,0x80,0x19,0x7e,0x35,0x30,0x3e,0x34,0x7f, +0x3, 0x2d,0x13,0xb, 0xa, 0x20,0x7e,0xd, 0x2a,0x2d,0x13,0x12,0x85,0xcf,0x7e,0x35, +0x30,0xb, 0x34,0x7a,0x35,0x30,0x7e,0x35,0x32,0xbe,0x35,0x30,0x38,0xdc,0x5, 0x2e, +0xe5,0x2e,0xbe,0xb0,0x1, 0x40,0xb6,0xe5,0x2f,0x7a,0xb3,0x2b,0x1d,0xda,0x3b,0x22, +0x7e,0xb3,0x2b,0x1e,0x70,0x1f,0x12,0x26,0x86,0x12,0x2f,0xe8,0x50,0xfb,0x12,0x7d, +0x6c,0x12,0x7e,0x16,0x20,0x12,0x3, 0x12,0xb1,0x2c,0x74,0x2, 0x7a,0xb3,0x2b,0x1e, +0xe4,0x7a,0xb3,0x16,0x91,0x22,0x12,0x7e,0x2e,0x50,0x3, 0xd2,0x12,0x22,0xc2,0x12, +0x22,0x12,0xa8,0xd2,0x12,0x7e,0x3f,0x2, 0x7e,0x16,0x7a,0xb3,0x2b,0x20,0x7e,0xb3, +0x39,0x50,0xb4,0x3, 0x8, 0x7e,0xb3,0x39,0xfa,0x70,0x2, 0xc3,0x22,0xd3,0x22,0x7e, +0x8, 0x24,0xf2,0x7e,0x34,0x0, 0xc, 0xe4,0x12,0x21,0x16,0x12,0x7f,0xf1,0x12,0x7f, +0xe8,0xa9,0xd1,0xcb,0x12,0x7e,0x73,0x7a,0x37,0x24,0xf6,0x7e,0x1f,0x3b,0x21,0x7a, +0x37,0x24,0xf8,0x7e,0x1f,0x13,0x86,0x7a,0x37,0x24,0xfa,0x6d,0x33,0x12,0x7f,0xcd, +0x2, 0xd, 0x7, 0x12,0x0, 0xe, 0x7e,0x1f,0x13,0x86,0x22,0x7e,0xa3,0x2a,0x6e,0xa, +0x3a,0x3e,0x34,0x7e,0x8, 0x13,0x8e,0xe4,0x12,0x21,0x16,0x90,0x60,0x93,0x93,0xa, +0x3b,0x7e,0xb3,0x2a,0x71,0xa, 0x2b,0x2d,0x23,0xa, 0x3a,0xad,0x32,0x7d,0x43,0x6c, +0x77,0x80,0x1d,0xa, 0x27,0x2d,0x24,0x12,0x7f,0xd6,0xb, 0xa, 0x0, 0x7e,0x30,0x2, +0xac,0x37,0x2e,0x14,0x13,0x8e,0xb, 0x18,0x20,0x2d,0x20,0x1b,0x18,0x20,0xb, 0x70, +0xbc,0xa7,0x38,0xdf,0x22,0x12,0x39,0x15,0x12,0x9b,0xef,0x12,0x7f,0x1f,0x7e,0xb3, +0x39,0x4e,0xb4,0x1, 0x1e,0x7e,0x34,0x61,0xc0,0x12,0x7f,0xbc,0x7e,0x24,0x0, 0x5, +0xad,0x12,0x7a,0x17,0x28,0xa1,0x7e,0x14,0x61,0xc2,0x12,0x5a,0xad,0xad,0x32,0x7a, +0x37,0x28,0xa3,0x7e,0xb3,0x3b,0x60,0x60,0x7, 0x14,0x7a,0xb3,0x3b,0x60,0x80,0x6, +0x7e,0xb3,0x28,0xac,0x60,0x9, 0x12,0x7e,0x21,0x12,0x7f,0x43,0x12,0xb9,0xb9,0x7e, +0xb3,0x28,0xad,0x60,0x9, 0x12,0xc0,0x5, 0x12,0xbf,0xb4,0x2, 0x7f,0x60,0x22,0x12, +0xb1,0xba,0x60,0x17,0x12,0x7f,0x3c,0x7e,0x37,0x28,0xa1,0x3e,0x34,0x7a,0x37,0x28, +0xa1,0x7e,0x37,0x28,0xa3,0x3e,0x34,0x7a,0x37,0x28,0xa3,0x22,0x74,0x1, 0x7a,0xb3, +0x28,0xad,0x22,0x12,0xa9,0x57,0x6d,0x33,0x7a,0x37,0x38,0xab,0x6c,0xaa,0x80,0x5, +0x12,0x7f,0xae,0xb, 0xa0,0x12,0x5f,0xf4,0x38,0xf6,0xe4,0x7a,0xb3,0x38,0x40,0x22, +0x6c,0xaa,0x80,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x12,0xc8,0x94,0xbe,0x34,0x3, 0xe8, +0x8, 0x5, 0x12,0x7f,0xae,0x80,0x2f,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32,0x38,0x52, +0x49,0x12,0x38,0x4e,0xbd,0x13,0x28,0xf, 0x7d,0x2, 0x2e,0x4, 0x38,0x52,0x7d,0x13, +0xb, 0x15,0x1b,0x8, 0x10,0x80,0xf, 0xbe,0x34,0x0, 0x2, 0x28,0x9, 0x2e,0x24,0x38, +0x52,0x1b,0x35,0x1b,0x28,0x30,0xb, 0xa0,0x12,0x5f,0xf4,0x38,0xb7,0x22,0x7e,0x50, +0xc, 0xac,0x5a,0x49,0x32,0x38,0x4e,0x59,0x32,0x38,0x52,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x10,0x22,0x74,0x1, 0x12,0x14,0x13,0xe4,0x2, 0x0, 0x1e,0x7a,0x37,0x24, +0xfc,0x7e,0x8, 0x24,0xf2,0x22,0x3e,0x24,0x7e,0xf, 0x3b,0x21,0x2d,0x12,0x22,0x90, +0x60,0xaa,0xe4,0x93,0xbe,0xb0,0x1, 0x22,0x7e,0x73,0x2a,0x6d,0x7a,0x73,0x24,0xf2, +0x22,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x24,0xf3,0x22,0xca,0xd8,0xca,0x79,0x90,0x60, +0x50,0xe4,0x93,0x7c,0xdb,0x90,0x60,0x51,0xe4,0x93,0x7c,0xeb,0x7e,0x73,0x2a,0x74, +0xbc,0x7e,0x28,0x4, 0x7c,0xf7,0x80,0x2, 0x7c,0xfe,0x7a,0xd3,0x2a,0x6d,0x7a,0xe3, +0x2a,0x6e,0x7a,0xd3,0x2a,0x71,0x7a,0xe3,0x2a,0x72,0x7a,0xd3,0x2a,0x73,0x7a,0xe3, +0x2a,0x74,0x90,0x60,0xa8,0xe4,0x93,0x7c,0xab,0x7a,0xa3,0x2a,0x77,0x90,0x60,0xa9, +0xe4,0x93,0xa, 0x2b,0xa, 0x3d,0x9d,0x32,0x7c,0xb7,0x7a,0xb3,0x2a,0x6f,0xa, 0x2a, +0xa, 0x3e,0x9d,0x32,0x7a,0x73,0x2a,0x70,0x90,0x60,0x91,0xe4,0x93,0x7a,0xb3,0x2a, +0x78,0x90,0x60,0x94,0xe4,0x93,0x7a,0xb3,0x2a,0x79,0xa, 0x3d,0xca,0x39,0x7e,0x34, +0x60,0x52,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x7a,0x12,0x20,0xf1,0x1b,0xfd,0xa, +0x3f,0xca,0x39,0x7e,0x34,0x60,0x75,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x9d,0x12, +0x20,0xf1,0x1b,0xfd,0x7e,0x34,0x0, 0x23,0xca,0x39,0x7e,0x34,0x60,0xd8,0x7e,0x24, +0x0, 0xff,0x7e,0x8, 0x2b,0x21,0x12,0x20,0xf1,0x1b,0xfd,0x12,0x81,0xe1,0x12,0x83, +0xd1,0x90,0x60,0xaa,0xe4,0x93,0x70,0x8, 0x7a,0xd3,0x2a,0x75,0x7a,0xe3,0x2a,0x76, +0x12,0x6f,0xff,0x74,0x1, 0x12,0x45,0x6e,0xe4,0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b, +0x2, 0x12,0x77,0xdb,0x7a,0x37,0x2b,0xd, 0x74,0x3, 0x7a,0xb3,0x2b,0x3, 0xe4,0x7a, +0xb3,0x2b,0x4, 0x74,0x2, 0x7a,0xb3,0x2b,0x5, 0x7e,0x34,0x61,0x59,0x12,0x23,0xc9, +0x7a,0x37,0x2b,0x7, 0x74,0x4, 0x7a,0xb3,0x2b,0x6, 0x7e,0x34,0x0, 0xf, 0x7a,0x37, +0x2b,0x9, 0x7e,0x34,0x20,0x5f,0x7a,0x37,0x2b,0xb, 0x90,0x61,0x1a,0xe4,0x93,0x7a, +0xb3,0x2b,0x62,0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x90,0x61,0x1c,0xe4, +0x93,0x7a,0xb3,0x2b,0x11,0x74,0x4, 0x7a,0xb3,0x2b,0x13,0x90,0x60,0xd5,0xe4,0x93, +0x12,0x6c,0x13,0xe4,0x7a,0xb3,0x2b,0x1d,0x7a,0xb3,0x2b,0x1e,0x7e,0x34,0x61,0x22, +0x12,0x23,0xc9,0x7a,0x37,0x2b,0x19,0x90,0x60,0xd3,0x93,0x7a,0xb3,0x2b,0x12,0x90, +0x61,0x24,0xe4,0x93,0x7a,0xb3,0x2b,0x20,0x90,0x61,0x19,0xe4,0x93,0x7a,0xb3,0x2b, +0x1f,0x7e,0x34,0x61,0x1e,0x12,0x23,0xc9,0x7a,0x37,0x2b,0x15,0x7e,0x34,0x61,0x20, +0x12,0x23,0xc9,0x7a,0x37,0x2b,0x17,0x90,0x61,0x1d,0xe4,0x93,0x7a,0xb3,0x2b,0x14, +0x7e,0x34,0x0, 0x30,0x7a,0x37,0x2b,0x6a,0x74,0x5, 0x7a,0xb3,0x2b,0x67,0x7e,0x34, +0x0, 0x5, 0x7a,0x37,0x2b,0x68,0xe4,0x7a,0xb3,0x2b,0x66,0x7e,0x34,0x4, 0x6d,0x7a, +0x37,0x2b,0x6c,0x74,0x1, 0x7a,0xb3,0x2b,0x63,0x74,0x6, 0x7a,0xb3,0x2b,0x64,0xe4, +0x7a,0xb3,0x2b,0x65,0x74,0x1, 0x7a,0xb3,0x2b,0x60,0xe4,0x7a,0xb3,0x2b,0x61,0x7e, +0x34,0x20,0x93,0x7a,0x37,0x2b,0x6e,0xa, 0x3e,0xca,0x39,0x7e,0x34,0x60,0xfb,0x7e, +0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x44,0x12,0x20,0xf1,0x1b,0xfd,0xda,0x79,0xda,0xd8, +0x22,0x12,0x82,0x77,0x12,0x82,0x43,0x90,0x60,0x50,0xe4,0x93,0xa, 0x3b,0x7d,0x13, +0x2e,0x14,0x2a,0x7a,0x6d,0x0, 0x9, 0xb3,0x2a,0x79,0x12,0x82,0x2a,0xa, 0x3b,0x7d, +0x13,0x2e,0x14,0x2b,0x21,0x6d,0x0, 0x9, 0xb3,0x2b,0x20,0x12,0x82,0x2a,0xa, 0x1b, +0x2e,0x14,0x2a,0x7c,0x12,0x82,0x37,0xe5,0x25,0x12,0x82,0x2e,0xa, 0x1b,0x2e,0x14, +0x2b,0x23,0x12,0x82,0x37,0xe5,0x24,0x2, 0x21,0x16,0x7e,0x34,0x0, 0x2, 0x12,0x21, +0x16,0x90,0x60,0x50,0xe4,0x93,0x22,0x6d,0x0, 0x90,0x60,0x91,0xe4,0x93,0xa, 0x3b, +0x1b,0x35,0x22,0x6c,0xaa,0x6c,0x99,0x80,0xc, 0xa, 0xf9,0x9, 0xbf,0x2a,0x7a,0xbc, +0xba,0x68,0x7, 0xb, 0x90,0x12,0x82,0x6f,0x38,0xef,0x12,0x82,0x6f,0x68,0x7, 0xb, +0xa0,0xbe,0xa0,0x23,0x40,0xdf,0x7a,0xb, 0xa0,0x74,0x6e,0x7a,0x1b,0xb0,0x22,0x90, +0x60,0x50,0xe4,0x93,0xbc,0xb9,0x22,0x7e,0x8, 0x0, 0x25,0x7e,0x18,0x0, 0x24,0x22, +0x12,0x82,0xac,0x12,0x83,0x2b,0x75,0xcd,0x0, 0xa9,0xd6,0xeb,0xa9,0xd7,0xcd,0xc2, +0xce,0x12,0x82,0x77,0x12,0x4e,0xc6,0x74,0x1, 0x12,0x82,0xe4,0xa9,0xc6,0xeb,0xa9, +0xc7,0xcd,0xd2,0xce,0xe5,0x25,0x7e,0x71,0x24,0x2, 0x4f,0x84,0x74,0x81,0x7a,0xb3, +0x3b,0x52,0x22,0x80,0x1d,0x12,0x82,0xac,0x12,0x83,0x34,0x68,0x5, 0xc2,0x1, 0x12, +0x4f,0xae,0x7e,0xb3,0x34,0x3a,0xbe,0xb0,0x2, 0x68,0x18,0x20,0x1a,0x15,0xe4,0x12, +0x82,0xe4,0x20,0x93,0xe0,0x12,0x82,0xac,0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x74,0x2, +0x2, 0x82,0xe4,0x22,0x7c,0xab,0x7e,0xb3,0x3b,0x52,0xb4,0x81,0x38,0x4c,0xaa,0x78, +0x5, 0xa9,0xd0,0x87,0x80,0x29,0xbe,0xa0,0x1, 0x78,0xf, 0xc2,0xaf,0xa9,0xd0,0xce, +0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x15,0xbe,0xa0,0x2, 0x78,0x16,0xc2, +0xaf,0x20,0x93,0x9, 0xa9,0xd0,0xce,0xa9,0xd7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x3b,0x52,0x22,0x12,0x83,0x34,0x68,0xfb, +0x20,0x93,0xfd,0x22,0x7e,0xb3,0x34,0x3a,0xbe,0xb0,0x1, 0x22,0x74,0xc8,0x7a,0xb3, +0x3b,0x56,0xc2,0x1a,0x80,0xa, 0x12,0x82,0xb3,0x30,0x1a,0x4, 0x75,0xe9,0xff,0x22, +0x12,0x83,0x34,0x68,0xf1,0x22,0xd2,0x0, 0x80,0x12,0x30,0x0, 0xc, 0x12,0x83,0x34, +0x68,0x7, 0xc2,0x0, 0xc2,0x1, 0x12,0x4f,0xae,0x12,0x82,0xb3,0x30,0x1a,0xeb,0x22, +0x74,0x1, 0x12,0x83,0x8f,0x20,0x1a,0x6, 0x12,0x83,0x56,0x12,0x4f,0xc7,0x7e,0xb3, +0x34,0x3a,0xb4,0x1, 0x6, 0x12,0x83,0x3c,0x12,0x4f,0xc7,0xe4,0x2, 0x83,0x8f,0xbe, +0xb0,0x8, 0x50,0x3, 0x12,0x83,0xc8,0x22,0x30,0x1b,0x5, 0xc2,0x1, 0x12,0x4f,0xae, +0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x30,0x1a,0x3, 0x20,0x1b,0x14,0x12,0x82,0xac,0xa9, +0xd0,0xce,0xa9,0xc4,0xc9,0x74,0x2, 0x12,0x82,0xe4,0xa9,0xd0,0xce,0xa9,0xd4,0xc9, +0xa9,0xc1,0xcd,0xd2,0x1, 0x2, 0x4f,0xae,0xa, 0x5b,0x2e,0x54,0x0, 0x8, 0xf5,0xcc, +0x22,0xca,0xf8,0x7e,0x73,0x2a,0x78,0xa, 0x47,0x7e,0x73,0x2a,0x71,0xa, 0x57,0x2d, +0x54,0x7e,0xa3,0x2a,0x73,0xbc,0xab,0x28,0x2, 0x7c,0xba,0x7e,0xf3,0x2a,0x72,0x7e, +0xa3,0x2a,0x74,0xbc,0xaf,0x28,0x2, 0x7c,0xfa,0x75,0x25,0x12,0x7e,0x8, 0x2a,0xb9, +0x7e,0x18,0x2a,0x7a,0x12,0xd, 0xd9,0x75,0x25,0x12,0x7e,0x8, 0x2a,0xdc,0x7e,0x18, +0x2a,0x9d,0x7c,0xbf,0x12,0xf, 0x9c,0xda,0xf8,0x22,0x2, 0x23,0xd1,0x7f,0x60,0x7e, +0xa3,0x2a,0x6d,0x7e,0xb3,0x2a,0x6e,0xa4,0x7d,0xf5,0x3e,0xf4,0x7f,0x1, 0x7d,0x3f, +0xe4,0x12,0x21,0x16,0x7f,0x6, 0x7d,0x3f,0x12,0x21,0x16,0x7a,0xb3,0x16,0x91,0x22, +0x7f,0x70,0x7e,0x33,0x2a,0x74,0xa, 0x43,0x7e,0x33,0x2a,0x73,0xa, 0x53,0x2d,0x54, +0x3e,0x54,0x7c,0xab,0xe4,0x7a,0xb3,0x16,0x90,0x7f,0x1, 0xa, 0x3a,0x12,0x21,0x16, +0x7f,0x7, 0xa, 0x3a,0x2, 0x21,0x16,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x51,0x7f, +0x40,0x7f,0x15,0x12,0x84,0x40,0x12,0x85,0xc8,0x7e,0xe0,0x1, 0x12,0x57,0xbb,0x30, +0x1b,0xfd,0x74,0x2, 0x12,0x0, 0x1e,0x7f,0x4, 0x12,0x85,0xd8,0x74,0x2, 0x12,0x0, +0x1e,0x6c,0xdd,0x80,0x18,0x74,0x2, 0xac,0xbd,0x7f,0x14,0x2d,0x35,0xb, 0x1a,0x20, +0x74,0x2, 0xac,0xbd,0x7f,0x5, 0x2d,0x15,0x12,0x85,0xcf,0xb, 0xd0,0x7e,0x73,0x2a, +0x74,0xa, 0x7, 0x7e,0x63,0x2a,0x73,0xa, 0x16,0x2d,0x10,0xa, 0x2d,0xbd,0x21,0x48, +0xd4,0x1b,0xe0,0x78,0xb7,0x7f,0x5, 0x7c,0xbf,0x2e,0x73,0x2a,0x73,0x12,0x85,0x36, +0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x2b,0x2, 0x70,0x41,0x12,0x2f,0xe8,0x50,0xfb, +0xe4,0x6c,0x77,0x6c,0x66,0x12,0x85,0x1d,0x7e,0x8, 0x6, 0xfc,0x7e,0x1f,0x6, 0xf4, +0x7e,0xb3,0x2b,0x72,0x12,0x84,0x67,0x74,0x1, 0x7e,0x70,0x1, 0x7e,0x60,0x1, 0x12, +0x85,0x1d,0x7e,0x8, 0x7, 0x7a,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x25,0xf0,0x12,0x84, +0x67,0x74,0x2, 0x7a,0xb3,0x2b,0x2, 0xe4,0x7a,0xb3,0x16,0x90,0x22,0x7c,0x96,0x7c, +0xa7,0x12,0x45,0x6e,0x7c,0xba,0x12,0x13,0xfc,0x74,0xa, 0x12,0x4f,0x4a,0x7c,0xb9, +0x12,0x0, 0x1e,0x2, 0x56,0xee,0xca,0xd8,0xca,0x79,0x7c,0xf7,0x7f,0x70,0x12,0xbf, +0x62,0x7c,0xeb,0x6c,0xdd,0x80,0x20,0x74,0x2, 0xac,0xbd,0x7f,0x67,0x2d,0xd5,0xb, +0x6a,0x30,0x6d,0x22,0x74,0x4, 0x2f,0x11,0x14,0x78,0xfb,0xa, 0x1e,0x6d,0x0, 0x12, +0x1f,0x3c,0x1b,0x6a,0x30,0xb, 0xd0,0xbc,0xfd,0x38,0xdc,0xda,0x79,0xda,0xd8,0x22, +0xca,0x79,0x7f,0x51,0x7f,0x40,0x7e,0xa3,0x2a,0x74,0xa, 0x3a,0x7e,0xa3,0x2a,0x73, +0xa, 0x7a,0x2d,0x73,0x7e,0xd, 0x2a,0x7c,0x7f,0x12,0x85,0x36,0xa, 0x3f,0x3e,0x34, +0xca,0x39,0x7e,0x1d,0x2a,0x7f,0x4, 0x12,0x20,0xf1,0x1b,0xfd,0x7e,0xb3,0x2b,0x1, +0xb4,0x1, 0x22,0x6c,0xaa,0x80,0x1a,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x5, 0x2d,0x13, +0xb, 0xa, 0x20,0x7f,0x4, 0x2d,0x13,0xb, 0xa, 0x30,0x9d,0x32,0x1b,0xa, 0x30,0xb, +0xa0,0xbc,0xfa,0x38,0xe2,0xda,0x79,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0x0, 0x2e,0xb, +0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a,0x74, +0x2, 0x10,0xee,0xca,0xd8,0xca,0x79,0x7e,0xf0,0xa, 0x74,0x1, 0x7a,0xb3,0x2a,0xfa, +0x12,0x29,0x95,0x7c,0xe7,0x80,0x62,0x12,0x26,0x86,0x12,0x57,0xaa,0x30,0x1b,0xfd, +0x12,0x87,0x83,0x12,0x85,0xd8,0x74,0x2, 0x12,0x0, 0x1e,0x6c,0xdd,0x80,0x3d,0x7e, +0x50,0x2, 0xac,0x5d,0x49,0x32,0x6, 0xfc,0xbe,0x34,0x14,0x78,0x50,0x14,0xa, 0x1d, +0x2e,0x17,0x2a,0xfe,0x7e,0x19,0xb0,0xbe,0xb0,0x0, 0x28,0x1e,0x14,0x7a,0x19,0xb0, +0x80,0x18,0xbe,0x34,0x19,0x28,0x28,0x10,0xa, 0x3d,0x12,0x46,0xc9,0xbe,0xb0,0xff, +0x68,0x8, 0x4, 0x7a,0x39,0xb0,0x80,0x2, 0x1b,0xe0,0xb, 0xd0,0x12,0x86,0xe8,0xa, +0x3d,0xbd,0x32,0x48,0xba,0x4c,0xee,0x68,0x8, 0x7c,0xaf,0x1b,0xf0,0x4c,0xaa,0x78, +0x96,0xda,0x79,0xda,0xd8,0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x24,0xf2,0x12,0x86, +0xf7,0x7e,0xa3,0x2a,0x73,0x7e,0x73,0x2a,0x74,0x6c,0xee,0x80,0x1d,0xa, 0x2e,0x9, +0x62,0x2a,0xdc,0xa, 0x26,0x12,0x87,0x76,0x7c,0x6b,0xbe,0x60,0x1c,0x50,0x9, 0xa, +0x2e,0x12,0x86,0xde,0x19,0xb2,0x24,0xf2,0xb, 0xe0,0xbc,0x7e,0x38,0xdf,0x6c,0xee, +0x80,0x1a,0xa, 0x2e,0x9, 0x62,0x2a,0xb9,0xbe,0x60,0x23,0x50,0xd, 0xa, 0x1e,0xa, +0x27,0x2d,0x21,0x12,0x86,0xde,0x19,0xb2,0x25,0xe, 0xb, 0xe0,0xbc,0xae,0x38,0xe2, +0x6c,0xee,0x7e,0x30,0xe, 0xac,0x3e,0x2e,0x14,0x24,0xf2,0x6d,0x0, 0x7c,0xbf,0x7c, +0x7e,0x12,0x11,0xba,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x27, +0x2a,0xfe,0x7e,0x29,0xb0,0xa, 0x26,0x22,0x7e,0x73,0x2a,0x74,0xa, 0x37,0x7e,0x53, +0x2a,0x73,0xa, 0x25,0x2d,0x23,0x22,0x7e,0x34,0x0, 0x46,0x74,0x3f,0x2, 0x21,0x16, +0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x86,0xf7,0x7e,0xa3,0x2a,0x73,0x7e, +0x63,0x2a,0x74,0x6c,0xee,0x80,0x1e,0xa, 0x2e,0x9, 0x72,0x2a,0xdc,0xbe,0x70,0x1c, +0x50,0x11,0xa, 0x27,0x12,0x87,0x76,0x7c,0x7b,0x7e,0xb3,0x2a,0xfb,0xa, 0x27,0x19, +0xb2,0x1f,0x34,0xb, 0xe0,0xbc,0x6e,0x38,0xde,0x6c,0xee,0x80,0x17,0xa, 0x3e,0x9, +0x73,0x2a,0xb9,0xbe,0x70,0x23,0x50,0xa, 0x7e,0x63,0x2a,0xfb,0xa, 0x27,0x19,0x62, +0x1f,0x50,0xb, 0xe0,0xbc,0xae,0x38,0xe5,0x6c,0xee,0x7e,0x30,0xe, 0xac,0x3e,0x2e, +0x14,0x1f,0x34,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xf8,0xb, 0xe0,0xbe,0xe0, +0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x24,0x20,0xab,0x7a,0x51,0x82,0x7a,0x41,0x83, +0xe4,0x93,0x22,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0x8, 0x6, 0xfc,0x22,0xb4,0xeb,0x5, +0xe4,0x7a,0xb3,0x3a,0x3a,0x7e,0x73,0x3a,0x3a,0xa, 0x27,0x2e,0x24,0x0, 0x6, 0x12, +0x87,0x7a,0x7c,0xab,0x7c,0xb7,0x4, 0x7a,0xb3,0x3a,0x3a,0xb4,0x3, 0xb, 0xe4,0x7a, +0xb3,0x3a,0x3a,0x6d,0x33,0x7a,0x37,0x3a,0x37,0x75,0x1b,0xeb,0x7c,0xba,0x22,0x7e, +0xa3,0x2f,0xa8,0x7e,0x70,0x4, 0xac,0x7a,0xb, 0x34,0xbe,0x37,0x3a,0x35,0x40,0x39, +0x7e,0x37,0x3a,0x35,0xb, 0x34,0x7a,0x37,0x3a,0x35,0xbe,0x34,0x0, 0x1, 0x78,0x5, +0x7e,0xb3,0x39,0x7c,0x22,0xbe,0x34,0x0, 0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34, +0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25,0x9, 0xb2,0x3b,0x4b,0x22,0x9e,0x34,0x0, +0x3, 0x2e,0x37,0x2b,0xb9,0x7e,0x39,0xb0,0x22,0x74,0xff,0x22,0x7e,0xa3,0x39,0xe3, +0x7c,0xba,0x4, 0x7a,0xb3,0x39,0xe3,0x7a,0xa3,0x39,0x3a,0x22,0xca,0x7b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0x83,0xc0,0x82,0x12,0x42,0x60,0xd0,0x82,0xd0,0x83,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x7b,0x32,0xa9,0xc0,0x93,0x75,0x19,0x0, 0x32,0x7a, +0xb3,0x39,0xe4,0xc4,0x54,0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, +0x80,0x7, 0x60,0x3, 0xb4,0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x39,0x50,0x22,0x74,0x1, +0x7a,0xb3,0x39,0x50,0xe4,0x7a,0xb3,0x39,0xe4,0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb, +0x0, 0x7, 0x7c,0xba,0x12,0x88,0x3f,0x80,0x2c,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb, +0xec,0x9, 0x7c,0xb3,0x7c,0x7a,0x12,0x88,0xd9,0x80,0x1a,0xbe,0x30,0x80,0x40,0x15, +0xbe,0x30,0xdf,0x38,0x10,0x7c,0xb3,0x24,0x80,0x7c,0x7a,0x12,0x88,0xb5,0xa5,0xbb, +0x8f,0x3, 0x75,0x1a,0x1, 0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x4e,0xf5,0x74,0x1, +0x7a,0xb3,0x34,0x4f,0x22,0x7c,0x6b,0x2e,0x60,0xdd,0x68,0x1c,0x2e,0x60,0xfd,0x68, +0x17,0x1b,0x61,0x68,0x13,0x2e,0x60,0xfa,0x68,0xe, 0x1b,0x60,0x68,0xa, 0x80,0x0, +0xa, 0x2b,0x19,0x72,0x39,0x29,0xd2,0x11,0x22,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec, +0x33,0x7e,0x27,0x3a,0x37,0x4d,0x22,0x78,0xe, 0xa5,0xbf,0xaa,0xa, 0x7e,0x24,0x0, +0x1, 0x7a,0x27,0x3a,0x37,0x15,0x1b,0x7e,0x27,0x3a,0x37,0xbe,0x24,0x0, 0x1, 0x78, +0x10,0xa5,0xbf,0x9, 0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x2, 0x6d,0x33,0x7a,0x37,0x3a, +0x37,0x75,0x1b,0xea,0x22,0x7c,0xab,0x4c,0xaa,0x78,0x5, 0x7e,0xb3,0x39,0xe4,0x22, +0xbe,0xa0,0x3, 0x38,0x23,0x75,0x1e,0x0, 0x30,0xb, 0x6, 0x7e,0x18,0x33,0x21,0x80, +0x4, 0x7e,0x18,0x33,0x5f,0x7a,0x1d,0x14,0x30,0xa, 0x2b,0xbe,0xa0,0x2, 0x78,0x26, +0xe5,0x18,0x70,0x22,0x5, 0x18,0x80,0x1e,0xbe,0xa0,0x5e,0x38,0x26,0x75,0x1e,0x0, +0x30,0xa, 0x13,0xbe,0xa0,0x21,0x78,0x7, 0xe5,0x18,0xb4,0x1, 0x2, 0x5, 0x18,0xe5, +0x18,0xb4,0x2, 0x2, 0xc2,0xa, 0xa, 0x1a,0x7e,0x1d,0x14,0x2d,0x31,0x1b,0x34,0x7e, +0x1b,0xb0,0x22,0xbe,0xa0,0xd3,0x68,0x5, 0xbe,0xa0,0xd4,0x78,0x12,0xbe,0xa0,0xd3, +0x78,0x8, 0x6d,0x33,0x7a,0x37,0x3a,0x35,0x80,0x2, 0x15,0x1b,0x2, 0x87,0xbf,0xbe, +0xa0,0xeb,0x68,0x5, 0xbe,0xa0,0xec,0x78,0x5, 0x7c,0xba,0x2, 0x87,0x8d,0xbe,0xa0, +0x80,0x40,0xc, 0xbe,0xa0,0xdf,0x38,0x7, 0xa, 0x3a,0x9, 0xb3,0x38,0xa9,0x22,0xbe, +0xa0,0xfc,0x78,0x5, 0x7e,0xb3,0x39,0x50,0x22,0xbe,0xa0,0xfd,0x78,0x17,0x6c,0xaa, +0x7e,0xb3,0x28,0xa8,0x60,0x3, 0x4e,0xa0,0x1, 0x7e,0xb3,0x38,0x3f,0x60,0x3, 0x4e, +0xa0,0x2, 0x7c,0xba,0x22,0xbe,0xa0,0xfe,0x78,0x5, 0x7e,0xb3,0x2b,0xf, 0x22,0x74, +0xff,0x22,0x7c,0xab,0x12,0x47,0x10,0x7c,0xba,0x12,0x13,0xfc,0x2, 0x0, 0x1e,0x30, +0x1b,0x8, 0x74,0x5, 0x7e,0x70,0x99,0x12,0x13,0x61,0x7e,0xb3,0x34,0x3a,0xb4,0x1, +0x47,0x12,0x8a,0x49,0x49,0x35,0x34,0x3b,0x49,0x15,0x34,0x3d,0x6d,0x0, 0xbe,0x8, +0x0, 0x0, 0x68,0x12,0xbe,0x70,0x0, 0x40,0xd, 0xbe,0x70,0x2, 0x38,0x8, 0x74,0x2, +0x12,0x0, 0x1e,0x12,0x85,0xd8,0x7e,0xb3,0x34,0x39,0x4, 0x7a,0xb3,0x34,0x39,0x12, +0x8a,0x51,0x28,0xe, 0x12,0x56,0xa2,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x6, 0x74,0x3, +0x80,0x2, 0x74,0x2, 0x7a,0xb3,0x34,0x3a,0x22,0x7e,0xa3,0x34,0x39,0x74,0x4, 0xa4, +0x22,0x7e,0x73,0x34,0x38,0xbe,0x73,0x34,0x39,0x22,0x7d,0xf3,0x6d,0xee,0x6c,0x99, +0x80,0x3c,0x7c,0xb9,0x12,0x3e,0x8c,0x7d,0xd3,0x7d,0xcd,0x3e,0xc4,0x7f,0x57,0x2d, +0xbc,0xb, 0x5a,0x10,0x1a,0x2, 0x1a,0x0, 0x7e,0x83,0x2b,0x20,0xa, 0x98,0x6d,0x88, +0x7f,0x10,0x7f,0x4, 0x12,0x1f,0x20,0x74,0x6, 0x7f,0x1, 0x1e,0x14,0x1e,0x4, 0x50, +0x3, 0x4e,0x20,0x80,0x14,0x78,0xf4,0x7d,0xc1,0x1b,0x5a,0xc0,0xb, 0x90,0x7e,0x83, +0x2a,0x75,0xbc,0x89,0x38,0xbc,0x22,0x7f,0x20,0xb, 0x2a,0x10,0xb, 0x1a,0x0, 0x1b, +0x2a,0x0, 0x1b,0x1a,0x10,0x22,0x7e,0x34,0x39,0x29,0x30,0x11,0x4b,0xc2,0x11,0x9, +0x53,0x0, 0x2, 0x12,0x8b,0x9, 0x7a,0x27,0x2a,0x4f,0x9, 0x53,0x0, 0x3, 0x12,0x8b, +0x9, 0x7a,0x27,0x2a,0x51,0x9, 0x53,0x0, 0x4, 0x12,0x8b,0x9, 0x7a,0x27,0x2a,0x53, +0x7e,0x39,0x50,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a,0x27,0x2a,0x5a,0x9, 0x53,0x0, +0x1, 0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a,0x27,0x2a,0x5c,0x9, 0x73,0x0, 0x5, 0xa, +0x37,0x12,0x4f,0x41,0x7a,0x37,0x2a,0x62,0x22,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x22,0x7c,0x67,0x7c,0x7b,0xa5,0xbf,0x0, 0x17,0xbe,0x60,0x0, 0x28, +0xf, 0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0xe4,0x7a,0xb3,0x2a,0x9, 0x7a,0xb3,0x2a,0xa, +0x2, 0x8b,0x83,0xa5,0xbe,0x0, 0x1d,0x6c,0xaa,0x80,0xe, 0x7e,0x60,0xff,0x7e,0x50, +0x9, 0xac,0x5a,0x19,0x62,0x29,0x66,0xb, 0xa0,0x12,0x72,0x27,0x38,0xed,0x74,0x1, +0x7a,0xb3,0x2a,0x6, 0x6c,0xaa,0x80,0x26,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28, +0xae,0xb, 0x18,0x20,0x12,0x8b,0xb, 0x1b,0x18,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e, +0x14,0x28,0xb0,0xb, 0x18,0x20,0x12,0x8b,0xb, 0x1b,0x18,0x20,0xb, 0xa0,0xbc,0x7a, +0x38,0xd6,0x22,0x12,0x8b,0x9c,0x7e,0x8, 0x30,0x28,0xe4,0x12,0x21,0x16,0x90,0x60, +0x99,0x12,0x8b,0xa0,0x7e,0x8, 0x30,0x5, 0xe4,0x2, 0x21,0x16,0x90,0x60,0x99,0xe4, +0x93,0x7c,0x7b,0x74,0x2, 0xac,0x7b,0x22,0xca,0x79,0x7e,0xf3,0x2a,0x2, 0x7e,0xe3, +0x2a,0x3, 0x7c,0xbf,0x7c,0x7e,0x12,0x8b,0x14,0x7c,0xbf,0x12,0x9f,0xc8,0x4c,0xee, +0x78,0x17,0x12,0x8f,0x3c,0xca,0x59,0x7e,0x18,0x28,0xae,0x7e,0x8, 0x29,0x62,0x12, +0x20,0xf1,0x1b,0xfd,0x12,0x8b,0xfa,0x80,0xe, 0x7e,0xb3,0x2a,0x9, 0x70,0x8, 0x12, +0x8b,0xfa,0x7c,0xbf,0x12,0x8c,0x47,0x7c,0xbf,0x12,0x75,0x5, 0xbe,0xf0,0x0, 0x28, +0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0xda,0x79,0x22,0x7e,0xa3,0x2a,0x2, 0x6c,0x77, +0x80,0x34,0x7e,0x90,0x9, 0xac,0x97,0x9, 0x64,0x29,0x66,0xa, 0x26,0x9, 0xb2,0x29, +0xbc,0x70,0x21,0x7e,0x30,0x1, 0x7e,0x50,0x9, 0xac,0x56,0x19,0x32,0x2f,0xad,0x49, +0x14,0x28,0xae,0x59,0x12,0x2f,0xae,0x49,0x14,0x28,0xb0,0x59,0x12,0x2f,0xb0,0xe4, +0x19,0xb2,0x2f,0xb2,0xb, 0x70,0xbc,0xa7,0x38,0xc8,0x22,0x7e,0xb3,0x39,0x79,0x70, +0x3, 0x12,0x8c,0xcb,0x2, 0x8b,0xa8,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x80,0x6d,0x6c, +0xdd,0x80,0x16,0x74,0x9, 0xac,0xbd,0x9, 0x65,0x29,0x66,0x74,0x9, 0xac,0xbe,0x9, +0x75,0x28,0xb2,0xbc,0x67,0x68,0x7, 0xb, 0xd0,0x12,0x8c,0xc3,0x38,0xe5,0x12,0x8c, +0xc3,0x28,0x4d,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29,0x66,0x12,0x8f,0x1d,0x74,0x9, +0xac,0xbd,0x12,0x8f,0x47,0x9d,0x32,0x12,0x21,0x48,0x2d,0x31,0x7a,0x35,0x24,0xa, +0x3c,0x9, 0xb3,0x29,0xbc,0xb4,0x1, 0xe, 0x6d,0x33,0x74,0x2, 0xac,0xbc,0x59,0x35, +0x30,0x5, 0x59,0x35,0x30,0x28,0x7e,0x35,0x24,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12, +0xa2,0x8, 0x7a,0x35,0x24,0x7c,0xbd,0x12,0x8e,0x84,0xb, 0xe0,0xbc,0xfe,0x38,0x8f, +0xda,0x3b,0x22,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbd,0x22,0xca,0x3b,0x6d,0x11,0x7e, +0xe3,0x2a,0x2, 0x4c,0xee,0x78,0x23,0x6c,0xff,0x80,0x1a,0x74,0x2, 0xac,0xbf,0x12, +0x8e,0x73,0x7e,0x70,0x9, 0xac,0x7f,0x19,0xa3,0x31,0x59,0x74,0x2, 0xa, 0x3f,0x19, +0xb3,0x31,0xc3,0xb, 0xf0,0x12,0x74,0xc1,0x38,0xe1,0x12,0x99,0x60,0x7e,0x24,0x0, +0x14,0xad,0x32,0x7d,0x43,0x2e,0x44,0x3, 0x20,0x6c,0xff,0xc1,0x4c,0x74,0x9, 0xac, +0xbf,0x9, 0xd5,0x28,0xb2,0x5e,0xd0,0xf, 0x12,0x8c,0xc3,0x38,0x2, 0xc1,0x4a,0xa, +0x1d,0x9, 0xb1,0x29,0xbc,0xbe,0xb0,0x1, 0x78,0x2, 0xc1,0x30,0x75,0x24,0x0, 0xc1, +0x22,0x7e,0xa1,0x24,0x74,0x9, 0xa4,0x9, 0xc5,0x31,0x59,0xbc,0xcd,0x68,0x2, 0xc1, +0x20,0x49,0x25,0x31,0x57,0x74,0x9, 0xac,0xbf,0x49,0x35,0x28,0xb0,0x9d,0x32,0x12, +0x21,0x48,0x7d,0x3, 0x7e,0xa1,0x24,0x74,0x9, 0xa4,0x49,0x25,0x31,0x55,0x12,0x8f, +0xbc,0x9d,0x32,0x12,0x21,0x48,0x2d,0x3, 0xa, 0x1c,0x9, 0xa1,0x31,0xc3,0xbe,0xa0, +0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3c,0x59,0x1, 0x31,0xaf,0xa, 0x1c,0x2e,0x14, +0x31,0xc3,0x7c,0xba,0x14,0x7a,0x19,0xb0,0xc1,0x4a,0x74,0x2, 0xac,0xbc,0x49,0x15, +0x31,0xaf,0xbe,0x14,0x0, 0x32,0x28,0x8, 0x7d,0x31,0x2d,0x34,0xbd,0x30,0x40,0x20, +0xbe,0x14,0x0, 0x32,0x28,0x8, 0xbe,0x4, 0x0, 0x32,0x28,0x2, 0x80,0x6c,0x7d,0x31, +0x2e,0x34,0x0, 0x32,0xbd,0x30,0x50,0x8, 0xbe,0x14,0x0, 0x32,0x28,0x2, 0x80,0x5a, +0xbe,0x4, 0x0, 0xa0,0x28,0x50,0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0x70,0x4, 0x74,0x3, +0x80,0x2, 0x74,0x1, 0xa, 0x1d,0x19,0xb1,0x29,0xbc,0x74,0x3, 0xa, 0x1c,0x19,0xb1, +0x29,0xc6,0xbe,0xe0,0x0, 0x28,0x63,0x1b,0xe0,0x12,0x8f,0xcd,0x7e,0x14,0x1f,0x34, +0x74,0x9, 0x12,0x1f,0xc1,0x7e,0x70,0x9, 0xac,0x7e,0x12,0x8f,0xc5,0xac,0x3f,0x12, +0x8e,0x7b,0x7e,0x34,0x1f,0x34,0x7e,0x30,0x9, 0xac,0x3e,0x12,0x8e,0x7b,0x1b,0xf0, +0x74,0x2, 0xac,0xbc,0x80,0x4, 0x74,0x2, 0xac,0xbc,0x59,0x5, 0x31,0xaf,0x80,0x2a, +0x5, 0x24,0x90,0x60,0x99,0xe4,0x93,0xbe,0xb1,0x24,0x28,0x2, 0xa1,0x31,0x80,0x1a, +0x6d,0x11,0x74,0x2, 0xac,0xbd,0x12,0x8e,0x73,0x7e,0x30,0x9, 0xac,0x3d,0x19,0xa1, +0x31,0x59,0x74,0x2, 0xa, 0x1d,0x19,0xb1,0x31,0xc3,0xb, 0xf0,0xbc,0xef,0x28,0x2, +0xa1,0xd, 0xe4,0x7a,0xb3,0x16,0x92,0x90,0x60,0x99,0x12,0x8f,0x40,0xca,0x59,0x7e, +0x18,0x28,0xae,0x7e,0x8, 0x31,0x55,0x12,0x20,0xf1,0x1b,0xfd,0x7a,0xe3,0x2a,0x2, +0xda,0x3b,0x22,0x59,0x15,0x31,0xaf,0x7e,0xa0,0xff,0x22,0x2e,0x14,0x28,0xae,0x74, +0x9, 0x2, 0x1f,0xc1,0x2, 0x8e,0x87,0xca,0xd8,0xca,0x79,0x7c,0xd4,0x7c,0xe5,0x7c, +0xfb,0x7c,0xbd,0x12,0xa1,0x7f,0x7d,0xf3,0x7c,0xbe,0x7c,0x7d,0x12,0xa3,0x18,0x7d, +0x3, 0x74,0x9, 0xac,0xbf,0x12,0x8f,0x47,0x12,0x8f,0x29,0x12,0x8f,0x31,0x7d,0x13, +0x5d,0x10,0x7e,0x70,0x9, 0xac,0x7f,0x49,0xe3,0x29,0x62,0x74,0x9, 0xac,0xbe,0x49, +0x25,0x28,0xae,0xbd,0x2e,0x28,0xf, 0x7d,0x53,0x2e,0x54,0x29,0x62,0x7d,0x2e,0x2d, +0x21,0x1b,0x58,0x20,0x80,0x9, 0x2e,0x34,0x29,0x62,0x9d,0xe1,0x1b,0x38,0xe0,0x74, +0x9, 0xac,0xbf,0x12,0x8f,0x1d,0x12,0x8f,0x31,0x7d,0x13,0x5d,0x10,0x7e,0x50,0x9, +0xac,0x5f,0x49,0x32,0x29,0x64,0x74,0x9, 0xac,0xbe,0x49,0x5, 0x28,0xb0,0xbd,0x3, +0x28,0xd, 0x7d,0x2, 0x2e,0x4, 0x29,0x64,0x2d,0x13,0x1b,0x8, 0x10,0x80,0x9, 0x2e, +0x24,0x29,0x64,0x9d,0x31,0x1b,0x28,0x30,0xda,0x79,0xda,0xd8,0x22,0x49,0x25,0x29, +0x64,0x74,0x9, 0xac,0xbe,0x49,0x35,0x28,0xb0,0x9d,0x32,0x12,0x21,0x48,0x7d,0x13, +0x22,0x7d,0x3f,0xad,0x31,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x22,0x90,0x60,0x99,0xe4, +0x93,0x7c,0xab,0x74,0x9, 0xa4,0x22,0x49,0x25,0x29,0x62,0x74,0x9, 0xac,0xbe,0x49, +0x35,0x28,0xae,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x4c,0xaa,0x78,0x11,0x7e,0xb3, +0x2a,0x3, 0xbe,0xb0,0x0, 0x28,0x13,0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0x80,0xb, 0xbe, +0xa0,0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0x12,0x8f,0x3c,0xca,0x59,0x7e, +0x18,0x28,0xae,0x7e,0x8, 0x29,0x8, 0x12,0x20,0xf1,0x1b,0xfd,0x90,0x61,0x35,0xe4, +0x93,0xbe,0xb0,0x0, 0x28,0x23,0x6c,0xff,0x80,0x1a,0x12,0x8f,0xbc,0x12,0x90,0x19, +0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0x8, 0x49,0x35,0x28,0xb0,0x12,0x5a,0xb5,0x12, +0x77,0x88,0xb, 0xf0,0x12,0x74,0xc1,0x38,0xe1,0xda,0xf8,0x22,0x74,0x9, 0xac,0xbf, +0x49,0x35,0x28,0xae,0x22,0x2e,0x34,0x28,0xae,0x7e,0x30,0x9, 0x22,0x7e,0x70,0x9, +0xac,0x7f,0x2e,0x34,0x28,0xae,0x22,0x7c,0x9b,0x7f,0x71,0x7e,0x7b,0x80,0x4c,0x88, +0x78,0x7, 0x7e,0xb, 0x90,0x7a,0x7b,0x90,0x22,0xa, 0x28,0x7e,0xb, 0x80,0xa, 0x38, +0x9d,0x32,0x12,0x21,0x48,0xe5,0x2a,0xa, 0x2b,0xbd,0x32,0x8, 0x15,0x7e,0x7b,0xa0, +0x7e,0xb, 0xb0,0xbc,0xba,0x7c,0xba,0x28,0x4, 0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a, +0x7b,0xb0,0x7e,0x7b,0x70,0x7a,0xb, 0x70,0x22,0x7d,0xc3,0x7e,0x34,0x61,0x37,0x12, +0x91,0x1c,0x90,0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3c,0x22,0x90,0x61,0x36,0xe4, +0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x2a,0x70,0x80,0x4, 0x7e,0x83,0x2a,0x6f,0x12,0x92, +0xb4,0xbe,0xc4,0x0, 0x3f,0x38,0x21,0x7e,0xe4,0x0, 0x3f,0x9d,0xec,0x7e,0x34,0x61, +0x3b,0x12,0x5f,0x20,0x12,0x91,0xf, 0x7f,0x71,0x12,0x90,0xfe,0xbf,0x71,0x40,0x2, +0x7f,0x71,0x9f,0x17,0x7f,0x71,0x1, 0xfb,0x12,0x5c,0x8f,0xbd,0x5c,0x38,0x26,0x7d, +0xec,0x9d,0xe5,0x7e,0x34,0x61,0x3d,0x12,0x5f,0x20,0x12,0x91,0xf, 0x7f,0x71,0x90, +0x61,0x3a,0xe4,0x93,0xa, 0x3b,0xbf,0x71,0x40,0x4, 0x7f,0x71,0x1b,0x7c,0x12,0x91, +0x6, 0x2f,0x71,0x80,0x66,0x7d,0xb4,0xb, 0xb4,0x1e,0xb4,0x7d,0x5b,0x1b,0x54,0xbd, +0x5c,0x40,0xc, 0x7d,0xf5,0x9d,0xfc,0x6d,0xee,0x7e,0x34,0x61,0x3f,0x80,0xa, 0x7d, +0xfc,0x9d,0xfb,0x6d,0xee,0x7e,0x34,0x61,0x41,0x12,0x7f,0xbc,0x7f,0x17,0x12,0x1f, +0x31,0x7f,0x71,0x12,0x8f,0x35,0x7f,0x71,0xbd,0x5c,0x7d,0x3d,0x40,0xc, 0x1e,0x34, +0x1b,0x34,0x6d,0x22,0x9f,0x17,0x7f,0x71,0x80,0x6, 0x1e,0x34,0x6d,0x22,0x2f,0x71, +0x12,0x90,0xfe,0x6d,0x22,0xbf,0x71,0x50,0x4, 0x7f,0x71,0x80,0xe, 0x90,0x61,0x3a, +0xe4,0x93,0x12,0x91,0x6, 0xbf,0x71,0x28,0x2, 0x7f,0x71,0x7d,0x3f,0x22,0x90,0x61, +0x39,0xe4,0x93,0xa, 0x3b,0x22,0xa, 0x2b,0x7d,0x3d,0x9d,0x32,0x6d,0x22,0x22,0xad, +0xfe,0x6d,0xee,0x7d,0x3f,0x7d,0x2e,0x7c,0x76,0x7c,0x65,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0xd0,0x22,0xca,0x3b,0x7f,0x70,0x7c,0xe7,0x7c,0xdb,0x7e,0xc0,0x4, 0x7e, +0xb3,0x2a,0x6d,0xf5,0x28,0x7e,0xb3,0x2a,0x6e,0xf5,0x27,0x7e,0x34,0x62,0xa, 0x12, +0x91,0x1c,0x6c,0xff,0x12,0x92,0xbc,0x7f,0x51,0xe5,0x28,0xa, 0x3b,0x1b,0x34,0xa, +0xcd,0xbd,0xc3,0x58,0x14,0xe5,0x27,0xa, 0x3b,0x1b,0x34,0xa, 0xce,0xbd,0xc3,0x58, +0x8, 0x4c,0xee,0x68,0x4, 0x4c,0xdd,0x78,0x3, 0x4e,0xf0,0x10,0xb, 0x5a,0x30,0x7e, +0x14,0x62,0xa, 0x12,0x5f,0xec,0xbd,0x32,0x8, 0xc, 0x7e,0x27,0x28,0x8a,0xbe,0x24, +0x3, 0x20,0x8, 0x2, 0x41,0x7d,0xb, 0xa, 0xc0,0x1e,0xc4,0xbd,0x3c,0x8, 0xc, 0x7e, +0xc7,0x28,0x8a,0xbe,0xc4,0x3, 0x20,0x58,0x2, 0x41,0x7d,0x6c,0xaa,0x7c,0x8d,0x80, +0x1e,0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x13,0x7e,0xb3,0x2a,0x6d,0xbc,0xb8,0x8, 0xb, +0x12,0x2f,0x2b,0xbd,0x3d,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x80,0x1a, +0x2c,0x1a,0x3d,0x9d,0x32,0x1a,0xc8,0xbd,0xc3,0x18,0xd6,0xbc,0xca,0x18,0x5, 0x4e, +0xf0,0x1, 0x41,0x7d,0x6c,0xaa,0x7c,0x8d,0x80,0x1e,0x7c,0x9e,0xbe,0x80,0x0, 0x48, +0x13,0x7e,0xb3,0x2a,0x6d,0xbc,0xb8,0x8, 0xb, 0x12,0x2f,0x2b,0xbd,0x3d,0x58,0x14, +0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x80,0x1a,0x2c,0x1a,0x3d,0x2d,0x32,0x1a,0xc8, +0xbd,0xc3,0x48,0xd6,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x2, 0x80,0x70,0x6c,0xaa,0x7c, +0x9e,0x80,0x1e,0x7c,0x8d,0xbe,0x90,0x0, 0x48,0x13,0x7e,0xb3,0x2a,0x6e,0xbc,0xb9, +0x8, 0xb, 0x12,0x2f,0x2b,0xbd,0x3d,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b, +0x90,0x1a,0x2c,0x1a,0x3e,0x9d,0x32,0x1a,0xc9,0xbd,0xc3,0x18,0xd6,0xbc,0xca,0x18, +0x5, 0x4e,0xf0,0x4, 0x80,0x37,0x6c,0xaa,0x7c,0x9e,0x80,0x1e,0x7c,0x8d,0xbe,0x90, +0x0, 0x48,0x13,0x7e,0xb3,0x2a,0x6e,0xbc,0xb9,0x8, 0xb, 0x12,0x2f,0x2b,0xbd,0x3d, +0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x90,0x1a,0x2c,0x1a,0x3e,0x2d,0x32, +0x1a,0xc9,0xbd,0xc3,0x48,0xd6,0xbc,0xca,0x18,0x3, 0x4e,0xf0,0x8, 0x4c,0xff,0x68, +0x2e,0x7e,0x7b,0xb0,0xbc,0xbd,0x40,0x3, 0x7a,0x7b,0xd0,0x29,0xb7,0x0, 0x2, 0xbc, +0xbd,0x38,0x4, 0x39,0xd7,0x0, 0x2, 0x29,0xb7,0x0, 0x1, 0xbc,0xbe,0x40,0x4, 0x39, +0xe7,0x0, 0x1, 0x29,0xb7,0x0, 0x3, 0xbc,0xbe,0x38,0x4, 0x39,0xe7,0x0, 0x3, 0x7c, +0xbf,0xda,0x3b,0x22,0x7e,0x90,0x40,0xac,0x89,0x1b,0x44,0x22,0x7c,0xbd,0x7c,0x7e, +0x7e,0x13,0x2a,0x6e,0xac,0x1b,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x37,0x2d,0x10,0x7e, +0x1f,0x13,0x8a,0x2d,0x31,0x22,0xca,0x3b,0x12,0x67,0xe4,0x74,0x9, 0xac,0xbf,0x7d, +0xd5,0x2e,0xd4,0x27,0x76,0x6d,0xcc,0x7e,0x37,0x2a,0x66,0x7a,0x35,0x43,0xe4,0x39, +0xb6,0x0, 0x6, 0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x26,0xfa,0xf5,0x31,0x9, 0xb3, +0x26,0xfb,0xf5,0x32,0x7e,0x73,0x2a,0x6e,0x7c,0x6d,0x7e,0x8, 0x0, 0x35,0x12,0x95, +0x30,0xf5,0x33,0xe5,0x31,0x7e,0x73,0x2a,0x6d,0x7c,0x6c,0x7e,0x8, 0x0, 0x34,0x12, +0x95,0x30,0x7c,0xab,0xe5,0x34,0x7e,0x71,0x35,0x12,0x92,0xc0,0x7a,0x35,0x3f,0x7e, +0x34,0x15,0x9e,0x7a,0x35,0x41,0x85,0x34,0x39,0x85,0x35,0x3a,0x7a,0xa1,0x3b,0x85, +0x33,0x3c,0x7e,0xb3,0x2a,0x59,0xf5,0x3d,0x75,0x3e,0x0, 0x7e,0x8, 0x0, 0x39,0x12, +0x95,0x83,0x7d,0x23,0x6d,0x33,0x7e,0x97,0x15,0xa0,0x6d,0x88,0x2f,0x41,0x7e,0x37, +0x15,0xa2,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa4,0x2f,0x10,0x7a,0x1d, +0x2b,0x7e,0x37,0x15,0xa6,0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x15,0xa8,0x6d,0xaa,0x2f, +0x51,0x7f,0x74,0xa, 0x4c,0xe5,0x31,0xa, 0x5b,0x9d,0x54,0xf5,0x2f,0x81,0x77,0xa, +0x4d,0xe5,0x32,0xa, 0x5b,0x9d,0x54,0xf5,0x30,0x81,0x61,0xe5,0x2f,0xbe,0xb0,0x0, +0x58,0x2, 0x81,0x5f,0x7e,0x73,0x2a,0x6d,0xbe,0x71,0x2f,0x18,0x2, 0x81,0x5f,0xe5, +0x30,0xbe,0xb0,0x0, 0x58,0x2, 0x81,0x5f,0x7e,0x73,0x2a,0x6e,0xbe,0x71,0x30,0x18, +0x2, 0x81,0x5f,0xe5,0x2f,0x7e,0x71,0x30,0x12,0x2c,0x63,0x7e,0x53,0x2a,0x59,0xa, +0x25,0x9d,0x32,0x7a,0x35,0x37,0xbe,0x34,0x0, 0x0, 0x18,0x2, 0x81,0x5f,0x7e,0x35, +0x43,0xbe,0x35,0x37,0x18,0xd, 0x7f,0x16,0x2e,0x34,0x0, 0x6, 0x7e,0x1b,0xb0,0x4, +0x7a,0x1b,0xb0,0xe5,0x31,0xa, 0x2b,0xe5,0x2f,0x12,0x95,0x15,0x18,0xb, 0xe5,0x32, +0xa, 0x2b,0xe5,0x30,0x12,0x95,0x15,0x8, 0x56,0xe5,0x2f,0x7e,0x71,0x30,0x7c,0x6e, +0x12,0x96,0x2f,0xf5,0x36,0xb4,0x2, 0xc, 0x7e,0x35,0x37,0x7d,0x23,0xe, 0x24,0x9d, +0x32,0x7a,0x35,0x37,0xe5,0x36,0xbe,0xb0,0x2, 0x68,0x5, 0xe5,0x36,0xb4,0x1, 0x2f, +0x7e,0x45,0x37,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x2f,0x12,0x95,0x6, 0x7f,0x1, +0x7e,0x1d,0x2b,0x9f,0x10,0x7a,0x1d,0x2b,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x30, +0x12,0x95,0x6, 0x9f,0x51,0x12,0x95,0xd, 0x9f,0x41,0x12,0x95,0xd, 0x9f,0x71,0x5, +0x30,0xa, 0x2d,0xe5,0x32,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x30,0x1a,0x3b,0xbd, +0x32,0x18,0x2, 0x61,0x9b,0x5, 0x2f,0xa, 0x2c,0xe5,0x31,0xa, 0x3b,0x2d,0x32,0x1a, +0x27,0xe5,0x2f,0x1a,0x3b,0xbd,0x32,0x18,0x2, 0x61,0x8f,0xbe,0x48,0x0, 0x0, 0x78, +0x2, 0xb, 0x4c,0xbe,0x78,0x0, 0x0, 0x78,0x2, 0xb, 0x7c,0x7e,0x1d,0x2b,0x7f,0x4, +0x12,0x95,0x21,0x1b,0x6a,0x30,0x7f,0x15,0x7f,0x7, 0x12,0x95,0x21,0x79,0x36,0x0, +0x2, 0x7e,0xb3,0x2a,0x65,0x60,0xd, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0xbe,0x78,0x0, 0x7f,0x28,0x4, 0x7e,0x78,0x0, 0x7f,0x7d,0x3f, +0x39,0x76,0x0, 0x5, 0x74,0x9, 0xac,0xbe,0x9, 0x75,0x27,0x7c,0x39,0x76,0x0, 0x6, +0xbe,0x70,0xf, 0x28,0x6, 0x74,0xf, 0x39,0xb6,0x0, 0x6, 0x7e,0xa1,0x31,0x7e,0x70, +0x9, 0xac,0x7f,0x19,0xa3,0x27,0x7d,0x7e,0xa1,0x32,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x27,0x7e,0xda,0x3b,0x22,0x1a,0x1b,0x1a,0x2, 0x2, 0x1f,0x20,0x7e,0x35,0x37, +0x1a,0x26,0x1a,0x24,0x22,0x1a,0x3b,0x9d,0x32,0x12,0x21,0x48,0xbe,0x34,0x0, 0x1, +0x22,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x1f,0x3c,0x2e,0x18,0x0, 0x20,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,0x12,0xc, 0x29,0x7e,0x37,0x15,0x9e,0x22,0x7e,0xa3,0x28,0x84,0xe4, +0x7a,0xb3,0x30,0x1b,0x6c,0x33,0x80,0x3d,0x7e,0x70,0x2, 0xac,0x73,0x9, 0x23,0x26, +0xfb,0x7e,0x10,0x1, 0x6c,0x0, 0x80,0x27,0xbc,0x3, 0x68,0x21,0x7e,0x70,0x2, 0xac, +0x70,0x9, 0x93,0x26,0xfb,0xa, 0x29,0xa, 0x32,0x12,0x95,0x17,0x18,0x2, 0xb, 0x10, +0xbe,0x10,0x2, 0x40,0x8, 0x74,0x2, 0x7a,0xb3,0x30,0x1b,0x80,0x6, 0xb, 0x0, 0xbc, +0xa0,0x38,0xd5,0xb, 0x30,0xbc,0xa3,0x38,0xbf,0x22,0xca,0xf8,0x7e,0xf3,0x2a,0x70, +0x7a,0x37,0x1f,0x3a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3c,0xe4,0x7a,0xb3,0x1f, +0x34,0x7a,0xb3,0x1f,0x35,0x7e,0x73,0x2a,0x6f,0x7a,0x73,0x1f,0x36,0x7a,0xf3,0x1f, +0x37,0x7a,0xb3,0x1f,0x38,0x7a,0xb3,0x1f,0x39,0x7e,0x8, 0x1f,0x34,0x12,0x95,0x83, +0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa0,0x2f,0x10,0x7e,0x33,0x1f,0x36, +0x6d,0x0, 0x12,0x1f,0x3c,0xa, 0x1f,0x6d,0x0, 0x12,0x1f,0x3c,0xda,0xf8,0x22,0x7c, +0xa6,0x7c,0x37,0x7c,0x2b,0xe4,0x6c,0x11,0x80,0x46,0xbc,0xa1,0x68,0x40,0x1a,0x41, +0x3e,0x44,0x9, 0x4, 0x26,0xfb,0xa, 0x20,0xa, 0x33,0x9d,0x32,0x12,0x21,0x48,0x7c, +0x7, 0x1a,0x41,0x3e,0x44,0x9, 0x74,0x26,0xfa,0xa, 0x27,0xa, 0x32,0x9d,0x32,0x12, +0x21,0x48,0x7c,0x97,0xbe,0x90,0x1, 0x18,0x8, 0xbe,0x0, 0x1, 0x18,0x3, 0x74,0x1, +0x22,0xbe,0x90,0x2, 0x18,0x8, 0xbe,0x0, 0x2, 0x18,0x3, 0x74,0x2, 0x22,0xb, 0x10, +0x7e,0x83,0x28,0x84,0xbc,0x81,0x18,0xb2,0x22,0x2, 0x96,0x8c,0xca,0x79,0x6c,0xff, +0x7e,0xd7,0x2a,0x5a,0x6c,0xee,0x80,0x35,0x7c,0xbe,0x12,0x38,0x82,0xbd,0x3d,0x48, +0x2a,0x7c,0xbe,0x12,0x2d,0xb6,0x60,0x23,0x7e,0xc4,0x0, 0x9, 0xca,0xc9,0x7e,0x70, +0x9, 0xac,0x7e,0x2e,0x34,0x27,0x76,0x6d,0x22,0x7e,0x30,0x9, 0xac,0x3f,0x2e,0x14, +0x28,0xae,0x6d,0x0, 0x12,0x20,0xf1,0x1b,0xfd,0xb, 0xf0,0xb, 0xe0,0x12,0x3f,0xb2, +0x38,0xc6,0x7a,0x73,0x28,0x93,0x7a,0xf3,0x2a,0x2, 0xda,0x79,0x22,0x7d,0x13,0x7d, +0x32,0x6d,0x22,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x12,0x1f,0x3a,0x7d, +0x53,0xbe,0x54,0x0, 0xff,0x28,0x4, 0x7e,0x54,0x0, 0x40,0x22,0x7a,0x37,0x1f,0x38, +0x7e,0x34,0x15,0xa8,0x7a,0x37,0x1f,0x3c,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3a, +0x7e,0x73,0x2a,0x6f,0x7a,0x73,0x1f,0x35,0x7e,0x73,0x2a,0x70,0x7a,0x73,0x1f,0x34, +0x7e,0x37,0x2a,0x5c,0x7a,0x37,0x1f,0x3e,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x40, +0x7e,0x37,0x2a,0x60,0x7a,0x37,0x1f,0x42,0x74,0x1, 0x7a,0xb3,0x1f,0x36,0x7a,0xb3, +0x1f,0x37,0x7e,0x8, 0x1f,0x34,0x7e,0x18,0x1f,0x44,0x12,0x8, 0x0, 0x7e,0x37,0x1f, +0x4e,0x7e,0x27,0x1f,0x4a,0xbd,0x23,0x28,0x2, 0x7d,0x32,0x22,0x7e,0x34,0x61,0x59, +0x2, 0x23,0xc9,0x7e,0xb3,0x39,0x4e,0x70,0x2e,0x7e,0x73,0x39,0x31,0xbe,0x70,0x10, +0x40,0x2, 0x6c,0x77,0x7e,0xb3,0x39,0x79,0xb4,0x1, 0x3, 0x7e,0x70,0x6, 0xa, 0x37, +0x2e,0x34,0xf, 0xf0,0x12,0x97,0xb6,0x7c,0xab,0xe5,0x5d,0xa, 0x3b,0x2e,0x37,0x3a, +0xcb,0x7a,0x37,0x3a,0xcb,0x80,0xc, 0x7e,0xa3,0x39,0x32,0xbe,0xa0,0x7f,0x28,0x3, +0x7e,0xa0,0x7f,0x7c,0xba,0x2, 0x97,0xa8,0x75,0x5d,0x0, 0x7a,0xb3,0x3b,0x56,0xc2, +0x1a,0x22,0x2e,0x34,0x20,0xab,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e, +0xb3,0x3a,0xce,0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x7a,0xb3,0x3a,0xce,0x22,0x7f, +0x20,0xc2,0x1, 0x7e,0x2b,0x60,0x29,0x72,0x0, 0x2, 0x9c,0x76,0x1a,0x37,0x12,0x21, +0x48,0x7c,0x27,0x29,0x72,0x0, 0x1, 0x29,0x32,0x0, 0x3, 0x9c,0x37,0x1a,0x33,0x12, +0x21,0x48,0x7c,0x37,0x1a,0x23,0x1a,0x32,0x9d,0x32,0x12,0x21,0x48,0x7c,0x67,0x7c, +0x72,0xbc,0x32,0x58,0x2, 0x7c,0x73,0xbe,0x60,0x5, 0x18,0x5, 0xbe,0x70,0x6, 0x58, +0x8, 0x7e,0x37,0x3a,0x3b,0x4d,0x33,0x68,0x2, 0xd2,0x1, 0xa2,0x1, 0x22,0x7f,0x60, +0x7e,0x6b,0xa0,0xbe,0xa0,0xa, 0x50,0x1b,0x7e,0x14,0x0, 0x6, 0xca,0x19,0x74,0x6, +0xa4,0x7f,0x6, 0x2d,0x15,0xb, 0x14,0x12,0x20,0xf1,0x1b,0xfd,0x7e,0x6b,0xb0,0x4, +0x7a,0x6b,0xb0,0x22,0x6c,0xaa,0x7e,0x63,0x2a,0x6e,0x7e,0x73,0x2a,0x6d,0xac,0x76, +0x7d,0x13,0x1e,0x14,0x7e,0x27,0x28,0x88,0x2e,0x27,0x28,0x86,0xbd,0x21,0x38,0xa, +0x1e,0x34,0x1e,0x34,0xbe,0x37,0x28,0x86,0x50,0x29,0x90,0x60,0x51,0xe4,0x93,0x1e, +0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf7,0xa, 0x3b,0xbd,0x32,0x8, 0x16,0x90,0x60,0x50, +0xe4,0x93,0x1e,0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf6,0xa, 0x3b,0xbd,0x32,0x8, 0x3, +0x7e,0xa0,0x1, 0x7c,0xba,0x22,0x7f,0x61,0x7f,0x50,0x7e,0x6b,0x90,0x80,0x1f,0x29, +0x86,0x0, 0x1, 0x80,0xf, 0x7f,0x5, 0x7c,0xb9,0x7c,0x78,0x12,0x35,0x48,0x50,0x2, +0xd3,0x22,0xb, 0x80,0x29,0x76,0x0, 0x3, 0xbc,0x78,0x50,0xe9,0xb, 0x90,0x29,0x76, +0x0, 0x2, 0xbc,0x79,0x50,0xd9,0xc3,0x22,0x7e,0xa3,0x2a,0x3, 0xbe,0xa0,0x0, 0x38, +0x2f,0xbe,0xa3,0x2a,0x2, 0x50,0x19,0x7e,0xb3,0x2a,0xc, 0xbe,0xb3,0x31,0xce,0x28, +0x14,0x7e,0xb3,0x31,0xce,0x4, 0x7a,0xb3,0x31,0xce,0x7a,0xa3,0x2a,0x2, 0x80,0x5, +0xe4,0x7a,0xb3,0x31,0xce,0x7e,0xb3,0x2a,0x2, 0x70,0x5, 0xe4,0x7a,0xb3,0x2a,0xb, +0x22,0x12,0x99,0x7, 0x2, 0x98,0xc8,0x7e,0xb3,0x2a,0x2, 0x70,0x29,0x12,0x67,0xdc, +0x28,0x24,0x7e,0xb3,0x30,0x3c,0x70,0x18,0x12,0x99,0x40,0x7e,0x73,0x2a,0x3, 0x7a, +0x73,0x2a,0x2, 0x74,0x1, 0x7a,0xb3,0x2a,0x9, 0x7e,0xb3,0x30,0x3c,0x4, 0x80,0x1, +0xe4,0x7a,0xb3,0x30,0x3c,0x22,0xe4,0x7a,0xb3,0x30,0x3c,0x7a,0xb3,0x2a,0x9, 0x22, +0x7e,0x34,0x0, 0x3c,0xca,0x39,0x7e,0x18,0x38,0xb1,0x7e,0x8, 0x38,0xed,0x12,0x20, +0xf1,0x1b,0xfd,0x7e,0x73,0x28,0x94,0x7a,0x73,0x38,0xb0,0x7a,0x73,0x28,0x93,0x22, +0x7e,0x73,0x2a,0x3, 0xbe,0x73,0x2a,0x2, 0x78,0x17,0x7e,0x73,0x2a,0x2, 0xbe,0x70, +0x1, 0x40,0xe, 0x7e,0x37,0x30,0x19,0xbe,0x34,0x0, 0x14,0x38,0xe, 0xb, 0x34,0x80, +0x6, 0x7e,0x37,0x30,0x19,0x1e,0x34,0x7a,0x37,0x30,0x19,0x7e,0xb3,0x2a,0x2, 0x70, +0x6, 0x6d,0x33,0x7a,0x37,0x30,0x19,0x7e,0x37,0x30,0x19,0x22,0x12,0x99,0xcd,0x2, +0x99,0xa2,0x7e,0xb3,0x2a,0x9, 0x70,0x24,0x7e,0xa3,0x30,0x1b,0x4c,0xaa,0x78,0x3, +0xe4,0x80,0x7, 0xbe,0xa0,0x2, 0x78,0x6, 0x74,0x3, 0x7a,0xb3,0x30,0x26,0x7e,0x73, +0x30,0x27,0xbe,0x73,0x30,0x26,0x28,0x4, 0x7a,0x73,0x30,0x26,0x22,0xca,0x69,0xca, +0xf8,0x7e,0xa3,0x2a,0x2, 0x7e,0x8, 0x29,0xbc,0x4c,0xaa,0x78,0x5, 0x12,0x5f,0x93, +0x41,0xe1,0x6c,0x99,0x41,0xd6,0x7e,0x70,0x9, 0xac,0x79,0x9, 0x83,0x29,0xc, 0xbe, +0x80,0xff,0x78,0x2, 0x41,0xd4,0xa, 0x28,0x7f,0x70,0x2d,0xf2,0x7e,0x7b,0xf0,0xbe, +0xf0,0x2, 0x68,0x2, 0x41,0xb7,0x12,0x9a,0xf0,0x49,0x33,0x29,0x8, 0x12,0x9a,0xfa, +0x7e,0x70,0x4, 0xac,0x78,0x49,0x23,0x31,0xd1,0x12,0x9a,0xe6,0x9d,0x32,0x12,0x21, +0x48,0x7d,0xe3,0x7e,0x73,0x2f,0xa9,0xa, 0x27,0xbd,0x2f,0x28,0x54,0xbd,0x2e,0x28, +0x50,0x12,0x9a,0xf0,0x7e,0xd0,0x9, 0xac,0xd9,0x59,0x26,0x29,0x8, 0x7e,0x50,0x4, +0xac,0x58,0x49,0x22,0x31,0xd1,0x7e,0xd0,0x9, 0xac,0xd9,0x59,0x26,0x29,0xa, 0xbe, +0xa0,0x0, 0x28,0x2, 0x1b,0xa0,0x4c,0xaa,0x78,0x7a,0x7e,0xb3,0x30,0x4, 0x4, 0x7a, +0xb3,0x30,0x4, 0x7e,0x63,0x30,0x4, 0xbe,0x60,0x32,0x40,0x68,0xe4,0x7a,0xb3,0x30, +0x4, 0x7e,0xb3,0x2f,0xa9,0xbe,0xb0,0x2, 0x50,0x5a,0x4, 0x7a,0xb3,0x2f,0xa9,0x80, +0x53,0x7e,0x50,0x9, 0xac,0x59,0x49,0xd2,0x29,0x8, 0x7e,0xd0,0x4, 0xac,0xd8,0x59, +0xd6,0x31,0xcf,0x49,0x22,0x29,0xa, 0x59,0x26,0x31,0xd1,0xbe,0x70,0x3, 0x40,0x4, +0x74,0x2, 0x80,0x8, 0xbe,0x70,0x1, 0x28,0x7, 0x7c,0xb7,0x14,0x7a,0xb3,0x2f,0xa9, +0xe4,0x7a,0xb3,0x30,0x4, 0x80,0x1d,0x4c,0xff,0x78,0x19,0x7e,0x70,0x9, 0xac,0x79, +0x49,0x33,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x58,0x59,0x32,0x31,0xcf,0x12,0x9a,0xe6, +0x59,0x32,0x31,0xd1,0xb, 0x90,0x90,0x60,0x99,0xe4,0x93,0xbc,0xb9,0x28,0x2, 0x21, +0xe6,0xda,0xf8,0xda,0x69,0x22,0x7e,0x70,0x9, 0xac,0x79,0x49,0x33,0x29,0xa, 0x22, +0x7e,0x50,0x4, 0xac,0x58,0x49,0x22,0x31,0xcf,0x22,0x9d,0x32,0x12,0x21,0x48,0x7d, +0xf3,0x22,0xca,0x3b,0x12,0x9f,0x3a,0x38,0x2, 0x61,0xc5,0x7e,0xc3,0x34,0x8b,0x4c, +0xcc,0x78,0x3d,0x7a,0xb3,0x34,0x8b,0xe4,0x7a,0xb3,0x34,0x8d,0x6c,0xaa,0x80,0x26, +0x12,0x9b,0xd0,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xd3,0x26,0xfa,0x9, 0xe3,0x26,0xfb, +0x7a,0x49,0xd0,0x19,0xe4,0x0, 0x1, 0x74,0x1, 0x19,0xb4,0x0, 0x8, 0x12,0x9b,0xda, +0x59,0x34,0x0, 0x2, 0xb, 0xa0,0x7e,0xb3,0x28,0x84,0xbc,0xba,0x38,0xd2,0x80,0x7b, +0x7c,0xfc,0x6c,0xaa,0x80,0x31,0x12,0x9b,0xd0,0x7e,0x49,0xd0,0x9, 0xe4,0x0, 0x1, +0x9, 0xb4,0x0, 0x8, 0x70,0x4, 0x1b,0xf0,0x80,0x1b,0x12,0x9b,0xda,0x7d,0x23,0x49, +0x34,0x0, 0x2, 0x12,0x9a,0xfa,0xbe,0xf4,0x0, 0x23,0x8, 0x9, 0x74,0x5, 0x19,0xb4, +0x0, 0x8, 0x75,0x5c,0x1, 0xb, 0xa0,0xbc,0xfa,0x38,0xcb,0x4c,0xff,0x78,0x2, 0x80, +0x26,0x7e,0x73,0x34,0x8d,0xbe,0x70,0x4, 0x40,0x22,0x6c,0xaa,0x80,0xe, 0x12,0x9b, +0xd0,0x9, 0xb4,0x0, 0x8, 0xbe,0xb0,0x5, 0x68,0x6, 0xb, 0xa0,0xbc,0xfa,0x38,0xee, +0xbc,0xfa,0x78,0x3, 0x75,0x5c,0x0, 0x12,0x9b,0xe1,0x80,0xf, 0x7c,0xb7,0x4, 0x7a, +0xb3,0x34,0x8d,0x80,0x6, 0x12,0x9b,0xe1,0x75,0x5c,0x0, 0xe5,0x5c,0xda,0x3b,0x22, +0x7e,0x90,0x9, 0xac,0x9a,0x2e,0x44,0x34,0x8e,0x22,0x7c,0xbd,0x7c,0x7e,0x2, 0x2c, +0x63,0xe4,0x7a,0xb3,0x34,0x8c,0x7a,0xb3,0x34,0x8b,0x7a,0xb3,0x34,0x8d,0x22,0x7e, +0x90,0x1, 0x7e,0x94,0x61,0xc0,0x7e,0x84,0x0, 0xff,0xb, 0x4a,0x30,0x7a,0x37,0x28, +0xa1,0x7e,0xb4,0x61,0xc2,0x7e,0xa4,0x0, 0xff,0xb, 0x5a,0x30,0x7a,0x37,0x28,0xa3, +0x12,0x9d,0xd6,0xb, 0x1a,0x20,0x7e,0x14,0x61,0x4f,0x7e,0x4, 0x0, 0xff,0xb, 0xa, +0xd0,0xe4,0x7a,0xb3,0x28,0xac,0x12,0x7f,0x3c,0x7e,0x34,0xff,0xfa,0xad,0x32,0x12, +0x9f,0x33,0x7d,0xc3,0xe, 0x34,0x7e,0x27,0x7, 0xfe,0xbd,0x2c,0x58,0x1c,0x7e,0xc7, +0x7, 0xfc,0xbd,0xc3,0x58,0x14,0x6d,0xcc,0x9e,0xc7,0x2a,0x5a,0xbe,0xc7,0x28,0x8e, +0x8, 0x8, 0x12,0xb2,0x8a,0x60,0x3, 0x12,0x9d,0xdf,0x12,0x9f,0x8a,0x40,0x5, 0xe4, +0x7a,0xb3,0x28,0xa8,0x12,0x9f,0x4a,0x68,0x6, 0x7e,0xb3,0x3b,0x5b,0x60,0x7, 0xe4, +0x7a,0xb3,0x28,0xad,0x80,0x6f,0x12,0x9d,0x55,0x28,0x5, 0xe4,0x7a,0xb3,0x28,0xad, +0x30,0x13,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0xa9,0x11,0x50,0xa, 0x12,0x7f,0x3c, +0x12,0x9d,0x6e,0x7c,0x9b,0x80,0x17,0x7e,0xb3,0x26,0x84,0x70,0x11,0x7e,0xb3,0x26, +0x85,0x70,0xb, 0x12,0x9d,0x55,0x28,0x6, 0x7e,0x90,0x3, 0x12,0x7f,0x3c,0x7e,0xc7, +0x7, 0xfa,0xbe,0xc4,0x5, 0xdc,0x8, 0x17,0x12,0x9d,0x55,0x28,0x12,0x6d,0xcc,0x9d, +0xcd,0xbe,0xc7,0x28,0x8e,0x58,0x8, 0x12,0x9d,0x60,0xe4,0x7a,0xb3,0x28,0xad,0xa, +0x29,0xb, 0x4a,0x30,0xad,0x32,0x7a,0x37,0x28,0xa1,0xa, 0x29,0xb, 0x5a,0x30,0xad, +0x32,0x7a,0x37,0x28,0xa3,0x12,0x9d,0x5d,0x50,0xd, 0xe4,0x7a,0xb3,0x28,0xad,0x12, +0x9f,0x42,0x28,0x3, 0x12,0x9d,0x60,0x7e,0xc7,0x28,0x8a,0xbd,0xcd,0x8, 0x1f,0x7e, +0x24,0x0, 0x2, 0x7d,0x3d,0x12,0x1e,0xee,0x6e,0x34,0xff,0xff,0xb, 0x34,0xbe,0x37, +0x28,0x8e,0x58,0xa, 0x12,0x9d,0x5d,0x50,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x9b, +0x2, 0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x9d,0xf3,0x7e,0xb3,0x34,0x88, +0xbe,0xb0,0x0, 0x28,0x1f,0x14,0x7a,0xb3,0x34,0x88,0x70,0x18,0xe4,0x7a,0xb3,0x28, +0xad,0x12,0x9d,0xeb,0x7a,0xb3,0x16,0x91,0x7a,0xb3,0x16,0x90,0x7a,0xb3,0x28,0x84, +0x7a,0xb3,0x26,0x83,0x22,0x7e,0x83,0x28,0x84,0xbe,0x80,0x0, 0x22,0xa2,0x16,0x22, +0xe4,0x7a,0xb3,0x34,0x88,0x7a,0xb3,0x28,0xac,0x74,0x2, 0x2, 0x2a,0x20,0x7e,0xa0, +0x1, 0x7e,0x47,0x7, 0xf8,0x12,0x9d,0xd6,0xb, 0x1a,0x0, 0x7e,0x34,0xff,0xfa,0xad, +0x30,0x7e,0x14,0x0, 0x2, 0x12,0x9d,0xce,0x8, 0x12,0x7e,0xb3,0x28,0xac,0x60,0x7, +0xe4,0x7a,0xb3,0x28,0xad,0x80,0x32,0x7e,0xa0,0x5, 0x80,0x2d,0x7e,0x34,0xff,0xfb, +0x12,0x9d,0xcc,0x8, 0x5, 0x7e,0xa0,0x4, 0x80,0x1f,0x7e,0x34,0xff,0xfc,0x12,0x9d, +0xcc,0x8, 0x5, 0x7e,0xa0,0x3, 0x80,0x11,0x7e,0x34,0xff,0xfd,0x12,0x9d,0xcc,0x8, +0x5, 0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0,0x1, 0x7c,0xba,0x22,0xad,0x30,0x7d,0x21, +0x12,0x1e,0xee,0xbd,0x34,0x22,0x7e,0x34,0x61,0x55,0x7e,0x24,0x0, 0xff,0x22,0x74, +0x2, 0x7a,0xb3,0x34,0x88,0x12,0x9d,0xeb,0x2, 0x2a,0x20,0x74,0x1, 0x7a,0xb3,0x28, +0xac,0xe4,0x22,0x7e,0x60,0x4, 0x7e,0x27,0x3b,0x54,0xbe,0x24,0x3, 0xe8,0x28,0x3, +0x7e,0x60,0x8, 0x7e,0xb3,0x28,0xac,0xb4,0x1, 0x1a,0x7e,0x73,0x34,0x89,0xbc,0x76, +0x50,0xf, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x9d,0x60,0x7e,0xb3,0x34,0x89,0x4, 0x80, +0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3,0x34,0x89,0x7e,0xb3,0x28,0xad,0xb4,0x1, 0x17, +0x7e,0xa3,0x34,0x8a,0xbe,0xa0,0x5, 0x50,0xa, 0xe4,0x7a,0xb3,0x28,0xad,0x7c,0xba, +0x4, 0x80,0x5, 0x74,0x5, 0x80,0x1, 0xe4,0x7a,0xb3,0x34,0x8a,0x22,0xca,0x3b,0x7e, +0xb3,0x2a,0x74,0xf5,0x27,0x12,0x9d,0x5d,0x50,0x2, 0xc1,0xdf,0x6d,0x33,0x9e,0x37, +0x2a,0x4f,0x3e,0x34,0xbe,0x37,0x7, 0xf8,0x18,0x75,0x7e,0xb3,0x16,0x92,0x70,0x6f, +0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x65,0x7e,0x77,0x2a,0x51,0x7e,0x67,0x2a,0x53,0x75, +0x24,0x0, 0x80,0x53,0xe5,0x24,0x12,0x2d,0xb6,0x60,0x4a,0x12,0x9e,0xe2,0x12,0x9f, +0x5a,0x7e,0xb3,0x2a,0x3, 0xb4,0x1, 0xe, 0x90,0x60,0xab,0xe4,0x93,0xbe,0xb1,0x26, +0x78,0x4, 0xe, 0x64,0xe, 0x74,0x7e,0xa1,0x26,0x74,0x2, 0xa4,0x49,0x35,0x4, 0xfc, +0xbd,0x36,0x48,0x14,0xe5,0x25,0xa, 0x2b,0xe5,0x27,0xa, 0x3b,0x2d,0x32,0x3e,0x34, +0x49,0x33,0x4, 0xfc,0xbd,0x37,0x58,0xd, 0xe5,0x24,0x6c,0x77,0x12,0x33,0x1f,0x12, +0x9e,0xe2,0x12,0x9f,0x67,0x5, 0x24,0x12,0x9f,0x52,0x38,0xa8,0x12,0x9e,0xea,0xda, +0x3b,0x22,0x7e,0x71,0x24,0x74,0x2, 0xac,0x7b,0x22,0x7e,0xa0,0x1, 0x7e,0x37,0x2a, +0x4f,0x12,0x9f,0x3a,0x28,0x35,0x6d,0x22,0x9d,0x23,0xbe,0x27,0x7, 0xf8,0x58,0x2b, +0x12,0x9f,0x33,0xbe,0x37,0x7, 0xfa,0x8, 0x22,0xe4,0x7a,0xb3,0x28,0x84,0x7e,0xb3, +0x2a,0x3, 0x70,0x17,0x7e,0xb3,0x39,0x50,0xb4,0x1, 0x10,0x6c,0xaa,0x5, 0x5b,0xe5, +0x5b,0xbe,0xb0,0x10,0x28,0x5, 0xd2,0x14,0x75,0x5b,0x0, 0x4c,0xaa,0x68,0x3, 0x75, +0x5b,0x0, 0x22,0x7e,0x24,0x0, 0x2, 0x2, 0x1e,0xee,0x7e,0xb3,0x28,0x84,0xbe,0xb0, +0x0, 0x22,0x7e,0x73,0x28,0x84,0xbe,0x70,0x0, 0x22,0x7e,0xb3,0x28,0xa8,0xbe,0xb0, +0x1, 0x22,0x7e,0x73,0x28,0x84,0xbe,0x71,0x24,0x22,0x9, 0xb3,0x26,0xfa,0xf5,0x25, +0x9, 0xb3,0x26,0xfb,0xf5,0x26,0x22,0x9, 0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x7c, +0x6b,0x7e,0xa3,0x37,0xb4,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x62,0x37,0xf1,0x19,0x72, +0x37,0xf2,0x7c,0xba,0x4, 0x7a,0xb3,0x37,0xb4,0x22,0xd2,0x0, 0x6c,0xaa,0x6c,0x77, +0x80,0x1f,0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xa, 0x27,0x2d,0x21,0x7c,0x65,0x7e,0x50, +0x2, 0xac,0x56,0x49,0x22,0x5, 0x7a,0xbe,0x24,0xfe,0xc, 0x58,0x2, 0xb, 0xa0,0xb, +0x70,0x7e,0xb3,0x2a,0x6d,0xbc,0xb7,0x38,0xd9,0xa, 0x2b,0x1e,0x24,0xa, 0x3a,0xbd, +0x32,0x8, 0x2, 0xc2,0x0, 0xa2,0x0, 0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x60, +0x99,0xe4,0x93,0x7c,0xfb,0x6c,0x11,0x80,0x21,0x7e,0x0, 0xff,0x74,0x9, 0xac,0xb1, +0x19,0x5, 0x1f,0x38,0x7e,0x34,0x7f,0xff,0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x34, +0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x36,0xb, 0x10,0xbc,0xf1,0x38,0xdb,0xe4,0x6c, +0x77,0x7c,0x6d,0x12,0xa1,0x21,0x7c,0x7d,0x7c,0x6f,0x12,0xa1,0x21,0x6c,0x0, 0x80, +0x39,0x6c,0xee,0x80,0x16,0x74,0x9, 0xac,0xbe,0x9, 0x65,0x1f,0x38,0x74,0x9, 0xac, +0xb0,0x9, 0x75,0x28,0xb2,0xbc,0x76,0x68,0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe6,0xbc, +0x1e,0x78,0x15,0x7e,0x70,0x9, 0xac,0x70,0x12,0x8f,0xc5,0xac,0x31,0x2e,0x14,0x1f, +0x34,0x74,0x9, 0x12,0x1f,0xc1,0xb, 0x10,0xb, 0x0, 0xbc,0xf0,0x38,0xc3,0x74,0x9, +0xac,0xbf,0xca,0x59,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x29,0x62,0x12,0x20,0xf1,0x1b, +0xfd,0xda,0x79,0xda,0xd8,0x22,0xca,0x3b,0x7c,0x46,0x7c,0xab,0x6c,0x66,0x21,0x9, +0x7c,0x57,0x21,0x1, 0x7e,0xf0,0x9, 0xac,0xf6,0x9, 0x87,0x29,0x66,0x7c,0x98,0x7e, +0xd0,0x9, 0xac,0xd5,0x9, 0xb6,0x28,0xb2,0xbc,0xb9,0x78,0x73,0xbe,0x90,0xff,0x68, +0x6e,0x12,0xa1,0x19,0x2d,0xf7,0x39,0x87,0x0, 0x4, 0xa, 0xf9,0x9, 0xbf,0x29,0xbc, +0x7e,0xf0,0x9, 0x70,0xc, 0xac,0xf5,0x7d,0x97,0x2e,0x94,0x28,0xae,0x6d,0x88,0x80, +0xa, 0xac,0xf6,0x7d,0x97,0x2e,0x94,0x29,0x62,0x6d,0x88,0xb, 0x4a,0xd0,0x12,0xa1, +0x19,0x2d,0xf7,0x1b,0x7a,0xd0,0x69,0xf4,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xfa,0x7f, +0x60,0x2d,0xd7,0x79,0xf6,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb3, +0x12,0xa1,0x19,0x2d,0xf7,0x39,0x87,0x0, 0x5, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87, +0x28,0xb4,0x12,0xa1,0x19,0x2d,0xf7,0x39,0x87,0x0, 0x6, 0xb, 0xa0,0x80,0x8, 0xb, +0x50,0xbc,0x45,0x28,0x2, 0x1, 0x74,0xb, 0x60,0x90,0x60,0x99,0xe4,0x93,0xbc,0xb6, +0x28,0x2, 0x1, 0x70,0x7c,0xba,0xda,0x3b,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x70, +0x22,0x7e,0x8, 0x1f,0x34,0x12,0xa0,0x66,0x7c,0x1b,0x22,0x7c,0xab,0x7e,0xb, 0xb0, +0x60,0x3, 0xb4,0x2, 0x31,0xa, 0x4a,0x9, 0x74,0x30,0x1c,0xbe,0x73,0x30,0x26,0x50, +0xe, 0x7d,0x24,0x2e,0x24,0x30,0x1c,0x7c,0xb7,0x4, 0x7a,0x29,0xb0,0xd3,0x22,0xbe, +0x73,0x30,0x26,0x40,0x9, 0xbe,0x70,0xff,0x68,0x4, 0xe4,0x7a,0xb, 0xb0,0x74,0xff, +0x19,0xb4,0x30,0x1c,0x80,0x17,0xa, 0x3a,0x9, 0xb3,0x30,0x1c,0xbe,0xb0,0xff,0x68, +0x7, 0xe4,0x19,0xb3,0x30,0x1c,0xd3,0x22,0xe4,0x19,0xb3,0x30,0x1c,0xc3,0x22,0xca, +0xf8,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x2a,0x62,0xbd,0x13,0x38,0x6, 0x7e,0x34,0x1, +0x0, 0x80,0x15,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x1f,0x3a,0xbe,0x34, +0x0, 0x8, 0x50,0x4, 0x7e,0x34,0x0, 0x8, 0x74,0x2, 0xac,0xbf,0x49,0x25,0x30,0x28, +0xbd,0x2f,0x28,0x6, 0x49,0x35,0x30,0x5, 0x80,0x4, 0x59,0x35,0x30,0x5, 0x59,0xf5, +0x30,0x28,0xbe,0x34,0x1, 0x0, 0x28,0x4, 0x7e,0x34,0x1, 0x0, 0xbe,0x34,0x0, 0x20, +0x50,0x15,0x7e,0x50,0x9, 0xac,0x5f,0x9, 0xb2,0x2f,0xb2,0xb4,0x1, 0x9, 0x7e,0x34, +0x1, 0x0, 0xe4,0x19,0xb2,0x2f,0xb2,0xbe,0x34,0x0, 0x40,0x28,0xc, 0x7e,0xa0,0x1, +0x7e,0x50,0x9, 0xac,0x5f,0x19,0xa2,0x2f,0xb2,0xda,0xf8,0x22,0x7e,0x8, 0x30,0x1b, +0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x21,0x16,0xca,0x3b,0x7c,0xab,0x7d,0x3, 0x7e,0x20, +0x10,0x7d,0x30,0x7e,0x90,0x9, 0xac,0x95,0x9, 0x34,0x28,0xb4,0xbe,0x30,0x10,0x28, +0x2, 0x7c,0x23,0xbe,0x20,0x18,0x28,0x3, 0x7e,0x20,0x18,0x49,0xe4,0x28,0xae,0xbe, +0xe4,0x6, 0x50,0x40,0x20,0x7e,0x33,0x2a,0x6f,0x12,0xa3,0x4, 0xbd,0xef,0x38,0x15, +0x49,0xe4,0x28,0xb0,0xbe,0xe4,0x6, 0x50,0x40,0xb, 0x7e,0x33,0x2a,0x70,0x12,0xa3, +0x4, 0xbd,0xef,0x28,0x3, 0x7e,0x20,0x8, 0x7e,0xf0,0x10,0xac,0xf2,0xbd,0x70,0x40, +0x5d,0x7e,0xf0,0x9, 0xac,0xf4,0x9, 0xb7,0x2f,0xb2,0x70,0x52,0x7e,0xd0,0x8, 0xac, +0xd2,0xbd,0x60,0x50,0x3c,0x9, 0xb7,0x2f,0xab,0x70,0x1f,0x9, 0xb7,0x2f,0xac,0xbe, +0xb0,0x0, 0x28,0xc, 0x7d,0x37,0x2e,0x34,0x2f,0xac,0x14,0x7a,0x39,0xb0,0x80,0x6, +0x74,0x1, 0x19,0xb7,0x2f,0xab,0x6d,0x33,0x80,0x34,0x9, 0xb7,0x2f,0xac,0xbe,0xb0, +0x14,0x50,0x2b,0x7d,0x37,0x2e,0x34,0x2f,0xac,0x4, 0x7a,0x39,0xb0,0x6d,0x33,0x80, +0x1d,0xe4,0x19,0xb7,0x2f,0xac,0x19,0xb7,0x2f,0xab,0x6d,0x33,0x80,0x10,0x6c,0x33, +0x7e,0xf0,0x9, 0xac,0xf4,0x19,0x37,0x2f,0xac,0xe4,0x19,0xb7,0x2f,0xab,0x7e,0x30, +0x8, 0xac,0x23,0xbd,0x10,0x40,0x2a,0x7e,0x70,0x9, 0xac,0x7a,0x49,0x33,0x29,0x62, +0x59,0x34,0x28,0xae,0x74,0x9, 0xa4,0x49,0x35,0x29,0x64,0x74,0x9, 0xac,0xb5,0x59, +0x35,0x28,0xb0,0x7e,0xa0,0x1, 0x7e,0x70,0x9, 0xac,0x74,0x19,0xa3,0x2f,0xaa,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,0x7c,0x17,0x7c,0xab,0x7e,0x14,0xff,0xfc, +0x7e,0x3, 0x2a,0x2, 0x7e,0x90,0x9, 0xac,0x91,0x9, 0xb4,0x2f,0xad,0xb4,0x1, 0x49, +0xa5,0xb8,0x1, 0xc, 0xbe,0x14,0xff,0x0, 0x28,0x10,0x7e,0x14,0xff,0x0, 0x80,0xa, +0xbe,0x14,0xff,0xe0,0x28,0x4, 0x7e,0x14,0xff,0xe0,0x49,0x34,0x2f,0xae,0x7e,0x50, +0x9, 0xac,0x5a,0x49,0x22,0x28,0xae,0x12,0xa4,0x31,0x8, 0x3, 0x12,0xa4,0x3b,0x7e, +0x70,0x9, 0xac,0x71,0x49,0x33,0x2f,0xb0,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x22,0x28, +0xb0,0x12,0xa4,0x31,0x8, 0x3, 0x12,0xa4,0x3b,0x7e,0x70,0x9, 0xac,0x7a,0x9, 0x3, +0x28,0xb4,0xbe,0x0, 0xc, 0x28,0xc, 0xbe,0x14,0xff,0x80,0x28,0x26,0x7e,0x14,0xff, +0x80,0x80,0x20,0xbe,0x0, 0x8, 0x28,0xc, 0xbe,0x14,0xff,0xe0,0x28,0x15,0x7e,0x14, +0xff,0xe0,0x80,0xf, 0xbe,0x0, 0x6, 0x28,0xa, 0xbe,0x14,0xff,0xf0,0x28,0x4, 0x7e, +0x14,0xff,0xf0,0x7e,0x50,0x9, 0xac,0x51,0x49,0x22,0x2f,0xae,0x49,0x33,0x28,0xae, +0x12,0xa4,0x27,0x18,0x16,0x74,0x9, 0xac,0x1b,0x49,0x20,0x2f,0xb0,0x7e,0x70,0x9, +0xac,0x7a,0x49,0x33,0x28,0xb0,0x12,0xa4,0x27,0x8, 0x4, 0x7e,0x14,0xff,0xfc,0x7e, +0x50,0x9, 0xac,0x5a,0x49,0x2, 0x28,0xae,0xbe,0x4, 0x6, 0x50,0x40,0x32,0x7e,0x63, +0x2a,0x6f,0x7e,0x70,0x40,0xac,0x67,0x9e,0x34,0x0, 0x65,0x12,0x4f,0x41,0xbd,0x3, +0x38,0x1e,0x49,0x32,0x28,0xb0,0xbe,0x34,0x6, 0x50,0x40,0x14,0x7e,0x3, 0x2a,0x70, +0x7e,0x10,0x40,0xac,0x1, 0x9e,0x4, 0x0, 0x65,0x12,0xa4,0x47,0xbd,0x30,0x28,0x4, +0x7e,0x14,0xff,0xff,0x7d,0x31,0x22,0x9d,0x32,0x12,0x21,0x48,0xbe,0x34,0x4, 0x0, +0x22,0x9d,0x32,0x12,0x21,0x48,0xbe,0x34,0x1, 0x0, 0x22,0x6c,0x0, 0x7e,0x70,0x9, +0xac,0x71,0x19,0x3, 0x2f,0xad,0x22,0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x22, +0xca,0x79,0x6c,0xff,0x80,0x3c,0x9f,0x77,0x6d,0x33,0x12,0xa4,0xd0,0x6c,0xee,0x80, +0x9, 0x7c,0xbf,0x7c,0x7e,0x12,0xa4,0xd9,0xb, 0xe0,0x7e,0x73,0x2a,0x6e,0xa, 0x17, +0x1b,0x14,0xa, 0x2e,0xbd,0x21,0x48,0xe9,0xa, 0x17,0x6d,0x0, 0x1b,0xc, 0x7f,0x17, +0x12,0x1f,0x8d,0x7f,0x71,0xbe,0x78,0x0, 0x0, 0x8, 0x5, 0x7d,0x3f,0x12,0xa4,0xd0, +0xb, 0xf0,0x7e,0x73,0x2a,0x6d,0xbc,0x7f,0x38,0xbc,0x6c,0xff,0x80,0x27,0x7c,0xbf, +0x12,0x38,0x82,0x7d,0x43,0x74,0x2, 0xac,0xbf,0x9, 0xa5,0x26,0xfa,0x74,0x2, 0xa4, +0x49,0x55,0x1f,0x34,0x2e,0x57,0x2a,0x5a,0xbd,0x54,0x8, 0x7, 0x7c,0xbf,0x6c,0x77, +0x12,0x33,0x1f,0xb, 0xf0,0x7e,0x73,0x28,0x84,0xbc,0x7f,0x38,0xd1,0xda,0x79,0x22, +0x74,0x2, 0xac,0xbf,0x59,0x35,0x1f,0x34,0x22,0x12,0x2c,0x63,0x1a,0x26,0x1a,0x24, +0x2f,0x71,0x22,0xca,0x79,0x7c,0xa7,0x7c,0x8b,0x7e,0xb3,0x2a,0x6f,0x7a,0xb3,0x1f, +0x9a,0x7e,0xb3,0x2a,0x70,0x7a,0xb3,0x1f,0x9b,0x7e,0x70,0x2, 0xac,0x78,0x9, 0x93, +0x26,0xfa,0x9, 0x83,0x26,0xfb,0x9f,0x77,0x1a,0x3a,0x1a,0x79,0x9d,0x73,0xa1,0x95, +0x7a,0xf1,0x58,0xbe,0xf0,0x0, 0x58,0xe, 0x1a,0x3f,0x1a,0x29,0x9d,0x23,0x1a,0x39, +0x2d,0x32,0x7c,0xb7,0xf5,0x58,0x7e,0xb3,0x1f,0x9a,0xbc,0xbf,0x18,0xe, 0x1a,0x39, +0x1a,0x2f,0x9d,0x23,0x1a,0x39,0x9d,0x32,0x7c,0xb7,0xf5,0x58,0x1a,0x2a,0x1a,0x38, +0x9d,0x32,0x7c,0xb7,0xf5,0x57,0x80,0x3d,0x85,0x57,0x59,0xe5,0x57,0xbe,0xb0,0x0, +0x58,0x10,0xe5,0x57,0x1a,0x3b,0x1a,0x28,0x9d,0x23,0x1a,0x38,0x2d,0x32,0x7c,0xb7, +0xf5,0x59,0x7e,0xb3,0x1f,0x9b,0xbe,0xb1,0x57,0x18,0x10,0x1a,0x38,0xe5,0x57,0x1a, +0x2b,0x9d,0x23,0x1a,0x38,0x9d,0x32,0x7c,0xb7,0xf5,0x59,0xe5,0x58,0x7e,0x71,0x59, +0x12,0xa4,0xd9,0x5, 0x57,0x1a,0x3a,0x1a,0x28,0x2d,0x23,0xe5,0x57,0x1a,0x3b,0xbd, +0x32,0x8, 0xb5,0xb, 0xf0,0x1a,0x3a,0x1a,0x29,0x2d,0x23,0x1a,0x3f,0xbd,0x32,0x18, +0x2, 0xa1,0x10,0x7f,0x17,0xda,0x79,0x22,0xca,0x3b,0x6d,0x44,0x7e,0xf3,0x28,0x84, +0x6c,0xee,0x80,0x24,0x7c,0xbe,0x12,0x2d,0xb6,0x60,0x1b,0x74,0x2, 0xac,0xbe,0x9, +0xd5,0x26,0xfa,0x9, 0xc5,0x26,0xfb,0x7c,0xbd,0x7c,0x7c,0x12,0x2c,0x63,0x7d,0xf3, +0xbd,0x4f,0x58,0x2, 0x7d,0x4f,0xb, 0xe0,0xbc,0xfe,0x38,0xd8,0x7d,0x34,0xda,0x3b, +0x22,0xe4,0x7a,0xb3,0x37,0xb4,0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x38,0x2d, +0x60,0x5, 0xe4,0x7a,0xb3,0x38,0x2f,0x22,0x6c,0x99,0x6c,0x88,0x80,0xf, 0x7c,0xb8, +0x12,0x38,0x82,0xbe,0x34,0x1, 0xf4,0x8, 0x2, 0xb, 0x90,0xb, 0x80,0x7e,0x73,0x28, +0x84,0xbc,0x78,0x38,0xe9,0xbe,0x90,0x1, 0x38,0x2, 0xc3,0x22,0xd3,0x22,0x7e,0x63, +0x2a,0x6e,0x90,0x60,0xa7,0xe4,0x93,0x60,0x6c,0xc2,0x15,0x6c,0x33,0x80,0x56,0x90, +0x60,0xaa,0xe4,0x93,0x70,0x13,0x7c,0x96,0xac,0x93,0x90,0x60,0xab,0xe4,0x93,0xa, +0x5b,0x1b,0x54,0x2d,0x45,0x7d,0xd4,0xb, 0xd4,0x7d,0x54,0x3e,0x54,0x7e,0x7f,0x13, +0x8a,0x2d,0xf5,0xb, 0x7a,0x50,0xbe,0x57,0x2a,0x5a,0x8, 0x27,0x7c,0xb3,0x12,0x3e, +0xd7,0x50,0x20,0x7d,0x5d,0x3e,0x54,0x7e,0x7f,0x13,0x8a,0x7f,0x57,0x2d,0xb5,0xb, +0x5a,0xc0,0x7d,0x54,0x3e,0x54,0x2d,0xf5,0xb, 0x7a,0x50,0xbd,0x5c,0x8, 0x4, 0xd2, +0x15,0x80,0xa, 0xb, 0x30,0x7e,0x73,0x2a,0x75,0xbc,0x73,0x38,0xa2,0x30,0x15,0x5, +0xd2,0x0, 0x2, 0x3e,0xf9,0x22,0x90,0x60,0xa7,0xe4,0x93,0x60,0x8, 0x30,0x15,0x5, +0x12,0x3e,0xa9,0xc2,0x15,0x22,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x0, +0x6c,0xdd,0x6d,0xdd,0x7e,0x34,0x23,0x11,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x1f,0x34, +0x74,0xc, 0x12,0x1f,0xe2,0x6d,0x11,0x7e,0x4, 0x7f,0xff,0x6c,0xee,0x80,0x13,0x12, +0xa7,0xba,0x7d,0xc3,0xbd,0xdc,0x50,0x2, 0x7d,0xdc,0xbd,0xc, 0x28,0x2, 0x7d,0xc, +0xb, 0xe0,0xbc,0xfe,0x38,0xe9,0xbe,0xd4,0x0, 0x1e,0x58,0xa, 0x7e,0xb3,0x28,0x94, +0x70,0x4, 0x6d,0x33,0xe1,0xab,0xbe,0xd4,0x4, 0xb0,0x8, 0x2, 0xd2,0x0, 0x6c,0xee, +0x74,0x4, 0xac,0xbe,0x49,0x45,0x1f,0x34,0xbd,0x4d,0x58,0x6, 0x49,0xd5,0x1f,0x36, +0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x3, 0x40,0xe7,0xbe,0xe0,0x3, 0x78,0x4, 0x6d,0x33, +0xe1,0xab,0xbd,0xd, 0x8, 0x5, 0x30,0x0, 0x2, 0x7d,0xd0,0x9f,0x55,0x6c,0xee,0x80, +0xb, 0x12,0xa7,0xba,0x1a,0x26,0x1a,0x24,0x2f,0x51,0xb, 0xe0,0xbc,0xfe,0x38,0xf1, +0xa, 0x1f,0x12,0xa7,0xb0,0x9f,0x55,0x6c,0xee,0x80,0x22,0x74,0x2, 0xac,0xbe,0x7f, +0x17,0x2d,0x35,0xb, 0x1a,0x90,0x7d,0x39,0x12,0x21,0x48,0x7d,0xc3,0xbd,0x1c,0x28, +0xa, 0x7d,0x39,0x1a,0x26,0x1a,0x24,0x2f,0x51,0xb, 0xd0,0xb, 0xe0,0xbc,0xfe,0x38, +0xda,0x6d,0x11,0xbe,0xd0,0x0, 0x28,0x5, 0xa, 0x1d,0x12,0xa7,0xb0,0xbd,0x1d,0x8, +0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, 0x9d,0xd, 0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c, +0xee,0x80,0x12,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x0, 0x9d,0x1, +0x1b,0x1a,0x0, 0xb, 0xe0,0xbc,0xfe,0x38,0xea,0x7d,0x31,0xda,0x79,0xda,0xd8,0x22, +0x6d,0x0, 0x7f,0x15,0x12,0x1f,0x8d,0x7d,0x13,0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17, +0x2d,0x35,0xb, 0x1a,0x30,0x2, 0x21,0x48,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x31,0x12, +0xc9,0x26,0x7e,0x1f,0x3b,0x21,0x7a,0x37,0x24,0xfa,0x7e,0x34,0xd, 0xc8,0x7a,0x37, +0x24,0xf6,0x12,0x7f,0xe8,0x12,0x7f,0xf1,0xe4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x0, +0x20,0x7a,0x37,0x24,0xfc,0x7a,0xb3,0x24,0xf4,0x7e,0x8, 0x24,0xf2,0x2, 0xd, 0x7, +0x22,0x7c,0xa7,0x7c,0x7b,0x90,0x60,0xaa,0xe4,0x93,0x60,0x2, 0x7c,0xa7,0x90,0x60, +0xab,0xe4,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22,0xc3,0x22,0x6c,0xaa,0x80,0x23,0x7e, +0x30,0x4, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x60,0xb1,0x7e,0xe4,0x0, 0xff,0xb, 0x7a, +0x20,0xbd,0x23,0x38,0xb, 0x2e,0x14,0x60,0xb3,0x12,0x5f,0xec,0xbd,0x23,0x50,0xb, +0xb, 0xa0,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xba,0x38,0xd4,0x7c,0xba,0x22,0x12,0xa8, +0x62,0x7e,0x14,0x62,0x7, 0x12,0x5f,0xec,0xbd,0x32,0x28,0x3, 0xd2,0x16,0x22,0xc2, +0x16,0x22,0x6d,0x11,0xe4,0x12,0x0, 0x1e,0x6c,0xaa,0x80,0x5b,0x7e,0x10,0x2, 0xac, +0x1a,0x7e,0x7f,0x33,0xf8,0x2d,0xf0,0x69,0x27,0x1, 0x0, 0x69,0x37,0x0, 0x80,0x9d, +0x32,0x12,0x21,0x48,0xbd,0x31,0x28,0x16,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0xf, 0x33, +0xf8,0x2d,0x13,0x69,0x20,0x1, 0x0, 0x69,0x30,0x0, 0x80,0x12,0x8f,0x29,0x7e,0x10, +0x2, 0xac,0x1a,0x7e,0x1f,0x33,0xf8,0x2d,0x30,0x69,0x1, 0x0, 0x80,0xbe,0x4, 0x7f, +0xff,0x78,0x4, 0x7e,0x14,0x7f,0xff,0x69,0x1, 0x1, 0x0, 0xbe,0x4, 0x7f,0xff,0x78, +0x4, 0x7e,0x14,0x7f,0xff,0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xbc,0xba,0x38,0x9d,0x7d, +0x31,0x22,0x6c,0xaa,0x80,0x26,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x5, 0xf8,0x49, +0x32,0x4, 0x0, 0x2d,0x31,0x59,0x32,0x5, 0xf8,0x30,0x6, 0xe, 0x49,0x12,0x4, 0x7e, +0x49,0x32,0x6, 0x76,0x2d,0x31,0x59,0x32,0x6, 0x76,0xb, 0xa0,0x7e,0xb3,0x2a,0x74, +0xa, 0x3b,0x7e,0xb3,0x2a,0x73,0xa, 0x2b,0x2d,0x23,0xa, 0x3a,0xbd,0x32,0x48,0xc6, +0x22,0xc2,0x0, 0x7e,0xa3,0x2a,0x70,0x7e,0xb3,0x26,0xf1,0x60,0x4, 0xd2,0x0, 0x80, +0x33,0x7e,0x70,0x2, 0x80,0x22,0x7e,0x50,0x2, 0xac,0x57,0x49,0x12,0x4, 0xfc,0x7e, +0xf4,0x61,0x59,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0x6d,0x22,0x9d,0x20,0xbd,0x12, +0x58,0x4, 0xd2,0x0, 0x80,0xe, 0xb, 0x70,0xa, 0x1a,0x9e,0x14,0x0, 0x3, 0xa, 0x27, +0xbd,0x21,0x48,0xd2,0xa2,0x0, 0x22,0x7e,0x37,0x3b,0x1a,0x12,0x25,0x6f,0x7a,0x37, +0x38,0xab,0x6c,0xaa,0x80,0x23,0x12,0x5f,0xf4,0x28,0x26,0xa, 0x4a,0x9, 0x64,0x38, +0x44,0xbc,0x6b,0x50,0x12,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x42,0x3b,0x14,0x7e,0x70, +0xc, 0xac,0x67,0x59,0x43,0x38,0x4e,0xb, 0xa0,0x7e,0xb3,0x38,0x41,0xbc,0xba,0x38, +0xd5,0x22,0x7d,0x23,0x7e,0x14,0x61,0xc8,0x12,0x5a,0xad,0x7e,0x14,0x0, 0x5, 0xad, +0x13,0x1e,0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33,0x38,0xaa,0xbe,0x30,0x8, 0x50,0x45, +0x74,0x8, 0x80,0x3d,0x7d,0x13,0x3e,0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33,0x38,0xaa, +0xbe,0x30,0x6, 0x50,0x30,0x74,0x6, 0x80,0x28,0x7e,0x14,0x0, 0x3, 0xad,0x13,0x1e, +0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33,0x38,0xaa,0xbe,0x30,0x4, 0x50,0x17,0x74,0x4, +0x80,0xf, 0xbd,0x32,0x50,0xf, 0x7e,0x73,0x38,0xaa,0xbe,0x70,0x2, 0x50,0x6, 0x74, +0x2, 0x7a,0xb3,0x38,0xaa,0x7e,0xb3,0x38,0xaa,0xbe,0xb0,0x0, 0x28,0x1b,0x14,0x7a, +0xb3,0x38,0xaa,0x74,0x1, 0x7a,0xb3,0x16,0x92,0x90,0x61,0xfd,0xe4,0x93,0xbe,0xb3, +0x38,0xaa,0x50,0x5, 0xe4,0x7a,0xb3,0x16,0x91,0x22,0x7c,0x3b,0x7e,0x44,0xff,0xff, +0x6c,0x22,0x80,0x2a,0x12,0xaa,0x93,0x68,0x23,0x7e,0x70,0xc, 0xac,0x72,0x12,0xc8, +0x94,0x7d,0x23,0x7e,0x70,0xc, 0xac,0x72,0x59,0x23,0x38,0x50,0x49,0x3, 0x38,0x50, +0x49,0x23,0x38,0x4c,0xbd,0x20,0x50,0x4, 0x59,0x3, 0x38,0x4c,0xb, 0x20,0xbc,0x32, +0x50,0xd2,0x6c,0xaa,0x6c,0x22,0x80,0x18,0x12,0xaa,0x93,0x68,0x11,0x7e,0x70,0xc, +0xac,0x72,0x49,0x3, 0x38,0x4c,0xbd,0x4, 0x50,0x4, 0x7d,0x40,0x7c,0xa2,0xb, 0x20, +0xbc,0x32,0x50,0xe4,0x7e,0x37,0x38,0x32,0xbe,0x37,0x38,0xab,0x50,0x8, 0x7e,0x37, +0x38,0xab,0x7a,0x37,0x38,0x32,0x12,0xab,0xc9,0x4d,0x33,0x78,0x3, 0x7e,0xa0,0xff, +0x7c,0xba,0x22,0x7e,0x10,0x5, 0xac,0x12,0x9, 0xb0,0x26,0x33,0xbe,0xb3,0x2b,0xf, +0x22,0xca,0xd8,0xca,0x79,0x7e,0xe0,0xff,0x12,0xaf,0xfa,0x7e,0xb3,0x38,0x39,0xb4, +0x1, 0x8, 0x12,0x7e,0x21,0xe4,0x7a,0xb3,0x38,0x39,0x7e,0xb3,0x38,0x38,0x60,0x4, +0x74,0xff,0x61,0xc4,0x7e,0xb3,0x38,0x37,0xb4,0x2, 0x2, 0x80,0x2, 0x61,0xb8,0x12, +0xc9,0x45,0x38,0xc, 0x12,0xc9,0x3d,0x38,0x7, 0x12,0xc9,0x35,0x38,0x2, 0x61,0xb8, +0x12,0xc9,0x2d,0xa, 0x3d,0x1b,0x34,0xbe,0x34,0x0, 0x3, 0x48,0x4, 0x74,0x3, 0x80, +0x3, 0x7c,0xbd,0x14,0x12,0xaa,0x1a,0x7c,0xfb,0x7e,0xb3,0x38,0x36,0x4, 0x7a,0xb3, +0x38,0x36,0x90,0x61,0xc5,0xe4,0x93,0x14,0x12,0xaa,0x1a,0x7c,0xab,0xbe,0xa0,0xff, +0x68,0x2c,0xbe,0xf0,0xff,0x68,0x25,0x7e,0x30,0xc, 0xac,0x3f,0x49,0x21,0x38,0x4c, +0x7e,0xf4,0x61,0xcc,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x30,0xbd,0x23,0x28,0xf, 0x12, +0xab,0xc9,0x3e,0x34,0xbd,0x23,0x28,0x6, 0x7c,0xfa,0x80,0x2, 0x7c,0xfa,0xbe,0xf0, +0xff,0x78,0x11,0xe4,0x7a,0xb3,0x38,0x36,0x7a,0xb3,0x38,0x37,0x7a,0xb3,0x38,0x43, +0x74,0xff,0x80,0x70,0x90,0x61,0xd4,0xe4,0x93,0xbe,0xb3,0x38,0x36,0x50,0x59,0x74, +0xc, 0xac,0xbf,0x49,0x25,0x38,0x4c,0x7e,0x14,0x61,0xcc,0x12,0x5a,0xad,0xbd,0x23, +0x50,0x3d,0x7e,0x34,0x61,0xd0,0x12,0x23,0xc9,0xbe,0x37,0x38,0x32,0x40,0xd, 0x7e, +0x34,0x61,0xd2,0x12,0x23,0xc9,0xbe,0x37,0x38,0x3d,0x50,0x23,0x74,0x5, 0xac,0xbf, +0x9, 0x75,0x26,0x33,0xbe,0x73,0x2b,0xf, 0x68,0x15,0x7c,0xef,0xbe,0xe0,0x4, 0x50, +0x8, 0x12,0xab,0xd3,0xbe,0xb0,0x4, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x38,0x39,0xe4, +0x7a,0xb3,0x38,0x43,0x7a,0xb3,0x38,0x37,0xbe,0xe0,0xff,0x68,0x5, 0xe4,0x7a,0xb3, +0x38,0x36,0x7c,0xbe,0xda,0x79,0xda,0xd8,0x22,0x7e,0x70,0xc, 0xac,0x7a,0x49,0x33, +0x38,0x4c,0x22,0x7e,0xb3,0x2b,0xf, 0x7c,0xab,0x6c,0x77,0x7e,0x50,0x5, 0xac,0x57, +0x9, 0x62,0x26,0x33,0xbc,0x6a,0x78,0x3, 0x7c,0xb7,0x22,0xb, 0x70,0xbe,0x70,0x4, +0x40,0xe9,0x74,0xff,0x22,0x7c,0x2b,0x7e,0xb3,0x1f,0x33,0xbc,0x2b,0x68,0x55,0x12, +0xab,0xd7,0x7c,0x3b,0x7c,0xb2,0x12,0xab,0xd7,0x7c,0xab,0xbe,0x30,0xff,0x68,0x44, +0xbe,0xa0,0xff,0x68,0x3f,0x7e,0x70,0x4, 0xac,0x73,0xa, 0x2a,0x2d,0x32,0x2e,0x34, +0x21,0x38,0x12,0x97,0xb6,0xbe,0xb0,0x2, 0x38,0x2a,0xa, 0x2b,0x7e,0x34,0x2, 0xe0, +0xad,0x32,0x2e,0x34,0x16,0x93,0x6d,0x22,0x30,0x19,0x3, 0x2, 0xac,0x64,0x7e,0xb3, +0x2b,0x1d,0xb4,0x1, 0xf, 0x12,0xc8,0x6c,0x7a,0x55,0x2a,0x7e,0x8, 0xd, 0xc8,0x74, +0x1, 0x2, 0xac,0x95,0x22,0x7c,0xab,0x12,0xaf,0xf2,0xd2,0x19,0x7c,0xba,0x12,0xab, +0xf5,0xc2,0x19,0x22,0x7c,0x7b,0x90,0x60,0x93,0xe4,0x93,0xa, 0x1b,0x7e,0x63,0x2a, +0x71,0xa, 0x6, 0x2d,0x1, 0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xad,0x10,0x7d,0x21,0x12, +0x7f,0xd6,0xa, 0x26,0x7a,0x25,0x2a,0x74,0x1d,0xac,0x7b,0x2e,0x34,0x39,0x8c,0x6d, +0x22,0xe4,0x2, 0xac,0x95,0x7c,0xab,0x6d,0x44,0x80,0x29,0x4c,0xaa,0x68,0x11,0x12, +0xac,0xd8,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb,0x12,0xac,0xcc,0x2d,0xfe,0x80,0xf, +0x12,0xac,0xd8,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb,0x12,0xac,0xcc,0x9d,0xfe,0x1b, +0x6a,0xf0,0xb, 0x44,0x7e,0xf5,0x2a,0xbd,0xf4,0x38,0xd0,0x22,0x7d,0xf4,0x3e,0xf4, +0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x22,0x7f,0x71,0x2d,0xf4,0x7e,0x7b,0xb0,0x1a, +0xeb,0x7f,0x61,0x2e,0xd5,0x2a,0x7e,0x6b,0xb0,0x22,0xca,0xf8,0x7e,0x45,0x24,0x7c, +0xb9,0x7a,0xb3,0x3a,0x87,0x74,0xff,0x7a,0xb3,0x3a,0x86,0x6d,0x55,0x80,0x19,0x7d, +0xf5,0x3e,0xf4,0x12,0xac,0xce,0x7d,0xe5,0x3e,0xe4,0x59,0xfe,0x1f,0x34,0x69,0xf6, +0x0, 0x2, 0x59,0xfe,0x21,0x14,0xb, 0x54,0xbd,0x45,0x38,0xe3,0x7e,0x33,0x3a,0x87, +0xbe,0x30,0x4, 0x38,0x2, 0xa1,0xac,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, +0x1e,0xee,0x7c,0xf7,0x74,0x40,0x7a,0xb3,0x3a,0x8a,0x80,0x43,0x4d,0xff,0x78,0x4, +0x7e,0xf4,0x0, 0x1, 0x7d,0x31,0x7d,0x2f,0x12,0x1e,0xee,0x7c,0xf7,0x74,0x80,0x7a, +0xb3,0x3a,0x8a,0x7d,0xf, 0x2d,0xf, 0xbd,0x1, 0x8, 0x24,0x1a,0x2, 0x1a,0x0, 0x7e, +0x73,0x3a,0x8a,0xa, 0x37,0x6d,0x22,0x12,0x1f,0x20,0x7d,0x5f,0x1a,0x4a,0x1a,0x48, +0x7d,0x1f,0x1a,0x2, 0x1a,0x0, 0x2f,0x2, 0x12,0x1f,0x3c,0x7a,0x73,0x3a,0x8a,0xbe, +0xf0,0x5, 0x58,0x14,0x12,0xad,0xcb,0x12,0xc7,0xb6,0x12,0xad,0xcb,0x12,0xad,0xd4, +0x12,0xad,0xcb,0x12,0xc6,0xf0,0x80,0xa, 0x74,0x7d,0x80,0x2, 0x74,0x7f,0x7a,0xb3, +0x3a,0x86,0xe4,0x7a,0xb3,0x3a,0x87,0x7e,0x73,0x3b,0x51,0xbe,0x73,0x3a,0x86,0x48, +0x6, 0x7e,0xb3,0x3a,0x88,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7e,0x8, 0x1f,0x34,0x7e, +0x18,0x21,0x14,0x22,0xca,0x3b,0x7f,0x71,0x7e,0x60,0x1, 0xb, 0xa, 0x20,0xb, 0x7a, +0x50,0x7c,0x4b,0x7a,0x53,0x22,0xf4,0x7a,0x43,0x23,0xe4,0x7e,0x70,0x1, 0x7e,0xa0, +0x1, 0xc1,0xf5,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x60,0x2d,0xd4,0xb, 0x6a,0xd0,0x7d, +0x7d,0x7c,0xbf,0xf5,0x26,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,0xf3,0xbe,0x60, +0x0, 0x18,0x2, 0xc1,0xdb,0xbe,0x70,0xec,0x28,0x2, 0xc1,0xff,0xbe,0x80,0x8, 0x58, +0x5, 0xbe,0xf0,0x8, 0x48,0x61,0xa, 0xa7,0xb, 0xa4,0x7d,0x6a,0x7c,0x7d,0xa, 0xa5, +0x2d,0xab,0x12,0xaf,0x43,0x19,0xba,0x22,0xf4,0xa, 0xd9,0xa, 0xa4,0x2d,0xad,0x12, +0xaf,0x43,0x19,0xba,0x23,0xe4,0x9, 0xba,0x22,0xf4,0xa, 0xdb,0xa, 0xc5,0x2d,0xcd, +0xe, 0xc4,0x7d,0x6c,0x7c,0xbd,0xa, 0xc7,0x19,0xbc,0x22,0xf3,0x9, 0xbc,0x23,0xe4, +0xa, 0xcb,0xa, 0xa4,0x2d,0xac,0x12,0xaf,0x43,0x19,0xba,0x23,0xe3,0x2d,0xdb,0x12, +0xaf,0x3a,0x19,0xbd,0x22,0xf5,0xa, 0xd9,0x12,0xaf,0x38,0x19,0xbd,0x23,0xe5,0xb, +0xd5,0x7d,0x6d,0x7c,0x7d,0x80,0x24,0xbe,0x80,0x4, 0x58,0x5, 0xbe,0xf0,0x4, 0x48, +0x1a,0xe5,0x26,0xa, 0xcb,0xa, 0xd5,0x12,0xaf,0x38,0x19,0xbd,0x22,0xf4,0xa, 0xc9, +0xa, 0xd4,0x12,0xaf,0x38,0x19,0xbd,0x23,0xe4,0xb, 0x70,0xbe,0x70,0xf0,0x50,0x1f, +0x7e,0x51,0x26,0x7c,0x49,0xe5,0x26,0xa, 0xd7,0x19,0xbd,0x22,0xf4,0x19,0x9d,0x23, +0xe4,0xb, 0x70,0xb, 0xa0,0x7e,0xb3,0x3a,0x87,0xbc,0xba,0x28,0x2, 0xa1,0xf3,0x7a, +0x73,0x3a,0x87,0x7e,0xa0,0x1, 0x80,0x25,0xa, 0x3a,0x9, 0xb3,0x22,0xf4,0xa, 0x2b, +0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x60,0x2d,0xd3,0x1b,0x6a,0x20,0xa, 0x2a,0x9, 0xb2, +0x23,0xe4,0xa, 0x4b,0x2d,0x3f,0x7d,0x2e,0x1b,0x1a,0x40,0xb, 0xa0,0x7e,0xb3,0x3a, +0x87,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,0xe9,0x7a, +0x37,0x2f,0x9c,0x12,0xaf,0x74,0x7a,0x37,0x2f,0x9e,0x12,0x5d,0xe4,0x60,0x1, 0x22, +0x7e,0x73,0x2f,0xa8,0xa, 0x37,0x7a,0x35,0x24,0x7e,0x8, 0x2b,0xbf,0x7e,0x18,0x2f, +0x80,0x2, 0xac,0xea,0x7e,0x37,0x2f,0x96,0x9e,0x37,0x2f,0x8e,0x22,0x7e,0x17,0x2f, +0x90,0xbd,0x13,0x28,0xa, 0x7a,0x37,0x2f,0x90,0x7a,0x27,0x2f,0x92,0x80,0x10,0x7e, +0x17,0x2f,0x88,0xbd,0x13,0x50,0x8, 0x7a,0x37,0x2f,0x88,0x7a,0x27,0x2f,0x8a,0x7e, +0x17,0x2f,0x8e,0xbd,0x12,0x28,0xa, 0x7a,0x27,0x2f,0x8e,0x7a,0x37,0x2f,0x8c,0x80, +0x10,0x7e,0x17,0x2f,0x96,0xbd,0x12,0x50,0x8, 0x7a,0x27,0x2f,0x96,0x7a,0x37,0x2f, +0x94,0x7e,0xb3,0x2f,0xa8,0xb4,0xa, 0xf, 0x12,0xaf,0xe9,0x7a,0x37,0x2f,0xa0,0x12, +0xaf,0x74,0x7a,0x37,0x2f,0xa2,0x22,0xb4,0x14,0xe, 0x12,0xaf,0xe9,0x7a,0x37,0x2f, +0xa4,0x12,0xaf,0x74,0x7a,0x37,0x2f,0xa6,0x22,0x7e,0x37,0x2f,0x88,0x9e,0x37,0x2f, +0x90,0x22,0xa9,0xd1,0xcb,0x74,0x1, 0x2, 0x0, 0xe, 0x7e,0xb3,0x38,0x38,0xb4,0x1, +0x27,0x7e,0xb3,0x38,0xae,0x4, 0x7a,0xb3,0x38,0xae,0x7e,0x73,0x38,0xae,0xbe,0x70, +0x3, 0x40,0x15,0x12,0x7f,0x43,0x7e,0x73,0x38,0xae,0xbe,0x70,0x6, 0x40,0x9, 0xe4, +0x7a,0xb3,0x38,0xae,0x7a,0xb3,0x38,0x38,0x22,0xca,0xf8,0x7f,0x71,0x6d,0xdd,0x6c, +0xaa,0x7e,0xf0,0x80,0xc2,0x0, 0x6d,0x44,0x80,0x32,0x12,0xb0,0xca,0x12,0xa7,0xc2, +0xbd,0x3d,0x48,0x26,0x12,0xb0,0xca,0xb, 0x1a,0x30,0xbe,0x34,0x0, 0x0, 0x8, 0x4, +0xd2,0x0, 0x80,0x9, 0x12,0x21,0x48,0xbd,0x3d,0x68,0x2, 0xc2,0x0, 0x7d,0x34,0x3e, +0x34,0x2d,0x3f,0x7d,0x2e,0x12,0xa7,0xc2,0x7d,0xd3,0xb, 0x44,0x7e,0xc5,0x35,0xbd, +0xc4,0x38,0xc7,0x30,0x0, 0xc, 0x7e,0xf0,0x7f,0x80,0x7, 0xb, 0xa0,0xbe,0xa0,0x8, +0x50,0x11,0x7c,0xba,0x7d,0x3d,0x60,0x5, 0xe, 0x34,0x14,0x78,0xfb,0xa, 0xcf,0xbd, +0x3c,0x18,0xe8,0x7f,0x10,0x2e,0x35,0x35,0x7a,0x1b,0xa0,0x6d,0x44,0x80,0x21,0x7d, +0x54,0x3e,0x54,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x7f,0x60,0x2e,0xd5,0x35,0x7e, +0x6b,0xb0,0x60,0x5, 0xe, 0x34,0x14,0x78,0xfb,0x7c,0xb7,0x12,0xb0,0xd5,0xb, 0x44, +0x7e,0x55,0x35,0xbd,0x54,0x38,0xd8,0xda,0xf8,0x22,0x7d,0xc4,0x3e,0xc4,0x7f,0x17, +0x2d,0x3c,0x22,0xa, 0x4a,0x7f,0x10,0x2d,0x34,0x7a,0x1b,0xb0,0x22,0x90,0x60,0x93, +0xe4,0x93,0xa, 0xb, 0x7e,0x73,0x2a,0x71,0xa, 0x17,0x2d,0x10,0x7e,0xa3,0x2a,0x6e, +0xa, 0x3a,0xad,0x13,0x7d,0x21,0x6c,0x33,0x80,0x20,0xa, 0x3, 0x2d,0x2, 0x3e,0x4, +0x7e,0x7f,0x3b,0x21,0x2d,0xf0,0xb, 0x7a,0x0, 0x7e,0x90,0x2, 0xac,0x93,0x49,0xf4, +0x13,0x8e,0x9d,0xf, 0x59,0x4, 0x25,0xb6,0xb, 0x30,0xbc,0xa3,0x38,0xdc,0x7a,0x35, +0x35,0x7e,0xf, 0x39,0x88,0x7e,0x18,0x25,0xb6,0x2, 0xb0,0x29,0xca,0x3b,0x7e,0xb3, +0x2b,0xf, 0x7a,0xb3,0x1f,0x33,0x7e,0xf3,0x2b,0x62,0x12,0xab,0xd7,0x7c,0xdb,0xbe, +0xd0,0xff,0x68,0x6a,0x6c,0xcc,0x12,0xb1,0xb1,0xf5,0x2a,0x7e,0x73,0x2b,0xf, 0xbe, +0x71,0x2a,0x68,0x3c,0x7e,0x70,0x4, 0xac,0x7d,0xa, 0x2c,0x2d,0x32,0x2e,0x34,0x21, +0x38,0x12,0x97,0xb6,0x7c,0xeb,0xbe,0xe0,0x2, 0x38,0x43,0xa, 0xe, 0x7e,0x14,0x2, +0xe0,0xad,0x10,0x2e,0x14,0x16,0x93,0x6d,0x0, 0x7a,0xd, 0x2b,0x7e,0x70,0x1d,0xac, +0x7e,0x2e,0x34,0x39,0x8c,0x6d,0x22,0x7a,0x1f,0x39,0x88,0x7c,0xbc,0x12,0x6e,0x4e, +0xb, 0xc0,0xbe,0xc0,0x4, 0x40,0xaf,0x7e,0x73,0x2b,0x62,0xbc,0x7f,0x68,0x6, 0x7a, +0xf3,0x2b,0x62,0xd2,0x10,0xd2,0x0, 0x7e,0xb3,0x1f,0x33,0x12,0x6c,0x1f,0xda,0x3b, +0x22,0x74,0x5, 0xac,0xbc,0x9, 0xb5,0x26,0x33,0x22,0x6d,0x33,0x7d,0x23,0x7d,0x3, +0x6c,0x33,0x80,0x45,0x6c,0x22,0x80,0x37,0x7e,0xb3,0x2a,0x6e,0xac,0xb3,0xa, 0x42, +0x2d,0x54,0x7d,0x45,0x3e,0x44,0x7e,0x7f,0x13,0x8a,0x2d,0xf4,0xb, 0x7a,0x40,0xbe, +0x44,0x0, 0x32,0x8, 0x8, 0xbe,0x44,0x2, 0x58,0x58,0x2, 0xb, 0x24,0xbe,0x44,0xff, +0xce,0x58,0x8, 0xbe,0x44,0xfd,0xa8,0x8, 0x2, 0xb, 0x4, 0xb, 0x34,0xb, 0x21,0x7e, +0x93,0x2a,0x6e,0xbc,0x92,0x38,0xc1,0xb, 0x31,0x7e,0xb3,0x2a,0x6d,0xbc,0xb3,0x38, +0xb3,0x7e,0x54,0x0, 0x6, 0xad,0x53,0x7d,0x15,0x1e,0x14,0x1e,0x14,0x1e,0x14,0x12, +0x25,0x71,0xbd,0x12,0x50,0x22,0xbd,0x30,0x28,0x1e,0xe4,0x7a,0xb3,0x3b,0x58,0x7e, +0xb3,0x3b,0x59,0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x3b,0x59,0x80,0x3c,0xe4, +0x7a,0xb3,0x3b,0x59,0x74,0x1, 0x80,0x2f,0xbd,0x10,0x50,0x22,0xbd,0x32,0x28,0x1e, +0xe4,0x7a,0xb3,0x3b,0x59,0x7e,0xb3,0x3b,0x58,0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a, +0xb3,0x3b,0x58,0x80,0x16,0xe4,0x7a,0xb3,0x3b,0x58,0x74,0x2, 0x80,0x9, 0xe4,0x7a, +0xb3,0x3b,0x58,0x7a,0xb3,0x3b,0x59,0x7a,0xb3,0x3b,0x5a,0x7e,0xb3,0x3b,0x5a,0x22, +0xe4,0x7a,0xb3,0x28,0xa8,0x7a,0xb3,0x3b,0x5b,0x22,0x6c,0x66,0x90,0x60,0xa7,0xe4, +0x93,0xbe,0xb0,0x0, 0x28,0x71,0x90,0x60,0xaa,0xe4,0x93,0x70,0x6a,0x7e,0xb3,0x28, +0xa8,0xb4,0x1, 0x63,0x7e,0x73,0x26,0xf2,0xbe,0x70,0x0, 0x28,0x5a,0x6c,0x33,0x80, +0x4e,0xa, 0x23,0x9, 0x72,0x26,0xe6,0x7e,0xb3,0x2a,0x6e,0x14,0xbc,0x7b,0x78,0x3d, +0x6c,0x22,0x80,0x27,0x7c,0xb2,0x7c,0x73,0x12,0x3f,0x59,0x50,0x1c,0xa, 0x22,0x7e, +0x73,0x2a,0x6e,0xa, 0x7, 0x2d,0x2, 0x3e,0x4, 0x49,0x20,0x4, 0xfc,0x6d,0x0, 0x9e, +0x7, 0x2a,0x4f,0xbd,0x20,0x58,0x2, 0xb, 0x60,0xb, 0x20,0x7e,0x73,0x2a,0x6d,0xbc, +0x72,0x38,0xd1,0xbe,0x60,0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4,0x22,0xb, 0x30,0x7e, +0x73,0x26,0xf2,0xbc,0x73,0x38,0xaa,0x74,0x1, 0x22,0x7c,0xab,0xbe,0xa0,0x0, 0x40, +0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x28,0x9, 0x74,0x2, 0xa4,0x49,0x25,0x34,0x0, +0x80,0x51,0x7e,0x13,0x2a,0x6e,0xbc,0x1a,0x38,0x1c,0x7e,0x3, 0x2a,0x6d,0xa, 0x10, +0xa, 0x21,0x2d,0x12,0xa, 0x3a,0xbd,0x31,0x58,0xc, 0x9d,0x32,0x3e,0x34,0x3e,0x34, +0x49,0x23,0x3, 0x6f,0x80,0x2d,0x7e,0x3, 0x2a,0x6d,0xa, 0x20,0xa, 0x11,0x7d,0x41, +0x2d,0x42,0xa, 0x3a,0xbd,0x34,0x48,0x19,0x7e,0x10,0x2, 0xac,0x1, 0x2d,0x1, 0xbd, +0x30,0x58,0xe, 0x9d,0x31,0x9d,0x32,0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x71,0x80, +0x2, 0xe4,0x22,0x7e,0x34,0x0, 0x64,0xad,0x23,0x74,0xc, 0x1e,0x34,0x1e,0x24,0x50, +0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7c,0xb7,0x22,0xca,0xf8,0x80,0x38,0x7c,0xbf, +0x12,0xb3,0xa, 0xa, 0x1b,0x7e,0x63,0x2a,0x6e,0x7e,0x70,0x2, 0xac,0x67,0x7e,0x10, +0x2, 0xac,0x1f,0x2d,0x3, 0x7e,0x1f,0x13,0x8a,0x2d,0x30,0x12,0xb3,0xc9,0x9d,0x35, +0x1b,0x1a,0x10,0xb, 0xf0,0x12,0xb3,0xc9,0x7e,0x73,0x2a,0x6e,0xa, 0x27,0x2d,0x25, +0xa, 0x3f,0xbd,0x32,0x48,0xc8,0xda,0xf8,0x22,0x7e,0xa3,0x2a,0x6d,0x74,0x2, 0xa4, +0x22,0xca,0x3b,0x7c,0xfb,0x75,0x3d,0x0, 0x7e,0xb3,0x2a,0x6f,0xf5,0x42,0x7e,0xb3, +0x2a,0x70,0xf5,0x43,0x75,0x44,0x28,0x7e,0xd3,0x28,0x84,0xe4,0x7a,0xb3,0x31,0xfb, +0x7a,0xb3,0x31,0xf7,0x7a,0xb3,0x31,0xf8,0x7e,0x8, 0x31,0xfc,0x12,0xb7,0xaa,0xe4, +0x12,0x21,0x16,0x12,0xb7,0xaa,0x3e,0x34,0x7e,0x8, 0x32,0x1c,0xe4,0x12,0x21,0x16, +0xbe,0xd0,0x2, 0x50,0x2, 0xe1,0xa7,0x6c,0xcc,0xe1,0xa1,0x12,0x67,0xed,0xf5,0x24, +0x9, 0xb3,0x26,0xfb,0xf5,0x25,0x4c,0xcc,0x68,0x8, 0xa, 0x3c,0x9, 0xb3,0x31,0xfc, +0x70,0xa, 0xa, 0x3c,0xb, 0x34,0xa, 0x2c,0x19,0x72,0x31,0xfc,0x7c,0xbd,0x14,0xbc, +0xbc,0x78,0x2, 0xe1,0xa7,0xa, 0x5c,0xb, 0x54,0xf5,0x2e,0xe1,0x98,0x7e,0x71,0x2e, +0x12,0xb7,0xd0,0x7a,0xa1,0x26,0x9, 0xb3,0x26,0xfb,0xf5,0x27,0xa, 0x2a,0xe5,0x24, +0x12,0x3c,0xf, 0x7c,0xb7,0xf5,0x28,0xe5,0x27,0xa, 0x2b,0x12,0x3c,0xd, 0x7c,0xb7, +0xf5,0x29,0xe5,0x28,0xbe,0xb0,0x5, 0x40,0x2, 0xe1,0x96,0xe5,0x29,0xbe,0xb0,0x5, +0x40,0x2, 0xe1,0x96,0x12,0xb7,0xb1,0x12,0x65,0x8f,0x7a,0xb3,0x31,0xfa,0x85,0x25, +0x54,0x85,0x26,0x55,0x85,0x27,0x56,0x7e,0x8, 0x0, 0x31,0x7e,0x18,0x0, 0x33,0xe5, +0x24,0x12,0xb8,0xd0,0x75,0x3d,0x0, 0x6c,0xee,0x75,0x30,0x0, 0xe5,0x24,0x7e,0x71, +0x25,0x12,0x2c,0x63,0x7a,0x35,0x35,0xe5,0x26,0x7e,0x71,0x27,0x12,0x2c,0x63,0x7a, +0x35,0x37,0x7e,0x35,0x35,0xbe,0x35,0x37,0x8, 0x5, 0x7e,0x35,0x37,0x80,0x3, 0x7e, +0x35,0x35,0x7a,0x35,0x3b,0xe, 0x34,0x7a,0x35,0x39,0xe5,0x28,0xbe,0xb0,0x1, 0x38, +0x2c,0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x25,0x7c,0xbf,0x30,0xe1,0x20,0xe5,0x26,0x7e, +0x71,0x25,0x12,0x2c,0x63,0x7d,0x43,0xe5,0x24,0x7e,0x71,0x27,0x12,0x2c,0x63,0x2d, +0x34,0xbe,0x35,0x39,0x18,0x2, 0xe1,0x31,0x75,0x30,0x1, 0xe1,0x31,0xe5,0x28,0xbe, +0xb0,0x1, 0x38,0x9, 0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x2, 0xe1,0x31,0xe5,0x28,0xbe, +0xb0,0x5, 0x40,0x2, 0xe1,0x31,0xe5,0x29,0xbe,0xb0,0x5, 0x40,0x2, 0xe1,0x31,0x7c, +0xbf,0x20,0xe0,0x2, 0xe1,0x31,0x6d,0x33,0x7a,0x35,0x4d,0x75,0x4f,0x0, 0x7a,0x35, +0x50,0x75,0x52,0x0, 0xc2,0x2, 0xc2,0x3, 0xe5,0x26,0xbe,0xb1,0x24,0x28,0x4, 0xe5, +0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2a,0xe5,0x26,0xbe,0xb1,0x24,0x50,0x4, 0xe5,0x24, +0x80,0x2, 0xe5,0x26,0xf5,0x2c,0xe5,0x27,0xbe,0xb1,0x25,0x28,0x4, 0xe5,0x25,0x80, +0x2, 0xe5,0x27,0xf5,0x2b,0xe5,0x27,0xbe,0xb1,0x25,0x50,0x4, 0xe5,0x25,0x80,0x2, +0xe5,0x27,0xf5,0x2d,0xe5,0x2c,0xbe,0xb1,0x2a,0x78,0x29,0xd2,0x2, 0xe5,0x2a,0x60, +0x8, 0xe5,0x42,0x14,0xbe,0xb1,0x2a,0x78,0x2, 0xd2,0x3, 0xe5,0x2a,0xbe,0xb0,0x0, +0x28,0x2, 0x15,0x2a,0xe5,0x42,0xa, 0x2b,0x1b,0x24,0xe5,0x2c,0xa, 0x3b,0xbd,0x32, +0x58,0x2, 0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2b,0x78,0x29,0xd2,0x2, 0xe5,0x2b,0x60, +0x8, 0xe5,0x43,0x14,0xbe,0xb1,0x2b,0x78,0x2, 0xd2,0x3, 0xe5,0x2b,0xbe,0xb0,0x0, +0x28,0x2, 0x15,0x2b,0xe5,0x43,0xa, 0x2b,0x1b,0x24,0xe5,0x2d,0xa, 0x3b,0xbd,0x32, +0x58,0x2, 0x5, 0x2d,0x85,0x2a,0x3e,0x80,0x5b,0x85,0x2b,0x3f,0x80,0x4d,0xe5,0x3e, +0x7e,0x71,0x3f,0x12,0x2c,0x63,0x7a,0x35,0x40,0xe5,0x2a,0xbe,0xb1,0x3e,0x68,0x15, +0xe5,0x2c,0xbe,0xb1,0x3e,0x68,0xe, 0xe5,0x2b,0xbe,0xb1,0x3f,0x68,0x7, 0xe5,0x2d, +0xbe,0xb1,0x3f,0x78,0xd, 0x7e,0x35,0x40,0x2e,0x35,0x4d,0x7a,0x35,0x4d,0x5, 0x4f, +0x80,0x17,0x5, 0x52,0x7e,0x35,0x40,0x2e,0x35,0x50,0x7a,0x35,0x50,0x7e,0x35,0x33, +0xbe,0x35,0x40,0x58,0x2, 0x5, 0x3d,0xb, 0xe0,0x5, 0x3f,0xe5,0x2d,0xbe,0xb1,0x3f, +0x50,0xac,0x5, 0x3e,0xe5,0x2c,0xbe,0xb1,0x3e,0x50,0x9e,0xe5,0x2c,0x7e,0x71,0x2b, +0x12,0x2c,0x63,0x7e,0x45,0x4d,0x9d,0x43,0xe5,0x2a,0x7e,0x71,0x2d,0x12,0x2c,0x63, +0x9d,0x43,0xe5,0x2a,0x7e,0x71,0x2b,0x12,0x2c,0x63,0x9d,0x43,0xe5,0x2c,0x7e,0x71, +0x2d,0x12,0x2c,0x63,0x7d,0x23,0x7d,0x34,0x9d,0x32,0x7a,0x35,0x4d,0x7e,0x35,0x37, +0x2e,0x35,0x35,0x7a,0x35,0x39,0x30,0x2, 0x10,0x20,0x3, 0xd, 0x7e,0x35,0x4d,0x9e, +0x35,0x39,0x7a,0x35,0x4d,0x15,0x4f,0x15,0x4f,0xe5,0x4f,0xbe,0xb0,0x4, 0x28,0x6, +0xe5,0x4f,0x24,0xfc,0xf5,0x4f,0x7e,0x35,0x4d,0xbe,0x34,0x0, 0x0, 0x58,0x5, 0x6d, +0x33,0x7a,0x35,0x4d,0x75,0x44,0x28,0xe5,0x42,0x14,0xbe,0xb1,0x24,0x68,0xd, 0xbe, +0xb1,0x26,0x68,0x8, 0xe5,0x24,0x60,0x4, 0xe5,0x26,0x70,0x8, 0x12,0xb7,0xbd,0x28, +0x3, 0x75,0x44,0x2c,0x7e,0x15,0x50,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x4d,0x1a,0x26, +0x1a,0x24,0x2f,0x10,0xe5,0x44,0xa, 0x1b,0x6d,0x0, 0x12,0x1f,0x20,0x7f,0x71,0x7a, +0x7d,0x45,0x7e,0x15,0x39,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24, +0x12,0x1f,0x20,0xe5,0x52,0xa, 0xdb,0x6d,0xcc,0xe5,0x4f,0xa, 0x1b,0x6d,0x0, 0x2f, +0x6, 0x12,0x1f,0x20,0x7a,0x1d,0x49,0xbf,0x71,0x8, 0x3, 0x75,0x30,0x2, 0xc2,0x1, +0x20,0xc, 0xe, 0x12,0xb7,0xb1,0x12,0xb9,0x5f,0x92,0x1, 0x20,0x1, 0x3, 0x75,0x30, +0x0, 0xe5,0x30,0xbe,0xb0,0x0, 0x28,0x5e,0xe5,0x30,0xa, 0x3b,0x2e,0x34,0x31,0xf6, +0x12,0xb7,0xc5,0xe5,0x2e,0xa, 0x3b,0x9, 0xa3,0x31,0xfc,0x4c,0xaa,0x78,0xc, 0xa, +0x2c,0x9, 0xb2,0x31,0xfc,0x19,0xb3,0x31,0xfc,0x80,0x3b,0xa, 0x2c,0x9, 0xb2,0x31, +0xfc,0xf5,0x53,0xbc,0xba,0x28,0x3, 0x7a,0xa1,0x53,0x75,0x2f,0x0, 0x80,0x22,0x9, +0x33,0x31,0xfc,0xe5,0x2f,0xa, 0x2b,0x9, 0x22,0x31,0xfc,0xbc,0x23,0x68,0xa, 0xa, +0xc, 0x9, 0x30,0x31,0xfc,0xbc,0x23,0x78,0x6, 0xe5,0x53,0x19,0xb2,0x31,0xfc,0x5, +0x2f,0xbe,0xd1,0x2f,0x38,0xd9,0x5, 0x2e,0xbe,0xd1,0x2e,0x28,0x2, 0x81,0x4d,0xb, +0xc0,0xbc,0xdc,0x28,0x2, 0x81,0x1b,0xda,0x3b,0x22,0x90,0x60,0x9a,0x93,0xa, 0x3b, +0x22,0xe5,0x24,0x7e,0x71,0x25,0x7e,0x61,0x26,0x7e,0x51,0x27,0x22,0x7e,0x73,0x31, +0xfa,0xbe,0x70,0x5, 0x22,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0x22,0x7e,0x71,0x24, +0x74,0x2, 0xac,0x7b,0x9, 0xa3,0x26,0xfa,0x22,0x7e,0x37,0x28,0x8a,0xbe,0x34,0x3, +0xe8,0x8, 0xa, 0x12,0x3f,0x8d,0xbe,0xb0,0x8, 0x48,0x2, 0xd3,0x22,0xc3,0x22,0xca, +0x3b,0x7c,0x45,0x7c,0x6, 0x7c,0x57,0x7c,0x1b,0x7e,0x34,0x4, 0xfc,0x7e,0xb3,0x26, +0x83,0x7e,0xf3,0x2a,0x6e,0x7c,0x31,0x7c,0xe0,0x7c,0x25,0x7c,0xa4,0xbc,0x1, 0x50, +0x4, 0x7c,0x30,0x7c,0xe1,0xbc,0x45,0x50,0x4, 0x7c,0x24,0x7c,0xa5,0xbe,0xb0,0x1, +0x50,0x2, 0x1, 0xb8,0x7e,0x90,0x2, 0xac,0x9f,0x7e,0x50,0x2, 0xac,0x53,0x2d,0x24, +0x2d,0x23,0xb, 0x28,0x20,0x7e,0x10,0x2, 0xac,0x1e,0x2d,0x4, 0x2d,0x3, 0xb, 0x8, +0x40,0xa, 0x3, 0xb, 0x4, 0x7c,0x31,0x80,0x2a,0x7e,0xd0,0x2, 0xac,0xdf,0x7e,0x10, +0x2, 0xac,0x13,0x2d,0x6, 0x12,0xb8,0xbc,0xbd,0xdb,0x58,0x15,0xad,0xf4,0xbd,0xdf, +0x58,0xf, 0xbe,0x24,0x0, 0x0, 0x8, 0x9, 0xbe,0x44,0x0, 0x0, 0x8, 0x3, 0xc3,0x80, +0x48,0xb, 0x30,0xbc,0xe3,0x38,0xd2,0x7e,0x50,0x2, 0xac,0x52,0x2d,0x23,0xb, 0x28, +0x20,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x43,0xb, 0x48,0x40,0xa, 0x12,0xb, 0x14,0x80, +0x23,0x7e,0x10,0x2, 0xac,0x13,0x12,0xb8,0xbc,0xbd,0xdb,0x58,0x15,0xad,0xf4,0xbd, +0xdf,0x58,0xf, 0xbe,0x24,0x0, 0x0, 0x8, 0x9, 0xbe,0x44,0x0, 0x0, 0x8, 0x3, 0xc3, +0x80,0x7, 0xb, 0x30,0xbc,0xa3,0x38,0xd9,0xd3,0xda,0x3b,0x22,0x2d,0x3, 0xb, 0x8, +0x0, 0x7e,0xf4,0x0, 0x9, 0x7d,0xb2,0xad,0xbf,0x7e,0xd4,0x0, 0xa, 0xad,0xd0,0x22, +0xca,0xf8,0x7c,0xfb,0x7f,0x61,0x7f,0x50,0x7e,0x34,0x22,0xe3,0x7e,0x24,0x0, 0xff, +0x7e,0x14,0x1f,0x70,0x74,0x2a,0x12,0x1f,0xe2,0x7e,0x48,0x1f,0x70,0x12,0xb7,0xd9, +0x92,0xc, 0x7c,0xbf,0x7e,0x71,0x54,0x12,0x2c,0x63,0x7d,0x43,0xe5,0x55,0x7e,0x71, +0x56,0x12,0x2c,0x63,0x2d,0x34,0xe, 0x34,0x7f,0x4, 0x7e,0x50,0x7, 0xb, 0xa, 0x50, +0xbd,0x53,0x58,0x10,0x69,0x30,0x0, 0x2, 0x1b,0x5a,0x30,0x69,0x30,0x0, 0x4, 0x1b, +0x6a,0x30,0x80,0x8, 0x2e,0x14,0x0, 0x6, 0x1b,0x50,0x78,0xe1,0x12,0xb7,0xbd,0x28, +0x2b,0xb, 0x5a,0x20,0x7e,0x34,0x0, 0xd, 0xad,0x32,0x7e,0x24,0x0, 0x10,0x12,0x1e, +0xee,0x1b,0x5a,0x30,0xb, 0x6a,0x30,0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, 0xd, 0x12, +0x1f,0x31,0x7e,0x8, 0x0, 0x10,0x12,0x1f,0x8d,0x1b,0x6a,0x30,0xda,0xf8,0x22,0x12, +0xb7,0xef,0x92,0x4, 0x30,0x4, 0xc, 0x7e,0xb3,0x32,0x58,0xbe,0xb0,0xfa,0x50,0x11, +0x4, 0x80,0xa, 0x7e,0xb3,0x32,0x58,0xbe,0xb0,0x0, 0x28,0x5, 0x14,0x7a,0xb3,0x32, +0x58,0x7e,0xb3,0x32,0x58,0x70,0x2, 0xc3,0x22,0xd3,0x22,0x7e,0x8, 0x32,0x59,0x7e, +0x34,0x0, 0xb4,0xe4,0x2, 0x21,0x16,0x7c,0x4b,0x74,0x2, 0xac,0xb4,0x9, 0x55,0x26, +0xfa,0x9, 0x65,0x26,0xfb,0x7e,0x73,0x28,0x8c,0xbc,0x75,0x78,0xa, 0x7e,0x73,0x28, +0x8d,0xbc,0x76,0x78,0x2, 0xd3,0x22,0xc3,0x22,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x13,0xc6,0x49,0x32,0x13,0x8e,0xbd,0x31,0x28,0x9, 0x2e,0x24, +0x13,0x8e,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x38, +0xdc,0x22,0xca,0x78,0xa9,0x31,0xe5,0x6, 0xa9,0xd5,0xea,0xa9,0xc5,0xea,0xa9,0x30, +0xe5,0x19,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0x5, 0x5d,0x7e,0x73,0x3b,0x56,0xbe,0x71, +0x5d,0x38,0x2, 0xd2,0x1a,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0xa9,0x34,0xe5,0x5, 0xa9, +0xc4,0xcd,0xc2,0x95,0xa9,0x32,0xe5,0x3, 0xa9,0xc2,0xcd,0xa9,0x33,0xe5,0x3, 0xa9, +0xc3,0xcd,0xa9,0x37,0xe5,0x3, 0xa9,0xc7,0xcd,0xa9,0x36,0xe5,0x3, 0xa9,0xc6,0xcd, +0xda,0x78,0x32,0xc2,0x9a,0xa9,0xd4,0xa6,0xc2,0x88,0xd2,0xa8,0x22,0x7e,0x14,0xd7, +0xe8,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,0xa9,0xd0,0xce,0xa2,0x0, 0xa9,0x95,0xc9,0x22,0xa9,0xd5, +0xcb,0x74,0x10,0x12,0x49,0x2a,0x7c,0x7b,0x12,0x4b,0xb1,0x30,0xe7,0x3, 0x7e,0x70, +0x2, 0xd2,0xcd,0x7e,0x24,0x0, 0xef,0x7e,0xf, 0x3b,0x8, 0x79,0x20,0x0, 0x84,0x7e, +0x24,0x20,0x5f,0x7e,0xf, 0x3b,0x8, 0x79,0x20,0x0, 0x82,0x7e,0x24,0x41,0x0, 0x7e, +0xf, 0x3b,0x8, 0x79,0x20,0x0, 0x90,0x7c,0x67,0x6c,0x77,0x2e,0x34,0x0, 0xc1,0x7e, +0xf, 0x3b,0x8, 0x79,0x30,0x0, 0x86,0x7e,0x34,0x29,0x90,0x7e,0xf, 0x3b,0x8, 0x79, +0x30,0x0, 0x8a,0x7e,0x34,0x6a,0xd1,0x7e,0xf, 0x3b,0x8, 0x79,0x30,0x0, 0x8c,0x7e, +0x34,0x3, 0x61,0x7e,0xf, 0x3b,0x8, 0x79,0x30,0x0, 0x8e,0x22,0xa9,0xc6,0xeb,0xa9, +0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0xa9,0xc2,0xeb,0xa9,0xd2,0xac,0xa9,0xd2,0xec, +0xd2,0x82,0x22,0x75,0x9a,0x2f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x22,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,0xc1,0xb7,0xc2,0xb9,0xa9, +0xc3,0xb7,0xc2,0xbb,0xa9,0xc6,0xb7,0xc2,0xbe,0x22,0x7e,0x37,0x3b,0x54,0xb, 0x34, +0x7a,0x37,0x3b,0x54,0xbe,0x34,0xff,0x0, 0x40,0x8, 0x7e,0x34,0xff,0x0, 0x7a,0x37, +0x3b,0x54,0x22,0x6d,0x22,0x80,0x13,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6, +0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, 0x14,0xb, 0x24,0xbd,0x32,0x38,0xe9,0x22,0x7f, +0x71,0x69,0x37,0x0, 0x2, 0x7d,0x53,0x12,0xbb,0xe9,0xb, 0x7a,0x20,0x2d,0x25,0x1b, +0xa, 0x20,0x69,0x27,0x0, 0x4, 0x7d,0x52,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x1e,0x34, +0x1e,0x34,0x2d,0x35,0x79,0x30,0x0, 0x2, 0x69,0x37,0x0, 0x6, 0x7d,0x53,0x7c,0xab, +0xe4,0x3e,0x54,0x3e,0x54,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x2d,0x25,0x79, +0x20,0x0, 0x4, 0x69,0x27,0x0, 0x8, 0x7c,0x45,0x6c,0x55,0x12,0x25,0x6f,0x1e,0x34, +0x1e,0x34,0x2d,0x32,0x79,0x30,0x0, 0x6, 0x22,0x3, 0x3, 0x54,0xc0,0x7c,0xab,0xe4, +0x22,0x6d,0x33,0x90,0x60,0x91,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xbc,0xee, +0x90,0x60,0x92,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xbc,0x55,0x22,0x12,0xaf, +0xf2,0x7e,0x34,0xd, 0xc8,0x7e,0xb3,0x2a,0x6d,0x12,0xbc,0x2a,0x12,0xbb,0xf1,0x7a, +0x37,0x3b,0x1e,0x74,0x1, 0x7a,0xb3,0x16,0x91,0x22,0x7a,0xb3,0x24,0xf2,0x7e,0x53, +0x2a,0x6e,0x7a,0x53,0x24,0xf3,0x7a,0x37,0x24,0xfa,0xe4,0x7a,0xb3,0x24,0xf4,0x7a, +0xb3,0x24,0xf5,0x7e,0x34,0x40,0x0, 0x7a,0x37,0x24,0xf6,0x7e,0x34,0x0, 0x20,0x12, +0x7f,0xcd,0x2, 0xd, 0x7, 0xca,0xf8,0x6d,0xee,0x7d,0xfe,0x7e,0x83,0x2a,0x6e,0xa, +0xd8,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x2f,0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80, +0x18,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x23,0x13,0xfe,0x7f,0x50,0x2d,0xb3,0xb, 0x5a, +0xc0,0x9d,0xc2,0x59,0xc3,0x13,0xc6,0xb, 0xa0,0xbc,0x8a,0x38,0xe4,0x90,0x60,0x92, +0xe4,0x93,0x7c,0x9b,0x6d,0xdd,0x80,0x11,0x7e,0x8, 0x13,0xfe,0x90,0x60,0x92,0xe4, +0x93,0xa, 0xcb,0x1b,0xc4,0x7d,0x3c,0x7c,0x97,0x6c,0xff,0x80,0x38,0x6c,0xaa,0x80, +0x28,0xa, 0x3a,0x7d,0x23,0x2d,0x2e,0x3e,0x24,0x49,0xc2,0x13,0xfe,0x2d,0x3d,0x3e, +0x34,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xb0,0x7d,0x3c,0x9d,0x3b,0x12,0x21,0x48,0x7d, +0xa3,0xbd,0xfa,0x58,0x2, 0x7d,0xfa,0xb, 0xa0,0xbc,0x8a,0x38,0xd4,0xa, 0xc8,0x2d, +0xec,0x2d,0xdc,0xb, 0xf0,0xbc,0x9f,0x38,0xc4,0x7d,0x3f,0xda,0xf8,0x22,0xca,0xf8, +0x6d,0x44,0x7e,0xf3,0x2a,0x6e,0x90,0x60,0x93,0xe4,0x93,0xa, 0xfb,0x7e,0xb3,0x2a, +0x6d,0xa, 0xeb,0x2d,0xef,0xa, 0xff,0xad,0xfe,0xa, 0xef,0x2d,0xef,0x90,0x60,0x94, +0xe4,0x93,0xb4,0xff,0x31,0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x23,0xa, 0xda,0x2d, +0xdf,0x3e,0xd4,0x7e,0x1f,0x3b,0x21,0x2d,0x3d,0xb, 0x1a,0xd0,0x7e,0x50,0x2, 0xac, +0x5a,0x7f,0x50,0x2d,0xb2,0xb, 0x5a,0x30,0x9d,0x3d,0x59,0x32,0x13,0xc6,0xb, 0xa0, +0xbc,0xfa,0x38,0xd9,0x80,0xa, 0x7d,0x5e,0x3e,0x54,0x7e,0xf, 0x3b,0x21,0x2d,0x15, +0x6c,0xaa,0x80,0x2c,0xa, 0xea,0x2d,0xef,0x3e,0xe4,0x7e,0x1f,0x3b,0x21,0x2d,0x3e, +0xb, 0x1a,0xe0,0x7e,0x70,0x2, 0xac,0x7a,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xd0,0x7d, +0x3e,0x9d,0x3d,0x12,0x21,0x48,0x7d,0xc3,0xbd,0x4c,0x58,0x2, 0x7d,0x4c,0xb, 0xa0, +0xbc,0xfa,0x38,0xd0,0x7d,0x34,0xda,0xf8,0x22,0x7e,0xb3,0x39,0x49,0x22,0x7c,0xab, +0x9f,0x11,0x30,0x0, 0x22,0x6c,0x99,0x80,0x1a,0xa, 0xf9,0x2d,0xf1,0x7d,0xe0,0x7e, +0x7b,0xb0,0x7e,0x78,0x0, 0x1, 0x60,0x5, 0x2f,0x77,0x14,0x78,0xfb,0x4d,0x3f,0x4d, +0x2e,0xb, 0x90,0xbc,0xa9,0x38,0xe2,0x22,0xca,0xf8,0x90,0x60,0x51,0xe4,0x93,0x7c, +0xfb,0x7e,0x8, 0x1f,0x34,0x12,0xbe,0x44,0x7e,0x8, 0x1f,0x3c,0x12,0xbe,0x4c,0xd2, +0x0, 0x7e,0x8, 0x2a,0xdc,0x7c,0xbf,0x12,0xbd,0x8e,0x7e,0x8, 0x1f,0x34,0x7a,0xf, +0x1f,0x58,0x7f,0x1, 0x7a,0x17,0x1f,0x5c,0x7d,0x32,0x7a,0x37,0x1f,0x5e,0x7e,0x18, +0x1f,0x3c,0x7a,0x1f,0x1f,0x64,0x6c,0x77,0x80,0xe, 0x12,0xbe,0x94,0x50,0x7, 0x12, +0xbe,0x8b,0x19,0x51,0x1f,0x3c,0xb, 0x70,0xbc,0xf7,0x38,0xee,0x12,0xbe,0x31,0xe4, +0x12,0xbe,0x39,0xe4,0x12,0xc, 0x9b,0x6d,0x33,0x7a,0x37,0x1f,0x5c,0x7a,0x37,0x1f, +0x5e,0x12,0xbe,0x31,0x74,0x1, 0x12,0xbe,0x39,0x74,0x1, 0x12,0xc, 0x9b,0xda,0xf8, +0x22,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x12,0xc, 0x9b,0xa9,0xd6,0xea,0x7e, +0x8, 0x1f,0x58,0x22,0x7e,0x34,0x0, 0x8, 0xe4,0x2, 0x21,0x16,0x7e,0x34,0x0, 0x1c, +0x74,0x3f,0x2, 0x21,0x16,0x7e,0x8, 0x1f,0x34,0x12,0xbe,0x4c,0x6c,0x77,0x80,0xe, +0x12,0xbe,0x94,0x50,0x7, 0x12,0xbe,0x8b,0x19,0x51,0x1f,0x34,0xb, 0x70,0x7e,0x53, +0x2a,0x6e,0xbc,0x57,0x38,0xea,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x11, +0x38,0xa9,0xd6,0xea,0x7e,0x8, 0x1f,0x34,0x2, 0x11,0x38,0xa, 0x27,0x9, 0x52,0x2b, +0x44,0xa, 0x16,0x22,0xa, 0x27,0x9, 0x62,0x2a,0xdc,0xbe,0x60,0x1c,0x22,0x7c,0x57, +0x7c,0xab,0x6c,0x77,0x80,0x50,0xa, 0x47,0x7e,0x7d,0x24,0x2d,0xf4,0x7e,0x7b,0x60, +0xa, 0x46,0x2e,0x44,0x20,0xab,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93,0x7c,0x6b, +0xbe,0x60,0xd, 0x38,0x12,0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, 0x3e,0xd4,0x14, +0x78,0xfb,0x7e,0x7d,0x28,0x80,0x15,0x9e,0x60,0xe, 0x7e,0xd4,0x0, 0x1, 0x7c,0xb6, +0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf5,0xb, 0x7a,0x40,0x4d, +0x4d,0x1b,0x7a,0x40,0xb, 0x70,0xbc,0x57,0x38,0xac,0x6c,0x77,0x80,0x58,0xa, 0x27, +0x7f,0x70,0x2d,0xf2,0x7e,0x7b,0x60,0xbe,0x60,0xd, 0x38,0x11,0x12,0xbf,0x5b,0x60, +0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf6,0x80,0x2f,0xbe,0x60,0x1b, +0x38,0x16,0x9e,0x60,0xe, 0x12,0xbf,0x5b,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e, +0x7d,0x28,0x2e,0xf4,0x0, 0x6, 0x80,0x14,0x9e,0x60,0x1c,0x12,0xbf,0x5b,0x60,0x5, +0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x8, 0xb, 0x7a,0x20,0x4d, +0x24,0x1b,0x7a,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xa4,0x22,0x7e,0x44,0x0, 0x1, 0x7c, +0xb6,0x22,0x7c,0x7b,0xa5,0xbf,0x0, 0x3, 0x74,0x10,0x22,0xbe,0x70,0x4, 0x38,0x4, +0x6c,0xaa,0x80,0x21,0xbe,0x70,0x8, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x70, +0x10,0x38,0x5, 0x7e,0xa0,0x2, 0x80,0xd, 0xbe,0x70,0x20,0x38,0x5, 0x7e,0xa0,0x3, +0x80,0x3, 0x7e,0xa0,0x4, 0xa, 0x47,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7c,0xba,0x60, +0x5, 0x1e,0x44,0x14,0x78,0xfb,0x7c,0xb9,0x22,0x7a,0xb3,0x39,0x54,0x22,0x90,0x61, +0x81,0xe4,0x93,0x22,0x7e,0x43,0x2a,0x6e,0x7e,0x53,0x2a,0x6d,0xac,0x54,0x7e,0x17, +0x28,0xa1,0x12,0xc9,0x26,0x6d,0x0, 0x80,0x37,0x7d,0x40,0x3e,0x44,0x7e,0x7f,0x3b, +0x21,0x2d,0xf4,0xb, 0x7a,0x30,0xbd,0x13,0x58,0x10,0x7d,0xf4,0x2e,0xf4,0x8, 0xa, +0xb, 0xf8,0x50,0x9d,0x51,0x1b,0xf8,0x50,0x80,0x14,0x6d,0x55,0x9d,0x51,0xbd,0x53, +0x8, 0xc, 0x2e,0x44,0x8, 0xa, 0xb, 0x48,0x50,0x2d,0x51,0x1b,0x48,0x50,0xb, 0x4, +0xbd,0x20,0x38,0xc5,0x22,0x7e,0x27,0x28,0xa3,0x6d,0x11,0x9d,0x12,0x6c,0xaa,0x80, +0x64,0x30,0x5, 0x2e,0x7e,0x90,0x2, 0xac,0x9a,0x49,0x34,0x5, 0xf8,0x49,0x4, 0x4, +0x0, 0xbd,0x2, 0x8, 0x11,0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3, +0x59,0xf4,0x5, 0xf8,0x80,0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, +0x5, 0xf8,0x30,0x7, 0x2e,0x7e,0x90,0x2, 0xac,0x9a,0x49,0x34,0x6, 0x76,0x49,0x4, +0x4, 0x7e,0xbd,0x2, 0x8, 0x11,0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d, +0xf3,0x59,0xf4,0x6, 0x76,0x80,0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59, +0x4, 0x6, 0x76,0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xa, 0xb, 0x7e,0xb3,0x2a,0x73,0xa, +0x4b,0x2d,0x40,0xa, 0xa, 0xbd,0x4, 0x48,0x88,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,0x3b,0x4b,0xa, 0x47,0x5d,0x42,0x7e,0x73,0x39,0x7a, +0x80,0x36,0xa5,0xbe,0x30,0x18,0x12,0xc0,0xfd,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0x7e,0x53,0x3b,0x4c,0xa, 0x45,0x5d,0x43,0x7e,0x73,0x39,0x7b,0x80,0x1a,0x12,0xc0, +0xfd,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x2a,0x9, 0xb2,0x3b,0x4b,0xa, 0x4b, +0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x39,0x7c,0xa, 0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54, +0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x7e,0xb3,0x39,0x79,0x70,0x6, 0x12,0xc1,0x3f,0x2, +0xc2,0x98,0x12,0x58,0xe3,0x12,0xc2,0x9e,0x50,0xa, 0x12,0xaf,0x4c,0x7c,0x3b,0x12, +0xc1,0x3f,0x80,0x5, 0x12,0xc1,0x45,0x7c,0x3b,0x4c,0x33,0x68,0x11,0x7c,0xb3,0x12, +0xc0,0x8a,0x60,0xa, 0x7a,0x33,0x39,0x7c,0x74,0x1, 0x7a,0xb3,0x2a,0x8, 0x22,0xe4, +0x7a,0xb3,0x2f,0x80,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d, +0xfd,0x7e,0xd3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7e,0xb3,0x3b,0x36,0x60,0x11,0x7e, +0xc7,0x3b,0x3f,0x4d,0xcc,0x78,0x2, 0x41,0x39,0xbe,0xd0,0x1, 0x28,0x2, 0x41,0x39, +0xbe,0xd0,0x1, 0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0x41,0x39,0x7e,0xe7,0x29,0x8, +0x7e,0xf7,0x29,0xa, 0x7d,0x3e,0x7d,0x2f,0x12,0x5c,0xc2,0xbe,0xb0,0x1, 0x78,0x2, +0x41,0x39,0x7e,0xa3,0x3b,0x36,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68, +0x23,0x14,0x78,0x2, 0x41,0x36,0xb, 0xb2,0x68,0x2, 0x41,0x39,0xbe,0xd0,0x1, 0x68, +0x2, 0x41,0x48,0x4c,0xee,0x68,0x2, 0x41,0x48,0x74,0x1, 0x7a,0xb3,0x3b,0x36,0x12, +0xc2,0x4f,0x80,0x65,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a, +0xb3,0x3b,0x36,0x7e,0x34,0x62,0x64,0x80,0x54,0x74,0x4, 0x7a,0xb3,0x3b,0x36,0x7e, +0x34,0x62,0x68,0x80,0x48,0x12,0xc2,0x58,0x90,0x62,0x57,0x12,0xc2,0x61,0x68,0x49, +0x80,0x56,0xbe,0xd0,0x1, 0x78,0x51,0x4c,0xee,0x78,0x4d,0x12,0xc2,0x58,0x7e,0x34, +0x62,0x60,0x12,0x23,0xc9,0x7e,0x14,0x62,0x64,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xc0, +0x9d,0xc3,0xbe,0xc7,0x3b,0x3f,0x40,0x21,0x90,0x62,0x56,0x12,0xc2,0x61,0x68,0x19, +0x12,0xc2,0x4f,0x74,0x3, 0x7a,0xb3,0x3b,0x36,0x7e,0x34,0x62,0x64,0x12,0x23,0xc9, +0x7a,0x37,0x3b,0x3f,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x3b,0x36,0x6d,0x33, +0x7a,0x37,0x3b,0x3f,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0x7a, +0xe7,0x3b,0x37,0x7a,0xf7,0x3b,0x39,0x22,0x7a,0xe7,0x3b,0x3b,0x7a,0xf7,0x3b,0x3d, +0x22,0xe4,0x93,0xa, 0x3b,0x12,0xc2,0x6d,0xa, 0xdb,0x4d,0xdd,0x22,0x7d,0x13,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x7e,0x37,0x3b,0x3b,0x9e,0x37,0x3b,0x37,0x12,0x21,0x48, +0xbd,0x31,0x38,0x12,0x7e,0x37,0x3b,0x3d,0x9e,0x37,0x3b,0x39,0x12,0x21,0x48,0xbd, +0x31,0x38,0x3, 0x74,0x1, 0x22,0xe4,0x22,0xe4,0x7a,0xb3,0x3b,0x36,0x22,0x7e,0xb3, +0x2f,0x80,0xb4,0x4, 0x2, 0xd3,0x22,0xc3,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x2f, +0x80,0x7e,0x34,0x0, 0x28,0xe4,0x12,0x21,0x16,0x7e,0x8, 0x2b,0xbf,0x7e,0x34,0x3, +0xc0,0x12,0x21,0x16,0x7a,0xb3,0x39,0x7c,0x7e,0x34,0x62,0x8e,0x12,0x23,0xc9,0x7a, +0x37,0x2b,0xb7,0x7a,0xe7,0x2f,0x84,0x7a,0xf7,0x2f,0x86,0x7a,0xe7,0x2f,0x88,0x7a, +0xe7,0x2f,0x8c,0x7a,0xe7,0x2f,0x90,0x7a,0xe7,0x2f,0x94,0x7a,0xf7,0x2f,0x8a,0x7a, +0xf7,0x2f,0x8e,0x7a,0xf7,0x2f,0x92,0x7a,0xf7,0x2f,0x96,0x7a,0xe7,0x2b,0xbb,0x7a, +0xf7,0x2b,0xbd,0x7a,0xb3,0x2f,0xa8,0x74,0x2, 0x7a,0xb3,0x2f,0x7f,0x22,0x74,0xfe, +0x7a,0xb3,0x39,0x7c,0xe4,0x7a,0xb3,0x2f,0x80,0x22,0xca,0x3b,0xf5,0x2a,0x7f,0x31, +0x7a,0xd, 0x26,0xe4,0x7a,0xb3,0x22,0xf6,0x7a,0xb3,0x22,0xf7,0x7a,0xb3,0x22,0xf8, +0x7e,0x34,0x3, 0xe8,0x7a,0x37,0x22,0xfd,0x74,0x3c,0x7a,0xb3,0x22,0xf5,0x75,0x2f, +0x46,0x75,0x2b,0x0, 0xa1,0xb, 0x12,0xc6,0xa6,0x28,0x1e,0x7e,0x34,0x0, 0x44,0xca, +0x39,0x7e,0x71,0x2b,0x74,0x44,0xac,0x7b,0x2e,0x34,0x14,0x3b,0x7e,0x24,0x0, 0xff, +0x7e,0x8, 0x22,0xff,0x12,0x20,0xf1,0x1b,0xfd,0x6d,0x33,0x7a,0x37,0x22,0xf9,0x7a, +0x35,0x30,0x7a,0x37,0x22,0xfb,0x7a,0x35,0x32,0x7a,0x35,0x34,0x7e,0x34,0x22,0xff, +0x7a,0x35,0x36,0x7e,0x34,0x23,0x1f,0x7a,0x35,0x38,0x75,0x2c,0x0, 0x80,0x59,0xe5, +0x2c,0xa, 0x3b,0x7e,0xd, 0x26,0x12,0xc6,0xae,0x2e,0x35,0x36,0x12,0x67,0xae,0x7d, +0xd3,0x7e,0xc7,0x22,0xfb,0xbd,0xcd,0x58,0x4, 0x7a,0xd7,0x22,0xfb,0xe5,0x2c,0xa, +0x3b,0x7f,0x3, 0x12,0xc6,0xae,0x2e,0x35,0x38,0x12,0x67,0xae,0x7d,0xc3,0x7e,0x35, +0x32,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x32,0x7e,0x37,0x22,0xf9,0x2d,0x3d,0x7a,0x37, +0x22,0xf9,0x7d,0x3c,0x2e,0x35,0x30,0x7a,0x35,0x30,0x2d,0xcd,0x7e,0x35,0x34,0xbd, +0x3c,0x58,0x3, 0x7a,0xc5,0x34,0x5, 0x2c,0xe5,0x2a,0xbe,0xb1,0x2c,0x38,0xa0,0xe5, +0x2a,0xb4,0xa, 0x2a,0x7e,0x37,0x22,0xfb,0xbe,0x34,0x0, 0x40,0x48,0xb, 0x7e,0x25, +0x32,0xbe,0x24,0x0, 0x40,0x48,0x2, 0xa1,0x9, 0xbe,0x34,0x0, 0x60,0x8, 0x2, 0xa1, +0x9, 0x7e,0x35,0x32,0xbe,0x34,0x0, 0x60,0x8, 0x2, 0xa1,0x9, 0x80,0x28,0x7e,0x37, +0x22,0xfb,0xbe,0x34,0x0, 0x20,0x8, 0xb, 0x7e,0x25,0x32,0xbe,0x24,0x0, 0x20,0x8, +0x2, 0xa1,0x9, 0xbe,0x34,0x0, 0x30,0x8, 0x2, 0xa1,0x9, 0x7e,0x35,0x32,0xbe,0x34, +0x0, 0x30,0x8, 0x2, 0xa1,0x9, 0x7e,0xa3,0x3a,0x89,0x74,0xc, 0xa4,0xbe,0x57,0x22, +0xf9,0x58,0x2, 0xa1,0x9, 0x7e,0xa3,0x3a,0x8a,0x74,0xc, 0xa4,0xbe,0x55,0x30,0x58, +0x2, 0xa1,0x9, 0x7e,0x15,0x36,0x6d,0x0, 0x7e,0x1d,0x26,0xe5,0x2a,0x12,0xc5,0x46, +0x7a,0xb3,0x22,0xf4,0x7e,0x15,0x38,0x6d,0x0, 0x7f,0x13,0xe5,0x2a,0x12,0xc5,0x46, +0xf5,0x2d,0x7e,0x73,0x22,0xf5,0xbe,0x73,0x22,0xf4,0x38,0x7d,0xbe,0x71,0x2d,0x38, +0x78,0xe5,0x2d,0x7e,0x31,0x2d,0xac,0x3b,0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x22,0xf4, +0xac,0x77,0x1a,0x26,0x1a,0x24,0x2f,0x10,0xe5,0x2d,0xa, 0x5b,0x6d,0x44,0x7e,0x33, +0x22,0xf4,0xa, 0x13,0x6d,0x0, 0x2f,0x2, 0x12,0x1f,0x3c,0x7c,0xb7,0xf5,0x2e,0xe5, +0x2f,0xbe,0xb1,0x2e,0x38,0x43,0x7e,0x37,0x22,0xfb,0x2e,0x35,0x32,0x2e,0x35,0x34, +0x7a,0x35,0x3a,0xe5,0x2e,0xa, 0x2b,0x7e,0x34,0x0, 0x64,0x9d,0x32,0x3e,0x34,0x2e, +0x35,0x3a,0x7a,0x35,0x3a,0x7e,0x37,0x22,0xfd,0xbe,0x35,0x3a,0x8, 0x1b,0x7e,0x35, +0x3a,0x7a,0x37,0x22,0xfd,0xe5,0x2e,0x7a,0xb3,0x22,0xf7,0x7e,0x73,0x23,0x41,0x7a, +0x73,0x22,0xf8,0xe5,0x2b,0x7a,0xb3,0x22,0xf6,0x5, 0x2b,0x12,0xc6,0xa6,0x28,0x2, +0x61,0x46,0x7e,0xa3,0x22,0xf7,0xbe,0xa1,0x2f,0x40,0x20,0x7e,0xb3,0x22,0xf8,0xbe, +0xb0,0x0, 0x28,0x17,0xbe,0xb0,0xff,0x50,0x12,0x7e,0x73,0x22,0xf6,0xa, 0x37,0xb, +0x34,0x7a,0x73,0x3a,0x86,0x7a,0xb3,0x3a,0x88,0x80,0x6, 0x74,0x7c,0x7a,0xb3,0x3a, +0x86,0x7c,0xba,0xda,0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x7f,0x61,0x7f,0x40,0x9f,0x11, +0x7f,0x51,0x7f,0x71,0x7a,0x1d,0x3c,0x7a,0x1d,0x40,0x7a,0x1d,0x44,0xbe,0xf0,0xa, +0x78,0x6, 0x7e,0x54,0x1, 0x3c,0x80,0x4, 0x7e,0x54,0x2, 0x35,0x7a,0x57,0x23,0x43, +0x6c,0xee,0x80,0x60,0xa, 0x5e,0x7f,0x14,0x12,0xc6,0x9e,0x7a,0x55,0x4a,0xa, 0x5e, +0x7f,0x16,0x12,0xc6,0x9e,0x7a,0x55,0x48,0x7e,0x35,0x48,0x12,0xc6,0x97,0x2f,0x50, +0x7e,0x65,0x4a,0x7d,0x16,0x1a,0x2, 0x1a,0x0, 0x2f,0x70,0x12,0xc6,0x97,0x12,0xc6, +0x8d,0x7e,0x1d,0x3c,0x2f,0x10,0x7a,0x1d,0x3c,0x7d,0x16,0x1a,0x2, 0x1a,0x0, 0x7e, +0x35,0x4a,0x12,0xc6,0x8d,0x7e,0x1d,0x40,0x2f,0x10,0x7a,0x1d,0x40,0x7e,0x15,0x4a, +0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x48,0x12,0xc6,0x8d,0x7e,0x1d,0x44,0x2f,0x10,0x7a, +0x1d,0x44,0xb, 0xe0,0xbc,0xfe,0x38,0x9c,0xa, 0xdf,0x6d,0xcc,0x7f,0x15,0x7f,0x6, +0x12,0x1f,0x8d,0x7f,0x51,0x7f,0x17,0x7f,0x6, 0x12,0x1f,0x8d,0x7f,0x71,0x7e,0x94, +0x0, 0x64,0x7e,0x1d,0x3c,0x7d,0x19,0x12,0x1f,0x31,0x7e,0x87,0x23,0x43,0x7d,0x18, +0x7d,0xd8,0x1a,0x12,0x1a,0xc2,0x7f,0x6, 0x12,0x1f,0x8d,0x7a,0x1d,0x3c,0x7e,0x1d, +0x40,0x7d,0x19,0x12,0x1f,0x31,0x7f,0x6, 0x12,0x1f,0x8d,0x7a,0x1d,0x40,0x7e,0x1d, +0x44,0x7d,0x19,0x12,0x1f,0x31,0x7d,0x18,0x1a,0x2, 0x1a,0x0, 0x12,0x1f,0x8d,0x7a, +0x1d,0x44,0x7f,0x15,0x7f,0x7, 0x12,0x1f,0x20,0x7e,0x6d,0x44,0x9f,0x61,0x7f,0x15, +0x7f,0x5, 0x12,0x1f,0x20,0x7e,0x5d,0x3c,0x9f,0x51,0x7f,0x17,0x7f,0x7, 0x12,0x1f, +0x20,0x7e,0x7d,0x40,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,0x1f,0x31,0x7f, +0x5, 0x12,0x1f,0x8d,0x7f,0x6, 0x12,0x1f,0x20,0x7f,0x7, 0x12,0x1f,0x8d,0x7d,0x43, +0xbe,0x44,0x0, 0x0, 0x18,0x2, 0x6d,0x44,0x7c,0xb9,0xda,0x3b,0x22,0x1a,0x26,0x1a, +0x24,0x12,0x1f,0x20,0x7f,0x1, 0x22,0x7d,0x13,0x1a,0x2, 0x1a,0x0, 0x22,0x2d,0x35, +0x7e,0x1b,0x70,0xa, 0x57,0x22,0x7e,0x73,0x3b,0x51,0xbe,0x71,0x2b,0x22,0x2d,0x13, +0x7e,0xb, 0x50,0xa, 0x25,0x22,0xca,0x79,0x6c,0xaa,0x12,0xc7,0xac,0xb, 0x7a,0xf0, +0x7d,0x7f,0x7c,0xbf,0xa, 0xfa,0x19,0xbf,0x3a,0x8b,0x7f,0x71,0x2d,0xf4,0xb, 0x7a, +0x40,0x7c,0xb9,0xa, 0x4a,0x19,0xb4,0x3a,0xab,0xb, 0xa0,0xbe,0xa0,0x20,0x40,0xda, +0x7e,0x8, 0x3a,0x8b,0x7e,0x18,0x3a,0xab,0x74,0x20,0x12,0xc3,0x1a,0xda,0x79,0x22, +0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x3a,0x87,0xbe,0x70,0x20,0x40,0x52,0x7e, +0xf0,0x2, 0x80,0x3c,0xa, 0x3f,0x6d,0x22,0x74,0x5, 0x2f,0x11,0x14,0x78,0xfb,0x7e, +0x33,0x3a,0x87,0xa, 0x13,0x6d,0x0, 0x12,0x1f,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,0xc7,0x5a,0x7f,0x6, 0x7c,0xbd,0x7c,0x7c,0x12,0xc7,0x5a,0xb, 0xf0, +0x7e,0x73,0x3a,0x87,0xbc,0x7f,0x50,0xbc,0x7f,0x5, 0x7f,0x16,0x12,0xc6,0xb6,0x80, +0x6, 0x74,0x7e,0x7a,0xb3,0x3a,0x86,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,0x1a,0x3, +0x1b,0x7a,0x0, 0xbc,0x9a,0x68,0x24,0x6d,0x44,0x74,0x2, 0xa4,0x2d,0x35,0x1b,0x1a, +0x40,0x22,0xbc,0x9a,0x68,0x15,0x1a,0x2, 0x1a,0x13,0x2d,0x10,0xe, 0x14,0x1b,0x7a, +0x10,0x6d,0x11,0x74,0x2, 0xa4,0x2d,0x35,0x1b,0x1a,0x10,0x22,0x7e,0x90,0x2, 0xac, +0x9a,0x7f,0x70,0x2d,0xf4,0x22,0xca,0xf8,0x7f,0x51,0x7f,0x40,0x7e,0x37,0x2f,0x90, +0x7a,0x35,0x2a,0x7e,0x37,0x2f,0x8e,0x7a,0x35,0x2c,0x7e,0x37,0x2f,0x9c,0x7a,0x35, +0x26,0x7e,0x37,0x2f,0x9e,0x7a,0x35,0x28,0x6c,0xff,0x80,0x1e,0x7e,0x34,0x0, 0x26, +0x7e,0x14,0x0, 0x2f,0x74,0x9, 0x12,0x1f,0xc1,0x74,0x2, 0xac,0xbf,0x7f,0x4, 0x2d, +0x15,0x7f,0x15,0x2d,0x35,0x12,0xc8,0x5, 0xb, 0xf0,0x7e,0x73,0x3a,0x87,0xbc,0x7f, +0x38,0xda,0xda,0xf8,0x22,0x7f,0x71,0x7f,0x60,0x7e,0x35,0x2f,0xbe,0x34,0x0, 0x0, +0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x2f,0x7e,0x35,0x31,0xbe,0x34,0x0, 0x0, +0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x31,0xb, 0x6a,0x30,0x9e,0x35,0x33,0x6d, +0x22,0x7e,0x33,0x3a,0x89,0x12,0xc8,0x5a,0x7e,0x15,0x2f,0x12,0x1f,0x3a,0x1b,0x6a, +0x30,0xb, 0x7a,0x30,0x9e,0x35,0x35,0x6d,0x22,0x7e,0x33,0x3a,0x8a,0x12,0xc8,0x5a, +0x7e,0x15,0x31,0x12,0x1f,0x3a,0x1b,0x7a,0x30,0x22,0xa, 0x13,0x6d,0x0, 0x2, 0x1f, +0x20,0x74,0x1, 0x7a,0xb3,0x39,0xe8,0x7e,0x34,0x60,0xa3,0x22,0x7e,0xa3,0x2a,0x6e, +0x7e,0xb3,0x2a,0x6d,0xa4,0x22,0x74,0x1, 0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x1d, +0x22,0x7e,0x18,0x5, 0xf8,0x7a,0x1f,0x6, 0xf4,0x22,0xa, 0x3b,0x2d,0x39,0x7d,0x28, +0x7e,0x1b,0xb0,0x22,0x49,0x23,0x38,0x52,0x49,0x33,0x38,0x4e,0x9d,0x32,0x2, 0x21, +0x48,0xa, 0x47,0x7f,0x70,0x2d,0xf4,0x7e,0x7b,0x60,0xbc,0x6b,0x22,0x3e,0x44,0x7e, +0x1f,0x13,0x8a,0x2d,0x34,0x1b,0x1a,0x50,0x22,0x6d,0x33,0xe4,0x6c,0x55,0x2, 0x13, +0x36,0x6e,0x34,0xff,0xff,0xb, 0x34,0x7a,0x37,0x2a,0x5e,0x22,0xe4,0x7a,0xb3,0x38, +0x37,0x7a,0xb3,0x38,0x3f,0x22,0xa, 0x2c,0x2e,0x27,0x2a,0xfe,0x7e,0x29,0x70,0x22, +0x7e,0x34,0x0, 0x3e,0x74,0xff,0x2, 0x21,0x16,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x61, +0x57,0x22,0x7e,0xe3,0x2a,0x6f,0x7e,0xd3,0x2a,0x70,0x22,0x7e,0x37,0x25,0xf4,0x7a, +0x37,0x36,0xaa,0x22,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x36,0xac,0x22,0x7e,0x73,0x3a, +0x5, 0x7a,0x73,0x2b,0x20,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x80,0x22,0x12,0x0, +0x1e,0x7e,0xb3,0x2a,0xfc,0x22,0xa9,0xd1,0xcb,0xe4,0x2, 0x0, 0xe, 0x90,0x61,0xc5, +0xe4,0x93,0x7c,0xdb,0x22,0x7e,0x73,0x26,0xf5,0xbe,0x70,0x0, 0x22,0x7e,0x73,0x26, +0xf4,0xbe,0x70,0x0, 0x22,0x7e,0x73,0x28,0x92,0xbe,0x70,0x0, 0x22,0x7e,0xb3,0x39, +0x79,0xbe,0xb0,0x1, 0x22,0x7e,0x73,0x2a,0x2, 0xbe,0x70,0x0, 0x22,0x90,0x60,0xa7, +0xe4,0x93,0x7c,0xab,0x22,0xff,0xc9,0x66,0x36,0x99,0x9e,0x61,0x15,0x79, \ No newline at end of file