From 81ad735442d1c4ddce3f6b6abdd5042c7bc553af Mon Sep 17 00:00:00 2001 From: Adrian Chiris Date: Tue, 12 Jan 2016 16:57:54 +0200 Subject: [PATCH] ported MFT-4.3.0 changes --- README | 1 - cmdif/Makefile.am | 2 +- cmdif/icmd_cif_common.c | 136 + cmdif/icmd_cif_common.h | 101 + cmdif/icmd_cif_macros.h | 90 + cmdif/icmd_cif_open.c | 49 + cmdif/icmd_cif_open.h | 61 + configure.ac | 6 +- debian/changelog | 6 + dev_mgt/tools_dev_types.c | 327 +- dev_mgt/tools_dev_types.h | 48 +- flint/cmd_line_parser.cpp | 66 +- flint/err_msgs.h | 7 +- flint/flint.cpp | 2 + flint/flint_params.cpp | 2 +- flint/flint_params.h | 7 +- flint/subcommands.cpp | 971 +- flint/subcommands.h | 75 +- mflash/mflash.c | 249 +- mflash/mflash.h | 22 +- mflash/mflash_access_layer.c | 45 +- mflash/mflash_access_layer.h | 11 +- mflash/mflash_common_structs.h | 28 +- mflash/mflash_pack_layer.c | 28 +- mflash/mflash_pack_layer.h | 17 +- mflash/mflash_types.h | 15 +- mlxconfig/mlxcfg_lib.cpp | 94 +- mlxconfig/mlxcfg_lib.h | 9 +- mlxconfig/mlxcfg_param_lib.cpp | 1364 +- mlxconfig/mlxcfg_param_lib.h | 374 +- mlxconfig/mlxcfg_parser.cpp | 651 +- mlxconfig/mlxcfg_status.h | 5 +- mlxconfig/mlxcfg_ui.cpp | 104 +- mlxconfig/mlxcfg_ui.h | 103 +- mlxfwops/lib/Makefile.am | 5 +- mlxfwops/lib/aux_tlv_ops.cpp | 545 + mlxfwops/lib/aux_tlv_ops.h | 165 + mlxfwops/lib/flint_base.cpp | 14 + mlxfwops/lib/flint_base.h | 18 +- mlxfwops/lib/flint_io.cpp | 96 +- mlxfwops/lib/flint_io.h | 32 +- mlxfwops/lib/fs2_ops.cpp | 224 +- mlxfwops/lib/fs2_ops.h | 10 +- mlxfwops/lib/fs3_ops.cpp | 395 +- mlxfwops/lib/fs3_ops.h | 18 +- mlxfwops/lib/fw_ops.cpp | 114 +- mlxfwops/lib/fw_ops.h | 18 +- mlxfwops/lib/mlxfwops.cpp | 9 +- mlxfwops/lib/mlxfwops_com.h | 15 +- mstdump/crd_lib/crdump.c | 17 +- mstdump/mstdump_dbs/BridgeX.csv | 1463 -- mstdump/mstdump_dbs/ConnectX.csv | 2301 --- mstdump/mstdump_dbs/ConnectX2.csv | 2335 --- mstdump/mstdump_dbs/InfiniScaleIV.csv | 14584 ----------------- mstdump/mstdump_dbs/Spectrum.csv | 626 +- mstdump/mstdump_dbs/SwitchIB2.csv | 13081 +++++++++++++++ mstflint.spec.in | 5 +- mtcr_ul/Makefile.am | 1 + mtcr_ul/mtcr_ib_ofed.c | 69 +- mtcr_ul/mtcr_ib_res_mgt.c | 176 + mtcr_ul/mtcr_ib_res_mgt.h | 61 + mtcr_ul/mtcr_int_defs.h | 2 + mtcr_ul/mtcr_ul.c | 102 +- mtcr_ul/mtcr_ul_icmd_cif.c | 50 +- reg_access/Makefile.am | 2 +- reg_access/reg_access.c | 22 + reg_access/reg_access.h | 2 + tools_layouts/Makefile.am | 3 +- tools_layouts/adb_to_c_utils.c | 14 +- tools_layouts/adb_to_c_utils.h | 2 +- tools_layouts/connectib_layouts.c | 214 + tools_layouts/connectib_layouts.h | 108 + tools_layouts/cx4fw_layouts.c | 1 - tools_layouts/register_access_open_layouts.c | 20 +- tools_layouts/register_access_open_layouts.h | 8 +- tools_layouts/tools_open_layouts.c | 1248 +- tools_layouts/tools_open_layouts.h | 437 +- tools_res_mgmt/Makefile.am | 2 +- tools_res_mgmt/tools_res_mgmt.c | 284 +- tools_res_mgmt/tools_res_mgmt.h | 28 +- tools_res_mgmt/tools_time.c | 37 + tools_res_mgmt/tools_time.h | 31 + 82 files changed, 21008 insertions(+), 23082 deletions(-) create mode 100644 cmdif/icmd_cif_common.c create mode 100644 cmdif/icmd_cif_common.h create mode 100644 cmdif/icmd_cif_macros.h create mode 100644 cmdif/icmd_cif_open.c create mode 100644 cmdif/icmd_cif_open.h create mode 100644 mlxfwops/lib/aux_tlv_ops.cpp create mode 100644 mlxfwops/lib/aux_tlv_ops.h delete mode 100755 mstdump/mstdump_dbs/BridgeX.csv delete mode 100755 mstdump/mstdump_dbs/ConnectX.csv delete mode 100755 mstdump/mstdump_dbs/ConnectX2.csv delete mode 100755 mstdump/mstdump_dbs/InfiniScaleIV.csv create mode 100644 mstdump/mstdump_dbs/SwitchIB2.csv create mode 100644 mtcr_ul/mtcr_ib_res_mgt.c create mode 100644 mtcr_ul/mtcr_ib_res_mgt.h create mode 100644 tools_layouts/connectib_layouts.c create mode 100644 tools_layouts/connectib_layouts.h create mode 100644 tools_res_mgmt/tools_time.c create mode 100644 tools_res_mgmt/tools_time.h diff --git a/README b/README index f84ef1d..a81450f 100644 --- a/README +++ b/README @@ -173,4 +173,3 @@ MSTFLINT Package - Firmware Burning and Diagnostics Tools mstflint -d 02:00.0 q mstvpd 02:00.0 -10) diff --git a/cmdif/Makefile.am b/cmdif/Makefile.am index 78aba47..45615f8 100644 --- a/cmdif/Makefile.am +++ b/cmdif/Makefile.am @@ -40,5 +40,5 @@ AM_CFLAGS = -W -Wall -Werror -g -MP -MD $(COMPILER_FPIC) -DCMDIF_EXPORTS CMDIF_VERSION = 1 noinst_LIBRARIES = libcmdif.a -libcmdif_a_SOURCES = tools_cif.c +libcmdif_a_SOURCES = tools_cif.c tools_cif.h icmd_cif_common.c icmd_cif_common.h icmd_cif_open.c icmd_cif_open.h diff --git a/cmdif/icmd_cif_common.c b/cmdif/icmd_cif_common.c new file mode 100644 index 0000000..75b2fbc --- /dev/null +++ b/cmdif/icmd_cif_common.c @@ -0,0 +1,136 @@ +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include +#include "icmd_cif_common.h" + +/* + * get_last_err + */ +char* gcif_get_last_err(){ + return "Deprecated: General Error"; +} + +/* + * gcif_err_str + */ +char* gcif_err_str(int rc) { + + switch(rc) { + case GCIF_STATUS_SUCCESS : + return "OK"; + case GCIF_STATUS_INVALID_OPCODE : + return "Invalid opcode"; + case GCIF_STATUS_INVALID_CMD : + return "Invalid cmd"; + case GCIF_STATUS_OPERATIONAL_ERROR : + return "Operational error"; + case GCIF_STATUS_CR_FAIL : + return "cr-space access failure"; + case GCIF_STATUS_BAD_OPCODE : + return "unsupported opcode was used"; + case GCIF_STATUS_SEMAPHORE_TO : + return "timed out while trying to take semaphore"; + case GCIF_STATUS_EXECUTE_TO : + return "timed out while waiting for command to execute"; + case GCIF_STATUS_IFC_BUSY : + return "command-interface is busy executing another command"; + case GCIF_STATUS_BAD_PARAMETERS : + return "bad parameter"; + case GCIF_STATUS_ICMD_NOT_READY: + return "command interface not ready"; + case GCIF_STATUS_BAD_PARAM: + return "command interface bad param"; + case GCIF_STATUS_UNSUPPORTED_ICMD_VERSION: + return "Unsupported icmd version"; + case GCIF_STATUS_UNKNOWN_STATUS: + return "Unknown ICMD Status."; + case GCIF_STATUS_GENERAL_ERROR : + return "General error"; + case GCIF_SIZE_EXCEEDS_LIMIT: + return "Size exceeds limit"; + case GCIF_ICMD_NOT_SUPPORTED: + return "icmd not supported"; + case GCIF_ICMD_INIT_FAILED: + return "icmd initialization failed"; + case GCIF_ICMD_BUSY: + return "icmd busy"; + default: + return "Unknown error"; + } +} + +/* + * convert_rc + */ + +int convert_rc(int rc) { + switch (rc) { + case ME_ICMD_STATUS_CR_FAIL: + return GCIF_STATUS_CR_FAIL; + case ME_ICMD_STATUS_SEMAPHORE_TO: + return GCIF_STATUS_SEMAPHORE_TO; + case ME_ICMD_STATUS_EXECUTE_TO: + return GCIF_STATUS_EXECUTE_TO; + case ME_ICMD_STATUS_IFC_BUSY: + return GCIF_STATUS_IFC_BUSY; + case ME_ICMD_STATUS_ICMD_NOT_READY: + return GCIF_STATUS_ICMD_NOT_READY; + case ME_ICMD_UNSUPPORTED_ICMD_VERSION: + return GCIF_STATUS_UNSUPPORTED_ICMD_VERSION; + case ME_ICMD_INVALID_OPCODE: + return GCIF_STATUS_INVALID_OPCODE; + case ME_ICMD_INVALID_CMD: + return GCIF_STATUS_INVALID_CMD; + case ME_ICMD_OPERATIONAL_ERROR: + return GCIF_STATUS_OPERATIONAL_ERROR; + case ME_ICMD_BAD_PARAM: + return GCIF_STATUS_BAD_PARAM; + case ME_ICMD_ICM_NOT_AVAIL: + return GCIF_STATUS_ICM_NOT_AVAIL; + case ME_ICMD_WRITE_PROTECT: + return GCIF_STATUS_WRITE_PROTECT; + case ME_ICMD_UNKNOWN_STATUS: + return GCIF_STATUS_UNKNOWN_STATUS; + case ME_ICMD_SIZE_EXCEEDS_LIMIT: + return GCIF_SIZE_EXCEEDS_LIMIT; + case ME_ICMD_NOT_SUPPORTED: + return GCIF_ICMD_NOT_SUPPORTED; + case ME_ICMD_INIT_FAILED: + return GCIF_ICMD_INIT_FAILED; + case ME_ICMD_BUSY: + return GCIF_ICMD_BUSY; + default: + break; + } + return GCIF_STATUS_GENERAL_ERROR; +} diff --git a/cmdif/icmd_cif_common.h b/cmdif/icmd_cif_common.h new file mode 100644 index 0000000..bdc03c4 --- /dev/null +++ b/cmdif/icmd_cif_common.h @@ -0,0 +1,101 @@ +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef _ICMD_COMMON_ +#define _ICMD_COMMON_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* --------- Typedefs & Constants ---------------------------------- */ + +/** + * Possible status values returned by the API functions. + * In some cases the status indicated in the cr-space may not fit + * any of the below enumeration values, in which case the raw status + * value will be returned. + **/ +enum { + GCIF_STATUS_SUCCESS = 0, + GCIF_STATUS_INVALID_OPCODE , + GCIF_STATUS_INVALID_CMD, + GCIF_STATUS_OPERATIONAL_ERROR, + GCIF_STATUS_BAD_PARAM, + GCIF_STATUS_CR_FAIL , // cr-space access failure + GCIF_STATUS_BAD_OPCODE, // unsupported opcode was used + GCIF_STATUS_SEMAPHORE_TO, // timed out while trying to take semaphore + GCIF_STATUS_EXECUTE_TO, // timed out while waiting for command to execute + GCIF_STATUS_IFC_BUSY, // command-interface is busy executing another command + GCIF_STATUS_BAD_PARAMETERS, + GCIF_STATUS_GENERAL_ERROR, + GCIF_STATUS_ICMD_NOT_READY, + GCIF_STATUS_UNSUPPORTED_ICMD_VERSION, + GCIF_STATUS_ICM_NOT_AVAIL, + GCIF_STATUS_WRITE_PROTECT, + GCIF_STATUS_NO_MEM, + GCIF_SIZE_EXCEEDS_LIMIT, + GCIF_ICMD_NOT_SUPPORTED, + GCIF_ICMD_INIT_FAILED, + GCIF_ICMD_BUSY, + GCIF_STATUS_UNKNOWN_STATUS +}; + +enum { + GET_FW_INFO = 0x8007, + FLASH_REG_ACCESS = 0x9001, +}; + + +enum { + RW_READ = 0x1, + RW_WRITE = 0x0 +}; + +/* --------- Functional API ---------------------------------------- */ + +/** + * Returns the last error message recorded by the library + **/ +char* gcif_get_last_err(); + +/** + * Returns the error message associated with the provided return code + **/ +char* gcif_err_str(int rc); + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/cmdif/icmd_cif_macros.h b/cmdif/icmd_cif_macros.h new file mode 100644 index 0000000..fa7f261 --- /dev/null +++ b/cmdif/icmd_cif_macros.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef _ICMD_MACROS /* guard */ +#define _ICMD_MACROS + + +int convert_rc(int rc); + +#define IN +#define OUT +#define INOUT + +#ifdef _DEBUG_MODE +#define DBG_PRINTF(...) fprintf(stderr, __VA_ARGS__) +#else +#define DBG_PRINTF(...) +#endif + +/* + * SEND_ICMD_FLOW macro is designed for the most common icmd flow + * basically every command that simply packs a struct sends icmd and unpacks it should use + * this to save code. + * TODO: Adrianc- if needed separate struct_name to prefix+name in case we need to separate between different + * 5th gen icmd structures i.e connectib/switchib/connectx4 (use ## to paste them together in the macro) + */ +#define SEND_ICMD_FLOW_GENERIC(mf, op, struct_name, cmd_struct, should_pack, skip_write, pack_func, unpack_func)\ + int _rc;\ + int _cmd_size = struct_name##_size();\ + u_int8_t _data[_cmd_size];\ + memset(_data, 0, _cmd_size);\ + if (should_pack) {\ + pack_func(cmd_struct, _data);\ + }\ + _rc = icmd_send_command(mf, op, _data, _cmd_size, skip_write);\ + if (_rc) {\ + return convert_rc(_rc);\ + }\ + unpack_func(cmd_struct, _data);\ + return GCIF_STATUS_SUCCESS + +#define SEND_ICMD_FLOW(mf, op, struct_name, cmd_struct, should_pack, skip_write)\ + SEND_ICMD_FLOW_GENERIC(mf, op, struct_name, cmd_struct, should_pack, skip_write, struct_name##_pack, struct_name##_unpack) + +#define SEND_UNION_ICMD_FLOW(mf, op, struct_name, cmd_struct, should_pack, skip_write)\ + int _rc;\ + int _cmd_size = struct_name##_size();\ + u_int8_t _data[_cmd_size];\ + memset(_data, 0, _cmd_size);\ + if (should_pack) {\ + struct_name##_in_pack(&(cmd_struct->in), _data);\ + }\ + _rc = icmd_send_command(mf, op, _data, _cmd_size, skip_write);\ + if (_rc) {\ + return convert_rc(_rc);\ + }\ + struct_name##_unpack(cmd_struct, _data);\ + return GCIF_STATUS_SUCCESS + + +#endif diff --git a/cmdif/icmd_cif_open.c b/cmdif/icmd_cif_open.c new file mode 100644 index 0000000..84e8bb9 --- /dev/null +++ b/cmdif/icmd_cif_open.c @@ -0,0 +1,49 @@ +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include +#include +#include + +#include "icmd_cif_common.h" +#include "icmd_cif_open.h" +#include "icmd_cif_macros.h" + + +/* + * gcif_get_fw_info + */ +int gcif_get_fw_info(mfile *mf, + OUT struct connectib_icmd_get_fw_info* fw_info) +{ + SEND_ICMD_FLOW(mf, GET_FW_INFO, connectib_icmd_get_fw_info, fw_info, 0, 1); +} diff --git a/cmdif/icmd_cif_open.h b/cmdif/icmd_cif_open.h new file mode 100644 index 0000000..79d9bfe --- /dev/null +++ b/cmdif/icmd_cif_open.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef _ICMD_OPEN_LIB /* guard */ +#define _ICMD_OPEN_LIB + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include "icmd_cif_common.h" + +#define IN +#define OUT +#define INOUT + + +int gcif_get_fw_info(mfile *mf, + OUT struct connectib_icmd_get_fw_info* fw_info); + +#undef IN +#undef OUT +#undef INOUT + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/configure.ac b/configure.ac index be0f9d1..46114c7 100644 --- a/configure.ac +++ b/configure.ac @@ -1,16 +1,16 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT(mstflint, 4.1.0, adrianc@mellanox.co.il) +AC_INIT(mstflint, 4.3.0, adrianc@mellanox.co.il) AC_DEFINE_UNQUOTED([PROJECT], ["mstflint"], [Define the project name.]) AC_SUBST([PROJECT]) -AC_DEFINE_UNQUOTED([VERSION], ["4.1.0"], [Define the project version.]) +AC_DEFINE_UNQUOTED([VERSION], ["4.3.0"], [Define the project version.]) AC_SUBST([VERSION]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_SRCDIR([README]) -AM_INIT_AUTOMAKE(mstflint, 4.1.0) +AM_INIT_AUTOMAKE(mstflint, 4.3.0) dnl Checks for programs AC_PROG_CC diff --git a/debian/changelog b/debian/changelog index 90af268..a5d723c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +mstflint (4.3.0-1) unstable; urgency=low + + * Updated from MFT-4.3.0 + + -- Adrian Chiris Mon, 11 Jan 2016 15:31:33 +0200 + mstflint (4.1.0-1) unstable; urgency=low * Updated from MFT-4.1.0 diff --git a/dev_mgt/tools_dev_types.c b/dev_mgt/tools_dev_types.c index eac00af..aeed7bb 100644 --- a/dev_mgt/tools_dev_types.c +++ b/dev_mgt/tools_dev_types.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -27,9 +28,6 @@ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. - * - * Version: $Id$ - * */ #include @@ -40,6 +38,7 @@ #include "tools_dev_types.h" enum dm_dev_type { + DM_UNKNOWN = -1, DM_HCA, DM_SWITCH, DM_BRIDGE @@ -55,101 +54,9 @@ struct dev_info { enum dm_dev_type dev_type; }; -#define DEVID_ADDR_INFINISCALE_III 0x60014 #define DEVID_ADDR 0xf0014 -#define DM_INFINIHOST_III_EX_DEV_VER_ADDR 0x82600 static struct dev_info g_devs_info[] = { - { - .dm_id = DeviceInfiniScale, - .hw_dev_id = 43132, - .hw_rev_id = -1, - .sw_dev_id = -1, - .name = "InfiniScale", - .port_num = 8, - .dev_type = DM_SWITCH - }, - { - .dm_id = DeviceInfiniHost, - .hw_dev_id = 0x5a44, - .hw_rev_id = -1, - .sw_dev_id = -1, - .name = "InfiniHost", - .port_num = 2, - .dev_type = DM_HCA - }, - { - .dm_id = DeviceInfiniHostIIIEx, - .hw_dev_id = 0x6278, - .hw_rev_id = -1, - .sw_dev_id = 0x6278, - .name = "InfiniHostIIIEx", - .port_num = 2, - .dev_type = DM_HCA - }, - { - .dm_id = DeviceInfiniHostIIIEx_MF, - .hw_dev_id = 0x6278, - .hw_rev_id = -1, - .sw_dev_id = 0x6282, - .name = "InfiniHostIIIEx_MF", - .port_num = 2, - .dev_type = DM_HCA - }, - { - .dm_id = DeviceInfiniScaleIII, - .hw_dev_id = 0xb924, - .hw_rev_id = -1, - .sw_dev_id = -1, - .name = "InfiniScaleIII", - .port_num = 24, - .dev_type = DM_SWITCH - }, - { - .dm_id = DeviceInfiniHostIIILx, - .hw_dev_id = 0x6274, - .hw_rev_id = -1, - .sw_dev_id = -1, - .name = "InfiniHostIIILx", - .port_num = 1, - .dev_type = DM_HCA - }, - { - .dm_id = DeviceConnectX, - .hw_dev_id = 0x190, - .hw_rev_id = 0xa0, - .sw_dev_id = -1, - .name = "ConnectX", - .port_num = 2, - .dev_type = DM_HCA - }, - { - .dm_id = DeviceConnectX2, - .hw_dev_id = 0x190, - .hw_rev_id = 0xb0, - .sw_dev_id = -1, - .name = "ConnectX2", - .port_num = 2, - .dev_type = DM_HCA - }, - { - .dm_id = DeviceInfiniScaleIV, - .hw_dev_id = 0x01b3, - .hw_rev_id = -1, - .sw_dev_id = -1, - .name = "InfiniScaleIV", - .port_num = 36, - .dev_type = DM_SWITCH - }, - { - .dm_id = DeviceBridgeX, - .hw_dev_id = 0x17d4, - .hw_rev_id = -1, - .sw_dev_id = -1, - .name = "BridgeX", - .port_num = 0, /* TODO */ - .dev_type = DM_BRIDGE - }, { .dm_id = DeviceSwitchX, .hw_dev_id = 0x0245, @@ -222,6 +129,15 @@ static struct dev_info g_devs_info[] = { .port_num = 2, .dev_type = DM_HCA }, + { + .dm_id = DeviceConnectX5, + .hw_dev_id = 0x20d, + .hw_rev_id = -1, + .sw_dev_id = -1, + .name = "ConnectX5", + .port_num = 2, + .dev_type = DM_HCA + }, { .dm_id = DeviceFPGA, .hw_dev_id = 0x600, @@ -232,10 +148,69 @@ static struct dev_info g_devs_info[] = { .dev_type = DM_HCA }, { - .dm_id = DeviceEndMarker, + .dm_id = DeviceFPGANewton, + .hw_dev_id = 0xfff, // Dummy device ID till we have official one + .hw_rev_id = -1, + .sw_dev_id = -1, + .name = "FPGA_NEWTON", + .port_num = 2, + .dev_type = DM_HCA + }, + { + .dm_id = DeviceSwitchIB2, + .hw_dev_id = 0x24b, + .hw_rev_id = -1, + .sw_dev_id = -1, + .name = "SwitchIB2", + .port_num = 36, + .dev_type = DM_SWITCH + }, + { + .dm_id = DeviceDummy, + .hw_dev_id = 0x1, + .hw_rev_id = -1, + .sw_dev_id = -1, + .name = "DummyDevice", + .port_num = 2, + .dev_type = DM_HCA + }, + { + .dm_id = DeviceUnknown, + .hw_dev_id = 0, + .hw_rev_id = 0, + .sw_dev_id = 0, + .name = "Unknown Device", + .port_num = -1, + .dev_type = DM_UNKNOWN } }; +static const struct dev_info* get_entry(dm_dev_id_t type) +{ + const struct dev_info* p = g_devs_info; + while (p->dm_id != DeviceUnknown) { + if (type == p->dm_id) { + break; + } + p++; + } + return p; +} + +static const struct dev_info* get_entry_by_dev_rev_id(u_int32_t hw_dev_id, u_int32_t hw_rev_id) +{ + const struct dev_info* p = g_devs_info; + while (p->dm_id != DeviceUnknown) { + if (hw_dev_id == p->hw_dev_id) { + if ((p->hw_rev_id == -1) || ((int)hw_rev_id == p->hw_rev_id)) { + break; + } + } + p++; + } + return p; +} + /** * Returns 0 on success and 1 on failure. */ @@ -245,7 +220,6 @@ int dm_get_device_id(mfile* mf, u_int32_t* ptr_hw_rev) { u_int32_t dword; - u_int32_t i; int rc; u_int32_t dev_flags; @@ -256,17 +230,14 @@ int dm_get_device_id(mfile* mf, *ptr_hw_dev_id = 0x600; return 0; } + if (mf->tp == MST_FPGA_NEWTON) { + *ptr_dm_dev_id = DeviceFPGANewton; + *ptr_hw_dev_id = 0xfff; + return 0; + } #endif - #if 1 - for (i = 0; i < DeviceEndMarker; i++) { - if (g_devs_info[i].dm_id != i) { - printf("-F- in get_device_type: Wrong index of the g_devs_info array. idx %d dev %s\n", - i, g_devs_info[i].name); - exit(1); - } - } - #endif + rc = mget_mdevs_flags(mf, &dev_flags); if (rc) { @@ -281,14 +252,14 @@ int dm_get_device_id(mfile* mf, rc = reg_access_mgir(mf, REG_ACCESS_METHOD_GET, &mgir); //printf("-D- RC[%s] -- REVID: %d -- DEVID: %d hw_dev_id: %d\n", m_err2str(rc), mgir.HWInfo.REVID, mgir.HWInfo.DEVID, mgir.HWInfo.hw_dev_id); if (rc) { - dword = g_devs_info[DeviceSwitchX].hw_dev_id; + dword = get_entry(DeviceSwitchX)->hw_dev_id; *ptr_hw_rev = 0; - *ptr_hw_dev_id = g_devs_info[DeviceSwitchX].hw_dev_id; + *ptr_hw_dev_id = get_entry(DeviceSwitchX)->hw_dev_id; } else { dword = mgir.HWInfo.hw_dev_id; if (dword == 0) { - dword = g_devs_info[DeviceSwitchX].hw_dev_id; - *ptr_hw_dev_id = g_devs_info[DeviceSwitchX].hw_dev_id; + dword = get_entry(DeviceSwitchX)->hw_dev_id; + *ptr_hw_dev_id = get_entry(DeviceSwitchX)->hw_dev_id; *ptr_hw_rev = mgir.HWInfo.REVID & 0xf; } else { *ptr_hw_dev_id = dword; @@ -306,54 +277,14 @@ int dm_get_device_id(mfile* mf, *ptr_hw_rev = EXTRACT(dword, 16, 8); } - for (i = 0; i < DeviceEndMarker; i++) { - struct dev_info* di = &(g_devs_info[i]); - if (*ptr_hw_dev_id == di->hw_dev_id) { - if (di->hw_rev_id == -1 || (int)(*ptr_hw_rev) == di->hw_rev_id) { - *ptr_dm_dev_id = i; - break; - } - } - } + *ptr_dm_dev_id = get_entry_by_dev_rev_id(*ptr_hw_dev_id, *ptr_hw_rev)->dm_id; - if (i == DeviceEndMarker) { - /* Special cases - InfiniHost_III_LX HW id and InfiniScale_III devid address. */ - if (*ptr_hw_dev_id == 24204) { - /* Some old InfiniHost_III_LXs have hw dev is of 24204 */ - *ptr_dm_dev_id = DeviceInfiniHostIIILx; - } else { - /* Try InfiniScale_III devid address */ - if (mread4(mf, DEVID_ADDR_INFINISCALE_III, &dword) != 4) - return 1; - if ((int)EXTRACT(dword, 0, 16) == g_devs_info[DeviceInfiniScaleIII].hw_dev_id) { - *ptr_dm_dev_id = DeviceInfiniScaleIII; - *ptr_hw_dev_id = EXTRACT(dword, 0, 16); - *ptr_hw_rev = EXTRACT(dword, 16, 8); - } else { - /* Dev id not matched in array */ - //printf("FATAL - Can't find devid id\n"); - return 1; // TODO - fix return vals. - } - } - } - - /* Special cases: For InfiniHost_III_EX we need to check the SW id as well */ - if (*ptr_hw_dev_id == g_devs_info[DeviceInfiniHostIIIEx].hw_dev_id) { - if (mread4(mf, DM_INFINIHOST_III_EX_DEV_VER_ADDR, &dword) != 4) - { - //printf("FATAL - Can't read InfiniHost_III_EX dev_ver addr\n"); - return 1; - } + if (*ptr_dm_dev_id == DeviceUnknown) { - if (EXTRACT(dword, 16, 16) == 25218 || - EXTRACT(dword, 16, 16) == 25228 || - EXTRACT(dword, 16, 16) == 25238) { - *ptr_dm_dev_id = DeviceInfiniHostIIIEx_MF; - } else { - *ptr_dm_dev_id = DeviceInfiniHostIIIEx; - } + /* Dev id not matched in array */ + //printf("FATAL - Can't find devid id\n"); + return 1; // TODO - fix return vals. } - return 0; } @@ -361,91 +292,75 @@ int dm_get_device_id_offline(u_int32_t devid, u_int32_t chip_rev, dm_dev_id_t* ptr_dev_type) { - dm_dev_id_t i; - - for (i = 0; i < DeviceEndMarker; i++) { - struct dev_info* di = &(g_devs_info[i]); - if (devid == di->hw_dev_id) { - if (di->hw_rev_id == -1 || (int)(chip_rev) == di->hw_rev_id) { - *ptr_dev_type = i; - break; - } - } - } - - return i == DeviceEndMarker; + *ptr_dev_type = get_entry_by_dev_rev_id(devid, chip_rev)->dm_id; + return *ptr_dev_type == DeviceUnknown; } const char* dm_dev_type2str(dm_dev_id_t type) { - if (type < DeviceEndMarker) { - return g_devs_info[type].name; - } else { - return "Unknown Device"; + return get_entry(type)->name; +} + +dm_dev_id_t dm_dev_str2type(const char* str) +{ + const struct dev_info* p = g_devs_info; + if (!str) { + return DeviceUnknown; } + while (p->dm_id != DeviceUnknown) { + if (strcmp(str,p->name) == 0) { + return p->dm_id; + } + p++; + } + return DeviceUnknown; } int dm_get_hw_ports_num(dm_dev_id_t type) { - if (type < DeviceEndMarker) { - return g_devs_info[type].port_num; - } else { - return -1; - } + return get_entry(type)->port_num; } int dm_dev_is_hca(dm_dev_id_t type) { - if (type < DeviceEndMarker) { - return g_devs_info[type].dev_type == DM_HCA; - } else { - return 0; - } + return get_entry(type)->dev_type == DM_HCA; } int dm_dev_is_switch(dm_dev_id_t type) { - if (type < DeviceEndMarker) { - return g_devs_info[type].dev_type == DM_SWITCH; - } else { - return 0; - } + return get_entry(type)->dev_type == DM_SWITCH; } int dm_dev_is_bridge(dm_dev_id_t type) { - if (type < DeviceEndMarker) { - return g_devs_info[type].dev_type == DM_BRIDGE; - } else { - return 0; - } + return get_entry(type)->dev_type == DM_BRIDGE; } u_int32_t dm_get_hw_dev_id(dm_dev_id_t type) { - if (type < DeviceEndMarker) { - return g_devs_info[type].hw_dev_id; - } else { - return 0; - } + return get_entry(type)->hw_dev_id; } u_int32_t dm_get_hw_rev_id(dm_dev_id_t type) { - if (type < DeviceEndMarker) { - return g_devs_info[type].hw_rev_id; - } else { - return 0; - } + return get_entry(type)->hw_rev_id; } int dm_is_fpp_supported(dm_dev_id_t type) { - if (g_devs_info[type].dm_id == DeviceConnectIB || - g_devs_info[type].dm_id == DeviceConnectX4 || - g_devs_info[type].dm_id == DeviceConnectX4LX) { + const struct dev_info* dp = get_entry(type); + if ( + dp->dm_id == DeviceConnectIB || + dp->dm_id == DeviceConnectX4 || + dp->dm_id == DeviceConnectX4LX || + dp->dm_id == DeviceConnectX5) { return 1; } else { return 0; } } +int dm_is_device_supported(dm_dev_id_t type) +{ + return get_entry(type)->dm_id != DeviceUnknown; +} + diff --git a/dev_mgt/tools_dev_types.h b/dev_mgt/tools_dev_types.h index e3be9ee..f621249 100644 --- a/dev_mgt/tools_dev_types.h +++ b/dev_mgt/tools_dev_types.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -27,9 +28,6 @@ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. - * - * Version: $Id$ - * */ #ifndef TOOLS_DEV_TYPE_H @@ -45,19 +43,21 @@ extern "C" { enum dm_dev_id { + DeviceUnknown = -1, //Dummy Device - Marker for indicating error. DeviceStartMarker = 0, // Dummy Device - Marker for first device // to let user iterate from DeviceStartMarker to DeviceEndMarker - - DeviceInfiniScale = 0, - DeviceInfiniHost, - DeviceInfiniHostIIIEx, - DeviceInfiniHostIIIEx_MF, - DeviceInfiniScaleIII, - DeviceInfiniHostIIILx, - DeviceConnectX, - DeviceConnectX2, - DeviceInfiniScaleIV, - DeviceBridgeX, + // Note: Call dm_is_device_supported() to see if a device is supported by the lib. + + DeviceInfiniScale = 0, // UnSupported + DeviceInfiniHost, // UnSupported + DeviceInfiniHostIIIEx, // UnSupported + DeviceInfiniHostIIIEx_MF,// UnSupported + DeviceInfiniScaleIII, // UnSupported + DeviceInfiniHostIIILx, // UnSupported + DeviceConnectX, // UnSupported + DeviceConnectX2, // UnSupported + DeviceInfiniScaleIV, // UnSupported + DeviceBridgeX, // UnSupported DeviceSwitchX, DeviceConnectX3, DeviceConnectIB, @@ -66,9 +66,13 @@ enum dm_dev_id DeviceSpectrum, DeviceConnectX4, DeviceConnectX4LX, + DeviceConnectX5, DeviceFPGA, + DeviceSwitchIB2, + DeviceFPGANewton, + DeviceDummy, - DeviceEndMarker // Dummy Device - Marker for indicating error and end of devices + DeviceEndMarker // Dummy Device - Marker for indicating end of devices when iterating }; typedef enum dm_dev_id dm_dev_id_t; @@ -88,11 +92,23 @@ int dm_get_device_id_offline(u_int32_t devid, u_int32_t chip_rev, dm_dev_id_t* ptr_dev_type); + +/** + * Returns 1 if device is supported and 0 otherwise (library dependant) + */ +int dm_is_device_supported(dm_dev_id_t type); + + /** * Returns the device name as a "const char*" */ const char* dm_dev_type2str(dm_dev_id_t type); +/** + * Returns the device id + */ +dm_dev_id_t dm_dev_str2type(const char* str); + /** * A predicate returning if the device is an hca */ diff --git a/flint/cmd_line_parser.cpp b/flint/cmd_line_parser.cpp index 028cd59..b2b7999 100644 --- a/flint/cmd_line_parser.cpp +++ b/flint/cmd_line_parser.cpp @@ -108,6 +108,8 @@ SubCmdMetaData::SubCmdMetaData() { _sCmds.push_back(new SubCmd("", "rb", SC_Rb)); _sCmds.push_back(new SubCmd("", "clear_semaphore", SC_Clear_Sem)); _sCmds.push_back(new SubCmd("", "fi", SC_Fix_Img)); + _sCmds.push_back(new SubCmd("cs", "checksum", SC_Check_Sum)); + _sCmds.push_back(new SubCmd("ts", "timestamp", SC_Time_Stamp)); } SubCmdMetaData::~SubCmdMetaData() { @@ -181,6 +183,7 @@ FlagMetaData::FlagMetaData() { _flags.push_back(new Flag("v", "version", 0)); _flags.push_back(new Flag("", "no_devid_check", 0)); _flags.push_back(new Flag("", "use_fw", 0)); + _flags.push_back(new Flag("", "use_dev_img_info", 0)); } FlagMetaData::~FlagMetaData() { @@ -332,54 +335,6 @@ guid_t GetBaseMac(guid_t baseGuid) return baseMac; } -bool InitBxGuids(std::vector& user_guids, guid_t base_guid1) { - - int base_index = 0; - guid_t base_mac, base_guid; - user_guids.resize(MAX_GUIDS); - - for (int i = 0; i < BX_SLICES_NUM; i++) { - base_index = i * BX_SLICE_GUIDS; - base_guid = incrGuid(base_guid1, i * 8); - // Init Guids - int base_guids_index = base_index + BI_GUIDS; - for (int j = 0; j < BX_NP_GUIDS; j++) { - if (j == 0) { - // The node guid should be the same one on the two slices. - user_guids[base_guids_index + j] = incrGuid(base_guid1, j); - } else { - user_guids[base_guids_index + j] = incrGuid(base_guid, j); - } - - } - // Init Macs - base_mac = GetBaseMac(base_guid); - int base_macs_index = base_index + BI_IMACS; - for (int j = 0; j < BX_MACS; j++) { - user_guids[base_macs_index + j] = incrGuid(base_mac, j); - } - // Init WWPNSs - int base_wwpn_index = base_index + BI_WWPNS; - int base_emac_index = base_index + BI_EMACS; - - for (int j = 0; j < BX_WWPNS; j++) { - user_guids[base_wwpn_index + j].l = user_guids[base_emac_index + j].l; - user_guids[base_wwpn_index + j].h = (user_guids[base_emac_index + j].h | (0x2000 << 16)); - } - - // Init WWNNS - int base_wwnn_index = base_index + BI_WWNNS; - base_emac_index = base_index + BI_EMACS; - - user_guids[base_wwnn_index].l = user_guids[base_emac_index].l; - user_guids[base_wwnn_index].h = (user_guids[base_emac_index].h | (0x2001 << 16)); - } - - // Init SysGuid - user_guids[BI_SYS_GUID] = incrGuid(base_guid1, 7); - return true; -} - bool parseFlashParams(string params, flash_params_t& fp) { // Step 1 split by "," @@ -603,6 +558,13 @@ void Flint::initCmdParser() { "Do not attempt to take device data sections from device(sections will be taken from the image. FS3 Only).\n" "Commands affected: burn"); + AddOptions("use_dev_img_info", + ' ', + "", + "preserve select image info fields from the device upon FW update (FS3 Only).\n" + "Commands affected: burn", + true); + AddOptions("dual_image", ' ', "", @@ -788,10 +750,6 @@ ParseStatus Flint::HandleOption(string name, string value) if (!getGUIDFromStr(value, _flintParams.baseUid)) { return PARSE_ERROR; } - if (!InitBxGuids( _flintParams.user_uids, _flintParams.baseUid)) { - printf("-E- failed to extract UIDs from UID."); - return PARSE_ERROR; - } } else if (name == "blank_guids") { _flintParams.blank_guids = true; } else if (name == "clear_semaphore") { @@ -834,7 +792,9 @@ ParseStatus Flint::HandleOption(string name, string value) _flintParams.dual_image = true; } else if (name == "striped_image") { _flintParams.striped_image = true; - } else if (name == "banks") { + }else if (name == "use_dev_img_info") { + _flintParams.use_dev_img_info = true; + }else if (name == "banks") { _flintParams.banks_specified = true; u_int64_t banksNum; if (!strToNum(value, banksNum)) { diff --git a/flint/err_msgs.h b/flint/err_msgs.h index 5cb5cd1..b4f5414 100644 --- a/flint/err_msgs.h +++ b/flint/err_msgs.h @@ -75,8 +75,6 @@ typedef enum { #define FLINT_CMD_ARGS_ERROR5 "Command \"%s\" does not require arguments\n" #define FLINT_INVALID_OPTION_ERROR "Unknown option \"%s\" for the \"%s\" command. you can use %s.\n" #define FLINT_INVALID_FLAG_ERROR "Invalid switch \"%s\" is specified.\n" -#define FLINT_INVALID_UID_NUM_BX_ERROR "Number of UIDs on BridgeX should be %d\n" -#define FLINT_BX_BAD_MAC_FORMAT_ERROR "Bad mac ( %4.4x%8.8x ) %s. Please re-burn with a valid MACs value.\n" #define FLINT_INVALID_FLAG_WITH_FLAG_ERROR "Cannot specify \"%s\" flag with \"%s\" flag.\n" #define FLINT_INVALID_FLAG_WITHOUT_FLAG_ERROR "\"%s\" flag must be specified with \"%s\" flag.\n" #define FLINT_INVALID_FLAG_WITH_CMD_ERROR "Cannot specify flag: %s with Command: %s\n" @@ -131,6 +129,11 @@ typedef enum { #define FLINT_INVALID_PASSWORD "Invalid Password.\n" #define FLINT_NO_GUID_MAC_FLAGS_ERROR "Can not set GUIDs/MACs: please run with -uid/-guid/-mac flag.\n" #define FLINT_NO_UID_FLAG_ERROR "Can not set GUIDs/MACs: uid is not specified, please run with -uid flag.\n" +#define FLINT_CHECKSUM_ERROR "Failed to calculate checksum on %s: %s\n" +#define FLINT_CHECKSUM_MISSMATCH_ERROR "Given checksum: %s does not match the checksum calculated on device FW: %s.\n" +#define FLINT_CHECKSUM_PARSE_ERROR "Failed to parse given checksum.\n" +#define FLINT_CHECKSUM_LEN_ERROR "MD5 checksum should be exactly 16 bytes long.\n" +#define FLINT_CHECKSUM_HEX_ERROR "MD5 checksum should contain only hexadecimal digits.\n" /************************** * Flint Warning Messages diff --git a/flint/flint.cpp b/flint/flint.cpp index 08b2733..150654a 100644 --- a/flint/flint.cpp +++ b/flint/flint.cpp @@ -159,6 +159,8 @@ map_sub_cmd_t_to_subcommand Flint::initSubcommandMap() cmdMap[SC_Wb] = new WbSubCommand(); cmdMap[SC_Rb] = new RbSubCommand(); cmdMap[SC_Clear_Sem] = new ClearSemSubCommand(); + cmdMap[SC_Check_Sum] = new CheckSumSubCommand(); + cmdMap[SC_Time_Stamp] = new TimeStampSubCommand(); return cmdMap; } diff --git a/flint/flint_params.cpp b/flint/flint_params.cpp index beccbd9..a89ba11 100644 --- a/flint/flint_params.cpp +++ b/flint/flint_params.cpp @@ -48,7 +48,6 @@ FlintParams::FlintParams() mac_specified = false; macs_specified = false; uid_specified = false; - uids_specified = false; device_specified = false; blank_guids = false; clear_semaphore = false; @@ -81,6 +80,7 @@ FlintParams::FlintParams() baseUid.l = 0; flash_params.num_of_flashes = 0; flash_params.log2size = 0; + use_dev_img_info = false; } FlintParams::~FlintParams() diff --git a/flint/flint_params.h b/flint/flint_params.h index 1b14eaa..bf70b7a 100644 --- a/flint/flint_params.h +++ b/flint/flint_params.h @@ -76,7 +76,9 @@ typedef enum { SC_Rb, SC_Clear_Sem, SC_Fix_Img, - SC_Qrom + SC_Qrom, + SC_Check_Sum, + SC_Time_Stamp } sub_cmd_t; class FlintParams { @@ -93,9 +95,7 @@ public: bool macs_specified; std::vector user_macs; bool uid_specified; - bool uids_specified; guid_t baseUid; - std::vector user_uids; bool help; bool version; bool extended_help; @@ -131,6 +131,7 @@ public: sub_cmd_t cmd; vector cmd_params; string fullCmd; + bool use_dev_img_info; }; #endif diff --git a/flint/subcommands.cpp b/flint/subcommands.cpp index 91400a5..5bddff1 100644 --- a/flint/subcommands.cpp +++ b/flint/subcommands.cpp @@ -12,7 +12,7 @@ * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following - * conditions are met:FwVerify + * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following @@ -451,13 +451,19 @@ bool SubCommand::basicVerifyParams() //open log if needed openLog(); - if (_maxCmdParamNum != -1 && (int)_flintParams.cmd_params.size() > _maxCmdParamNum) {// _maxCmdParamNum == -1 means ignore this check + if (_maxCmdParamNum == _minCmdParamNum && _maxCmdParamNum != -1 && (int)_flintParams.cmd_params.size() != _maxCmdParamNum) { + reportErr(true, FLINT_CMD_ARGS_ERROR, _name.c_str(), _maxCmdParamNum, _flintParams.cmd_params.size()); + return false; + } else if (_maxCmdParamNum != -1 && (int)_flintParams.cmd_params.size() > _maxCmdParamNum) { // _maxCmdParamNum == -1 means ignore this check if (_maxCmdParamNum) { - reportErr(true, FLINT_CMD_ARGS_ERROR2, _name.c_str(), _maxCmdParamNum, _flintParams.cmd_params.size()); + reportErr(true, FLINT_CMD_ARGS_ERROR2, _name.c_str(), _maxCmdParamNum, _flintParams.cmd_params.size()); } else { reportErr(true, FLINT_CMD_ARGS_ERROR5, _name.c_str()); } return false; + } else if (_minCmdParamNum != -1 && (int)_flintParams.cmd_params.size() < _minCmdParamNum) { // _minCmdParamNum == -1 means ignore this check + reportErr(true, FLINT_CMD_ARGS_ERROR3, _name.c_str(), _minCmdParamNum, _flintParams.cmd_params.size()); + return false; } switch (_v) { @@ -824,25 +830,6 @@ bool SubCommand::printGuidLine(guid_t* new_guids, guid_t* old_guids, int guid_in return true; } -bool SubCommand::printBxGuids(guid_t* new_guids, guid_t* old_guids, int index, int num_of_guids, const char* pre_str) -{ - int guid_index = index; - int _is_wwpn = ((guid_index - BI_WWPNS) % BX_SLICE_GUIDS); - - for (int i = 0; i < num_of_guids; i++) { - printf(" G%d", (index >= BX_SLICE_GUIDS)); - if (i == 0 && _is_wwpn) { - printf(" Node %s: ", pre_str); - } else { - int j = _is_wwpn ? i : i + 1; - printf(" Port%d %s: ", j, pre_str); - } - printGuidLine(new_guids, old_guids, guid_index); - guid_index++; - } - return true; -} - bool SubCommand::printMacLine(guid_t* new_guids, guid_t* old_guids, int mac_index) { printf(" "MAC_FORMAT MAC_SPACES, new_guids[mac_index].h, new_guids[mac_index].l); @@ -855,41 +842,6 @@ bool SubCommand::printMacLine(guid_t* new_guids, guid_t* old_guids, int mac_inde return true; } -bool SubCommand::printBxMacs(guid_t* new_guids, guid_t* old_guids, int index, int num_of_guids, const char* pre_str) -{ - int guid_index = index; - - for (int i = 0; i < num_of_guids; i++) { - printf(" G%d", (index >= BX_SLICE_GUIDS)); - printf(" Port%d %s: ", i + 1, pre_str); - printMacLine(new_guids, old_guids, guid_index); - guid_index++; - } - return true; -} - -bool SubCommand::printUidsFunc(guid_t* new_guids, guid_t* old_guids) -{ - int base_index = 0, guid_index; - - for (int i = 0; i < BX_SLICES_NUM; i++) { - base_index = i * BX_SLICE_GUIDS; - // Init Guids - printBxGuids(new_guids, old_guids, base_index + BI_GUIDS, BX_NP_GUIDS, "Guid"); - printBxMacs (new_guids, old_guids, base_index + BI_IMACS, BX_IMACS, "IMAC"); - printBxMacs (new_guids, old_guids, base_index + BI_EMACS, BX_EMACS, "EMAC"); - printBxGuids(new_guids, old_guids, base_index + BI_WWNNS, BX_WWNNS, "WWNN"); - printBxGuids(new_guids, old_guids, base_index + BI_WWPNS, BX_WWPNS, "WWPN"); - } - - // Init SysGuid - //INCR_GUID(base_guid1, user_guids[Operations::BI_SYS_GUID], 7); - guid_index = BI_SYS_GUID; - printf(" System GUID: "); - printGuidLine(new_guids, old_guids, guid_index); - return true; -} - bool SubCommand::printGUIDsFunc(guid_t guids[GUIDS],guid_t macs[MACS], guid_t old_guids[GUIDS],\ guid_t old_macs[MACS], bool print_guids, bool print_macs, int portNum, bool old_guid_fmt) { @@ -921,21 +873,18 @@ bool SubCommand::printGUIDsFunc(guid_t guids[GUIDS],guid_t macs[MACS], guid_t ol bool SubCommand::reportGuidChanges(guid_t* new_guids, guid_t* new_macs,\ guid_t* old_guids, guid_t* old_macs, bool printGuids,\ - bool printMacs, bool printUids, int guidNum) + bool printMacs, int guidNum) { //should be used ONLY on FS2 in current implementation printf(" You are about to change the Guids/Macs/Uids on the %s:\n\n", _flintParams.device_specified ? "device" : "image"); printf(" New Values " GUID_SPACES "Current Values\n"); - if (printUids) { - printUidsFunc(new_guids, old_guids ); - } else { - printGUIDsFunc(new_guids, new_macs, - old_guids, old_macs, - printGuids, - printMacs, - guidNum, - guidNum < GUIDS); - } + printGUIDsFunc(new_guids, new_macs, + old_guids, old_macs, + printGuids, + printMacs, + guidNum, + guidNum < GUIDS); + if (!askUser()) return false; @@ -1015,49 +964,37 @@ bool SubCommand::dumpFile(const char* confFile, std::vector& data, con return true; } -bool SubCommand::checkGuidsFlags (chip_type_t ct, u_int16_t devType, u_int8_t fwType, - bool guidsSpecified, bool macsSpecified, bool uidsSpecified, bool ibDev, bool ethDev) { +bool SubCommand::checkGuidsFlags (u_int16_t devType, u_int8_t fwType, + bool guidsSpecified, bool macsSpecified, bool uidSpecified, bool ibDev, bool ethDev) { (void)ibDev; - if (guidsSpecified || macsSpecified || uidsSpecified) { - if (ct == CT_BRIDGEX) { - if (macsSpecified || guidsSpecified) { - reportErr(true, "-mac(s)/-guid(s) flags is not applicable for MT%d.\n",devType); - return false; - } - } else { - if (uidsSpecified && fwType != FIT_FS3) { - reportErr(true, "-uid(s) flag is applicable only for BridgeX and FS3 FW.\n"); - return false; - } else if (fwType != FIT_FS2 && !ethDev && macsSpecified ) { - reportErr(true, "-mac(s) flag is not applicable for IB MT%d device.\n", devType); - return false; - } + if (guidsSpecified || macsSpecified || uidSpecified) { + if (uidSpecified && fwType != FIT_FS3) { + reportErr(true, "-uid flag is applicable only for FS3 FW Only.\n"); + return false; + } else if (fwType != FIT_FS2 && !ethDev && macsSpecified ) { + reportErr(true, "-mac(s) flag is not applicable for IB MT%d device.\n", devType); + return false; } } return true; } -void SubCommand::printMissingGuidErr(bool ibDev, bool ethDev, bool bxDev) +void SubCommand::printMissingGuidErr(bool ibDev, bool ethDev) { const char* missingInfo; const char* missingFlags; - if (bxDev) { - missingInfo = "UIDs (GUIDs / MACs / WWNs)"; - missingFlags = "-uid(s)"; + if (ibDev && ethDev) { + missingInfo = "GUIDs / MACs"; + missingFlags = "-guid(s) / -mac(s)"; + } else if (ibDev) { + missingInfo = "GUIDs"; + missingFlags = "-guid(s)"; } else { - if (ibDev && ethDev) { - missingInfo = "GUIDs / MACs"; - missingFlags = "-guid(s) / -mac(s)"; - } else if (ibDev) { - missingInfo = "GUIDs"; - missingFlags = "-guid(s)"; - } else { - missingInfo = "MACs"; - missingFlags = "-mac(s)"; - } - + missingInfo = "MACs"; + missingFlags = "-mac(s)"; } + printf("Please specify %s (using command line flags %s ).\n", missingInfo, missingFlags); return; } @@ -1179,16 +1116,16 @@ BurnSubCommand:: ~BurnSubCommand() bool BurnSubCommand::verifyParams() { - if ((_flintParams.guid_specified || _flintParams.guids_specified) && (_flintParams.uid_specified || _flintParams.uids_specified)) { - reportErr(true, FLINT_COMMAND_FLAGS_ERROR, _name.c_str(), "either GUIDs / UIDs (using command line flags -guid(s) / -uid(s) )"); + if ((_flintParams.guid_specified || _flintParams.guids_specified) && (_flintParams.uid_specified)) { + reportErr(true, FLINT_COMMAND_FLAGS_ERROR, _name.c_str(), "either GUIDs / UID (using command line flags -guid(s) / -uid )"); return false; } - if ((_flintParams.mac_specified || _flintParams.macs_specified) && (_flintParams.uid_specified || _flintParams.uids_specified)) { - reportErr(true, FLINT_COMMAND_FLAGS_ERROR, _name.c_str(), "either MACs / UIDs (using command line flags -mac(s) / -uid(s) )"); + if ((_flintParams.mac_specified || _flintParams.macs_specified) && (_flintParams.uid_specified)) { + reportErr(true, FLINT_COMMAND_FLAGS_ERROR, _name.c_str(), "either MACs / UID (using command line flags -mac(s) / -uid )"); return false; } bool GuidsFromUser = _flintParams.guid_specified || _flintParams.guids_specified ||\ - _flintParams.uid_specified || _flintParams.uids_specified|| \ + _flintParams.uid_specified || \ _flintParams.mac_specified || _flintParams.macs_specified; if (GuidsFromUser && _flintParams.use_image_guids) { reportErr(true, FLINT_INVALID_FLAG_WITH_FLAG_ERROR,"GUIDs/UIDs/MACs", "-use_image_guids"); @@ -1207,10 +1144,6 @@ bool BurnSubCommand::verifyParams() reportErr(true, FLINT_INVALID_FLAG_WITH_FLAG_ERROR, "-macs", "-mac" ); return false; } - if (_flintParams.uid_specified && _flintParams.uids_specified) { - reportErr(true, FLINT_INVALID_FLAG_WITH_FLAG_ERROR, "-uids", "-uid" ); - return false; - } if (_flintParams.use_image_ps && _flintParams.vsd_specified) { reportErr(true, FLINT_INVALID_FLAG_WITH_FLAG_ERROR, "-use_image_ps", "-vsd"); return false; @@ -1228,11 +1161,12 @@ void BurnSubCommand::updateBurnParams() _fwType == FIT_FS2? &burnCbFs2Func : &burnCbFs3Func; _burnParams.userGuidsSpecified = _flintParams.guids_specified || _flintParams.guid_specified; _burnParams.userMacsSpecified = _flintParams.macs_specified || _flintParams.mac_specified; - _burnParams.userUidsSpecified = _flintParams.uids_specified || _flintParams.uid_specified; + _burnParams.userUidSpecified = _flintParams.uid_specified; _burnParams.vsdSpecified = _flintParams.vsd_specified; _burnParams.blankGuids = _flintParams.blank_guids; _burnParams.burnFailsafe = !_flintParams.nofs; _burnParams.allowPsidChange = _flintParams.allow_psid_change; + _burnParams.useDevImgInfo = _flintParams.use_dev_img_info; _burnParams.useImagePs = _flintParams.use_image_ps; _burnParams.burnRomOptions = _flintParams.use_image_rom ? FwOperations::ExtBurnParams::BRO_ONLY_FROM_IMG \ : FwOperations::ExtBurnParams::BRO_DEFAULT ; @@ -1243,8 +1177,9 @@ void BurnSubCommand::updateBurnParams() if (_burnParams.userGuidsSpecified) { _burnParams.userUids = _flintParams.user_guids; } - if (_burnParams.userUidsSpecified) { - _burnParams.userUids = _flintParams.user_uids; + if (_burnParams.userUidSpecified) { + _burnParams.userUids.resize(0); + _burnParams.userUids.push_back(_flintParams.baseUid); } if (_burnParams.userMacsSpecified) { if (!_burnParams.userGuidsSpecified) { @@ -1301,16 +1236,10 @@ bool BurnSubCommand::checkFwVersion() printf("\n"); _burnParams.ignoreVersionCheck = true; return true; - } -bool BurnSubCommand::checkPSIDAndIbEth() +bool BurnSubCommand::checkPSID() { - //bool ib_dev; - //bool eth_dev; - //setDevFlags(_devInfo, ib_dev, eth_dev); - //all FW now support both ETH and IB so the OLD IB/ETH FW check is not needed anymore (see old implementation of flint) - if (strlen(_imgInfo.fw_info.psid) != 0 && strlen(_devInfo.fw_info.psid) != 0 && strncmp( _imgInfo.fw_info.psid, _devInfo.fw_info.psid, PSID_LEN)) { if (_flintParams.allow_psid_change) { @@ -1348,7 +1277,7 @@ FlintStatus BurnSubCommand::burnFs3() return FLINT_BURN_ABORTED; } // check Psid - if (_devQueryRes && !checkPSIDAndIbEth()) { + if (_devQueryRes && !checkPSID()) { return FLINT_FAILED; } // deal with rom @@ -1455,7 +1384,7 @@ FlintStatus BurnSubCommand::burnFs2() return FLINT_BURN_ABORTED; } //check Psid - if (_devQueryRes && !checkPSIDAndIbEth()) { + if (_devQueryRes && !checkPSID()) { return FLINT_FAILED; } @@ -1529,22 +1458,19 @@ bool BurnSubCommand::dealWithGuids() bool read_guids = true; bool ib_dev; bool eth_dev; - bool bx_dev; // Get the FW types - bx_dev = _imgInfo.fw_info.chip_type == CT_BRIDGEX; FwOperations::SetDevFlags(_imgInfo.fw_info.chip_type, _imgInfo.fw_info.dev_type, (fw_img_type)_imgInfo.fw_type, ib_dev, eth_dev); //setDevFlags(_imgInfo, ib_dev, eth_dev); // Check if there is a need to read guids if (_burnParams.useImageGuids || _burnParams.blankGuids || (_burnParams.userGuidsSpecified && ib_dev) - || (_burnParams.userMacsSpecified) - || (_burnParams.userUidsSpecified && bx_dev)) { + || (_burnParams.userMacsSpecified)) { read_guids = false; } // Check if the burnt FW is ok and readable in order to get the GUIDs later if (read_guids && !_devQueryRes) { - //printMissingGuidErr(ib_dev, eth_dev, bx_dev); + //printMissingGuidErr(ib_dev, eth_dev); if (_burnParams.burnFailsafe) { reportErr(true, "Can not extract GUIDs/MACs info from flash, %s\n" @@ -1552,23 +1478,23 @@ bool BurnSubCommand::dealWithGuids() " If you want to burn in non failsafe mode, use the \"-nofs\" switch.\n", _fwOps->err()); } else { reportErr(true, "Can not extract GUIDs/MACs info from flash, %s", _fwOps->err()); - printMissingGuidErr(ib_dev, eth_dev, bx_dev); + printMissingGuidErr(ib_dev, eth_dev); } return false; } // Check guids flag to ensure correct patching of guids in mlxfwops bool is_guids_specified = _burnParams.userGuidsSpecified || _burnParams.userMacsSpecified - || _burnParams.userUidsSpecified; + || _burnParams.userUidSpecified; if (is_guids_specified) { - if (!checkGuidsFlags((chip_type_t)_imgInfo.fw_info.chip_type, _imgInfo.fw_info.dev_type, _fwType,\ - _burnParams.userGuidsSpecified, _burnParams.userMacsSpecified, _burnParams.userUidsSpecified, ib_dev, eth_dev)) { + if (!checkGuidsFlags( _imgInfo.fw_info.dev_type, _fwType,\ + _burnParams.userGuidsSpecified, _burnParams.userMacsSpecified, _burnParams.userUidSpecified, ib_dev, eth_dev)) { return false; } } //report guid changes if needed. and update the user_guids vector in _burnParams if (is_guids_specified || _flintParams.use_image_guids) { - guid_t* new_guids = ( _burnParams.userGuidsSpecified || _burnParams.userUidsSpecified )?\ + guid_t* new_guids = ( _burnParams.userGuidsSpecified || _burnParams.userUidSpecified )?\ &_burnParams.userUids[0] : _devInfo.fs2_info.guids; guid_t* new_macs = _burnParams.userMacsSpecified != 0 ? &_burnParams.userUids[GUIDS] : &_devInfo.fs2_info.guids[GUIDS]; guid_t* old_guids = !_devQueryRes ? NULL : _devInfo.fs2_info.guids; @@ -1579,7 +1505,7 @@ bool BurnSubCommand::dealWithGuids() } //printf("-D- l=%d, h=%d\n", new_macs->l, new_macs->h); if (!reportGuidChanges(new_guids, new_macs, old_guids, old_macs, ib_dev,\ - eth_dev, bx_dev, _imgInfo.fs2_info.guid_num)) { + eth_dev, _imgInfo.fs2_info.guid_num)) { return false; } @@ -1588,7 +1514,7 @@ bool BurnSubCommand::dealWithGuids() } #define IS_HCA(chipType) \ - (((chipType) == CT_CONNECTX) || ((chipType) == CT_CONNECT_IB) || ((chipType) == CT_CONNECTX4) || ((chipType) == CT_CONNECTX4_LX)) + (((chipType) == CT_CONNECTX) || ((chipType) == CT_CONNECT_IB) || ((chipType) == CT_CONNECTX4) || ((chipType) == CT_CONNECTX4_LX) || ((chipType) == CT_CONNECTX5)) void BurnSubCommand::dealWithExpRom() { @@ -1705,72 +1631,6 @@ bool QuerySubCommand::checkMac(u_int64_t mac, string& warrStr) { return true; } -bool QuerySubCommand::reportBxGuidsQuery(const guid_t* guids, int base1, int guids_num, int index, const char* pre_str) -{ - int i, first_index, base, wwnns_index; - - printf("G%d %-14s", index, pre_str); - first_index = index * BX_SLICE_GUIDS; - if (base1 == BI_WWPNS) { - wwnns_index = first_index + (BX_SLICE_GUIDS - 1); - printf(GUID_FORMAT " ", guids[wwnns_index].h, guids[wwnns_index].l); - } - base = first_index + base1; - for (i = base; i < base + guids_num; i++) { - int j = i; - // HACK - if (i == BI_GUIDS + BX_SLICE_GUIDS) { - // We display the same node guid on the two slices. - j = BI_GUIDS; - } - printf(GUID_FORMAT " ", guids[j].h, guids[j].l); - } - printf("\n"); - return true; -} - - -bool QuerySubCommand::reportBxMacsQuery(const guid_t* guids, int base1, int guids_num, int index, const char* pre_str) -{ - int i, base; - - base = index * BX_SLICE_GUIDS + base1; - printf("G%d %-30s", index, pre_str); - for (i = base; i < base + guids_num; i++) { - printf(" " MAC_FORMAT , guids[i].h, guids[i].l); - } - printf("\n"); - return true; -} - -bool QuerySubCommand::reportBxMacsWarnings(const guid_t* guids, int index, int warning, int user_uids) -{ - int i, base; - int is_first = 1; - base = index * BX_SLICE_GUIDS + BI_IMACS; - for (i = base; i < base + BX_MACS; i++) { - u_int64_t mac = (((u_int64_t)guids[i].h) << 32) | guids[i].l; - string warrStr; - if (!checkMac(mac, warrStr)) { - if (warning) { - if (is_first) { - printf("\n\n"); - is_first = 0; - } - printf(FLINT_BAD_MAC_ADRESS_WARNING, guids[i].h, guids[i].l, warrStr.c_str()); - } else { - printf(FLINT_BX_BAD_MAC_FORMAT_ERROR, - guids[i].h, - guids[i].l, - user_uids ? "given" : "found on flash"); - return false; - } - } - } - return true; -} - - bool QuerySubCommand::displayFs2Uids(const fw_info_t& fwInfo) { const char* mac_indent = ""; @@ -1779,115 +1639,104 @@ bool QuerySubCommand::displayFs2Uids(const fw_info_t& fwInfo) FwOperations::SetDevFlags(fwInfo.fw_info.chip_type, fwInfo.fw_info.dev_type, (fw_img_type)fwInfo.fw_type, ibDev, ethDev); //setDevFlags(fwInfo, ibDev, ethDev); int numPorts = 2; - if ((fwInfo.fw_info.chip_type == CT_IS4) || (fwInfo.fw_info.chip_type == CT_SWITCHX)) { + if ((fwInfo.fw_info.chip_type == CT_SWITCHX)) { numPorts = 0; } //we do not support cards with one port anymore. // GUIDS: - - if (fwInfo.fw_info.chip_type == CT_BRIDGEX) { - int i; - if (fwInfo.fs2_info.guid_num != BX_ALL_GUIDS) { - reportErr(true, FLINT_INVALID_UID_NUM_BX_ERROR, BX_ALL_GUIDS); - return false; - } - printf("Description: Node Port1 Port2 Port3 Port4\n"); - for (i = 0; i < BX_SLICES_NUM; i++) { - reportBxGuidsQuery(fwInfo.fs2_info.guids, BI_GUIDS, BX_NP_GUIDS, i, "GUIDs:"); - reportBxMacsQuery(fwInfo.fs2_info.guids, BI_IMACS, BX_IMACS, i, "IMACs:"); - reportBxMacsQuery(fwInfo.fs2_info.guids, BI_EMACS, BX_EMACS, i, "EMACs:"); - reportBxGuidsQuery(fwInfo.fs2_info.guids, BI_WWPNS, BX_WWPNS, i, "WWNs: "); - } - printf("SYS GUID: " GUID_FORMAT " ",\ - fwInfo.fs2_info.guids[fwInfo.fs2_info.guid_num - 1].h,\ - fwInfo.fs2_info.guids[fwInfo.fs2_info.guid_num - 1].l); - if (!fwInfo.fs2_info.blank_guids) { - for (i = 0; i < BX_SLICES_NUM; i++) { - reportBxMacsWarnings(fwInfo.fs2_info.guids, i, 1, 0); + if (ibDev) { + //report("GUID Des: Node Port1 "); + printf("Description: Node "); + if (numPorts > 0) + printf("Port1 "); + if (numPorts > 1) + printf("Port2 "); + printf( "Sys image\n"); + + printf("GUIDs: "); + for (u_int32_t i=0; i < GUIDS; i++) { + if ((i == 1 && numPorts < 1) || + (i == 2 && numPorts < 2)) { + continue; } + printf(GUID_FORMAT " ", fwInfo.fs2_info.guids[i].h, fwInfo.fs2_info.guids[i].l); } - } else { - if (ibDev) { - //report("GUID Des: Node Port1 "); - printf("Description: Node "); - if (numPorts > 0) - printf("Port1 "); - if (numPorts > 1) - printf("Port2 "); - printf( "Sys image\n"); - - printf("GUIDs: "); - for (u_int32_t i=0; i < GUIDS; i++) { - if ((i == 1 && numPorts < 1) || - (i == 2 && numPorts < 2)) { - continue; - } - printf(GUID_FORMAT " ", fwInfo.fs2_info.guids[i].h, fwInfo.fs2_info.guids[i].l); + if (numPorts > 0) { + mac_indent = " "; + } + } + // MACS: + if (ethDev) { + if (fwInfo.fs2_info.guid_num == 6) { + if (!ibDev) { + printf("Description:%s Port1 Port2\n", mac_indent); + } else if (fwInfo.fw_info.chip_type == CT_SWITCHX) { + printf("\nDescription: Base Switch\n"); + } else { + printf("\n"); } - if (numPorts > 0) { - mac_indent = " "; + printf("MACs: %s ", mac_indent); + for (u_int32_t i=GUIDS; i < 6; i++) { + printf(" " MAC_FORMAT , fwInfo.fs2_info.guids[i].h, fwInfo.fs2_info.guids[i].l); } - } - // MACS: - if (ethDev) { - if (fwInfo.fs2_info.guid_num == 6) { - if (!ibDev) { - printf("Description:%s Port1 Port2\n", mac_indent); - } else if (fwInfo.fw_info.chip_type == CT_SWITCHX) { - printf("\nDescription: Base Switch\n"); - } else { - printf("\n"); - } - printf("MACs: %s ", mac_indent); - for (u_int32_t i=GUIDS; i < 6; i++) { - printf(" " MAC_FORMAT , fwInfo.fs2_info.guids[i].h, fwInfo.fs2_info.guids[i].l); - } - for (u_int32_t i=GUIDS; i < 6; i++) { - u_int64_t mac = (((u_int64_t)fwInfo.fs2_info.guids[i].h) << 32) | fwInfo.fs2_info.guids[i].l; - string warrStr; - if (!fwInfo.fs2_info.blank_guids && !checkMac(mac, warrStr)) { - if (i==GUIDS) printf("\n\n"); - printf(FLINT_BAD_MAC_ADRESS_WARNING, fwInfo.fs2_info.guids[i].h, fwInfo.fs2_info.guids[i].l, warrStr.c_str()); - } + for (u_int32_t i=GUIDS; i < 6; i++) { + u_int64_t mac = (((u_int64_t)fwInfo.fs2_info.guids[i].h) << 32) | fwInfo.fs2_info.guids[i].l; + string warrStr; + if (!fwInfo.fs2_info.blank_guids && !checkMac(mac, warrStr)) { + if (i==GUIDS) printf("\n\n"); + printf(FLINT_BAD_MAC_ADRESS_WARNING, fwInfo.fs2_info.guids[i].h, fwInfo.fs2_info.guids[i].l, warrStr.c_str()); } - } else { - printf(FLINT_MAC_ENTRIES_WARNING, 6, fwInfo.fs2_info.guid_num); } + } else { + printf(FLINT_MAC_ENTRIES_WARNING, 6, fwInfo.fs2_info.guid_num); } } + printf("\n"); return true; } #define BASE_STR "Base" #define PRINT_FS3_UID(uid1, str, printStep) \ - printf("%-16s %016"U64H_FMT_GEN" %d", str, uid1.uid, uid1.num_allocated);\ + printf("%-16s %016"U64H_FMT_GEN" %d", str, uid1.uid, uid1.num_allocated);\ if (printStep) {\ - printf(" %d", uid1.step);\ + printf(" %d", uid1.step);\ }\ printf("\n"); -#define PRINT_FS3_UIDS(uid1, uid2, str, printStep) {\ - PRINT_FS3_UID(uid1, BASE_STR" "str":", printStep);\ - if (uid1.uid != uid2.uid || uid1.num_allocated != uid2.num_allocated || ( printStep && uid1.step != uid2.step)) {\ - PRINT_FS3_UID(uid2, "Orig " BASE_STR " "str":", printStep);\ - } \ + +static inline void printFs3Uids(struct fs3_uid_entry uid, struct fs3_uid_entry orig_uid, string guidMac, bool printStep) +{ + string prefix = BASE_STR + string(" ") + guidMac + ":"; + PRINT_FS3_UID(uid, prefix.c_str(), printStep); + if (uid.uid != orig_uid.uid || uid.num_allocated != orig_uid.num_allocated || ( printStep && uid.step != orig_uid.step)) { + // Print MFG UIDs as well + prefix = "Orig " + prefix; + PRINT_FS3_UID(orig_uid, prefix.c_str(), printStep); + } } bool QuerySubCommand::displayFs3Uids(const fw_info_t& fwInfo) { if (fwInfo.fs3_info.fs3_uids_info.valid_field) { // new GUIDs format - printf("Description: UID GuidsNumber\n"); - PRINT_FS3_UIDS(fwInfo.fs3_info.fs3_uids_info.cx4_uids.base_guid, fwInfo.fs3_info.orig_fs3_uids_info.cx4_uids.base_guid, "GUID", false); - PRINT_FS3_UIDS(fwInfo.fs3_info.fs3_uids_info.cx4_uids.base_mac, fwInfo.fs3_info.orig_fs3_uids_info.cx4_uids.base_mac, "MAC", false); + printf("Description: UID GuidsNumber\n"); + printFs3Uids(fwInfo.fs3_info.fs3_uids_info.cx4_uids.base_guid, fwInfo.fs3_info.orig_fs3_uids_info.cx4_uids.base_guid, "GUID", false); + printFs3Uids(fwInfo.fs3_info.fs3_uids_info.cx4_uids.base_mac, fwInfo.fs3_info.orig_fs3_uids_info.cx4_uids.base_mac, "MAC", false); } else { - printf("Description: UID GuidsNumber Step\n"); - PRINT_FS3_UIDS(fwInfo.fs3_info.fs3_uids_info.cib_uids.guids[0], fwInfo.fs3_info.orig_fs3_uids_info.cib_uids.guids[0], "GUID1", true); - PRINT_FS3_UIDS(fwInfo.fs3_info.fs3_uids_info.cib_uids.guids[1], fwInfo.fs3_info.orig_fs3_uids_info.cib_uids.guids[1], "GUID2", true); - PRINT_FS3_UIDS(fwInfo.fs3_info.fs3_uids_info.cib_uids.macs[0], fwInfo.fs3_info.orig_fs3_uids_info.cib_uids.macs[0], "MAC1", true); - PRINT_FS3_UIDS(fwInfo.fs3_info.fs3_uids_info.cib_uids.macs[1], fwInfo.fs3_info.orig_fs3_uids_info.cib_uids.macs[1], "MAC2", true); + printf("Description: UID GuidsNumber Step\n"); + string firstGuid = (fwInfo.fw_info.chip_type != CT_SWITCH_IB) ? "GUID1" : "GUID"; + string firstMac = (fwInfo.fw_info.chip_type != CT_SWITCH_IB) ? "MAC1" : "MAC"; + + printFs3Uids(fwInfo.fs3_info.fs3_uids_info.cib_uids.guids[0], fwInfo.fs3_info.orig_fs3_uids_info.cib_uids.guids[0], firstGuid, true); + if (fwInfo.fw_info.chip_type != CT_SWITCH_IB) { + printFs3Uids(fwInfo.fs3_info.fs3_uids_info.cib_uids.guids[1], fwInfo.fs3_info.orig_fs3_uids_info.cib_uids.guids[1], "GUID2", true); + } + printFs3Uids(fwInfo.fs3_info.fs3_uids_info.cib_uids.macs[0], fwInfo.fs3_info.orig_fs3_uids_info.cib_uids.macs[0], firstMac, true); + if (fwInfo.fw_info.chip_type != CT_SWITCH_IB) { + printFs3Uids(fwInfo.fs3_info.fs3_uids_info.cib_uids.macs[1], fwInfo.fs3_info.orig_fs3_uids_info.cib_uids.macs[1], "MAC2", true); + } } return true; } @@ -1898,58 +1747,79 @@ FlintStatus QuerySubCommand::printInfo(const fw_info_t& fwInfo, bool fullQuery) { bool isFs2 = (fwInfo.fw_type == FIT_FS2) ? true : false; - printf("Image type: %s\n",(isFs2)? "FS2" : "FS3"); + printf("Image type: %s\n",(isFs2)? "FS2" : "FS3"); if (fwInfo.fw_info.fw_ver[0] || fwInfo.fw_info.fw_ver[1] || fwInfo.fw_info.fw_ver[2]) { char versionStr[64] = {0}; snprintf(versionStr, 64, VERSION_FORMAT(fwInfo.fw_info.fw_ver[1]), fwInfo.fw_info.fw_ver[0], fwInfo.fw_info.fw_ver[1], fwInfo.fw_info.fw_ver[2]); - printf("FW Version: %s\n", versionStr); + printf("FW Version: %s\n", versionStr); + if ((fwInfo.fw_info.running_fw_ver[0] || fwInfo.fw_info.running_fw_ver[1] || fwInfo.fw_info.running_fw_ver[2]) && \ + (fwInfo.fw_info.running_fw_ver[0] != fwInfo.fw_info.fw_ver[0] || \ + fwInfo.fw_info.running_fw_ver[1] != fwInfo.fw_info.fw_ver[1] || \ + fwInfo.fw_info.running_fw_ver[2] != fwInfo.fw_info.fw_ver[2])) { + snprintf(versionStr, 64, VERSION_FORMAT(fwInfo.fw_info.running_fw_ver[1]), fwInfo.fw_info.running_fw_ver[0], fwInfo.fw_info.running_fw_ver[1], + fwInfo.fw_info.running_fw_ver[2]); + printf("FW Version(Running): %s\n", versionStr); + } } if (fwInfo.fw_info.fw_rel_date[0] || fwInfo.fw_info.fw_rel_date[1] || fwInfo.fw_info.fw_rel_date[2]) { - printf("FW Release Date: %x.%x.%x\n", fwInfo.fw_info.fw_rel_date[0], fwInfo.fw_info.fw_rel_date[1],\ + printf("FW Release Date: %x.%x.%x\n", fwInfo.fw_info.fw_rel_date[0], fwInfo.fw_info.fw_rel_date[1],\ fwInfo.fw_info.fw_rel_date[2]); } if (fullQuery) { // there is no full query atm just quick query if (fwInfo.fw_info.min_fit_ver[0] || fwInfo.fw_info.min_fit_ver[1]\ || fwInfo.fw_info.min_fit_ver[2]||fwInfo.fw_info.min_fit_ver[3]) { - printf("Min FIT Version: %d.%d.%d.%d\n", fwInfo.fw_info.min_fit_ver[0],\ + printf("Min FIT Version: %d.%d.%d.%d\n", fwInfo.fw_info.min_fit_ver[0],\ fwInfo.fw_info.min_fit_ver[1], fwInfo.fw_info.min_fit_ver[2], fwInfo.fw_info.min_fit_ver[3]); } if ((fwInfo.fw_info.mic_ver[0] || fwInfo.fw_info.mic_ver[1] || fwInfo.fw_info.mic_ver[2])) { - printf("MIC Version: %d.%d.%d\n", fwInfo.fw_info.mic_ver[0],\ + printf("MIC Version: %d.%d.%d\n", fwInfo.fw_info.mic_ver[0],\ fwInfo.fw_info.mic_ver[1], fwInfo.fw_info.mic_ver[2]); } if (isFs2) { if (fwInfo.fs2_info.config_sectors) { - printf("Config Sectors: %d\n", fwInfo.fs2_info.config_sectors); + printf("Config Sectors: %d\n", fwInfo.fs2_info.config_sectors); } if (fwInfo.fs2_info.config_pad) { - printf("Config Pad: %d\n", fwInfo.fs2_info.config_pad); + printf("Config Pad: %d\n", fwInfo.fs2_info.config_pad); } if (strlen(fwInfo.fs2_info.prs_name)) { - printf("PRS Name: %s\n", fwInfo.fs2_info.prs_name); + printf("PRS Name: %s\n", fwInfo.fs2_info.prs_name); + } + } else { // FS3 + if (strlen(fwInfo.fs3_info.prs_name)) { + printf("PRS Name: %s\n", fwInfo.fs3_info.prs_name); + } + if (strlen(fwInfo.fs3_info.orig_prs_name)) { + printf("Orig PRS Name: %s\n", fwInfo.fs3_info.orig_prs_name); + } + if (strlen(fwInfo.fs3_info.name)) { + printf("Part Number: %s\n", fwInfo.fs3_info.name); + } + if (strlen(fwInfo.fs3_info.description)) { + printf("Description: %s\n", fwInfo.fs3_info.description); } } } if (strlen(fwInfo.fw_info.product_ver)) { - printf("Product Version: %s\n", fwInfo.fw_info.product_ver); + printf("Product Version: %s\n", fwInfo.fw_info.product_ver); } if (fwInfo.fw_info.roms_info.exp_rom_found) { - displayExpRomInfo(fwInfo.fw_info.roms_info, "Rom Info: "); + displayExpRomInfo(fwInfo.fw_info.roms_info, "Rom Info: "); } if (isFs2) { - printf("Device ID: %d\n", fwInfo.fw_info.dev_type); + printf("Device ID: %d\n", fwInfo.fw_info.dev_type); } if (isFs2 && fwInfo.fs2_info.access_key_exists) { - printf("HW Access Key: "); + printf("HW Access Key: "); if (fwInfo.fs2_info.access_key_value.l || fwInfo.fs2_info.access_key_value.h) { printf("Enabled\n"); } else { @@ -1970,15 +1840,15 @@ FlintStatus QuerySubCommand::printInfo(const fw_info_t& fwInfo, bool fullQuery) // VSD, PSID if (!fwInfo.fw_info.vsd_vendor_id || fwInfo.fw_info.vsd_vendor_id == MELLANOX_VENDOR_ID) { if (!isFs2) { - printf("Image VSD: %s\n", fwInfo.fs3_info.image_vsd); - printf("Device VSD: %s\n", fwInfo.fw_info.vsd); - printf("PSID: %s\n", fwInfo.fw_info.psid); + printf("Image VSD: %s\n", fwInfo.fs3_info.image_vsd); + printf("Device VSD: %s\n", fwInfo.fw_info.vsd); + printf("PSID: %s\n", fwInfo.fw_info.psid); if (strncmp(fwInfo.fw_info.psid, fwInfo.fs3_info.orig_psid, 13) != 0) { - printf("Orig PSID: %s\n", fwInfo.fs3_info.orig_psid); + printf("Orig PSID: %s\n", fwInfo.fs3_info.orig_psid); } } else { - printf("VSD: %s\n", fwInfo.fw_info.vsd); - printf("PSID: %s\n", fwInfo.fw_info.psid); + printf("VSD: %s\n", fwInfo.fw_info.vsd); + printf("PSID: %s\n", fwInfo.fw_info.psid); } } else { printf(FLINT_NOT_MLNX_FW_WARNING, fwInfo.fw_info.vsd_vendor_id); @@ -2175,6 +2045,7 @@ BromSubCommand:: BromSubCommand() _v = Wtv_Dev_Or_Img; _cmdType = SC_Brom; _maxCmdParamNum = 1; + _minCmdParamNum = 1; memset(&_info, 0, sizeof(_info)); memset(&_romsInfo, 0, sizeof(_romsInfo)); } @@ -2185,14 +2056,6 @@ BromSubCommand:: ~BromSubCommand() _fRom.close(); } -bool BromSubCommand::verifyParams() { - if (_flintParams.cmd_params.size() != 1) { - reportErr(true, FLINT_CMD_ARGS_ERROR,_name.c_str() , 1, (int)_flintParams.cmd_params.size()); - return false; - } - return true; -} - bool BromSubCommand::getExpRomStrVer(roms_info_t& roms_info, char* version) { if (roms_info.rom_info[0].exp_rom_product_id >= 0x10) { @@ -2336,6 +2199,7 @@ RromSubCommand:: RromSubCommand() _example = FLINT_NAME" -d "MST_DEV_EXAMPLE1" rrom exp-rom.rom"; _v = Wtv_Dev_Or_Img; _maxCmdParamNum = 1; + _minCmdParamNum = 1; _cmdType = SC_Rrom; } @@ -2346,10 +2210,6 @@ RromSubCommand:: ~RromSubCommand() bool RromSubCommand::verifyParams() { - if (_flintParams.cmd_params.size() != 1) { - reportErr(true, FLINT_CMD_ARGS_ERROR,_name.c_str() , 1, (int)_flintParams.cmd_params.size()); - return false; - } FILE * file; if ((file = fopen(_flintParams.cmd_params[0].c_str(), "r")) != NULL) { fclose(file); @@ -2501,17 +2361,17 @@ bool SgSubCommand::verifyParams() return false; } if (!(_flintParams.guid_specified || _flintParams.guids_specified ||\ - _flintParams.uid_specified || _flintParams.uids_specified || \ + _flintParams.uid_specified || \ _flintParams.mac_specified || _flintParams.macs_specified)){ - reportErr(true, FLINT_COMMAND_FLAGS_ERROR, _name.c_str(), "GUIDs / MACs (using command line flags -guid(s) / -mac(s) )"); + reportErr(true, FLINT_COMMAND_FLAGS_ERROR, _name.c_str(), "GUIDs / MACs / UID (using command line flags -guid(s) / -mac(s) / -uid )"); return false; } - if ((_flintParams.guid_specified || _flintParams.guids_specified) && (_flintParams.uid_specified || _flintParams.uids_specified)) { - reportErr(true, FLINT_COMMAND_FLAGS_ERROR, _name.c_str(), "either GUIDs / UIDs (using command line flags -guid(s) / -uid(s) )"); + if ((_flintParams.guid_specified || _flintParams.guids_specified) && (_flintParams.uid_specified)) { + reportErr(true, FLINT_COMMAND_FLAGS_ERROR, _name.c_str(), "either GUIDs / UIDs (using command line flags -guid(s) / -uid )"); return false; } - if ((_flintParams.mac_specified || _flintParams.macs_specified) && (_flintParams.uid_specified || _flintParams.uids_specified)) { - reportErr(true, FLINT_COMMAND_FLAGS_ERROR, _name.c_str(), "either MACs / UIDs (using command line flags -mac(s) / -uid(s) )"); + if ((_flintParams.mac_specified || _flintParams.macs_specified) && (_flintParams.uid_specified)) { + reportErr(true, FLINT_COMMAND_FLAGS_ERROR, _name.c_str(), "either MACs / UIDs (using command line flags -mac(s) / -uid )"); return false; } if (_flintParams.guid_specified && _flintParams.guids_specified) { @@ -2522,14 +2382,10 @@ bool SgSubCommand::verifyParams() reportErr(true, FLINT_INVALID_FLAG_WITH_FLAG_ERROR, "-macs", "-mac" ); return false; } - if (_flintParams.uid_specified && _flintParams.uids_specified) { - reportErr(true, FLINT_INVALID_FLAG_WITH_FLAG_ERROR, "-uids", "-uid" ); - return false; - } _sgParams.guidsSpecified = _flintParams.guid_specified || _flintParams.guids_specified; _sgParams.macsSpecified = _flintParams.mac_specified || _flintParams.macs_specified; - _sgParams.uidsSpecified = _flintParams.uid_specified || _flintParams.uids_specified; + _sgParams.uidSpecified = _flintParams.uid_specified; _sgParams.updateCrc = !(_flintParams.cmd_params.size() == 1); _sgParams.stripedImage = _flintParams.striped_image; return true; @@ -2553,8 +2409,9 @@ void SgSubCommand::setUserGuidsAndMacs() _sgParams.userGuids.push_back(_flintParams.user_macs[0]); _sgParams.userGuids.push_back(_flintParams.user_macs[1]); } - if (_sgParams.uidsSpecified) { - _sgParams.userGuids = _flintParams.user_uids; + if (_sgParams.uidSpecified) { + _sgParams.userGuids.resize(0); + _sgParams.userGuids.push_back(_flintParams.baseUid); } _sgParams.userGuids.resize(MAX_GUIDS); } @@ -2563,18 +2420,17 @@ bool SgSubCommand::CheckSetGuidsFlags() { bool ibDev; bool ethDev; - bool bxDev = _info.fw_info.chip_type == CT_BRIDGEX; FwOperations::SetDevFlags(_info.fw_info.chip_type, _info.fw_info.dev_type, (fw_img_type)_info.fw_type, ibDev, ethDev); //setDevFlags(_info, ibDev,ethDev); - if (_sgParams.macsSpecified || _sgParams.guidsSpecified || _sgParams.uidsSpecified) { - if (!checkGuidsFlags((chip_type_t)_info.fw_info.chip_type, _info.fw_info.dev_type,_info.fw_type,\ - _sgParams.guidsSpecified, _sgParams.macsSpecified, _sgParams.uidsSpecified, ibDev, ethDev)) { + if (_sgParams.macsSpecified || _sgParams.guidsSpecified || _sgParams.uidSpecified) { + if (!checkGuidsFlags(_info.fw_info.dev_type,_info.fw_type,\ + _sgParams.guidsSpecified, _sgParams.macsSpecified, _sgParams.uidSpecified, ibDev, ethDev)) { return false; } } else { printf("-E- "); - printMissingGuidErr(ibDev, ethDev, bxDev); + printMissingGuidErr(ibDev, ethDev); printf("\n"); return false; } @@ -2603,15 +2459,14 @@ FlintStatus SgSubCommand::sgFs2() //report guid changes bool ethDev; bool ibDev; - bool bxDev = _info.fw_info.chip_type == CT_BRIDGEX; FwOperations::SetDevFlags(_info.fw_info.chip_type, _info.fw_info.dev_type, (fw_img_type)_info.fw_type, ibDev, ethDev); //setDevFlags(_info, ibDev, ethDev); //decide what are our new guids/macs - guid_t *new_guids = (_sgParams.guidsSpecified ||_sgParams.uidsSpecified) ? & _sgParams.userGuids[0] : &_info.fs2_info.guids[0] ; + guid_t *new_guids = (_sgParams.guidsSpecified ||_sgParams.uidSpecified) ? & _sgParams.userGuids[0] : &_info.fs2_info.guids[0] ; guid_t *new_macs = _sgParams.macsSpecified ? &_sgParams.userGuids[GUIDS] : &_info.fs2_info.guids[GUIDS] ; if (!reportGuidChanges(new_guids, new_macs, &_info.fs2_info.guids[0], &_info.fs2_info.guids[GUIDS], ibDev,\ - ethDev, bxDev, _info.fs2_info.guid_num)){ + ethDev, _info.fs2_info.guid_num)){ return FLINT_FAILED; } } @@ -2634,7 +2489,7 @@ FlintStatus SgSubCommand::sgFs3() } // TODO: create method that checks the flags for FS3/FS2 - if (_info.fw_info.chip_type == CT_CONNECT_IB || _info.fw_info.chip_type == CT_SWITCH_IB) { + if (_info.fw_info.chip_type == CT_CONNECT_IB || _info.fw_info.chip_type == CT_SWITCH_IB || _info.fw_info.chip_type == CT_SWITCH_IB2) { if (!_flintParams.uid_specified) { reportErr(true, FLINT_NO_UID_FLAG_ERROR); return FLINT_FAILED; @@ -2726,10 +2581,6 @@ bool SmgSubCommand::verifyParams() reportErr(true, FLINT_COMMAND_FLAGS_ERROR, _name.c_str(), "\"-uid or -guid/-mac\" flags"); return false; } - if (_flintParams.uids_specified) { - reportErr(true, FLINT_INVALID_OPTION_ERROR, "\"-uids\"", _name.c_str(), "\"-uid\""); - return false; - } if (_flintParams.guids_specified) { reportErr(true, FLINT_INVALID_OPTION_ERROR, "\"-guids\"", _name.c_str(), "\"-guid\""); return false; @@ -2783,7 +2634,7 @@ FlintStatus SmgSubCommand::executeCommand() return FLINT_FAILED; } - if (_info.fw_info.chip_type == CT_CONNECT_IB || _info.fw_info.chip_type == CT_SWITCH_IB) { + if (_info.fw_info.chip_type == CT_CONNECT_IB || _info.fw_info.chip_type == CT_SWITCH_IB || _info.fw_info.chip_type == CT_SWITCH_IB2) { if (!_flintParams.uid_specified) { reportErr(true, "Can not set GUIDs/MACs: uid is not specified, please run with -uid flag.\n"); return FLINT_FAILED; @@ -2823,6 +2674,7 @@ SetVpdSubCommand:: SetVpdSubCommand() ; _v = Wtv_Dev_Or_Img; _maxCmdParamNum = 1; + _minCmdParamNum = 1; _cmdType = SC_Set_Vpd; } @@ -2831,15 +2683,6 @@ SetVpdSubCommand:: ~SetVpdSubCommand() } -bool SetVpdSubCommand:: verifyParams() -{ - if( _flintParams.cmd_params.size() != 1) { - reportErr(true, FLINT_CMD_ARGS_ERROR, _name.c_str(), 1, (int)_flintParams.cmd_params.size()); - return false; - } - return true; -} - FlintStatus SetVpdSubCommand:: executeCommand() { if (preFwOps() == FLINT_FAILED) { @@ -2927,6 +2770,7 @@ RiSubCommand:: RiSubCommand() _example = FLINT_NAME" -d "MST_DEV_EXAMPLE1" ri file.bin"; _v = Wtv_Dev; _maxCmdParamNum = 1; + _minCmdParamNum = 1; _cmdType = SC_Ri; } @@ -2935,14 +2779,6 @@ RiSubCommand:: ~RiSubCommand() } -bool RiSubCommand::verifyParams() { - if (_flintParams.cmd_params.size() != 1) { - reportErr(true, FLINT_CMD_ARGS_ERROR,_name.c_str() , 1, (int)_flintParams.cmd_params.size()); - return false; - } - return true; -} - FlintStatus RiSubCommand::executeCommand() { //init fw operation object if (preFwOps() == FLINT_FAILED) { @@ -3317,6 +3153,7 @@ HwSubCommand:: HwSubCommand() #endif _v = Wtv_Dev; _maxCmdParamNum = 2; + _minCmdParamNum = 1; _cmdType = SC_Hw; } @@ -3494,6 +3331,7 @@ EraseSubCommand:: EraseSubCommand() _example = FLINT_NAME" -d "MST_DEV_EXAMPLE1" erase 0x10000"; _v = Wtv_Dev; _maxCmdParamNum = 1; + _minCmdParamNum = 1; _cmdType = SC_Erase; } @@ -3502,15 +3340,6 @@ EraseSubCommand:: ~EraseSubCommand() } -bool EraseSubCommand::verifyParams() { - if (_flintParams.cmd_params.size() != 1) { - reportErr(true, FLINT_CMD_ARGS_ERROR,_name.c_str() , 1, (int)_flintParams.cmd_params.size()); - return false; - } - //parameter format will be checked in executeCommand. - return true; -} - FlintStatus EraseSubCommand::executeCommand() { if (preFwAccess() == FLINT_FAILED) { return FLINT_FAILED; @@ -3548,6 +3377,7 @@ RwSubCommand:: RwSubCommand() { _example = "flint -d "MST_DEV_EXAMPLE1" rw 0x20"; _v = Wtv_Dev_Or_Img; _maxCmdParamNum = 1; + _minCmdParamNum = 1; _cmdType = SC_Rw; } @@ -3555,14 +3385,6 @@ RwSubCommand:: ~RwSubCommand() { } -bool RwSubCommand::verifyParams() { - if (_flintParams.cmd_params.size() != 1) { - reportErr(true, FLINT_CMD_ARGS_ERROR,_name.c_str() , 1, (int)_flintParams.cmd_params.size()); - return false; - } - return true; -} - FlintStatus RwSubCommand::executeCommand() { if (preFwAccess() == FLINT_FAILED) { return FLINT_FAILED; @@ -3606,6 +3428,7 @@ WwSubCommand:: WwSubCommand() _example = FLINT_NAME" -d "MST_DEV_EXAMPLE1" ww 0x10008 0x5a445a44"; _v = Wtv_Dev; _maxCmdParamNum = 2; + _minCmdParamNum = 2; _cmdType = SC_Ww; } @@ -3614,14 +3437,6 @@ WwSubCommand:: ~WwSubCommand() } -bool WwSubCommand::verifyParams() { - if (_flintParams.cmd_params.size() != 2) { - reportErr(true, FLINT_CMD_ARGS_ERROR,_name.c_str() , 2, (int)_flintParams.cmd_params.size()); - return false; - } - return true; -} - FlintStatus WwSubCommand::executeCommand() { //init fw operation object if (preFwAccess() == FLINT_FAILED) { @@ -3675,6 +3490,7 @@ WwneSubCommand:: WwneSubCommand() _example = "flint -d "MST_DEV_EXAMPLE1" wwne 0x10008 0x5a445a44"; _v = Wtv_Dev; _maxCmdParamNum = 2; + _minCmdParamNum = 2; _cmdType = SC_Wwne; } @@ -3683,14 +3499,6 @@ WwneSubCommand:: ~WwneSubCommand() } -bool WwneSubCommand::verifyParams() { - if (_flintParams.cmd_params.size() != 2) { - reportErr(true, FLINT_CMD_ARGS_ERROR,_name.c_str() , 2, (int)_flintParams.cmd_params.size()); - return false; - } - return true; -} - FlintStatus WwneSubCommand::executeCommand() { //init fw operation object if (preFwAccess() == FLINT_FAILED) { @@ -3741,6 +3549,7 @@ WbSubCommand:: WbSubCommand() { _example = FLINT_NAME" -d "MST_DEV_EXAMPLE1" wb myData.bin 0x0"; _v = Wtv_Dev; _maxCmdParamNum = 2; + _minCmdParamNum = 2; _cmdType = SC_Wb; } @@ -3748,14 +3557,6 @@ WbSubCommand:: ~WbSubCommand() { } -bool WbSubCommand::verifyParams() { - if (_flintParams.cmd_params.size() != 2) { - reportErr(true, FLINT_CMD_ARGS_ERROR,_name.c_str() , 2, (int)_flintParams.cmd_params.size()); - return false; - } - return true; -} - bool WbSubCommand::extractData(const std::vector& cmdParams , u_int32_t* addr, std::vector& data) { // get address char *endp; @@ -3813,7 +3614,7 @@ WbneSubCommand:: WbneSubCommand() { INDENTEX"data - data to write - space seperated dwords"; _example = FLINT_NAME" -d "MST_DEV_EXAMPLE1" wbne 0x10000 12 0x30000 0x76800 0x5a445a44"; _v = Wtv_Dev; - _maxCmdParamNum = -1; + _minCmdParamNum = 3; _cmdType = SC_Wbne; } @@ -3836,14 +3637,6 @@ bool WbneSubCommand::writeBlock(u_int32_t addr, std::vector dataVec) return true; } -bool WbneSubCommand::verifyParams() { - if (_flintParams.cmd_params.size() < 3) { - reportErr(true, FLINT_CMD_ARGS_ERROR3,_name.c_str() , 3, (int)_flintParams.cmd_params.size()); - return false; - } - return true; -} - bool WbneSubCommand::extractData(const std::vector& cmdParams , u_int32_t* addr, std::vector& data) { char *endp; char* addrStr = strcpy(new char[cmdParams[0].size() + 1],cmdParams[0].c_str()); @@ -3909,6 +3702,7 @@ RbSubCommand:: RbSubCommand() _example = FLINT_NAME" -d "MST_DEV_EXAMPLE1" rb 0x10000 100 file.bin"; _v = Wtv_Dev_Or_Img; _maxCmdParamNum = 3; + _minCmdParamNum = 2; _cmdType = SC_Rb; } @@ -3933,14 +3727,6 @@ bool RbSubCommand::readBlock(u_int32_t addr, std::vector& buff, bool i return true; } -bool RbSubCommand::verifyParams() { - if (_flintParams.cmd_params.size() < 2) { - reportErr(true, FLINT_CMD_ARGS_ERROR3,_name.c_str() , 2, (int)_flintParams.cmd_params.size()); - return false; - } - return true; -} - bool RbSubCommand::printToScreen(const std::vector& buff) { for (u_int32_t i=0; i < buff.size(); i+=4) { u_int32_t word = *((u_int32_t*)(&buff[0] + i)); @@ -4154,3 +3940,370 @@ FlintStatus FiSubCommand::executeCommand() return FLINT_SUCCESS; } + +/*********************** + *Class: CheckSum + **********************/ +CheckSumSubCommand:: CheckSumSubCommand() +{ + _name = "checksum"; + _desc = "perform MD5 checksum on FW."; + _extendedDesc = "perform an MD5 checksum on relevant(non-persistent between FW upgrades) data on device/image."; + _flagLong = "checksum"; + _flagShort = "cs"; + _param = ""; + _paramExp = ""; + _example = FLINT_NAME" -d "MST_DEV_EXAMPLE1" checksum"; + _v = Wtv_Dev_Or_Img; + _maxCmdParamNum = 0; + _cmdType = SC_Check_Sum; + memset(_checkSum, 0, sizeof(_checkSum)); +} + +CheckSumSubCommand:: ~CheckSumSubCommand() +{ + +} + +bool CheckSumSubCommand::extractChecksumFromStr(string str, u_int8_t checkSum[16]) +{ + char ptr[2]; + int i = 15; + if (str.size() < 2) { + reportErr(true, FLINT_CHECKSUM_LEN_ERROR ); + return false; + } + if (!strncasecmp(str.c_str(), "0x", 2)) { + // str starts with 0x or 0X, remove prefix + str = &(str.c_str()[2]); + } + + if (str.size() != 32) { + reportErr(true, FLINT_CHECKSUM_LEN_ERROR ); + return false; + } + stringstream ss(str); + while (i >= 0) { + ss.read(ptr, 2); + if (!isxdigit(ptr[0]) || !isxdigit(ptr[1])) { + reportErr(true, FLINT_CHECKSUM_HEX_ERROR); + return false; + } + checkSum[i] = (u_int8_t)strtoul(ptr, NULL, 16); + if (!checkSum[i] && strncmp(ptr, "00", 2)) { + reportErr(true, FLINT_CHECKSUM_PARSE_ERROR); + return false; + } + i--; + } + return true; +} + +string CheckSumSubCommand::checkSum2Str(u_int8_t chksm[16]) +{ + stringstream ss; + for (int i=15; i >= 0; i--) { + char chunk[3]; + snprintf(chunk, 3, "%02x", chksm[i]); + ss << chunk; + } + string s = ss.str(); + return s; +} + +FlintStatus CheckSumSubCommand::executeCommand() +{ + if (preFwOps() == FLINT_FAILED) { + return FLINT_FAILED; + } + FwOperations* ops = _fwOps ? _fwOps : _imgOps; + printf("-I- Calculating Checksum ...\n"); + if (!ops->FwCalcMD5(_checkSum)){ + reportErr(true, FLINT_CHECKSUM_ERROR, (_flintParams.device_specified ? "device" : "image"), ops->err()); + return FLINT_FAILED; + } + // just print it! + printf("Checksum: %s\n", checkSum2Str(_checkSum).c_str()); + return FLINT_SUCCESS; + +} + + +/*********************** + *Class: TimeStamp + **********************/ +TimeStampSubCommand:: TimeStampSubCommand() +{ + _name = "time stamp"; + _desc = "FW time stamping."; + _extendedDesc = "set/query/reset time stamp on device/image."; + _flagLong = "timestamp"; + _flagShort = "ts"; + _param = " [timestamp] [FW version]"; + _paramExp = "set [FW version] : set the specified timestamp. if set on device FW version must be specified\n" + INDENTEX" timestamp should comply with ISO 8601 format and provided with UTC timezone: YYYY-MM-DDThh:mm:ssZ\n" + INDENTEX"query : query device/image to view the timestamp\n" + INDENTEX"reset : reset the timestamp, remove the timestamp from device/image.\n"; + _example = FLINT_NAME" -d "MST_DEV_EXAMPLE4" ts set 2015-12-24T14:52:33Z 14.12.1100\n" + INDENTEX FLINT_NAME" -d "MST_DEV_EXAMPLE4" ts reset\n" + INDENTEX FLINT_NAME" -i ./fw4115.bin ts set\n" + INDENTEX FLINT_NAME" -i ./fw4115.bin ts query"; + _v = Wtv_Dev_Or_Img; + _maxCmdParamNum = 3; + _minCmdParamNum = 1; + _cmdType = SC_Time_Stamp; + memset(&_userFwVer, 0, sizeof(_userFwVer)); + memset(&_userTsEntry, 0, sizeof(_userTsEntry)); + _operation = TS_No_Command; + _ops = (FwOperations*)NULL; +} + +TimeStampSubCommand:: ~TimeStampSubCommand() +{ + +} +bool TimeStampSubCommand::parseFwVersion(string verStr) +{ + unsigned int major = 0; + unsigned int minor = 0; + unsigned int subminor = 0; + int count = sscanf(verStr.c_str(), "%02d.%02d.%04d", &major, &minor, &subminor); + if (count !=3) { + count = sscanf(verStr.c_str(), "%02d.%04d.%04d", &major, &minor, &subminor); + if (count != 3) { + reportErr(true, "Failed to parse FW version. expected format: MM.mm.ssss\n"); + return false; + } + } + _userFwVer.fw_ver_major = major; + _userFwVer.fw_ver_minor = minor; + _userFwVer.fw_ver_subminor = subminor; + //printf("-D- Fw version: %d.%d.%d\n", _userFwVer.fw_ver_major, _userFwVer.fw_ver_minor, _userFwVer.fw_ver_subminor); + return true; +} + +#define BCD2_TO_NUM(bcd)\ + ((((bcd) >> 4 & 0xf) * 10) + ((bcd) & 0xf)) + +#define BCD4_TO_NUM(bcd) \ + ((BCD2_TO_NUM((bcd) >> 8 & 0xff) * 100) + (BCD2_TO_NUM((bcd) & 0xff))) + +#define NUM2_TO_BCD(num) \ + ((((num) / 10) * 16) + ((num) % 10)) + +#define NUM4_TO_BCD(num) \ + ((NUM2_TO_BCD((num) / 100 ) * 256) + NUM2_TO_BCD((num) % 100 )) + +u_int8_t TimeStampSubCommand::getDaysInMonth(u_int16_t year, u_int8_t month) +{ + u_int8_t days = 0; + bool isLeapYear = year % 4 == 0; // evenly divisible by 4 + isLeapYear &= (year % 100 != 0) || (year % 400 == 0); // not evenly divided by 100 or evenly divisible by 400 + switch(month) { + case 2: + days = isLeapYear ? 29 : 28; + break; + case 4: + case 6: + case 9: + case 11: + days = 30; + break; + case 1: + case 3: + case 5: + case 7: + case 8: + case 10: + case 12: + days = 31; + break; + default: + break; + } + return days; +} + +void TimeStampSubCommand::getMachineUTCTime() +{ + time_t rawTime; + struct tm * timeInfo; + time ( &rawTime ); + timeInfo = gmtime ( &rawTime ); + + _userTsEntry.ts_year = NUM4_TO_BCD(timeInfo->tm_year + 1900); + _userTsEntry.ts_month = NUM2_TO_BCD(timeInfo->tm_mon + 1); + _userTsEntry.ts_day = NUM2_TO_BCD(timeInfo->tm_mday); + _userTsEntry.ts_hour = NUM2_TO_BCD(timeInfo->tm_hour); + _userTsEntry.ts_minutes = NUM2_TO_BCD(timeInfo->tm_min); + _userTsEntry.ts_seconds = NUM2_TO_BCD(timeInfo->tm_sec); + + //printf("-D- timestamp: %04x-%02x-%02xT%02x:%02x:%02x\n", _userTsEntry.ts_year, _userTsEntry.ts_month, + // _userTsEntry.ts_day, _userTsEntry.ts_hour, _userTsEntry.ts_minutes, _userTsEntry.ts_seconds); + return; +} + +bool TimeStampSubCommand::parseTimeStamp(string tsStr) +{ + unsigned int year = 0; + unsigned int month = 0; + unsigned int day = 0; + unsigned int hour = 0; + unsigned int minutes = 0; + unsigned int seconds = 0; + if (*tsStr.rbegin() != 'Z') { + reportErr(true, "Failed to parse timestamp: Timestamp timezone must be UTC. format should be: YYYY-MM-DDThh:mm:ssZ\n"); + return false; + } + // scan and store + int count = sscanf(tsStr.c_str(), "%04d-%02d-%02dT%02d:%02d:%02dZ", &year, &month, &day, &hour, &minutes, &seconds); + if (count !=6) { + reportErr(true, "Failed to parse timestamp: input should be compliant to the following ISO 8601 format: YYYY-MM-DDThh:mm:ssZ\n"); + return false; + } + // check time args + if ( month == 0 || month > 12) { + reportErr(true, "Failed to parse timestamp: illegal month value (%d)\n", month); + return false; + } + if (day > getDaysInMonth(year, month)) { + reportErr(true, "Failed to parse timestamp: illegal day value (%d)\n", day); + return false; + } + if ( hour > 23 || minutes > 59 || seconds > 59 ) { + reportErr(true, "Failed to parse timestamp: illegal time value (%02d:%02d:%02d)\n", hour, minutes, seconds); + return false; + } + // store as BCD + _userTsEntry.ts_year = NUM4_TO_BCD(year); + _userTsEntry.ts_month = NUM2_TO_BCD(month); + _userTsEntry.ts_day = NUM2_TO_BCD(day); + _userTsEntry.ts_hour = NUM2_TO_BCD(hour); + _userTsEntry.ts_minutes = NUM2_TO_BCD(minutes); + _userTsEntry.ts_seconds = NUM2_TO_BCD(seconds); + + //printf("-D- timestamp: %04x-%02x-%02xT%02x:%02x:%02x\n", _userTsEntry.ts_year, _userTsEntry.ts_month, + // _userTsEntry.ts_day, _userTsEntry.ts_hour, _userTsEntry.ts_minutes, _userTsEntry.ts_seconds); + return true; +} + +bool TimeStampSubCommand::verifyParams() +{ + if (_flintParams.cmd_params[0] == "query") { + if (_flintParams.cmd_params.size() > 1) { + reportErr(true, "query operation requires no arguments.\n"); + return false; + } + _operation = TimeStampSubCommand::TS_Query; + } else if (_flintParams.cmd_params[0] == "set") { + if (_flintParams.image_specified && _flintParams.cmd_params.size() > 2) { + reportErr(true, "too many arguments for set operation on image.\n"); + return false; + } else if (_flintParams.device_specified && _flintParams.cmd_params.size() != 3) { + reportErr(true, "set operation on device requires timestamp and FW version arguments.\n\n"); + return false; + } + _operation = TimeStampSubCommand::TS_Set; + // attempt to parse timestamp and fw version + if (_flintParams.image_specified && _flintParams.cmd_params.size() == 1) { + // take time from machine + getMachineUTCTime(); + } else if (!parseTimeStamp(_flintParams.cmd_params[1])) { + return false; + } + if (_flintParams.device_specified && !parseFwVersion(_flintParams.cmd_params[2])) { + return false; + } + } else if (_flintParams.cmd_params[0] == "reset") { + if (_flintParams.cmd_params.size() > 1) { + reportErr(true, "erase operation requires no arguments.\n"); + return false; + } + _operation = TimeStampSubCommand::TS_Reset; + } else { + reportErr(true, "Unknown operation, allowed operations: query/set/reset.\n"); + return false; + } + return true; +} + +void TimeStampSubCommand::printTsAndFwVer(string prefix, struct tools_open_ts_entry& tsEntry, struct tools_open_fw_version& fwVer) +{ + printf("%-24s: %04x-%02x-%02xT%02x:%02x:%02xZ %02d.%02d.%04d\n", prefix.c_str(), tsEntry.ts_year, tsEntry.ts_month, tsEntry.ts_day, + tsEntry.ts_hour, tsEntry.ts_minutes, tsEntry.ts_seconds, + fwVer.fw_ver_major, fwVer.fw_ver_minor, fwVer.fw_ver_subminor); +} + +bool TimeStampSubCommand::queryTs() +{ + struct tools_open_ts_entry tsEntry; + struct tools_open_fw_version fwVer; + memset(&tsEntry, 0, sizeof(tsEntry)); + memset(&fwVer, 0, sizeof(fwVer)); + // get and Print Current Running FW TS in case of device + if (_flintParams.device_specified) { + if (!_ops->FwQueryTimeStamp(tsEntry, fwVer, true)) { + printf("%-24s: N/A. %s\n", "Current timestamp", _ops->err()); + } else { + printTsAndFwVer("Current timestamp", tsEntry, fwVer); + } + } + // get and print next FW timestamp + if (!_ops->FwQueryTimeStamp(tsEntry, fwVer, false)) { + printf("%-24s: N/A. %s\n", "Next timestamp", _ops->err()); + } else { + printTsAndFwVer("Next timestamp", tsEntry, fwVer); + } + return true; +} + +bool TimeStampSubCommand::setTs() +{ + if (!_ops->FwSetTimeStamp(_userTsEntry, _userFwVer)) { + reportErr(false, "%s", _ops->err()); + return false; + } + return true; +} + +bool TimeStampSubCommand::resetTs() +{ + if (!_ops->FwResetTimeStamp()) { + reportErr(false, "%s", _ops->err()); + return false; + } + return true; +} + +FlintStatus TimeStampSubCommand::executeCommand() +{ + bool rc; + + if (preFwOps() == FLINT_FAILED) { + return FLINT_FAILED; + } + _ops = _flintParams.device_specified ? _fwOps : _imgOps; + (void)_ops; + switch (_operation) { + case TimeStampSubCommand::TS_Set: + rc = setTs(); + break; + case TimeStampSubCommand::TS_Query: + rc = queryTs(); + break; + case TimeStampSubCommand::TS_Reset: + rc = resetTs(); + break; + default: + // should not be reached + reportErr(true, "Failed to perform timestamp operation: Unknown Error\n"); + return FLINT_FAILED; + } + if (!rc) { + printf("-E- Failed to perform timestamp %s operation. %s\n", _flintParams.cmd_params[0].c_str(), _errBuff); + return FLINT_FAILED; + } + return FLINT_SUCCESS; +} + + diff --git a/flint/subcommands.h b/flint/subcommands.h index f82d034..f704b66 100644 --- a/flint/subcommands.h +++ b/flint/subcommands.h @@ -42,6 +42,9 @@ #define MAX_PASSWORD_LEN 256 #include + +#include + #include "flint_params.h" #include "mlxfwops/lib/fw_ops.h" #include "err_msgs.h" @@ -73,6 +76,7 @@ protected: FBase* _io; what_to_ver_t _v; int _maxCmdParamNum; + int _minCmdParamNum; FlintParams _flintParams; //info about the Subcommand string _name; @@ -114,19 +118,15 @@ protected: static int resetCfgCbFunc(int completion); bool printGuidLine(guid_t* new_guids, guid_t* old_guids, int guid_index); - bool printBxGuids(guid_t* new_guids, guid_t* old_guids, int index,\ - int num_of_guids, const char* pre_str); bool printMacLine(guid_t* new_guids, guid_t* old_guids, int mac_index); - bool printBxMacs(guid_t* new_guids, guid_t* old_guids, int index, int num_of_guids, const char* pre_str); - bool printUidsFunc(guid_t* new_guids, guid_t* old_guids); bool printGUIDsFunc(guid_t guids[GUIDS],guid_t macs[MACS], guid_t old_guids[GUIDS],\ guid_t old_macs[MACS], bool print_guids, bool print_macs, int portNum, bool old_guid_fmt); bool reportGuidChanges(guid_t* new_guids, guid_t* new_macs,\ guid_t* old_guids, guid_t* old_macs, bool printGuids,\ - bool printMacs, bool printUids, int guidNum); - bool checkGuidsFlags(chip_type_t ct, u_int16_t devType, u_int8_t fwType, - bool guidsSpecified, bool macsSpecified, bool uidsSpecified, bool ibDev, bool ethDev); - void printMissingGuidErr(bool ibDev, bool ethDev, bool bxDev); + bool printMacs, int guidNum); + bool checkGuidsFlags(u_int16_t devType, u_int8_t fwType, + bool guidsSpecified, bool macsSpecified, bool uidSpecified, bool ibDev, bool ethDev); + void printMissingGuidErr(bool ibDev, bool ethDev); bool extractUIDArgs(std::vector& cmdArgs, u_int8_t numOfGuids[2], u_int8_t stepSize[2]); bool extractValuesFromString(string valStr, u_int8_t values[2], string origArg); @@ -148,7 +148,7 @@ protected: public: - SubCommand(): _fwOps(NULL), _imgOps(NULL), _io(NULL), _v(Wtv_Uninitilized), _maxCmdParamNum(-1) + SubCommand(): _fwOps(NULL), _imgOps(NULL), _io(NULL), _v(Wtv_Uninitilized), _maxCmdParamNum(-1), _minCmdParamNum(-1) { _cmdType = SC_No_Cmd; memset(_errBuff, 0, sizeof(_errBuff)); @@ -178,7 +178,7 @@ private: FlintStatus burnFs3(); FlintStatus burnFs2(); bool checkFwVersion(); - bool checkPSIDAndIbEth(); + bool checkPSID(); void updateBurnParams(); void dealWithExpRom(); bool checkMatchingExpRomDevId(const fw_info_t& info); @@ -197,9 +197,6 @@ private: FlintStatus printInfo(const fw_info_t& fwInfo, bool fullQuery); bool displayFs3Uids(const fw_info_t& fwInfo); bool displayFs2Uids(const fw_info_t& fwInfo); - bool reportBxGuidsQuery(const guid_t* guids, int base1, int guids_num, int index, const char* pre_str); - bool reportBxMacsQuery(const guid_t* guids, int base1, int guids_num, int index, const char* pre_str); - bool reportBxMacsWarnings(const guid_t* guids, int index, int warning, int user_uids); bool checkMac(u_int64_t mac, string& warrStr); public: QuerySubCommand(); @@ -240,7 +237,6 @@ public: BromSubCommand(); ~BromSubCommand(); inline FlintStatus executeCommand(); - bool verifyParams(); bool getExpRomStrVer(roms_info_t& roms_info, char* version); }; @@ -314,7 +310,6 @@ public: SetVpdSubCommand(); ~SetVpdSubCommand(); FlintStatus executeCommand(); - bool verifyParams(); }; class SvSubCommand : public SubCommand @@ -335,7 +330,6 @@ public: RiSubCommand(); ~RiSubCommand(); FlintStatus executeCommand(); - bool verifyParams(); }; class DcSubCommand : public SubCommand @@ -401,7 +395,6 @@ public: EraseSubCommand(); ~EraseSubCommand(); inline FlintStatus executeCommand(); - inline bool verifyParams(); }; class RwSubCommand : public SubCommand { @@ -411,7 +404,6 @@ public: RwSubCommand(); ~RwSubCommand(); inline FlintStatus executeCommand(); - inline bool verifyParams(); }; class WwSubCommand : public SubCommand { @@ -421,7 +413,6 @@ public: WwSubCommand(); ~WwSubCommand(); inline FlintStatus executeCommand(); - inline bool verifyParams(); }; class WwneSubCommand : public SubCommand @@ -432,7 +423,6 @@ public: WwneSubCommand(); ~WwneSubCommand(); inline FlintStatus executeCommand(); - inline bool verifyParams(); }; class WbSubCommand : public SubCommand @@ -443,7 +433,6 @@ public: WbSubCommand(); ~WbSubCommand(); FlintStatus executeCommand(); - bool verifyParams(); }; @@ -456,7 +445,6 @@ public: WbneSubCommand(); ~WbneSubCommand(); FlintStatus executeCommand(); - bool verifyParams(); }; class RbSubCommand : public SubCommand @@ -468,7 +456,6 @@ public: RbSubCommand(); ~RbSubCommand(); FlintStatus executeCommand(); - bool verifyParams(); }; class ClearSemSubCommand : public SubCommand @@ -507,4 +494,46 @@ public: FlintStatus executeCommand(); }; +class CheckSumSubCommand : public SubCommand +{ +public: + CheckSumSubCommand(); + ~CheckSumSubCommand(); + FlintStatus executeCommand(); +private: + bool extractChecksumFromStr(string str, u_int8_t checkSum[16]); + string checkSum2Str(u_int8_t checkSum[16]); + u_int8_t _checkSum[16]; +}; + +class TimeStampSubCommand : public SubCommand +{ +public: + TimeStampSubCommand(); + ~TimeStampSubCommand(); + FlintStatus executeCommand(); +private: + enum { + TS_No_Command, + TS_Query, + TS_Set, + TS_Reset + }; + + bool verifyParams(); + bool parseTimeStamp(string tsStr); + bool parseFwVersion(string verStr); + inline u_int8_t getDaysInMonth(u_int16_t year, u_int8_t month); + inline void printTsAndFwVer(string prefix, struct tools_open_ts_entry& tsEntry, struct tools_open_fw_version& fwVer); + void getMachineUTCTime(); + bool queryTs(); + bool setTs(); + bool resetTs(); + + int _operation; + FwOperations* _ops; + struct tools_open_ts_entry _userTsEntry; + struct tools_open_fw_version _userFwVer; +}; + #endif diff --git a/mflash/mflash.c b/mflash/mflash.c index c039127..7afb80d 100644 --- a/mflash/mflash.c +++ b/mflash/mflash.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -28,8 +29,6 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - * Version: $Id$ - * */ #ifdef IRISC @@ -46,7 +45,10 @@ #include #include #include + +#ifndef UEFI_BUILD #include +#endif #include "mflash_pack_layer.h" #include "mflash_access_layer.h" @@ -207,10 +209,12 @@ int release_semaphore(mflash* mfl, int ignore_writer_lock); #define CX3_HW_ID 0x1F5 #define CX4_HW_ID 0x209 #define CX4LX_HW_ID 0x20b +#define CX5_HW_ID 0x20d #define CONNECT_IB_HW_ID 0x1FF #define SWITCH_IB_HW_ID 0x247 #define SPECTRUM_HW_ID 0x249 +#define SWITCH_IB2_HW_ID 0x24b /* * Device IDs Macros: @@ -222,28 +226,26 @@ int release_semaphore(mflash* mfl, int ignore_writer_lock); ((dev_id) == SWITCHX_HW_ID) #define IS_SIB(dev_id) \ ((dev_id) == SWITCH_IB_HW_ID) +#define IS_SIB2(dev_id) \ + ((dev_id) == SWITCH_IB2_HW_ID) #define IS_SEN(dev_id) \ ((dev_id) == SPECTRUM_HW_ID) -#define IS_IS4_FAMILY(dev_id) \ - (((dev_id) == 435) || ((dev_id) == 6100)) // 435 == InfiniScaleIV, 6100 == BridgeX #define IS_CONNECT_IB(dev_id) \ - ((dev_id) ==CONNECT_IB_HW_ID) + ((dev_id) == CONNECT_IB_HW_ID) #define IS_CONNECTX4(dev_id) \ - ((dev_id) ==CX4_HW_ID) + ((dev_id) == CX4_HW_ID) #define IS_CONNECTX4LX(dev_id) \ - ((dev_id) ==CX4LX_HW_ID) + ((dev_id) == CX4LX_HW_ID) +#define IS_CONNECTX5(dev_id) \ + ((dev_id) == CX5_HW_ID) #define HAS_TOOLS_CMDIF(dev_id) \ ((((dev_id) == CX3_HW_ID) || ((dev_id) == CX3_PRO_HW_ID))) #define HAS_ICMD_IF(dev_id) \ - ((IS_CONNECT_IB(dev_id)) || (IS_SIB(dev_id)) || (IS_CONNECTX4(dev_id)) || (IS_CONNECTX4LX(dev_id)) || (IS_SEN(dev_id))) + ((IS_CONNECT_IB(dev_id)) || (IS_SIB(dev_id)) || (IS_CONNECTX4(dev_id)) || (IS_CONNECTX4LX(dev_id)) || (IS_SEN(dev_id)) || (IS_SIB2(dev_id)) || (IS_CONNECTX5(dev_id))) #define IS_SWITCH(dev_id) \ - ((IS_IS4_FAMILY(dev_id)) || (IS_SX(dev_id)) || (IS_SIB(dev_id)) || (IS_SEN(dev_id))) -#define IS_REALLY_OLD_DEVICE(dev_id) \ - (((dev_id) == 23108) || ((dev_id) == 25208) || ((dev_id) == 24204) || ((dev_id) == 25204)) -#define IS_OLD_DEVICE(dev_id) \ - ((IS_REALLY_OLD_DEVICE(dev_id)) || (IS_CONNECTX_4TH_GEN_FAMILY(dev_id))) + ((IS_SX(dev_id)) || (IS_SIB(dev_id)) || (IS_SEN(dev_id)) || (IS_SIB2(dev_id))) #define SUPPORTS_SW_RESET(devid)\ - (((devid) == 435) || ((devid) == SWITCHX_HW_ID) || ((devid) == SWITCH_IB_HW_ID)) + (((devid) == SWITCHX_HW_ID) || ((devid) == SWITCH_IB_HW_ID) || ((devid) == SWITCH_IB2_HW_ID)) // Write/Erase delays @@ -347,6 +349,8 @@ int cntx_spi_write_status_reg(mflash* mfl, u_int32_t status_reg, u_int8_t write_ int spi_get_num_of_flashes(int prev_num_of_flashes); +static int trm2mfe_err(trm_sts rc); + int my_memset(void* dst, u_int8_t data, u_int32_t len) { u_int32_t i; @@ -520,19 +524,6 @@ enum StFlashCommand { SFC_WRSR = 0x01 }; -typedef struct flash_info { - const char *name; - u_int8_t vendor; - u_int8_t type; - int command_set; - int erase_command; - int sector_size; - u_int8_t quad_en_support; - u_int8_t write_protected_support; - u_int8_t protect_sub_and_sector; - u_int8_t dummy_cycles_support; -} flash_info_t; - #define SST_FLASH_NAME "SST25VFxx" #define WINBOND_NAME "W25QxxBV" #define WINBOND_W25X "W25Xxx" @@ -564,16 +555,16 @@ typedef enum flash_memory_type { flash_info_t g_flash_info_arr[] = { - {"M25PXxx", FV_ST, FMT_ST_M25PX, MCS_STSPI, SFC_SSE, 0x1000, 0, 0, 0, 0}, - {"M25Pxx", FV_ST, FMT_ST_M25P, MCS_STSPI, SFC_SE, 0x10000, 0, 0, 0, 0}, - {"N25Q0XX", FV_ST, FMT_N25QXXX, MCS_STSPI, SFC_SSE, 0x1000, 1, 1, 0, 1}, - {SST_FLASH_NAME, FV_SST, FMT_SST_25, MCS_SSTSPI, SFC_SE, 0x10000, 0, 0, 0, 0}, - {WINBOND_NAME, FV_WINBOND, FMT_WINBOND, MCS_STSPI, SFC_SSE, 0x1000, 1, 1, 1, 0}, - {WINBOND_W25X, FV_WINBOND, FMT_WINBOND_W25X, MCS_STSPI, SFC_SSE, 0x1000, 0, 0, 0, 0}, - {ATMEL_NAME, FV_ATMEL, FMT_ATMEL, MCS_STSPI, SFC_SSE, 0x1000, 0, 0, 0, 0}, - {S25FLXXXP_NAME, FV_S25FLXXXX, FMT_S25FLXXXP, MCS_STSPI, SFC_SE, 0x10000, 0, 0, 0, 0}, - {S25FL116K_NAME, FV_S25FLXXXX, FMT_S25FL116K, MCS_STSPI, SFC_SSE, 0x1000, 0, 0, 0, 0}, // this flash actually supports quad and write protect but we dont need it at this moment - {MACRONIX_NAME, FV_MX25K16XXX, FMT_ST_M25P, MCS_STSPI, SFC_SSE, 0x1000, 0, 0, 0, 0}, // this flash actually supports write protection but we dont use it at this time + {"M25PXxx", FV_ST, FMT_ST_M25PX, MCS_STSPI, SFC_SSE, FSS_4KB, 0, 0, 0, 0, 0}, + {"M25Pxx", FV_ST, FMT_ST_M25P, MCS_STSPI, SFC_SE, FSS_64KB, 0, 0, 0, 0, 0}, + {"N25Q0XX", FV_ST, FMT_N25QXXX, MCS_STSPI, SFC_SSE, FSS_4KB, 1, 1, 1, 0, 1}, + {SST_FLASH_NAME, FV_SST, FMT_SST_25, MCS_SSTSPI, SFC_SE, FSS_64KB, 0, 0, 0, 0, 0}, + {WINBOND_NAME, FV_WINBOND, FMT_WINBOND, MCS_STSPI, SFC_SSE, FSS_4KB, 1, 1, 1, 1, 0}, + {WINBOND_W25X, FV_WINBOND, FMT_WINBOND_W25X, MCS_STSPI, SFC_SSE, FSS_4KB, 0, 0, 0, 0, 0}, + {ATMEL_NAME, FV_ATMEL, FMT_ATMEL, MCS_STSPI, SFC_SSE, FSS_4KB, 0, 0, 0, 0, 0}, + {S25FLXXXP_NAME, FV_S25FLXXXX, FMT_S25FLXXXP, MCS_STSPI, SFC_SE, FSS_64KB, 0, 0, 0, 0, 0}, + {S25FL116K_NAME, FV_S25FLXXXX, FMT_S25FL116K, MCS_STSPI, SFC_SSE, FSS_4KB, 0, 0, 0, 0, 0}, // this flash actually supports quad and write protect but we dont need it at this moment + {MACRONIX_NAME, FV_MX25K16XXX, FMT_ST_M25P, MCS_STSPI, SFC_SSE, FSS_4KB, 0, 0, 0, 0, 0}, // this flash actually supports write protection but we dont use it at this time }; int cntx_sst_get_log2size(u_int8_t capacity, int* log2spi_size) @@ -687,11 +678,12 @@ int get_flash_info_by_res(mflash* mfl, unsigned *type_index, int *log2size, u_in return MFE_OK; } -int cntx_get_flash_info(mflash* mfl, unsigned *type_index, int *log2size, u_int8_t *no_flash) +int cntx_get_flash_info(mflash* mfl, flash_info_t *f_info, int *log2size, u_int8_t *no_flash) { int rc; u_int8_t type = 0, capacity = 0, vendor = 0, no_flash_res = 0, no_flash_rdid = 0; unsigned char es = 0; + unsigned type_index = 0; // Assume there is a flash. *no_flash = 0; @@ -699,24 +691,24 @@ int cntx_get_flash_info(mflash* mfl, unsigned *type_index, int *log2size, u_int8 no_flash_rdid = is_no_flash_detected(type, vendor, capacity); // printf("-D- cntx_spi_get_type: rc: %#x, vendor=%#x, type=%#x, capacity=%#x\n", rc, vendor, type, capacity); // printf("-D- rc = %d, no_flash_rdid = %d\n", rc, no_flash_rdid); - if (get_type_index_by_vendor_and_type(vendor, type, type_index) == MFE_OK) { + if (get_type_index_by_vendor_and_type(vendor, type, &type_index) == MFE_OK) { // RDID Succeded. // Get the capacity - if (get_log2size_by_capcity(*type_index, capacity, log2size) != MFE_OK) { + if (get_log2size_by_capcity(type_index, capacity, log2size) != MFE_OK) { printf("-E- SST SPI flash #%d (vendor: %#x, type: %#x, capacity:%#x) is not supported.\n", get_bank_int(mfl), vendor, type, capacity); - return MFE_UNSUPPORTED_FLASH_TOPOLOGY; + rc = MFE_UNSUPPORTED_FLASH_TOPOLOGY; } - return MFE_OK; - } + rc = MFE_OK; + } else if (no_flash_rdid) { // printf("-D- no support for rdid\n"); // RDID Failed due to: // 1- RDID is not supported but RES is - Old flashes. // 2- There is no Flash // 3- Flash is not supported - if (no_flash_rdid) { + // Trying RES - rc = get_flash_info_by_res(mfl, type_index, log2size, &no_flash_res, &es); + rc = get_flash_info_by_res(mfl, &type_index, log2size, &no_flash_res, &es); if (rc == 0 && no_flash_res == 1) { // RES Succeeded due to: no flash, unsupported flash or old flash. *no_flash = 1; @@ -730,6 +722,7 @@ int cntx_get_flash_info(mflash* mfl, unsigned *type_index, int *log2size, u_int8 printf("-E- SPI flash #%d (vendor: %#x, memory type: %#x, es: %#x) is not supported.\n", get_bank_int(mfl), vendor, type, es); } // printf("-D- rc = %d, no_flash_res = %d, type_index = %d.\n", rc, no_flash_res, *type_index); + memcpy(f_info, &g_flash_info_arr[type_index], sizeof(flash_info_t)); return rc; } @@ -768,12 +761,11 @@ int get_num_of_banks_int(mflash *mfl) { return mfl->opts[MFO_NUM_OF_BANKS]; } -int get_flash_params(mflash* mfl, flash_params_t *flash_params, unsigned *type_index) +int get_flash_params(mflash* mfl, flash_params_t *flash_params, flash_info_t *flash_info) { int num_of_flashes = get_num_of_banks_int(mfl); int spi_sel, rc; int params_were_set = 0; - flash_info_t *flash_info; memset(flash_params, 0, sizeof(flash_params_t)); // if number of flash banks is zero exit with error @@ -786,7 +778,7 @@ int get_flash_params(mflash* mfl, flash_params_t *flash_params, unsigned *type_i u_int8_t no_flash = 0; const char *type_name; rc = set_bank(mfl, spi_sel); CHECK_RC(rc); - rc = mfl->f_get_info(mfl, type_index, &log2size, &no_flash); CHECK_RC(rc); + rc = mfl->f_get_info(mfl, flash_info, &log2size, &no_flash); CHECK_RC(rc); //printf("-D- spi_sel = %d, num_of_flashes = %d, rc = %d, no_flash = %d\n", spi_sel, num_of_flashes, rc, no_flash); if (no_flash == 1) { @@ -797,7 +789,6 @@ int get_flash_params(mflash* mfl, flash_params_t *flash_params, unsigned *type_i } break; } - flash_info = &(g_flash_info_arr[*type_index]); type_name = flash_info->name; if (params_were_set == 0) { @@ -821,25 +812,19 @@ int get_flash_params(mflash* mfl, flash_params_t *flash_params, unsigned *type_i return MFE_OK; } -int spi_fill_attr_from_params(mflash* mfl, flash_params_t* flash_params, unsigned type_index) +int spi_fill_attr_from_params(mflash* mfl, flash_params_t* flash_params, flash_info_t *flash_info) { - flash_info_t *flash_info = &(g_flash_info_arr[type_index]); - mfl->attr.log2_bank_size = flash_params->log2size; mfl->attr.bank_size = 1 << flash_params->log2size; mfl->attr.size = mfl->attr.bank_size * flash_params->num_of_flashes; mfl->attr.block_write = 16; // In SPI context, this is the transaction size. Max is 16. - mfl->attr.num_erase_blocks = 1; - // HACK: Use fw_sector size only in CX3 family devices for now + // HACK: Use fw_sector size as the sector size only in CX3 family devices for now + // TODO: adrianc : this sould be in sx_get_flash_info_by_type() if (HAS_TOOLS_CMDIF(mfl->attr.hw_dev_id)) { - mfl->attr.erase_block[0].sector_size = mfl->attr.fw_flash_sector_sz ? mfl->attr.fw_flash_sector_sz : (u_int32_t)flash_info->sector_size; - } else { - mfl->attr.erase_block[0].sector_size = (u_int32_t)flash_info->sector_size; + flash_info->sector_size = mfl->attr.fw_flash_sector_sz ? mfl->attr.fw_flash_sector_sz : flash_info->sector_size; } - - mfl->attr.erase_block[0].sector_mask = ~(mfl->attr.erase_block[0].sector_size - 1); - mfl->attr.sector_size = mfl->attr.erase_block[0].sector_size; - + mfl->attr.sector_size = flash_info->sector_size; + mfl->attr.support_sub_and_sector = flash_info->support_sub_and_sector; mfl->attr.command_set = flash_info->command_set; mfl->attr.erase_command = flash_info->erase_command; mfl->attr.type_str = flash_info->name; @@ -859,6 +844,7 @@ int spi_fill_attr_from_params(mflash* mfl, flash_params_t* flash_params, unsigne int st_spi_fill_attr(mflash* mfl, flash_params_t* flash_params) { int rc; flash_params_t *cur_flash_params, tmp_flash_params; + flash_info_t flash_info; unsigned type_index; // printf("-D- st_spi_fill_attr: ignore_detect = %d, log2size = %#x.\n", mfl->ignore_flash_detect, mfl->user_attr.log2size); @@ -868,7 +854,7 @@ int st_spi_fill_attr(mflash* mfl, flash_params_t* flash_params) { cur_flash_params = &tmp_flash_params; while (i < GET_FLASH_RETRY) { - rc = get_flash_params(mfl, cur_flash_params, &type_index); + rc = get_flash_params(mfl, cur_flash_params, &flash_info); if (rc != MFE_NO_FLASH_DETECTED) { break; } @@ -879,11 +865,11 @@ int st_spi_fill_attr(mflash* mfl, flash_params_t* flash_params) { } else { // Get the flash params from the user. rc = get_type_index_by_name(flash_params->type_name, &type_index); CHECK_RC(rc); + memcpy(&flash_info, &(g_flash_info_arr[type_index]), sizeof(flash_info_t)); cur_flash_params = flash_params; } - // Init the flash attr according to the flash parameters (which was wither given by the user or read from the flash) - rc = spi_fill_attr_from_params(mfl, cur_flash_params, type_index); CHECK_RC(rc); + rc = spi_fill_attr_from_params(mfl, cur_flash_params, &flash_info); CHECK_RC(rc); // printf("-D- spi_size = %#x, log2spi_size = %#x, bank_size = %#x, flashes_num = %d\n", mfl->attr.size, mfl->attr.log2_bank_size, // mfl->attr.bank_size, cur_flash_params->num_of_flashes); return MFE_OK; @@ -1104,7 +1090,7 @@ int empty_set_bank(mflash* mfl, u_int32_t bank) { } int cntx_exec_cmd(mflash* mfl, u_int32_t gw_cmd, char* msg) { - if (!IS_OLD_DEVICE(mfl->attr.hw_dev_id)) { + if (!IS_CONNECTX_4TH_GEN_FAMILY(mfl->attr.hw_dev_id)) { // for old devices lock bit is separate from the flash HW ifc //for new devices need to make sure this bit remains locked when writing the dword gw_cmd = MERGE(gw_cmd, 1, 31, 1); @@ -1410,7 +1396,7 @@ int spi_update_num_of_banks(mflash* mfl, int prev_num_of_flashes) num_of_banks = spi_get_num_of_flashes(prev_num_of_flashes); if (num_of_banks == -1) { - if (IS_SX(mfl->attr.hw_dev_id) || IS_SIB(mfl->attr.hw_dev_id) || IS_SEN(mfl->attr.hw_dev_id)) { + if (IS_SX(mfl->attr.hw_dev_id) || IS_SIB(mfl->attr.hw_dev_id) || IS_SEN(mfl->attr.hw_dev_id) || IS_SIB2(mfl->attr.hw_dev_id)) { mfl->opts[MFO_NUM_OF_BANKS] = 2; } else { mfl->opts[MFO_NUM_OF_BANKS] = 1; @@ -1943,6 +1929,10 @@ int check_cache_replacement_gaurd(mflash* mfl, u_int8_t *needs_cache_replacement // When we access via command interface, we assume there is a cache replacement! if (mfl->opts[MFO_FW_ACCESS_TYPE_BY_MFILE] == ATBM_MLNXOS_CMDIF) { + if (mfl->opts[MFO_IGNORE_CASHE_REP_GUARD]) { + // dont allow overidding cache replacement in mellanox OS env + return MFE_OCR_NOT_SUPPORTED; + } *needs_cache_replacement = 1; return MFE_OK; } @@ -1974,7 +1964,7 @@ int mfl_com_lock(mflash* mfl) { int rc; // if we already locked the semaphore we dont want to re-lock it - if (mfl->is_locked) { + if (mfl->is_locked && (mfl->opts[MFO_FW_ACCESS_TYPE_BY_MFILE] != ATBM_INBAND || mfl->opts[MFO_IGNORE_CASHE_REP_GUARD] == 1)) { // on inband w/o ocr we need to extend the lock return MFE_OK; } rc = mfl->f_lock(mfl, 1); @@ -2037,12 +2027,6 @@ int gen4_flash_init_com(mflash* mfl, flash_params_t* flash_params, u_int8_t init } -int is4_flash_init(mflash* mfl, flash_params_t* flash_params) { - - mfl->f_lock = is4_flash_lock; - return gen4_flash_init_com(mfl, flash_params, 0); -} - int sx_flash_init_direct_access(mflash* mfl, flash_params_t* flash_params) { mfl->f_lock = is4_flash_lock; @@ -2051,24 +2035,24 @@ int sx_flash_init_direct_access(mflash* mfl, flash_params_t* flash_params) int fifth_gen_init_direct_access(mflash* mfl, flash_params_t* flash_params) { - mfl->f_lock = connectib_flash_lock; return gen4_flash_init_com(mfl, flash_params, 0); } +/* typedef int (*f_sx_flash_lock) (mflash* mfl, int lock_state); typedef int (*f_sx_erase_sect) (mflash* mfl, u_int32_t addr); typedef int (*f_sx_block_access) (mflash* mfl, u_int32_t addr, u_int32_t size, u_int8_t* data); typedef int (*f_sx_get_flash_info) (mflash* mfl, unsigned *type_index, int *log2size, u_int8_t *no_flash); +*/ - -int sx_get_flash_info(mflash* mfl, unsigned *type_index, int *log2size, u_int8_t *no_flash) +int sx_get_flash_info(mflash* mfl, flash_info_t* f_info, int *log2size, u_int8_t *no_flash) { int rc; int sem_rc; sem_rc = mfl_com_lock(mfl); CHECK_RC(sem_rc); - rc = sx_get_flash_info_by_type(mfl, type_index, log2size, no_flash); + rc = sx_get_flash_info_by_type(mfl, f_info, log2size, no_flash); sem_rc = release_semaphore(mfl, 0); CHECK_RC(sem_rc); return rc; } @@ -2104,7 +2088,7 @@ int sx_erase_sect(mflash* mfl, u_int32_t addr) int rc; int sem_rc; sem_rc = mfl_com_lock(mfl); CHECK_RC(sem_rc); - rc = sx_erase_sect_by_type(mfl, addr); + rc = sx_erase_sect_by_type(mfl, addr, mfl->attr.sector_size); sem_rc = release_semaphore(mfl, 0); CHECK_RC(sem_rc); return rc; } @@ -2159,7 +2143,7 @@ int flash_init_inband_access(mflash* mfl, flash_params_t* flash_params) mfl->supp_sr_mod = 0; // Get the flash attribute - rc = st_spi_fill_attr(mfl, flash_params); CHECK_RC(rc); + rc = st_spi_fill_attr(mfl, flash_params); CHECK_RC(rc); update_max_write_size(mfl); CHECK_RC(rc); return MFE_OK; } @@ -2270,7 +2254,12 @@ int cntx_flash_init(mflash* mfl, flash_params_t* flash_params) if ( mfl->opts[MFO_FW_ACCESS_TYPE_BY_MFILE] == ATBM_TOOLS_CMDIF &&\ mfl->opts[MFO_IGNORE_CASHE_REP_GUARD] == 0 &&\ mfl->opts[MFO_CX3_FW_ACCESS_EN]) { + #ifdef UEFI_BUILD + // tools CMDIF not supported in UEFI + rc = ME_NOT_IMPLEMENTED; + #else rc = tcif_cr_mbox_supported(mfl->mf); + #endif // init with direct access if not supported if (rc == ME_NOT_IMPLEMENTED || rc == ME_CMDIF_NOT_SUPP ) { mfl->opts[MFO_FW_ACCESS_TYPE_BY_MFILE] = ATBM_NO; @@ -2314,14 +2303,43 @@ int mf_write (mflash* mfl, u_int32_t addr, u_int32_t len, u_int8_t* da return mfl->f_write(mfl, addr, len, data); } -int mf_erase_sector(mflash* mfl, u_int32_t addr) { +static int erase_com(mflash* mfl, u_int32_t addr, unsigned int sector_size, int erase_cmd) +{ + int rc; + u_int32_t backup_sector_size; + int backup_erase_command; if (addr >= mfl->attr.size) { return MFE_OUT_OF_RANGE; } // Locking semaphore for the entire existence of the mflash obj for write and erase only. - int rc = mfl_com_lock(mfl); CHECK_RC(rc); + rc = mfl_com_lock(mfl); CHECK_RC(rc); mfl->writer_lock = 1; - return mfl->f_erase_sect(mfl, addr); + backup_sector_size = mfl->attr.sector_size; + backup_erase_command = mfl->attr.erase_command; + mfl->attr.sector_size = sector_size; + mfl->attr.erase_command = erase_cmd; + rc = mfl->f_erase_sect(mfl, addr); + mfl->attr.sector_size = backup_sector_size; + mfl->attr.erase_command = backup_erase_command; + return rc; +} + +int mf_erase(mflash* mfl, u_int32_t addr) { + return erase_com(mfl, addr, mfl->attr.sector_size, mfl->attr.erase_command); +} + +int mf_erase_64k_sector(mflash* mfl, u_int32_t addr) { + if (!mfl->attr.support_sub_and_sector) { + return MFE_UNSUPPORTED_ERASE_OPERATION; + } + return erase_com(mfl, addr, FSS_64KB, SFC_SE); +} + +int mf_erase_4k_sector(mflash* mfl, u_int32_t addr) { + if (!mfl->attr.support_sub_and_sector) { + return MFE_UNSUPPORTED_ERASE_OPERATION; + } + return erase_com(mfl, addr, FSS_4KB, SFC_SSE); } int mf_open_ignore_lock(mflash* mfl) { @@ -2352,6 +2370,7 @@ int get_dev_info(mflash* mfl) // get hw id // Special case for MLNX OS getting dev_id using REG MGIR if (dev_flags & MDEVS_MLNX_OS) { + #ifndef UEFI_BUILD reg_access_status_t rc; struct register_access_sib_mgir mgir; memset(&mgir, 0, sizeof(mgir)); @@ -2372,6 +2391,11 @@ int get_dev_info(mflash* mfl) mfl->attr.rev_id = 0; //WA: MGIR should have also hw_rev_id and then we can use it. } } + #else + // no MLNX_OS in UEFI, no mgir register in UEFI package + // we should never reach here + return MFE_UNKOWN_ACCESS_TYPE; + #endif } else { MREAD4(HW_DEV_ID, &dev_id); if (dev_id == CR_LOCK_HW_ID) { @@ -2384,7 +2408,7 @@ int get_dev_info(mflash* mfl) if (dev_flags & MDEVS_MLNX_OS) { mfl->opts[MFO_FW_ACCESS_TYPE_BY_MFILE] = ATBM_MLNXOS_CMDIF; } else if (dev_flags & MDEVS_IB){ - mfl->opts[MFO_FW_ACCESS_TYPE_BY_MFILE] = ATBM_INBAND; + mfl->opts[MFO_FW_ACCESS_TYPE_BY_MFILE] = ATBM_INBAND; } else { // not mlnxOS or IB device - check HW ID to determine Access type if (HAS_ICMD_IF(mfl->attr.hw_dev_id)){ if (mfl->opts[MFO_IGNORE_CASHE_REP_GUARD] == 0) { @@ -2403,7 +2427,7 @@ int get_dev_info(mflash* mfl) int mf_open_fw(mflash* mfl, flash_params_t* flash_params, int num_of_banks) { int rc; - + trm_sts trm_rc; if (!mfl) { return MFE_BAD_PARAMS; } @@ -2411,15 +2435,16 @@ int mf_open_fw(mflash* mfl, flash_params_t* flash_params, int num_of_banks) if (mfl->access_type == MFAT_MFILE ) { rc = get_dev_info(mfl); CHECK_RC(rc); + trm_rc = trm_create(&(mfl->trm), mfl->mf); + if (trm_rc) { + return trm2mfe_err(trm_rc); + } + mfl->opts[MFO_NUM_OF_BANKS] = spi_get_num_of_flashes(num_of_banks); rc = spi_update_num_of_banks(mfl, num_of_banks);CHECK_RC(rc); - if (mfl->attr.hw_dev_id == 23108 || mfl->attr.hw_dev_id == 25208 || mfl->attr.hw_dev_id == 24204 || mfl->attr.hw_dev_id == 25204) { - rc = MFE_OLD_DEVICE_TYPE; - } else if (IS_CONNECTX_4TH_GEN_FAMILY(mfl->attr.hw_dev_id)) { + if (IS_CONNECTX_4TH_GEN_FAMILY(mfl->attr.hw_dev_id)) { rc = cntx_flash_init(mfl, flash_params); - } else if (IS_IS4_FAMILY(mfl->attr.hw_dev_id)) { - rc = is4_flash_init(mfl, flash_params); } else if (IS_SX(mfl->attr.hw_dev_id)) { rc = sx_flash_init(mfl, flash_params); } else if (HAS_ICMD_IF(mfl->attr.hw_dev_id)) { @@ -2461,7 +2486,6 @@ int mf_opend_int (mflash** pmfl, void* access_dev, int num_of_banks, f // open mfile as uefi if (!((*pmfl)->mf = mopen_fw_ctx(access_dev, ((uefi_dev_extra_t*)dev_extra)->fw_cmd_func,\ ((uefi_dev_extra_t*)dev_extra)->dev_info)) ){ - free((*pmfl)); return MFE_NOMEM; } // fill some device information @@ -2470,7 +2494,6 @@ int mf_opend_int (mflash** pmfl, void* access_dev, int num_of_banks, f (*pmfl)->attr.rev_id = ((uefi_dev_extra_t*)dev_extra)->dev_info->rev_id; } } - rc = mf_open_fw(*pmfl, flash_params, num_of_banks); return rc; } @@ -2541,7 +2564,12 @@ void mf_close (mflash* mfl) { if (mfl->mf && (mfl)->opts[MFO_CLOSE_MF_ON_EXIT]) { mclose(mfl->mf); } - +#ifndef UEFI_BUILD + if (mfl->trm) { + trm_destroy(mfl->trm); + mfl->trm = (trm_ctx)NULL; + } +#endif free(mfl); return; } @@ -2650,6 +2678,8 @@ const char* mf_err2str (int err_code) { return "MFE_UNKOWN_ACCESS_TYPE"; case MFE_UNSUPPORTED_DEVICE: return "MFE_UNSUPPORTED_DEVICE"; + case MFE_UNSUPPORTED_ERASE_OPERATION: + return "MFE_UNSUPPORTED_ERASE_OPERATION"; case MFE_OLD_DEVICE_TYPE: return "MFE_OLD_DEVICE_TYPE"; case MFE_ICMD_INIT_FAILED: @@ -2698,11 +2728,27 @@ const char* mf_err2str (int err_code) { return "Access to device should be through configuration cycles."; case MFE_ILLEGAL_BANK_NUM: return "MFE_ILLEGAL_BANK_NUM"; + case MFE_OCR_NOT_SUPPORTED: + return "Direct flash access is not supported."; default: return "Unknown error"; } } +int trm2mfe_err(trm_sts rc) +{ + switch (rc) { + case TRM_STS_DEV_NOT_SUPPORTED: + return MFE_UNSUPPORTED_DEVICE; + case TRM_STS_CR_ACCESS_ERR: + return MFE_CR_ERROR; + case TRM_STS_MEM_ERROR: + return MFE_NOMEM; + default: + return MFE_ERROR; + } +} + int mf_set_opt (mflash* mfl, MfOpt opt, int val) { if ((int)opt < 0 || opt >= MFO_LAST) { return MFE_BAD_PARAMS; @@ -2970,18 +3016,33 @@ int mf_get_write_protect(mflash *mfl, u_int8_t bank_num, write_protect_info_ int mf_enable_hw_access(mflash* mfl, u_int64_t key) { +#ifndef UEFI_BUILD int rc; rc = tcif_hw_access(mfl->mf, key, 0 /* Unlock */); return (rc == ME_CMDIF_UNKN_TLV) ? MFE_MISMATCH_KEY : MError2MfError(rc); - +#else + (void)mfl; + (void)key; + return MFE_NOT_SUPPORTED_OPERATION; +#endif } int mf_disable_hw_access(mflash* mfl) { +#ifndef UEFI_BUILD int rc; // We need to release the semaphore because we will not have any access to semaphore after disabling the HW access rc = release_semaphore(mfl, 1); CHECK_RC(rc); rc = tcif_hw_access(mfl->mf, 0, 1 /* Lock */); return (rc == ME_CMDIF_UNKN_TLV) ? MFE_MISMATCH_KEY : MError2MfError(rc); +#else + (void)mfl; + return MFE_NOT_SUPPORTED_OPERATION; +#endif +} + +mfile* mf_get_mfile(mflash* mfl) +{ + return mfl->mf; } diff --git a/mflash/mflash.h b/mflash/mflash.h index bcaba6f..78ec150 100644 --- a/mflash/mflash.h +++ b/mflash/mflash.h @@ -1,4 +1,9 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * + * mflash.h - Mellanox Technilogies LTD. Flash access lib heared file + * ================================================================== + * + * Copyright (c) 2005 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -28,7 +33,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - * Version: $Id$ + * Version: $Id: $ * */ @@ -36,6 +41,7 @@ #define MFLASH_H #include +#include #include "mflash_types.h" #include "mflash_common_structs.h" @@ -121,7 +127,14 @@ void mf_close (mflash* mfl); // int mf_read (mflash* mfl, u_int32_t addr, u_int32_t len, u_int8_t* data); int mf_write (mflash* mfl, u_int32_t addr, u_int32_t len, u_int8_t* data); -int mf_erase_sector(mflash* mfl, u_int32_t addr); +// mf_erase performs an erase on the smallest block +int mf_erase(mflash* mfl, u_int32_t addr); +// adv erasing +int mf_erase_64k_sector(mflash* mfl, u_int32_t addr); +int mf_erase_4k_sector(mflash* mfl, u_int32_t addr); + +// swap between erasing 4KB or 64KB chunks (performance optimization) + // // Crspace access through mflash: @@ -156,6 +169,9 @@ int mf_enable_hw_access(mflash* mfl, u_int64_t key); int mf_disable_hw_access(mflash* mfl); int mf_release_semaphore(); +// get mfile object +mfile* mf_get_mfile(mflash* mfl); + // // err code to string translation for printing. // diff --git a/mflash/mflash_access_layer.c b/mflash/mflash_access_layer.c index 76f9af9..f5e6836 100755 --- a/mflash/mflash_access_layer.c +++ b/mflash/mflash_access_layer.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -27,9 +28,6 @@ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. - * - * Version: $Id$ - * */ #include @@ -39,14 +37,12 @@ #include #include -#ifndef UEFI_BUILD -#include -#endif - #include "mflash_types.h" #include "mflash_pack_layer.h" #include "mflash_access_layer.h" +extern flash_info_t g_flash_info_arr[]; + // On windows we don't support cmdIf access! int check_access_type(mflash* mfl) //TODO: re-write in a more elegant way. @@ -74,14 +70,17 @@ int check_access_type(mflash* mfl) } -int sx_get_flash_info_by_type(mflash* mfl, unsigned *type_index, int *log2size, u_int8_t *no_flash) +int sx_get_flash_info_by_type(mflash* mfl, flash_info_t *f_info, int *log2size, u_int8_t *no_flash) { int rc; u_int8_t vendor, type, capacity; u_int32_t jedec_id; + unsigned type_index = 0; + u_int8_t support_sub_and_sector = 0; + rc = check_access_type( mfl); CHECK_RC(rc); - rc = com_get_jedec(mfl->mf, get_bank_int(mfl), &jedec_id, &(mfl->attr.fw_flash_sector_sz)); CHECK_RC(rc); + rc = com_get_jedec(mfl->mf, get_bank_int(mfl), &jedec_id, &(mfl->attr.fw_flash_sector_sz), &support_sub_and_sector); CHECK_RC(rc); //printf("-D- jedec_id = %#x\n", jedec_id); rc = get_info_from_jededc_id(jedec_id, &vendor, &type, &capacity); CHECK_RC(rc); // Return there is no flash when all the params are 0xff @@ -89,10 +88,12 @@ int sx_get_flash_info_by_type(mflash* mfl, unsigned *type_index, int *log2size, *no_flash = 1; return MFE_OK; } - rc = get_type_index_by_vendor_and_type(vendor, type, type_index); CHECK_RC(rc); - rc = get_log2size_by_capcity(*type_index, capacity, log2size); CHECK_RC(rc); - return MFE_OK; + rc = get_type_index_by_vendor_and_type(vendor, type, &type_index); CHECK_RC(rc); + rc = get_log2size_by_capcity(type_index, capacity, log2size); CHECK_RC(rc); + memcpy(f_info, &(g_flash_info_arr[type_index]), sizeof(flash_info_t)); + f_info->support_sub_and_sector = support_sub_and_sector; + return MFE_OK; } int sx_block_read_by_type(mflash* mfl, u_int32_t blk_addr, u_int32_t blk_size, u_int8_t* data) @@ -133,13 +134,13 @@ static int lock_flash_programing_sem(mflash* mfl) { #ifndef UEFI_BUILD int rc; - if (mfl->opts[MFO_FW_ACCESS_TYPE_BY_MFILE] == ATBM_ICMD) { - rc = trm_lock(mfl->mf, TRM_RES_FLASH_PROGRAMING, MAX_FLASH_PROG_SEM_RETRY_CNT); + if (mfl->opts[MFO_FW_ACCESS_TYPE_BY_MFILE] == ATBM_ICMD || mfl->opts[MFO_FW_ACCESS_TYPE_BY_MFILE] == ATBM_INBAND) { + rc = trm_lock(mfl->trm, TRM_RES_FLASH_PROGRAMING, MAX_FLASH_PROG_SEM_RETRY_CNT); if (rc && rc != TRM_STS_RES_NOT_SUPPORTED) { return MFE_SEM_LOCKED; } } else if (mfl->opts[MFO_FW_ACCESS_TYPE_BY_MFILE] == ATBM_TOOLS_CMDIF) { - rc = trm_lock(mfl->mf, TRM_RES_HCR_FLASH_PROGRAMING, MAX_FLASH_PROG_SEM_RETRY_CNT); + rc = trm_lock(mfl->trm, TRM_RES_HCR_FLASH_PROGRAMING, MAX_FLASH_PROG_SEM_RETRY_CNT); if (rc && rc != TRM_STS_RES_NOT_SUPPORTED) { return MFE_SEM_LOCKED; } @@ -152,13 +153,13 @@ static int unlock_flash_programing_sem(mflash* mfl) { #ifndef UEFI_BUILD int rc; - if (mfl->opts[MFO_FW_ACCESS_TYPE_BY_MFILE] == ATBM_ICMD) { - rc = trm_unlock(mfl->mf, TRM_RES_FLASH_PROGRAMING); + if (mfl->opts[MFO_FW_ACCESS_TYPE_BY_MFILE] == ATBM_ICMD || mfl->opts[MFO_FW_ACCESS_TYPE_BY_MFILE] == ATBM_INBAND) { + rc = trm_unlock(mfl->trm, TRM_RES_FLASH_PROGRAMING); if (rc && rc != TRM_STS_RES_NOT_SUPPORTED) { return MFE_SEM_LOCKED; } } else if (mfl->opts[MFO_FW_ACCESS_TYPE_BY_MFILE] == ATBM_TOOLS_CMDIF) { - rc = trm_unlock(mfl->mf, TRM_RES_HCR_FLASH_PROGRAMING); + rc = trm_unlock(mfl->trm, TRM_RES_HCR_FLASH_PROGRAMING); if (rc && rc != TRM_STS_RES_NOT_SUPPORTED) { return MFE_SEM_LOCKED; } @@ -182,14 +183,14 @@ int sx_flash_lock_by_type(mflash* mfl, int lock_state) return rc; } -int sx_erase_sect_by_type(mflash* mfl, u_int32_t addr) +int sx_erase_sect_by_type(mflash* mfl, u_int32_t addr, u_int32_t erase_size) { int rc, bank; u_int32_t flash_addr; rc = mfl_get_bank_info(mfl, addr, &flash_addr, &bank); CHECK_RC(rc); rc = check_access_type( mfl); CHECK_RC(rc); - rc = common_erase_sector(mfl->mf, flash_addr, bank); CHECK_RC(rc); + rc = common_erase_sector(mfl->mf, flash_addr, bank, erase_size); CHECK_RC(rc); return MFE_OK; } @@ -198,7 +199,7 @@ int mf_update_boot_addr_by_type(mflash* mfl, u_int32_t boot_addr) int rc; if (mfl->access_type == MFAT_UEFI || mfl->opts[MFO_FW_ACCESS_TYPE_BY_MFILE] == ATBM_MLNXOS_CMDIF) { // No CR-Space access - use mfpa register - rc = run_mfpa_command(mfl->mf, REG_ACCESS_METHOD_SET, get_bank_int(mfl), boot_addr, NULL, NULL, NULL); CHECK_RC(rc); + rc = run_mfpa_command(mfl->mf, REG_ACCESS_METHOD_SET, get_bank_int(mfl), boot_addr, NULL, NULL, NULL, NULL); CHECK_RC(rc); } return MFE_OK; } diff --git a/mflash/mflash_access_layer.h b/mflash/mflash_access_layer.h index 23931fa..622e79e 100755 --- a/mflash/mflash_access_layer.h +++ b/mflash/mflash_access_layer.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -27,26 +28,22 @@ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. - * - * Version: $Id$ - * */ #ifndef MFLASH_ACCESS_LAYER_H_ #define MFLASH_ACCESS_LAYER_H_ #include -//#include "cib_cif.h" #include "mflash_common_structs.h" #define BOOT_CR_SPACE_ADDR 0xf0000 -int sx_get_flash_info_by_type(mflash* mfl, unsigned *type_index, int *log2size, u_int8_t *no_flash); +int sx_get_flash_info_by_type(mflash* mfl, flash_info_t* type_index, int *log2size, u_int8_t *no_flash); int sx_block_read_by_type(mflash* mfl, u_int32_t blk_addr, u_int32_t blk_size, u_int8_t* data); int sx_block_write_by_type(mflash* mfl, u_int32_t addr, u_int32_t size, u_int8_t* data); int sx_flash_lock_by_type(mflash* mfl, int lock_state); -int sx_erase_sect_by_type(mflash* mfl, u_int32_t addr); +int sx_erase_sect_by_type(mflash* mfl, u_int32_t addr, u_int32_t erase_size); int mf_update_boot_addr_by_type(mflash* mfl, u_int32_t boot_addr); diff --git a/mflash/mflash_common_structs.h b/mflash/mflash_common_structs.h index 5d7894b..f03a089 100644 --- a/mflash/mflash_common_structs.h +++ b/mflash/mflash_common_structs.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -27,9 +28,6 @@ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. - * - * Version: $Id$ - * */ #ifndef MFLASH_COMMON_STRUCTS_H @@ -84,11 +82,6 @@ typedef struct flash_attr { u_int32_t sector_size; int num_erase_blocks; // Number of sector defs. - struct { - unsigned long sector_size; // Byte size of sector - int num_sectors; // Num sectors of this size - u_int32_t sector_mask; // Sector mask - } erase_block[8]; // // bank_size: Different bank means a different chip sellect or gpio settings is needed when crossing @@ -127,9 +120,26 @@ typedef struct flash_attr { // the flash sector size as seen by FW u_int32_t fw_flash_sector_sz; + u_int8_t support_sub_and_sector; // true if flash can work in both 64KB and 4KB sectors + } flash_attr; +typedef struct flash_info { + const char *name; + u_int8_t vendor; + u_int8_t type; + int command_set; + int erase_command; + u_int32_t sector_size; + u_int8_t support_sub_and_sector; + u_int8_t quad_en_support; + u_int8_t write_protected_support; + u_int8_t protect_sub_and_sector; + u_int8_t dummy_cycles_support; +} flash_info_t; + + #endif // MFLASH_COMMON_STRUCTS_H diff --git a/mflash/mflash_pack_layer.c b/mflash/mflash_pack_layer.c index b9d6f9c..d0c50bf 100755 --- a/mflash/mflash_pack_layer.c +++ b/mflash/mflash_pack_layer.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -27,9 +28,6 @@ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. - * - * Version: $Id$ - * */ #include @@ -86,17 +84,23 @@ int sx_st_block_access(mfile *mf, u_int32_t flash_addr, u_int8_t bank, u_int32_t } -int common_erase_sector(mfile *mf, u_int32_t addr, u_int8_t flash_bank) +int common_erase_sector(mfile *mf, u_int32_t addr, u_int8_t flash_bank, u_int32_t erase_size) { struct register_access_mfbe mfbe; - + if (addr & (erase_size-1)) { + return MFE_ERASE_ERROR; + } memset(&mfbe, 0, sizeof(mfbe)); mfbe.address = addr; mfbe.fs = flash_bank; + if (erase_size == FSS_64KB) { + mfbe.bulk_64kb_erase = 1; + } return MError2MfError(reg_access_mfbe (mf, REG_ACCESS_METHOD_SET, &mfbe)); } -int run_mfpa_command(mfile *mf, u_int8_t access_cmd, u_int8_t flash_bank, u_int32_t boot_address, u_int32_t *jedec_p, int *num_of_banks, u_int32_t* fw_sector_size) +int run_mfpa_command(mfile *mf, u_int8_t access_cmd, u_int8_t flash_bank, u_int32_t boot_address,\ + u_int32_t *jedec_p, int *num_of_banks, u_int32_t* fw_sector_size, u_int8_t* support_sub_and_sector) { struct register_access_mfpa mfpa; int rc; @@ -138,22 +142,26 @@ int run_mfpa_command(mfile *mf, u_int8_t access_cmd, u_int8_t flash_bank, u_int3 } } + if (support_sub_and_sector != NULL) { + *support_sub_and_sector = mfpa.bulk_64kb_erase_en; + } + return MFE_OK; } int get_num_of_banks(mfile *mf) { int num_of_banks; - int rc = run_mfpa_command(mf, REG_ACCESS_METHOD_GET, 0, 0, NULL, &num_of_banks, NULL); + int rc = run_mfpa_command(mf, REG_ACCESS_METHOD_GET, 0, 0, NULL, &num_of_banks, NULL, NULL); if (rc) { return -1; } return num_of_banks; } -int com_get_jedec(mfile *mf, u_int8_t flash_bank, u_int32_t *jedec_p, u_int32_t* fw_flash_sector_size) +int com_get_jedec(mfile *mf, u_int8_t flash_bank, u_int32_t *jedec_p, u_int32_t* fw_flash_sector_size, u_int8_t* supp_sub_and_sector) { - return run_mfpa_command(mf, REG_ACCESS_METHOD_GET, flash_bank, 0, jedec_p, NULL, fw_flash_sector_size); + return run_mfpa_command(mf, REG_ACCESS_METHOD_GET, flash_bank, 0, jedec_p, NULL, fw_flash_sector_size, supp_sub_and_sector); } /* diff --git a/mflash/mflash_pack_layer.h b/mflash/mflash_pack_layer.h index 5bdaf4e..1076264 100755 --- a/mflash/mflash_pack_layer.h +++ b/mflash/mflash_pack_layer.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -27,9 +28,6 @@ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. - * - * Version: $Id$ - * */ #ifndef MFLASH_COMMON_H_ @@ -37,6 +35,7 @@ #include "mflash_types.h" #include "mflash_common_structs.h" +#include // TODO: use: (int)log2((float)num) #define NEAREST_POW2(num)\ @@ -64,7 +63,7 @@ typedef int (*f_mf_erase_sect)(mflash* mfl, u_int32_t addr); typedef int (*f_mf_reset) (mflash* mfl); typedef int (*f_st_spi_status)(mflash* mfl, u_int8_t op_type, u_int8_t* status); -typedef int (*f_mf_get_info) (mflash* mfl, unsigned *type_index, int *log2size, u_int8_t *no_flash); +typedef int (*f_mf_get_info) (mflash* mfl, flash_info_t *f_info, int *log2size, u_int8_t *no_flash); ///////////////////////////////////////////// // // MFlash struct @@ -104,6 +103,7 @@ struct mflash { char last_err_str[MFLASH_ERR_STR_SIZE]; u_int8_t access_type; //0 = mfile , 1 = uefi + trm_ctx trm; }; @@ -184,11 +184,12 @@ int sx_st_block_access(mfile *mf, u_int32_t flash_addr, u_int8_t bank, u_int32_t u_int8_t method); -int common_erase_sector(mfile *mf, u_int32_t addr, u_int8_t flash_bank); +int common_erase_sector(mfile *mf, u_int32_t addr, u_int8_t flash_bank, u_int32_t erase_size); -int run_mfpa_command(mfile *mf, u_int8_t access_cmd, u_int8_t flash_bank, u_int32_t boot_address, u_int32_t *jedec_p, int *num_of_banks, u_int32_t* fw_flash_sector_sz); +int run_mfpa_command(mfile *mf, u_int8_t access_cmd, u_int8_t flash_bank, u_int32_t boot_address,\ + u_int32_t *jedec_p, int *num_of_banks, u_int32_t* fw_flash_sector_sz, u_int8_t* supp_sub_and_sector); -int com_get_jedec(mfile *mf, u_int8_t flash_bank, u_int32_t *jedec_p, u_int32_t* fw_flash_sector_sz); +int com_get_jedec(mfile *mf, u_int8_t flash_bank, u_int32_t *jedec_p, u_int32_t* fw_flash_sector_sz, u_int8_t* supp_sub_and_sector); int get_num_of_banks(mfile *mf); int get_info_from_jededc_id(u_int32_t jededc_id, u_int8_t *vendor, u_int8_t* type, u_int8_t* capacity); int get_type_index_by_vendor_and_type(u_int8_t vendor, u_int8_t type, unsigned *type_index); diff --git a/mflash/mflash_types.h b/mflash/mflash_types.h index 2572adc..cd9a6c2 100644 --- a/mflash/mflash_types.h +++ b/mflash/mflash_types.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -27,14 +28,17 @@ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. - * - * Version: $Id$ - * */ #ifndef MFLASH_TYPES_H #define MFLASH_TYPES_H +typedef enum { + FSS_4KB = 0x1000, + FSS_64KB = 0x10000 +} Flash_Sector_Size_t; + + typedef enum MfError { MFE_OK = 0, MFE_ERROR, @@ -75,6 +79,7 @@ typedef enum MfError { MFE_SECTORS_NUM_NOT_POWER_OF_TWO, MFE_UNKOWN_ACCESS_TYPE, MFE_UNSUPPORTED_DEVICE, + MFE_UNSUPPORTED_ERASE_OPERATION, MFE_OLD_DEVICE_TYPE, MFE_ICMD_INIT_FAILED, MFE_ICMD_NOT_SUPPORTED, @@ -100,7 +105,7 @@ typedef enum MfError { MFE_REG_ACCESS_SIZE_EXCCEEDS_LIMIT, MFE_PCICONF, MFE_ILLEGAL_BANK_NUM, - + MFE_OCR_NOT_SUPPORTED, MFE_LAST } MfError; diff --git a/mlxconfig/mlxcfg_lib.cpp b/mlxconfig/mlxcfg_lib.cpp index 68ebe40..bb38aef 100644 --- a/mlxconfig/mlxcfg_lib.cpp +++ b/mlxconfig/mlxcfg_lib.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -28,8 +29,6 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - * Version: $Id$ - * */ #include @@ -93,7 +92,7 @@ MlxCfgOps::MlxCfgOps() updateErrCodes(errmap); _mf = NULL; - _deviceId = DeviceEndMarker; + _deviceId = DeviceUnknown; _suppVec = 0; _isFifthGen = false; return; @@ -190,12 +189,48 @@ int MlxCfgOps::supportsNVData() return MCE_SUCCESS; } +int MlxCfgOps::isDefaultSupported(bool &defaultSupported) +{ + struct tools_open_nvqgc nvqgcTlv; + + if(!_isFifthGen){ + defaultSupported = true; + return ME_OK; + } + + memset(&nvqgcTlv, 0, sizeof(struct tools_open_nvqgc)); + MError rc; + + mft_signal_set_handling(1); + rc = reg_access_nvqgc(_mf, REG_ACCESS_METHOD_GET, &nvqgcTlv); + dealWithSignal(); + if (rc == ME_REG_ACCESS_BAD_PARAM || rc == ME_REG_ACCESS_INTERNAL_ERROR) { + defaultSupported = 0; + return ME_OK; + } else if(rc == ME_OK){ + defaultSupported = nvqgcTlv.read_factory_settings_support; + return ME_OK; + } + return rc; +} + int MlxCfgOps::openComChk() { bool rc; int ret; + u_int32_t type = 0; // check if we support Tools HCR and update _suppVec if (_isFifthGen) { + rc = mget_mdevs_type(_mf, &type); + #ifndef MST_UL + if (type != MST_PCICONF && type != MST_PCI) { + return errmsg(MCE_PCI); + } + #else + if (type != MTCR_ACCESS_CONFIG && type != MTCR_ACCESS_MEMORY) { + return errmsg(MCE_PCI); + } + #endif rc = supportsNVData(); CHECK_RC(rc); } else { rc = supportsToolsHCR(); CHECK_RC(rc); @@ -266,6 +301,10 @@ int MlxCfgOps::opend(mfile* mf, bool forceClearSem) _param2TypeMap[Mcp_Sriov_En] = Mct_Pci; _param2TypeMap[Mcp_Num_Of_Vfs] = Mct_Pci; _param2TypeMap[Mcp_Fpp_En] = Mct_Pci; + _param2TypeMap[Mcp_PF_Log_Bar_Size] = Mct_Pci; + _param2TypeMap[Mcp_VF_Log_Bar_Size] = Mct_Pci; + _param2TypeMap[Mcp_Num_Pf_Msix] = Mct_Pci; + _param2TypeMap[Mcp_Num_Vf_Msix] = Mct_Pci; // TPT settings _cfgList[Mct_Tpt] = new TptParams5thGen(); _param2TypeMap[Mcp_Log_Tpt_Size] = Mct_Tpt; @@ -273,12 +312,6 @@ int MlxCfgOps::opend(mfile* mf, bool forceClearSem) _cfgList[Mct_Dc] = new IBDCParams5thGen(); _param2TypeMap[Mcp_Log_Dcr_Hash_Table_Size] = Mct_Dc; _param2TypeMap[Mcp_Dcr_Lifo_Size] = Mct_Dc; - // Port Boot State - /*_cfgList[Mct_Boot_State_P1] = new PortBootStateParams5thGen(1); - _cfgList[Mct_Boot_State_P2] = new PortBootStateParams5thGen(2); - _param2TypeMap[Mcp_Boot_State_P1] = Mct_Boot_State_P1; - _param2TypeMap[Mcp_Boot_State_P2] = Mct_Boot_State_P2; - */ // RoCE v1.5 next protocol _cfgList[Mct_RoCE_Next_Protocol] = new RoCENextProtocolParams5thGen(); _param2TypeMap[Mcp_RoCE_Next_Protocol] = Mct_RoCE_Next_Protocol; @@ -332,6 +365,13 @@ int MlxCfgOps::opend(mfile* mf, bool forceClearSem) _param2TypeMap[Mcp_Cnp_Dscp_P2] = Mct_RoCE_CC_Ecn_P2; _param2TypeMap[Mcp_Cnp_802p_Prio_P2] = Mct_RoCE_CC_Ecn_P2; + _cfgList[Mct_External_Port] = new ExternalPort5thGen(); + _param2TypeMap[Mcp_Port_Owner] = Mct_External_Port; + _param2TypeMap[Mcp_Allow_Rd_Counters] = Mct_External_Port; + + _cfgList[Mct_Boot_Settings_Extras_5thGen] = new BootSettingsExtParams5thGen(); + _param2TypeMap[Mcp_Boot_Settings_Ext_IP_Ver] = Mct_Boot_Settings_Extras_5thGen; + } else { // SR-IOV _cfgList[Mct_Sriov] = new SriovParams4thGen(); @@ -369,6 +409,11 @@ int MlxCfgOps::opend(mfile* mf, bool forceClearSem) _param2TypeMap[Mcp_Boot_Retry_Cnt_P2] = Mct_Preboot_Boot_Settings_P2; _param2TypeMap[Mcp_Legacy_Boot_Protocol_P2] = Mct_Preboot_Boot_Settings_P2; _param2TypeMap[Mcp_Boot_Vlan_P2] = Mct_Preboot_Boot_Settings_P2; + + _cfgList[Mct_Boot_Settings_Extras_4thGen_P1] = new BootSettingsExtParams4thGen(1); + _cfgList[Mct_Boot_Settings_Extras_4thGen_P2] = new BootSettingsExtParams4thGen(2); + _param2TypeMap[Mcp_Boot_Settings_Ext_IP_Ver_P1] = Mct_Boot_Settings_Extras_4thGen_P1; + _param2TypeMap[Mcp_Boot_Settings_Ext_IP_Ver_P2] = Mct_Boot_Settings_Extras_4thGen_P2; } @@ -403,7 +448,7 @@ bool MlxCfgOps::supportsParam(mlxCfgParam param) return _cfgList[cfgParam2Type(param)]->cfgSupported(_mf, param); } -int MlxCfgOps::getCfg(mlxCfgParam cfgParam, u_int32_t& val) +int MlxCfgOps::getCfg(mlxCfgParam cfgParam, u_int32_t& val, bool getDefault) { if (!isLegal(cfgParam)) { return MCE_BAD_PARAMS; @@ -413,11 +458,16 @@ int MlxCfgOps::getCfg(mlxCfgParam cfgParam, u_int32_t& val) return errmsg(MCE_UNSUPPORTED_CFG); } - int rc = _cfgList[cfgParam2Type(cfgParam)]->getFromDev(_mf); - if (rc) { - return errmsgConcatMsg(rc,*_cfgList[cfgParam2Type(cfgParam)]); + if (getDefault) { + val = (_cfgList[cfgParam2Type(cfgParam)])->getDefaultParam(cfgParam); + } else { + int rc; + rc = _cfgList[cfgParam2Type(cfgParam)]->getFromDev(_mf); + if (rc) { + return errmsgConcatMsg(rc,*_cfgList[cfgParam2Type(cfgParam)]); + } + val = (_cfgList[cfgParam2Type(cfgParam)])->getParam(cfgParam); } - val = (_cfgList[cfgParam2Type(cfgParam)])->getParam(cfgParam); return MCE_SUCCESS; } @@ -506,18 +556,26 @@ int MlxCfgOps::invalidateCfgs4thGen() { struct tools_open_mnvia mnviaTlv; u_int8_t buffer[TOOLS_OPEN_MNVIA_SIZE] = {0}; + int rc; memset(&mnviaTlv, 0, sizeof(struct tools_open_mnvia)); tools_open_mnvia_pack(&mnviaTlv, buffer); - return reg_access_mnvia(_mf, REG_ACCESS_METHOD_SET, &mnviaTlv); + mft_signal_set_handling(1); + rc = reg_access_mnvia(_mf, REG_ACCESS_METHOD_SET, &mnviaTlv); + dealWithSignal(); + return rc; } int MlxCfgOps::invalidateCfgs5thGen() { struct tools_open_nvia nviaTlv; u_int8_t buffer[TOOLS_OPEN_NVIA_SIZE] = {0}; + int rc; memset(&nviaTlv, 0, sizeof(struct tools_open_nvia)); tools_open_nvia_pack(&nviaTlv, buffer); - return reg_access_nvia(_mf, REG_ACCESS_METHOD_SET, &nviaTlv); + mft_signal_set_handling(1); + rc = reg_access_nvia(_mf, REG_ACCESS_METHOD_SET, &nviaTlv); + dealWithSignal(); + return rc; } int MlxCfgOps::invalidateCfgs() @@ -561,7 +619,9 @@ const char* MlxCfgOps::loadConfigurationGetStr() if (_isFifthGen && (_deviceId == DeviceConnectX4 || _deviceId == DeviceConnectX4LX)) { // send warm boot (bit 6) mfrl.reset_level = 1 << 6; + mft_signal_set_handling(1); rc = reg_access_mfrl(_mf,REG_ACCESS_METHOD_SET, &mfrl); + dealWithSignal(); if (rc) { return "Please power cycle machine to load new configurations."; } diff --git a/mlxconfig/mlxcfg_lib.h b/mlxconfig/mlxcfg_lib.h index 8722435..1a2603d 100644 --- a/mlxconfig/mlxcfg_lib.h +++ b/mlxconfig/mlxcfg_lib.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -28,8 +29,6 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - * Version: $Id$ - * */ #ifndef MLXCFG_LIB_H_ @@ -57,7 +56,7 @@ public: bool supportsCfg(mlxCfgType cfg); bool supportsParam(mlxCfgParam param); - int getCfg(mlxCfgParam cfgParam, u_int32_t& val); + int getCfg(mlxCfgParam cfgParam, u_int32_t& val, bool getDefault = false); int getCfg(std::vector& infoVec); int setCfg(mlxCfgParam cfgParam, u_int32_t val); @@ -78,6 +77,8 @@ public: const char* loadConfigurationGetStr(); + int isDefaultSupported(bool &defaultSupported); + private: int openComChk(); int supportsToolsHCR(); diff --git a/mlxconfig/mlxcfg_param_lib.cpp b/mlxconfig/mlxcfg_param_lib.cpp index d5481ee..0890a7a 100644 --- a/mlxconfig/mlxcfg_param_lib.cpp +++ b/mlxconfig/mlxcfg_param_lib.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -28,8 +29,6 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - * Version: $Id$ - * */ #include @@ -126,6 +125,25 @@ enum { _updated = false;\ return MCE_SUCCESS +#define GET_DEFAULT_5TH_GEN(mf, tlvStructName, tlvNameStr) \ + MError __mRc;\ + int __tlvBuffSize = tlvStructName##_size();\ + u_int8_t __tlvBuff[__tlvBuffSize];\ + memset(__tlvBuff, 0, __tlvBuffSize);\ + struct tlvStructName __tlvStruct;\ + memset(&__tlvStruct, 0, sizeof(__tlvStruct));\ + __mRc = mnvaCom5thGen(mf, &__tlvBuff[0], __tlvBuffSize, getTlvTypeBe(), REG_ACCESS_METHOD_GET, true);\ + if (__mRc) {\ + if (__mRc == ME_REG_ACCESS_RES_NOT_AVLBL) {\ + return MCE_SUCCESS;\ + }\ + return errmsg("Failed to get %s settings: %s", tlvNameStr, m_err2str(__mRc));\ + }\ + tlvStructName##_unpack(&__tlvStruct, &__tlvBuff[0]);\ + updateClassDefaultAttrFromTlv((void*)&__tlvStruct);\ + updateClassAttrFromDefaultParams();\ + return MCE_SUCCESS + #define GET_FROM_DEV_5TH_GEN(mf, tlvStructName, tlvNameStr) \ MError __mRc;\ int __tlvBuffSize = tlvStructName##_size();\ @@ -237,7 +255,7 @@ MError mnvaCom4thGen(mfile* mf, u_int8_t* buff, u_int16_t len, u_int16_t tlvType return ME_OK; } -MError mnvaCom5thGen(mfile* mf, u_int8_t* buff, u_int16_t len, u_int32_t tlvType, reg_access_method_t method) +MError mnvaCom5thGen(mfile* mf, u_int8_t* buff, u_int16_t len, u_int32_t tlvType, reg_access_method_t method, bool getDefault=false) { struct tools_open_nvda mnvaTlv; memset(&mnvaTlv, 0, sizeof(struct tools_open_nvda)); @@ -245,6 +263,9 @@ MError mnvaCom5thGen(mfile* mf, u_int8_t* buff, u_int16_t len, u_int32_t tlvType mnvaTlv.nv_hdr.length = len; mnvaTlv.nv_hdr.rd_en = 0; mnvaTlv.nv_hdr.over_en = 1; + if (getDefault) { + mnvaTlv.nv_hdr.default_ = 1; + } // tlvType should be in the correct endianess mnvaTlv.nv_hdr.type.tlv_type_dw.tlv_type_dw = __be32_to_cpu(tlvType); memcpy(mnvaTlv.data, buff, len); @@ -289,6 +310,9 @@ MError nvqcCom5thGen(mfile* mf, u_int32_t tlvType, bool& suppRead, bool& suppWri /* * RawCfgParams5thGen Class implementation */ +RawCfgParams5thGen::RawCfgParams5thGen() { + memset(&_nvdaTlv, 0, sizeof(struct tools_open_nvda)); +} int RawCfgParams5thGen::setRawData(const std::vector& tlvBuff) { _tlvBuff = tlvBuff; @@ -361,7 +385,9 @@ CfgParams::CfgParams(mlxCfgType t, u_int32_t tlvT) { int CfgParams::getDefaultParams4thGen(mfile* mf, struct tools_open_query_def_params_global* global_params) { + mft_signal_set_handling(1); MError rc = tcif_query_global_def_params(mf, global_params); + dealWithSignal(); if (rc) { return errmsg(MCE_BAD_STATUS, "Failed to get default parameters: %s", tcif_err2str(rc)); } @@ -370,7 +396,9 @@ int CfgParams::getDefaultParams4thGen(mfile* mf, struct tools_open_query_def_par int CfgParams::getDefaultParams4thGen(mfile* mf, int port, struct tools_open_query_def_params_per_port* port_params) { + mft_signal_set_handling(1); MError rc = tcif_query_per_port_def_params(mf, port, port_params); + dealWithSignal(); if (rc) { return errmsg(MCE_BAD_STATUS, "Failed to get default parameters: %s", tcif_err2str(rc)); } @@ -413,10 +441,265 @@ void CfgParams::setIgnoreHardLimits(bool val) } /* - * SriovParam Class implementation: + * BootSettingsExtParams Class implementation: + */ +bool BootSettingsExtParams::hardLimitCheck() +{ + if(_ipVer > 3) { + errmsg("illegal IP Ver parameter value. can be 0..3"); + return false; + } + return true; +} + +void BootSettingsExtParams::setParams(u_int32_t ipVer) +{ + _ipVer = ipVer; +} + +/* + * BootSettingsExtParams4thGen Class implementation: + */ + +u_int32_t BootSettingsExtParams4thGen::getDefaultParam(mlxCfgParam paramType) +{ + if (paramType == Mcp_Boot_Settings_Ext_IP_Ver_P1 || + paramType == Mcp_Boot_Settings_Ext_IP_Ver_P2) { + return _ipVerDefault; + } + return MLXCFG_UNKNOWN; +} + +void BootSettingsExtParams4thGen::setParam(mlxCfgParam paramType, u_int32_t val) +{ + if (paramType == Mcp_Boot_Settings_Ext_IP_Ver_P1 || + paramType == Mcp_Boot_Settings_Ext_IP_Ver_P2) { + _ipVer = val; + } +} + +u_int32_t BootSettingsExtParams4thGen::getParam(mlxCfgParam paramType) +{ + if (paramType == Mcp_Boot_Settings_Ext_IP_Ver_P1 || + paramType == Mcp_Boot_Settings_Ext_IP_Ver_P2) { + return _ipVer; + } + return MLXCFG_UNKNOWN; +} + +bool BootSettingsExtParams4thGen::cfgSupported(mfile* mf, mlxCfgParam param) +{ + (void)param; + struct tools_open_query_def_params_global params; + int rc; + rc = getDefaultParams4thGen(mf, ¶ms); + if (rc) { + return false; + } + return params.boot_ip_ver; +} + +int BootSettingsExtParams4thGen::getDefaultParams(mfile* mf) +{ + struct tools_open_query_def_params_per_port params; + int rc; + rc = getDefaultParams4thGen(mf, _port, ¶ms); + if (rc) { + return false; + } + _ipVerDefault = params.boot_ip_ver; + setParams(_ipVerDefault); + return MCE_SUCCESS; +} + +int BootSettingsExtParams4thGen::getFromDev(mfile* mf) +{ + if (_updated) { + return MCE_SUCCESS; + } + MError rc; + // prep tlv + u_int8_t buff[tools_open_sriov_size()]; + struct tools_open_boot_settings_ext bootSettingsExtTlv; + memset(buff, 0, tools_open_boot_settings_ext_size()); + memset(&bootSettingsExtTlv, 0, sizeof(struct tools_open_boot_settings_ext)); + // pack it + tools_open_boot_settings_ext_pack(&bootSettingsExtTlv, buff); + // send it + DEBUG_PRINT_SEND(&bootSettingsExtTlv, boot_settings_ext); + rc = mnvaCom4thGen(mf, buff, tools_open_boot_settings_ext_size(), tlvTypeIdx, REG_ACCESS_METHOD_GET, _port); + // check rc + DEBUG_PRINT_RECIEVE(&bootSettingsExtTlv, boot_settings_ext); + if (rc) {// when attempting to get a nv_cfg tlv from device ME_REG_ACCESS_RES_NOT_AVLBL means - no valid + // tlv found. i.e default configuration are on. + if (rc == ME_REG_ACCESS_RES_NOT_AVLBL) { + return MCE_SUCCESS; + } + return errmsg(MCE_BAD_STATUS, "Failed to get Boot Settings Extras configuration: %s", m_err2str(rc)); + } + // unpack and update + tools_open_boot_settings_ext_unpack(&bootSettingsExtTlv, buff); + setParams(bootSettingsExtTlv.ip_ver); + _updated = true; + + return MCE_SUCCESS; +} + +int BootSettingsExtParams4thGen::setOnDev(mfile* mf, bool ignoreCheck) +{ + if (_ipVer == MLXCFG_UNKNOWN) { + return errmsg("%s please specify all parameters for Boot Settings Extras.", err() ? err() : ""); + } + if (!ignoreCheck && !checkCfg(mf)) { + return MCE_BAD_PARAMS; + } + + // prep tlv + MError ret; + u_int8_t buff[tools_open_boot_settings_ext_size()]; + struct tools_open_boot_settings_ext bootSettingsExtTlv; + + memset(buff, 0, tools_open_boot_settings_ext_size()); + memset(&bootSettingsExtTlv, 0, sizeof(struct tools_open_boot_settings_ext)); + bootSettingsExtTlv.ip_ver = _ipVer; + // pack it + tools_open_boot_settings_ext_pack(&bootSettingsExtTlv, buff); + // send it + ret = mnvaCom4thGen(mf, buff, tools_open_boot_settings_ext_size(), tlvTypeIdx, REG_ACCESS_METHOD_SET, _port); + // check rc + if (ret) { + return errmsg("failed to set Boot Settings Extras params: %s",m_err2str(ret)); + } + _updated = false; + return MCE_SUCCESS; +} + +/* + * BootSettingsExtParams5thGen Class implementation: + */ + +u_int32_t BootSettingsExtParams5thGen::getDefaultParam(mlxCfgParam paramType) +{ + if (paramType == Mcp_Boot_Settings_Ext_IP_Ver) { + return _ipVerDefault; + } + return MLXCFG_UNKNOWN; +} + +void BootSettingsExtParams5thGen::setParam(mlxCfgParam paramType, u_int32_t val) +{ + if (paramType == Mcp_Boot_Settings_Ext_IP_Ver) { + _ipVer = val; + } +} + +u_int32_t BootSettingsExtParams5thGen::getParam(mlxCfgParam paramType) +{ + if (paramType == Mcp_Boot_Settings_Ext_IP_Ver) { + return _ipVer; + } + return MLXCFG_UNKNOWN; +} + +u_int32_t BootSettingsExtParams5thGen::getBootSettingsExtCapabilitiesTlvTypeBe() +{ + struct tools_open_global_type type; + u_int32_t tlvType = 0; + + type.param_class = CLASS_GLOBAL; + type.param_idx = BOOT_SETTINGS_EXTRAS_GEN5_CAP; + tools_open_global_type_pack(&type, (u_int8_t*)&tlvType); + return tlvType; +} + +bool BootSettingsExtParams5thGen::cfgSupported(mfile* mf, mlxCfgParam param) +{ + MError rc; + (void)param; + u_int8_t tlvCapBuff[TOOLS_OPEN_OPTION_ROM_CAPABILITY_SIZE] = {0}; + struct tools_open_option_rom_capability optionRomCapabilitesTlv; + bool suppRead, suppWrite; + rc = nvqcCom5thGen(mf, getBootSettingsExtCapabilitiesTlvTypeBe(), suppRead, suppWrite); + if (rc) { + return false; + } + memset(&optionRomCapabilitesTlv, 0, sizeof(optionRomCapabilitesTlv)); + rc = mnvaCom5thGen(mf, &tlvCapBuff[0], TOOLS_OPEN_OPTION_ROM_CAPABILITY_SIZE, getBootSettingsExtCapabilitiesTlvTypeBe(), REG_ACCESS_METHOD_GET); + if (rc) { + return errmsg("Failed to get Boot Settings Ext capabilities parameter. %s", m_err2str(rc)); + } + tools_open_option_rom_capability_unpack(&optionRomCapabilitesTlv, tlvCapBuff); + return optionRomCapabilitesTlv.ip_ver; +} + +int BootSettingsExtParams5thGen::getFromDev(mfile* mf) +{ + GET_FROM_DEV_5TH_GEN(mf, tools_open_boot_settings_ext, "Boot Settings Ext"); +} + +void BootSettingsExtParams5thGen::updateClassAttrFromDefaultParams() +{ + setParams(_ipVerDefault); +} + +int BootSettingsExtParams5thGen::setOnDev(mfile* mf, bool ignoreCheck) +{ + SET_ON_DEV_5TH_GEN(mf, ignoreCheck, tools_open_boot_settings_ext, "Boot Settings Ext"); +} + +u_int32_t BootSettingsExtParams5thGen::getTlvTypeBe() +{ + struct tools_open_per_host_type type; + u_int32_t tlvType = 0; + + type.param_class = CLASS_PER_HOST; + type.param_idx = tlvTypeIdx; + type.function = 0; // currently support only host 0 (FW should fill this field with correct func) + type.host = 0; // currently support only host 0 (FW should fill this field with correct host) + tools_open_per_host_type_pack(&type, (u_int8_t*)&tlvType); + return tlvType; +} + +void BootSettingsExtParams5thGen::updateTlvFromClassAttr(void* tlv) +{ + struct tools_open_boot_settings_ext* bootSettingsExt = (struct tools_open_boot_settings_ext*)tlv; + bootSettingsExt->ip_ver = _ipVer; + return; +} +void BootSettingsExtParams5thGen::updateClassAttrFromTlv(void* tlv) +{ + struct tools_open_boot_settings_ext* bootSettingsExt = (struct tools_open_boot_settings_ext*)tlv; + setParams(bootSettingsExt->ip_ver); + return; +} + +void BootSettingsExtParams5thGen::updateClassDefaultAttrFromTlv(void* tlv) +{ + struct tools_open_boot_settings_ext* bootSettingsExt = (struct tools_open_boot_settings_ext*)tlv; + _ipVerDefault = bootSettingsExt->ip_ver; + return; +} + +int BootSettingsExtParams5thGen::getDefaultParamsAux(mfile* mf) +{ + GET_DEFAULT_5TH_GEN(mf, tools_open_boot_settings_ext, "Boot Settings Extras"); +} + +int BootSettingsExtParams5thGen::getDefaultParams(mfile* mf) +{ + int rc = getDefaultParamsAux(mf); + if(!rc || _ipVerDefault == MLXCFG_UNKNOWN){ + _ipVerDefault = 0; + setParams(_ipVerDefault); + } + return MCE_SUCCESS; +} + +/* + * SriovParams4thGen Class implementation: */ -void SriovParams::setParam(mlxCfgParam paramType, u_int32_t val) +void SriovParams4thGen::setParam(mlxCfgParam paramType, u_int32_t val) { if (paramType == Mcp_Sriov_En) { _sriovEn = val; @@ -425,7 +708,7 @@ void SriovParams::setParam(mlxCfgParam paramType, u_int32_t val) } } -u_int32_t SriovParams::getParam(mlxCfgParam paramType) +u_int32_t SriovParams4thGen::getParam(mlxCfgParam paramType) { if (paramType == Mcp_Sriov_En) { return _sriovEn; @@ -435,7 +718,17 @@ u_int32_t SriovParams::getParam(mlxCfgParam paramType) return MLXCFG_UNKNOWN; } -bool SriovParams::hardLimitCheck() +u_int32_t SriovParams4thGen::getDefaultParam(mlxCfgParam paramType) +{ + if (paramType == Mcp_Sriov_En) { + return _sriovEnDefault; + } else if (paramType == Mcp_Num_Of_Vfs) { + return _numOfVfsDefault; + } + return MLXCFG_UNKNOWN; +} + +bool SriovParams4thGen::hardLimitCheck() { if ((_numOfVfs > _maxVfs)) { errmsg("Number of VFs exceeds limit (%d).", _maxVfs); @@ -467,14 +760,21 @@ int SriovParams4thGen::getDefaultParams(mfile* mf) rc = updateMaxVfs(mf); CHECK_RC(rc); rc = getDefaultParams4thGen(mf, &global_params); if (rc == MCE_SUCCESS) { - _sriovEn = global_params.sriov_en; - _numOfVfs = global_params.num_vfs; + _sriovEnDefault = global_params.sriov_en; + _numOfVfsDefault = global_params.num_vfs; + setParams(_sriovEnDefault, _numOfVfsDefault); } else { rc = MCE_GET_DEFAULT_PARAMS; } return rc; } +void SriovParams4thGen::setParams(u_int32_t sriovEn, u_int32_t numOfVfs) +{ + _sriovEn = sriovEn; + _numOfVfs = numOfVfs; +} + int SriovParams4thGen::getFromDev(mfile* mf) { if (_updated) { @@ -496,15 +796,13 @@ int SriovParams4thGen::getFromDev(mfile* mf) if (rc) {// when attempting to get a nv_cfg tlv from device ME_REG_ACCESS_RES_NOT_AVLBL means - no valid // tlv found. i.e default configuration are on. if (rc == ME_REG_ACCESS_RES_NOT_AVLBL) { - return MCE_SUCCESS; } return errmsg(MCE_BAD_STATUS, "Failed to get SRIOV configuration: %s", m_err2str(rc)); } // unpack and update tools_open_sriov_unpack(&sriovTlv, buff); - _sriovEn = sriovTlv.sriov_en; - _numOfVfs = sriovTlv.total_vfs; + setParams(sriovTlv.sriov_en, sriovTlv.total_vfs); _updated = true; return MCE_SUCCESS; @@ -603,6 +901,11 @@ bool WolParams::hardLimitCheck() return false; } +void WolParams::setParams(u_int32_t wolMagicEn) +{ + _wolMagicEn = wolMagicEn; +} + /* * WolParams4thGen Class implementation : */ @@ -622,6 +925,14 @@ u_int32_t WolParams4thGen::getParam(mlxCfgParam paramType) return MLXCFG_UNKNOWN; } +u_int32_t WolParams4thGen::getDefaultParam(mlxCfgParam paramType) +{ + if ((paramType == Mcp_Wol_Magic_En_P1 && _port == 1) || (paramType == Mcp_Wol_Magic_En_P2 && _port == 2)) { + return _wolMagicEnDefault; + } + return MLXCFG_UNKNOWN; +} + bool WolParams4thGen::cfgSupported(mfile* mf, mlxCfgParam param) { (void)mf; @@ -634,7 +945,8 @@ int WolParams4thGen::getDefaultParams(mfile* mf) struct tools_open_query_def_params_per_port port_params; int rc = getDefaultParams4thGen(mf, _port , &port_params); if (rc == MCE_SUCCESS) { - _wolMagicEn = port_params.default_en_wol_magic; + _wolMagicEnDefault = port_params.default_en_wol_magic; + setParams(_wolMagicEnDefault); } else { rc = MCE_GET_DEFAULT_PARAMS; } @@ -665,7 +977,7 @@ int WolParams4thGen::getFromDev(mfile* mf) } // unpack and update tools_open_wol_unpack(&wolTlv, buff); - _wolMagicEn = wolTlv.en_wol_magic; + setParams(wolTlv.en_wol_magic); _updated = true; return MCE_SUCCESS; @@ -719,6 +1031,14 @@ u_int32_t WolParams5thGen::getParam(mlxCfgParam paramType) return MLXCFG_UNKNOWN; } +u_int32_t WolParams5thGen::getDefaultParam(mlxCfgParam paramType) +{ + if (paramType == Mcp_Wol_Magic_En) { + return _wolMagicEnDefault; + } + return MLXCFG_UNKNOWN; +} + bool WolParams5thGen::cfgSupported(mfile* mf, mlxCfgParam param) { MError rc; @@ -734,7 +1054,12 @@ bool WolParams5thGen::cfgSupported(mfile* mf, mlxCfgParam param) int WolParams5thGen::getDefaultParams(mfile* mf) { - return getFromDev(mf); + GET_DEFAULT_5TH_GEN(mf, tools_open_wol, "Wake On LAN"); +} + +void WolParams5thGen::updateClassAttrFromDefaultParams() +{ + setParams(_wolMagicEnDefault); } int WolParams5thGen::getFromDev(mfile* mf) @@ -769,11 +1094,16 @@ void WolParams5thGen::updateTlvFromClassAttr(void* tlv) void WolParams5thGen::updateClassAttrFromTlv(void* tlv) { struct tools_open_wol* wolTlv = (struct tools_open_wol*)tlv; - _wolMagicEn = wolTlv->en_wol_magic; + setParams(wolTlv->en_wol_magic); return; } - +void WolParams5thGen::updateClassDefaultAttrFromTlv(void* tlv) +{ + struct tools_open_wol* wolTlv = (struct tools_open_wol*)tlv; + _wolMagicEnDefault = wolTlv->en_wol_magic; + return; +} /* * BarSzParams Class implementation : */ @@ -794,6 +1124,13 @@ u_int32_t BarSzParams::getParam(mlxCfgParam paramType) return MLXCFG_UNKNOWN; } +u_int32_t BarSzParams::getDefaultParam(mlxCfgParam paramType) +{ + if (paramType == Mcp_Log_Bar_Size) { + return _logBarSzDefault; + } + return MLXCFG_UNKNOWN; +} bool BarSzParams::hardLimitCheck() { @@ -804,6 +1141,10 @@ bool BarSzParams::hardLimitCheck() return true; } +void BarSzParams::setParams(u_int32_t logBarSz) +{ + _logBarSz = logBarSz; +} /* * BarSzParams4thGen Class implementation : */ @@ -820,8 +1161,9 @@ int BarSzParams4thGen::getDefaultParams(mfile* mf) struct tools_open_query_def_params_global global_params; int rc = getDefaultParams4thGen(mf, &global_params); if ((rc == MCE_SUCCESS) & 0) { //TODO: adrianc: remove the & 0 when FW displays thesee parameters correctly in QUERY_DEF_PARAMS command - _logBarSz = global_params.uar_bar_size; + _logBarSzDefault = global_params.uar_bar_size; _maxLogBarSz = global_params.max_uar_bar_size; + setParams(_logBarSzDefault); } else { // attempt to take from query_dev_cap rc = getDefaultBarSz(mf); @@ -844,7 +1186,8 @@ int BarSzParams4thGen::getDefaultBarSz(mfile* mf) return errmsg(MCE_BAD_STATUS,"Failed to query device capabilities. %s", tcif_err2str(rc)); } - _logBarSz = EXTRACT64(data, 16, 6) + 1; //adrianc: this field reports only half of the bar size (i.e without the blue flame) + _logBarSzDefault = EXTRACT64(data, 16, 6) + 1; //adrianc: this field reports only half of the bar size (i.e without the blue flame) + setParams(_logBarSzDefault); return MCE_SUCCESS; } @@ -872,7 +1215,7 @@ int BarSzParams4thGen::getFromDev(mfile* mf) } // unpack and update tools_open_bar_size_unpack(&barSzTlv, buff); - _logBarSz = barSzTlv.log_uar_bar_size; + setParams(barSzTlv.log_uar_bar_size); _updated = true; return MCE_SUCCESS; @@ -974,13 +1317,18 @@ int VpiParams::getFromDevComPost(MError mnvaComRC) } // unpack and update tools_open_vpi_settings_unpack(&_vpiTlv, &_tlvBuff[0]); - _linkType = _vpiTlv.network_link_type; - _defaultLinkType = _vpiTlv.default_link_type; + setParams(_vpiTlv.network_link_type, _vpiTlv.default_link_type); _updated = true; return MCE_SUCCESS; } +void VpiParams::setParams(u_int32_t linkType, u_int32_t defaultLinkType) +{ + _linkType = linkType; + _defaultLinkType = defaultLinkType; +} + int VpiParams::setOnDevComPre(bool ignoreCheck) { if (_linkType == MLXCFG_UNKNOWN || _defaultLinkType == MLXCFG_UNKNOWN) { @@ -1026,6 +1374,14 @@ u_int32_t VpiParams4thGen::getParam(mlxCfgParam paramType) return MLXCFG_UNKNOWN; } +u_int32_t VpiParams4thGen::getDefaultParam(mlxCfgParam paramType) +{ + if ((paramType == Mcp_Link_Type_P1 && _port == 1 ) || (paramType == Mcp_Link_Type_P2 && _port == 2) ) { + return _linkTypeDefault; + } + return MLXCFG_UNKNOWN; +} + bool VpiParams4thGen::cfgSupported(mfile* mf, mlxCfgParam param) { (void)mf; @@ -1036,14 +1392,15 @@ bool VpiParams4thGen::cfgSupported(mfile* mf, mlxCfgParam param) int VpiParams4thGen::getDefaultParams(mfile* mf) { struct tools_open_query_def_params_per_port port_params; - _defaultLinkType = 0; // not used for 4th gen devices , we give it a default value + _defaultLinkTypeDefault = 0; // not used for 4th gen devices , we give it a default value int rc = getDefaultParams4thGen(mf, _port , &port_params); if (rc) { return MCE_GET_DEFAULT_PARAMS; } if (port_params.default_network_link_type) { - _linkType = port_params.default_network_link_type; + _linkTypeDefault = port_params.default_network_link_type; } + setParams(_linkTypeDefault, _defaultLinkTypeDefault); return MCE_SUCCESS; } @@ -1101,6 +1458,14 @@ u_int32_t VpiParams5thGen::getParam(mlxCfgParam paramType) return MLXCFG_UNKNOWN; } +u_int32_t VpiParams5thGen::getDefaultParam(mlxCfgParam paramType) +{ + if ((paramType == Mcp_Link_Type_P1 && _port == 1 ) || (paramType == Mcp_Link_Type_P2 && _port == 2) ) { + return _defaultLinkTypeDefault; + } + return MLXCFG_UNKNOWN; +} + u_int32_t VpiParams5thGen::getTlvTypeBe() { struct tools_open_per_port_type type; @@ -1130,29 +1495,56 @@ bool VpiParams5thGen::cfgSupported(mfile* mf, mlxCfgParam param) } int VpiParams5thGen::getDefaultParams(mfile* mf) -{ - // if configuration is supported then network link type must be 3 - _linkType = 3; - return getFromDev(mf); -} - -int VpiParams5thGen::getFromDev(mfile* mf) { MError mRc; int rc; - if (_updated) { - return MCE_SUCCESS; - } + // if configuration is supported then network link type must be 3 + _linkTypeDefault = 3; + if((rc = getFromDevComPre())) { return rc; } - mRc = mnvaCom5thGen(mf, &_tlvBuff[0], TOOLS_OPEN_VPI_SETTINGS_SIZE, getTlvTypeBe(), REG_ACCESS_METHOD_GET); - return getFromDevComPost(mRc); -} -int VpiParams5thGen::setOnDev(mfile* mf, bool ignoreCheck) -{ + mRc = mnvaCom5thGen(mf, &_tlvBuff[0], TOOLS_OPEN_VPI_SETTINGS_SIZE, getTlvTypeBe(), REG_ACCESS_METHOD_GET, true); + + if (mRc) { + if (mRc == ME_REG_ACCESS_RES_NOT_AVLBL) { + return MCE_SUCCESS; + } + return errmsg("Failed to get VPI port%d configuration: %s", _port, m_err2str(mRc)); + } + + // unpack and update + tools_open_vpi_settings_unpack(&_vpiTlv, &_tlvBuff[0]); + _linkTypeDefault = _vpiTlv.network_link_type; + _defaultLinkTypeDefault = _vpiTlv.default_link_type; + setParams(_linkTypeDefault, _defaultLinkTypeDefault); + return MCE_SUCCESS; + +} + +int VpiParams5thGen::getFromDev(mfile* mf) +{ + MError mRc; + int rc; + + if (_updated) { + return MCE_SUCCESS; + } + if((rc = getFromDevComPre())) { + return rc; + } + mRc = mnvaCom5thGen(mf, &_tlvBuff[0], TOOLS_OPEN_VPI_SETTINGS_SIZE, getTlvTypeBe(), REG_ACCESS_METHOD_GET); + rc = getFromDevComPost(mRc); + + _updated = true; + + return rc; +} + +int VpiParams5thGen::setOnDev(mfile* mf, bool ignoreCheck) +{ MError mRc; int rc; @@ -1210,7 +1602,15 @@ bool PciParams5thGen::cfgSupported(mfile* mf, mlxCfgParam param) case Mcp_Fpp_En: return _fppSupported; case Mcp_Last: - return (_sriovSupported && _fppSupported); + return true; + case Mcp_PF_Log_Bar_Size: + return _pfLogBarSizeSuppored; + case Mcp_VF_Log_Bar_Size: + return _vfLogBarSizeSuppored; + case Mcp_Num_Pf_Msix: + return _numPfMsixSupported; + case Mcp_Num_Vf_Msix: + return _numVfMsixSupported; default: return false; } @@ -1227,6 +1627,18 @@ void PciParams5thGen::setParam(mlxCfgParam paramType, u_int32_t val) } else if (paramType == Mcp_Fpp_En) { _fppEn = val; _userSpecifiedFPP = true; + } else if(paramType == Mcp_PF_Log_Bar_Size) { + _pfLogBarSize = val; + _userSpecifiedPfLogBarSize = true; + } else if(paramType == Mcp_VF_Log_Bar_Size) { + _vfLogBarSize = val; + _userSpecifiedVfLogBarSize = true; + } else if(paramType == Mcp_Num_Pf_Msix) { + _numPfMsix = val; + _userSpecifiedNumPfMsix = true; + } else if(paramType == Mcp_Num_Vf_Msix) { + _numVfMsix = val; + _userSpecifiedNumVfMsix = true; } } @@ -1238,6 +1650,35 @@ u_int32_t PciParams5thGen::getParam(mlxCfgParam paramType) return _numOfVfs; } else if (paramType == Mcp_Fpp_En) { return _fppEn; + } else if(paramType == Mcp_PF_Log_Bar_Size) { + return _pfLogBarSize; + } else if(paramType == Mcp_VF_Log_Bar_Size) { + return _vfLogBarSize; + } else if(paramType == Mcp_Num_Pf_Msix) { + return _numPfMsix; + } else if(paramType == Mcp_Num_Vf_Msix) { + return _numVfMsix; + } + + return MLXCFG_UNKNOWN; +} + +u_int32_t PciParams5thGen::getDefaultParam(mlxCfgParam paramType) +{ + if (paramType == Mcp_Sriov_En) { + return _sriovEnDefault; + } else if (paramType == Mcp_Num_Of_Vfs) { + return _numOfVfsDefault; + } else if (paramType == Mcp_Fpp_En) { + return _fppEnDefault; + } else if(paramType == Mcp_PF_Log_Bar_Size) { + return _pfLogBarSizeDefault; + } else if(paramType == Mcp_VF_Log_Bar_Size) { + return _vfLogBarSizeDefault; + } else if(paramType == Mcp_Num_Pf_Msix) { + return _numPfMsixDefault; + } else if(paramType == Mcp_Num_Vf_Msix) { + return _numVfMsixDefault; } return MLXCFG_UNKNOWN; @@ -1253,7 +1694,6 @@ int PciParams5thGen::getFromDev(mfile* mf) if (_updated) { return MCE_SUCCESS; } - mRc = mnvaCom5thGen(mf, &tlvBuff[0], TOOLS_OPEN_PCI_CONFIGURATION_SIZE, getPciSettingsTlvTypeBe(), REG_ACCESS_METHOD_GET); if (mRc) { @@ -1271,7 +1711,22 @@ int PciParams5thGen::getFromDev(mfile* mf) if (pciSettingsTlv.fpp_valid) { _fppEn = pciSettingsTlv.fpp_en; } - + if(pciSettingsTlv.pf_bar_size_valid) { + _pfLogBarSize = pciSettingsTlv.log_pf_uar_bar_size; + } + if(pciSettingsTlv.vf_bar_size_valid) { + _vfLogBarSize = pciSettingsTlv.log_vf_uar_bar_size; + } + if(pciSettingsTlv.num_pfs_valid){ + _numOfPfs = pciSettingsTlv.num_pfs; + _numOfPfsValid = true; + } + if(pciSettingsTlv.num_pfs_msix_valid){ + _numPfMsix = pciSettingsTlv.num_pf_msix; + } + if(pciSettingsTlv.num_vfs_msix_valid){ + _numVfMsix = pciSettingsTlv.num_vf_msix; + } _updated = true; return MCE_SUCCESS; @@ -1309,9 +1764,29 @@ int PciParams5thGen::setOnDev(mfile* mf, bool ignoreCheck) pciSettingsTlv.fpp_valid = 1; } + if (_pfLogBarSizeSuppored && _userSpecifiedPfLogBarSize) { + pciSettingsTlv.log_pf_uar_bar_size = _pfLogBarSize; + pciSettingsTlv.pf_bar_size_valid = 1; + } + + if (_vfLogBarSizeSuppored && _userSpecifiedVfLogBarSize) { + pciSettingsTlv.log_vf_uar_bar_size = _vfLogBarSize; + pciSettingsTlv.vf_bar_size_valid = 1; + } + if (pciSettingsTlv.sriov_en && !pciSettingsTlv.fpp_en) { return errmsg("FPP should be enabled while SRIOV is enabled"); } + + if(_numPfMsixSupported && _userSpecifiedNumPfMsix) { + pciSettingsTlv.num_pf_msix = _numPfMsix; + pciSettingsTlv.num_pfs_msix_valid = 1; + } + + if(_numVfMsixSupported && _userSpecifiedNumVfMsix) { + pciSettingsTlv.num_vf_msix = _numVfMsix; + pciSettingsTlv.num_vfs_msix_valid = 1; + } // pack it tools_open_pci_configuration_pack(&pciSettingsTlv, tlvBuff); @@ -1327,23 +1802,94 @@ int PciParams5thGen::setOnDev(mfile* mf, bool ignoreCheck) int PciParams5thGen::getDefaultParams(mfile* mf) { - return getDefaultsAndCapabilities(mf); + int rc = getDefaultsAndCapabilities(mf); + + setParams( + _sriovEnDefault, + _numOfVfsDefault, + _fppEnDefault, + _pfLogBarSizeDefault, + _vfLogBarSizeDefault, + _numOfPfs, + _numPfMsixDefault, + _numVfMsixDefault); + + return rc; +} + +void PciParams5thGen::setParams(u_int32_t sriovEn, u_int32_t numOfVfs, u_int32_t fppEn, u_int32_t pfLogBarSize, + u_int32_t vfLogBarSize, u_int32_t numOfPfs, u_int32_t numPfMsix, u_int32_t numVfMsix) +{ + _sriovEn = sriovEn; + _numOfVfs = numOfVfs; + _fppEn = fppEn; + _pfLogBarSize = pfLogBarSize; + _vfLogBarSize = vfLogBarSize; + _numOfPfs = numOfPfs; + _numPfMsix = numPfMsix; + _numVfMsix = numVfMsix; } int PciParams5thGen::getDefaultsAndCapabilities(mfile* mf) { MError rc; - u_int8_t tlvBuff[TOOLS_OPEN_PCI_CAPABILITIES_SIZE] = {0}; + u_int8_t tlvCapBuff[TOOLS_OPEN_PCI_CAPABILITIES_SIZE] = {0}; struct tools_open_pci_capabilities pciCapabilitesTlv; memset(&pciCapabilitesTlv, 0, sizeof(pciCapabilitesTlv)); - rc = mnvaCom5thGen(mf, &tlvBuff[0], TOOLS_OPEN_PCI_CAPABILITIES_SIZE, getPciCapabilitiesTlvTypeBe(), REG_ACCESS_METHOD_GET); + rc = mnvaCom5thGen(mf, &tlvCapBuff[0], TOOLS_OPEN_PCI_CAPABILITIES_SIZE, getPciCapabilitiesTlvTypeBe(), REG_ACCESS_METHOD_GET); if (rc) { return errmsg("Failed to get PCI capabilities parameter. %s", m_err2str(rc)); } - tools_open_pci_capabilities_unpack(&pciCapabilitesTlv, tlvBuff); + tools_open_pci_capabilities_unpack(&pciCapabilitesTlv, tlvCapBuff); _sriovSupported = pciCapabilitesTlv.sriov_support; _maxVfsPerPf = pciCapabilitesTlv.max_vfs_per_pf_valid ? pciCapabilitesTlv.max_vfs_per_pf : 0; _fppSupported = pciCapabilitesTlv.fpp_support; + _pfLogBarSizeSuppored = pciCapabilitesTlv.pf_bar_size_supported; + _vfLogBarSizeSuppored = pciCapabilitesTlv.vf_bar_size_supported; + _numPfMsixSupported = pciCapabilitesTlv.num_pf_msix_supported; + _numVfMsixSupported = pciCapabilitesTlv.num_vf_msix_supported; + _maxLogPfBarSize = pciCapabilitesTlv.log_max_pf_uar_bar_size1; + _maxLogVfBarSize = pciCapabilitesTlv.log_max_vf_uar_bar_size; + _maxTotalBarValid = pciCapabilitesTlv.max_total_bar_valid; + _maxTotalBar = pciCapabilitesTlv.max_total_bar; + _maxNumPfMsix = pciCapabilitesTlv.max_num_pf_msix; + _maxNumVfMsix = pciCapabilitesTlv.max_num_vf_msix; + _maxTotalMsixValid = pciCapabilitesTlv.max_total_msix_valid; + _maxTotalMsix = pciCapabilitesTlv.max_total_msix; + + u_int8_t tlvBuff[TOOLS_OPEN_PCI_CONFIGURATION_SIZE] = {0}; + struct tools_open_pci_configuration pciSettingsTlv; + memset(&pciSettingsTlv, 0, sizeof(pciSettingsTlv)); + + rc = mnvaCom5thGen(mf, &tlvBuff[0], TOOLS_OPEN_PCI_CONFIGURATION_SIZE, getPciSettingsTlvTypeBe(), REG_ACCESS_METHOD_GET, true); + + if (rc) { + if (rc == ME_REG_ACCESS_RES_NOT_AVLBL) { + return MCE_SUCCESS; + } + return errmsg("Failed to get PCI configuration: %s", m_err2str(rc)); + } + // unpack and update + tools_open_pci_configuration_unpack(&pciSettingsTlv, &tlvBuff[0]); + if (pciSettingsTlv.sriov_valid) { + _sriovEnDefault = pciSettingsTlv.sriov_en; + _numOfVfsDefault = pciSettingsTlv.total_vfs; + } + if (pciSettingsTlv.fpp_valid) { + _fppEnDefault = pciSettingsTlv.fpp_en; + } + if(pciSettingsTlv.pf_bar_size_valid) { + _pfLogBarSizeDefault = pciSettingsTlv.log_pf_uar_bar_size; + } + if(pciSettingsTlv.vf_bar_size_valid) { + _vfLogBarSizeDefault = pciSettingsTlv.log_vf_uar_bar_size; + } + if(pciSettingsTlv.num_pfs_msix_valid) { + _numPfMsixDefault = pciSettingsTlv.num_pf_msix; + } + if(pciSettingsTlv.num_vfs_msix_valid) { + _numVfMsixDefault = pciSettingsTlv.num_vf_msix; + } return MCE_SUCCESS; } @@ -1390,9 +1936,135 @@ bool PciParams5thGen::hardLimitCheck() return false; } } + + if (_pfLogBarSizeSuppored && _userSpecifiedPfLogBarSize) { + if (_pfLogBarSize > _maxLogPfBarSize) { + errmsg("Illegal PF_LOG_BAR_SIZE parameter value, Max allowed value is %d", _maxLogPfBarSize); + return false; + } + } + + if (_vfLogBarSizeSuppored && _userSpecifiedVfLogBarSize) { + if (_vfLogBarSize > _maxLogVfBarSize) { + errmsg("Illegal VF_LOG_BAR_SIZE parameter value, Max allowed value is %d", _maxLogVfBarSize); + return false; + } + } + + if(_numPfMsixSupported && _userSpecifiedNumPfMsix) { + if(_numPfMsix > _maxNumPfMsix) { + errmsg("Illegal NUM_PF_MSIX parameter value, Max allowed value is %d", _maxNumPfMsix); + return false; + } + } + + if(_numVfMsixSupported && _userSpecifiedNumVfMsix) { + if(_numVfMsix > _maxNumVfMsix) { + errmsg("Illegal NUM_VF_MSIX parameter value, Max allowed value is %d", _maxNumVfMsix); + return false; + } + } + + return true; +} + +//waiting for arch to correct the constraint formula +u_int32_t PciParams5thGen::calcNumOfVfs() +{ + if(_fppEn == 1){ + return (_maxTotalBar / _numOfPfs - (1 << _pfLogBarSize))/ (1 << _vfLogBarSize); + } else { + return (_maxTotalBar - (1 << _pfLogBarSize)) / (1 << _vfLogBarSize); + } +} + +u_int32_t PciParams5thGen::calcVfLogBarSize() +{ + if(_fppEn == 1){ + return static_cast(log2((_maxTotalBar / _numOfPfs - (1 << _pfLogBarSize)) / _numOfVfs)); + } else { + return static_cast(log2((_maxTotalBar - (1 << _pfLogBarSize)) / _numOfVfs)); + } +} + +u_int32_t PciParams5thGen::calcPfLogBarSize() +{ + if(_fppEn == 1){ + return static_cast(log2((_maxTotalBar / _numOfPfs - (1 << _vfLogBarSize) * _numOfVfs))); + } else { + return static_cast(log2((_maxTotalBar - (1 << _vfLogBarSize) * _numOfVfs))); + } +} + +u_int32_t PciParams5thGen::calcTotalBar() +{ + if(_fppEn == 1){ + return (_numOfPfs * ((1 << _pfLogBarSize) + (1 << _vfLogBarSize) * _numOfVfs)); + } else { + return ((1 << _pfLogBarSize) + (1 << _vfLogBarSize) * _numOfVfs); + } +} + +bool PciParams5thGen::softLimitCheck(mfile* mf) +{ + (void)mf; + if (_maxTotalBarValid == 1 && _maxTotalBar != 0 && _sriovEn == 1) { + if(_userSpecifiedSRIOV || _userSpecifiedPfLogBarSize || _userSpecifiedVfLogBarSize){ + if(_fppEn == 1){ + if(!_numOfPfsValid){ + errmsg("Cannot perform advanced calculations, cannot extract number of physical functions from Firmware."); + return false; + } + if(calcTotalBar() > _maxTotalBar) { + if(_userSpecifiedSRIOV) { + errmsg("Given the specified parameter: NUM_OF_VFS, the maximum allowed values is %d",calcNumOfVfs()); + } else if(_userSpecifiedVfLogBarSize) { + errmsg("Given the specified parameter: VF_Log_Bar_Size, the maximum allowed values is %d",calcVfLogBarSize()); + } else if(_userSpecifiedPfLogBarSize) { + errmsg("Given the specified parameter: PF_Log_Bar_Size, the maximum allowed values is %d",calcPfLogBarSize()); + } + return false; + } + } else { + if(calcTotalBar() > _maxTotalBar) { + if(_userSpecifiedSRIOV){ + errmsg("Given the specified parameter: NUM_OF_VFS, the maximum allowed values is %d",calcNumOfVfs()); + } else if(_userSpecifiedVfLogBarSize) { + errmsg("Given the specified parameter: VF_Log_Bar_Size, the maximum allowed values is %d",calcVfLogBarSize()); + } else if(_userSpecifiedPfLogBarSize) { + errmsg("Given the specified parameter: PF_Log_Bar_Size, the maximum allowed values is %d",calcPfLogBarSize()); + } + return false; + } + } + } + } + + if (_maxTotalMsixValid == 1) { + if (_userSpecifiedSRIOV || _userSpecifiedNumPfMsix || _userSpecifiedNumVfMsix) { + if (!_numOfPfsValid){ + errmsg("Cannot perform advanced calculations, cannot extract number of physical functions from Firmware."); + return false; + } + } + if ((_numOfPfs * (_numPfMsix + _numOfVfs * _numVfMsix)) > _maxTotalMsix){ + if(_userSpecifiedSRIOV){ + errmsg("Given the specified parameter: NUM_OF_VFS, the maximum allowed values is %d", + (((_maxTotalMsix / _numOfPfs) - _numPfMsix) / _numVfMsix)); + } else if(_userSpecifiedNumPfMsix){ + errmsg("Given the specified parameter: NUM_PF_MSIX, the maximum allowed values is %d", + ((_maxTotalMsix / _numOfPfs) - (_numOfVfs * _numVfMsix))); + } else if(_userSpecifiedNumVfMsix){ + errmsg("Given the specified parameter: NUM_VF_MSIX, the maximum allowed values is %d", + (((_maxTotalMsix / _numOfPfs) - _numPfMsix) /_numOfVfs)); + } + } + } + return true; } + /* * TptParams5thGen Class implementation: */ @@ -1442,6 +2114,15 @@ u_int32_t TptParams5thGen::getParam(mlxCfgParam paramType) return MLXCFG_UNKNOWN; } +u_int32_t TptParams5thGen::getDefaultParam(mlxCfgParam paramType) +{ + if (paramType == Mcp_Log_Tpt_Size) { + return _logMaxPayloadSizeDefault; + } + + return MLXCFG_UNKNOWN; +} + int TptParams5thGen::getFromDev(mfile* mf) { MError mRc; @@ -1464,6 +2145,7 @@ int TptParams5thGen::getFromDev(mfile* mf) // unpack and update tools_open_tpt_configuration_unpack(&tptSettingsTlv, &tlvBuff[0]); _logMaxPayloadSize = tptSettingsTlv.log_max_payload_size; + _updated = true; return MCE_SUCCESS; @@ -1504,22 +2186,45 @@ int TptParams5thGen::setOnDev(mfile* mf, bool ignoreCheck) int TptParams5thGen::getDefaultParams(mfile* mf) { - return getDefaultsAndCapabilities(mf); + int rc = getDefaultsAndCapabilities(mf); + setParams(_logMaxPayloadSizeDefault); + return rc; +} + +void TptParams5thGen::setParams(u_int32_t logMaxPayloadSize) +{ + _logMaxPayloadSize = logMaxPayloadSize; } int TptParams5thGen::getDefaultsAndCapabilities(mfile* mf) { MError rc; - u_int8_t tlvBuff[TOOLS_OPEN_TPT_CAPABILITIES_SIZE] = {0}; + u_int8_t tlvCapBuff[TOOLS_OPEN_TPT_CAPABILITIES_SIZE] = {0}; struct tools_open_tpt_capabilities tptCapabilitesTlv; memset(&tptCapabilitesTlv, 0, sizeof(tptCapabilitesTlv)); - rc = mnvaCom5thGen(mf, &tlvBuff[0], TOOLS_OPEN_TPT_CAPABILITIES_SIZE, getTptCapabilitiesTlvTypeBe(), REG_ACCESS_METHOD_GET); + rc = mnvaCom5thGen(mf, &tlvCapBuff[0], TOOLS_OPEN_TPT_CAPABILITIES_SIZE, getTptCapabilitiesTlvTypeBe(), REG_ACCESS_METHOD_GET); if (rc) { return errmsg("Failed to get TPT capabilities parameter. %s", m_err2str(rc)); } - tools_open_tpt_capabilities_unpack(&tptCapabilitesTlv, tlvBuff); + tools_open_tpt_capabilities_unpack(&tptCapabilitesTlv, tlvCapBuff); _logMaxPayloadSizeSupported = tptCapabilitesTlv.log_max_payload_size_supported; + u_int8_t tlvBuff[TOOLS_OPEN_TPT_CONFIGURATION_SIZE] = {0}; + struct tools_open_tpt_configuration tptSettingsTlv; + memset(&tptSettingsTlv, 0, sizeof(tptSettingsTlv)); + + rc = mnvaCom5thGen(mf, &tlvBuff[0], TOOLS_OPEN_TPT_CONFIGURATION_SIZE, getTptSettingsTlvTypeBe(), REG_ACCESS_METHOD_GET, true); + + if (rc) { + if (rc == ME_REG_ACCESS_RES_NOT_AVLBL) { + return MCE_SUCCESS; + } + return errmsg("Failed to get TPT default configuration: %s", m_err2str(rc)); + } + // unpack and update + tools_open_tpt_configuration_unpack(&tptSettingsTlv, &tlvBuff[0]); + _logMaxPayloadSizeDefault = tptSettingsTlv.log_max_payload_size; + return MCE_SUCCESS; } @@ -1585,6 +2290,15 @@ u_int32_t InfinibandBootSettingsParams4thGen::getParam(mlxCfgParam paramType) return MLXCFG_UNKNOWN; } +u_int32_t InfinibandBootSettingsParams4thGen::getDefaultParam(mlxCfgParam paramType) +{ + if ((paramType == Mcp_Boot_Pkey_P1 && _port == 1) || (paramType == Mcp_Boot_Pkey_P2 && _port == 2)) { + return _bootPkeyDefault; + } + return MLXCFG_UNKNOWN; +} + + int InfinibandBootSettingsParams4thGen::getFromDev(mfile* mf) { MError mRc; @@ -1644,13 +2358,19 @@ int InfinibandBootSettingsParams4thGen::getDefaultParams(mfile* mf) int rc; rc = getDefaultParams4thGen(mf, _port, &portParams); if (rc == MCE_SUCCESS) { - _bootPkey = portParams.default_boot_pkey; + _bootPkeyDefault = portParams.default_boot_pkey; + setParams(_bootPkeyDefault); } else { rc = MCE_GET_DEFAULT_PARAMS; } return rc; } +void InfinibandBootSettingsParams4thGen::setParams(u_int32_t bootPkey) +{ + _bootPkey = bootPkey; +} + bool InfinibandBootSettingsParams4thGen::hardLimitCheck() { if (_bootPkey >= (1 << 16)) { @@ -1711,6 +2431,30 @@ u_int32_t IBDCParams5thGen::getParam(mlxCfgParam paramType) return MLXCFG_UNKNOWN; } +u_int32_t IBDCParams5thGen::getDefaultParam(mlxCfgParam paramType) +{ + if (paramType == Mcp_Log_Dcr_Hash_Table_Size) { + return _logDcrHashTableSizeDefault; + } + if (paramType == Mcp_Dcr_Lifo_Size) { + return _dcrLifoSizeDefault; + } + + return MLXCFG_UNKNOWN; +} + +void IBDCParams5thGen::setParams(u_int32_t logDcrHashTableSize, u_int32_t dcrLifoSize) +{ + _logDcrHashTableSize = logDcrHashTableSize; + _dcrLifoSize = dcrLifoSize; +} + +void IBDCParams5thGen::updateClassAttrFromDefaultParams() +{ + setParams(_logDcrHashTableSizeDefault, + _dcrLifoSizeDefault); +} + int IBDCParams5thGen::getFromDev(mfile* mf) { GET_FROM_DEV_5TH_GEN(mf, tools_open_infiniband_dc_settings, "IB Dynamically Connected"); @@ -1729,19 +2473,20 @@ int IBDCParams5thGen::getDefaultParams(mfile* mf) int IBDCParams5thGen::getDefaultsAndCapabilities(mfile* mf) { MError rc; - u_int8_t tlvBuff[TOOLS_OPEN_INFINIBAND_DC_CAPABILITIES_SIZE] = {0}; + u_int8_t tlvCapBuff[TOOLS_OPEN_INFINIBAND_DC_CAPABILITIES_SIZE] = {0}; struct tools_open_infiniband_dc_capabilities dcCapabilitesTlv; memset(&dcCapabilitesTlv, 0, sizeof(dcCapabilitesTlv)); - rc = mnvaCom5thGen(mf, &tlvBuff[0], TOOLS_OPEN_INFINIBAND_DC_CAPABILITIES_SIZE, getDcCapabilitiesTlvTypeBe(), REG_ACCESS_METHOD_GET); + rc = mnvaCom5thGen(mf, &tlvCapBuff[0], TOOLS_OPEN_INFINIBAND_DC_CAPABILITIES_SIZE, getDcCapabilitiesTlvTypeBe(), REG_ACCESS_METHOD_GET); if (rc) { return errmsg("Failed to get Infiniband DC capabilities parameter. %s", m_err2str(rc)); } - tools_open_infiniband_dc_capabilities_unpack(&dcCapabilitesTlv, tlvBuff); + tools_open_infiniband_dc_capabilities_unpack(&dcCapabilitesTlv, tlvCapBuff); _minLogDcrHashTableSize = dcCapabilitesTlv.min_log_dcr_hash_table_size; _maxLogDcrHashTableSize = dcCapabilitesTlv.max_log_dcr_hash_table_size; _minDcrLifoSize = dcCapabilitesTlv.min_dcr_lifo_size; _maxDcrLifoSize = dcCapabilitesTlv.max_dcr_lifo_size; - return MCE_SUCCESS; + + GET_DEFAULT_5TH_GEN(mf, tools_open_infiniband_dc_settings, "IB Dynamically Connected"); } u_int32_t IBDCParams5thGen::getTlvTypeBe() @@ -1795,89 +2540,11 @@ void IBDCParams5thGen::updateClassAttrFromTlv(void* tlv) return; } -/* - * PortBootStateParams5thGen Class implementation - */ - -bool PortBootStateParams5thGen::cfgSupported(mfile* mf, mlxCfgParam param) -{ - MError rc; - (void)param; - bool suppRead, suppWrite; - rc = nvqcCom5thGen(mf, getTlvTypeBe(), suppRead, suppWrite); - if (rc) { - errmsg("Failed to get port boot state parameter capabilities. %s", m_err2str(rc)); - return false; - } - if (!suppRead || !suppWrite) { - return false; - } - return true; -} - -void PortBootStateParams5thGen::setParam(mlxCfgParam paramType, u_int32_t val) -{ - if ((paramType == Mcp_Boot_State_P1 && _port == 1) || (paramType == Mcp_Boot_State_P2 && _port == 2)) { - _portBootState = val; - } - return; -} - -u_int32_t PortBootStateParams5thGen::getParam(mlxCfgParam paramType) -{ - if ((paramType == Mcp_Boot_State_P1 && _port == 1) || (paramType == Mcp_Boot_State_P2 && _port == 2)) { - return _portBootState; - } - return MLXCFG_UNKNOWN; -} - -int PortBootStateParams5thGen::getFromDev(mfile* mf) -{ - GET_FROM_DEV_5TH_GEN(mf, tools_open_port_boot_state, "Port Boot State"); -} - -int PortBootStateParams5thGen::setOnDev(mfile* mf, bool ignoreCheck) -{ - SET_ON_DEV_5TH_GEN(mf, ignoreCheck, tools_open_port_boot_state, "Port Boot State"); -} - -int PortBootStateParams5thGen::getDefaultParams(mfile* mf) +void IBDCParams5thGen::updateClassDefaultAttrFromTlv(void* tlv) { - return getFromDev(mf); -} - -bool PortBootStateParams5thGen::hardLimitCheck() -{ - if (_portBootState > 3) { - errmsg("Illegal BOOT_STATE_P%d parameter value (0=Normal Operation, 1=SFP power off, 2=SERDES power off, 3=Admin linkdown)", _port); - return false; - } - return true; -} - -u_int32_t PortBootStateParams5thGen::getTlvTypeBe() -{ - struct tools_open_per_port_type type; - u_int32_t tlvType = 0; - - type.param_class = CLASS_PHYS_PORT; - type.param_idx = tlvTypeIdx; - type.port = _port; - tools_open_per_port_type_pack(&type, (u_int8_t*)&tlvType); - return tlvType; -} - -void PortBootStateParams5thGen::updateTlvFromClassAttr(void* tlv) -{ - struct tools_open_port_boot_state* portBootStateTlv = (struct tools_open_port_boot_state*)tlv; - portBootStateTlv->port_boot_state = _portBootState; - return; -} - -void PortBootStateParams5thGen::updateClassAttrFromTlv(void* tlv) -{ - struct tools_open_port_boot_state* portBootStateTlv = (struct tools_open_port_boot_state*)tlv; - _portBootState = portBootStateTlv->port_boot_state; + struct tools_open_infiniband_dc_settings* ibDcTlv = (struct tools_open_infiniband_dc_settings*)tlv; + _dcrLifoSizeDefault = ibDcTlv->dcr_lifo_size; + _logDcrHashTableSizeDefault = ibDcTlv->log_dcr_hash_table_size; return; } @@ -1918,6 +2585,24 @@ u_int32_t RoCENextProtocolParams5thGen::getParam(mlxCfgParam paramType) return MLXCFG_UNKNOWN; } +u_int32_t RoCENextProtocolParams5thGen::getDefaultParam(mlxCfgParam paramType) +{ + if ( paramType == Mcp_RoCE_Next_Protocol) { + return _nextProtocolDefault; + } + return MLXCFG_UNKNOWN; +} + +void RoCENextProtocolParams5thGen::setParams(u_int32_t nextProtocol) +{ + _nextProtocol = nextProtocol; +} + +void RoCENextProtocolParams5thGen::updateClassAttrFromDefaultParams() +{ + setParams(_nextProtocolDefault); +} + int RoCENextProtocolParams5thGen::getFromDev(mfile* mf) { GET_FROM_DEV_5TH_GEN(mf, tools_open_roce_v_1_5_next_protocol, "RoCE Next Protocol"); @@ -1930,7 +2615,7 @@ int RoCENextProtocolParams5thGen::setOnDev(mfile* mf, bool ignoreCheck) int RoCENextProtocolParams5thGen::getDefaultParams(mfile* mf) { - return getFromDev(mf); + GET_DEFAULT_5TH_GEN(mf, tools_open_roce_v_1_5_next_protocol, "RoCE Next Protocol"); } bool RoCENextProtocolParams5thGen::hardLimitCheck() @@ -1967,6 +2652,13 @@ void RoCENextProtocolParams5thGen::updateClassAttrFromTlv(void* tlv) return; } +void RoCENextProtocolParams5thGen::updateClassDefaultAttrFromTlv(void* tlv) +{ + struct tools_open_roce_v_1_5_next_protocol* roceNpTlv = (struct tools_open_roce_v_1_5_next_protocol*)tlv; + _nextProtocolDefault = roceNpTlv->roce_over_ip_next_protocol; + return; +} + /* * RoCECCParams5thGen Class implementation */ @@ -2010,6 +2702,30 @@ u_int32_t RoCECCParams5thGen::getParam(mlxCfgParam paramType) return MLXCFG_UNKNOWN; } +u_int32_t RoCECCParams5thGen::getDefaultParam(mlxCfgParam paramType) +{ + if ( (paramType == Mcp_RoCE_CC_Algorithm_P1 && _port == 1) || (paramType == Mcp_RoCE_CC_Algorithm_P2 && _port == 2)) { + return _roceCcAlgorithmDefault; + } + if ( (paramType == Mcp_RoCE_CC_Prio_Mask_P1 && _port == 1) || (paramType == Mcp_RoCE_CC_Prio_Mask_P2 && _port == 2)) { + return _roceCcPrioMaskDefault; + } + return MLXCFG_UNKNOWN; +} + +void RoCECCParams5thGen::setParams(u_int32_t roceCcAlgorithm, u_int32_t roceCcPrioMask) +{ + _roceCcAlgorithm = roceCcAlgorithm; + _roceCcPrioMask = roceCcPrioMask; +} + +void RoCECCParams5thGen::updateClassAttrFromDefaultParams() +{ + setParams( + _roceCcAlgorithmDefault, + _roceCcPrioMaskDefault); +} + int RoCECCParams5thGen::getFromDev(mfile* mf) { GET_FROM_DEV_5TH_GEN(mf, tools_open_roce_cc, "RoCE CC"); @@ -2021,7 +2737,7 @@ int RoCECCParams5thGen::setOnDev(mfile* mf, bool ignoreCheck) } int RoCECCParams5thGen::getDefaultParams(mfile* mf) { - return getFromDev(mf); + GET_DEFAULT_5TH_GEN(mf, tools_open_roce_cc, "RoCE CC"); } bool RoCECCParams5thGen::hardLimitCheck() @@ -2064,6 +2780,14 @@ void RoCECCParams5thGen::updateClassAttrFromTlv(void* tlv) return; } +void RoCECCParams5thGen::updateClassDefaultAttrFromTlv(void* tlv) +{ + struct tools_open_roce_cc* roceCcTlv = (struct tools_open_roce_cc*)tlv; + _roceCcAlgorithmDefault = roceCcTlv->roce_cc_algorithm; + _roceCcPrioMaskDefault = roceCcTlv->roce_cc_enable_priority; + return; +} + /* * RoCECCEcnParams5thGen Class implementation */ @@ -2309,6 +3033,147 @@ u_int32_t RoCECCEcnParams5thGen::getParam(mlxCfgParam paramType) return MLXCFG_UNKNOWN; } +u_int32_t RoCECCEcnParams5thGen::getDefaultParam(mlxCfgParam paramType) +{ + // adrianc: consider moving to MAP on large scale TLVs + if (_port == 1) { + switch (paramType) { + case Mcp_Clamp_Tgt_Rate_P1: + return _clampTgtRateDefault; + case Mcp_Clamp_Tgt_Rate_After_Time_Inc_P1: + return _clampTgtRateAfterTimeIncDefault; + case Mcp_Rpg_Time_Reset_P1: + return _rpgTimeResetDefault; + case Mcp_Rpg_Byte_Reset_P1: + return _rpgByteResetDefault; + case Mcp_Rpg_Threshold_P1: + return _rpgThresholdDefault; + case Mcp_Rpg_Max_Rate_P1: + return _rpgMaxRateDefault; + case Mcp_Rpg_Ai_Rate_P1: + return _rpgAiRateDefault; + case Mcp_Rpg_Hai_Rate_P1: + return _rpgHaiRateDefault; + case Mcp_Rpg_Gd_P1: + return _rpgGdDefault; + case Mcp_Rpg_Min_Dec_Fac_P1: + return _rpgMinDecFacDefault; + case Mcp_Rpg_Min_Rate_P1: + return _rpgMinRateDefault; + case Mcp_Rate_To_Set_On_First_Cnp_P1: + return _rateToSetOnFirstCnpDefault; + case Mcp_Dce_Tcp_G_P1: + return _dceTcpGDefault; + case Mcp_Dce_Tcp_Rtt_P1: + return _dceTcpRttDefault; + case Mcp_Rate_Reduce_Monitor_Period_P1: + return _rateReduceMonitorPeriodDefault; + case Mcp_Initial_Alpha_Value_P1: + return _initialAlphaValueDefault; + case Mcp_Min_Time_Between_Cnps_P1: + return _minTimeBetweenCnpsDefault; + case Mcp_Cnp_Dscp_P1: + return _cnpDscpDefault; + case Mcp_Cnp_802p_Prio_P1: + return _cnp802pPrioDefault; + default: + break; + } + } else if (_port == 2) { + switch (paramType) { + case Mcp_Clamp_Tgt_Rate_P2: + return _clampTgtRateDefault; + case Mcp_Clamp_Tgt_Rate_After_Time_Inc_P2: + return _clampTgtRateAfterTimeIncDefault; + case Mcp_Rpg_Time_Reset_P2: + return _rpgTimeResetDefault; + case Mcp_Rpg_Byte_Reset_P2: + return _rpgByteResetDefault; + case Mcp_Rpg_Threshold_P2: + return _rpgThresholdDefault; + case Mcp_Rpg_Max_Rate_P2: + return _rpgMaxRateDefault; + case Mcp_Rpg_Ai_Rate_P2: + return _rpgAiRateDefault; + case Mcp_Rpg_Hai_Rate_P2: + return _rpgHaiRateDefault; + case Mcp_Rpg_Gd_P2: + return _rpgGdDefault; + case Mcp_Rpg_Min_Dec_Fac_P2: + return _rpgMinDecFacDefault; + case Mcp_Rpg_Min_Rate_P2: + return _rpgMinRateDefault; + case Mcp_Rate_To_Set_On_First_Cnp_P2: + return _rateToSetOnFirstCnpDefault; + case Mcp_Dce_Tcp_G_P2: + return _dceTcpGDefault; + case Mcp_Dce_Tcp_Rtt_P2: + return _dceTcpRttDefault; + case Mcp_Rate_Reduce_Monitor_Period_P2: + return _rateReduceMonitorPeriodDefault; + case Mcp_Initial_Alpha_Value_P2: + return _initialAlphaValueDefault; + case Mcp_Min_Time_Between_Cnps_P2: + return _minTimeBetweenCnpsDefault; + case Mcp_Cnp_Dscp_P2: + return _cnpDscpDefault; + case Mcp_Cnp_802p_Prio_P2: + return _cnp802pPrioDefault; + default: + break; + } + } + return MLXCFG_UNKNOWN; +} + +void RoCECCEcnParams5thGen::setParams(u_int32_t clampTgtRate, u_int32_t clampTgtRateAfterTimeInc, u_int32_t rpgTimeReset, u_int32_t rpgByteReset, + u_int32_t rpgThreshold, u_int32_t rpgMaxRate, u_int32_t rpgAiRate, u_int32_t rpgHaiRate, + u_int32_t rpgGd, u_int32_t rpgMinDecFac, u_int32_t rpgMinRate, u_int32_t rateToSetOnFirstCnp, + u_int32_t dceTcpG, u_int32_t dceTcpRtt, u_int32_t rateReduceMonitorPeriod, u_int32_t initialAlphaValue, + u_int32_t minTimeBetweenCnps, u_int32_t cnpDscp, u_int32_t cnp802pPrio){ + _clampTgtRate = clampTgtRate; + _clampTgtRateAfterTimeInc = clampTgtRateAfterTimeInc; + _rpgTimeReset = rpgTimeReset; + _rpgByteReset = rpgByteReset; + _rpgThreshold = rpgThreshold; + _rpgMaxRate = rpgMaxRate; + _rpgAiRate = rpgAiRate; + _rpgHaiRate = rpgHaiRate; + _rpgGd = rpgGd; + _rpgMinDecFac = rpgMinDecFac; + _rpgMinRate = rpgMinRate; + _rateToSetOnFirstCnp = rateToSetOnFirstCnp; + _dceTcpG = dceTcpG; + _dceTcpRtt = dceTcpRtt; + _rateReduceMonitorPeriod = rateReduceMonitorPeriod; + _initialAlphaValue = initialAlphaValue; + _minTimeBetweenCnps = minTimeBetweenCnps; + _cnpDscp = cnpDscp; + _cnp802pPrio = cnp802pPrio; +} + +void RoCECCEcnParams5thGen::updateClassAttrFromDefaultParams() +{ + setParams(_clampTgtRateDefault,_clampTgtRateAfterTimeIncDefault, + _rpgTimeResetDefault, + _rpgByteResetDefault, + _rpgThresholdDefault, + _rpgMaxRateDefault, + _rpgAiRateDefault, + _rpgHaiRateDefault, + _rpgGdDefault, + _rpgMinDecFacDefault, + _rpgMinRateDefault, + _rateToSetOnFirstCnpDefault, + _dceTcpGDefault, + _dceTcpRttDefault, + _rateReduceMonitorPeriodDefault, + _initialAlphaValueDefault, + _minTimeBetweenCnpsDefault, + _cnpDscpDefault, + _cnp802pPrioDefault); +} + int RoCECCEcnParams5thGen::getFromDev(mfile* mf) { GET_FROM_DEV_5TH_GEN(mf, tools_open_roce_cc_ecn, "RoCE CC ECN"); @@ -2320,7 +3185,7 @@ int RoCECCEcnParams5thGen::setOnDev(mfile* mf, bool ignoreCheck) } int RoCECCEcnParams5thGen::getDefaultParams(mfile* mf) { - return getFromDev(mf); + GET_DEFAULT_5TH_GEN(mf, tools_open_roce_cc_ecn, "RoCE CC ECN"); } u_int32_t _dceTcpG; @@ -2487,6 +3352,30 @@ void RoCECCEcnParams5thGen::updateClassAttrFromTlv(void* tlv) return; } +void RoCECCEcnParams5thGen::updateClassDefaultAttrFromTlv(void* tlv) +{ + struct tools_open_roce_cc_ecn* roceCcEcnTlv = (struct tools_open_roce_cc_ecn*)tlv; + _clampTgtRateDefault = roceCcEcnTlv->clamp_tgt_rate; + _clampTgtRateAfterTimeIncDefault = roceCcEcnTlv->clamp_tgt_rate_after_time_inc; + _cnp802pPrioDefault = roceCcEcnTlv->cnp_802p_prio; + _cnpDscpDefault = roceCcEcnTlv->cnp_dscp; + _dceTcpGDefault = roceCcEcnTlv->dce_tcp_g; + _dceTcpRttDefault = roceCcEcnTlv->dce_tcp_rtt; + _initialAlphaValueDefault = roceCcEcnTlv->initial_alpha_value; + _minTimeBetweenCnpsDefault = roceCcEcnTlv->min_time_between_cnps; + _rateReduceMonitorPeriodDefault = roceCcEcnTlv->rate_reduce_monitor_period; + _rateToSetOnFirstCnpDefault = roceCcEcnTlv->rate_to_set_on_first_cnp; + _rpgAiRateDefault = roceCcEcnTlv->rpg_ai_rate; + _rpgByteResetDefault = roceCcEcnTlv->rpg_byte_reset; + _rpgGdDefault = roceCcEcnTlv->rpg_gd; + _rpgHaiRateDefault = roceCcEcnTlv->rpg_hai_rate; + _rpgMaxRateDefault = roceCcEcnTlv->rpg_max_rate; + _rpgMinDecFacDefault = roceCcEcnTlv->rpg_min_dec_fac; + _rpgMinRateDefault = roceCcEcnTlv->rpg_min_rate; + _rpgThresholdDefault = roceCcEcnTlv->rpg_threshold; + _rpgTimeResetDefault = roceCcEcnTlv->rpg_time_reset; + return; +} /* * PrebootBootSettingsParams4thGen Class implementation: @@ -2552,6 +3441,47 @@ u_int32_t PrebootBootSettingsParams4thGen::getParam(mlxCfgParam paramType) return MLXCFG_UNKNOWN; } +u_int32_t PrebootBootSettingsParams4thGen::getDefaultParam(mlxCfgParam paramType) +{ + if ((paramType == Mcp_Boot_Option_Rom_En_P1 && _port == 1) || (paramType == Mcp_Boot_Option_Rom_En_P2 && _port == 2)) { + return _bootOptionRomEnDefault; + } + + if ((paramType == Mcp_Boot_Vlan_En_P1 && _port == 1) || (paramType == Mcp_Boot_Vlan_En_P2 && _port == 2)) { + return _bootVlanEnDefault; + } + + if ((paramType == Mcp_Boot_Retry_Cnt_P1 && _port == 1) || (paramType == Mcp_Boot_Retry_Cnt_P2 && _port == 2)) { + return _bootRetryCntDefault; + } + + if ((paramType == Mcp_Legacy_Boot_Protocol_P1 && _port == 1) || (paramType == Mcp_Legacy_Boot_Protocol_P2 && _port == 2)) { + return _legacyBootProtocolDefault; + } + + if ((paramType == Mcp_Boot_Vlan_P1 && _port == 1) || (paramType == Mcp_Boot_Vlan_P2 && _port == 2)) { + return _bootVlanDefault; + } + + return MLXCFG_UNKNOWN; +} + +void PrebootBootSettingsParams4thGen::setParams(u_int32_t bootOptionRomEn, u_int32_t bootVlanEn, u_int32_t bootRetryCnt, + u_int32_t legacyBootProtocol, u_int32_t bootVlan) +{ + _bootOptionRomEn = bootOptionRomEn; + _bootVlanEn = bootVlanEn; + _bootRetryCnt = bootRetryCnt; + _legacyBootProtocol = legacyBootProtocol; + _bootVlan = bootVlan; +} + +void PrebootBootSettingsParams4thGen::updateClassAttrFromDefaultParams() +{ + setParams(_bootOptionRomEnDefault, _bootVlanEnDefault, _bootRetryCntDefault, + _legacyBootProtocolDefault, _bootVlanDefault); +} + int PrebootBootSettingsParams4thGen::getFromDev(mfile* mf) { GET_FROM_DEV_4TH_GEN(mf, tools_open_preboot_boot_settings, "Preboot Boot Settings", _port); @@ -2584,17 +3514,28 @@ void PrebootBootSettingsParams4thGen::updateClassAttrFromTlv(void* tlv) _bootVlan = prebootTlv->boot_vlan; } +void PrebootBootSettingsParams4thGen::updateClassDefaultAttrFromTlv(void* tlv) +{ + struct tools_open_preboot_boot_settings* prebootTlv = (struct tools_open_preboot_boot_settings*)tlv; + _bootOptionRomEnDefault = prebootTlv->boot_option_rom_en; + _bootVlanEnDefault = prebootTlv->boot_vlan_en; + _bootRetryCntDefault = prebootTlv->boot_retry_count; + _legacyBootProtocolDefault = prebootTlv->legacy_boot_protocol; + _bootVlanDefault = prebootTlv->boot_vlan; +} + int PrebootBootSettingsParams4thGen::getDefaultParams(mfile* mf) { struct tools_open_query_def_params_per_port portParams; int rc; rc = getDefaultParams4thGen(mf, _port, &portParams); if (rc == MCE_SUCCESS) { - _bootOptionRomEn = portParams.default_boot_option_rom_en; - _bootVlanEn = portParams.default_boot_vlan_en; - _bootRetryCnt = portParams.default_boot_retry_cnt; - _legacyBootProtocol = portParams.default_boot_protocol; - _bootVlan = portParams.default_boot_vlan; + _bootOptionRomEnDefault = portParams.default_boot_option_rom_en; + _bootVlanEnDefault = portParams.default_boot_vlan_en; + _bootRetryCntDefault = portParams.default_boot_retry_cnt; + _legacyBootProtocolDefault = portParams.default_boot_protocol; + _bootVlanDefault = portParams.default_boot_vlan; + updateClassAttrFromDefaultParams(); } else { rc = MCE_GET_DEFAULT_PARAMS; } @@ -2625,3 +3566,134 @@ bool PrebootBootSettingsParams4thGen::hardLimitCheck() } return true; } + +/* + * ExternalPort5thGen Class implementation + */ + + +bool ExternalPort5thGen::cfgSupported(mfile* mf, mlxCfgParam param) +{ + MError rc; + (void)param; + bool suppRead, suppWrite; + rc = nvqcCom5thGen(mf, getTlvTypeBe(), suppRead, suppWrite); + if (rc) { + errmsg("Failed to get External Port parameter capabilities. %s", m_err2str(rc)); + return false; + } + if (!suppRead || !suppWrite) { + return false; + } + return true; +} + +void ExternalPort5thGen::setParam(mlxCfgParam paramType, u_int32_t val) +{ + if (paramType == Mcp_Port_Owner) { + _portOwner = val; + } + if (paramType == Mcp_Allow_Rd_Counters) { + _allowRdCounters = val; + } + return; +} + +u_int32_t ExternalPort5thGen::getParam(mlxCfgParam paramType) +{ + if (paramType == Mcp_Port_Owner) { + return _portOwner; + } + if (paramType == Mcp_Allow_Rd_Counters) { + return _allowRdCounters; + } + return MLXCFG_UNKNOWN; +} + +u_int32_t ExternalPort5thGen::getDefaultParam(mlxCfgParam paramType) +{ + if (paramType == Mcp_Port_Owner) { + return _portOwnerDefault; + } + if (paramType == Mcp_Allow_Rd_Counters) { + return _allowRdCountersDefault; + } + return MLXCFG_UNKNOWN; +} + +void ExternalPort5thGen::setParams(u_int32_t portOwner, u_int32_t allowRdCounters) +{ + _portOwner = portOwner; + _allowRdCounters = allowRdCounters; +} + +void ExternalPort5thGen::updateClassAttrFromDefaultParams() +{ + setParams( + _portOwnerDefault, + _allowRdCounters); +} + +int ExternalPort5thGen::getFromDev(mfile* mf) +{ + GET_FROM_DEV_5TH_GEN(mf, tools_open_external_port, "External Port"); +} + +int ExternalPort5thGen::setOnDev(mfile* mf, bool ignoreCheck) +{ + SET_ON_DEV_5TH_GEN(mf, ignoreCheck, tools_open_external_port, "External Port"); +} +int ExternalPort5thGen::getDefaultParams(mfile* mf) +{ + GET_DEFAULT_5TH_GEN(mf, tools_open_external_port, "External Port"); +} + +bool ExternalPort5thGen::hardLimitCheck() +{ + if (_portOwner > 1) { + errmsg("Illegal PORT_OWNER parameter value(%d), value should be 0 or 1", _portOwner); + return false; + } + if (_allowRdCounters > 1) { + errmsg("Illegal ALLOW_RD_COUNTERS parameter value(%d), value should be 0 or 1", _allowRdCounters); + return false; + } + return true; +} + +u_int32_t ExternalPort5thGen::getTlvTypeBe() +{ + struct tools_open_per_host_type type; + u_int32_t tlvType = 0; + type.param_class = CLASS_PER_HOST; + type.param_idx = tlvTypeIdx; + type.function = 0; + type.host = 0; + tools_open_per_host_type_pack(&type, (u_int8_t*)&tlvType); + return tlvType; +} + +void ExternalPort5thGen::updateTlvFromClassAttr(void* tlv) +{ + struct tools_open_external_port* externalPortTlv = (struct tools_open_external_port*)tlv; + externalPortTlv->port_owner = _portOwner; + externalPortTlv->allow_rd_counters = _allowRdCounters; + return; +} + +void ExternalPort5thGen::updateClassAttrFromTlv(void* tlv) +{ + struct tools_open_external_port* externalPortTlv = (struct tools_open_external_port*)tlv; + _portOwner = externalPortTlv->port_owner; + _allowRdCounters = externalPortTlv->allow_rd_counters; + return; +} + +void ExternalPort5thGen::updateClassDefaultAttrFromTlv(void* tlv) +{ + struct tools_open_external_port* externalPortTlv = (struct tools_open_external_port*)tlv; + _portOwnerDefault = externalPortTlv->port_owner; + _allowRdCountersDefault = externalPortTlv->allow_rd_counters; + return; +} + diff --git a/mlxconfig/mlxcfg_param_lib.h b/mlxconfig/mlxcfg_param_lib.h index 3c1257b..dbc87bc 100644 --- a/mlxconfig/mlxcfg_param_lib.h +++ b/mlxconfig/mlxcfg_param_lib.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -28,8 +29,6 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - * Version: $Id$ - * */ #ifndef MLXCFG_PARAM_LIB_H_ @@ -62,7 +61,10 @@ #define ROCE_CC_ECN_TYPE 0x108 #define LLDP_NB_SETTINGS_TYPE 0x10a #define LLDP_NB_CAPABILITIES_TYPE 0x10b - +#define EXTERNAL_PORT 0x192 +#define BOOT_SETTINGS_EXTRAS_GEN4 0x2001 +#define BOOT_SETTINGS_EXTRAS_GEN5 0x195 +#define BOOT_SETTINGS_EXTRAS_GEN5_CAP 0x101 typedef enum { // SRIOV Mct_Sriov = 0, @@ -85,9 +87,6 @@ typedef enum { Mct_Boot_Settings_P2, // IB dynamically connected (5th gen) Mct_Dc, - // Port Boot State (5th gen) - Mct_Boot_State_P1, - Mct_Boot_State_P2, // RoCE v1.5 next protocol (5th gen) Mct_RoCE_Next_Protocol, // RoCE congestion control (5th gen) @@ -99,6 +98,11 @@ typedef enum { // Preboot Boot Settings (4th Gen) Mct_Preboot_Boot_Settings_P1, Mct_Preboot_Boot_Settings_P2, + Mct_External_Port, + //TODO: Boot Settings Extras + Mct_Boot_Settings_Extras_5thGen, + Mct_Boot_Settings_Extras_4thGen_P1, + Mct_Boot_Settings_Extras_4thGen_P2, Mct_Last } mlxCfgType; @@ -107,6 +111,10 @@ typedef enum { Mcp_Sriov_En = 0, Mcp_Num_Of_Vfs, Mcp_Fpp_En, + Mcp_PF_Log_Bar_Size, + Mcp_VF_Log_Bar_Size, + Mcp_Num_Pf_Msix, + Mcp_Num_Vf_Msix, // Wake On LAN 4th Gen Port 1 Mcp_Wol_Magic_En_P1, // Wake On LAN 4th Gen Port 2 @@ -128,10 +136,6 @@ typedef enum { // IB Dynamically connected Mcp_Log_Dcr_Hash_Table_Size, Mcp_Dcr_Lifo_Size, - // Port Boot state Port 1 - Mcp_Boot_State_P1, - // Port Boot state Port 2 - Mcp_Boot_State_P2, // RoCE v1.5 Next protocol Mcp_RoCE_Next_Protocol, // RoCE Congestion Control Parameters Port 1 @@ -192,6 +196,13 @@ typedef enum { Mcp_Boot_Retry_Cnt_P2, Mcp_Legacy_Boot_Protocol_P2, Mcp_Boot_Vlan_P2, + //External port + Mcp_Port_Owner, + Mcp_Allow_Rd_Counters, + //Boot Settings Ext + Mcp_Boot_Settings_Ext_IP_Ver, + Mcp_Boot_Settings_Ext_IP_Ver_P1, + Mcp_Boot_Settings_Ext_IP_Ver_P2, Mcp_Last } mlxCfgParam; @@ -208,7 +219,7 @@ typedef std::pair cfgInfo; class RawCfgParams5thGen : public ErrMsg { public: - RawCfgParams5thGen(){} + RawCfgParams5thGen(); ~RawCfgParams5thGen() {} int setRawData(const std::vector& tlvBuff); int setOnDev(mfile* mf); @@ -231,6 +242,7 @@ public: virtual void setParam(mlxCfgParam paramType, u_int32_t val) = 0; virtual u_int32_t getParam(mlxCfgParam paramType) = 0; + virtual u_int32_t getDefaultParam(mlxCfgParam paramType) = 0; virtual int getDefaultAndFromDev(mfile* mf); virtual int getFromDev(mfile* mf) = 0; @@ -254,6 +266,7 @@ protected: virtual void updateTlvFromClassAttr(void* tlv) {(void)tlv; throw std::logic_error("Function Not Implemented");} virtual void updateClassAttrFromTlv(void* tlv) {(void)tlv; throw std::logic_error("Function Not Implemented");} + virtual void updateClassDefaultAttrFromTlv(void* tlv) {(void)tlv; throw std::logic_error("Function Not Implemented");} u_int64_t _devCapVec; // relevant for 4th gen devices bool _updated; // set true on get and false on set @@ -265,43 +278,106 @@ protected: * SRIOV param classes: */ -class SriovParams : public CfgParams +class SriovParams4thGen : public CfgParams { public: - SriovParams() : CfgParams(Mct_Sriov, SRIOV_TYPE) , _sriovEn(MLXCFG_UNKNOWN), _numOfVfs(MLXCFG_UNKNOWN), _maxVfs(1) {} - ~SriovParams() {}; + SriovParams4thGen() : CfgParams(Mct_Sriov, SRIOV_TYPE) , _sriovEn(MLXCFG_UNKNOWN), _numOfVfs(MLXCFG_UNKNOWN), + _sriovEnDefault(MLXCFG_UNKNOWN), _numOfVfsDefault(MLXCFG_UNKNOWN), _maxVfs(1) {} + ~SriovParams4thGen() {}; - virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last) = 0; + virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last); virtual void setParam(mlxCfgParam paramType, u_int32_t val); virtual u_int32_t getParam(mlxCfgParam paramType); + virtual u_int32_t getDefaultParam(mlxCfgParam paramType); + + virtual int getFromDev(mfile* mf); + virtual int setOnDev(mfile* mf, bool ignoreCheck=false); + virtual int getDefaultParams(mfile* mf); protected: virtual bool hardLimitCheck(); - virtual bool softLimitCheck(mfile* mf=NULL) = 0; + + virtual int updateMaxVfs(mfile* mf); + virtual bool softLimitCheck(mfile* mf=NULL); + void setParams(u_int32_t sriovEn, u_int32_t numOfVfs); u_int32_t _sriovEn; u_int32_t _numOfVfs; + u_int32_t _sriovEnDefault; + u_int32_t _numOfVfsDefault; u_int32_t _maxVfs; }; -class SriovParams4thGen : public SriovParams +/* + * Boot Settings Extras param classes: + */ + +class BootSettingsExtParams : public CfgParams { public: - SriovParams4thGen() : SriovParams() {} - ~SriovParams4thGen() {}; + BootSettingsExtParams(mlxCfgType t, u_int32_t tlvT) : CfgParams(t, tlvT), _ipVer(MLXCFG_UNKNOWN), _ipVerDefault(MLXCFG_UNKNOWN){} + virtual ~BootSettingsExtParams() {} - virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last); + virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last) = 0; + + virtual void setParam(mlxCfgParam paramType, u_int32_t val) = 0; + virtual u_int32_t getParam(mlxCfgParam paramType) = 0; + virtual u_int32_t getDefaultParam(mlxCfgParam paramType) = 0; + + virtual int getFromDev(mfile* mf) = 0; + virtual int setOnDev(mfile* mf, bool ignoreCheck=false) = 0; + virtual int getDefaultParams(mfile* mf)=0; - virtual int getFromDev(mfile* mf); - virtual int setOnDev(mfile* mf, bool ignoreCheck=false); - virtual int getDefaultParams(mfile* mf); protected: - virtual int updateMaxVfs(mfile* mf); - virtual bool softLimitCheck(mfile* mf=NULL); + bool hardLimitCheck(); + void setParams(u_int32_t _ipVer); + u_int32_t _ipVer; + u_int32_t _ipVerDefault; }; +class BootSettingsExtParams4thGen : public BootSettingsExtParams +{ +public: + BootSettingsExtParams4thGen(int port) : BootSettingsExtParams((port == 1) ? Mct_Boot_Settings_Extras_4thGen_P1 : Mct_Boot_Settings_Extras_4thGen_P2, + BOOT_SETTINGS_EXTRAS_GEN4), + _port(port){} + ~BootSettingsExtParams4thGen() {} + + u_int32_t getDefaultParam(mlxCfgParam paramType); + void setParam(mlxCfgParam paramType, u_int32_t val); + u_int32_t getParam(mlxCfgParam paramType); + bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last); + int getDefaultParams(mfile* mf); + + int getFromDev(mfile* mf); + int setOnDev(mfile* mf, bool ignoreCheck=false); +private: + int _port; +}; + +class BootSettingsExtParams5thGen : public BootSettingsExtParams +{ +public: + BootSettingsExtParams5thGen() : BootSettingsExtParams(Mct_Boot_Settings_Extras_5thGen, BOOT_SETTINGS_EXTRAS_GEN5) {} + ~BootSettingsExtParams5thGen() {} + + u_int32_t getBootSettingsExtCapabilitiesTlvTypeBe(); + bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last); + u_int32_t getParam(mlxCfgParam paramType); + u_int32_t getDefaultParam(mlxCfgParam paramType); + void setParam(mlxCfgParam paramType, u_int32_t val); + int getFromDev(mfile* mf); + int setOnDev(mfile* mf, bool ignoreCheck=false); + void updateClassAttrFromDefaultParams(); + void updateTlvFromClassAttr(void* tlv); + void updateClassAttrFromTlv(void* tlv); + void updateClassDefaultAttrFromTlv(void* tlv); + u_int32_t getTlvTypeBe(); + int getDefaultParams(mfile* mf); + int getDefaultParamsAux(mfile* mf); +}; /* * WOL param classes: */ @@ -309,13 +385,14 @@ protected: class WolParams : public CfgParams { public: - WolParams() : CfgParams(Mct_Last, WOL_TYPE), _wolMagicEn(MLXCFG_UNKNOWN) {} + WolParams() : CfgParams(Mct_Last, WOL_TYPE), _wolMagicEn(MLXCFG_UNKNOWN), _wolMagicEnDefault(MLXCFG_UNKNOWN) {} virtual ~WolParams() {} virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last) = 0; virtual void setParam(mlxCfgParam paramType, u_int32_t val) = 0; virtual u_int32_t getParam(mlxCfgParam paramType) = 0; + virtual u_int32_t getDefaultParam(mlxCfgParam paramType) = 0; virtual int getFromDev(mfile* mf) = 0; virtual int setOnDev(mfile* mf, bool ignoreCheck=false) = 0; @@ -323,9 +400,11 @@ public: protected: virtual bool hardLimitCheck(); + void setParams(u_int32_t wolMagicEn); // Wake on magic packet (atm this is the only mode which is supported) u_int32_t _wolMagicEn; + u_int32_t _wolMagicEnDefault; }; class WolParams4thGen : public WolParams @@ -338,6 +417,7 @@ public: virtual void setParam(mlxCfgParam paramType, u_int32_t val); virtual u_int32_t getParam(mlxCfgParam paramType); + virtual u_int32_t getDefaultParam(mlxCfgParam paramType); virtual int getFromDev(mfile* mf); virtual int setOnDev(mfile* mf, bool ignoreCheck=false); @@ -356,15 +436,19 @@ public: virtual void setParam(mlxCfgParam paramType, u_int32_t val); virtual u_int32_t getParam(mlxCfgParam paramType); + virtual u_int32_t getDefaultParam(mlxCfgParam paramType); virtual int getFromDev(mfile* mf); virtual int setOnDev(mfile* mf, bool ignoreCheck=false); virtual int getDefaultParams(mfile* mf); + protected: u_int32_t getTlvTypeBe(); virtual void updateTlvFromClassAttr(void* tlv); virtual void updateClassAttrFromTlv(void* tlv); + virtual void updateClassDefaultAttrFromTlv(void* tlv); + void updateClassAttrFromDefaultParams(); }; @@ -375,7 +459,11 @@ protected: class VpiParams : public CfgParams { public: - VpiParams(int port) : CfgParams(port == 1 ? Mct_Vpi_P1 : Mct_Vpi_P2, VPI_TYPE), _port(port), _linkType(MLXCFG_UNKNOWN), _defaultLinkType(MLXCFG_UNKNOWN){} + VpiParams(int port) : CfgParams(port == 1 ? Mct_Vpi_P1 : Mct_Vpi_P2, VPI_TYPE), _port(port), _linkType(MLXCFG_UNKNOWN), _defaultLinkType(MLXCFG_UNKNOWN) + , _linkTypeDefault(MLXCFG_UNKNOWN), _defaultLinkTypeDefault(MLXCFG_UNKNOWN){ + _vpiTlv.default_link_type = 0; + _vpiTlv.network_link_type = 0; + } ~VpiParams() {} virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last) = 0; @@ -389,10 +477,13 @@ protected: int getFromDevComPost(MError mnvaComRC); int setOnDevComPre(bool ignoreCheck); int setOnDevComPost(MError mnvaComRC); + void setParams(u_int32_t _linkType, u_int32_t _defaultLinkType); int _port; u_int32_t _linkType; u_int32_t _defaultLinkType; + u_int32_t _linkTypeDefault; + u_int32_t _defaultLinkTypeDefault; // FW TLV (used when actually setting/getting the TLV from FW) std::vector _tlvBuff; struct tools_open_vpi_settings _vpiTlv; @@ -409,6 +500,7 @@ public: virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last); virtual void setParam(mlxCfgParam paramType, u_int32_t val); virtual u_int32_t getParam(mlxCfgParam paramType); + virtual u_int32_t getDefaultParam(mlxCfgParam paramType); virtual bool hardLimitCheck(); virtual int getFromDev(mfile* mf); @@ -425,6 +517,7 @@ public: virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last); virtual void setParam(mlxCfgParam paramType, u_int32_t val); virtual u_int32_t getParam(mlxCfgParam paramType); + virtual u_int32_t getDefaultParam(mlxCfgParam paramType); virtual bool hardLimitCheck(); virtual int getFromDev(mfile* mf); @@ -441,13 +534,14 @@ protected: class BarSzParams : public CfgParams { public: - BarSzParams() : CfgParams(Mct_Bar_Size, BAR_SIZE_TYPE) ,_maxLogBarSz(1), _logBarSz(MLXCFG_UNKNOWN) {} + BarSzParams() : CfgParams(Mct_Bar_Size, BAR_SIZE_TYPE) ,_maxLogBarSz(1), _logBarSz(MLXCFG_UNKNOWN), _logBarSzDefault(MLXCFG_UNKNOWN) {} ~BarSzParams() {} virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last) = 0; virtual void setParam(mlxCfgParam paramType, u_int32_t val); virtual u_int32_t getParam(mlxCfgParam paramType); + virtual u_int32_t getDefaultParam(mlxCfgParam paramType); virtual int getFromDev(mfile* mf) = 0; virtual int setOnDev(mfile* mf, bool ignoreCheck=false) = 0; @@ -457,8 +551,10 @@ protected: virtual bool hardLimitCheck(); virtual bool softLimitCheck(mfile* mf=NULL) = 0; virtual int getDefaultBarSz(mfile* mf) = 0; + void setParams(u_int32_t logBarSz); u_int32_t _maxLogBarSz; u_int32_t _logBarSz; + u_int32_t _logBarSzDefault; }; @@ -487,14 +583,23 @@ class PciParams5thGen : public CfgParams { public: PciParams5thGen() : CfgParams(Mct_Pci, PCI_SETTINGS_TYPE) , _sriovEn(MLXCFG_UNKNOWN), _numOfVfs(MLXCFG_UNKNOWN),\ - _fppEn(MLXCFG_UNKNOWN), _sriovSupported(false), _maxVfsPerPf(0), _fppSupported(false),\ - _userSpecifiedSRIOV(false), _userSpecifiedFPP(false){} + _fppEn(MLXCFG_UNKNOWN), _pfLogBarSize(MLXCFG_UNKNOWN), _vfLogBarSize(MLXCFG_UNKNOWN),\ + _numPfMsix(MLXCFG_UNKNOWN), _numVfMsix(MLXCFG_UNKNOWN), _sriovEnDefault(MLXCFG_UNKNOWN),\ + _numOfVfsDefault(MLXCFG_UNKNOWN), _fppEnDefault(MLXCFG_UNKNOWN), _pfLogBarSizeDefault(MLXCFG_UNKNOWN),\ + _vfLogBarSizeDefault(MLXCFG_UNKNOWN), _numPfMsixDefault(MLXCFG_UNKNOWN), _numVfMsixDefault(MLXCFG_UNKNOWN),\ + _numOfPfs(MLXCFG_UNKNOWN), _numOfPfsValid(0), _sriovSupported(false),_maxVfsPerPf(0),\ + _fppSupported(false), _pfLogBarSizeSuppored(false), _vfLogBarSizeSuppored(false),\ + _numPfMsixSupported(false), _numVfMsixSupported(false),_maxLogPfBarSize(0), _maxLogVfBarSize(0),\ + _maxTotalBarValid(0), _maxTotalBar(1), _maxNumPfMsix(0), _maxNumVfMsix(0),_maxTotalMsixValid(0),\ + _maxTotalMsix(0), _userSpecifiedSRIOV(false), _userSpecifiedFPP(false),_userSpecifiedPfLogBarSize(false),\ + _userSpecifiedVfLogBarSize(false),_userSpecifiedNumPfMsix(false),_userSpecifiedNumVfMsix(false){} ~PciParams5thGen() {}; virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last); virtual void setParam(mlxCfgParam paramType, u_int32_t val); virtual u_int32_t getParam(mlxCfgParam paramType); + virtual u_int32_t getDefaultParam(mlxCfgParam paramType); virtual int getFromDev(mfile* mf); virtual int setOnDev(mfile* mf, bool ignoreCheck=false); @@ -502,22 +607,63 @@ public: protected: virtual bool hardLimitCheck(); + virtual bool softLimitCheck(mfile* mf=NULL); int getDefaultsAndCapabilities(mfile* mf); u_int32_t getPciSettingsTlvTypeBe(); u_int32_t getPciCapabilitiesTlvTypeBe(); + void setParams(u_int32_t sriovEn, u_int32_t numOfVfs, u_int32_t fppEn, u_int32_t pfLogBarSize, + u_int32_t vfLogBarSize, u_int32_t numOfPfs, u_int32_t numPfMsix, u_int32_t numVfMsix); + +private: + u_int32_t calcVfLogBarSize(); + u_int32_t calcPfLogBarSize(); + u_int32_t calcTotalBar(); + u_int32_t calcNumOfVfs(); u_int32_t _sriovEn; u_int32_t _numOfVfs; u_int32_t _fppEn; + u_int32_t _pfLogBarSize; + u_int32_t _vfLogBarSize; + u_int32_t _numPfMsix; + u_int32_t _numVfMsix; + + u_int32_t _sriovEnDefault; + u_int32_t _numOfVfsDefault; + u_int32_t _fppEnDefault; + u_int32_t _pfLogBarSizeDefault; + u_int32_t _vfLogBarSizeDefault; + u_int32_t _numPfMsixDefault; + u_int32_t _numVfMsixDefault; + + u_int32_t _numOfPfs; + u_int32_t _numOfPfsValid; + // defaults and capabilities bool _sriovSupported; u_int32_t _maxVfsPerPf; bool _fppSupported; + bool _pfLogBarSizeSuppored; + bool _vfLogBarSizeSuppored; + bool _numPfMsixSupported; + bool _numVfMsixSupported; + u_int32_t _maxLogPfBarSize; + u_int32_t _maxLogVfBarSize; + u_int32_t _maxTotalBarValid; + u_int32_t _maxTotalBar; + u_int32_t _maxNumPfMsix; + u_int32_t _maxNumVfMsix; + u_int32_t _maxTotalMsixValid; + u_int32_t _maxTotalMsix; // class members used for indication bool _userSpecifiedSRIOV; bool _userSpecifiedFPP; + bool _userSpecifiedPfLogBarSize; + bool _userSpecifiedVfLogBarSize; + bool _userSpecifiedNumPfMsix; + bool _userSpecifiedNumVfMsix; }; @@ -528,15 +674,19 @@ protected: class TptParams5thGen : public CfgParams { public: - TptParams5thGen() : CfgParams(Mct_Tpt, TPT_SETTINGS_TYPE) , _logMaxPayloadSize(MLXCFG_UNKNOWN), _logMaxPayloadSizeSupported(false) {} + TptParams5thGen() : CfgParams(Mct_Tpt, TPT_SETTINGS_TYPE) , _logMaxPayloadSize(MLXCFG_UNKNOWN), + _logMaxPayloadSizeDefault(MLXCFG_UNKNOWN), _logMaxPayloadSizeSupported(false) + {} ~TptParams5thGen() {}; virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last); virtual void setParam(mlxCfgParam paramType, u_int32_t val); virtual u_int32_t getParam(mlxCfgParam paramType); + virtual u_int32_t getDefaultParam(mlxCfgParam paramType); virtual int getFromDev(mfile* mf); + int getFromDev(mfile* mf, bool getDefault); virtual int setOnDev(mfile* mf, bool ignoreCheck=false); virtual int getDefaultParams(mfile* mf); @@ -545,8 +695,10 @@ protected: int getDefaultsAndCapabilities(mfile* mf); u_int32_t getTptSettingsTlvTypeBe(); u_int32_t getTptCapabilitiesTlvTypeBe(); + void setParams(u_int32_t logMaxPayloadSize); u_int32_t _logMaxPayloadSize; + u_int32_t _logMaxPayloadSizeDefault; // defaults and capabilities bool _logMaxPayloadSizeSupported; @@ -559,13 +711,14 @@ class InfinibandBootSettingsParams4thGen : public CfgParams { public: InfinibandBootSettingsParams4thGen(int port) : CfgParams((port == 1 ? Mct_Boot_Settings_P1 : Mct_Boot_Settings_P2), - INFINIBAND_BOOT_SETTINGS_TYPE) , _port(port), _bootPkey(MLXCFG_UNKNOWN) {} + INFINIBAND_BOOT_SETTINGS_TYPE) , _port(port), _bootPkey(MLXCFG_UNKNOWN), _bootPkeyDefault(MLXCFG_UNKNOWN) {} ~InfinibandBootSettingsParams4thGen() {}; virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last); virtual void setParam(mlxCfgParam paramType, u_int32_t val); virtual u_int32_t getParam(mlxCfgParam paramType); + virtual u_int32_t getDefaultParam(mlxCfgParam paramType); virtual int getFromDev(mfile* mf); virtual int setOnDev(mfile* mf, bool ignoreCheck=false); @@ -573,9 +726,11 @@ public: protected: virtual bool hardLimitCheck(); + void setParams(u_int32_t bootPkey); int _port; u_int32_t _bootPkey; + u_int32_t _bootPkeyDefault; }; @@ -587,15 +742,18 @@ class IBDCParams5thGen : public CfgParams { public: IBDCParams5thGen() : CfgParams(Mct_Dc, INFINIBAND_DC_SETTINGS_TYPE) , _logDcrHashTableSize(MLXCFG_UNKNOWN), _dcrLifoSize(MLXCFG_UNKNOWN), - _minLogDcrHashTableSize(0), _maxLogDcrHashTableSize(0), _minDcrLifoSize(0), _maxDcrLifoSize(0){} + _logDcrHashTableSizeDefault(MLXCFG_UNKNOWN), _dcrLifoSizeDefault(MLXCFG_UNKNOWN), _minLogDcrHashTableSize(0), + _maxLogDcrHashTableSize(0), _minDcrLifoSize(0), _maxDcrLifoSize(0){} ~IBDCParams5thGen() {}; virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last); virtual void setParam(mlxCfgParam paramType, u_int32_t val); virtual u_int32_t getParam(mlxCfgParam paramType); + virtual u_int32_t getDefaultParam(mlxCfgParam paramType); virtual int getFromDev(mfile* mf); + int getFromDev(mfile* mf, bool getDefault); virtual int setOnDev(mfile* mf, bool ignoreCheck=false); virtual int getDefaultParams(mfile* mf); @@ -607,10 +765,16 @@ protected: virtual void updateTlvFromClassAttr(void* tlv); virtual void updateClassAttrFromTlv(void* tlv); + virtual void updateClassDefaultAttrFromTlv(void* tlv); + void updateClassAttrFromDefaultParams(); + void setParams(u_int32_t logDcrHashTableSize, u_int32_t dcrLifoSize); u_int32_t _logDcrHashTableSize; u_int32_t _dcrLifoSize; + u_int32_t _logDcrHashTableSizeDefault; + u_int32_t _dcrLifoSizeDefault; + // defaults and capabilities u_int32_t _minLogDcrHashTableSize; u_int32_t _maxLogDcrHashTableSize; @@ -618,36 +782,6 @@ protected: u_int32_t _maxDcrLifoSize; }; -/* - * Port boot state Class (5thGen devices only) - */ - -class PortBootStateParams5thGen : public CfgParams -{ -public: - PortBootStateParams5thGen(int port) : CfgParams((port == 1 ? Mct_Boot_State_P1 : Mct_Boot_State_P2), PORT_BOOT_STATE_TYPE) , _portBootState(MLXCFG_UNKNOWN), _port(port) {} - ~PortBootStateParams5thGen() {}; - - virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last); - - virtual void setParam(mlxCfgParam paramType, u_int32_t val); - virtual u_int32_t getParam(mlxCfgParam paramType); - - virtual int getFromDev(mfile* mf); - virtual int setOnDev(mfile* mf, bool ignoreCheck=false); - virtual int getDefaultParams(mfile* mf); - -protected: - virtual bool hardLimitCheck(); - u_int32_t getTlvTypeBe(); - - virtual void updateTlvFromClassAttr(void* tlv); - virtual void updateClassAttrFromTlv(void* tlv); - - u_int32_t _portBootState; - int _port; -}; - /* * RoCE v1.5 next protocol Class (5thGen devices only) */ @@ -655,13 +789,15 @@ protected: class RoCENextProtocolParams5thGen : public CfgParams { public: - RoCENextProtocolParams5thGen() : CfgParams(Mct_RoCE_Next_Protocol, ROCE_NEXT_PROTOCOL_TYPE) , _nextProtocol(MLXCFG_UNKNOWN) {} + RoCENextProtocolParams5thGen() : CfgParams(Mct_RoCE_Next_Protocol, ROCE_NEXT_PROTOCOL_TYPE) , _nextProtocol(MLXCFG_UNKNOWN) + , _nextProtocolDefault(MLXCFG_UNKNOWN){} ~RoCENextProtocolParams5thGen() {}; virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last); virtual void setParam(mlxCfgParam paramType, u_int32_t val); virtual u_int32_t getParam(mlxCfgParam paramType); + virtual u_int32_t getDefaultParam(mlxCfgParam paramType); virtual int getFromDev(mfile* mf); virtual int setOnDev(mfile* mf, bool ignoreCheck=false); @@ -673,8 +809,13 @@ protected: virtual void updateTlvFromClassAttr(void* tlv); virtual void updateClassAttrFromTlv(void* tlv); + virtual void updateClassDefaultAttrFromTlv(void* tlv); + void updateClassAttrFromDefaultParams(); + void setParams(u_int32_t nextProtocol); u_int32_t _nextProtocol; + + u_int32_t _nextProtocolDefault; }; /* @@ -685,13 +826,15 @@ class RoCECCParams5thGen : public CfgParams { public: RoCECCParams5thGen(int port) : CfgParams((port == 1 ? Mct_RoCE_CC_P1 : Mct_RoCE_CC_P2), ROCE_CC_TYPE), - _port(port), _roceCcAlgorithm(MLXCFG_UNKNOWN), _roceCcPrioMask(MLXCFG_UNKNOWN) {} + _port(port), _roceCcAlgorithm(MLXCFG_UNKNOWN), _roceCcPrioMask(MLXCFG_UNKNOWN) + , _roceCcAlgorithmDefault(MLXCFG_UNKNOWN), _roceCcPrioMaskDefault(MLXCFG_UNKNOWN){} ~RoCECCParams5thGen() {}; virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last); virtual void setParam(mlxCfgParam paramType, u_int32_t val); virtual u_int32_t getParam(mlxCfgParam paramType); + virtual u_int32_t getDefaultParam(mlxCfgParam paramType); virtual int getFromDev(mfile* mf); virtual int setOnDev(mfile* mf, bool ignoreCheck=false); @@ -703,10 +846,16 @@ protected: virtual void updateTlvFromClassAttr(void* tlv); virtual void updateClassAttrFromTlv(void* tlv); + virtual void updateClassDefaultAttrFromTlv(void* tlv); + void updateClassAttrFromDefaultParams(); + void setParams(u_int32_t roceCcAlgorithm, u_int32_t roceCcPrioMask); int _port; u_int32_t _roceCcAlgorithm; u_int32_t _roceCcPrioMask; + + u_int32_t _roceCcAlgorithmDefault; + u_int32_t _roceCcPrioMaskDefault; }; /* @@ -723,13 +872,21 @@ public: _rpgGd(MLXCFG_UNKNOWN), _rpgMinDecFac(MLXCFG_UNKNOWN), _rpgMinRate(MLXCFG_UNKNOWN), _rateToSetOnFirstCnp(MLXCFG_UNKNOWN), _dceTcpG(MLXCFG_UNKNOWN), _dceTcpRtt(MLXCFG_UNKNOWN), _rateReduceMonitorPeriod(MLXCFG_UNKNOWN), _initialAlphaValue(MLXCFG_UNKNOWN), - _minTimeBetweenCnps(MLXCFG_UNKNOWN), _cnpDscp(MLXCFG_UNKNOWN), _cnp802pPrio(MLXCFG_UNKNOWN){}; + _minTimeBetweenCnps(MLXCFG_UNKNOWN), _cnpDscp(MLXCFG_UNKNOWN), _cnp802pPrio(MLXCFG_UNKNOWN) + , _clampTgtRateDefault(MLXCFG_UNKNOWN), _clampTgtRateAfterTimeIncDefault(MLXCFG_UNKNOWN), + _rpgTimeResetDefault(MLXCFG_UNKNOWN), _rpgByteResetDefault(MLXCFG_UNKNOWN), _rpgThresholdDefault(MLXCFG_UNKNOWN), + _rpgMaxRateDefault(MLXCFG_UNKNOWN), _rpgAiRateDefault(MLXCFG_UNKNOWN), _rpgHaiRateDefault(MLXCFG_UNKNOWN), + _rpgGdDefault(MLXCFG_UNKNOWN), _rpgMinDecFacDefault(MLXCFG_UNKNOWN), _rpgMinRateDefault(MLXCFG_UNKNOWN), + _rateToSetOnFirstCnpDefault(MLXCFG_UNKNOWN), _dceTcpGDefault(MLXCFG_UNKNOWN), _dceTcpRttDefault(MLXCFG_UNKNOWN), + _rateReduceMonitorPeriodDefault(MLXCFG_UNKNOWN), _initialAlphaValueDefault(MLXCFG_UNKNOWN), + _minTimeBetweenCnpsDefault(MLXCFG_UNKNOWN), _cnpDscpDefault(MLXCFG_UNKNOWN), _cnp802pPrioDefault(MLXCFG_UNKNOWN){}; ~RoCECCEcnParams5thGen() {}; virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last); virtual void setParam(mlxCfgParam paramType, u_int32_t val); virtual u_int32_t getParam(mlxCfgParam paramType); + virtual u_int32_t getDefaultParam(mlxCfgParam paramType); virtual int getFromDev(mfile* mf); virtual int setOnDev(mfile* mf, bool ignoreCheck=false); @@ -741,6 +898,13 @@ protected: virtual void updateTlvFromClassAttr(void* tlv); virtual void updateClassAttrFromTlv(void* tlv); + virtual void updateClassDefaultAttrFromTlv(void* tlv); + void updateClassAttrFromDefaultParams(); + void setParams(u_int32_t clampTgtRate, u_int32_t clampTgtRateAfterTimeInc, u_int32_t rpgTimeReset, u_int32_t rpgByteReset, + u_int32_t rpgThreshold, u_int32_t rpgMaxRate, u_int32_t rpgAiRate, u_int32_t rpgHaiRate, + u_int32_t rpgGd, u_int32_t rpgMinDecFac, u_int32_t rpgMinRate, u_int32_t rateToSetOnFirstCnp, + u_int32_t dceTcpG, u_int32_t dceTcpRtt, u_int32_t rateReduceMonitorPeriod, u_int32_t initialAlphaValue, + u_int32_t minTimeBetweenCnps, u_int32_t cnpDscp, u_int32_t cnp802pPrio); int _port; @@ -763,6 +927,26 @@ protected: u_int32_t _minTimeBetweenCnps; u_int32_t _cnpDscp; u_int32_t _cnp802pPrio; + + u_int32_t _clampTgtRateDefault; + u_int32_t _clampTgtRateAfterTimeIncDefault; + u_int32_t _rpgTimeResetDefault; + u_int32_t _rpgByteResetDefault; + u_int32_t _rpgThresholdDefault; + u_int32_t _rpgMaxRateDefault; + u_int32_t _rpgAiRateDefault; + u_int32_t _rpgHaiRateDefault; + u_int32_t _rpgGdDefault; + u_int32_t _rpgMinDecFacDefault; + u_int32_t _rpgMinRateDefault; + u_int32_t _rateToSetOnFirstCnpDefault; + u_int32_t _dceTcpGDefault; + u_int32_t _dceTcpRttDefault; + u_int32_t _rateReduceMonitorPeriodDefault; + u_int32_t _initialAlphaValueDefault; + u_int32_t _minTimeBetweenCnpsDefault; + u_int32_t _cnpDscpDefault; + u_int32_t _cnp802pPrioDefault; }; @@ -775,13 +959,17 @@ class PrebootBootSettingsParams4thGen : public CfgParams public: PrebootBootSettingsParams4thGen(int port) : CfgParams((port == 1 ? Mct_Preboot_Boot_Settings_P1 : Mct_Preboot_Boot_Settings_P2), PREBOOT_BOOT_SETTINGS_TYPE), _bootOptionRomEn(MLXCFG_UNKNOWN), _bootVlanEn(MLXCFG_UNKNOWN), _bootRetryCnt(MLXCFG_UNKNOWN), - _legacyBootProtocol(MLXCFG_UNKNOWN), _bootVlan(MLXCFG_UNKNOWN), _port(port) {} + _legacyBootProtocol(MLXCFG_UNKNOWN), _bootVlan(MLXCFG_UNKNOWN), + _bootOptionRomEnDefault(MLXCFG_UNKNOWN), _bootVlanEnDefault(MLXCFG_UNKNOWN), _bootRetryCntDefault(MLXCFG_UNKNOWN), + _legacyBootProtocolDefault(MLXCFG_UNKNOWN), _bootVlanDefault(MLXCFG_UNKNOWN), + _port(port) {} ~PrebootBootSettingsParams4thGen() {}; virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last); virtual void setParam(mlxCfgParam paramType, u_int32_t val); virtual u_int32_t getParam(mlxCfgParam paramType); + virtual u_int32_t getDefaultParam(mlxCfgParam paramType); virtual int getFromDev(mfile* mf); virtual int setOnDev(mfile* mf, bool ignoreCheck=false); @@ -792,14 +980,64 @@ protected: virtual void updateTlvFromClassAttr(void* tlv); virtual void updateClassAttrFromTlv(void* tlv); + virtual void updateClassDefaultAttrFromTlv(void* tlv); + void updateClassAttrFromDefaultParams(); + void setParams(u_int32_t bootOptionRomEn, u_int32_t bootVlanEn, u_int32_t bootRetryCnt, + u_int32_t legacyBootProtocol, u_int32_t bootVlan); u_int32_t _bootOptionRomEn; u_int32_t _bootVlanEn; u_int32_t _bootRetryCnt; u_int32_t _legacyBootProtocol; u_int32_t _bootVlan; + + u_int32_t _bootOptionRomEnDefault; + u_int32_t _bootVlanEnDefault; + u_int32_t _bootRetryCntDefault; + u_int32_t _legacyBootProtocolDefault; + u_int32_t _bootVlanDefault; + int _port; }; +/* + * ExternalPort5thGen parameters Class (5thGen devices only) + */ + +class ExternalPort5thGen : public CfgParams +{ +public: + ExternalPort5thGen() : CfgParams(Mct_External_Port, EXTERNAL_PORT), + _portOwner(MLXCFG_UNKNOWN), _allowRdCounters(MLXCFG_UNKNOWN), + _portOwnerDefault(MLXCFG_UNKNOWN), _allowRdCountersDefault(MLXCFG_UNKNOWN){} + ~ExternalPort5thGen() {}; + + virtual bool cfgSupported(mfile* mf, mlxCfgParam param=Mcp_Last); + + virtual void setParam(mlxCfgParam paramType, u_int32_t val); + virtual u_int32_t getParam(mlxCfgParam paramType); + virtual u_int32_t getDefaultParam(mlxCfgParam paramType); + + virtual int getFromDev(mfile* mf); + virtual int setOnDev(mfile* mf, bool ignoreCheck=false); + virtual int getDefaultParams(mfile* mf); + +protected: + virtual bool hardLimitCheck(); + u_int32_t getTlvTypeBe(); + + virtual void updateTlvFromClassAttr(void* tlv); + virtual void updateClassAttrFromTlv(void* tlv); + virtual void updateClassDefaultAttrFromTlv(void* tlv); + void updateClassAttrFromDefaultParams(); + void setParams(u_int32_t portOwner, u_int32_t allowRdCounters); + + u_int32_t _portOwner; + u_int32_t _allowRdCounters; + + u_int32_t _portOwnerDefault; + u_int32_t _allowRdCountersDefault; + +}; #endif /* MLXCFG_PARAM_LIB_H_ */ diff --git a/mlxconfig/mlxcfg_parser.cpp b/mlxconfig/mlxcfg_parser.cpp index 8ace497..dbdb3c1 100644 --- a/mlxconfig/mlxcfg_parser.cpp +++ b/mlxconfig/mlxcfg_parser.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -28,12 +29,11 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - * Version: $Id$ - * */ #include #include +#include #include #include #include @@ -57,41 +57,25 @@ static void printFlagLine(string flag_s, string flag_l, string param, string des printf(IDENT2"-%s|--%s", flag_s.c_str(), flag_l.c_str()); if (param.length()) { printf(" <%s>", param.c_str()); - } else { + } else if (flag_l.length() < 8){ printf("\t"); } printf(IDENT3": %s\n", desc.c_str()); } -static void printConfigurationHeader(string confName, string extraInfo="") -{ - printf(IDENT2"%s: %s\n", confName.c_str(), extraInfo.c_str()); -} - -static void printConfigurationParameter(string param, string extraInfo) -{ - printf(IDENT4"%-36s : %s\n", param.c_str(), extraInfo.c_str()); -} - - -static void printConfigurationParameter(string param) -{ - printf(IDENT4"%-36s\n", param.c_str()); -} - #ifdef MTCR_UL #define DEVICE_NAME "device" #else #define DEVICE_NAME "mst device" #endif -void MlxCfg::printHelp() +void MlxCfg::printHelp(bool longDesc) { // print opening printf(IDENT"NAME:\n" IDENT2 MLXCFG_NAME"\n" IDENT"SYNOPSIS:\n" - IDENT2 MLXCFG_NAME " [-d <%s> ] [-y] |q[uery]|r[eset]>\n", DEVICE_NAME); + IDENT2 MLXCFG_NAME " [-d <%s> ] [-y|-e] |q[uery]|r[eset]>\n", DEVICE_NAME); // print options printf("\n"); @@ -99,7 +83,9 @@ void MlxCfg::printHelp() printFlagLine("d", "dev", "device", "Perform operation for a specified mst device."); printFlagLine("f", "file", "conf_file", "raw configuration file."); printFlagLine("h", "help", "", "Display help message."); + printFlagLine("hh", "full_help", "", "Display full help message."); printFlagLine("v", "version", "", "Display version info."); + printFlagLine("e", "show_default", "", "Show default configurations."); printFlagLine("y", "yes", "", "Answer yes in prompt."); //print commands @@ -115,102 +101,15 @@ void MlxCfg::printHelp() printf("\n"); printf(IDENT"Supported Configurations:\n"); printf("\n"); - printConfigurationHeader("PCI Settings"); - printConfigurationParameter("FPP_EN=<1|0>", "enable function per port."); - printConfigurationParameter("LOG_BAR_SIZE=", "example: for 8Mb bar size set LOG_BAR_SIZE=3."); - printConfigurationParameter("NUM_OF_VFS=", "desired amount of virtual functions."); - printConfigurationParameter("SRIOV_EN=<0|1>", "enable SR-IOV."); - printf("\n"); - printConfigurationHeader("IB Dynamically Connect"); - printConfigurationParameter("DCR_LIFO_SIZE=", "The amount of total DCRs available to join linked-lists after hash DCRs."); - printConfigurationParameter("LOG_DCR_HASH_TABLE_SIZE=", "log2 of the hash table size minus 1."); - printf("\n"); - printConfigurationHeader("Infiniband Boot Settings"); - printConfigurationParameter("BOOT_PKEY_P1=", "partition key to be used by PXE boot (ConnectX3, ConnectX3-Pro Only)."); - printConfigurationParameter("BOOT_PKEY_P2=", "set 0 for default."); - printf("\n"); - printConfigurationHeader("Internal Settings"); - printConfigurationParameter("INT_LOG_MAX_PAYLOAD_SIZE=<0|12>", "0=Auto 12=4KB Burst length."); - printf("\n"); - /* - printConfigurationHeader("Port Boot State", "Port power settings on boot"); - printConfigurationParameter("BOOT_STATE_P1=<0..3>", "0=Normal operation, 1=SFP power off, 2=SERDES power off, 3=Admin linkDown"); - printConfigurationParameter("BOOT_STATE_P2=<0..3>"); - printf("\n"); - */ - printConfigurationHeader("Preboot Boot Settings", "Settings that control the legacy option ROM."); - printConfigurationParameter("BOOT_OPTION_ROM_EN_P1=<0|1>", "Disable/Enable boot option ROM."); - printConfigurationParameter("BOOT_OPTION_ROM_EN_P2=<0|1>"); - printConfigurationParameter("BOOT_VLAN_EN_P1=<0|1>", "Disable/Enable VLAN mode for network boot."); - printConfigurationParameter("BOOT_VLAN_EN_P2=<0|1>"); - printConfigurationParameter("BOOT_RETRY_CNT_P1=<0..7>", "Number of retries to attempt in case of boot failure."); - printConfigurationParameter("BOOT_RETRY_CNT_P2=<0..7>", "7 indicates infinite retries."); - printConfigurationParameter("LEGACY_BOOT_PROTOCOL_P1=<0..3>", "0=None(disable legacy boot), 1=PXE(DHCP/TFTP boot), 2=iSCSI, 3=PXE + iSCSI."); - printConfigurationParameter("LEGACY_BOOT_PROTOCOL_P2=<0..3>"); - printConfigurationParameter("BOOT_VLAN_P1=", "VLAN ID for the network boot."); - printConfigurationParameter("BOOT_VLAN_P2="); - printf("\n"); - printConfigurationHeader("RoCE Congestion Control ECN"); - printConfigurationParameter("CLAMP_TGT_RATE_AFTER_TIME_INC_P1=<0|1>", "When receiving an CNP, the target rate should be updated if the transmission rate was increased"); - printConfigurationParameter("CLAMP_TGT_RATE_AFTER_TIME_INC_P2=<0|1>", "due to the timer, and not only due to the byte counter. Default=1."); - printConfigurationParameter("CLAMP_TGT_RATE_P1=<0|1>", "If set, whenever a CNP is processed, the target rate is updated to be the current rate."); - printConfigurationParameter("CLAMP_TGT_RATE_P2=<0|1>", "Default=1"); - printConfigurationParameter("CNP_DSCP_P1=<0..7>", "The DiffServ Code Point of the generated CNP for this port."); - printConfigurationParameter("CNP_DSCP_P2=<0..7>", "Default=0."); - printConfigurationParameter("CNP_802P_PRIO_P1=", "The 802.1p priority value of the generated CNP for this port."); - printConfigurationParameter("CNP_802P_PRIO_P2=", "Default=7."); - printConfigurationParameter("DCE_TCP_G_P1=", "Used to update the congestion estimator (alpha) once every dce_tcp_rtt microseconds."); - printConfigurationParameter("DCE_TCP_G_P2=", "Default=64."); - printConfigurationParameter("DCE_TCP_RTT_P1=", "The time between updates of the alpha value, in microseconds."); - printConfigurationParameter("DCE_TCP_RTT_P2=", "Default=2."); - printConfigurationParameter("INITIAL_ALPHA_VALUE_P1=", "The initial value of alpha to use when receiving the first CNP for a flow."); - printConfigurationParameter("INITIAL_ALPHA_VALUE_P2=", "Expressed in a fixed point fraction of 2^10."); - printConfigurationParameter("MIN_TIME_BETWEEN_CNPS_P1=", "Minimum time between sending cnps from the port, in microseconds."); - printConfigurationParameter("MIN_TIME_BETWEEN_CNPS_P2=", "Default=0."); - printConfigurationParameter("RATE_TO_SET_ON_FIRST_CNP_P1=", "The rate that is set for the flow when a rate limiter is allocated to it upon first CNP received, in Mbps."); - printConfigurationParameter("RATE_TO_SET_ON_FIRST_CNP_P2=", "Default=0."); - printConfigurationParameter("RATE_REDUCE_MONITOR_PERIOD_P1=", "The minimum time between 2 consecutive rate reductions for a single flow."); - printConfigurationParameter("RATE_REDUCE_MONITOR_PERIOD_P2=", "Rate reduction will occur only if a CNP is received during the relevant time interval. Default=2."); - printConfigurationParameter("RPG_AI_RATE_P1=", "The rate, in Mbits per second, used to increase rpTargetRate in the RPR_ACTIVE_INCREASE state."); - printConfigurationParameter("RPG_AI_RATE_P2=", "Default=10."); - printConfigurationParameter("RPG_BYTE_RESET_P1=", "Transmitted data between rate increases if no CNPs are received. Given in Bytes."); - printConfigurationParameter("RPG_BYTE_RESET_P2=", "Disabled=0, Default=150."); - printConfigurationParameter("RPG_GD_P1=<0..15>", "If a CNP is received, the flow rate is reduced at the beginning of the next rate_reduce_monitor_period interval to,"); - printConfigurationParameter("RPG_GD_P2=<0..15>", "(1-Alpha/Gd)*CurrentRate. RPG_GD is given as log2(Gd), where Gd may only be powers of 2. Default=7."); - printConfigurationParameter("RPG_HAI_RATE_P1=", "The rate, in Mbits per second, used to increase rpTargetRate in the RPR_HYPER_INCREASE state."); - printConfigurationParameter("RPG_HAI_RATE_P2=", "Default=50."); - printConfigurationParameter("RPG_MAX_RATE_P1=", "The maximum rate, in Mbits per second, at which an RP can transmit."); - printConfigurationParameter("RPG_MAX_RATE_P2=", "Once this limit is reached, the RP rate limited is released and"); - printConfigurationParameter(" ", "the flow is not rate limited any more. Default=0 (Full port speed)."); - printConfigurationParameter("RPG_MIN_DEC_FAC_P1=<1..100>", "The minimum factor by which the current transmit rate can be changed when processing a CNP."); - printConfigurationParameter("RPG_MIN_DEC_FAC_P2=<1..100>", "Value is given as a percentage (1-100). Default=50."); - printConfigurationParameter("RPG_MIN_RATE_P1=", "The minimum value, in Mb per second, for rate to limit."); - printConfigurationParameter("RPG_MIN_RATE_P2=", "Default=2000."); - printConfigurationParameter("RPG_THRESHOLD_P1=<0..31>", "The number of times rpByteStage or rpTimeStage can count before the RP rate control state machine advances states."); - printConfigurationParameter("RPG_THRESHOLD_P2=<0..31>", "Default=5."); - printConfigurationParameter("RPG_TIME_RESET_P1=", "Time between rate increases if no CNPs are received. Given in u-seconds"); - printConfigurationParameter("RPG_TIME_RESET_P2=", "Default=2."); - printf("\n"); - printConfigurationHeader("RoCE Congestion Control Parameters"); - printConfigurationParameter("ROCE_CC_ALGORITHM_P1=<0|1>", "Congestion control algorithm. 0=ECN, 1=QCN."); - printConfigurationParameter("ROCE_CC_ALGORITHM_P2=<0|1>"); - printConfigurationParameter("ROCE_CC_PRIO_MASK_P1=<0..255>", "Per priority enable disable bitmask. default 0."); - printConfigurationParameter("ROCE_CC_PRIO_MASK_P2=<0..255>"); - printf("\n"); - printConfigurationHeader("RoCE V1.5 next protocol"); - printConfigurationParameter("ROCE_NEXT_PROTOCOL=<0..255>", "The next protocol value set in the IPv4/IPv6 packets for RoCE v1.5. The default is 0xFE."); - printf("\n"); - printConfigurationHeader("VPI Settings", "Control network link type"); - printConfigurationParameter("LINK_TYPE_P1=<1|2|3>", "1=Infiniband 2=Ethernet 3=VPI(auto-sense)."); - printConfigurationParameter("LINK_TYPE_P2=<1|2|3>"); - printf("\n"); - printConfigurationHeader("Wake On LAN"); - printConfigurationParameter("WOL_MAGIC_EN=<0|1>", "5th generation devices only (per physical function)."); - printConfigurationParameter("WOL_MAGIC_EN_P1=<0|1>", "enable wake on magic packet(per port.)"); - printConfigurationParameter("WOL_MAGIC_EN_P2=<0|1>", "4th generation devices only."); - printf("\n"); + if(longDesc) { + _allInfo.printLongDesc(); + } else { + _allInfo.printShortDesc(); + } + // print usage examples + printf("\n"); printf(IDENT"Examples:\n"); printf(IDENT2"%-35s: %s\n", "To query current configuration", MLXCFG_NAME" -d "MST_DEV_EXAMPLE" query"); printf(IDENT2"%-35s: %s\n", "To set configuration", MLXCFG_NAME" -d "MST_DEV_EXAMPLE" set SRIOV_EN=1 NUM_OF_VFS=16 WOL_MAGIC_EN_P1=1"); @@ -232,7 +131,7 @@ void MlxCfg::printVersion() void MlxCfg::printUsage() { printf("\n"IDENT"Usage:\n" - IDENT2 MLXCFG_NAME " [-d <%s> ] [-y] |q[uery]|r[eset]>\n\n", DEVICE_NAME); + IDENT2 MLXCFG_NAME " [-d <%s> ] [-y|-e] |q[uery]|r[eset]>\n\n", DEVICE_NAME); } bool MlxCfg::tagExsists(mlxCfgParam tag) { @@ -287,6 +186,7 @@ mlxCfgStatus MlxCfg::extractCfgArgs(int argc, char* argv[]) string tag; string valstr; u_int32_t val = 0; + mlxCfgParam param = Mcp_Last; for (;i < argc;i++) { char* ptr; // get the tag @@ -304,14 +204,19 @@ mlxCfgStatus MlxCfg::extractCfgArgs(int argc, char* argv[]) if (strtok(NULL, "=")) { return err(true, "Invalid Configuration argument %s", argv[i]); } - //printf("-D- %s %s\n", tag.c_str(), valstr.c_str()); - if (!strToNum(valstr, val, 0)) { - return err(true, "Failed to parse %s=%s", tag.c_str(), valstr.c_str()); + + if(_allInfo.parseParam(tag, valstr, val, param)) { + if(param == Mcp_Last) { + return err(true, "Unknown Parameter: %s", tag.c_str()); + } else { + return err(true, "Failed to parse %s=%s", tag.c_str(), valstr.c_str()); + } } - // store val in the correct place in mlxconfig Params - if (processArg(tag, val)) { - return MLX_CFG_ERROR; + + if(tagExsists(param)) { + return err(true, "Duplicate parameter, %s.", tag.c_str()); } + _mlxParams.params.push_back(cfgInfo((mlxCfgParam)param, val)); } return MLX_CFG_OK; } @@ -329,7 +234,10 @@ mlxCfgStatus MlxCfg::parseArgs(int argc, char* argv[]) } else if (arg == "-h" || arg == "--help"){ printHelp(); return MLX_CFG_OK_EXIT; - }else if (arg == "-d" || arg == "--dev") { + } else if (arg == "-hh" || arg == "--full_help"){ + printHelp(true); + return MLX_CFG_OK_EXIT; + } else if (arg == "-d" || arg == "--dev") { if (++i == argc) { return err(true, "missing device name"); } @@ -341,6 +249,8 @@ mlxCfgStatus MlxCfg::parseArgs(int argc, char* argv[]) return err(true, "missing file name"); } _mlxParams.rawTlvFile = argv[i]; + } else if (arg == "-e" || arg == "--show_default") { + _mlxParams.showDefault = true; }else if (arg == "set" || arg == "s") { _mlxParams.cmd = Mc_Set; break; @@ -389,3 +299,496 @@ mlxCfgStatus MlxCfg::parseArgs(int argc, char* argv[]) return extractCfgArgs(argc-i, &(argv[i])); } + +mlxCfgStatus MlxCfgParamParser::parseUserInput(string input, u_int32_t& val) +{ + std::map::iterator it; + //first check if it is a numeric value + if(strToNum(input, val, 0)) { + return MLX_CFG_OK; + } + for(it = _strMap.begin(); it != _strMap.end(); it++){ + if(compareVal(it->first, input)){ + val = it->second; + return MLX_CFG_OK; + } + } + return MLX_CFG_ERROR; +} + +string MlxCfgParamParser::getShortDescStrAux() +{ + string s; + std::map::iterator it; + + s = _name + "=<"; + + if(_strMap.size() == 0) { + s += _allowedValues; + } else { + //printf first str + it = _strMap.begin(); + s += it->first; + it++; + for(; it != _strMap.end(); it++) + { + s += "|"; + s += it->first; + } + } + + s += ">"; + return s; +} + +void MlxCfgParamParser::printShortDesc() +{ + printf(IDENT4"%s\n", getShortDescStrAux().c_str()); +} + +void MlxCfgParamParser::splitAndPrintDesc(string desc) +{ + if(desc.length() > 129) { + //find index of last space in first 129 chars and split there + int i = desc.substr(0, 129).find_last_of(' '); + string desc2 = desc.substr(i, (desc.length() - i)); + printf(IDENT4"%-46s %s\n", "", desc.substr(0, i).c_str()); + splitAndPrintDesc(desc2); + } else { + printf(IDENT4"%-46s %s\n", "", desc.c_str()); + } +} + +bool MlxCfgParamParser::compareVal(string a, string b) +{ + if(a.length() != b.length()){ + return false; + } + + for(unsigned int i = 0; i < a.length(); i++) { + if(tolower(a[i]) != tolower(b[i])){ + return false; + } + } + + return true; +} + +void MlxCfgParamParser::printLongDesc() +{ + string shortDesc = getShortDescStrAux(); + if(_desc.length() > 129) { + //find index of last space in first 129 chars and split there + int i = _desc.substr(0, 129).find_last_of(' '); + string desc2 = _desc.substr(i, (_desc.length() - i)); + printf(IDENT4"%-46s : %s\n", shortDesc.c_str(), _desc.substr(0, i).c_str()); + splitAndPrintDesc(desc2); + } else { + printf(IDENT4"%-46s : %s\n", shortDesc.c_str(), _desc.c_str()); + } +} + +string MlxCfgParamParser::getStrVal(u_int32_t val){ + std::map::iterator it; + if(val == MLXCFG_UNKNOWN) { + return "MLXCFG_UNKNOWN"; + } + if(_strMap.size() == 0) { + return ""; + } else { + for(it = _strMap.begin(); it != _strMap.end(); it++){ + if(val == it->second){ + return it->first; + } + } + //not a legal value, print it as it + return ""; + } +} + +bool mlxCfgParamParserCompare(MlxCfgParamParser a, MlxCfgParamParser b) +{ + return a.getName() < b.getName(); +} + +vector MlxCfgInfo::getParamsMapValues() +{ + vector vals; + std::map::iterator it; + for(it = _params.begin(); it != _params.end(); it++) + { + vals.push_back(it->second); + } + return vals; +} + +void MlxCfgInfo::printShortDesc() +{ + printf("\n"); + printf(IDENT2"%s: %s\n",_name.c_str(), _title.c_str()); + + vector vals = getParamsMapValues(); + std::sort(vals.begin(), vals.end(), mlxCfgParamParserCompare); + + for(unsigned int i = 0; i < vals.size(); i++) + { + vals[i].printShortDesc(); + } +} + +void MlxCfgInfo::printLongDesc() +{ + printf("\n"); + printf(IDENT2"%s: %s\n",_name.c_str(), _title.c_str()); + + vector vals = getParamsMapValues(); + std::sort(vals.begin(), vals.end(), mlxCfgParamParserCompare); + + for(unsigned int i = 0; i < vals.size(); i++) + { + vals[i].printLongDesc(); + } +} + +mlxCfgStatus MlxCfgInfo::getParamParser(mlxCfgParam p, MlxCfgParamParser& paramParser) +{ + std::map::iterator it = _params.find(p); + if(it == _params.end()) { + return MLX_CFG_ERROR; + } + paramParser = it->second; + return MLX_CFG_OK; +} + +mlxCfgStatus MlxCfgInfo::getParamParser(string name, MlxCfgParamParser& paramParser) +{ + std::map::iterator it; + for(it = _params.begin(); it != _params.end(); it++) + { + if(name == it->second.getName()) { + paramParser = it->second; + return MLX_CFG_OK; + } + } + return MLX_CFG_ERROR; +} + +MlxCfgInfo MlxCfgAllInfo::createPciSettings() +{ + map paramMap; + map params; + paramMap["True"] = 1; + paramMap["False"] = 0; + params[Mcp_Fpp_En] = MlxCfgParamParser(Mcp_Fpp_En, "FPP_EN", "Enable function per port", paramMap); + params[Mcp_Log_Bar_Size] = MlxCfgParamParser(Mcp_Log_Bar_Size, "LOG_BAR_SIZE", "example: for 8Mb bar size set LOG_BAR_SIZE=3 (4th Generation)", "base_2_log_in_mb"); + params[Mcp_Sriov_En] = MlxCfgParamParser(Mcp_Sriov_En, "SRIOV_EN", "Enable SR-IOV", paramMap); + params[Mcp_PF_Log_Bar_Size] = MlxCfgParamParser(Mcp_PF_Log_Bar_Size, "PF_LOG_BAR_SIZE", "example: for 8Mb bar size set PF_LOG_BAR_SIZE=3 (5th Generation)", "base_2_log_in_mb"); + params[Mcp_VF_Log_Bar_Size] = MlxCfgParamParser(Mcp_VF_Log_Bar_Size, "VF_LOG_BAR_SIZE", "example: for 8Mb bar size set VF_LOG_BAR_SIZE=3 (5th Generation)", "base_2_log_in_mb"); + params[Mcp_Num_Of_Vfs] = MlxCfgParamParser(Mcp_Num_Of_Vfs, "NUM_OF_VFS", "desired amount of virtual functions", "NUM"); + params[Mcp_Num_Pf_Msix] = MlxCfgParamParser(Mcp_Num_Pf_Msix, "NUM_PF_MSIX", "Number of MSI-X vectors and EQs per PF (5th Generation)", "NUM"); + params[Mcp_Num_Vf_Msix] = MlxCfgParamParser(Mcp_Num_Vf_Msix, "NUM_VF_MSIX", "Number of MSI-X vectors and EQs per VF (5th Generation)", "NUM"); + return MlxCfgInfo("PCI Settings", "", params); +} + +MlxCfgInfo MlxCfgAllInfo::createIBDynamicallyConnect() +{ + map params; + + //IB Dynamically Connect + params[Mcp_Dcr_Lifo_Size] = MlxCfgParamParser(Mcp_Dcr_Lifo_Size, "DCR_LIFO_SIZE", "The amount of total DCRs available to join linked-lists after hash DCRs", "SIZE"); + params[Mcp_Log_Dcr_Hash_Table_Size] = MlxCfgParamParser(Mcp_Log_Dcr_Hash_Table_Size, "LOG_DCR_HASH_TABLE_SIZE", "log2 of the hash table size minus 1", "SIZE"); + return MlxCfgInfo("IB Dynamically Connect", "", params); +} + +MlxCfgInfo MlxCfgAllInfo::createInfinibandBootSettings() +{ + map params; + + //Infiniband Boot Settings + params[Mcp_Boot_Pkey_P1] = MlxCfgParamParser(Mcp_Boot_Pkey_P1, "BOOT_PKEY_P1", "partition key to be used by PXE boot (ConnectX3, ConnectX3-Pro Only)", "PKEY"); + params[Mcp_Boot_Pkey_P2] = MlxCfgParamParser(Mcp_Boot_Pkey_P2, "BOOT_PKEY_P2", "set 0 for default", "PKEY"); + return MlxCfgInfo("Infiniband Boot Settings", "", params); +} + +MlxCfgInfo MlxCfgAllInfo::createInternalSettings() +{ + map paramMap; + map params; + + //Internal Settings + paramMap["Auto"] = 0; + paramMap["4KB"] = 12; + params[Mcp_Log_Tpt_Size] = MlxCfgParamParser(Mcp_Log_Tpt_Size, "INT_LOG_MAX_PAYLOAD_SIZE", """Burst length", paramMap); + return MlxCfgInfo("Internal Settings", "", params); +} + +MlxCfgInfo MlxCfgAllInfo::createPrebootBootSettings() +{ + map paramMap; + map params; + + //Preboot Boot Settings + paramMap["True"] = 1; + paramMap["False"] = 0; + params[Mcp_Boot_Option_Rom_En_P1] = MlxCfgParamParser(Mcp_Boot_Option_Rom_En_P1, "BOOT_OPTION_ROM_EN_P1", "Disable/Enable boot option ROM", paramMap); + params[Mcp_Boot_Option_Rom_En_P2] = MlxCfgParamParser(Mcp_Boot_Option_Rom_En_P2, "BOOT_OPTION_ROM_EN_P2", "", paramMap); + params[Mcp_Boot_Vlan_En_P1] = MlxCfgParamParser(Mcp_Boot_Vlan_En_P1, "BOOT_VLAN_EN_P1", "Disable/Enable VLAN mode for network boot", paramMap); + params[Mcp_Boot_Vlan_En_P2] = MlxCfgParamParser(Mcp_Boot_Vlan_En_P2, "BOOT_VLAN_EN_P2", "", paramMap); + params[Mcp_Boot_Retry_Cnt_P1] = MlxCfgParamParser(Mcp_Boot_Retry_Cnt_P1, "BOOT_RETRY_CNT_P1", "Number of retries to attempt in case of boot failure. 7 indicates infinite retries.", "0..7"); + params[Mcp_Boot_Retry_Cnt_P2] = MlxCfgParamParser(Mcp_Boot_Retry_Cnt_P2, "BOOT_RETRY_CNT_P2", "", "0..7"); + paramMap.clear(); + paramMap["None"] = 0; + paramMap["PXE"] = 1; + paramMap["iSCSI"] = 2; + paramMap["Both"] = 3; + params[Mcp_Legacy_Boot_Protocol_P1] = MlxCfgParamParser(Mcp_Legacy_Boot_Protocol_P1, "LEGACY_BOOT_PROTOCOL_P1", "None: disable legacy boot. PXE: DHCP/TFTP boot. Both: PXE and iSCSI", paramMap); + params[Mcp_Legacy_Boot_Protocol_P2] = MlxCfgParamParser(Mcp_Legacy_Boot_Protocol_P2, "LEGACY_BOOT_PROTOCOL_P2", "", paramMap); + params[Mcp_Boot_Vlan_P1] = MlxCfgParamParser(Mcp_Boot_Vlan_P1, "BOOT_VLAN_P1", "VLAN ID for the network boot", "VLAN ID"); + params[Mcp_Boot_Vlan_P2] = MlxCfgParamParser(Mcp_Boot_Vlan_P2, "BOOT_VLAN_P2", "", "VLAN ID"); + return MlxCfgInfo("Preboot Boot Settings", "Settings that control the legacy option ROM", params); +} + +MlxCfgInfo MlxCfgAllInfo::createRoCECongestionControlECN() +{ + map params; + + //RoCE Congestion Control ECN + params[Mcp_Clamp_Tgt_Rate_P1] = MlxCfgParamParser(Mcp_Clamp_Tgt_Rate_P1, "CLAMP_TGT_RATE_P1","If set, whenever a CNP is processed," + " the target rate is updated to be the current rate. Default=1" + ,"0|1"); + params[Mcp_Clamp_Tgt_Rate_P2] = MlxCfgParamParser(Mcp_Clamp_Tgt_Rate_P2, "CLAMP_TGT_RATE_P2","","0|1"); + params[Mcp_Clamp_Tgt_Rate_After_Time_Inc_P1] = MlxCfgParamParser(Mcp_Clamp_Tgt_Rate_After_Time_Inc_P1, "CLAMP_TGT_RATE_AFTER_TIME_INC_P1", + "When receiving an CNP, the target rate should" + " be updated if the transmission rate was increased" + " due to the timer, and not only due to the byte counter"". Default=1" + ,"0|1"); + params[Mcp_Clamp_Tgt_Rate_After_Time_Inc_P2] = MlxCfgParamParser(Mcp_Clamp_Tgt_Rate_After_Time_Inc_P2, "CLAMP_TGT_RATE_AFTER_TIME_INC_P2","","0|1"); + params[Mcp_Rpg_Time_Reset_P1] = MlxCfgParamParser(Mcp_Rpg_Time_Reset_P1, "RPG_TIME_RESET_P1" + ,"Time between rate increases if no CNPs are received. Given in u-seconds. Default=2" + ,"USEC"); + params[Mcp_Rpg_Time_Reset_P2] = MlxCfgParamParser(Mcp_Rpg_Time_Reset_P2, "RPG_TIME_RESET_P2","","USEC"); + params[Mcp_Rpg_Byte_Reset_P1] = MlxCfgParamParser(Mcp_Rpg_Byte_Reset_P1, "RPG_BYTE_RESET_P1" + ,"Transmitted data between rate increases if no CNPs are received. Given in Bytes. " + "Disabled=0, Default=150" + ,"BYTE_NUM"); + params[Mcp_Rpg_Byte_Reset_P2] = MlxCfgParamParser(Mcp_Rpg_Byte_Reset_P2, "RPG_BYTE_RESET_P2","","BYTE_NUM"); + params[Mcp_Rpg_Threshold_P1] = MlxCfgParamParser(Mcp_Rpg_Threshold_P1, "RPG_THRESHOLD_P1" + ,"The number of times rpByteStage or rpTimeStage can count before the RP rate control " + "state machine advances states. Default=5" + ,"0..31"); + params[Mcp_Rpg_Threshold_P2] = MlxCfgParamParser(Mcp_Rpg_Threshold_P2, "RPG_THRESHOLD_P2","","0..31"); + params[Mcp_Rpg_Max_Rate_P1] = MlxCfgParamParser(Mcp_Rpg_Max_Rate_P1, "RPG_MAX_RATE_P1" + ,"The maximum rate, in Mbits per second, at which an RP can transmit. " + "Once this limit is reached, the RP rate limited is released and " + "the flow is not rate limited any more. Default=0 (Full port speed)." + ,"RATE_IN_MBIT"); + params[Mcp_Rpg_Max_Rate_P2] = MlxCfgParamParser(Mcp_Rpg_Max_Rate_P2, "RPG_MAX_RATE_P2","","RATE_IN_MBIT"); + params[Mcp_Rpg_Ai_Rate_P1] = MlxCfgParamParser(Mcp_Rpg_Ai_Rate_P1, "RPG_AI_RATE_P1","The rate, in Mbits per second," + " used to increase rpTargetRate in the RPR_ACTIVE_INCREASE state." + " Default=10." + ,"RATE_IN_MBIT"); + params[Mcp_Rpg_Ai_Rate_P2] = MlxCfgParamParser(Mcp_Rpg_Ai_Rate_P2, "RPG_AI_RATE_P2","","RATE_IN_MBIT"); + params[Mcp_Rpg_Hai_Rate_P1] = MlxCfgParamParser(Mcp_Rpg_Hai_Rate_P1, "RPG_HAI_RATE_P1" + ,"The rate, in Mbits per second, used to increase rpTargetRate in the RPR_HYPER_INCREASE state." + " Default=50" + ,"RATE_IN_MBIT"); + params[Mcp_Rpg_Hai_Rate_P2] = MlxCfgParamParser(Mcp_Rpg_Hai_Rate_P2, "RPG_HAI_RATE_P2","","RATE_IN_MBIT"); + params[Mcp_Rpg_Gd_P1] = MlxCfgParamParser(Mcp_Rpg_Gd_P1, "RPG_GD_P1" + ,"If a CNP is received, the flow rate is reduced at the beginning of the next rate_reduce_monitor_period interval to," + "(1-Alpha/Gd)*CurrentRate. RPG_GD is given as log2(Gd), where Gd may only be powers of 2. Default=7." + ,"0..15"); + params[Mcp_Rpg_Gd_P2] = MlxCfgParamParser(Mcp_Rpg_Gd_P2, "RPG_GD_P2","","0..15"); + params[Mcp_Rpg_Min_Dec_Fac_P1] = MlxCfgParamParser(Mcp_Rpg_Min_Dec_Fac_P1, "RPG_MIN_DEC_FAC_P1" + ,"The minimum factor by which the current transmit rate can be changed when processing a CNP." + "Value is given as a percentage (1-100). Default=50." + ,"1..100"); + params[Mcp_Rpg_Min_Dec_Fac_P2] = MlxCfgParamParser(Mcp_Rpg_Min_Dec_Fac_P2, "RPG_MIN_DEC_FAC_P2","","1..100"); + params[Mcp_Rpg_Min_Rate_P1] = MlxCfgParamParser(Mcp_Rpg_Min_Rate_P1, "RPG_MIN_RATE_P1" + ,"The minimum value, in Mb per second, for rate to limit. Default=2000" + ,"RATE_IN_MBIT"); + params[Mcp_Rpg_Min_Rate_P2] = MlxCfgParamParser(Mcp_Rpg_Min_Rate_P2, "RPG_MIN_RATE_P2","","RATE_IN_MBIT"); + params[Mcp_Rate_To_Set_On_First_Cnp_P1] = MlxCfgParamParser(Mcp_Rate_To_Set_On_First_Cnp_P1, "RATE_TO_SET_ON_FIRST_CNP_P1" + ,"The rate that is set for the flow when a rate limiter is allocated to it upon first CNP received, in Mbps. " + "Default=0" + ,"RATE_IN_MBIT"); + params[Mcp_Rate_To_Set_On_First_Cnp_P2] = MlxCfgParamParser(Mcp_Rate_To_Set_On_First_Cnp_P2, "RATE_TO_SET_ON_FIRST_CNP_P2","","RATE_IN_MBIT"); + params[Mcp_Dce_Tcp_G_P1] = MlxCfgParamParser(Mcp_Dce_Tcp_G_P1, "DCE_TCP_G_P1" + ,"Used to update the congestion estimator (alpha) once every dce_tcp_rtt microseconds. Default=64" + ,"NUM"); + params[Mcp_Dce_Tcp_G_P2] = MlxCfgParamParser(Mcp_Dce_Tcp_G_P2, "DCE_TCP_G_P2","","NUM"); + params[Mcp_Dce_Tcp_Rtt_P1] = MlxCfgParamParser(Mcp_Dce_Tcp_Rtt_P1, "DCE_TCP_RTT_P1" + ,"The time between updates of the alpha value, in microseconds. Default=2" + ,"USEC"); + params[Mcp_Dce_Tcp_Rtt_P2] = MlxCfgParamParser(Mcp_Dce_Tcp_Rtt_P2, "DCE_TCP_RTT_P2","","USEC"); + params[Mcp_Rate_Reduce_Monitor_Period_P1] = MlxCfgParamParser(Mcp_Rate_Reduce_Monitor_Period_P1, "RATE_REDUCE_MONITOR_PERIOD_P1" + ,"The minimum time between 2 consecutive rate reductions for a single flow. " + "Rate reduction will occur only if a CNP is received during the relevant time interval. Default=2." + ,"USEC"); + params[Mcp_Rate_Reduce_Monitor_Period_P2] = MlxCfgParamParser(Mcp_Rate_Reduce_Monitor_Period_P2, "RATE_REDUCE_MONITOR_PERIOD_P2","","USEC"); + params[Mcp_Initial_Alpha_Value_P1] = MlxCfgParamParser(Mcp_Initial_Alpha_Value_P1, "INITIAL_ALPHA_VALUE_P1" + ,"The initial value of alpha to use when receiving the first CNP for a flow. " + "Expressed in a fixed point fraction of 2^10." + ,"NUM"); + params[Mcp_Initial_Alpha_Value_P2] = MlxCfgParamParser(Mcp_Initial_Alpha_Value_P2, "INITIAL_ALPHA_VALUE_P2","","NUM"); + params[Mcp_Min_Time_Between_Cnps_P1] = MlxCfgParamParser(Mcp_Min_Time_Between_Cnps_P1, "MIN_TIME_BETWEEN_CNPS_P1" + ,"Minimum time between sending cnps from the port, in microseconds. Default=0" + ,"USEC"); + params[Mcp_Min_Time_Between_Cnps_P2] = MlxCfgParamParser(Mcp_Min_Time_Between_Cnps_P2, "MIN_TIME_BETWEEN_CNPS_P2","","USEC"); + params[Mcp_Cnp_Dscp_P1] = MlxCfgParamParser(Mcp_Cnp_Dscp_P1, "CNP_DSCP_P1" + ,"The DiffServ Code Point of the generated CNP for this port. Default=0" + ,"0..7"); + params[Mcp_Cnp_Dscp_P2] = MlxCfgParamParser(Mcp_Cnp_Dscp_P2, "CNP_DSCP_P2","","0..7"); + params[Mcp_Cnp_802p_Prio_P1] = MlxCfgParamParser(Mcp_Cnp_802p_Prio_P1, "CNP_802P_PRIO_P1" + ,"The 802.1p priority value of the generated CNP for this port. Default=7" + ,"NUM"); + params[Mcp_Cnp_802p_Prio_P2] = MlxCfgParamParser(Mcp_Cnp_802p_Prio_P2, "CNP_802P_PRIO_P2","","NUM"); + return MlxCfgInfo("RoCE Congestion Control ECN", "", params); +} + +MlxCfgInfo MlxCfgAllInfo::createRoCEV1_5NextProtocol() +{ + map params; + + //RoCE V1.5 next protocol + params[Mcp_RoCE_Next_Protocol] = MlxCfgParamParser(Mcp_RoCE_Next_Protocol, "ROCE_NEXT_PROTOCOL", + "The next protocol value set in the IPv4/IPv6 packets for RoCE v1.5. The default is 0xFE.", "0..255"); + + return MlxCfgInfo("RoCE V1.5 next protocol", "", params); +} + +MlxCfgInfo MlxCfgAllInfo::createRoCECongestionControlParameters() +{ + map paramMap; + map params; + + //RoCE Congestion Control Parameters + paramMap["ECN"] = 0; + paramMap["QCN"] = 1; + params[Mcp_RoCE_CC_Algorithm_P1] = MlxCfgParamParser(Mcp_RoCE_CC_Algorithm_P1, "ROCE_CC_ALGORITHM_P1", "Congestion control algorithm.", paramMap); + params[Mcp_RoCE_CC_Algorithm_P2] = MlxCfgParamParser(Mcp_RoCE_CC_Algorithm_P2, "ROCE_CC_ALGORITHM_P2", "", paramMap); + params[Mcp_RoCE_CC_Prio_Mask_P1] = MlxCfgParamParser(Mcp_RoCE_CC_Prio_Mask_P1, "ROCE_CC_PRIO_MASK_P1", "Per priority enable disable bitmask. default 0", "0..255"); + params[Mcp_RoCE_CC_Prio_Mask_P2] = MlxCfgParamParser(Mcp_RoCE_CC_Prio_Mask_P2, "ROCE_CC_PRIO_MASK_P2", "", "0..255"); + return MlxCfgInfo("RoCE Congestion Control Parameters", "", params); +} + +MlxCfgInfo MlxCfgAllInfo::createVPISettings() +{ + map paramMap; + map params; + + //VPI Settings + paramMap["IB"] = 1; + paramMap["ETH"] = 2; + paramMap["VPI"] = 3; + params[Mcp_Link_Type_P1] = MlxCfgParamParser(Mcp_Link_Type_P1, "LINK_TYPE_P1", "", paramMap); + params[Mcp_Link_Type_P2] = MlxCfgParamParser(Mcp_Link_Type_P2, "LINK_TYPE_P2", "", paramMap); + return MlxCfgInfo("VPI Settings", "Control network link type", params); +} + +MlxCfgInfo MlxCfgAllInfo::createWakeOnLAN() +{ + map paramMap; + map params; + + //Wake On LAN + paramMap["True"] = 1; + paramMap["False"] = 0; + params[Mcp_Wol_Magic_En] = MlxCfgParamParser(Mcp_Wol_Magic_En, "WOL_MAGIC_EN", "5th generation devices only (per physical function)", paramMap); + params[Mcp_Wol_Magic_En_P1] = MlxCfgParamParser(Mcp_Wol_Magic_En_P1, "WOL_MAGIC_EN_P1", "enable wake on magic packet(per port.)", paramMap); + params[Mcp_Wol_Magic_En_P2] = MlxCfgParamParser(Mcp_Wol_Magic_En_P2, "WOL_MAGIC_EN_P2", "4th generation devices only", paramMap); + return MlxCfgInfo("Wake On LAN", "", params); +} + +MlxCfgInfo MlxCfgAllInfo::createExternalPort() +{ + map paramMap; + map params; + + paramMap["False"] = 0; + paramMap["True"] = 1; + + //External ports + params[Mcp_Port_Owner] = MlxCfgParamParser(Mcp_Port_Owner, "PORT_OWNER", "If Set, Indicates this function of this host own the external physical port.", paramMap); + params[Mcp_Allow_Rd_Counters] = MlxCfgParamParser(Mcp_Allow_Rd_Counters, "ALLOW_RD_COUNTERS", "If Set, Indicates this function of this host allowed to rd counters of external physical port.", "0|1"); + return MlxCfgInfo("External Ports", "", params); +} + +MlxCfgInfo MlxCfgAllInfo::createBootSettingsExt() +{ + map paramMap; + map params; + + //Boot Settings Extras + paramMap["IPv4"] = 0; + paramMap["IPv6"] = 1; + paramMap["IPv4_IPv6"] = 2; + paramMap["IPv6_IPv4"] = 3; + params[Mcp_Boot_Settings_Ext_IP_Ver] = MlxCfgParamParser(Mcp_Boot_Settings_Ext_IP_Ver, "IP_VER", "Select which IP protocol version will be used by flexboot. 5th Generation only.", paramMap); + params[Mcp_Boot_Settings_Ext_IP_Ver_P1] = MlxCfgParamParser(Mcp_Boot_Settings_Ext_IP_Ver_P1, "IP_VER_P1", "Select which IP protocol version will be used by flexboot, 4th Generation (per port).", paramMap); + params[Mcp_Boot_Settings_Ext_IP_Ver_P2] = MlxCfgParamParser(Mcp_Boot_Settings_Ext_IP_Ver_P2, "IP_VER_P2", "", paramMap); + return MlxCfgInfo("Boot Settings Extras", "These parameters are relevant only for servers using legacy BIOS PXE boot (flexboot).", params); +} + +bool sortCfg(MlxCfgInfo a, MlxCfgInfo b) +{ + return a.getName() < b.getName(); +} + +MlxCfgAllInfo::MlxCfgAllInfo() +{ + //Initialize all the configurations + map paramMap; + map params; + + _allInfo.push_back(createPciSettings()); + _allInfo.push_back(createIBDynamicallyConnect()); + _allInfo.push_back(createInfinibandBootSettings()); + _allInfo.push_back(createInternalSettings()); + _allInfo.push_back(createPrebootBootSettings()); + _allInfo.push_back(createRoCECongestionControlECN()); + _allInfo.push_back(createRoCEV1_5NextProtocol()); + _allInfo.push_back(createRoCECongestionControlParameters()); + _allInfo.push_back(createVPISettings()); + _allInfo.push_back(createWakeOnLAN()); + _allInfo.push_back(createExternalPort()); + _allInfo.push_back(createBootSettingsExt()); + std::sort(_allInfo.begin(), _allInfo.end(), sortCfg); +} + +void MlxCfgAllInfo::printShortDesc() +{ + for(u_int32_t i = 0; i < _allInfo.size(); i++){ + _allInfo[i].printShortDesc(); + } +} + +void MlxCfgAllInfo::printLongDesc() +{ + for(u_int32_t i = 0; i < _allInfo.size(); i++){ + _allInfo[i].printLongDesc(); + } +} + +mlxCfgStatus MlxCfgAllInfo::getParamParser(mlxCfgParam p, MlxCfgParamParser& paramParser) +{ + for(u_int32_t j = 0; j < _allInfo.size(); j++){ + if(_allInfo[j].getParamParser(p, paramParser) == MLX_CFG_OK) { + return MLX_CFG_OK; + } + } + return MLX_CFG_ERROR; +} + +mlxCfgStatus MlxCfgAllInfo::parseParam(string tag, string strVal, u_int32_t& val, mlxCfgParam& param) +{ + MlxCfgParamParser paramParser; + for(u_int32_t j = 0; j < _allInfo.size(); j++){ + if(_allInfo[j].getParamParser(tag, paramParser) == MLX_CFG_OK) { + param = paramParser.getParam(); + return (paramParser.parseUserInput(strVal, val)) ? + MLX_CFG_ERROR : + MLX_CFG_OK; + } + } + return MLX_CFG_ERROR; +} diff --git a/mlxconfig/mlxcfg_status.h b/mlxconfig/mlxcfg_status.h index ba50807..0d49143 100644 --- a/mlxconfig/mlxcfg_status.h +++ b/mlxconfig/mlxcfg_status.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -28,8 +29,6 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - * Version: $Id$ - * */ #ifndef MLXCFG_STATUS_H_ diff --git a/mlxconfig/mlxcfg_ui.cpp b/mlxconfig/mlxcfg_ui.cpp index f78132a..1e86d53 100644 --- a/mlxconfig/mlxcfg_ui.cpp +++ b/mlxconfig/mlxcfg_ui.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -28,8 +29,6 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - * Version: $Id$ - * */ #include @@ -127,6 +126,8 @@ void initHandler() // TODO: adrianc: change to map std::string MlxCfgParams::param2str[Mcp_Last]= {"SRIOV_EN", "NUM_OF_VFS", "FPP_EN", + "PF_LOG_BAR_SIZE", "VF_LOG_BAR_SIZE", + "NUM_PF_MSIX", "NUM_VF_MSIX", "WOL_MAGIC_EN_P1", "WOL_MAGIC_EN_P2", "WOL_MAGIC_EN", "LINK_TYPE_P1", "LINK_TYPE_P2", @@ -134,7 +135,6 @@ std::string MlxCfgParams::param2str[Mcp_Last]= {"SRIOV_EN", "NUM_OF_VFS", "FPP_E "INT_LOG_MAX_PAYLOAD_SIZE", "BOOT_PKEY_P1", "BOOT_PKEY_P2", "LOG_DCR_HASH_TABLE_SIZE", "DCR_LIFO_SIZE", - "PORT_BOOT_STATE_P1", "PORT_BOOT_STATE_P2", "ROCE_NEXT_PROTOCOL", "ROCE_CC_ALGORITHM_P1", "ROCE_CC_PRIO_MASK_P1", "ROCE_CC_ALGORITHM_P2", "ROCE_CC_PRIO_MASK_P2", "CLAMP_TGT_RATE_P1", "CLAMP_TGT_RATE_AFTER_TIME_INC_P1", "RPG_TIME_RESET_P1", @@ -150,6 +150,7 @@ std::string MlxCfgParams::param2str[Mcp_Last]= {"SRIOV_EN", "NUM_OF_VFS", "FPP_E "INITIAL_ALPHA_VALUE_P2", "MIN_TIME_BETWEEN_CNPS_P2", "CNP_DSCP_P2", "CNP_802P_PRIO_P2", "BOOT_OPTION_ROM_EN_P1", "BOOT_VLAN_EN_P1", "BOOT_RETRY_CNT_P1", "LEGACY_BOOT_PROTOCOL_P1", "BOOT_VLAN_P1", "BOOT_OPTION_ROM_EN_P2", "BOOT_VLAN_EN_P2", "BOOT_RETRY_CNT_P2", "LEGACY_BOOT_PROTOCOL_P2", "BOOT_VLAN_P2", + "PORT_OWNER", "ALLOW_RD_COUNTERS", "IP_VER", "IP_VER_P1", "IP_VER_P2" }; u_int32_t MlxCfgParams::getParamVal(mlxCfgParam p) @@ -252,25 +253,47 @@ mlxCfgStatus MlxCfg::queryDevsCfg() return shouldFail? MLX_CFG_ERROR : MLX_CFG_OK; } -static void printParam(u_int32_t param) +static void printParam(string param, u_int32_t val) { - if (param == MLXCFG_UNKNOWN) { + if (val == MLXCFG_UNKNOWN) { printf("%-16s", "N/A"); } else { - printf("%-16u", param); + if(param == "") { + printf("%-16d", val); + } else { + stringstream convert; + convert << val; + param += "(" + convert.str() + ")"; + printf("%-16s", param.c_str()); + } } return; } -static void printOneParam(const char* name, u_int32_t currVal, bool printNewCfg=false, u_int32_t newVal= MLXCFG_UNKNOWN) +static void printOneParam(const char* name, u_int32_t currVal, string currStrVal, bool showDefault=false, u_int32_t defaultVal=MLXCFG_UNKNOWN, + string defaultStrVal="MLXCFG_UNKNOWN", bool printNewCfg=false, u_int32_t newVal=MLXCFG_UNKNOWN, string newStrVal= "MLXCFG_UNKNOWN") { printf(" %-36s", name); - printParam(currVal); + if (showDefault) { + printParam(defaultStrVal, defaultVal); + } + printParam(currStrVal, currVal); + if (showDefault && + currVal != defaultVal) { + printf("*"); + } if (printNewCfg) { if (newVal == MLXCFG_UNKNOWN) { - printParam(currVal); + printParam(currStrVal, currVal); } else { - printf("%-16u", newVal); + if(newStrVal == "") { + printf("%-16d", newVal); + } else { + stringstream convert; + convert << newVal; + newStrVal += "(" + convert.str() + ")"; + printf("%-16s", newStrVal.c_str()); + } } } printf("\n"); @@ -302,6 +325,7 @@ mlxCfgStatus MlxCfg::queryDevCfg(const char* dev,const char* pci, int devIndex, bool rc; bool failedToGetCfg = false; bool nothingSupported = true; + bool isParamsDiffer = false; (void) pci; // print opening printf("\nDevice #%d:\n", devIndex); @@ -320,17 +344,45 @@ mlxCfgStatus MlxCfg::queryDevCfg(const char* dev,const char* pci, int devIndex, } //print configuration Header - printf("%-16s%36s","Configurations:","Current"); + if (_mlxParams.showDefault) { + printf("%-16s%36s%16s","Configurations:","Default","Current"); + } else { + printf("%-16s%36s","Configurations:","Current"); + } if (printNewCfg) { printf(" %s", "New"); } printf("\n"); + bool defaultSupported = false; + if (_mlxParams.showDefault){ + if(ops.isDefaultSupported(defaultSupported)) { + return err(false, "Error when checked if Firmware supports querying default configurations or not."); + } else { + if(!defaultSupported){ + return err(false, "Firmware does not support querying default configurations"); + } + } + } + for (int p = (int)Mcp_Sriov_En ; p < (int)Mcp_Last; ++p) { + if (printNewCfg) { + // display only cfgs we wanted to set (can be done more efficient) + std::vector::iterator it; + for (it = _mlxParams.params.begin(); it != _mlxParams.params.end(); it++) { + if (it->first == (mlxCfgParam)p) { + break; + } + } + if (it == _mlxParams.params.end()) { + continue; + } + } if (!ops.supportsParam((mlxCfgParam)p)) { continue; } nothingSupported= false; + u_int32_t defaultParam = MLXCFG_UNKNOWN; u_int32_t currentParam = MLXCFG_UNKNOWN ; u_int32_t newParam = _mlxParams.getParamVal((mlxCfgParam)p); rc = ops.getCfg((mlxCfgParam)p, currentParam); @@ -338,11 +390,33 @@ mlxCfgStatus MlxCfg::queryDevCfg(const char* dev,const char* pci, int devIndex, failedToGetCfg = true; printf(" %-16s%-16s %s\n", MlxCfgParams::param2str[p].c_str(), "failed to get current configuration.",\ ops.err()); - err(false, "Failed to query device configuration"); + err(false, "Failed to query device current configuration"); } else { - printOneParam(MlxCfgParams::param2str[p].c_str(), currentParam, printNewCfg, newParam); + if (_mlxParams.showDefault) { + rc = ops.getCfg((mlxCfgParam)p, defaultParam, true); + if (rc) { + failedToGetCfg = true; + err(false, "Failed to query device default configuration"); + } else { + isParamsDiffer |= (defaultParam != currentParam); + } + } + MlxCfgParamParser paramParser; + if(_allInfo.getParamParser((mlxCfgParam)p, paramParser) == MLX_CFG_OK){ + string defaultParamStr = paramParser.getStrVal(defaultParam); + string currentParamStr = paramParser.getStrVal(currentParam); + string newParamStr = paramParser.getStrVal(newParam); + printOneParam(MlxCfgParams::param2str[p].c_str(), currentParam, currentParamStr, _mlxParams.showDefault, + defaultParam, defaultParamStr, printNewCfg, newParam, newParamStr); + } else { + failedToGetCfg = true; + err(false, "Internal Error"); + } } } + if(isParamsDiffer) { + printf("The '*' shows parameters with current value different from default value.\n"); + } if (nothingSupported) { err(false, "Device Doesn't support any configuration changes."); return MLX_CFG_ERROR_EXIT; @@ -461,7 +535,7 @@ mlxCfgStatus MlxCfg::clrDevSem() MlxCfgOps ops; bool rc; - printf("-W- Forcefully clearing device Semaphore(47)..."); + printf("-W- Forcefully clearing device Semaphore..."); rc = ops.open(_mlxParams.device.c_str(), true); if (rc) { diff --git a/mlxconfig/mlxcfg_ui.h b/mlxconfig/mlxcfg_ui.h index a83f2b1..d9cb452 100644 --- a/mlxconfig/mlxcfg_ui.h +++ b/mlxconfig/mlxcfg_ui.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2013 Mellanox Technologies Ltd. All rights reserved. +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -28,8 +29,6 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - * Version: $Id$ - * */ #ifndef MLXCFG_UI_H_ @@ -59,11 +58,100 @@ typedef enum { MLX_CFG_ERROR_EXIT } mlxCfgStatus; +using namespace std; + +class MlxCfgParamParser +{ +public: + MlxCfgParamParser(): _param(Mcp_Last), _name(), _desc(){} + MlxCfgParamParser(mlxCfgParam param, string name, string desc, map strMap) + : _param(param), _name(name), _desc(desc), _strMap(strMap){} + MlxCfgParamParser(mlxCfgParam param, string name, string desc, string allowedValues) : _param(param), + _name(name), _desc(desc), _allowedValues(allowedValues){} + + ~MlxCfgParamParser() {} + + mlxCfgStatus parseUserInput(string input, u_int32_t& val); + + void printShortDesc(); + void printLongDesc(); + + string getName() {return _name;} + mlxCfgParam getParam() {return _param;} + + string getStrVal(u_int32_t val); + +private: + mlxCfgParam _param; + string _name; //param name for example: LINK_TYPE_P1 + string _desc; //for example: 4th generation devices only + string _allowedValues; + map _strMap; //map strings to values, for example: {{'InfiniBand',1},{'Ethernet',2},{'VPI',3}} + + + void printShortDescAux(); + string getShortDescStrAux(); + void splitAndPrintDesc(string desc); + bool compareVal(string a, string b); + +}; + +class MlxCfgInfo +{ +public: + MlxCfgInfo(string name, string title, map params) : + _name(name), _title(title), _params(params){}; + + ~MlxCfgInfo() {} + + void printShortDesc(); + void printLongDesc(); + + mlxCfgStatus getParamParser(mlxCfgParam, MlxCfgParamParser&); + mlxCfgStatus getParamParser(string, MlxCfgParamParser&); + string getName() { return _name; } + +private: + string _name; //for example: VPI Settings + string _title; //for example: Control network link type + map _params; //for example: {{LINK_TYPE_P1,*},{LINK_TYPE_P2,*}} + vector getParamsMapValues(); +}; + +class MlxCfgAllInfo +{ +public: + MlxCfgAllInfo(); + + ~MlxCfgAllInfo() {} + + void printShortDesc(); + void printLongDesc(); + + mlxCfgStatus parseParam(string tag, string strval, u_int32_t& val, mlxCfgParam& param); + mlxCfgStatus getParamParser(mlxCfgParam p, MlxCfgParamParser& paramParser); + + vector _allInfo; + +private: + MlxCfgInfo createPciSettings(); + MlxCfgInfo createIBDynamicallyConnect(); + MlxCfgInfo createInfinibandBootSettings(); + MlxCfgInfo createInternalSettings(); + MlxCfgInfo createPrebootBootSettings(); + MlxCfgInfo createRoCECongestionControlECN(); + MlxCfgInfo createRoCEV1_5NextProtocol(); + MlxCfgInfo createRoCECongestionControlParameters(); + MlxCfgInfo createVPISettings(); + MlxCfgInfo createWakeOnLAN(); + MlxCfgInfo createExternalPort(); + MlxCfgInfo createBootSettingsExt(); +}; class MlxCfgParams { public: - MlxCfgParams() : device(), rawTlvFile(), cmd(Mc_UnknownCmd), yes(false), force(false) {} + MlxCfgParams() : device(), rawTlvFile(), cmd(Mc_UnknownCmd), yes(false), force(false), showDefault(false) {} ~MlxCfgParams() {} std::string device; @@ -73,6 +161,7 @@ public: std::vector params; static std::string param2str[Mcp_Last]; bool force;// ignore parameter checks + bool showDefault; u_int32_t getParamVal(mlxCfgParam p); }; @@ -81,13 +170,13 @@ public: class MlxCfg { public: - MlxCfg() : _mlxParams(), _errStr(){} + MlxCfg() : _mlxParams(), _errStr(), _allInfo(){} ~MlxCfg() {}; mlxCfgStatus execute(int argc, char* argv[]); private: // User interface and parsing methods - void printHelp(); + void printHelp(bool longDesc=false); void printVersion(); void printUsage(); mlxCfgStatus parseArgs(int argc, char* argv[]); @@ -120,6 +209,8 @@ private: // data members MlxCfgParams _mlxParams; std::string _errStr; + MlxCfgAllInfo _allInfo; + }; diff --git a/mlxfwops/lib/Makefile.am b/mlxfwops/lib/Makefile.am index 050c2fc..2c635ce 100755 --- a/mlxfwops/lib/Makefile.am +++ b/mlxfwops/lib/Makefile.am @@ -45,7 +45,7 @@ INCLUDES = -I$(srcdir) -I$(MTCR_INC_DIR) -I$(MFLASH_DIR) -I$(top_srcdir)/ext_lib MLXFWOPS_VERSION = 1 -AM_CXXFLAGS = -Wall -W -g -MP -MD -pipe -DNO_MFA_SUPPORT +AM_CXXFLAGS = -Wall -W -g -MP -MD -pipe -DNO_MFA_SUPPORT -DNO_OPEN_SSL noinst_LIBRARIES = libmlxfwops.a @@ -55,5 +55,6 @@ libmlxfwops_a_SOURCES = flint_base.cpp \ fs2_ops.cpp fs2_ops.h \ fs3_ops.cpp fs3_ops.h \ mlxfwops.cpp mlxfwops.h \ - mlxfwops_com.h mlxfwops.h fw_ops.h flint_base.h flint_io.h + mlxfwops_com.h mlxfwops.h fw_ops.h flint_base.h flint_io.h\ + aux_tlv_ops.h aux_tlv_ops.cpp diff --git a/mlxfwops/lib/aux_tlv_ops.cpp b/mlxfwops/lib/aux_tlv_ops.cpp new file mode 100644 index 0000000..a580c78 --- /dev/null +++ b/mlxfwops/lib/aux_tlv_ops.cpp @@ -0,0 +1,545 @@ +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include + +#include "flint_base.h" +#include "aux_tlv_ops.h" + +/* + * ImageTlvOps class implementation + */ + + +#define AUX_DATA_SIG_SIZE 0x10 +#define SIG3 0x080d1522 +#define SIG2 0x01020305 +#define SIG1 0x6548bc86 +#define SIG0 0x4155583a + +bool ImageTlvOps::test() +{ + printf("-I- ImageTlvOps Class test"); + u_int32_t data0[] = {0x12345678, 0xabcdef01, 0xab0dab10, 0xcafaba1a, 0x0cafee1e1, 0x12345678, 0x23456789, 0x3456789a}; + u_int32_t data1[] = {0x12345678, 0xabcdef01, 0xab0dab1, 0xcafaba1a, 0x0cafee1e1, 0x12345678, 0x23456789, 0x3456789a}; + u_int8_t data2[] = {1, 2, 3, 4, 5, 6 ,7 ,8, 9, 0xa}; + // run init + if (!init(true)) { + printf("-E- failed on init"); + } + // add all tlvs and update file + aux_tlv tlv; + memset(&tlv.hdr, 0x0, sizeof(tlv.hdr)); + tlv.hdr.header_type = 0; + tlv.hdr.type = 0; + tlv.hdr.length = 0x10; + tlv.data.resize(tlv.hdr.length); + memcpy(&tlv.data[0], data0, tlv.hdr.length); + addTLV(tlv); + + tlv.hdr.header_type = 1; + tlv.hdr.type = 0; + tlv.hdr.length = 0x3; + tlv.data.resize(tlv.hdr.length); + memcpy(&tlv.data[0], data1, tlv.hdr.length); + addTLV(tlv); + + tlv.hdr.header_type = 0; + tlv.hdr.type = 3; + tlv.hdr.length = 0xa; + tlv.data.resize(tlv.hdr.length); + memcpy(&tlv.data[0], data2, tlv.hdr.length); + addTLV(tlv); + + if (!updateFile()) { + printf("-E- failed to update file\n"); + } + removeTlv(3,0); + removeTlv(0,0); + removeTlv(0,1); + + if (!updateFile()) { + printf("-E- failed to update file\n"); + } + printf("-I- Done Successfully"); + + return true; +} + +Tlv_Status_t ImageTlvOps::getFileSize(FILE* fd, long int& fileSize) +{ + // Get the file size: + if (fseek(fd, 0, SEEK_END) < 0) { + fclose(fd); + return (Tlv_Status_t)errmsgWCode(TS_FAILED_TO_OPEN_FILE, "Can not get file size for \"%s\"", _fname); + } + fileSize = ftell(fd); + if (fileSize < 0) { + fclose(fd); + return (Tlv_Status_t)errmsgWCode(TS_FAILED_TO_OPEN_FILE, "Can not get file size for \"%s\"", _fname); + } + rewind(fd); + return TS_OK; +} + +Tlv_Status_t ImageTlvOps::init(u_int32_t startPos, bool force) +{ + if (!force && _initialized) { + return TS_OK; + } + long int fsize; + _tlvSectionFound = false; + _tlvSectionFilePos = 0; + _tlvVec.resize(0); + + if (_fname) { + _rawFileBuff.resize(0); + FILE* fd = fopen(_fname, "rb"); + if (!fd) { + return (Tlv_Status_t)errmsgWCode(TS_FAILED_TO_OPEN_FILE, "Failed to open file of reading"); + } + // get file size + if (getFileSize(fd, fsize)) { + return TS_FAILED_TO_OPEN_FILE; + } + // read the file + long int readCnt; + _rawFileBuff.resize(fsize); + if ((readCnt = fread(&_rawFileBuff[0], 1, fsize, fd)) != fsize) { + fclose(fd); + if (readCnt < 0) { + return (Tlv_Status_t)errmsgWCode(TS_FAILED_TO_READ_FILE, "Read error on file \"%s\"",_fname); + } else { + return (Tlv_Status_t)errmsgWCode(TS_FAILED_TO_READ_FILE, "Read error on file \"%s\" - read only %ld bytes (from %ld)", + _fname, readCnt, (unsigned long)fsize); + } + } + fclose(fd); + } + fsize = _rawFileBuff.size(); + for (long int i = startPos; i < fsize; i += 4) { + std::vector possibleSig(_rawFileBuff.begin() + i , _rawFileBuff.begin() + i + 16); + TOCPUn(&possibleSig[0], 4); + if (checkSig(possibleSig)) { + _tlvSectionFound = true; + _tlvSectionFilePos = i; + } + } + if (_tlvSectionFound) { + // parse TLVs + return parseTlvs(); + } + _initialized = true; + return TS_OK; + +} + +Tlv_Status_t ImageTlvOps::resetTlvSection() +{ + if (_tlvSectionFound) { + _tlvVec.resize(0); + return updateFile(); + } + return TS_OK; +} + +void ImageTlvOps::addTLV(aux_tlv& tlv) +{ + // remove it if its present then push back + removeTlv(tlv.hdr.type, tlv.hdr.header_type); + // calc tlv CRC + tlv.hdr.crc = calcTlvCrc(tlv); + _tlvVec.push_back(tlv); + return; +} + +Tlv_Status_t ImageTlvOps::removeTlv(u_int16_t tlvType, u_int8_t headerType) +{ + for(std::vector::iterator it = _tlvVec.begin(); it != _tlvVec.end(); it++) { + if (it->hdr.header_type == headerType && it->hdr.type == tlvType) { + _tlvVec.erase(it); + return TS_OK; + } + } + return (Tlv_Status_t)errmsgWCode(TS_TLV_NOT_FOUND, "TLV(0x%x) with type(0x%x) not found", tlvType, headerType); +} + +Tlv_Status_t ImageTlvOps::queryTlv(u_int16_t tlvType, u_int8_t headerType, aux_tlv& tlv) +{ + for(std::vector::iterator it = _tlvVec.begin(); it != _tlvVec.end(); it++) { + if (it->hdr.header_type == headerType && it->hdr.type == tlvType) { + tlv = *it; + return TS_OK; + } + } + return (Tlv_Status_t)errmsgWCode(TS_TLV_NOT_FOUND, "TLV(0x%x) with type(0x%x) not found", tlvType, headerType); +} + +std::vector ImageTlvOps::queryTlvs() +{ + return _tlvVec; +} + +bool ImageTlvOps::checkSig(std::vector& signature) +{ + u_int32_t * sigPtr = (u_int32_t*)&signature[0]; + return *(sigPtr + 3) == SIG3 && \ + *(sigPtr + 2) == SIG2 && \ + *(sigPtr + 1) == SIG1 && \ + *(sigPtr) == SIG0; +} + +Tlv_Status_t ImageTlvOps::updateFile() +{ + std::vector signature(4, 0x0); + signature[3] = SIG3; + signature[2] = SIG2; + signature[1] = SIG1; + signature[0] = SIG0; + + if (_readOnly) { + return (Tlv_Status_t)errmsgWCode(TS_READ_ONLY_MODE, "Image TLV object is read only."); + } + if (!_tlvSectionFound && _tlvVec.size() == 0) { // no tlv section and no tlvs + // nothing to do + return TS_OK; + } else if (_tlvSectionFound && _tlvVec.size() == 0) { // tlv section without tlvs + // remove signature from file + _rawFileBuff.resize(_tlvSectionFilePos); + _tlvSectionFilePos = 0; + _tlvSectionFound = false; + } else if (!_tlvSectionFound && _tlvVec.size() != 0) { // no tlv section with tlvs + // add signature and TLVs + TOCPUn(&signature[0], 4); + _tlvSectionFound = true; + _tlvSectionFilePos = _rawFileBuff.size(); + for (unsigned int i =0; i < signature.size() << 2 ; i++) { + _rawFileBuff.push_back(*(((u_int8_t*)&signature[0]) + i)); + } + pushTlvsToRawBuffer(); + } else { + _rawFileBuff.resize(_tlvSectionFilePos + AUX_DATA_SIG_SIZE); + pushTlvsToRawBuffer(); + } + return writeBufferAsFile(); +} + +Tlv_Status_t ImageTlvOps::writeBufferAsFile() +{ + if (_tlvVec.size()) { + // push end marker + std::vector endMarker(TOOLS_OPEN_AUX_TLV_HEADER_SIZE, 0xff); + _rawFileBuff.insert(_rawFileBuff.end(), endMarker.begin(), endMarker.end()); + } + // TODO: check the need to : write the file under a different name then delete original and rename + FILE* fd = fopen(_fname, "wb"); + if (!fd) { + return (Tlv_Status_t)errmsgWCode(TS_FAILED_TO_OPEN_FILE, "Failed to open file for writing: %s", _fname); + } + int cnt = fwrite(&_rawFileBuff[0], 1, _rawFileBuff.size(), fd); + fclose(fd); + if (cnt != (int)_rawFileBuff.size()) { + return (Tlv_Status_t)errmsgWCode(TS_FAILED_TO_WRITE_FILE, "Failed to re-write file: %s", _fname); + } + return TS_OK; +} + +void ImageTlvOps::pushTlvsToRawBuffer() +{ + // called from updateFile. assuming raw data already contains signature. + if (_tlvVec.size() != 0) { + std::vector tlvBuffer; + tlvBuffer.resize(0); + for (std::vector::iterator it = _tlvVec.begin(); it != _tlvVec.end(); it ++) { + // push header + std::vector hdrBuf(TOOLS_OPEN_AUX_TLV_HEADER_SIZE, 0x0); + tools_open_aux_tlv_header_pack(&(it->hdr), &hdrBuf[0]); + tlvBuffer.insert(tlvBuffer.end(), hdrBuf.begin(), hdrBuf.end()); + // push data + tlvBuffer.insert(tlvBuffer.end(), it->data.begin(), it->data.end()); + // pad to DW aligned address with 0x0 if needed + if (it->data.size() & 3) { + std::vector padding(4 - (it->data.size() & 3), 0x0); + tlvBuffer.insert(tlvBuffer.end(), padding.begin(), padding.end()); + } + } + // update raw buffer and write the file + _rawFileBuff.insert(_rawFileBuff.end(), tlvBuffer.begin(), tlvBuffer.end()); + } + return; +} + +Tlv_Status_t ImageTlvOps::parseTlvs() +{ + if(!_tlvSectionFound) { + // nothing to parse + return TS_OK; + } + + if (!_tlvSectionFilePos) { + return (Tlv_Status_t)errmsgWCode(TS_GENERAL_ERROR, "Internal Error. unexpected file position."); + } + + // while not end TLV or EOF + u_int32_t nextTlvOffs = _tlvSectionFilePos + AUX_DATA_SIG_SIZE; + u_int32_t bufferSize = (u_int32_t)_rawFileBuff.size(); + do { + aux_tlv tlv; + // read next TLV header + if (nextTlvOffs == bufferSize) { + return (Tlv_Status_t)errmsgWCode(TS_TLV_PARSE_ERROR, "failed to parse TLVs : expected to find End marker before end of file"); + } + if (nextTlvOffs + TOOLS_OPEN_AUX_TLV_HEADER_SIZE > bufferSize) { + return (Tlv_Status_t)errmsgWCode(TS_TLV_PARSE_ERROR, "failed to parse TLVs : unexpected End of extended data section"); + } + u_int8_t hdrBuf[TOOLS_OPEN_AUX_TLV_HEADER_SIZE] = {0}; + memcpy(hdrBuf, &_rawFileBuff[nextTlvOffs], TOOLS_OPEN_AUX_TLV_HEADER_SIZE); + tools_open_aux_tlv_header_unpack(&tlv.hdr, hdrBuf); + // check for END TLV + if (tlv.hdr.header_type == 0xf && tlv.hdr.type == 0xff) { + break; + } + // read next TLV data + if (nextTlvOffs + TOOLS_OPEN_AUX_TLV_HEADER_SIZE + tlv.hdr.length > bufferSize) { + return (Tlv_Status_t)errmsgWCode(TS_TLV_PARSE_ERROR, "failed to parse TLVs : unexpected End of extended data section"); + } + u_int32_t vecSizeDwAligned = ((tlv.hdr.length + 3) /4) * 4; + tlv.data.resize(tlv.hdr.length); + memset(&tlv.data[0], 0x0, tlv.data.size()); + memcpy(&tlv.data[0], &_rawFileBuff[nextTlvOffs + TOOLS_OPEN_AUX_TLV_HEADER_SIZE], tlv.hdr.length); + if (tlv.hdr.header_type == 0x0) { // only know how to deal with header of type 0x0 + // check CRC and store + if (tlv.hdr.crc != calcTlvCrc(tlv)) { + return (Tlv_Status_t)errmsgWCode(TS_TLV_CRC_MISSMATCH, "Failed to parse TLVs, CRC missmatch for TLV type 0x%x", tlv.hdr.type); + } + // store it + _tlvVec.push_back(tlv); + } + // next TLV is located at the first DW aligned offset after the current TLV + nextTlvOffs += (TOOLS_OPEN_AUX_TLV_HEADER_SIZE + vecSizeDwAligned); + } while (true); + return TS_OK; +} + +u_int16_t ImageTlvOps::calcTlvCrc(aux_tlv& tlv) +{ + struct tools_open_aux_tlv_header tempHdr; + u_int32_t dataSize = (u_int32_t)tlv.data.size(); + Crc16 crc; + tempHdr = tlv.hdr; + tempHdr.crc = 0xffff; + u_int8_t tlvHdrBuf[TOOLS_OPEN_AUX_TLV_HEADER_SIZE] = {0}; + tools_open_aux_tlv_header_pack(&tempHdr, tlvHdrBuf); + // restore CPU endianess + TOCPUn(tlvHdrBuf, TOOLS_OPEN_AUX_TLV_HEADER_SIZE >> 2); + // calc crc on modified header + CRCn(crc, tlvHdrBuf, TOOLS_OPEN_AUX_TLV_HEADER_SIZE >> 2); + // calc crc on the data + TOCPUn(&tlv.data[0], dataSize >> 2); + CRCn(crc, &tlv.data[0], dataSize >> 2); + // we might have missed the last DW as it need not be DW aligned + u_int32_t remaining = dataSize & 3; + if (remaining) { + u_int32_t lastDw = 0x0; + memcpy(&lastDw, &tlv.data[dataSize - remaining], remaining); + crc << lastDw; + } + TOCPUn(&tlv.data[0], dataSize >> 2); + crc.finish(); + return crc.get(); +} + + +/* + * TimeStampIFC class implementation + */ + + +TimeStampIFC* TimeStampIFC::getIFC(mfile* mf) +{ + return new DeviceTimeStamp(mf); +} + +TimeStampIFC* TimeStampIFC::getIFC(const char* fname, u_int32_t lastFwAddr) +{ + return new ImageTimeStamp(fname, lastFwAddr); +} + +TimeStampIFC* TimeStampIFC::getIFC(u_int8_t* buff, unsigned int size, u_int32_t lastFwAddr) +{ + return new ImageTimeStamp(buff, size, lastFwAddr); +} + + +/* + * ImageTimeStamp class implementation + */ + +Tlv_Status_t ImageTimeStamp::init() +{ + Tlv_Status_t rc = _imgTlvOps.init(_lastFwAddr); + return rc ? (Tlv_Status_t)errmsgWCode(rc, "%s", _imgTlvOps.err()) : TS_OK; +}; + +Tlv_Status_t ImageTimeStamp::setTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer) +{ + aux_tlv tsTlv; + memset(&tsTlv, 0, sizeof(tsTlv)); + tsTlv.hdr.header_type = ImageTimeStamp::TS_Header_Type; + tsTlv.hdr.type = ImageTimeStamp::TS_Tlv_Type; + tsTlv.hdr.length = TOOLS_OPEN_TIMESTAMP_SIZE; + tsTlv.data.resize(tsTlv.hdr.length); + memset(&tsTlv.data[0], 0, tsTlv.hdr.length); + struct tools_open_timestamp tsData; + tsData.fw_version = fwVer; + tsData.ts_entry = timestamp; + tools_open_timestamp_pack(&tsData, &tsTlv.data[0]); + _imgTlvOps.addTLV(tsTlv); + bool rc = _imgTlvOps.updateFile(); + if (!rc) { + return (Tlv_Status_t)errmsgWCode(rc, "%s", _imgTlvOps.err()); + } + return TS_OK; +} + +Tlv_Status_t ImageTimeStamp::queryTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer, bool queryRunning) +{ + (void)queryRunning; + aux_tlv tsTlv; + struct tools_open_timestamp tsData; + memset(&tsTlv, 0, sizeof(tsTlv)); + Tlv_Status_t rc = _imgTlvOps.queryTlv(ImageTimeStamp::TS_Tlv_Type, ImageTimeStamp::TS_Header_Type, tsTlv); + if (rc) { + return (Tlv_Status_t)errmsgWCode(rc, "Failed to query timestamp, Data not found in image"); + } + if (tsTlv.hdr.major_version != 0) { + return (Tlv_Status_t)errmsgWCode(TS_UNKNOWN_TLV_VERSION, "Failed to query timestamp, Unknown timestamp TLV version"); + } + tools_open_timestamp_unpack(&tsData, &tsTlv.data[0]); + timestamp = tsData.ts_entry; + fwVer = tsData.fw_version; + return TS_OK; +} +Tlv_Status_t ImageTimeStamp::resetTimeStamp() +{ + Tlv_Status_t rc = _imgTlvOps.removeTlv(ImageTimeStamp::TS_Tlv_Type, ImageTimeStamp::TS_Header_Type); + if (rc == TS_OK) { + Tlv_Status_t rc = _imgTlvOps.updateFile(); + if (!rc) { + return (Tlv_Status_t)errmsgWCode(rc, "Failed to reset Timestamp on image, %s", _imgTlvOps.err()); + } + } + return TS_OK; +} + +/* + * DeviceTimeStamp class implementation + */ + +Tlv_Status_t DeviceTimeStamp::init() +{ + int rc ; + // attempt to get running FW TS + struct tools_open_mvts mvts; + memset(&mvts, 0, sizeof(mvts)); + mvts.running_flag = 1; + rc = reg_access_mvts(_mf, REG_ACCESS_METHOD_GET, &mvts); + if (rc == ME_OK || rc == ME_REG_ACCESS_BAD_CONFIG) { + return TS_OK; + } + return (Tlv_Status_t)errmsgWCode(TS_TIMESTAMPING_NOT_SUPPORTED, "Time stamping not supported by FW"); +} + + +Tlv_Status_t DeviceTimeStamp::setTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer) +{ + struct tools_open_mvts mvts; + memset(&mvts, 0, sizeof(mvts)); + mvts.timestamp.fw_version = fwVer; + mvts.timestamp.ts_entry = timestamp; + int rc = reg_access_mvts(_mf, REG_ACCESS_METHOD_SET, &mvts); + rc = (int)convertRc((MError)rc, REG_ACCESS_METHOD_SET); + if (rc) { + return (Tlv_Status_t)errmsgWCode(rc, "Failed to set timestamp on device, %s", err()); + } + return TS_OK; +} + + +Tlv_Status_t DeviceTimeStamp::queryTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer, bool queryRunning) +{ + struct tools_open_mvts mvts; + memset(&mvts, 0, sizeof(mvts)); + mvts.running_flag = queryRunning; + int rc = reg_access_mvts(_mf, REG_ACCESS_METHOD_GET, &mvts); + rc = (int)convertRc((MError)rc, REG_ACCESS_METHOD_GET); + if (rc) { + return (Tlv_Status_t)errmsgWCode(rc, "Failed to query %s timestamp on device, %s\n", queryRunning ? "current" : "next", err()); + } + // if timestamp and fw ver are zero entry is invalid + struct tools_open_timestamp timestampZeroes; + memset(×tampZeroes, 0x0, sizeof(timestampZeroes)); + if (!memcmp(&(mvts.timestamp), ×tampZeroes, sizeof(mvts.timestamp))) { + return (Tlv_Status_t)errmsgWCode(TS_NO_VALID_TIMESTAMP, "Failed to query %s timestamp, No valid timestamp found", queryRunning ? "current" : "next"); + } + fwVer = mvts.timestamp.fw_version; + timestamp = mvts.timestamp.ts_entry; + return TS_OK; +} + +Tlv_Status_t DeviceTimeStamp::resetTimeStamp() +{ + struct tools_open_mvts mvts; + memset(&mvts, 0, sizeof(mvts)); + mvts.clear_all_ts_flag = 1; + int rc = reg_access_mvts(_mf, REG_ACCESS_METHOD_SET, &mvts); + rc = (int)convertRc((MError)rc, REG_ACCESS_METHOD_SET); + if (rc) { // bad params means command not supported + return (Tlv_Status_t)errmsgWCode(rc, "Failed to reset timestamp on device, %s", rc == ME_REG_ACCESS_BAD_CONFIG ? "Bad configuration" : err()); + } + return TS_OK; +} + +inline Tlv_Status_t DeviceTimeStamp::convertRc(MError rc, int regMethod) +{ + if (rc == ME_OK) { + return TS_OK; + } + if (rc == ME_REG_ACCESS_BAD_PARAM || rc == ME_ICMD_OPERATIONAL_ERROR) { + return (Tlv_Status_t)errmsgWCode(TS_TIMESTAMPING_NOT_SUPPORTED, "Time stamping not supported by FW"); + } else if (rc == ME_REG_ACCESS_BAD_CONFIG) { + return (Tlv_Status_t)errmsgWCode(TS_NO_VALID_TIMESTAMP, regMethod == REG_ACCESS_METHOD_GET ? "No valid timestamp found" : "Timestamp is too old"); + } else if (rc == ME_ICMD_UNSUPPORTED_ICMD_VERSION) { + return(Tlv_Status_t)errmsgWCode(TS_UNSUPPORTED_ICMD_VERSION, "Unsupported ICMD version"); + } + return (Tlv_Status_t)errmsgWCode(TS_GENERAL_ERROR, "%s", reg_access_err2str((MError)rc)); +} diff --git a/mlxfwops/lib/aux_tlv_ops.h b/mlxfwops/lib/aux_tlv_ops.h new file mode 100644 index 0000000..4af02f5 --- /dev/null +++ b/mlxfwops/lib/aux_tlv_ops.h @@ -0,0 +1,165 @@ +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef AUX_TLV_OPS_H +#define AUX_TLV_OPS_H + +#include +#include +#include + +typedef enum { + TS_OK = 0, + TS_GENERAL_ERROR, + // device related errors + TS_TIMESTAMPING_NOT_SUPPORTED, + TS_NO_VALID_TIMESTAMP, + TS_OLD_TIMESTAMP, + TS_UNSUPPORTED_ICMD_VERSION, + // image related errors, + TS_TLV_CRC_MISSMATCH, + TS_TLV_PARSE_ERROR, + TS_NO_TLV_SECTION_FOUND, + TS_FAILED_TO_OPEN_FILE, + TS_FAILED_TO_WRITE_FILE, + TS_FAILED_TO_READ_FILE, + TS_TLV_NOT_FOUND, + TS_READ_ONLY_MODE, + TS_HANDLE_NOT_SUPPORTED, + TS_UNKNOWN_TLV_VERSION, +} Tlv_Status_t; + +typedef struct aux_tlv { + struct tools_open_aux_tlv_header hdr; + std::vector data; // data in big endian +} aux_tlv_t; + + +class ImageTlvOps : public ErrMsg +{ +public: + ImageTlvOps(const char* fname, bool readOnly=false) : ErrMsg() , _fname(fname), _tlvSectionFound(false), + _tlvSectionFilePos(0), _initialized(false), + _readOnly(readOnly){} + ImageTlvOps(u_int8_t* buf, unsigned int size) : ErrMsg() , _fname((const char*)NULL), + _tlvSectionFound(false), _tlvSectionFilePos(0), + _initialized(false), _readOnly(true) + { + if (!buf) { + // Adrianc: should not be reached, consider using exceptions + _rawFileBuff.resize(0); + } else { + _rawFileBuff.resize(size); + memcpy(&_rawFileBuff[0], buf, size); + } + } + ~ImageTlvOps() {} + + Tlv_Status_t init(u_int32_t startPos, bool force=false); + void addTLV(aux_tlv& tlv); + Tlv_Status_t removeTlv(u_int16_t tlvType, u_int8_t headerType=0); + std::vector queryTlvs(); + Tlv_Status_t queryTlv(u_int16_t tlvType, u_int8_t headerType, aux_tlv& tlv); + Tlv_Status_t resetTlvSection(); + Tlv_Status_t updateFile(); + bool test(); // test method +private: + void pushTlvsToRawBuffer(); + Tlv_Status_t getFileSize(FILE* fd, long int& fileSize); + Tlv_Status_t writeBufferAsFile(); + Tlv_Status_t parseTlvs(); + u_int16_t calcTlvCrc(aux_tlv& tlv); + bool checkSig(std::vector& signature); + + const char* _fname; + bool _tlvSectionFound; + u_int32_t _tlvSectionFilePos; + bool _initialized; + bool _readOnly; + std::vector _tlvVec; + std::vector _rawFileBuff; +}; + + +class TimeStampIFC : public ErrMsg +{ +public: + TimeStampIFC() : ErrMsg() {}; + virtual ~TimeStampIFC(){}; + static TimeStampIFC* getIFC(mfile* mf); + static TimeStampIFC* getIFC(const char* fname, u_int32_t lastFWAddr=0); + static TimeStampIFC* getIFC(u_int8_t* buff, unsigned int size,u_int32_t lastFwAddr=0); + virtual Tlv_Status_t init() {return TS_OK;}; + virtual Tlv_Status_t setTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer) = 0; + virtual Tlv_Status_t queryTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer, bool queryRunning=false) = 0; + virtual Tlv_Status_t resetTimeStamp() = 0; +}; + + +class ImageTimeStamp : public TimeStampIFC +{ +public: + ImageTimeStamp(const char* fname, u_int32_t lastFwAddr) : TimeStampIFC(), _lastFwAddr(lastFwAddr), _imgTlvOps(fname) {}; + ImageTimeStamp(u_int8_t* buf, unsigned int size, u_int32_t lastFwAddr) : TimeStampIFC(), _lastFwAddr(lastFwAddr), _imgTlvOps(buf, size) {}; + ~ImageTimeStamp() {}; + virtual Tlv_Status_t init(); + + virtual Tlv_Status_t setTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer); + virtual Tlv_Status_t queryTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer, bool queryRunning=false); + virtual Tlv_Status_t resetTimeStamp(); +private: + enum { + TS_Header_Type = 0x0, + TS_Tlv_Type = 0x1, + }; + u_int32_t _lastFwAddr; + ImageTlvOps _imgTlvOps; +}; + + +class DeviceTimeStamp : public TimeStampIFC +{ +public: + DeviceTimeStamp(mfile* mf) : TimeStampIFC(), _mf(mf) {}; + ~DeviceTimeStamp() {}; + virtual Tlv_Status_t init(); + + virtual Tlv_Status_t setTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer); + virtual Tlv_Status_t queryTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer, bool queryRunning=false); + virtual Tlv_Status_t resetTimeStamp(); +private: + inline Tlv_Status_t convertRc(MError rc, int regMethod ); + mfile* _mf; +}; + + +#endif diff --git a/mlxfwops/lib/flint_base.cpp b/mlxfwops/lib/flint_base.cpp index 9546574..2382145 100755 --- a/mlxfwops/lib/flint_base.cpp +++ b/mlxfwops/lib/flint_base.cpp @@ -211,6 +211,20 @@ bool ErrMsg::errmsgAdv(bool showAdv, const char *normalFmt, const char *AdvFmt, return false; } +int ErrMsg::errmsgWCode(int errorCode, const char *format, ...) { + va_list args; + + char* prev_err = _err; + + va_start(args, format); + _err = vprint(format, args); + va_end(args); + + delete[] prev_err; + _errCode = errorCode; + return errorCode; +} + //////////////////////////////////////////////////////////////////////// void Crc16::add(u_int32_t o) diff --git a/mlxfwops/lib/flint_base.h b/mlxfwops/lib/flint_base.h index 4c7f34a..0ffb019 100755 --- a/mlxfwops/lib/flint_base.h +++ b/mlxfwops/lib/flint_base.h @@ -187,20 +187,16 @@ namespace std {}; using namespace std; #define FS_DATA_OFF 0x28 #define SWITCHX_HW_ID 581 #define SWITCH_IB_HW_ID 583 -#define SPECTRUM_HW_ID 585 +#define SPECTRUM_HW_ID 585 +#define SWITCH_IB2_HW_ID 587 + #define CX4_HW_ID 521 #define CX4LX_HW_ID 523 +#define CX5_HW_ID 525 #define CX3_HW_ID 501 #define CX3_PRO_HW_ID 503 -#define CX_HW_ID 400 -#define IS_HW_ID 435 #define CONNECT_IB_HW_ID 511 -#define BRIDGEX_HW_ID 6100 -#define IS4_HW_ID 435 -#define INFINIHOST_HW_ID 23108 -#define INFINIHOST_III_EX_HW_ID 25208 -#define INFINIHOST_III_LX_HW_ID 25204 #define CONNECT_IB_SW_ID 4113 // FS3 defines @@ -421,6 +417,12 @@ protected: #endif ; + int errmsgWCode(int errorCode, const char *format, ...) +#ifdef __GNUC__ + __attribute__ ((format (printf, 3, 4))) +#endif + ; + private: char *_err; diff --git a/mlxfwops/lib/flint_io.cpp b/mlxfwops/lib/flint_io.cpp index 5cb77c5..5b27db0 100755 --- a/mlxfwops/lib/flint_io.cpp +++ b/mlxfwops/lib/flint_io.cpp @@ -217,7 +217,7 @@ bool Flash::open_com_checks(const char *device, int rc, bool force_lock) if (rc != MFE_OK) { if (rc == MFE_SEM_LOCKED) { - return errmsgAdv(_advErrors, "Can not obtain Flash semaphore (63).", "You can run \"flint -clear_semaphore -d \" to force semaphore unlock. See help for details."); + return errmsgAdv(_advErrors, "Can not obtain Flash semaphore.", "You can run \"flint -clear_semaphore -d \" to force semaphore unlock. See help for details."); } if (rc == MFE_LOCKED_CRSPACE) { _cr_space_locked = 1; @@ -237,6 +237,7 @@ bool Flash::open_com_checks(const char *device, int rc, bool force_lock) if (rc != MFE_OK) { return errmsg("Failed getting flash attributes for device %s: %s", device, mf_err2str(rc)); } + _curr_sector_size = _attr.sector_size; rc = mf_set_opt(_mfl, MFO_NO_VERIFY, _no_flash_verify? 1: 0); if (rc != MFE_OK) { @@ -244,10 +245,8 @@ bool Flash::open_com_checks(const char *device, int rc, bool force_lock) } - if (_attr.hw_dev_id == 435 || _attr.hw_dev_id == SWITCHX_HW_ID) { + if (_attr.hw_dev_id == SWITCHX_HW_ID) { _port_num = 0; - } else if (_attr.hw_dev_id == 25204 || _attr.hw_dev_id == 24204) { - _port_num = 1; } else { _port_num = 2; } @@ -255,15 +254,14 @@ bool Flash::open_com_checks(const char *device, int rc, bool force_lock) } bool Flash::set_no_flash_verify(bool val) { - - _no_flash_verify = val; - int rc; - if (_mfl) { - rc = mf_set_opt(_mfl, MFO_NO_VERIFY, val? 1: 0); - if (rc != MFE_OK) { - return errmsg("Failed setting no flash verify on device: %s", mf_err2str(rc)); - } - } + int rc; + if (_mfl) { + rc = mf_set_opt(_mfl, MFO_NO_VERIFY, val? 1: 0); + if (rc != MFE_OK) { + return errmsg("Failed setting no flash verify on device: %s", mf_err2str(rc)); + } + } + _no_flash_verify = val; return true; } @@ -420,12 +418,26 @@ bool Flash::write_phy(u_int32_t phy_addr, u_int32_t data) } bool Flash::write_phy(u_int32_t phy_addr, void* data, int cnt, bool noerase) +{ + // Avoid warning + (void)noerase; + NATIVE_PHY_ADDR_FUNC(write, (phy_addr, data, cnt)); +} + +bool Flash::read_modify_write_phy(u_int32_t phy_addr, void* data, int cnt, bool noerase) { // Avoid warning (void)noerase; NATIVE_PHY_ADDR_FUNC(write_with_erase, (phy_addr, data, cnt)); } +bool Flash::read_modify_write(u_int32_t phy_addr, void* data, int cnt, bool noerase) +{ + // Avoid warning + (void)noerase; + return write_with_erase(phy_addr, data, cnt); +} + bool Flash::erase_sector_phy (u_int32_t phy_addr) { NATIVE_PHY_ADDR_FUNC(erase_sector, (phy_addr)); @@ -438,7 +450,6 @@ bool Flash::write (u_int32_t addr, int cnt, bool noerase) { - // FIX: noerase = _no_erase || noerase; @@ -459,7 +470,7 @@ bool Flash::write (u_int32_t addr, } u_int8_t *p = (u_int8_t *)data; - u_int32_t sect_size = get_sector_size(); + u_int32_t sect_size = get_current_sector_size(); u_int32_t chunk_addr; u_int32_t chunk_size; @@ -544,8 +555,7 @@ bool Flash::write(u_int32_t addr, u_int32_t data) bool Flash::write_sector_with_erase(u_int32_t addr, void *data, int cnt) { - - u_int32_t sector_size = _attr.sector_size; + u_int32_t sector_size = get_current_sector_size(); u_int32_t sector_mask = ~(sector_size - 1); u_int32_t sector = addr & sector_mask; @@ -560,9 +570,8 @@ bool Flash::write_sector_with_erase(u_int32_t addr, void *data, int cnt) if (!read(sector, &buff[0] , sector_size)) { return false; } - if (!erase_sector(sector)) { - return false; + return false; } memcpy(&buff[word_in_sector], data, cnt); @@ -578,8 +587,9 @@ bool Flash::write_with_erase(u_int32_t addr, void *data, int cnt) u_int32_t currAddr = addr; u_int32_t alreadyWritten = 0; u_int32_t sizeUntillEndOfSector = 0; + u_int32_t sector_size = get_current_sector_size(); while (towrite > 0) { - sizeUntillEndOfSector = _attr.sector_size - (currAddr & (_attr.sector_size - 1)); + sizeUntillEndOfSector = sector_size - (currAddr & (sector_size - 1)); currSize = towrite > sizeUntillEndOfSector ? sizeUntillEndOfSector : towrite; if (!write_sector_with_erase(currAddr, ((u_int8_t*)data + alreadyWritten), currSize)) { return false; @@ -593,10 +603,15 @@ bool Flash::write_with_erase(u_int32_t addr, void *data, int cnt) bool Flash::erase_sector (u_int32_t addr) { int rc; - u_int32_t phys_addr = cont2phys(addr); mft_signal_set_handling(1); - rc = mf_erase_sector(_mfl, phys_addr); + if (_flash_working_mode == Flash::Fwm_4KB) { + rc = mf_erase_4k_sector(_mfl, phys_addr); + } else if (_flash_working_mode == Flash::Fwm_64KB) { + rc = mf_erase_64k_sector(_mfl, phys_addr); + } else { + rc = mf_erase(_mfl, phys_addr); + } deal_with_signal(); if (rc != MFE_OK) { if (rc == MFE_REG_ACCESS_RES_NOT_AVLBL || rc == MFE_REG_ACCESS_BAD_PARAM) { @@ -811,4 +826,39 @@ void Flash::deal_with_signal() return; } - +#define FLINT_ERASE_SIZE_HOOK "FLINT_ERASE_SIZE" +bool Flash::set_flash_working_mode(int mode) +{ + if (!_attr.support_sub_and_sector && mode != Flash::Fwm_Default) { + return errmsg("Changing Flash IO working mode not supported."); + } + // Verification Hook + if (_attr.support_sub_and_sector) { + char* flint_io_env = getenv(FLINT_ERASE_SIZE_HOOK); + if (flint_io_env) { + int num = strtoul(flint_io_env, (char**)NULL, 0); + if (num == 0x1000 || num == 0x10000) { + _curr_sector_size = (u_int32_t)num; + _flash_working_mode = _curr_sector_size == 0x1000 ? Flash::Fwm_4KB : Flash::Fwm_64KB; + _curr_sector = _curr_sector & ~(_curr_sector_size - 1); + return true; + } + } + } + // Verification Hook end + + if (mode == Flash::Fwm_Default) { + _curr_sector_size = _attr.sector_size; + _flash_working_mode = Flash::Fwm_Default; + } else if (mode == Flash::Fwm_4KB) { + _curr_sector_size = 0x1000; + _flash_working_mode = Flash::Fwm_4KB; + } else if (mode == Flash::Fwm_64KB) { + _curr_sector_size = 0x10000; + _flash_working_mode = Flash::Fwm_64KB; + } else { + return errmsg("Unknown Flash IO working mode: 0x%x", mode); + } + _curr_sector = _curr_sector & ~(_curr_sector_size - 1); + return true; +} diff --git a/mlxfwops/lib/flint_io.h b/mlxfwops/lib/flint_io.h index e4ff181..471a7dc 100755 --- a/mlxfwops/lib/flint_io.h +++ b/mlxfwops/lib/flint_io.h @@ -67,7 +67,7 @@ typedef struct ext_flash_attr { u_int32_t rev_id; char* type_str; // NULL if not available u_int32_t size; - u_int32_t sector_size; + u_int32_t sector_size; // minimal sec int block_write; int command_set; u_int8_t quad_en_support; @@ -225,8 +225,10 @@ public: _no_flash_verify(false), _ignore_cache_replacement(false), _curr_sector(0xffffffff), + _curr_sector_size(0), _port_num(0), - _cr_space_locked(0) + _cr_space_locked(0), + _flash_working_mode(Flash::Fwm_Default) { memset(&_attr, 0, sizeof(_attr)); } @@ -260,8 +262,9 @@ public: int len, bool verbose = false, const char* message = ""); - bool write_phy(u_int32_t phy_addr, void* data, int cnt, bool noerase = false); - bool write_phy(u_int32_t phy_addr, u_int32_t data); + bool write_phy(u_int32_t phy_addr, void* data, int cnt, bool noerase = false); // read modify write + bool read_modify_write_phy(u_int32_t phy_addr, void* data, int cnt, bool noerase = false); // read modify write + bool write_phy(u_int32_t phy_addr, u_int32_t data); // read modify write bool erase_sector_phy (u_int32_t phy_addr); bool update_boot_addr (u_int32_t boot_addr) @@ -270,7 +273,8 @@ public: // Flash Interface // - u_int32_t get_sector_size () {return _attr.sector_size;} + u_int32_t get_current_sector_size () {return _curr_sector_size;} + u_int32_t get_sector_size() {return _attr.sector_size;} u_int32_t get_size () {return _attr.size;} u_int32_t get_dev_id () {return _attr.hw_dev_id; } @@ -293,6 +297,8 @@ public: int cnt, bool noerase = false); + bool read_modify_write(u_int32_t phy_addr, void* data, int cnt, bool noerase=false); + virtual bool write (u_int32_t addr, u_int32_t data); @@ -307,13 +313,25 @@ public: bool set_attr(char *param_name, char *param_val_str); + bool flash_working_mode_supported() {return _attr.support_sub_and_sector;} + int get_flash_working_mode() {return _flash_working_mode;} + bool set_flash_working_mode(int mode=Flash::Fwm_Default); + bool is_flash_write_protected(); static void deal_with_signal(); + mfile* getMfileObj() {return mf_get_mfile(_mfl);} + enum { TRANS = 4096 }; + enum { + Fwm_Default = 0, + Fwm_4KB = 1, + Fwm_64KB = 2 + }; + bool open_com_checks(const char *device, int rc, bool force_lock); @@ -329,9 +347,7 @@ public: #define WP_SUBSEC_STR "SubSectors" #define WP_DISABLED_STR "Disabled" -#ifndef _MSC_VER protected: -#endif bool write_sector_with_erase(u_int32_t addr, void *data, int cnt); bool write_with_erase(u_int32_t addr, void *data, int cnt); @@ -342,8 +358,10 @@ protected: bool _ignore_cache_replacement; // for FS3 devices flash access. u_int32_t _curr_sector; + u_int32_t _curr_sector_size; // can work with both 4KB and 64KB sectors u_int32_t _port_num; u_int8_t _cr_space_locked; + int _flash_working_mode; }; #endif diff --git a/mlxfwops/lib/fs2_ops.cpp b/mlxfwops/lib/fs2_ops.cpp index c3151ad..5153330 100644 --- a/mlxfwops/lib/fs2_ops.cpp +++ b/mlxfwops/lib/fs2_ops.cpp @@ -31,8 +31,11 @@ */ +#if !defined(UEFI_BUILD) && !defined(NO_OPEN_SSL) +#include +#endif +#include #include "fs2_ops.h" -// #include "flint_ops.h" #define PRE_CRC_OUTPUT " " #define CRC_CHECK_OUTPUT CRC_CHECK_OLD")" @@ -743,6 +746,11 @@ bool Fs2Operations::Fs2IntQuery(bool readRom, bool isStripedImage) return false; } _fwImgInfo.ext_info.chip_type = getChipType(); + + // get running FW version + if (_ioAccess->is_flash() && _fwImgInfo.ext_info.chip_type != CT_UNKNOWN) { + getRunningFwVer(); + } return true; } @@ -758,6 +766,46 @@ bool Fs2Operations::FwQuery(fw_info_t *fwInfo, bool readRom, bool isStripedImage return true; } +#define CX3_FW_VER_CR_ADDR 0x1f064 +#define SX_FW_VER_CR_ADDR 0x60040 + +bool Fs2Operations::getRunningFwVer() +{ +#ifndef UEFI_BUILD + u_int32_t fwVerBaseAddr = 0x0; + u_int32_t mflags; + struct cibfw_FW_VERSION fwVer; + u_int8_t buff[CIBFW_FW_VERSION_SIZE] = {0}; + memset(&fwVer, 0, sizeof(fwVer)); + // make sure its not mellanox OS + if (mget_mdevs_flags(((Flash*)_ioAccess)->getMfileObj(), &mflags)) { + return errmsg("Failed to get device access type"); + } + if (mflags & MDEVS_MLNX_OS) { + return true; + } + switch (_fwImgInfo.ext_info.chip_type) { + case CT_CONNECTX: + fwVerBaseAddr = CX3_FW_VER_CR_ADDR; + break; + case CT_SWITCHX: + fwVerBaseAddr = SX_FW_VER_CR_ADDR; + break; + default: + return errmsg("Unsupported chip type."); + } + + if (mread_buffer(((Flash*)_ioAccess)->getMfileObj(), fwVerBaseAddr, buff, CIBFW_FW_VERSION_SIZE) != CIBFW_FW_VERSION_SIZE) { + return errmsg("Failed to extract FW version from device. CR_ERROR\n"); + } + cibfw_FW_VERSION_unpack(&fwVer, buff); + _fwImgInfo.ext_info.running_fw_ver[0] = fwVer.MAJOR; + _fwImgInfo.ext_info.running_fw_ver[1] = fwVer.MINOR; + _fwImgInfo.ext_info.running_fw_ver[2] = fwVer.SUBMINOR; +#endif + return true; +} + #define MY_MAX(a, b) ((a) > (b) ? (a) : (b)) #define CX_DFLT_SECTOR_SIZE 0x10000 #define SX_DFLT_SECTOR_SIZE 0x1000 @@ -772,7 +820,6 @@ u_int32_t Fs2Operations::getDefaultSectorSz() // an older mlxburn the fw_sector_size wount be available u_int32_t devid = _ioAccess->get_dev_id(); switch (devid) { - case CX_HW_ID: case CX3_HW_ID: case CX3_PRO_HW_ID: return CX_DFLT_SECTOR_SIZE; @@ -971,10 +1018,8 @@ bool Fs2Operations::Fs2FailSafeBurn(Fs2Operations &imageOps, bool Fs2Operations::preFS2PatchGUIDs(bool patch_macs, - bool patch_uids, bool user_guids, bool user_macs, - bool user_uids, guid_t new_guids[MAX_GUIDS], guid_t old_guids[MAX_GUIDS], guid_t **used_guids_p, @@ -987,95 +1032,63 @@ bool Fs2Operations::preFS2PatchGUIDs(bool patch_macs, // if only guids or only macs are specified by user, keep the other // as currently set of flash. This is in order to simplify transitions between // burning IB and ETH FW. - if (!patch_uids) { - if (old_guids && !user_guids) { - for (int i = 0; i < GUIDS; i++) { - new_guids[i] = old_guids[i]; - } + if (old_guids && !user_guids) { + for (int i = 0; i < GUIDS; i++) { + new_guids[i] = old_guids[i]; } + } - if (old_guids && !user_macs) { - for (int i = GUIDS; i < MAX_GUIDS; i++) { - new_guids[i] = old_guids[i]; - } + if (old_guids && !user_macs) { + for (int i = GUIDS; i < MAX_GUIDS; i++) { + new_guids[i] = old_guids[i]; } } *used_guids_p = new_guids; } used_guids = *used_guids_p; - if (!patch_uids) { - if (patch_macs) { - - // To ease upgrade from 4 GUIDS format to 4+2 format, or to move from IB to ETH, - // if macs are not - // explicitly set in flash, they are derived from the GUIDs according to - // Mellanox methodology - 48 bit MAC == 64 bit GUID without the middle 16 bits. - - if (old_guids && ((num_of_old_guids == 4) || - (num_of_old_guids == 6 && - (old_guids[GUIDS ].h & 0xffff) == 0xffff && - (old_guids[GUIDS ].l & 0xffffffff) == 0xffffffff && - (old_guids[GUIDS+1].h & 0xffff) == 0xffff && - (old_guids[GUIDS+1].l & 0xffffffff) == 0xffffffff))) { - for (int i = 0 ; i < MACS; i++) { - u_int64_t mac = old_guids[i+1].h >> 8; - mac <<= 24; - mac |= (old_guids[i+1].l & 0xffffff); - - old_guids[GUIDS+i].h = u_int32_t(mac >> 32); - old_guids[GUIDS+i].l = u_int32_t(mac & 0xffffffff); - - // printf("-D- Guid " GUID_FORMAT " to MAC "MAC_FORMAT"\n", old_guids[i+1].h, old_guids[i+1].l, old_guids[i+GUIDS].h,old_guids[i+GUIDS].l ); - } - } + if (patch_macs) { - guid_t* macs = &used_guids[4]; + // To ease upgrade from 4 GUIDS format to 4+2 format, or to move from IB to ETH, + // if macs are not + // explicitly set in flash, they are derived from the GUIDs according to + // Mellanox methodology - 48 bit MAC == 64 bit GUID without the middle 16 bits. - for (int i = 0 ; i < MACS ; i++) { - u_int64_t mac = (((u_int64_t)macs[i].h) << 32) | macs[i].l; - if (!_burnBlankGuids && !CheckMac(mac)) { - return errmsg("Bad mac (" MAC_FORMAT ") %s: %s. Please re-burn with a valid -mac flag value.", macs[i].h, - macs[i].l, - user_macs ? "given" : "found on flash", err()); - } + if (old_guids && ((num_of_old_guids == 4) || + (num_of_old_guids == 6 && + (old_guids[GUIDS ].h & 0xffff) == 0xffff && + (old_guids[GUIDS ].l & 0xffffffff) == 0xffffffff && + (old_guids[GUIDS+1].h & 0xffff) == 0xffff && + (old_guids[GUIDS+1].l & 0xffffffff) == 0xffffffff))) { + for (int i = 0 ; i < MACS; i++) { + u_int64_t mac = old_guids[i+1].h >> 8; + mac <<= 24; + mac |= (old_guids[i+1].l & 0xffffff); + old_guids[GUIDS+i].h = u_int32_t(mac >> 32); + old_guids[GUIDS+i].l = u_int32_t(mac & 0xffffffff); + + // printf("-D- Guid " GUID_FORMAT " to MAC "MAC_FORMAT"\n", old_guids[i+1].h, old_guids[i+1].l, old_guids[i+GUIDS].h,old_guids[i+GUIDS].l ); } } - } else { - if (!_burnBlankGuids) { - for (int i = 0; i < BX_SLICES_NUM; i++ ) { - if (CheckBxMacsFormat(used_guids, i, user_uids) == false) { - return false; - } + + guid_t* macs = &used_guids[4]; + + for (int i = 0 ; i < MACS ; i++) { + u_int64_t mac = (((u_int64_t)macs[i].h) << 32) | macs[i].l; + if (!_burnBlankGuids && !CheckMac(mac)) { + return errmsg("Bad mac (" MAC_FORMAT ") %s: %s. Please re-burn with a valid -mac flag value.", macs[i].h, + macs[i].l, + user_macs ? "given" : "found on flash", err()); } - } + } } - // Avoid warnings - user_uids = true; return true; } -bool Fs2Operations::CheckBxMacsFormat(guid_t* guids, int index, int user_uids) -{ - int base; - base = index * BX_SLICE_GUIDS + BI_IMACS; - for (int i = base; i < base + BX_MACS; i++) { - u_int64_t mac = (((u_int64_t)guids[i].h) << 32) | guids[i].l; - if (!CheckMac(mac)) { - return errmsg("Bad mac (" MAC_FORMAT ") %s: %s. Please re-burn with a valid MACs flag value.", guids[i].h, - guids[i].l, - user_uids ? "given" : "found on flash", err()); - - } - } - return true; -} - -//////////////////////////////////////////////////////////////////////// void Fs2Operations::patchGUIDsSection(u_int32_t *buf, u_int32_t ind, guid_t guids[MAX_GUIDS], int nguids) { u_int32_t new_buf[MAX_GUIDS*2] = {0}; @@ -1105,10 +1118,8 @@ void Fs2Operations::patchGUIDsSection(u_int32_t *buf, u_int32_t ind, guid_t guid bool Fs2Operations::patchGUIDs (Fs2Operations& imageOps, bool patch_macs, - bool patch_uids, bool user_guids, bool user_macs, - bool user_uids, guid_t new_guids[MAX_GUIDS], guid_t old_guids[MAX_GUIDS], u_int32_t num_of_old_guids) @@ -1117,17 +1128,13 @@ bool Fs2Operations::patchGUIDs (Fs2Operations& imageOps, u_int32_t *buf = ((FImage*)imageOps._ioAccess)->getBuf(); // Call common function - if (!preFS2PatchGUIDs(patch_macs, patch_uids, user_guids, user_macs, user_uids, new_guids, old_guids, &used_guids, num_of_old_guids)) { + if (!preFS2PatchGUIDs(patch_macs, user_guids, user_macs, new_guids, old_guids, &used_guids, num_of_old_guids)) { return false; } // Path GUIDs section if (imageOps._fs2ImgInfo.guidPtr) { patchGUIDsSection(buf, imageOps._fwImgInfo.imgStart + imageOps._fs2ImgInfo.guidPtr, used_guids, imageOps._fs2ImgInfo.ext_info.guid_num); } - - - // Avoid warnings - user_uids = true; return true; } @@ -1417,19 +1424,16 @@ bool Fs2Operations::Fs2Burn(Fs2Operations &imageOps, ExtBurnParams& burnParams) // Guids patch _burnBlankGuids = burnParams.blankGuids; - bool isGuidsSpecified = burnParams.userMacsSpecified || burnParams.userGuidsSpecified || - burnParams.userUidsSpecified; + bool isGuidsSpecified = burnParams.userMacsSpecified || burnParams.userGuidsSpecified; if (isGuidsSpecified) { // Get the GUIDS/MACsUIDs from the user input - bool isBridgeX = (_fwImgInfo.ext_info.chip_type == CT_BRIDGEX); - bool isMacAvailable = Fs2IsMacAvailable(); - if (!patchGUIDs(imageOps, isMacAvailable, isBridgeX, burnParams.userGuidsSpecified, burnParams.userMacsSpecified, burnParams.userUidsSpecified, + if (!patchGUIDs(imageOps, true, burnParams.userGuidsSpecified, burnParams.userMacsSpecified, (guid_t*)(&(burnParams.userUids[0])), _fs2ImgInfo.ext_info.guids, _fs2ImgInfo.ext_info.guid_num)) { return false; } } else if (!burnParams.useImageGuids) { // Get the GUIDS/MACsUIDs from the device - if (!patchGUIDs(imageOps, true, false, false, false, false, (guid_t*)NULL, + if (!patchGUIDs(imageOps, true, false, false, (guid_t*)NULL, _fs2ImgInfo.ext_info.guids, _fs2ImgInfo.ext_info.guid_num)) { return false; } @@ -1443,15 +1447,6 @@ bool Fs2Operations::Fs2Burn(Fs2Operations &imageOps, ExtBurnParams& burnParams) return Fs2FailSafeBurn(imageOps, !burnParams.burnFailsafe, "", burnParams.progressFunc); } - -bool Fs2Operations::Fs2IsMacAvailable() -{ - - if (_fwImgInfo.ext_info.chip_type == CT_IS4 ) { - return false; - } - return true; -} bool Fs2Operations::FwBurn(FwOperations *imageOps, u_int8_t forceVersion, ProgressCallBack progressFunc) { if (imageOps == NULL) { @@ -1735,9 +1730,8 @@ bool Fs2Operations::Fs2SetGuids(sg_params_t& sgParam, PrintCallBack callBackFunc // avoid compiler warrnings (void)callBackFunc; // - bool ib_dev, eth_dev, bx_dev; + bool ib_dev, eth_dev; // Get the FW types - bx_dev = _fwImgInfo.ext_info.chip_type == CT_BRIDGEX; SetDevFlags(_fwImgInfo.ext_info.chip_type, _fwImgInfo.ext_info.dev_type, FIT_FS2, ib_dev, eth_dev); guid_t* old_guids = _fwImgInfo.imageOk ? _fs2ImgInfo.ext_info.guids : (guid_t*)NULL; guid_t* used_guids; @@ -1747,7 +1741,7 @@ bool Fs2Operations::Fs2SetGuids(sg_params_t& sgParam, PrintCallBack callBackFunc //resize our user guids vector to MAX_GUIDS sgParam.userGuids.resize(MAX_GUIDS); - if (!preFS2PatchGUIDs(eth_dev, bx_dev, sgParam.guidsSpecified, sgParam.macsSpecified, sgParam.uidsSpecified, &sgParam.userGuids[0], + if (!preFS2PatchGUIDs(eth_dev, sgParam.guidsSpecified, sgParam.macsSpecified, &sgParam.userGuids[0], old_guids, &used_guids, _fs2ImgInfo.ext_info.guid_num)) { return false; } @@ -2018,6 +2012,7 @@ bool Fs2Operations::FwResetNvData() //_fs2ImgInfo.ext_info.config_sectors, _fs2ImgInfo.ext_info.config_pad, fwSectorSz,configBaseAddr, availFlashSize); //erase addresses : [configBaseAddr..AvailFlashSize] + ((Flash*)_ioAccess)->set_flash_working_mode(Flash::Fwm_Default); u_int32_t sectorSize = _ioAccess->get_sector_size(); u_int32_t configEndAddr = availFlashSize - (_fs2ImgInfo.ext_info.config_pad * fwSectorSz); for (u_int32_t eraseAddr=configBaseAddr; eraseAddr < configEndAddr; eraseAddr+=sectorSize ) { @@ -2052,3 +2047,38 @@ const char* Fs2Operations::FwGetResetRecommandationStr() } return (const char*)NULL; } + +bool Fs2Operations::FwCalcMD5(u_int8_t md5sum[16]) +{ +#if defined(UEFI_BUILD) || defined(NO_OPEN_SSL) + (void)md5sum; + return errmsg("Operation not supported"); +#else + // no support for striped image ATM + if (!Fs2IntQuery(true, false)) { + return false; + } + if (_fwImgInfo.ext_info.is_failsafe && _fwImgInfo.actuallyFailsafe) { + _ioAccess->set_address_convertor(_fwImgInfo.cntxLog2ChunkSize, _fwImgInfo.imgStart != 0); + } else { + _ioAccess->set_address_convertor(0, 0); + } + // read entire flash + std::vector md5buff; + md5buff.resize(_fwImgInfo.lastImageAddr); + READBUF((*_ioAccess), 0, &md5buff[0], _fwImgInfo.lastImageAddr, "Calculate MD5"); + // mask out image CRC, GUIDs, VSD, ImageInfo CRC + // full image CRC DW + memset(&md5buff[0x20], 0xff, 4); + // GUIDs + memset(&md5buff[_fs2ImgInfo.guidPtr - 0x10], 0xff, 0x44); + // VSD + memset(&md5buff[_fs2ImgInfo.infoSectPtr + _fs2ImgInfo.infoOffs[II_VSD]], 0xff, 0xd0); + // Image Info CRC + u_int32_t infoSectSize = __be32_to_cpu(*(u_int32_t*)&md5buff[_fs2ImgInfo.infoSectPtr - sizeof(GPH) + 0x4]) << 2; + memset(&md5buff[_fs2ImgInfo.infoSectPtr + infoSectSize], 0xff, 4); + // calc md5 sum + tools_md5(&md5buff[0], md5buff.size(), md5sum); + return true; +#endif +} diff --git a/mlxfwops/lib/fs2_ops.h b/mlxfwops/lib/fs2_ops.h index 0dd183c..24ae8fe 100644 --- a/mlxfwops/lib/fs2_ops.h +++ b/mlxfwops/lib/fs2_ops.h @@ -76,6 +76,7 @@ public: virtual bool FwInit(); virtual bool FwReadData(void* image, u_int32_t* image_size); virtual bool FwReadRom(std::vector& romSect); + virtual bool FwCalcMD5(u_int8_t md5sum[16]); private: @@ -143,9 +144,9 @@ private: bool Fs2FailSafeBurn(Fs2Operations &imageOps, bool allow_nofs, const char* pre_message, ProgressCallBack progressFunc); bool ModifyGuidSection(guid_t *user_guids, ProgressCallBack progressFunc=(ProgressCallBack)NULL); - bool preFS2PatchGUIDs(bool patch_macs, bool patch_uids, bool user_guids, bool user_macs, - bool user_uids, guid_t new_guids[MAX_GUIDS], guid_t old_guids[MAX_GUIDS], guid_t **used_guids_p, u_int32_t num_of_old_guids); - bool patchGUIDs (Fs2Operations& imageOps, bool patch_macs, bool patch_uids, bool user_guids, bool user_macs, bool user_uids, + bool preFS2PatchGUIDs(bool patch_macs, bool user_guids, bool user_macs, + guid_t new_guids[MAX_GUIDS], guid_t old_guids[MAX_GUIDS], guid_t **used_guids_p, u_int32_t num_of_old_guids); + bool patchGUIDs (Fs2Operations& imageOps, bool patch_macs, bool user_guids, bool user_macs, guid_t new_guids[MAX_GUIDS], guid_t old_guids[MAX_GUIDS], u_int32_t num_of_old_guids); void patchGUIDsSection(u_int32_t *buf, u_int32_t ind, guid_t guids[MAX_GUIDS], int nguids); bool patchImageVsd(Fs2Operations &imgFwOps, const char* userVsd=(char*)NULL); @@ -161,8 +162,6 @@ private: bool ModifyKeySection(guid_t access_key, ProgressCallBack callBackFunc=(ProgressCallBack)NULL); void PatchKeySect(u_int32_t* buff, u_int32_t keyOff, guid_t hw_key); - bool Fs2IsMacAvailable(); - bool CheckBxMacsFormat(guid_t* guids, int index, int user_uids); bool ModifyVSDSection(const char *vsd, ProgressCallBack callBackFunc=(ProgressCallBack)NULL); bool ReburnNewImage(u_int8_t *data, const char *feature_name, ProgressCallBack callBackFunc=(ProgressCallBack)NULL); @@ -170,6 +169,7 @@ private: bool needs_repack, u_int32_t cntxLog2ChunkSize); bool Fs2SetGuids(sg_params_t& sgParam, PrintCallBack callBackFunc=(PrintCallBack)NULL, ProgressCallBack progressFunc=(ProgressCallBack)NULL); bool Fs2SetGuidsForBlank(sg_params_t& sgParam); + bool getRunningFwVer(); Fs2ImgInfo _fs2ImgInfo; diff --git a/mlxfwops/lib/fs3_ops.cpp b/mlxfwops/lib/fs3_ops.cpp index f60cdb6..344279a 100644 --- a/mlxfwops/lib/fs3_ops.cpp +++ b/mlxfwops/lib/fs3_ops.cpp @@ -40,6 +40,18 @@ #include #include +#ifdef MST_UL +#include +#else +#ifndef UEFI_BUILD +#include +#endif +#endif + +#if !defined(UEFI_BUILD) && !defined(NO_OPEN_SSL) +#include +#endif + #include "fs3_ops.h" #define FS3_FLASH_SIZE 0x400000 @@ -193,6 +205,14 @@ bool Fs3Operations::GetMfgInfo(u_int8_t *buff) } else { return errmsg(MLXFW_UNKNOWN_SECT_VER_ERR, "Unknown MFG_INFO format version (%d.%d).", cib_mfg_info.major_version, cib_mfg_info.minor_version); } + + if (cib_mfg_info.minor_version == 1) { + //get orig_prs name + struct tools_open_mfg_info tools_mfg_info; + memset(&tools_mfg_info, 0, sizeof(tools_mfg_info)); + tools_open_mfg_info_unpack(&tools_mfg_info, buff); + strncpy(_fs3ImgInfo.ext_info.orig_prs_name, tools_mfg_info.orig_prs_name, FS3_PRS_NAME_LEN - 1); + } return true; } @@ -243,11 +263,20 @@ bool Fs3Operations::GetImageInfo(u_int8_t *buff) strcpy(_fs3ImgInfo.ext_info.image_vsd, image_info.vsd); strcpy(_fwImgInfo.ext_info.psid, image_info.psid); strcpy(_fwImgInfo.ext_info.product_ver, image_info.prod_ver); + if (IIMinor == 2) { + // get name, prs name and description + struct tools_open_image_info tools_image_info; + memset(&tools_image_info, 0, sizeof(tools_image_info)); + tools_open_image_info_unpack(&tools_image_info, buff); + strncpy(_fs3ImgInfo.ext_info.name, tools_image_info.name, NAME_LEN - 1); + strncpy(_fs3ImgInfo.ext_info.description, tools_image_info.description, DESCRIPTION_LEN - 1); + strncpy(_fs3ImgInfo.ext_info.prs_name, tools_image_info.prs_name, FS3_PRS_NAME_LEN - 1); + } return true; } #define CHECK_DEV_INFO_NEW_FORMAT(info_st)\ - (info_st.major_version == 2) + (info_st.major_version == 2 ) #define CHECK_DEV_INFO_OLD_FORMAT(info_st)\ (info_st.major_version == 1) bool Fs3Operations::GetDevInfo(u_int8_t *buff) @@ -328,11 +357,16 @@ bool Fs3Operations::IsFs3SectionReadable(u_int8_t type, QueryOptions queryOption } return false; - } else if (queryOptions.quickQuery) { - if ( IsGetInfoSupported(type)) { - return true; + } else{ + if (!queryOptions.readRom && type == FS3_ROM_CODE) { + return false; + } + if (queryOptions.quickQuery) { + if ( IsGetInfoSupported(type)) { + return true; + } + return false; } - return false; } return true; } @@ -586,7 +620,8 @@ bool Fs3Operations::Fs3Verify(VerifyCallBack verifyCallBackFunc, bool show_itoc, _fs3ImgInfo.firstItocIsEmpty = false; // printf("-D- image_start = %#x\n", image_start); // Go over the ITOC entries - u_int32_t sector_size = (_ioAccess->is_flash()) ? _ioAccess->get_sector_size() : FS3_DEFAULT_SECTOR_SIZE; + // adrianc: need to have the sector size hardcoded in the FW binary (since its determined in the image generation process) + u_int32_t sector_size = FS3_DEFAULT_SECTOR_SIZE; offset = (offset % sector_size == 0) ? offset : (offset + sector_size - offset % 0x1000); while (offset < _ioAccess->get_size()) { @@ -621,10 +656,31 @@ bool Fs3Operations::Fs3IntQuery(bool readRom, bool quickQuery) return false; } _fwImgInfo.ext_info.dev_type = swId[0]; + if (!_fwParams.ignoreCacheRep) { + getRunningFwVersion(); + } } return true; } +bool Fs3Operations::getRunningFwVersion() +{ +#ifndef UEFI_BUILD + struct connectib_icmd_get_fw_info fwVer; + memset(&fwVer, 0, sizeof(fwVer)); + int rc = gcif_get_fw_info(((Flash*)_ioAccess)->getMfileObj(), &fwVer); + if (rc && rc != GCIF_STATUS_UNSUPPORTED_ICMD_VERSION && rc != GCIF_STATUS_INVALID_OPCODE && rc != GCIF_ICMD_NOT_SUPPORTED) { + return errmsg("Failed to get running FW version. %s", gcif_err_str(rc)); + } + if (!rc) { + _fwImgInfo.ext_info.running_fw_ver[0] = fwVer.fw_version.MAJOR; + _fwImgInfo.ext_info.running_fw_ver[1] = fwVer.fw_version.MINOR; + _fwImgInfo.ext_info.running_fw_ver[2] = fwVer.fw_version.SUBMINOR; + } +#endif + return true; +} + bool Fs3Operations::FwQuery(fw_info_t *fwInfo, bool readRom, bool isStripedImage) { //isStripedImage flag is not needed in FS3 image format @@ -783,26 +839,8 @@ bool Fs3Operations::CheckFs3ImgSize(Fs3Operations& imageOps, bool useImageDevDat return true; } -bool Fs3Operations::GetMaxImageSize(u_int32_t flash_size, bool image_is_fs, u_int32_t &max_image_size) -{ - // max image size is calculated as the following : - // for failsafe image : flash_size/2 - 6*sector_size - // for nonfailsafe image: flash_size - 6*sector_size - // the 6*sector_size is for the last two sections on the flash (DEV_INFO and MFG_INFO) which are not part of the image burnt. - - u_int32_t sector_size = _ioAccess->get_sector_size(); - if (image_is_fs) { - max_image_size = (flash_size / 2) - (6 * sector_size); - } else { - // For non FS image, - max_image_size = flash_size - (6 * sector_size); - } - -return true; -} - #define SUPPORTS_ISFU(chip_type) \ - (chip_type == CT_CONNECT_IB || chip_type == CT_CONNECTX4 || chip_type == CT_CONNECTX4_LX) + (chip_type == CT_CONNECT_IB || chip_type == CT_CONNECTX4 || chip_type == CT_CONNECTX4_LX || chip_type == CT_CONNECTX5) #define FLASH_RESTORE(origFlashObj) \ if (origFlashObj) {\ @@ -818,7 +856,7 @@ bool Fs3Operations::BurnFs3Image(Fs3Operations &imageOps, u_int8_t is_curr_image_in_odd_chunks; u_int32_t new_image_start; u_int32_t total_img_size = 0; - u_int32_t sector_size = (_ioAccess->is_flash()) ? _ioAccess->get_sector_size() : FS3_DEFAULT_SECTOR_SIZE; + u_int32_t sector_size = FS3_DEFAULT_SECTOR_SIZE; Flash *f = (Flash*)(this->_ioAccess); FImage *fim = (FImage*)(imageOps._ioAccess); @@ -891,6 +929,7 @@ bool Fs3Operations::BurnFs3Image(Fs3Operations &imageOps, data8 + FS3_FW_SIGNATURE_SIZE, imageOps._fs3ImgInfo.itocAddr + sector_size - FS3_FW_SIGNATURE_SIZE, false, + false, total_img_size, alreadyWrittenSz)) { return false; @@ -906,7 +945,7 @@ bool Fs3Operations::BurnFs3Image(Fs3Operations &imageOps, } if (writeSection) { - if (!writeImage(burnParams.progressFunc, toc_entry->flash_addr << 2 , &(itoc_info_p->section_data[0]), itoc_info_p->section_data.size(), !toc_entry->relative_addr, total_img_size, alreadyWrittenSz)) { + if (!writeImage(burnParams.progressFunc, toc_entry->flash_addr << 2 , &(itoc_info_p->section_data[0]), itoc_info_p->section_data.size(), !toc_entry->relative_addr, false, total_img_size, alreadyWrittenSz)) { return false; } alreadyWrittenSz += itoc_info_p->section_data.size(); @@ -1066,6 +1105,11 @@ bool Fs3Operations::Fs3Burn(Fs3Operations &imageOps, ExtBurnParams& burnParams) return false; } + // Check TimeStamp + if (!TestAndSetTimeStamp(imageOps)) { + return false; + } + // ROM patchs if (((burnParams.burnRomOptions == ExtBurnParams::BRO_FROM_DEV_IF_EXIST) && (_fwImgInfo.ext_info.roms_info.exp_rom_found)) || // There is ROM in device and user choses to keep it ((burnParams.burnRomOptions == ExtBurnParams::BRO_DEFAULT) && (!imageOps._fwImgInfo.ext_info.roms_info.exp_rom_found && _fwImgInfo.ext_info.roms_info.exp_rom_found))) { // No ROM in image and ROM in device @@ -1082,7 +1126,7 @@ bool Fs3Operations::Fs3Burn(Fs3Operations &imageOps, ExtBurnParams& burnParams) } // image vsd patch - if (!burnParams.useImagePs && burnParams.vsdSpecified ) { + if (!burnParams.useImagePs && (burnParams.vsdSpecified || burnParams.useDevImgInfo)) { // get image info section : struct toc_info *imageInfoToc = (struct toc_info *)NULL; if (!imageOps.Fs3GetItocInfo(imageOps._fs3ImgInfo.tocArr, imageOps._fs3ImgInfo.numOfItocs, FS3_IMAGE_INFO, imageInfoToc)){ @@ -1092,12 +1136,24 @@ bool Fs3Operations::Fs3Burn(Fs3Operations &imageOps, ExtBurnParams& burnParams) std::vector imageInfoSect = imageInfoToc->section_data; struct cibfw_image_info image_info; cibfw_image_info_unpack(&image_info, &imageInfoSect[0]); - strncpy(image_info.vsd, burnParams.userVsd, VSD_LEN); + if (burnParams.vsdSpecified) { + strncpy(image_info.vsd, burnParams.userVsd, VSD_LEN); + } cibfw_image_info_pack(&image_info, &imageInfoSect[0]); + if (burnParams.useDevImgInfo) { + // update PSID, name and description in image info + struct tools_open_image_info tools_image_info; + tools_open_image_info_unpack(&tools_image_info, &imageInfoSect[0]); + strncpy(tools_image_info.psid, _fwImgInfo.ext_info.psid, PSID_LEN - 1); + strncpy(tools_image_info.name, _fs3ImgInfo.ext_info.name, NAME_LEN - 1); + strncpy(tools_image_info.description, _fs3ImgInfo.ext_info.description, DESCRIPTION_LEN - 1); + tools_open_image_info_pack(&tools_image_info, &imageInfoSect[0]); + } + // re-insert it into the image: if (!imageOps.Fs3ReplaceSectionInDevImg(FS3_IMAGE_INFO, FS3_FW_ADB, true, (u_int8_t*)&newImageData[0], imageOps._fwImgInfo.lastImageAddr, (u_int32_t*)&imageInfoSect[0], (u_int32_t)imageInfoSect.size(), true)) { - return errmsg(MLXFW_UPDATE_SECT_ERR, "failed to update image VSD in image. %s", imageOps.err()); + return errmsg(MLXFW_UPDATE_SECT_ERR, "failed to update IMAGE_INFO section in image. %s", imageOps.err()); } createNewImg = true; } @@ -1281,10 +1337,10 @@ bool Fs3Operations::FwSetGuids(sg_params_t& sgParam, PrintCallBack callBackFunc, usrGuid.base_mac_specified = false; usrGuid.set_mac_from_guid = false; - if (sgParam.guidsSpecified || sgParam.uidsSpecified) { + if (sgParam.guidsSpecified || sgParam.uidSpecified) { usrGuid.base_guid_specified = true; usrGuid.base_guid = sgParam.userGuids[0]; - usrGuid.set_mac_from_guid = sgParam.uidsSpecified ? true : false; + usrGuid.set_mac_from_guid = sgParam.uidSpecified ? true : false; } if (sgParam.macsSpecified) { // check base mac @@ -1594,6 +1650,7 @@ bool Fs3Operations::Fs3UpdateMfgUidsSection(struct toc_info *curr_toc, std::vect { struct cibfw_mfg_info cib_mfg_info; struct cx4fw_mfg_info cx4_mfg_info; + (void)curr_toc; cibfw_mfg_info_unpack(&cib_mfg_info, (u_int8_t*)§ion_data[0]); if (CHECK_MFG_OLD_FORMAT(cib_mfg_info)) { @@ -1609,7 +1666,6 @@ bool Fs3Operations::Fs3UpdateMfgUidsSection(struct toc_info *curr_toc, std::vect return errmsg("Unknown MFG_INFO format version (%d.%d).", cib_mfg_info.major_version, cib_mfg_info.minor_version); } newSectionData = section_data; - memset((u_int8_t*)&newSectionData[0], 0, curr_toc->toc_entry.size * 4); if (CHECK_MFG_NEW_FORMAT(cib_mfg_info)) { cx4fw_mfg_info_pack(&cx4_mfg_info, (u_int8_t*)&newSectionData[0]); @@ -1686,6 +1742,7 @@ bool Fs3Operations::Fs3UpdateUidsSection(struct toc_info *curr_toc, std::vector< { struct cibfw_device_info cib_dev_info; struct cx4fw_device_info cx4_dev_info; + (void)curr_toc; cibfw_device_info_unpack(&cib_dev_info, (u_int8_t*)§ion_data[0]); if (CHECK_DEV_INFO_OLD_FORMAT(cib_dev_info)) { @@ -1701,7 +1758,6 @@ bool Fs3Operations::Fs3UpdateUidsSection(struct toc_info *curr_toc, std::vector< return errmsg("Unknown DEV_INFO format version (%d.%d).", cib_dev_info.major_version, cib_dev_info.minor_version); } newSectionData = section_data; - memset((u_int8_t*)&newSectionData[0], 0, curr_toc->toc_entry.size * 4); if (CHECK_DEV_INFO_NEW_FORMAT(cib_dev_info)) { cx4fw_device_info_pack(&cx4_dev_info, (u_int8_t*)&newSectionData[0]); @@ -1715,11 +1771,11 @@ bool Fs3Operations::Fs3UpdateVsdSection(struct toc_info *curr_toc, std::vector &newSectionData) { struct cibfw_device_info dev_info; + (void)curr_toc; cibfw_device_info_unpack(&dev_info, (u_int8_t*)§ion_data[0]); memset(dev_info.vsd, 0, sizeof(dev_info.vsd)); strncpy(dev_info.vsd, user_vsd, TOOLS_ARR_SZ(dev_info.vsd) - 1); newSectionData = section_data; - memset((u_int8_t*)&newSectionData[0], 0, curr_toc->toc_entry.size * 4); cibfw_device_info_pack(&dev_info, (u_int8_t*)&newSectionData[0]); return true; } @@ -1737,6 +1793,11 @@ bool Fs3Operations::Fs3UpdateVpdSection(struct toc_info *curr_toc, char *vpd, delete[] vpd_data; return errmsg("Size of VPD file: %d is not 4-byte alligned!", vpd_size); } + // assuming VPD section is the last piece of Data on the flash + if ( (_ioAccess)->is_flash() && (getAbsAddr(curr_toc) + vpd_size > (_ioAccess)->get_size())) { + delete[] vpd_data; + return errmsg("VPD data exceeds flash size, max VPD size: 0x%x bytes", (_ioAccess)->get_size() - getAbsAddr(curr_toc)); + } GetSectData(newSectionData, (u_int32_t*)vpd_data, vpd_size); curr_toc->toc_entry.size = vpd_size / 4; delete[] vpd_data; @@ -1833,7 +1894,7 @@ bool Fs3Operations::Fs3ReburnItocSection(u_int32_t newSectionAddr, PRINT_PROGRESS(callBackFunc, message); - if (!writeImage((ProgressCallBack)NULL, newSectionAddr , (u_int8_t*)&newSectionData[0], newSectionSize, true)) { + if (!writeImage((ProgressCallBack)NULL, newSectionAddr , (u_int8_t*)&newSectionData[0], newSectionSize, true, true)) { PRINT_PROGRESS(callBackFunc, (char*)"FAILED\n"); return false; } @@ -2030,7 +2091,7 @@ bool Fs3Operations::getFirstDevDataAddr(u_int32_t& firstAddr) { bool Fs3Operations::reburnItocSection(PrintCallBack callBackFunc) { // HACK SHOULD BE REMOVED ASAP - u_int32_t sector_size = (_ioAccess->is_flash()) ? _ioAccess->get_sector_size() : FS3_DEFAULT_SECTOR_SIZE; + u_int32_t sector_size = FS3_DEFAULT_SECTOR_SIZE; // Itoc section is failsafe (two sectors after boot section are reserved for itoc entries) u_int32_t oldItocAddr = _fs3ImgInfo.itocAddr; u_int32_t newItocAddr = (_fs3ImgInfo.firstItocIsEmpty) ? (_fs3ImgInfo.itocAddr - sector_size) : (_fs3ImgInfo.itocAddr + sector_size); @@ -2045,7 +2106,7 @@ bool Fs3Operations::reburnItocSection(PrintCallBack callBackFunc) { memset(&p[itocSize] - CIBFW_ITOC_ENTRY_SIZE, FS3_END, CIBFW_ITOC_ENTRY_SIZE); PRINT_PROGRESS(callBackFunc, (char*)"Updating ITOC section - "); - bool rc = writeImage((ProgressCallBack)NULL, newItocAddr , p, itocSize, false); + bool rc = writeImage((ProgressCallBack)NULL, newItocAddr , p, itocSize, false, true); delete[] p; if (!rc) { PRINT_PROGRESS(callBackFunc,(char*)"FAILED\n"); @@ -2055,7 +2116,7 @@ bool Fs3Operations::reburnItocSection(PrintCallBack callBackFunc) { u_int32_t zeros = 0; PRINT_PROGRESS(callBackFunc,(char*)"Restoring signature - "); - if (!writeImage((ProgressCallBack)NULL, oldItocAddr, (u_int8_t*)&zeros, 4, false)) { + if (!writeImage((ProgressCallBack)NULL, oldItocAddr, (u_int8_t*)&zeros, 4, false, true)) { PRINT_PROGRESS(callBackFunc,(char*)"FAILED\n"); return false; } @@ -2127,7 +2188,7 @@ bool Fs3Operations::FwShiftDevData(PrintCallBack progressFunc) return errmsg("Failed to get MFG_INFO ITOC information."); } - if (getAbsAddr(mfgToc) < _ioAccess->get_size() - _ioAccess->get_sector_size()) { + if (getAbsAddr(mfgToc) < _ioAccess->get_size() - (((Flash*)(_ioAccess))->get_sector_size())) { return errmsg("Device data sections already shifted."); } @@ -2158,7 +2219,7 @@ bool Fs3Operations::FwShiftDevData(PrintCallBack progressFunc) return false; } // write the section to its new place in the flash - if (!writeImage((ProgressCallBack)NULL, getAbsAddr(currToc) , (u_int8_t*)&currToc->section_data[0], (currToc->toc_entry.size << 2), true)) { + if (!writeImage((ProgressCallBack)NULL, getAbsAddr(currToc) , (u_int8_t*)&currToc->section_data[0], (currToc->toc_entry.size << 2), true, true)) { PRINT_PROGRESS(progressFunc,(char*)"FAILED\n"); return false; } @@ -2227,20 +2288,16 @@ const char* Fs3Operations::FwGetResetRecommandationStr() bool Fs3Operations::Fs3IsfuActivateImage(u_int32_t newImageStart) { int rc = 0; - mfile *mf = (mfile*)NULL; + mfile *mf = _ioAccess->is_flash() ? ((Flash*)_ioAccess)->getMfileObj() : (mfile*)NULL; struct cibfw_register_mfai mfai; struct cibfw_register_mfrl mfrl; memset(&mfai, 0, sizeof(mfai)); memset(&mfrl, 0, sizeof(mfrl)); - if (!_devName) {// not an mst device - return true; - } - // send MFRL register - mf = mopen(_devName); if (!mf) { - return false; + return errmsg("Failed to activate image. No mfile object found."); } + mfai.address = newImageStart; mfai.use_address = 1; rc = reg_access_mfai(mf,REG_ACCESS_METHOD_SET, &mfai); @@ -2253,7 +2310,6 @@ bool Fs3Operations::Fs3IsfuActivateImage(u_int32_t newImageStart) // ignore ME_REG_ACCESS_BAD_PARAM error for old FW rc = (rc == ME_REG_ACCESS_BAD_PARAM) ? ME_OK : rc; cleanup: - mclose(mf); if (rc) { return errmsg("Failed to activate image. %s", m_err2str((MError)rc)); } @@ -2506,3 +2562,244 @@ bool Fs3Operations::FixCX4WriteProtection(bool justCheck) } return true; } + +bool Fs3Operations::FwCalcMD5(u_int8_t md5sum[16]) +{ +#if defined(UEFI_BUILD) || defined(NO_OPEN_SSL) + (void)md5sum; + return errmsg("Operation not supported"); +#else + if (!Fs3IntQuery(true, false)) { + return false; + } + // push beggining of image to md5buff + int sz = FS3_BOOT_START + _fwImgInfo.bootSize; + std::vector md5buff(_fs3ImgInfo.imageCache.begin(), _fs3ImgInfo.imageCache.begin() + sz); + // push all non dev data sections to md5buff + for (unsigned int j = 0; j < TOC_HEADER_SIZE; j++) { + md5buff.push_back(_fs3ImgInfo.imageCache[_fs3ImgInfo.itocAddr + j]); + } + // push itoc header + for (int i = 0; i < _fs3ImgInfo.numOfItocs; i++) { + // push each non-dev-data section to md5sum buffer + u_int32_t tocEntryAddr = _fs3ImgInfo.tocArr[i].entry_addr; + u_int32_t tocDataAddr = _fs3ImgInfo.tocArr[i].toc_entry.flash_addr << 2; + u_int32_t tocDataSize = _fs3ImgInfo.tocArr[i].toc_entry.size << 2; + if (!_fs3ImgInfo.tocArr[i].toc_entry.device_data) { + // itoc entry + for (unsigned int j = 0; j < TOC_ENTRY_SIZE; j++) { + md5buff.push_back(_fs3ImgInfo.imageCache[tocEntryAddr + j]); + } + // itoc data + for (unsigned int j = 0; j < tocDataSize; j++) { + md5buff.push_back(_fs3ImgInfo.imageCache[tocDataAddr + j]); + } + } + } + // calc md5 + tools_md5(&md5buff[0], md5buff.size(), md5sum); + return true; +#endif +} + +Tlv_Status_t Fs3Operations::GetTsObj(TimeStampIFC** tsObj) +{ + if (_ioAccess->is_flash()) { + *tsObj = TimeStampIFC::getIFC(((Flash*)(_ioAccess))->getMfileObj()); + } else { + // check if buffer or file and allocate accrodingly + if (_fwParams.hndlType == FHT_FW_FILE) { + *tsObj = TimeStampIFC::getIFC(_fname, _fwImgInfo.lastImageAddr); + } else if (_fwParams.hndlType == FHT_FW_BUFF) { + *tsObj = TimeStampIFC::getIFC((u_int8_t*)((FImage*)_ioAccess)->getBuf(), ((FImage*)_ioAccess)->getBufLength()); + } else { + *tsObj = (TimeStampIFC*)NULL; + errmsg("Unsupported FW handle type."); + return TS_HANDLE_NOT_SUPPORTED; + } + } + Tlv_Status_t rc = (*tsObj)->init(); + if (rc) { + errmsg("%s", (*tsObj)->err()); + delete *tsObj; + *tsObj = (TimeStampIFC*)NULL; + return rc; + } + return TS_OK; +} + +bool Fs3Operations::FwSetTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer) +{ + TimeStampIFC* tsObj; + Tlv_Status_t rc; + + if (!_ioAccess->is_flash() && !Fs3IntQuery(false, true)) { + return false; + } + if (GetTsObj(&tsObj)) { + return errmsg("Failed to set timestamp. %s", err()); + } + + if (!_ioAccess->is_flash()) { + // if caller hasnt specified fw version take from image + struct tools_open_fw_version zeroVer; + memset(&zeroVer, 0, sizeof(zeroVer)); + if (!memcmp(&fwVer, &zeroVer, sizeof(fwVer))) { + fwVer.fw_ver_major = _fwImgInfo.ext_info.fw_ver[0]; + fwVer.fw_ver_minor = _fwImgInfo.ext_info.fw_ver[1]; + fwVer.fw_ver_subminor = _fwImgInfo.ext_info.fw_ver[2]; + } + } + + rc = tsObj->setTimeStamp(timestamp, fwVer); + if (rc) { + errmsg("%s", tsObj->err()); + } + delete tsObj; + return rc ? false : true; +} + +bool Fs3Operations::FwResetTimeStamp() +{ + TimeStampIFC* tsObj; + Tlv_Status_t rc; + + if (!_ioAccess->is_flash() && !Fs3IntQuery(false, true)) { + return false; + } + if (GetTsObj(&tsObj)) { + return errmsg("Failed to reset timestamp. %s", err()); + } + rc = tsObj->resetTimeStamp(); + if (rc) { + errmsg("%s", tsObj->err()); + } + delete tsObj; + return rc ? false : true; +} + +bool Fs3Operations::FwQueryTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer, bool queryRunning) +{ + TimeStampIFC* tsObj; + Tlv_Status_t rc; + if (!_ioAccess->is_flash()) { + if (queryRunning) { + return errmsg("cannot get running FW Timestamp on image file"); + } + if (!Fs3IntQuery(false, true)) { + return false; + } + } + + if (GetTsObj(&tsObj)) { + return errmsg("Failed to query timestamp. %s", err()); + } + + rc = tsObj->queryTimeStamp(timestamp, fwVer, queryRunning); + if (rc) { + errmsg("%s", tsObj->err()); + } + delete tsObj; + return rc ? false : true; +} + +bool Fs3Operations::TestAndSetTimeStamp(Fs3Operations &imageOps) +{ + Tlv_Status_t rc; + Tlv_Status_t devTsQueryRc; + bool retRc = true; + TimeStampIFC* imgTsObj; + TimeStampIFC* devTsObj; + bool tsFoundOnImage = false; + struct tools_open_ts_entry imgTs; + struct tools_open_fw_version imgFwVer; + struct tools_open_ts_entry devTs; + struct tools_open_fw_version devFwVer; + memset(&imgTs, 0, sizeof(imgTs)); + memset(&imgFwVer, 0, sizeof(imgFwVer)); + memset(&devTs, 0, sizeof(devTs)); + memset(&devFwVer, 0, sizeof(devFwVer)); + + if (!_ioAccess->is_flash()) { + return errmsg("cannot run TestAndSetTimeStamp on image"); + } + + if (_fwParams.ignoreCacheRep) { + // direct flash access no check is needed + return true; + } + if (imageOps._ioAccess->is_flash()) { + return errmsg("TestAndSetTimeStamp bad params"); + } + if (imageOps.GetTsObj(&imgTsObj)) { + return errmsg("%s", imageOps.err()); + } + rc = GetTsObj(&devTsObj); + if (rc) { + delete imgTsObj; + return rc == TS_TIMESTAMPING_NOT_SUPPORTED ? true : false; + } + // check if device supports timestamping or if device is not in livefish + devTsQueryRc = devTsObj->queryTimeStamp(devTs, devFwVer); + if (devTsQueryRc == TS_TIMESTAMPING_NOT_SUPPORTED || devTsQueryRc == TS_UNSUPPORTED_ICMD_VERSION) { + retRc = true; + goto cleanup; + } else if (devTsQueryRc && devTsQueryRc != TS_NO_VALID_TIMESTAMP) { + retRc = errmsg("%s", devTsObj->err()); + goto cleanup; + } + + // Option 1 image was timestampped need to try and set it on device + // Option 2 image was not timestampped but device was timestampped + rc = imgTsObj->queryTimeStamp(imgTs, imgFwVer); + if (rc == TS_OK) { + tsFoundOnImage = true; + } else if (rc != TS_TLV_NOT_FOUND ) { + retRc = errmsg("%s", imgTsObj->err()); + goto cleanup; + } + + if (tsFoundOnImage) { + // timestamp found on image, attempt to set it on device + rc = devTsObj->setTimeStamp(imgTs, imgFwVer); + if (rc == TS_OK) { + retRc = true; + } else { + retRc = errmsg("%s", devTsObj->err()); + } + } else { + if (devTsQueryRc == TS_NO_VALID_TIMESTAMP) { + // no timestamp on image and no valid timestamp on device check if we got running timestamp if we do then fail + devTsQueryRc = devTsObj->queryTimeStamp(devTs, devFwVer, true); + if (devTsQueryRc == TS_OK) { + // we got running timestamp return error + retRc = errmsg("No valid timestamp detected. please set a valid timestamp on image/device or reset timestamps on device."); + + } else if (devTsQueryRc == TS_NO_VALID_TIMESTAMP) { + // timestamping not used on device. + retRc = true; + } else { + retRc = errmsg("%s", devTsObj->err()); + } + } else { + // we got a valid timestamp on device but not on image! compare the FW version + if (devFwVer.fw_ver_major == imageOps._fwImgInfo.ext_info.fw_ver[0] && + devFwVer.fw_ver_minor == imageOps._fwImgInfo.ext_info.fw_ver[1] && + devFwVer.fw_ver_subminor == imageOps._fwImgInfo.ext_info.fw_ver[2]) { + // versions match allow update + retRc = true; + } else { + retRc = errmsg("Stamped FW version missmatch: %d.%d.%04d differs from %d.%d.%04d", devFwVer.fw_ver_major,\ + devFwVer.fw_ver_minor,\ + devFwVer.fw_ver_subminor,\ + imageOps._fwImgInfo.ext_info.fw_ver[0],\ + imageOps._fwImgInfo.ext_info.fw_ver[1],\ + imageOps._fwImgInfo.ext_info.fw_ver[2]); + } + } + } +cleanup: + delete imgTsObj; + delete devTsObj; + return retRc; +} diff --git a/mlxfwops/lib/fs3_ops.h b/mlxfwops/lib/fs3_ops.h index 6cb9146..c910ff1 100644 --- a/mlxfwops/lib/fs3_ops.h +++ b/mlxfwops/lib/fs3_ops.h @@ -34,11 +34,11 @@ #ifndef FS3_OPS_ #define FS3_OPS_ -// #include "flint_base.h" -#include "fw_ops.h" #include #include - +#include +#include "fw_ops.h" +#include "aux_tlv_ops.h" class Fs3Operations : public FwOperations { @@ -74,6 +74,10 @@ public: virtual bool FwShiftDevData(PrintCallBack progressFunc=(PrintCallBack)NULL); virtual const char* FwGetResetRecommandationStr(); virtual bool CheckCX4Device() {return (CheckAndFixCX4() && FixCX4WriteProtection());} + virtual bool FwCalcMD5(u_int8_t md5sum[16]); + virtual bool FwSetTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer); + virtual bool FwQueryTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer, bool queryRunning=false); + virtual bool FwResetTimeStamp(); private: @@ -185,10 +189,10 @@ private: bool Fs3AddSection(fs3_section_t sectionType, fs3_section_t neighbourSection, u_int32_t* newSectData, u_int32_t newSectSize, ProgressCallBack progressFunc); bool CheckFs3ImgSize(Fs3Operations& imageOps, bool useImageDevData=false); - bool GetMaxImageSize(u_int32_t flash_size, bool image_is_fs, u_int32_t &max_image_size); bool CheckItocArray(); bool CheckItocArrConsistency(std::vector& sortedTocVec, u_int32_t imageStartAddr); bool CheckBinVersion(u_int8_t binVerMajor, u_int8_t binVerMinor); + bool getRunningFwVersion(); u_int32_t getAbsAddr(toc_info* toc); u_int32_t getAbsAddr(toc_info* toc, u_int32_t imgStart); @@ -197,6 +201,9 @@ private: bool reburnItocSection(PrintCallBack callBackFunc); bool Fs3IsfuActivateImage(u_int32_t newImageStart); + bool TestAndSetTimeStamp(Fs3Operations &imageOps); + Tlv_Status_t GetTsObj(TimeStampIFC** tsObj); + bool CheckAndFixCX4(bool justCheck=true); bool FixCX4Uids(); bool FixCX4WriteProtection(bool justCheck=true); @@ -212,9 +219,6 @@ private: u_int32_t _startAdd; }; - - - // Members static const SectionInfo _fs3SectionsInfoArr[]; static const u_int32_t _itocSignature[4]; diff --git a/mlxfwops/lib/fw_ops.cpp b/mlxfwops/lib/fw_ops.cpp index 6ebcea3..d6b2f73 100644 --- a/mlxfwops/lib/fw_ops.cpp +++ b/mlxfwops/lib/fw_ops.cpp @@ -376,14 +376,6 @@ bool FwOperations::CntxFindAllImageStart (FBase* ioAccess, u_int32_t start_locat needed_pos_num = CNTX_START_POS_SIZE; - if (ioAccess->is_flash()) { - if ( (((Flash*)ioAccess)->get_dev_id() == 400) || - (((Flash*)ioAccess)->get_dev_id() == 435) || - (((Flash*)ioAccess)->get_dev_id() == 6100)) { - needed_pos_num = OLD_CNTX_START_POS_SIZE; - } - } - /* WA: due to bug on SwichIB first GA FW (FW doesnt look at chip select field in mfba) * when reading from flash address 0x400000 it wraps around to 0x0 causing more than one * valid image to be found. as a WA we dont check at 0x400000. basic flash operations @@ -520,6 +512,8 @@ bool FwOperations::FwAccessCreate(fw_ops_params_t& fwParams, FBase **ioAccessP) } //set no flash verify if needed (default =false) ((Flash*)*ioAccessP)->set_no_flash_verify(fwParams.noFlashVerify); + // work with 64KB sector size if possible to increase performace in full fw burn + (((Flash*)*ioAccessP)->set_flash_working_mode(Flash::Fwm_64KB)); } else { WriteToErrBuff(fwParams.errBuff,"Unknown Handle Type.", fwParams.errBuffSize); return false; @@ -529,18 +523,17 @@ bool FwOperations::FwAccessCreate(fw_ops_params_t& fwParams, FBase **ioAccessP) u_int8_t FwOperations::CheckFwFormat(FBase& f, bool getFwFormatFromImg) { if (f.is_flash() && !getFwFormatFromImg) { - if ( ( ((Flash*)&f)->get_dev_id() == 400) || - ( ((Flash*)&f)->get_dev_id() == 435) || - ( ((Flash*)&f)->get_dev_id() == CX3_HW_ID) || + if ( ( ((Flash*)&f)->get_dev_id() == CX3_HW_ID) || ( ((Flash*)&f)->get_dev_id() == SWITCHX_HW_ID) || - ( ((Flash*)&f)->get_dev_id() == 6100) || ( ((Flash*)&f)->get_dev_id() == CX3_PRO_HW_ID)) { return FS_FS2_GEN; } else if ( (((Flash*)&f)->get_dev_id() == CONNECT_IB_HW_ID) || (((Flash*)&f)->get_dev_id() == SWITCH_IB_HW_ID) || (((Flash*)&f)->get_dev_id() == CX4_HW_ID) || (((Flash*)&f)->get_dev_id() == CX4LX_HW_ID) || - (((Flash*)&f)->get_dev_id() == SPECTRUM_HW_ID)) { + (((Flash*)&f)->get_dev_id() == CX5_HW_ID) || + (((Flash*)&f)->get_dev_id() == SPECTRUM_HW_ID) || + (((Flash*)&f)->get_dev_id() == SWITCH_IB2_HW_ID)) { return FS_FS3_GEN; } } else { @@ -675,25 +668,40 @@ u_int32_t FwOperations::CalcImageCRC(u_int32_t* buff, u_int32_t size) return new_crc; } -bool FwOperations::writeImage(ProgressCallBack progressFunc, u_int32_t addr, void *data, int cnt, bool isPhysAddr, int totalSz, int alreadyWrittenSz) +bool FwOperations::writeImage(ProgressCallBack progressFunc, u_int32_t addr, void *data, int cnt, bool isPhysAddr, bool readModifyWrite, int totalSz, int alreadyWrittenSz) { u_int8_t *p = (u_int8_t *)data; u_int32_t curr_addr = addr; u_int32_t towrite = cnt; totalSz = totalSz == -1 ? cnt : totalSz; + int origFlashWorkingMode = Flash::Fwm_Default; bool rc; -// if (!_ioAccess->is_flash()) { - // return errmsg("Internal error: writeImage is supported only on flash."); - // } while (towrite) { // Write int trans; if (_ioAccess->is_flash()) { + if (readModifyWrite) { + // perform write with the smallest supported sector size + origFlashWorkingMode = ((Flash*)_ioAccess)->get_flash_working_mode(); + ((Flash*)_ioAccess)->set_flash_working_mode(Flash::Fwm_Default); + } trans = (towrite > (int)Flash::TRANS) ? (int)Flash::TRANS : towrite; if (isPhysAddr) { - rc = ((Flash*)_ioAccess)->write_phy(curr_addr, p, trans); + if (readModifyWrite) { + rc = ((Flash*)_ioAccess)->read_modify_write_phy(curr_addr, p, trans); + } else { + rc = ((Flash*)_ioAccess)->write_phy(curr_addr, p, trans); + } } else { - rc = ((Flash*)_ioAccess)->write(curr_addr, p, trans); + if (readModifyWrite) { + rc = ((Flash*)_ioAccess)->read_modify_write(curr_addr, p, trans); + } else { + rc = ((Flash*)_ioAccess)->write(curr_addr, p, trans); + } + } + if (readModifyWrite) { + // restore erase sector size + ((Flash*)_ioAccess)->set_flash_working_mode(origFlashWorkingMode); } if (!rc) { return errmsg(MLXFW_FLASH_WRITE_ERR, "Flash write failed: %s", _ioAccess->err()); @@ -818,13 +826,6 @@ bool FwOperations::getInfoFromHwDevid(u_int32_t hwDevId, chip_type_t& chipT, con // TODO:combine both databases(hwDevData and hwDev2Str) and remove old unsupporded devices i.e infinihost infinihost_iii_ex infinihost_iii_lx const FwOperations::HwDevData FwOperations::hwDevData[] = { - { "InfiniHost", INFINIHOST_HW_ID, CT_UNKNOWN, 2, {23108, 0}}, - { "InfiniHost III Ex", INFINIHOST_III_EX_HW_ID, CT_UNKNOWN,2 , {25208, 25218, 0}}, - { "InfiniHost III Lx", INFINIHOST_III_LX_HW_ID, CT_UNKNOWN, 1, {25204, 0}}, - { "ConnectX", CX_HW_ID, CT_CONNECTX, 2, {25408, 25418, 26418, 26438, - 26428, 25448, 26448, 26468, - 25458, 26458, 26478, 26488, - 4097, 4098, 0}}, { "ConnectX-3", CX3_HW_ID, CT_CONNECTX, 2, {4099, 4100, 4101, 4102, 4104, 4105, 4106, 4107, 4108, 4109, 4110, @@ -833,36 +834,29 @@ const FwOperations::HwDevData FwOperations::hwDevData[] = { { "Connect_IB", CONNECT_IB_HW_ID, CT_CONNECT_IB, 2, {CONNECT_IB_SW_ID, 4114, 4115, 4116, 4117, 4118, 4119, 4120, 4121, 4122, 4123, 4124, 0}}, - { "InfiniScale IV", IS4_HW_ID, CT_IS4, 0, {48436, 48437, 48438, 0}}, - { "BridgeX", BRIDGEX_HW_ID, CT_BRIDGEX, 0, {64102, 64112, 64122, 0}}, { "SwitchX", SWITCHX_HW_ID, CT_SWITCHX, 0, {51000, 0}}, { "Switch_IB", SWITCH_IB_HW_ID, CT_SWITCH_IB, 0, {52000, 0}}, { "ConnectX-4", CX4_HW_ID, CT_CONNECTX4, 0, {4115, 0}}, { "ConnectX-4LX", CX4LX_HW_ID, CT_CONNECTX4_LX, 0, {4117, 0}}, + { "ConnectX-5", CX5_HW_ID, CT_CONNECTX5, 0, {4119, 0}}, { "Spectrum", SPECTRUM_HW_ID, CT_SPECTRUM, 0, {52100, 0}}, + { "Switch_IB2", SWITCH_IB2_HW_ID, CT_SWITCH_IB2, 0, {53000, 0}}, { (char*)NULL , 0, CT_UNKNOWN, 0, {0}},// zero devid terminator }; const FwOperations::HwDev2Str FwOperations::hwDev2Str[] = { {"ConnectIB", CONNECT_IB_HW_ID, 0x00}, - {"ConnectX", CX_HW_ID, 0xA0}, - {"ConnectX-2", CX_HW_ID, 0xB0}, {"ConnectX-3 A0", CX3_HW_ID, 0x00}, {"ConnectX-3 A1", CX3_HW_ID, 0x01}, {"ConnectX-3Pro", CX3_PRO_HW_ID, 0x00}, {"ConnectX-4", CX4_HW_ID, 0x00}, {"ConnectX-4LX", CX4LX_HW_ID, 0x00}, + {"ConnectX-5", CX5_HW_ID, 0x00}, {"SwitchX A0", SWITCHX_HW_ID, 0x00}, {"SwitchX A1", SWITCHX_HW_ID, 0x01}, - {"BridgeX", BRIDGEX_HW_ID, 0xA0}, - {"InfiniScale IV A0", IS4_HW_ID, 0xA0}, - {"InfiniScale IV A1", IS4_HW_ID, 0xA1}, - {"InfiniHost A0", INFINIHOST_HW_ID, 0xA0}, - {"InfiniHost A1", INFINIHOST_HW_ID, 0xA1}, - {"InfiniHost III Lx", INFINIHOST_III_LX_HW_ID, 0xA0}, - {"InfiniHost III Ex", INFINIHOST_III_EX_HW_ID, 0xA0}, {"SwitchIB A0", SWITCH_IB_HW_ID, 0x00}, - {"Spectrum A0", SPECTRUM_HW_ID, 0x00}, + {"Spectrum A0", SPECTRUM_HW_ID, 0x00}, + {"SwitchIB2 A0", SWITCH_IB2_HW_ID, 0x00}, { (char*)NULL , (u_int32_t)0, (u_int8_t)0x00}, // zero device ID terminator }; @@ -947,10 +941,6 @@ bool FwOperations::CheckMatchingDevId(u_int32_t hwDevId, u_int32_t imageDevId) { const HwDevData* devData = (const HwDevData*)NULL; const char* hwDevName = (const char*)NULL; - // HACK: InfiniHost III LX may have 2 HW device ids. - Map the second devid to the first. - if (hwDevId == 24204) { - hwDevId = 25204; - } // First, find the HW device that the SW id matches for (int i = 0; hwDevData[i].hwDevId != 0 ; i++) { @@ -1019,7 +1009,7 @@ bool FwOperations::CheckFwVersion(FwOperations &imageOps, u_int8_t forceVersion) bool FwOperations::FwSwReset() { if (!_ioAccess->is_flash()) { - return errmsg("operation supported only for switch devices InfiniScaleIV, SwitchX and SwitchIB over an IB interface"); + return errmsg("operation supported only for switch devices: SwitchX and SwitchIB over an IB interface"); } if (!((Flash*)_ioAccess)->sw_reset()) { return errmsg("%s", _ioAccess->err()); @@ -1053,12 +1043,8 @@ bool FwOperations::UpdateImgCache(u_int8_t *buff, u_int32_t addr, u_int32_t size bool FwOperations::CntxEthOnly(u_int32_t devid) { - return(devid == 25448) || // ETH - (devid == 26448) || // ETH - (devid == 25458) || // - (devid == 26458) || // - (devid == 26468) || - (devid == 26478); + (void)devid; + return false; } // RomInfo implementation @@ -1419,15 +1405,13 @@ bool FwOperations::ReadImageFile(const char *fimage, u_int8_t *&file_data, int & void FwOperations::SetDevFlags(chip_type_t chipType, u_int32_t devType, fw_img_type_t fwType, bool &ibDev, bool ðDev) { - if (chipType == CT_IS4) { - ibDev = true; - ethDev = false; - } else if (chipType == CT_SWITCHX) { + (void)devType; + if (chipType == CT_SWITCHX) { ibDev = true; ethDev = true; } else { - ibDev = (fwType == FIT_FS3 && chipType != CT_SPECTRUM) || !CntxEthOnly(devType); - ethDev = (chipType == CT_CONNECTX) || (chipType == CT_SPECTRUM) || (chipType == CT_CONNECTX4) || (chipType == CT_CONNECTX4_LX); + ibDev = (fwType == FIT_FS3 && chipType != CT_SPECTRUM) || chipType == CT_CONNECTX; + ethDev = (chipType == CT_CONNECTX) || (chipType == CT_SPECTRUM) || (chipType == CT_CONNECTX4) || (chipType == CT_CONNECTX4_LX) || (chipType == CT_CONNECTX5); } if ((!ibDev && !ethDev) || chipType == CT_UNKNOWN) { @@ -1581,3 +1565,23 @@ const char* FwOperations::expRomType2Str(u_int16_t type) } return (const char*)NULL; } + +bool FwOperations::FwSetTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer) +{ + (void)timestamp; + (void)fwVer; + return errmsg("Operation not supported."); +} + +bool FwOperations::FwResetTimeStamp() +{ + return errmsg("Operation not supported."); +} + +bool FwOperations::FwQueryTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer, bool queryRunning) +{ + (void)timestamp; + (void)fwVer; + (void)queryRunning; + return errmsg("Operation not supported."); +} diff --git a/mlxfwops/lib/fw_ops.h b/mlxfwops/lib/fw_ops.h index 93d58c2..4bf363f 100644 --- a/mlxfwops/lib/fw_ops.h +++ b/mlxfwops/lib/fw_ops.h @@ -108,6 +108,10 @@ public: virtual bool FwShiftDevData(PrintCallBack progressFunc=(PrintCallBack)NULL) = 0; virtual const char* FwGetResetRecommandationStr() = 0; + virtual bool FwSetTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer); + virtual bool FwQueryTimeStamp(struct tools_open_ts_entry& timestamp, struct tools_open_fw_version& fwVer, bool queryRunning=false); + virtual bool FwResetTimeStamp(); + void FwCleanUp(); virtual bool FwInit() = 0; bool FwSetPrint(PrintCallBack PrintFunc); @@ -115,6 +119,7 @@ public: //needed for flint low level operations bool FwSwReset(); virtual bool CheckCX4Device() {return true;} + virtual bool FwCalcMD5(u_int8_t md5sum[16]) = 0; //virtual bool FwBurnBlock(FwOperations &FwImageAccess); // Add call back @@ -173,7 +178,7 @@ public: //burn params bool userGuidsSpecified; bool userMacsSpecified; - bool userUidsSpecified; + bool userUidSpecified; bool vsdSpecified; bool blankGuids; bool burnFailsafe; @@ -184,6 +189,7 @@ public: bool noDevidCheck; bool ignoreVersionCheck; bool useImgDevData; // FS3 image only - take device data sections from image (valid only if burnFailsafe== false) + bool useDevImgInfo; // FS3 image only - preserve select fields of image_info section on the device when burning. BurnRomOption burnRomOptions; //callback fun @@ -193,10 +199,11 @@ public: std::vector userUids; //contains eiter guids or uids - ExtBurnParams():userGuidsSpecified(false), userMacsSpecified(false), userUidsSpecified(false), + ExtBurnParams():userGuidsSpecified(false), userMacsSpecified(false), userUidSpecified(false), vsdSpecified(false),blankGuids(false), burnFailsafe(true), allowPsidChange(false), useImagePs(false), useImageGuids(false), singleImageBurn(true), noDevidCheck(false), - ignoreVersionCheck(false), useImgDevData(false), burnRomOptions(BRO_DEFAULT), progressFunc((ProgressCallBack)NULL), + ignoreVersionCheck(false), useImgDevData(false), useDevImgInfo(false), + burnRomOptions(BRO_DEFAULT), progressFunc((ProgressCallBack)NULL), userVsd((char*)NULL){} }; @@ -231,7 +238,7 @@ public: bool stripedImage; // default shuold be set to false unless working on striped image file bool macsSpecified; bool guidsSpecified; - bool uidsSpecified; // valid for BridgeX and ConnectIB only + bool uidSpecified; // valid for ConnectIB only std::vector userGuids; u_int8_t numOfGUIDs; // number of GUIDs to allocate for each port. keep zero for default. (FS3 image Only) u_int8_t stepSize; // step size between GUIDs. keep zero for default. (FS3 Image Only) @@ -260,7 +267,6 @@ protected: fw_img_type_t fwType; }; enum { - OLD_CNTX_START_POS_SIZE = 6, CNTX_START_POS_SIZE = 8 }; enum { @@ -308,7 +314,7 @@ protected: bool checkBoot2(u_int32_t beg, u_int32_t offs, u_int32_t& next, bool fullRead, const char *pref, VerifyCallBack verifyCallBackFunc = (VerifyCallBack)NULL); u_int32_t CalcImageCRC(u_int32_t* buff, u_int32_t size); - bool writeImage(ProgressCallBack progressFunc, u_int32_t addr, void *data, int cnt, bool isPhysAddr = false, int totalSz = -1, int alreadyWrittenSz = 0); + bool writeImage(ProgressCallBack progressFunc, u_int32_t addr, void *data, int cnt, bool isPhysAddr = false, bool readModifyWrite=false, int totalSz = -1, int alreadyWrittenSz = 0); ////////////////////////////////////////////////////////////////// bool GetSectData(std::vector& file_sect, const u_int32_t *buff, const u_int32_t size); //////////////////////////////////////////////////////////////////// diff --git a/mlxfwops/lib/mlxfwops.cpp b/mlxfwops/lib/mlxfwops.cpp index c46d98d..a720535 100755 --- a/mlxfwops/lib/mlxfwops.cpp +++ b/mlxfwops/lib/mlxfwops.cpp @@ -167,8 +167,8 @@ MLXFWOP_API int MLXFWOPCALL mlxfw_burn(mlxfwops_t* dev_mlxfwops, mlxfwops_t* img burnParams.progressFunc = prog_func; burnParams.allowPsidChange = allow_psid_change ? true : false; bool rc = !static_cast((void*)dev_mlxfwops)->FwBurnAdvanced(static_cast((void*)img_mlxfwops),burnParams); - return static_cast((void*)dev_mlxfwops)->getErrorCode() ?\ - static_cast((void*)dev_mlxfwops)->getErrorCode() : rc; + int errorCode = static_cast((void*)dev_mlxfwops)->getErrorCode(); // the class's verbose error code + return rc ? ( errorCode ? errorCode : rc) : rc; } MLXFWOP_API int MLXFWOPCALL mlxfw_query(mlxfwops_t* mlxfwops, fw_info_t* fw_info) @@ -176,7 +176,12 @@ MLXFWOP_API int MLXFWOPCALL mlxfw_query(mlxfwops_t* mlxfwops, fw_info_t* fw_info if (mlxfwops == NULL) { return MLXFW_BAD_PARAM_ERR; } +#ifdef UEFI_BUILD + // skip reading ROM in UEFI due to performance issues + return (static_cast((void*)mlxfwops)->FwQuery(fw_info, false) == true) ? MLXFW_OK : MLXFW_ERR_IN_STR; +#else return (static_cast((void*)mlxfwops)->FwQuery(fw_info, true) == true) ? MLXFW_OK : MLXFW_ERR_IN_STR; +#endif } MLXFWOP_API const char* MLXFWOPCALL mlxfw_exp_rom_type_to_str(u_int16_t type) diff --git a/mlxfwops/lib/mlxfwops_com.h b/mlxfwops/lib/mlxfwops_com.h index e690016..5b76bc5 100644 --- a/mlxfwops/lib/mlxfwops_com.h +++ b/mlxfwops/lib/mlxfwops_com.h @@ -65,6 +65,9 @@ typedef int (*f_prog_func_str) (char* str); #define PSID_LEN 16 #define PRODUCT_VER_LEN 16 #define PRS_NAME_LEN 100 +#define FS3_PRS_NAME_LEN 97 +#define NAME_LEN 65 +#define DESCRIPTION_LEN 257 #define FREE_STR_MAX_LEN 256 @@ -115,7 +118,8 @@ enum { MLXFW_ROM_UPDATE_IN_IMAGE_ERR, MLXFW_GET_SECT_ERR, MLXFW_UPDATE_SECT_ERR, - MLXFW_BAD_PARAM_ERR + MLXFW_BAD_PARAM_ERR, + MLXFW_PRS_MISSMATCH_ERR }; enum { @@ -153,13 +157,13 @@ typedef enum chip_type { CT_UNKNOWN = 0, CT_CONNECTX, CT_SWITCHX, - CT_BRIDGEX, - CT_IS4, CT_CONNECT_IB, CT_SWITCH_IB, CT_SPECTRUM, CT_CONNECTX4, CT_CONNECTX4_LX, + CT_SWITCH_IB2, + CT_CONNECTX5, }chip_type_t; typedef struct guid { @@ -222,6 +226,10 @@ typedef struct fs3_info_ext { uids_t orig_fs3_uids_info; char image_vsd[VSD_LEN+1]; char orig_psid[PSID_LEN+1]; + char prs_name[FS3_PRS_NAME_LEN]; + char orig_prs_name[FS3_PRS_NAME_LEN]; + char name[NAME_LEN]; + char description[DESCRIPTION_LEN]; } fs3_info_t; @@ -265,6 +273,7 @@ typedef struct fw_info_com { u_int8_t is_failsafe; chip_type_t chip_type; roms_info_t roms_info; + u_int16_t running_fw_ver[3]; } fw_info_com_t; diff --git a/mstdump/crd_lib/crdump.c b/mstdump/crd_lib/crdump.c index 451a944..91f5acf 100755 --- a/mstdump/crd_lib/crdump.c +++ b/mstdump/crd_lib/crdump.c @@ -327,16 +327,9 @@ static int crd_get_csv_path(IN dm_dev_id_t dev_type, OUT char *csv_file_path) { const int dev_name_len = 100; char dev_name[100] = {0}; int rc; - switch (dev_type) { - case DeviceInfiniHostIIIEx: - case DeviceInfiniHostIIIEx_MF: - case DeviceInfiniHost: - case DeviceInfiniScale: - case DeviceInfiniHostIIILx: - return CRD_NOT_SUPPORTED; - default: - strncpy(dev_name, dm_dev_type2str(dev_type), dev_name_len - 1); - } + + strncpy(dev_name, dm_dev_type2str(dev_type), dev_name_len - 1); + if (!strcmp(dev_name, "Unknown Device")) { return CRD_UNKOWN_DEVICE; } @@ -504,8 +497,8 @@ static int crd_read_line(IN FILE *fd, OUT char *tmp) { if (!feof(fd)) { int c = fgetc(fd); if (c == '#') { - char* _ptr=fgets (tmp, 300, fd); - (void)_ptr;//avoid warning + if (!fgets (tmp, 300, fd)) { // Avoid warning + } tmp[0] = 0; continue; } diff --git a/mstdump/mstdump_dbs/BridgeX.csv b/mstdump/mstdump_dbs/BridgeX.csv deleted file mode 100755 index 8c8f6dc..0000000 --- a/mstdump/mstdump_dbs/BridgeX.csv +++ /dev/null @@ -1,1463 +0,0 @@ -# addr, size, enable addr -0x000000,5, -0x000018,1, -0x000020,1, -0x000030,2, -0x000084,8,UNKNOWN -0x0000a8,12,UNKNOWN -0x0000dc,1,UNKNOWN -0x0000f4,8,UNKNOWN -0x000118,1, -0x000120,1, -0x000130,2, -0x000180,9,UNKNOWN -0x0001a8,12,UNKNOWN -0x0001dc,1,UNKNOWN -0x0001f4,8,UNKNOWN -0x000218,1, -0x000220,1, -0x000230,2, -0x000280,9,UNKNOWN -0x0002a8,12,UNKNOWN -0x0002dc,1,UNKNOWN -0x0002f4,15,UNKNOWN -0x000400,15,UNKNOWN -0x000440,4,UNKNOWN -0x000500,7,UNKNOWN -0x000520,1,UNKNOWN -0x000530,2,UNKNOWN -0x000540,4,UNKNOWN -0x000554,2,UNKNOWN -0x000560,4,UNKNOWN -0x000574,1,UNKNOWN -0x00057c,4,UNKNOWN -0x000590,9,UNKNOWN -0x0005c0,4,UNKNOWN -0x0005d4,3,UNKNOWN -0x0005e4,1,UNKNOWN -0x0005ec,1,UNKNOWN -0x000600,7,UNKNOWN -0x000620,1,UNKNOWN -0x000630,2,UNKNOWN -0x000640,4,UNKNOWN -0x000654,2,UNKNOWN -0x000660,4,UNKNOWN -0x000674,1,UNKNOWN -0x00067c,4,UNKNOWN -0x000690,9,UNKNOWN -0x0006c0,4,UNKNOWN -0x0006d4,3,UNKNOWN -0x0006e4,1,UNKNOWN -0x0006ec,1,UNKNOWN -0x000700,7,UNKNOWN -0x000720,1,UNKNOWN -0x000730,2,UNKNOWN -0x000740,4,UNKNOWN -0x000754,2,UNKNOWN -0x000760,4,UNKNOWN -0x000774,1,UNKNOWN -0x00077c,4,UNKNOWN -0x000790,9,UNKNOWN -0x0007c0,4,UNKNOWN -0x0007d4,3,UNKNOWN -0x0007e4,1,UNKNOWN -0x0007ec,1,UNKNOWN -0x000800,2,UNKNOWN -0x00080c,3,UNKNOWN -0x00081c,1,UNKNOWN -0x000828,1,UNKNOWN -0x000840,4,UNKNOWN -0x000854,4,UNKNOWN -0x000880,3,UNKNOWN -0x000890,2,UNKNOWN -0x000900,1,UNKNOWN -0x000908,1,UNKNOWN -0x000910,2,UNKNOWN -0x00091c,4,UNKNOWN -0x000940,13,UNKNOWN -0x000980,10,UNKNOWN -0x0009c0,5,UNKNOWN -0x0009e0,1,UNKNOWN -0x0009f0,2,UNKNOWN -0x000a00,1,UNKNOWN -0x000a10,2,UNKNOWN -0x000a20,1,UNKNOWN -0x000a30,2,UNKNOWN -0x000a40,2,UNKNOWN -0x000c00,2,UNKNOWN -0x000c0c,3,UNKNOWN -0x000c1c,1,UNKNOWN -0x000c28,1,UNKNOWN -0x000c40,4,UNKNOWN -0x000c54,4,UNKNOWN -0x000c80,3,UNKNOWN -0x000c90,2,UNKNOWN -0x000d00,1,UNKNOWN -0x000d08,1,UNKNOWN -0x000d10,2,UNKNOWN -0x000d1c,4,UNKNOWN -0x000d40,13,UNKNOWN -0x000d80,10,UNKNOWN -0x000dc0,5,UNKNOWN -0x000de0,1,UNKNOWN -0x000df0,2,UNKNOWN -0x000e00,1,UNKNOWN -0x000e10,2,UNKNOWN -0x000e20,1,UNKNOWN -0x000e30,2,UNKNOWN -0x000e40,2,UNKNOWN -0x001000,2,UNKNOWN -0x00100c,3,UNKNOWN -0x00101c,1,UNKNOWN -0x001028,1,UNKNOWN -0x001040,4,UNKNOWN -0x001054,4,UNKNOWN -0x001080,3,UNKNOWN -0x001090,2,UNKNOWN -0x001100,1,UNKNOWN -0x001108,1,UNKNOWN -0x001110,2,UNKNOWN -0x00111c,4,UNKNOWN -0x001140,13,UNKNOWN -0x001180,10,UNKNOWN -0x0011c0,5,UNKNOWN -0x0011e0,1,UNKNOWN -0x0011f0,2,UNKNOWN -0x001200,1,UNKNOWN -0x001210,2,UNKNOWN -0x001220,1,UNKNOWN -0x001230,2,UNKNOWN -0x001240,2,UNKNOWN -0x001400,2,UNKNOWN -0x00140c,3,UNKNOWN -0x00141c,1,UNKNOWN -0x001428,1,UNKNOWN -0x001440,4,UNKNOWN -0x001454,4,UNKNOWN -0x001480,3,UNKNOWN -0x001490,2,UNKNOWN -0x001500,1,UNKNOWN -0x001508,1,UNKNOWN -0x001510,2,UNKNOWN -0x00151c,4,UNKNOWN -0x001540,13,UNKNOWN -0x001580,10,UNKNOWN -0x0015c0,5,UNKNOWN -0x0015e0,1,UNKNOWN -0x0015f0,2,UNKNOWN -0x001600,1,UNKNOWN -0x001610,2,UNKNOWN -0x001620,1,UNKNOWN -0x001630,2,UNKNOWN -0x001640,2,UNKNOWN -0x002000,108,UNKNOWN -0x002800,26,UNKNOWN -0x002870,3,UNKNOWN -0x002890,14,UNKNOWN -0x0028d0,2,UNKNOWN -0x0028e0,20,UNKNOWN -0x002a00,1,UNKNOWN -0x002a10,6,UNKNOWN -0x002a30,21,UNKNOWN -0x002a90,2,UNKNOWN -0x003000,26,UNKNOWN -0x003070,3,UNKNOWN -0x003090,14,UNKNOWN -0x0030d0,2,UNKNOWN -0x0030e0,20,UNKNOWN -0x003200,1,UNKNOWN -0x003210,6,UNKNOWN -0x003230,21,UNKNOWN -0x003290,2,UNKNOWN -0x003800,26,UNKNOWN -0x003870,3,UNKNOWN -0x003890,14,UNKNOWN -0x0038d0,2,UNKNOWN -0x0038e0,20,UNKNOWN -0x003a00,1,UNKNOWN -0x003a10,6,UNKNOWN -0x003a30,21,UNKNOWN -0x003a90,2,UNKNOWN -0x004000,8,UNKNOWN -0x004028,7,UNKNOWN -0x00404c,7,UNKNOWN -0x004074,7,UNKNOWN -0x004098,7,UNKNOWN -0x0040bc,7,UNKNOWN -0x0040e4,7,UNKNOWN -0x004108,7,UNKNOWN -0x00412c,7,UNKNOWN -0x004160,1,UNKNOWN -0x004170,2,UNKNOWN -0x004180,1,UNKNOWN -0x004190,2,UNKNOWN -0x004200,7,UNKNOWN -0x004220,9,UNKNOWN -0x004250,7,UNKNOWN -0x004280,1,UNKNOWN -0x004290,2,UNKNOWN -0x004300,7,UNKNOWN -0x004320,9,UNKNOWN -0x004350,7,UNKNOWN -0x004380,1,UNKNOWN -0x004390,2,UNKNOWN -0x004400,7,UNKNOWN -0x004420,9,UNKNOWN -0x004450,7,UNKNOWN -0x004480,1,UNKNOWN -0x004490,2,UNKNOWN -0x004500,7,UNKNOWN -0x004520,9,UNKNOWN -0x004550,7,UNKNOWN -0x004580,1,UNKNOWN -0x004590,2,UNKNOWN -0x004600,2,UNKNOWN -0x004610,2,UNKNOWN -0x004640,1,UNKNOWN -0x004648,2,UNKNOWN -0x004654,3,UNKNOWN -0x004700,1,UNKNOWN -0x00470c,1,UNKNOWN -0x004718,2,UNKNOWN -0x004728,1,UNKNOWN -0x004740,1,UNKNOWN -0x004750,2,UNKNOWN -0x0047f0,2,UNKNOWN -0x004800,1,UNKNOWN -0x004810,2,UNKNOWN -0x004820,3,UNKNOWN -0x004830,3,UNKNOWN -0x004900,3,UNKNOWN -0x004910,3,UNKNOWN -0x004920,3,UNKNOWN -0x004930,3,UNKNOWN -0x004940,18,UNKNOWN -0x00498c,6,UNKNOWN -0x0049c0,1,UNKNOWN -0x0049d0,2,UNKNOWN -0x005000,604,UNKNOWN -0x006000,604,UNKNOWN -0x007000,604,UNKNOWN -0x008000,5, -0x008018,1, -0x008020,1, -0x008030,2, -0x008080,9, -0x0080a8,12, -0x0080dc,1, -0x0080f4,8, -0x008118,1, -0x008120,1, -0x008130,2, -0x008180,9,UNKNOWN -0x0081a8,12,UNKNOWN -0x0081dc,1,UNKNOWN -0x0081f4,8,UNKNOWN -0x008218,1,UNKNOWN -0x008220,1,UNKNOWN -0x008230,2,UNKNOWN -0x008280,9,UNKNOWN -0x0082a8,12,UNKNOWN -0x0082dc,1,UNKNOWN -0x0082f4,15,UNKNOWN -0x008400,15, -0x008440,4, -0x008500,7,UNKNOWN -0x008520,1,UNKNOWN -0x008530,2,UNKNOWN -0x008540,4,UNKNOWN -0x008554,2,UNKNOWN -0x008560,4,UNKNOWN -0x008574,1,UNKNOWN -0x00857c,4,UNKNOWN -0x008590,9,UNKNOWN -0x0085c0,4,UNKNOWN -0x0085d4,3,UNKNOWN -0x0085e4,1,UNKNOWN -0x0085ec,1,UNKNOWN -0x008600,7,UNKNOWN -0x008620,1,UNKNOWN -0x008630,2,UNKNOWN -0x008640,4,UNKNOWN -0x008654,2,UNKNOWN -0x008660,4,UNKNOWN -0x008674,1,UNKNOWN -0x00867c,4,UNKNOWN -0x008690,9,UNKNOWN -0x0086c0,4,UNKNOWN -0x0086d4,3,UNKNOWN -0x0086e4,1,UNKNOWN -0x0086ec,1,UNKNOWN -0x008700,7,UNKNOWN -0x008720,1,UNKNOWN -0x008730,2,UNKNOWN -0x008740,4,UNKNOWN -0x008754,2,UNKNOWN -0x008760,4,UNKNOWN -0x008774,1,UNKNOWN -0x00877c,4,UNKNOWN -0x008790,9,UNKNOWN -0x0087c0,4,UNKNOWN -0x0087d4,3,UNKNOWN -0x0087e4,1,UNKNOWN -0x0087ec,1,UNKNOWN -0x008900,2, -0x00890c,2, -0x008918,5, -0x008938,4, -0x008960,1, -0x008970,2, -0x008c00,1, -0x008c10,7, -0x008c30,2, -0x008c40,5, -0x008c60,3, -0x008c70,5, -0x008c88,4, -0x008d10,8, -0x008d34,1, -0x008d40,1, -0x008e00,1, -0x008e10,2, -0x009000,108, -0x009800,26,UNKNOWN -0x009870,3,UNKNOWN -0x009890,14,UNKNOWN -0x0098d0,2,UNKNOWN -0x0098e0,20,UNKNOWN -0x009a00,1,UNKNOWN -0x009a10,6,UNKNOWN -0x009a30,21,UNKNOWN -0x009a90,2,UNKNOWN -0x00a000,26,UNKNOWN -0x00a070,3,UNKNOWN -0x00a090,14,UNKNOWN -0x00a0d0,2,UNKNOWN -0x00a0e0,20,UNKNOWN -0x00a200,1,UNKNOWN -0x00a210,6,UNKNOWN -0x00a230,21,UNKNOWN -0x00a290,2,UNKNOWN -0x00a800,26,UNKNOWN -0x00a870,3,UNKNOWN -0x00a890,14,UNKNOWN -0x00a8d0,2,UNKNOWN -0x00a8e0,20,UNKNOWN -0x00aa00,1,UNKNOWN -0x00aa10,6,UNKNOWN -0x00aa30,21,UNKNOWN -0x00aa90,2,UNKNOWN -0x00b000,8,UNKNOWN -0x00b028,7,UNKNOWN -0x00b04c,7,UNKNOWN -0x00b074,7,UNKNOWN -0x00b098,7,UNKNOWN -0x00b0bc,7,UNKNOWN -0x00b0e4,7,UNKNOWN -0x00b108,7,UNKNOWN -0x00b12c,7,UNKNOWN -0x00b160,1,UNKNOWN -0x00b170,2,UNKNOWN -0x00b180,1,UNKNOWN -0x00b190,2,UNKNOWN -0x00b300,7, -0x00b320,9, -0x00b350,7, -0x00b380,1, -0x00b390,2, -0x00b400,7, -0x00b420,9, -0x00b450,7, -0x00b480,1, -0x00b490,2, -0x00b500,7, -0x00b520,9, -0x00b550,7, -0x00b580,1, -0x00b590,2, -0x00b900,1, -0x00b90c,1, -0x00b918,2, -0x00b928,1, -0x00b940,1, -0x00b950,2, -0x00b9f0,2, -0x00ba00,1, -0x00ba10,2, -0x00ba20,3, -0x00bb00,2, -0x00bb10,2, -0x00bb3c,1, -0x00bb44,2, -0x00bb50,2, -0x00c700,3, -0x00c710,3, -0x00c720,3, -0x00c730,3, -0x00c740,18, -0x00c78c,6, -0x00c7c0,1, -0x00c7d0,2, -0x00d000,604, -0x00e000,604, -0x00f000,604,UNKNOWN -0x014000,1, -0x014008,1, -0x014010,1, -0x014018,1, -0x014020,1, -0x014028,1, -0x014030,1, -0x014038,1, -0x014040,1, -0x014048,1, -0x014050,1, -0x014058,1, -0x014060,1, -0x014068,1, -0x014070,1, -0x014084,7, -0x0140a4,1, -0x0140cc,5, -0x0140e4,10, -0x014110,1, -0x014130,1, -0x01413c,1, -0x014144,4, -0x01415c,1, -0x014170,20, -0x014200,2, -0x01420c,8, -0x014234,2, -0x014240,3, -0x014254,2, -0x0142c0,16, -0x014400,9, -0x014440,8, -0x014480,9, -0x0144c0,8, -0x014500,9, -0x014540,8, -0x014580,9, -0x0145c0,8, -0x014600,8, -0x014684,1, -0x0146ac,13, -0x014700,12, -0x014800,8, -0x014840,16, -0x014884,4, -0x014898,15, -0x0148dc,4, -0x014900,3, -0x014910,3, -0x014920,6, -0x014940,6, -0x014960,3, -0x014980,1, -0x014994,3, -0x014a00,1, -0x014a14,6, -0x014a34,2, -0x014a40,4, -0x014a80,1, -0x014a88,24, -0x014b1c,15, -0x014b5c,1, -0x014c00,22, -0x014c60,6, -0x014c80,6, -0x014ca0,6, -0x014cc0,6, -0x014ce0,6, -0x014d40,28, -0x014dc0,8, -0x014e00,17, -0x014e48,64, -0x015000,1, -0x015008,1, -0x015010,1, -0x015018,1, -0x015020,1, -0x015028,1, -0x015030,1, -0x015038,1, -0x015040,1, -0x015048,1, -0x015050,1, -0x015058,1, -0x015060,1, -0x015068,1, -0x015070,1, -0x015084,7, -0x0150a4,1, -0x0150cc,5, -0x0150e4,12, -0x015130,2, -0x01513c,1, -0x015160,3, -0x015200,2, -0x01520c,1, -0x015214,1, -0x015220,2, -0x01522c,1, -0x015234,1, -0x015240,2, -0x01524c,1, -0x015254,1, -0x015268,1, -0x015274,1, -0x015280,16, -0x015400,9, -0x015440,8, -0x015480,9, -0x0154c0,8, -0x015500,9, -0x015540,8, -0x015600,8, -0x015684,1, -0x0156a4,11, -0x0156d4,7, -0x015700,12, -0x0157dc,2, -0x015800,8, -0x015840,16, -0x015884,4, -0x015898,15, -0x0158dc,4, -0x015900,3, -0x015940,6, -0x015960,3, -0x015980,1, -0x015994,3, -0x015a00,1, -0x015a14,6, -0x015a34,2, -0x015a40,9, -0x015a80,1, -0x015a88,24, -0x015b1c,15, -0x015b5c,1, -0x015c00,22, -0x015c60,6, -0x015c80,6, -0x015ca0,6, -0x015cc0,6, -0x015ce0,6, -0x015d40,28, -0x015dc0,8, -0x015e00,17, -0x015e48,64, -0x016064,7, -0x016084,7, -0x0160c0,1, -0x016114,6, -0x016200,20, -0x016258,5, -0x016270,1, -0x016400,11, -0x016460,65, -0x016570,3, -0x016604,1, -0x016614,3, -0x016624,1, -0x016634,8, -0x01667c,3, -0x01668c,3, -0x01669c,3, -0x0166ac,3, -0x0166bc,3, -0x0166cc,3, -0x0166dc,3, -0x0166ec,3, -0x0166fc,3, -0x01670c,3, -0x01671c,3, -0x01672c,3, -0x01673c,3, -0x01674c,3, -0x01675c,3, -0x01676c,3, -0x01677c,9, -0x016880,1, -0x016890,2, -0x0168a0,3, -0x016a00,2, -0x016a0c,2, -0x016a18,3, -0x016a28,1, -0x016a40,1, -0x016a50,2, -0x016a60,1, -0x016a70,2, -0x016af0,3, -0x016b00,1, -0x016b10,2, -0x016b20,1, -0x016b30,2, -0x016b40,1, -0x016b50,2, -0x016b60,1, -0x016b70,2, -0x016b80,1, -0x016b90,2, -0x016ba0,3, -0x016bb0,1, -0x017000,1, -0x017040,1, -0x017048,3, -0x017058,3, -0x017068,3, -0x017078,3, -0x017088,3, -0x017098,3, -0x0170a8,3, -0x0170b8,3, -0x0170c8,3, -0x0170d8,3, -0x0170e8,3, -0x0170f8,3, -0x017110,2, -0x01748c,3, -0x0174a0,4, -0x020000,5, -0x020018,1, -0x020020,1, -0x020030,2, -0x020080,9,UNKNOWN -0x0200a8,12,UNKNOWN -0x0200dc,1,UNKNOWN -0x0200f4,8,UNKNOWN -0x020118,1, -0x020120,1, -0x020130,2, -0x020180,9,UNKNOWN -0x0201a8,12,UNKNOWN -0x0201dc,1,UNKNOWN -0x0201f4,8,UNKNOWN -0x020218,1,UNKNOWN -0x020220,1,UNKNOWN -0x020230,2,UNKNOWN -0x020280,9,UNKNOWN -0x0202a8,12,UNKNOWN -0x0202dc,1,UNKNOWN -0x0202f4,15,UNKNOWN -0x020400,15, -0x020440,4, -0x020500,7,UNKNOWN -0x020520,1,UNKNOWN -0x020530,2,UNKNOWN -0x020540,4,UNKNOWN -0x020554,2,UNKNOWN -0x020560,4,UNKNOWN -0x020574,1,UNKNOWN -0x02057c,4,UNKNOWN -0x020590,9,UNKNOWN -0x0205c0,4,UNKNOWN -0x0205d4,3,UNKNOWN -0x0205e4,1,UNKNOWN -0x0205ec,1,UNKNOWN -0x020600,7,UNKNOWN -0x020620,1,UNKNOWN -0x020630,2,UNKNOWN -0x020640,4,UNKNOWN -0x020654,2,UNKNOWN -0x020660,4,UNKNOWN -0x020674,1,UNKNOWN -0x02067c,4,UNKNOWN -0x020690,9,UNKNOWN -0x0206c0,4,UNKNOWN -0x0206d4,3,UNKNOWN -0x0206e4,1,UNKNOWN -0x0206ec,1,UNKNOWN -0x020700,7,UNKNOWN -0x020720,1,UNKNOWN -0x020730,2,UNKNOWN -0x020740,4,UNKNOWN -0x020754,2,UNKNOWN -0x020760,4,UNKNOWN -0x020774,1,UNKNOWN -0x02077c,4,UNKNOWN -0x020790,9,UNKNOWN -0x0207c0,4,UNKNOWN -0x0207d4,3,UNKNOWN -0x0207e4,1,UNKNOWN -0x0207ec,1,UNKNOWN -0x020800,2,UNKNOWN -0x02080c,3,UNKNOWN -0x02081c,1,UNKNOWN -0x020828,1,UNKNOWN -0x020840,4,UNKNOWN -0x020854,4,UNKNOWN -0x020880,3,UNKNOWN -0x020890,2,UNKNOWN -0x020900,1,UNKNOWN -0x020908,1,UNKNOWN -0x020910,2,UNKNOWN -0x02091c,4,UNKNOWN -0x020940,13,UNKNOWN -0x020980,10,UNKNOWN -0x0209c0,5,UNKNOWN -0x0209e0,1,UNKNOWN -0x0209f0,2,UNKNOWN -0x020a00,1,UNKNOWN -0x020a10,2,UNKNOWN -0x020a20,1,UNKNOWN -0x020a30,2,UNKNOWN -0x020a40,2,UNKNOWN -0x020c00,2,UNKNOWN -0x020c0c,3,UNKNOWN -0x020c1c,1,UNKNOWN -0x020c28,1,UNKNOWN -0x020c40,4,UNKNOWN -0x020c54,4,UNKNOWN -0x020c80,3,UNKNOWN -0x020c90,2,UNKNOWN -0x020d00,1,UNKNOWN -0x020d08,1,UNKNOWN -0x020d10,2,UNKNOWN -0x020d1c,4,UNKNOWN -0x020d40,13,UNKNOWN -0x020d80,10,UNKNOWN -0x020dc0,5,UNKNOWN -0x020de0,1,UNKNOWN -0x020df0,2,UNKNOWN -0x020e00,1,UNKNOWN -0x020e10,2,UNKNOWN -0x020e20,1,UNKNOWN -0x020e30,2,UNKNOWN -0x020e40,2,UNKNOWN -0x021000,2,UNKNOWN -0x02100c,3,UNKNOWN -0x02101c,1,UNKNOWN -0x021028,1,UNKNOWN -0x021040,4,UNKNOWN -0x021054,4,UNKNOWN -0x021080,3,UNKNOWN -0x021090,2,UNKNOWN -0x021100,1,UNKNOWN -0x021108,1,UNKNOWN -0x021110,2,UNKNOWN -0x02111c,4,UNKNOWN -0x021140,13,UNKNOWN -0x021180,10,UNKNOWN -0x0211c0,5,UNKNOWN -0x0211e0,1,UNKNOWN -0x0211f0,2,UNKNOWN -0x021200,1,UNKNOWN -0x021210,2,UNKNOWN -0x021220,1,UNKNOWN -0x021230,2,UNKNOWN -0x021240,2,UNKNOWN -0x021400,2,UNKNOWN -0x02140c,3,UNKNOWN -0x02141c,1,UNKNOWN -0x021428,1,UNKNOWN -0x021440,4,UNKNOWN -0x021454,4,UNKNOWN -0x021480,3,UNKNOWN -0x021490,2,UNKNOWN -0x021500,1,UNKNOWN -0x021508,1,UNKNOWN -0x021510,2,UNKNOWN -0x02151c,4,UNKNOWN -0x021540,13,UNKNOWN -0x021580,10,UNKNOWN -0x0215c0,5,UNKNOWN -0x0215e0,1,UNKNOWN -0x0215f0,2,UNKNOWN -0x021600,1,UNKNOWN -0x021610,2,UNKNOWN -0x021620,1,UNKNOWN -0x021630,2,UNKNOWN -0x021640,2,UNKNOWN -0x022000,108,UNKNOWN -0x022800,26,UNKNOWN -0x022870,3,UNKNOWN -0x022890,14,UNKNOWN -0x0228d0,2,UNKNOWN -0x0228e0,20,UNKNOWN -0x022a00,1,UNKNOWN -0x022a10,6,UNKNOWN -0x022a30,21,UNKNOWN -0x022a90,2,UNKNOWN -0x023000,26,UNKNOWN -0x023070,3,UNKNOWN -0x023090,14,UNKNOWN -0x0230d0,2,UNKNOWN -0x0230e0,20,UNKNOWN -0x023200,1,UNKNOWN -0x023210,6,UNKNOWN -0x023230,21,UNKNOWN -0x023290,2,UNKNOWN -0x023800,26,UNKNOWN -0x023870,3,UNKNOWN -0x023890,14,UNKNOWN -0x0238d0,2,UNKNOWN -0x0238e0,20,UNKNOWN -0x023a00,1,UNKNOWN -0x023a10,6,UNKNOWN -0x023a30,21,UNKNOWN -0x023a90,2,UNKNOWN -0x024000,8,UNKNOWN -0x024028,7,UNKNOWN -0x02404c,7,UNKNOWN -0x024074,7,UNKNOWN -0x024098,7,UNKNOWN -0x0240bc,7,UNKNOWN -0x0240e4,7,UNKNOWN -0x024108,7,UNKNOWN -0x02412c,7,UNKNOWN -0x024160,1,UNKNOWN -0x024170,2,UNKNOWN -0x024180,1,UNKNOWN -0x024190,2,UNKNOWN -0x024200,7, -0x024220,9, -0x024250,7, -0x024280,1, -0x024290,2, -0x024300,7, -0x024320,9, -0x024350,7, -0x024380,1, -0x024390,2, -0x024400,7, -0x024420,9, -0x024450,7, -0x024480,1, -0x024490,2, -0x024500,7,UNKNOWN -0x024520,9,UNKNOWN -0x024550,7,UNKNOWN -0x024580,1,UNKNOWN -0x024590,2,UNKNOWN -0x024600,2, -0x024610,2, -0x024640,1, -0x024648,2, -0x024654,3, -0x024700,1, -0x02470c,1, -0x024718,2, -0x024728,1, -0x024740,1, -0x024750,2, -0x0247f0,2, -0x024800,1, -0x024810,2, -0x024820,3, -0x024830,3, -0x024900,3,UNKNOWN -0x024910,3,UNKNOWN -0x024920,3,UNKNOWN -0x024930,3,UNKNOWN -0x024940,18,UNKNOWN -0x02498c,6,UNKNOWN -0x0249c0,1,UNKNOWN -0x0249d0,2,UNKNOWN -0x025000,604,UNKNOWN -0x026000,604,UNKNOWN -0x027000,604,UNKNOWN -0x028000,5, -0x028018,1, -0x028020,1, -0x028030,2, -0x028080,9, -0x0280a8,12, -0x0280dc,1, -0x0280f4,8, -0x028118,1, -0x028120,1, -0x028130,2, -0x028180,9,UNKNOWN -0x0281a8,12,UNKNOWN -0x0281dc,1,UNKNOWN -0x0281f4,8,UNKNOWN -0x028218,1, -0x028220,1, -0x028230,2, -0x028280,9,UNKNOWN -0x0282a8,12,UNKNOWN -0x0282dc,1,UNKNOWN -0x0282f4,15,UNKNOWN -0x028400,15, -0x028440,4, -0x028500,7,UNKNOWN -0x028520,1,UNKNOWN -0x028530,2,UNKNOWN -0x028540,4,UNKNOWN -0x028554,2,UNKNOWN -0x028560,4,UNKNOWN -0x028574,1,UNKNOWN -0x02857c,4,UNKNOWN -0x028590,9,UNKNOWN -0x0285c0,4,UNKNOWN -0x0285d4,3,UNKNOWN -0x0285e4,1,UNKNOWN -0x0285ec,1,UNKNOWN -0x028600,7,UNKNOWN -0x028620,1,UNKNOWN -0x028630,2,UNKNOWN -0x028640,4,UNKNOWN -0x028654,2,UNKNOWN -0x028660,4,UNKNOWN -0x028674,1,UNKNOWN -0x02867c,4,UNKNOWN -0x028690,9,UNKNOWN -0x0286c0,4,UNKNOWN -0x0286d4,3,UNKNOWN -0x0286e4,1,UNKNOWN -0x0286ec,1,UNKNOWN -0x028700,7,UNKNOWN -0x028720,1,UNKNOWN -0x028730,2,UNKNOWN -0x028740,4,UNKNOWN -0x028754,2,UNKNOWN -0x028760,4,UNKNOWN -0x028774,1,UNKNOWN -0x02877c,4,UNKNOWN -0x028790,9,UNKNOWN -0x0287c0,4,UNKNOWN -0x0287d4,3,UNKNOWN -0x0287e4,1,UNKNOWN -0x0287ec,1,UNKNOWN -0x028900,2, -0x02890c,2, -0x028918,5, -0x028938,4, -0x028960,1, -0x028970,2, -0x028c00,1, -0x028c10,7, -0x028c30,2, -0x028c40,5, -0x028c60,3, -0x028c70,5, -0x028c88,4, -0x028d10,8, -0x028d34,1, -0x028d40,1, -0x028e00,1, -0x028e10,2, -0x029000,108, -0x029800,26,UNKNOWN -0x029870,3,UNKNOWN -0x029890,14,UNKNOWN -0x0298d0,2,UNKNOWN -0x0298e0,20,UNKNOWN -0x029a00,1,UNKNOWN -0x029a10,6,UNKNOWN -0x029a30,21,UNKNOWN -0x029a90,2,UNKNOWN -0x02a000,26,UNKNOWN -0x02a070,3,UNKNOWN -0x02a090,14,UNKNOWN -0x02a0d0,2,UNKNOWN -0x02a0e0,20,UNKNOWN -0x02a200,1,UNKNOWN -0x02a210,6,UNKNOWN -0x02a230,21,UNKNOWN -0x02a290,2,UNKNOWN -0x02a800,26,UNKNOWN -0x02a870,3,UNKNOWN -0x02a890,14,UNKNOWN -0x02a8d0,2,UNKNOWN -0x02a8e0,20,UNKNOWN -0x02aa00,1,UNKNOWN -0x02aa10,6,UNKNOWN -0x02aa30,21,UNKNOWN -0x02aa90,2,UNKNOWN -0x02b000,8,UNKNOWN -0x02b028,7,UNKNOWN -0x02b04c,7,UNKNOWN -0x02b074,7,UNKNOWN -0x02b098,7,UNKNOWN -0x02b0bc,7,UNKNOWN -0x02b0e4,7,UNKNOWN -0x02b108,7,UNKNOWN -0x02b12c,7,UNKNOWN -0x02b160,1,UNKNOWN -0x02b170,2,UNKNOWN -0x02b180,1,UNKNOWN -0x02b190,2,UNKNOWN -0x02b300,7, -0x02b320,9, -0x02b350,7, -0x02b380,1, -0x02b390,2, -0x02b400,7, -0x02b420,9, -0x02b450,7, -0x02b480,1, -0x02b490,2, -0x02b500,7, -0x02b520,9, -0x02b550,7, -0x02b580,1, -0x02b590,2, -0x02b900,1, -0x02b90c,1, -0x02b918,2, -0x02b928,1, -0x02b940,1, -0x02b950,2, -0x02b9f0,2, -0x02ba00,1, -0x02ba10,2, -0x02ba20,3, -0x02bb00,2, -0x02bb10,2, -0x02bb3c,1, -0x02bb44,2, -0x02bb50,2, -0x02c700,3, -0x02c710,3, -0x02c720,3, -0x02c730,3, -0x02c740,18, -0x02c78c,6, -0x02c7c0,1, -0x02c7d0,2, -0x02d000,604, -0x02e000,604, -0x02f000,604,UNKNOWN -0x034000,1, -0x034008,1, -0x034010,1, -0x034018,1, -0x034020,1, -0x034028,1, -0x034030,1, -0x034038,1, -0x034040,1, -0x034048,1, -0x034050,1, -0x034058,1, -0x034060,1, -0x034068,1, -0x034070,1, -0x034084,7, -0x0340a4,1, -0x0340cc,5, -0x0340e4,10, -0x034110,1, -0x034130,1, -0x03413c,1, -0x034144,4, -0x03415c,1, -0x034170,20, -0x034200,2, -0x03420c,8, -0x034234,2, -0x034240,3, -0x034254,2, -0x0342c0,16, -0x034400,9, -0x034440,8, -0x034480,9, -0x0344c0,8, -0x034500,9, -0x034540,8, -0x034580,9, -0x0345c0,8, -0x034600,8, -0x034684,1, -0x0346ac,13, -0x034700,12, -0x034800,8, -0x034840,16, -0x034884,4, -0x034898,15, -0x0348dc,4, -0x034900,3, -0x034910,3, -0x034920,6, -0x034940,6, -0x034960,3, -0x034980,1, -0x034994,3, -0x034a00,1, -0x034a14,6, -0x034a34,2, -0x034a40,4, -0x034a80,1, -0x034a88,24, -0x034b1c,15, -0x034b5c,1, -0x034c00,22, -0x034c60,6, -0x034c80,6, -0x034ca0,6, -0x034cc0,6, -0x034ce0,6, -0x034d40,28, -0x034dc0,8, -0x034e00,17, -0x034e48,64, -0x035000,1, -0x035008,1, -0x035010,1, -0x035018,1, -0x035020,1, -0x035028,1, -0x035030,1, -0x035038,1, -0x035040,1, -0x035048,1, -0x035050,1, -0x035058,1, -0x035060,1, -0x035068,1, -0x035070,1, -0x035084,7, -0x0350a4,1, -0x0350cc,5, -0x0350e4,12, -0x035130,2, -0x03513c,1, -0x035160,3, -0x035200,2, -0x03520c,1, -0x035214,1, -0x035220,2, -0x03522c,1, -0x035234,1, -0x035240,2, -0x03524c,1, -0x035254,1, -0x035268,1, -0x035274,1, -0x035280,16, -0x035400,9, -0x035440,8, -0x035480,9, -0x0354c0,8, -0x035500,9, -0x035540,8, -0x035600,8, -0x035684,1, -0x0356a4,11, -0x0356d4,7, -0x035700,12, -0x0357dc,2, -0x035800,8, -0x035840,16, -0x035884,4, -0x035898,15, -0x0358dc,4, -0x035900,3, -0x035940,6, -0x035960,3, -0x035980,1, -0x035994,3, -0x035a00,1, -0x035a14,6, -0x035a34,2, -0x035a40,9, -0x035a80,1, -0x035a88,24, -0x035b1c,15, -0x035b5c,1, -0x035c00,22, -0x035c60,6, -0x035c80,6, -0x035ca0,6, -0x035cc0,6, -0x035ce0,6, -0x035d40,28, -0x035dc0,8, -0x035e00,17, -0x035e48,64, -0x036064,7, -0x036084,7, -0x0360c0,1, -0x036114,6, -0x036200,20, -0x036258,5, -0x036270,1, -0x036400,11, -0x036460,65, -0x036570,3, -0x036604,1, -0x036614,3, -0x036624,1, -0x036634,8, -0x03667c,3, -0x03668c,3, -0x03669c,3, -0x0366ac,3, -0x0366bc,3, -0x0366cc,3, -0x0366dc,3, -0x0366ec,3, -0x0366fc,3, -0x03670c,3, -0x03671c,3, -0x03672c,3, -0x03673c,3, -0x03674c,3, -0x03675c,3, -0x03676c,3, -0x03677c,9, -0x036880,1, -0x036890,2, -0x0368a0,3, -0x036a00,2, -0x036a0c,2, -0x036a18,3, -0x036a28,1, -0x036a40,1, -0x036a50,2, -0x036a60,1, -0x036a70,2, -0x036af0,3, -0x036b00,1, -0x036b10,2, -0x036b20,1, -0x036b30,2, -0x036b40,1, -0x036b50,2, -0x036b60,1, -0x036b70,2, -0x036b80,1, -0x036b90,2, -0x036ba0,3, -0x036bb0,1, -0x037000,1, -0x037040,1, -0x037048,3, -0x037058,3, -0x037068,3, -0x037078,3, -0x037088,3, -0x037098,3, -0x0370a8,3, -0x0370b8,3, -0x0370c8,3, -0x0370d8,3, -0x0370e8,3, -0x0370f8,3, -0x037110,2, -0x03748c,3, -0x0374a0,4, -0x040000,3, -0x04001c,1, -0x040030,1, -0x040044,1, -0x04004c,1, -0x040054,1, -0x04005c,1, -0x040068,11, -0x04009c,2, -0x0400ac,13, -0x040180,1, -0x0401c0,1, -0x0401cc,1,UNKNOWN -0x0401e0,1, -0x0401ec,2, -0x0401f8,1, -0x040200,3, -0x04021c,1, -0x040230,1, -0x040244,1, -0x04024c,1, -0x040254,1, -0x04025c,1, -0x040268,11, -0x04029c,2, -0x0402ac,13, -0x040380,1, -0x0403c0,1, -0x0403cc,1,UNKNOWN -0x0403e0,1, -0x0403ec,2, -0x0403f8,1, -0x040400,128, -0x040604,1, -0x040618,2, -0x040804,9, -0x040850,10, -0x04087c,1, -0x0408b0,3, -0x0408c0,1, -0x0408d0,2, -0x0408e0,1, -0x0408f0,2, -0x040900,1, -0x040910,2, -0x040940,10, -0x040980,1, -0x041800,8, -0x041890,3, -0x042000,24, -0x042200,18, -0x042400,42, -0x042600,2, -0x042800,42, -0x042a00,2, -0x042fec,1, -0x042ff4,3, -0x043010,4, -0x043030,7, -0x043100,7, -0x043140,4, -0x050100,9, -0x050128,8, -0x050160,1, -0x050170,4, -0x05018c,1, -0x0501bc,5, -0x050200,25, -0x050280,12, -0x051100,10, -0x051130,4, -0x051158,9, -0x051180,1, -0x0517fc,1, -0x0518b8,16, -0x051900,12, -0x053c00,4, -0x053c20,4, -0x053c34,9, -0x053c60,2, -0x053c6c,2, -0x053c8c,3, -0x053c9c,1, -0x053cf4,4, -0x053e00,4, -0x053e20,4, -0x053e34,7, -0x053e60,2, -0x053e6c,2, -0x053e8c,3, -0x053e9c,1, -0x053ef4,3, -0x053f04,7, -0x053f40,1, -0x053ffc,5, -0x055000,1, -0x056000,4, -0x057000,1, -0x057020,1, -0x057100,1, -0x057200,3, -0x0577f8,2, -0x060000,16385, -0x07000c,1, -0x070018,2, -0x070028,1, -0x070040,1, -0x070050,2, -0x0700f0,3, -0x070100,2, -0x07010c,6, -0x070128,3, -0x070140,5, -0x070180,4, -0x0701a0,1, -0x0701b0,2, -0x070200,33, -0x0702a0,1, -0x0702b0,2, -0x0702c0,12, -0x070304,1, -0x070310,4, -0x070c40,2, -0x071000,7, -0x072000,7, -0x0f0000,3, -0x0f0014,1, -0x0f001c,3, -0x0f0030,3, -0x0f0040,2, -0x0f004c,3, -0x0f0060,1, -0x0f0070,2, -0x0f0080,2, -0x0f008c,3, -0x0f00a0,1, -0x0f00b0,2, -0x0f00c0,2, -0x0f00d0,4, -0x0f00f0,2, -0x0f0100,4, -0x0f0128,7, -0x0f0150,2, -0x0f0160,3, -0x0f0170,1, -0x0f0180,9, -0x0f01b0,5, -0x0f01c4,7,UNKNOWN -0x0f0200,23, -0x0f02a4,5, -0x0f02c0,7, -0x0f02e0,5, -0x0f0404,2, -0x0f0410,10, -0x0f0440,4, -0x0f0454,7, -0x0f0480,23, -0x0f3000,13, -0x0f3040,5, -0x0f3058,7, -0x0f3078,14, -0x0f30c0,13, -0x0f3100,1, -0x0f310c,1, -0x0f3120,2, -0x0f3130,5, -0x0f3184,13, -0x0f31bc,1, -0x0f3204,1, -0x0f3210,5, -0x0f3244,6, -0x0f3264,5, -0x0f3280,2, -0x0f3290,8, -0x0f32ec,1, -0x0f3300,11, -0x0f3330,1, -0x0f3400,32, -0x0f3500,2, -0x0f350c,11, -0x0f3548,2, -0x0f3554,4, -0x0f3574,2, -0x0f3580,9, -0x0f35b0,2, -0x0f35cc,8, -0x0f3704,1, -0x0f370c,12, -0x0f3760,1, -0x0f3770,2, -0x0f3780,1, -0x0f3790,2, -0x0f37ac,5, -0x0f3800,3, -0x0f3810,2, -0x0f381c,21, -0x0f3880,9, -0x0f38b0,2, -0x0f38c0,1, -0x0f38f8,3, -0x0f3908,2, -0x0f3920,1, -0x0f3928,27, -0x0f3998,3, -0x0f39b0,4, -0x0f3a00,3, -0x0f3a10,4, -0x0f3a24,3, -0x0f3a34,4, -0x0f3a60,1, -0x0f3a70,2, -0x0f3a84,3, -0x0f3b00,1, -0x0f3b0c,1, -0x0f3b18,2, -0x0f3b28,1, -0x0f3b40,1, -0x0f3b50,2, -0x0f3bf0,3, -0x0f3c00,3, diff --git a/mstdump/mstdump_dbs/ConnectX.csv b/mstdump/mstdump_dbs/ConnectX.csv deleted file mode 100755 index 99d2d7b..0000000 --- a/mstdump/mstdump_dbs/ConnectX.csv +++ /dev/null @@ -1,2301 +0,0 @@ -# addr, size, enable addr -0x010000,1, -0x0100a0,15, -0x0100ec,7, -0x01010c,1, -0x010150,1, -0x0101cc,1, -0x0101fc,1, -0x010208,8, -0x010300,7, -0x010320,20, -0x010374,2, -0x010400,3, -0x010410,2, -0x010440,3, -0x010450,2, -0x010600,29, -0x010680,3, -0x010690,2, -0x0106a0,4, -0x0106b4,2, -0x0106e0,3, -0x0106f0,3, -0x010700,4, -0x010714,1, -0x010720,5, -0x010740,13, -0x010780,4, -0x0107a0,1, -0x0107a8,1, -0x0107b0,12, -0x0107f8,3, -0x0108a0,15, -0x0108ec,7, -0x01090c,1, -0x010950,1, -0x0109cc,1, -0x0109fc,1, -0x010a08,8, -0x010b00,7, -0x010b20,20, -0x010b74,2, -0x010c00,3, -0x010c10,2, -0x010c40,3, -0x010c50,2, -0x010e00,29, -0x010e80,3, -0x010e90,2, -0x010ea0,4, -0x010eb8,1, -0x010ee0,3, -0x010ef0,3, -0x010f00,4, -0x010f14,1, -0x010f20,5, -0x010f40,13, -0x010f80,4, -0x010fa0,1, -0x010fa8,1, -0x010fb0,12, -0x010ff8,3, -0x011010,6, -0x011080,11, -0x011114,6, -0x011130,4, -0x011180,5, -0x011200,7, -0x011220,1, -0x011240,4, -0x011260,1, -0x011280,4, -0x011300,3, -0x011310,2, -0x011400,3, -0x011410,1, -0x011418,1, -0x011420,1, -0x011428,1, -0x011430,1, -0x011438,1, -0x011440,1, -0x011448,1, -0x011460,1, -0x011488,2, -0x0114b0,4, -0x011800,1, -0x011810,6, -0x011880,11, -0x011914,6, -0x011930,4, -0x011980,5, -0x011a00,7, -0x011a20,1, -0x011a40,4, -0x011a60,1, -0x011a80,4, -0x011b00,3, -0x011b10,2, -0x011c00,3, -0x011c10,1, -0x011c18,1, -0x011c20,1, -0x011c28,1, -0x011c30,1, -0x011c38,1, -0x011c40,1, -0x011c48,1, -0x011c60,1, -0x011c88,2, -0x011cb0,4, -0x012000,1, -0x012020,3, -0x012030,2, -0x0120a0,4, -0x0120c0,7, -0x01211c,13, -0x012164,1, -0x012170,4, -0x0121e0,6, -0x012250,1, -0x012360,11, -0x01240c,5, -0x012464,3, -0x012480,3, -0x012490,3, -0x012508,2, -0x012520,8, -0x012568,2, -0x012590,4, -0x0125b4,3, -0x012600,13, -0x01270c,1, -0x012740,2, -0x012750,2, -0x01275c,5, -0x012788,2, -0x0127a8,6, -0x0127d8,2, -0x012800,3, -0x012840,3, -0x012850,2, -0x012860,3, -0x012870,2, -0x0128a0,4, -0x012904,1, -0x012910,5, -0x012928,3, -0x012944,5, -0x012980,4, -0x0129a0,3, -0x0129b0,2, -0x018000,1, -0x01805c,4, -0x018080,8, -0x0180a4,7, -0x0180c4,2, -0x018100,32, -0x018200,4, -0x018224,1, -0x018234,5, -0x018300,32, -0x018384,1, -0x01838c,1, -0x018394,1, -0x01839c,1, -0x0183a4,3, -0x018400,5, -0x018420,5, -0x018440,5, -0x018460,5, -0x018480,5, -0x0184a0,5, -0x0184c0,5, -0x0184e0,5, -0x018500,5, -0x018520,5, -0x018540,5, -0x018560,5, -0x018580,5, -0x0185a0,5, -0x0185c0,5, -0x0185e0,5, -0x01860c,5, -0x018624,4, -0x018804,3, -0x018840,3, -0x018850,3, -0x018860,7, -0x018884,11, -0x0188c8,2, -0x0188d4,2, -0x0188e0,8, -0x018a04,3, -0x018a20,3, -0x018a30,4, -0x018a44,16, -0x018a88,4, -0x018c00,18, -0x018c50,30, -0x018cd0,14, -0x018d0c,2, -0x018e00,3, -0x018e10,2, -0x018e20,3, -0x018e30,2, -0x018e40,3, -0x018e50,2, -0x019ff0,2052, -0x01c004,2, -0x01c010,4, -0x01c06c,19, -0x01c0c0,5, -0x01c180,3, -0x01c190,2, -0x01c1a0,3, -0x01c1b0,2, -0x01c1c0,5, -0x01c1e0,5, -0x01c200,17, -0x01c250,29, -0x01c2d0,14, -0x01c30c,2, -0x01c40c,5, -0x01c428,2, -0x01c434,1, -0x01c43c,1, -0x01c448,2, -0x01c454,1, -0x01c45c,1, -0x01c464,18, -0x01c5e4,7, -0x01c608,4, -0x01c624,4, -0x01c650,5, -0x01c680,9, -0x01c6a8,4, -0x01c6c0,9, -0x01c6e8,11, -0x01c71c,5, -0x01c738,2, -0x01c744,1, -0x01c750,12, -0x01c7dc,1, -0x01c7e4,20, -0x01c840,7, -0x01c860,11, -0x01c8a0,5, -0x01c900,13, -0x01c940,7, -0x01c960,11, -0x01c9a0,5, -0x01ca00,13, -0x01ca40,7, -0x01ca60,11, -0x01caa0,5, -0x01cb00,13, -0x01cb40,7, -0x01cb60,11, -0x01cba0,5, -0x01cc00,13, -0x01cc40,7, -0x01cc60,11, -0x01cca0,5, -0x01cd00,13, -0x01cd40,7, -0x01cd60,11, -0x01cda0,5, -0x01ce00,13, -0x01ce40,7, -0x01ce60,11, -0x01cea0,5, -0x01cf00,13, -0x01cf40,7, -0x01cf60,11, -0x01cfa0,5, -0x01d000,18, -0x01d050,31, -0x01d0d0,2, -0x01d0e8,15, -0x01d140,55, -0x01d220,10, -0x01d260,5, -0x01d278,2, -0x01d284,1, -0x01d298,2, -0x01d2a8,6, -0x01d300,11, -0x01d33c,17, -0x01d3c0,5, -0x01d3e0,3, -0x01d3f0,1, -0x01d400,18, -0x01d450,31, -0x01d4d0,2, -0x01d4e8,15, -0x01d540,55, -0x01d620,10, -0x01d660,5, -0x01d678,2, -0x01d684,1, -0x01d698,2, -0x01d6a8,6, -0x01d700,11, -0x01d73c,17, -0x01d7c0,5, -0x01d7e0,3, -0x01d7f0,1, -0x01d800,19, -0x01d880,8, -0x01d8c4,1, -0x01d8cc,5, -0x01d8e4,7, -0x01d910,5, -0x01da00,7, -0x01db0c,16, -0x01db50,2, -0x01db60,3, -0x01db70,2, -0x01db80,3, -0x01db90,2, -0x01dba0,3, -0x01dc00,5, -0x01dd80,5, -0x01dda0,5, -0x01ddbc,1, -0x01dde0,9, -0x01de08,2, -0x01e5c0,3, -0x01e5dc,1, -0x01e5e4,14, -0x01e620,4, -0x01e640,16, -0x01e780,160, -0x01ea04,13, -0x01ec00,8, -0x01ec24,1, -0x01ec30,1, -0x01ec44,39, -0x01ed80,1, -0x01edc4,1, -0x01ede0,5, -0x01edf8,1, -0x01ee00,8, -0x01ee24,1, -0x01ee30,1, -0x01ee44,39, -0x01ef80,1, -0x01efc4,1, -0x01efe0,5, -0x01eff8,1, -0x01f000,1024, -0x030000,3, -0x030010,2, -0x030020,3, -0x030030,2, -0x030040,3, -0x030050,2, -0x030100,27, -0x030180,3, -0x030200,80, -0x030400,288, -0x030900,32, -0x030a04,1, -0x030b00,33, -0x030c00,128, -0x030e1c,1, -0x030e3c,1, -0x030e44,1, -0x030e5c,17, -0x030f10,28, -0x031000,14, -0x031040,14, -0x031080,14, -0x0310c0,14, -0x031100,147, -0x034000,3, -0x034010,2, -0x034100,14, -0x03413c,7, -0x03415c,7, -0x03417c,7, -0x03419c,7, -0x0341bc,7, -0x0341dc,7, -0x0341fc,7, -0x03421c,5, -0x034240,7, -0x034260,12, -0x034304,1, -0x034314,3, -0x034324,1, -0x034334,3, -0x034344,1, -0x03435c,1, -0x034414,3, -0x034510,4, -0x034608,6, -0x034800,7, -0x034820,4, -0x034840,16, -0x034980,32, -0x035000,5, -0x035020,1, -0x035028,1, -0x035040,14, -0x035104,5, -0x036000,128, -0x036204,13, -0x036400,8, -0x036424,1, -0x036430,1, -0x036444,39, -0x036580,1, -0x0365c4,1, -0x0365e0,5, -0x0365f8,1, -0x036600,3, -0x036700,3, -0x036710,2, -0x036720,3, -0x036730,2, -0x040000,19, -0x040050,3, -0x040080,1, -0x040090,8, -0x0400b4,3, -0x0400cc,8, -0x040104,16, -0x040150,2, -0x04015c,1, -0x040170,11, -0x0401a4,1, -0x0401ac,5, -0x0401c4,8, -0x040200,3, -0x040210,3, -0x040220,3, -0x040230,3, -0x040240,3, -0x040250,3, -0x040260,3, -0x040270,3, -0x040280,3, -0x040290,3, -0x0402a0,3, -0x0402b0,3, -0x0402c0,3, -0x0402d0,3, -0x0402e0,3, -0x0402f0,3, -0x040304,1, -0x040314,8, -0x040340,11, -0x040400,50, -0x0404cc,6, -0x040510,18, -0x04055c,3, -0x04056c,3, -0x04057c,3, -0x04058c,2, -0x04059c,17, -0x040610,14, -0x0406e0,49, -0x0407b0,4, -0x0407d0,3, -0x0407f0,1, -0x040800,332, -0x040d38,4, -0x040d50,23, -0x040df0,11, -0x040e20,1, -0x040e28,11, -0x040e58,1, -0x040e60,4, -0x040e74,11, -0x040eb0,4, -0x040ec8,2, -0x040ed4,7, -0x040ef8,3, -0x041000,33, -0x041100,45, -0x0411dc,1, -0x0411e4,15, -0x041224,1, -0x041230,1, -0x041244,39, -0x041380,1, -0x0413c4,1, -0x0413e0,5, -0x0413f8,1, -0x041400,8, -0x041424,1, -0x041430,1, -0x041444,39, -0x041580,1, -0x0415c4,1, -0x0415e0,5, -0x0415f8,1, -0x041a00,3, -0x041a10,2, -0x041a20,3, -0x041a30,2, -0x041a40,3, -0x041a50,2, -0x041c00,128, -0x041e04,13, -0x042000,5, -0x042020,5, -0x042040,5, -0x042060,5, -0x042080,5, -0x0420a0,5, -0x0420c0,5, -0x0420e0,5, -0x042100,5, -0x042120,5, -0x042140,5, -0x042160,5, -0x042180,5, -0x0421a0,5, -0x0421c0,5, -0x0421e0,5, -0x042200,5, -0x042220,5, -0x042240,5, -0x042260,5, -0x042280,5, -0x0422a0,5, -0x0422c0,5, -0x0422e0,5, -0x042300,5, -0x042320,5, -0x042340,5, -0x042360,5, -0x042380,5, -0x0423a0,5, -0x0423c0,5, -0x0423e0,5, -0x042400,5, -0x042420,5, -0x042440,5, -0x042460,5, -0x042480,5, -0x0424a0,5, -0x0424c0,5, -0x0424e0,5, -0x042500,5, -0x042520,5, -0x042540,5, -0x042560,5, -0x042580,5, -0x0425a0,5, -0x0425c0,5, -0x0425e0,5, -0x042600,5, -0x042620,5, -0x042640,5, -0x042660,5, -0x042680,5, -0x0426a0,5, -0x0426c0,5, -0x0426e0,5, -0x042700,5, -0x042720,5, -0x042740,5, -0x042760,5, -0x042780,5, -0x0427a0,5, -0x0427c0,5, -0x0427e0,5, -0x042800,5, -0x042820,5, -0x042840,5, -0x042860,5, -0x042880,5, -0x0428a0,5, -0x0428c0,5, -0x0428e0,5, -0x042900,5, -0x042920,5, -0x042940,5, -0x042960,5, -0x042980,5, -0x0429a0,5, -0x0429c0,5, -0x0429e0,5, -0x042a00,5, -0x042a20,5, -0x042a40,5, -0x042a60,5, -0x042a80,5, -0x042aa0,5, -0x042ac0,5, -0x042ae0,5, -0x042b00,5, -0x042b20,5, -0x042b40,5, -0x042b60,5, -0x042b80,5, -0x042ba0,5, -0x042bc0,5, -0x042be0,5, -0x042c00,5, -0x042c20,5, -0x042c40,5, -0x042c60,5, -0x042c80,5, -0x042ca0,5, -0x042cc0,5, -0x042ce0,5, -0x042d00,5, -0x042d20,5, -0x042d40,5, -0x042d60,5, -0x042d80,5, -0x042da0,5, -0x042dc0,5, -0x042de0,5, -0x042e00,5, -0x042e20,5, -0x042e40,5, -0x042e60,5, -0x042e80,5, -0x042ea0,5, -0x042ec0,5, -0x042ee0,5, -0x042f00,5, -0x042f20,5, -0x042f40,5, -0x042f60,5, -0x042f80,5, -0x042fa0,5, -0x042fc0,5, -0x042fe0,5, -0x043000,5, -0x043020,5, -0x043040,5, -0x043060,5, -0x043080,5, -0x0430a0,5, -0x0430c0,5, -0x0430e0,5, -0x043100,5, -0x043120,5, -0x043140,5, -0x043160,5, -0x043180,5, -0x0431a0,5, -0x0431c0,5, -0x0431e0,5, -0x043200,5, -0x043220,5, -0x043240,5, -0x043260,5, -0x043280,5, -0x0432a0,5, -0x0432c0,5, -0x0432e0,5, -0x043300,5, -0x043320,5, -0x043340,5, -0x043360,5, -0x043380,5, -0x0433a0,5, -0x0433c0,5, -0x0433e0,5, -0x043400,5, -0x043420,5, -0x043440,5, -0x043460,5, -0x043480,5, -0x0434a0,5, -0x0434c0,5, -0x0434e0,5, -0x043500,5, -0x043520,5, -0x043540,5, -0x043560,5, -0x043580,5, -0x0435a0,5, -0x0435c0,5, -0x0435e0,5, -0x043600,5, -0x043620,5, -0x043640,5, -0x043660,5, -0x043680,5, -0x0436a0,5, -0x0436c0,5, -0x0436e0,5, -0x043700,5, -0x043720,5, -0x043740,5, -0x043760,5, -0x043780,5, -0x0437a0,5, -0x0437c0,5, -0x0437e0,5, -0x043800,5, -0x043820,5, -0x043840,5, -0x043860,5, -0x043880,5, -0x0438a0,5, -0x0438c0,5, -0x0438e0,5, -0x043900,5, -0x043920,5, -0x043940,5, -0x043960,5, -0x043980,5, -0x0439a0,5, -0x0439c0,5, -0x0439e0,5, -0x043a00,5, -0x043a20,5, -0x043a40,5, -0x043a60,5, -0x043a80,5, -0x043aa0,5, -0x043ac0,5, -0x043ae0,5, -0x043b00,5, -0x043b20,5, -0x043b40,5, -0x043b60,5, -0x043b80,5, -0x043ba0,5, -0x043bc0,5, -0x043be0,5, -0x043c00,5, -0x043c20,5, -0x043c40,5, -0x043c60,5, -0x043c80,5, -0x043ca0,5, -0x043cc0,5, -0x043ce0,5, -0x043d00,5, -0x043d20,5, -0x043d40,5, -0x043d60,5, -0x043d80,5, -0x043da0,5, -0x043dc0,5, -0x043de0,5, -0x043e00,5, -0x043e20,5, -0x043e40,5, -0x043e60,5, -0x043e80,5, -0x043ea0,5, -0x043ec0,5, -0x043ee0,5, -0x043f00,5, -0x043f20,5, -0x043f40,5, -0x043f60,5, -0x043f80,5, -0x043fa0,5, -0x043fc0,5, -0x043fe0,5, -0x044fcc,5, -0x044fe4,5, -0x044ffc,5, -0x045014,5, -0x04502c,5, -0x045044,5, -0x04505c,5, -0x045074,5, -0x04508c,5, -0x0450a4,5, -0x0450bc,5, -0x0450d4,5, -0x0450ec,5, -0x045104,5, -0x04511c,119, -0x045300,39, -0x045400,13, -0x045440,13, -0x045ff8,642, -0x047004,1, -0x04700c,1, -0x047ff0,2, -0x048000,5, -0x048020,5, -0x048040,5, -0x048060,5, -0x048080,5, -0x0480a0,5, -0x0480c0,5, -0x0480e0,5, -0x048100,5, -0x048120,5, -0x048140,5, -0x048160,5, -0x048180,5, -0x0481a0,5, -0x0481c0,5, -0x0481e0,5, -0x048200,5, -0x048220,5, -0x048240,5, -0x048260,5, -0x048280,5, -0x0482a0,5, -0x0482c0,5, -0x0482e0,5, -0x048300,5, -0x048320,5, -0x048340,5, -0x048360,5, -0x048380,5, -0x0483a0,5, -0x0483c0,5, -0x0483e0,5, -0x048400,5, -0x048420,5, -0x048440,5, -0x048460,5, -0x048480,5, -0x0484a0,5, -0x0484c0,5, -0x0484e0,5, -0x048500,5, -0x048520,5, -0x048540,5, -0x048560,5, -0x048580,5, -0x0485a0,5, -0x0485c0,5, -0x0485e0,5, -0x048600,5, -0x048620,5, -0x048640,5, -0x048660,5, -0x048680,5, -0x0486a0,5, -0x0486c0,5, -0x0486e0,5, -0x048700,5, -0x048720,5, -0x048740,5, -0x048760,5, -0x048780,5, -0x0487a0,5, -0x0487c0,5, -0x0487e0,5, -0x048800,5, -0x048820,5, -0x048840,5, -0x048860,5, -0x048880,5, -0x0488a0,5, -0x0488c0,5, -0x0488e0,5, -0x048900,5, -0x048920,5, -0x048940,5, -0x048960,5, -0x048980,5, -0x0489a0,5, -0x0489c0,5, -0x0489e0,5, -0x048a00,5, -0x048a20,5, -0x048a40,5, -0x048a60,5, -0x048a80,5, -0x048aa0,5, -0x048ac0,5, -0x048ae0,5, -0x048b00,5, -0x048b20,5, -0x048b40,5, -0x048b60,5, -0x048b80,5, -0x048ba0,5, -0x048bc0,5, -0x048be0,5, -0x048c00,5, -0x048c20,5, -0x048c40,5, -0x048c60,5, -0x048c80,5, -0x048ca0,5, -0x048cc0,5, -0x048ce0,5, -0x048d00,5, -0x048d20,5, -0x048d40,5, -0x048d60,5, -0x048d80,5, -0x048da0,5, -0x048dc0,5, -0x048de0,5, -0x048e00,5, -0x048e20,5, -0x048e40,5, -0x048e60,5, -0x048e80,5, -0x048ea0,5, -0x048ec0,5, -0x048ee0,5, -0x048f00,5, -0x048f20,5, -0x048f40,5, -0x048f60,5, -0x048f80,5, -0x048fa0,5, -0x048fc0,5, -0x048fe0,5, -0x049000,5, -0x049020,5, -0x049040,5, -0x049060,5, -0x049080,5, -0x0490a0,5, -0x0490c0,5, -0x0490e0,5, -0x049100,5, -0x049120,5, -0x049140,5, -0x049160,5, -0x049180,5, -0x0491a0,5, -0x0491c0,5, -0x0491e0,5, -0x049200,5, -0x049220,5, -0x049240,5, -0x049260,5, -0x049280,5, -0x0492a0,5, -0x0492c0,5, -0x0492e0,5, -0x049300,5, -0x049320,5, -0x049340,5, -0x049360,5, -0x049380,5, -0x0493a0,5, -0x0493c0,5, -0x0493e0,5, -0x049400,5, -0x049420,5, -0x049440,5, -0x049460,5, -0x049480,5, -0x0494a0,5, -0x0494c0,5, -0x0494e0,5, -0x049500,5, -0x049520,5, -0x049540,5, -0x049560,5, -0x049580,5, -0x0495a0,5, -0x0495c0,5, -0x0495e0,5, -0x049600,5, -0x049620,5, -0x049640,5, -0x049660,5, -0x049680,5, -0x0496a0,5, -0x0496c0,5, -0x0496e0,5, -0x049700,5, -0x049720,5, -0x049740,5, -0x049760,5, -0x049780,5, -0x0497a0,5, -0x0497c0,5, -0x0497e0,5, -0x049800,5, -0x049820,5, -0x049840,5, -0x049860,5, -0x049880,5, -0x0498a0,5, -0x0498c0,5, -0x0498e0,5, -0x049900,5, -0x049920,5, -0x049940,5, -0x049960,5, -0x049980,5, -0x0499a0,5, -0x0499c0,5, -0x0499e0,5, -0x049a00,5, -0x049a20,5, -0x049a40,5, -0x049a60,5, -0x049a80,5, -0x049aa0,5, -0x049ac0,5, -0x049ae0,5, -0x049b00,5, -0x049b20,5, -0x049b40,5, -0x049b60,5, -0x049b80,5, -0x049ba0,5, -0x049bc0,5, -0x049be0,5, -0x049c00,5, -0x049c20,5, -0x049c40,5, -0x049c60,5, -0x049c80,5, -0x049ca0,5, -0x049cc0,5, -0x049ce0,5, -0x049d00,5, -0x049d20,5, -0x049d40,5, -0x049d60,5, -0x049d80,5, -0x049da0,5, -0x049dc0,5, -0x049de0,5, -0x049e00,5, -0x049e20,5, -0x049e40,5, -0x049e60,5, -0x049e80,5, -0x049ea0,5, -0x049ec0,5, -0x049ee0,5, -0x049f00,5, -0x049f20,5, -0x049f40,5, -0x049f60,5, -0x049f80,5, -0x049fa0,5, -0x049fc0,5, -0x049fe0,5, -0x04a000,5, -0x04a020,5, -0x04a040,5, -0x04a060,5, -0x04a080,5, -0x04a0a0,5, -0x04a0c0,5, -0x04a0e0,5, -0x04a100,5, -0x04a120,5, -0x04a140,5, -0x04a160,5, -0x04a180,5, -0x04a1a0,5, -0x04a1c0,5, -0x04a1e0,5, -0x04a200,5, -0x04a220,5, -0x04a240,5, -0x04a260,5, -0x04a280,5, -0x04a2a0,5, -0x04a2c0,5, -0x04a2e0,5, -0x04a300,5, -0x04a320,5, -0x04a340,5, -0x04a360,5, -0x04a380,5, -0x04a3a0,5, -0x04a3c0,5, -0x04a3e0,5, -0x04a400,5, -0x04a420,5, -0x04a440,5, -0x04a460,5, -0x04a480,5, -0x04a4a0,5, -0x04a4c0,5, -0x04a4e0,5, -0x04a500,5, -0x04a520,5, -0x04a540,5, -0x04a560,5, -0x04a580,5, -0x04a5a0,5, -0x04a5c0,5, -0x04a5e0,5, -0x04a600,5, -0x04a620,5, -0x04a640,5, -0x04a660,5, -0x04a680,5, -0x04a6a0,5, -0x04a6c0,5, -0x04a6e0,5, -0x04a700,5, -0x04a720,5, -0x04a740,5, -0x04a760,5, -0x04a780,5, -0x04a7a0,5, -0x04a7c0,5, -0x04a7e0,5, -0x04a800,5, -0x04a820,5, -0x04a840,5, -0x04a860,5, -0x04a880,5, -0x04a8a0,5, -0x04a8c0,5, -0x04a8e0,5, -0x04a900,5, -0x04a920,5, -0x04a940,5, -0x04a960,5, -0x04a980,5, -0x04a9a0,5, -0x04a9c0,5, -0x04a9e0,5, -0x04aa00,5, -0x04aa20,5, -0x04aa40,5, -0x04aa60,5, -0x04aa80,5, -0x04aaa0,5, -0x04aac0,5, -0x04aae0,5, -0x04ab00,5, -0x04ab20,5, -0x04ab40,5, -0x04ab60,5, -0x04ab80,5, -0x04aba0,5, -0x04abc0,5, -0x04abe0,5, -0x04ac00,5, -0x04ac20,5, -0x04ac40,5, -0x04ac60,5, -0x04ac80,5, -0x04aca0,5, -0x04acc0,5, -0x04ace0,5, -0x04ad00,5, -0x04ad20,5, -0x04ad40,5, -0x04ad60,5, -0x04ad80,5, -0x04ada0,5, -0x04adc0,5, -0x04ade0,5, -0x04ae00,5, -0x04ae20,5, -0x04ae40,5, -0x04ae60,5, -0x04ae80,5, -0x04aea0,5, -0x04aec0,5, -0x04aee0,5, -0x04af00,5, -0x04af20,5, -0x04af40,5, -0x04af60,5, -0x04af80,5, -0x04afa0,5, -0x04afc0,5, -0x04afe0,5, -0x04b000,5, -0x04b020,5, -0x04b040,5, -0x04b060,5, -0x04b080,5, -0x04b0a0,5, -0x04b0c0,5, -0x04b0e0,5, -0x04b100,5, -0x04b120,5, -0x04b140,5, -0x04b160,5, -0x04b180,5, -0x04b1a0,5, -0x04b1c0,5, -0x04b1e0,5, -0x04b200,5, -0x04b220,5, -0x04b240,5, -0x04b260,5, -0x04b280,5, -0x04b2a0,5, -0x04b2c0,5, -0x04b2e0,5, -0x04b300,5, -0x04b320,5, -0x04b340,5, -0x04b360,5, -0x04b380,5, -0x04b3a0,5, -0x04b3c0,5, -0x04b3e0,5, -0x04b400,5, -0x04b420,5, -0x04b440,5, -0x04b460,5, -0x04b480,5, -0x04b4a0,5, -0x04b4c0,5, -0x04b4e0,5, -0x04b500,5, -0x04b520,5, -0x04b540,5, -0x04b560,5, -0x04b580,5, -0x04b5a0,5, -0x04b5c0,5, -0x04b5e0,5, -0x04b600,5, -0x04b620,5, -0x04b640,5, -0x04b660,5, -0x04b680,5, -0x04b6a0,5, -0x04b6c0,5, -0x04b6e0,5, -0x04b700,5, -0x04b720,5, -0x04b740,5, -0x04b760,5, -0x04b780,5, -0x04b7a0,5, -0x04b7c0,5, -0x04b7e0,5, -0x04b800,5, -0x04b820,5, -0x04b840,5, -0x04b860,5, -0x04b880,5, -0x04b8a0,5, -0x04b8c0,5, -0x04b8e0,5, -0x04b900,5, -0x04b920,5, -0x04b940,5, -0x04b960,5, -0x04b980,5, -0x04b9a0,5, -0x04b9c0,5, -0x04b9e0,5, -0x04ba00,5, -0x04ba20,5, -0x04ba40,5, -0x04ba60,5, -0x04ba80,5, -0x04baa0,5, -0x04bac0,5, -0x04bae0,5, -0x04bb00,5, -0x04bb20,5, -0x04bb40,5, -0x04bb60,5, -0x04bb80,5, -0x04bba0,5, -0x04bbc0,5, -0x04bbe0,5, -0x04bc00,5, -0x04bc20,5, -0x04bc40,5, -0x04bc60,5, -0x04bc80,5, -0x04bca0,5, -0x04bcc0,5, -0x04bce0,5, -0x04bd00,5, -0x04bd20,5, -0x04bd40,5, -0x04bd60,5, -0x04bd80,5, -0x04bda0,5, -0x04bdc0,5, -0x04bde0,5, -0x04be00,5, -0x04be20,5, -0x04be40,5, -0x04be60,5, -0x04be80,5, -0x04bea0,5, -0x04bec0,5, -0x04bee0,5, -0x04bf00,5, -0x04bf20,5, -0x04bf40,5, -0x04bf60,5, -0x04bf80,5, -0x04bfa0,5, -0x04bfc0,5, -0x04bfe0,5, -0x04c000,5, -0x04c020,5, -0x04c040,5, -0x04c060,5, -0x04c080,5, -0x04c0a0,5, -0x04c0c0,5, -0x04c0e0,5, -0x04c100,5, -0x04c120,5, -0x04c140,5, -0x04c160,5, -0x04c180,5, -0x04c1a0,5, -0x04c1c0,5, -0x04c1e0,5, -0x04c200,5, -0x04c220,5, -0x04c240,5, -0x04c260,5, -0x04c280,5, -0x04c2a0,5, -0x04c2c0,5, -0x04c2e0,5, -0x04c300,5, -0x04c320,5, -0x04c340,5, -0x04c360,5, -0x04c380,5, -0x04c3a0,5, -0x04c3c0,5, -0x04c3e0,5, -0x04c400,5, -0x04c420,5, -0x04c440,5, -0x04c460,5, -0x04c480,5, -0x04c4a0,5, -0x04c4c0,5, -0x04c4e0,5, -0x04c500,5, -0x04c520,5, -0x04c540,5, -0x04c560,5, -0x04c580,5, -0x04c5a0,5, -0x04c5c0,5, -0x04c5e0,5, -0x04c600,5, -0x04c620,5, -0x04c640,5, -0x04c660,5, -0x04c680,5, -0x04c6a0,5, -0x04c6c0,5, -0x04c6e0,5, -0x04c700,5, -0x04c720,5, -0x04c740,5, -0x04c760,5, -0x04c780,5, -0x04c7a0,5, -0x04c7c0,5, -0x04c7e0,5, -0x04c800,5, -0x04c820,5, -0x04c840,5, -0x04c860,5, -0x04c880,5, -0x04c8a0,5, -0x04c8c0,5, -0x04c8e0,5, -0x04c900,5, -0x04c920,5, -0x04c940,5, -0x04c960,5, -0x04c980,5, -0x04c9a0,5, -0x04c9c0,5, -0x04c9e0,5, -0x04ca00,5, -0x04ca20,5, -0x04ca40,5, -0x04ca60,5, -0x04ca80,5, -0x04caa0,5, -0x04cac0,5, -0x04cae0,5, -0x04cb00,5, -0x04cb20,5, -0x04cb40,5, -0x04cb60,5, -0x04cb80,5, -0x04cba0,5, -0x04cbc0,5, -0x04cbe0,5, -0x04cc00,5, -0x04cc20,5, -0x04cc40,5, -0x04cc60,5, -0x04cc80,5, -0x04cca0,5, -0x04ccc0,5, -0x04cce0,5, -0x04cd00,5, -0x04cd20,5, -0x04cd40,5, -0x04cd60,5, -0x04cd80,5, -0x04cda0,5, -0x04cdc0,5, -0x04cde0,5, -0x04ce00,5, -0x04ce20,5, -0x04ce40,5, -0x04ce60,5, -0x04ce80,5, -0x04cea0,5, -0x04cec0,5, -0x04cee0,5, -0x04cf00,5, -0x04cf20,5, -0x04cf40,5, -0x04cf60,5, -0x04cf80,5, -0x04cfa0,5, -0x04cfc0,5, -0x04cfe0,5, -0x050004,1, -0x05000c,5, -0x054000,5, -0x054020,5, -0x054040,5, -0x054060,5, -0x054080,5, -0x0540a0,5, -0x0540c0,5, -0x0540e0,5, -0x054100,5, -0x054120,5, -0x054140,5, -0x054160,5, -0x054180,5, -0x0541a0,5, -0x0541c0,5, -0x0541e0,5, -0x054200,5, -0x054220,5, -0x054240,5, -0x054260,5, -0x054280,5, -0x0542a0,5, -0x0542c0,5, -0x0542e0,5, -0x054300,5, -0x054320,5, -0x054340,5, -0x054360,5, -0x054380,5, -0x0543a0,5, -0x0543c0,5, -0x0543e0,5, -0x054400,5, -0x054420,5, -0x054440,5, -0x054460,5, -0x054480,5, -0x0544a0,5, -0x0544c0,5, -0x0544e0,5, -0x054500,5, -0x054520,5, -0x054540,5, -0x054560,5, -0x054580,5, -0x0545a0,5, -0x0545c0,5, -0x0545e0,5, -0x054600,5, -0x054620,5, -0x054640,5, -0x054660,5, -0x054680,5, -0x0546a0,5, -0x0546c0,5, -0x0546e0,5, -0x054700,5, -0x054720,5, -0x054740,5, -0x054760,5, -0x054780,5, -0x0547a0,5, -0x0547c0,5, -0x0547e0,5, -0x054800,5, -0x054820,5, -0x054840,5, -0x054860,5, -0x054880,5, -0x0548a0,5, -0x0548c0,5, -0x0548e0,5, -0x054900,5, -0x054920,5, -0x054940,5, -0x054960,5, -0x054980,5, -0x0549a0,5, -0x0549c0,5, -0x0549e0,5, -0x054a00,5, -0x054a20,5, -0x054a40,5, -0x054a60,5, -0x054a80,5, -0x054aa0,5, -0x054ac0,5, -0x054ae0,5, -0x054b00,5, -0x054b20,5, -0x054b40,5, -0x054b60,5, -0x054b80,5, -0x054ba0,5, -0x054bc0,5, -0x054be0,5, -0x054c00,5, -0x054c20,5, -0x054c40,5, -0x054c60,5, -0x055004,1, -0x05500c,8, -0x05900c,5, -0x060400,5, -0x060500,6, -0x060520,6, -0x060600,6, -0x060700,7, -0x060800,64, -0x060940,3, -0x060a04,7, -0x060c00,4, -0x060d00,2, -0x060e00,4, -0x060f40,16, -0x060f88,2, -0x061000,34, -0x061100,34, -0x061200,34, -0x061300,34, -0x061400,34, -0x061500,34, -0x061600,34, -0x061700,34, -0x061800,34, -0x061900,34, -0x061a00,34, -0x061b00,34, -0x061c00,34, -0x061d00,34, -0x061e00,34, -0x061f00,34, -0x062100,2, -0x064000,2048, -0x066100,3, -0x068800,7, -0x068820,4, -0x068840,16, -0x068980,36, -0x068a20,3, -0x068a30,2, -0x068a40,3, -0x068a50,2, -0x068a60,3, -0x068a70,2, -0x068a80,2, -0x070000,13, -0x070040,12, -0x07007c,13, -0x0700bc,6, -0x0700d8,5, -0x0700f0,23, -0x070180,5, -0x0701fc,1, -0x070210,12, -0x070244,7, -0x070290,12, -0x0702c4,1, -0x0702d0,4, -0x070300,64, -0x071000,33, -0x071100,33, -0x071200,33, -0x071300,33, -0x071400,33, -0x071500,33, -0x071600,33, -0x071700,33, -0x071800,33, -0x071900,33, -0x071a00,33, -0x071b00,33, -0x072000,67, -0x072200,67, -0x072400,67, -0x072600,67, -0x072800,67, -0x072a00,67, -0x072c00,67, -0x073000,33, -0x073100,33, -0x073200,33, -0x073300,33, -0x073400,33, -0x073500,33, -0x073600,33, -0x073700,33, -0x073800,33, -0x073900,33, -0x073a00,33, -0x073b00,33, -0x076c00,5, -0x076c18,2, -0x076c24,1, -0x076c2c,1, -0x076c34,4, -0x076c4c,3, -0x078000,17, -0x078080,17, -0x078100,17, -0x078180,17, -0x078210,5, -0x078284,2, -0x0782d4,59, -0x078400,6, -0x078a60,5, -0x078a88,13, -0x078b00,32, -0x078b84,6, -0x078c20,10, -0x078c50,2, -0x078c5c,7, -0x078c80,5, -0x078ca0,1, -0x078cc0,7, -0x078d00,32, -0x078d84,6, -0x078e60,1, -0x078e70,1, -0x078e80,10, -0x078ec0,2, -0x078ecc,1, -0x078ee0,6, -0x078f00,7, -0x078f20,7, -0x078f44,2, -0x078f60,2, -0x078f70,1, -0x078f78,2, -0x078fb4,6, -0x078fd0,1, -0x079000,1, -0x079008,1, -0x079010,1, -0x079018,1, -0x079020,1, -0x079028,1, -0x079030,1, -0x079038,1, -0x079040,1, -0x079048,1, -0x079050,1, -0x079058,1, -0x079060,1, -0x079068,1, -0x079070,1, -0x079078,1, -0x079080,1, -0x079088,1, -0x079090,1, -0x079098,1, -0x0790a0,1, -0x0790a8,1, -0x0790b0,1, -0x0790b8,1, -0x0790c0,1, -0x0790c8,1, -0x0790d0,1, -0x0790d8,1, -0x0790e0,1, -0x0790e8,1, -0x0790f0,1, -0x0790f8,1, -0x079100,1, -0x079108,1, -0x079110,1, -0x079118,1, -0x079120,1, -0x079128,1, -0x079130,1, -0x079138,1, -0x079140,1, -0x079148,1, -0x079150,1, -0x079158,1, -0x079160,1, -0x079168,1, -0x079170,1, -0x079178,1, -0x079180,1, -0x079188,1, -0x079190,1, -0x079198,1, -0x0791a0,1, -0x0791a8,1, -0x0791b0,1, -0x0791b8,1, -0x0791c0,1, -0x0791c8,1, -0x0791d0,1, -0x0791d8,1, -0x0791e0,1, -0x0791e8,1, -0x0791f0,1, -0x0791f8,1, -0x079200,1, -0x079208,1, -0x079210,1, -0x079218,1, -0x079220,1, -0x079228,1, -0x079230,1, -0x079238,1, -0x079240,1, -0x079248,1, -0x079250,1, -0x079258,1, -0x079260,1, -0x079268,1, -0x079270,1, -0x079278,1, -0x079280,1, -0x079288,1, -0x079290,1, -0x079298,1, -0x0792a0,1, -0x0792a8,1, -0x0792b0,1, -0x0792b8,1, -0x0792c0,1, -0x0792c8,1, -0x0792d0,1, -0x0792d8,1, -0x0792e0,1, -0x0792e8,1, -0x0792f0,1, -0x0792f8,1, -0x079300,1, -0x079308,1, -0x079310,1, -0x079318,1, -0x079320,1, -0x079328,1, -0x079330,1, -0x079338,1, -0x079340,1, -0x079348,1, -0x079350,1, -0x079358,1, -0x079360,1, -0x079368,1, -0x079370,1, -0x079378,1, -0x079380,1, -0x079388,1, -0x079390,1, -0x079398,1, -0x0793a0,1, -0x0793a8,1, -0x0793b0,1, -0x0793b8,1, -0x0793c0,1, -0x0793c8,1, -0x0793d0,1, -0x0793d8,1, -0x0793e0,1, -0x0793e8,1, -0x0793f0,1, -0x0793f8,1, -0x079400,1, -0x079408,1, -0x079410,1, -0x079418,1, -0x079420,1, -0x079428,1, -0x079430,1, -0x079438,1, -0x079440,1, -0x079448,1, -0x079450,1, -0x079458,1, -0x079460,1, -0x079468,1, -0x079470,1, -0x079478,1, -0x079480,1, -0x079488,1, -0x079490,1, -0x079498,1, -0x0794a0,1, -0x0794a8,1, -0x0794b0,1, -0x0794b8,1, -0x0794c0,1, -0x0794c8,1, -0x0794d0,1, -0x0794d8,1, -0x0794e0,1, -0x0794e8,1, -0x0794f0,1, -0x0794f8,1, -0x079500,1, -0x079508,1, -0x079510,1, -0x079518,1, -0x079520,1, -0x079528,1, -0x079530,1, -0x079538,1, -0x079540,1, -0x079548,1, -0x079550,1, -0x079558,1, -0x079560,1, -0x079568,1, -0x079570,1, -0x079578,1, -0x079580,1, -0x079588,1, -0x079590,1, -0x079598,1, -0x0795a0,1, -0x0795a8,1, -0x0795b0,1, -0x0795b8,1, -0x0795c0,1, -0x0795c8,1, -0x0795d0,1, -0x0795d8,1, -0x0795e0,1, -0x0795e8,1, -0x0795f0,1, -0x0795f8,1, -0x079600,1, -0x079608,1, -0x079610,1, -0x079618,1, -0x079620,1, -0x079628,1, -0x079630,1, -0x079638,1, -0x079640,1, -0x079648,1, -0x079650,1, -0x079658,1, -0x079660,1, -0x079668,1, -0x079670,1, -0x079678,1, -0x079680,1, -0x079688,1, -0x079690,1, -0x079698,1, -0x0796a0,1, -0x0796a8,1, -0x0796b0,1, -0x0796b8,1, -0x0796c0,1, -0x0796c8,1, -0x0796d0,1, -0x0796d8,1, -0x0796e0,1, -0x0796e8,1, -0x0796f0,1, -0x0796f8,1, -0x079700,1, -0x079708,1, -0x079710,1, -0x079718,1, -0x079720,1, -0x079728,1, -0x079730,1, -0x079738,1, -0x079740,1, -0x079748,1, -0x079750,1, -0x079758,1, -0x079760,1, -0x079768,1, -0x079770,1, -0x079778,1, -0x079780,1, -0x079788,1, -0x079790,1, -0x079798,1, -0x0797a0,1, -0x0797a8,1, -0x0797b0,1, -0x0797b8,1, -0x0797c0,1, -0x0797c8,1, -0x0797d0,1, -0x0797d8,1, -0x0797e0,1, -0x0797e8,1, -0x0797f0,1, -0x0797f8,1, -0x079800,1, -0x079808,1, -0x079810,1, -0x079818,1, -0x079820,1, -0x079828,1, -0x079830,1, -0x079838,1, -0x079840,1, -0x079848,1, -0x079850,1, -0x079858,1, -0x079860,1, -0x079868,1, -0x079870,1, -0x079878,1, -0x079880,1, -0x079888,1, -0x079890,1, -0x079898,1, -0x0798a0,1, -0x0798a8,1, -0x0798b0,1, -0x0798b8,1, -0x0798c0,1, -0x0798c8,1, -0x0798d0,1, -0x0798d8,1, -0x0798e0,1, -0x0798e8,1, -0x0798f0,1, -0x0798f8,1, -0x079900,1, -0x079908,1, -0x079910,1, -0x079918,1, -0x079920,1, -0x079928,1, -0x079930,1, -0x079938,1, -0x079940,1, -0x079948,1, -0x079950,1, -0x079958,1, -0x079960,1, -0x079968,1, -0x079970,1, -0x079978,1, -0x079980,1, -0x079988,1, -0x079990,1, -0x079998,1, -0x0799a0,1, -0x0799a8,1, -0x0799b0,1, -0x0799b8,1, -0x0799c0,1, -0x0799c8,1, -0x0799d0,1, -0x0799d8,1, -0x0799e0,1, -0x0799e8,1, -0x0799f0,1, -0x0799f8,1, -0x079a00,1, -0x079a08,1, -0x079a10,1, -0x079a18,1, -0x079a20,1, -0x079a28,1, -0x079a30,1, -0x079a38,1, -0x079a40,1, -0x079a48,1, -0x079a50,1, -0x079a58,1, -0x079a60,1, -0x079a68,1, -0x079a70,1, -0x079a78,1, -0x079a80,1, -0x079a88,1, -0x079a90,1, -0x079a98,1, -0x079aa0,1, -0x079aa8,1, -0x079ab0,1, -0x079ab8,1, -0x079ac0,1, -0x079ac8,1, -0x079ad0,1, -0x079ad8,1, -0x079ae0,1, -0x079ae8,1, -0x079af0,1, -0x079af8,1, -0x079b00,1, -0x079b08,1, -0x079b10,1, -0x079b18,1, -0x079b20,1, -0x079b28,1, -0x079b30,1, -0x079b38,1, -0x079b40,1, -0x079b48,1, -0x079b50,1, -0x079b58,1, -0x079b60,1, -0x079b68,1, -0x079b70,1, -0x079b78,1, -0x079b80,1, -0x079b88,1, -0x079b90,1, -0x079b98,1, -0x079ba0,1, -0x079ba8,1, -0x079bb0,1, -0x079bb8,1, -0x079bc0,1, -0x079bc8,1, -0x079bd0,1, -0x079bd8,1, -0x079be0,1, -0x079be8,1, -0x079bf0,1, -0x079bf8,1, -0x079c00,1, -0x079c08,1, -0x079c10,1, -0x079c18,1, -0x079c20,1, -0x079c28,1, -0x079c30,1, -0x079c38,1, -0x079c40,1, -0x079c48,1, -0x079c50,1, -0x079c58,1, -0x079c60,1, -0x079c68,1, -0x079c70,1, -0x079c78,1, -0x079c80,1, -0x079c88,1, -0x079c90,1, -0x079c98,1, -0x079ca0,1, -0x079ca8,1, -0x079cb0,1, -0x079cb8,1, -0x079cc0,1, -0x079cc8,1, -0x079cd0,1, -0x079cd8,1, -0x079ce0,1, -0x079ce8,1, -0x079cf0,1, -0x079cf8,1, -0x079d00,1, -0x079d08,1, -0x079d10,1, -0x079d18,1, -0x079d20,1, -0x079d28,1, -0x079d30,1, -0x079d38,1, -0x079d40,1, -0x079d48,1, -0x079d50,1, -0x079d58,1, -0x079d60,1, -0x079d68,1, -0x079d70,1, -0x079d78,1, -0x079d80,1, -0x079d88,1, -0x079d90,1, -0x079d98,1, -0x079da0,1, -0x079da8,1, -0x079db0,1, -0x079db8,1, -0x079dc0,1, -0x079dc8,1, -0x079dd0,1, -0x079dd8,1, -0x079de0,1, -0x079de8,1, -0x079df0,1, -0x079df8,1, -0x079e00,1, -0x079e08,1, -0x079e10,1, -0x079e18,1, -0x079e20,1, -0x079e28,1, -0x079e30,1, -0x079e38,1, -0x079e40,1, -0x079e48,1, -0x079e50,1, -0x079e58,1, -0x079e60,1, -0x079e68,1, -0x079e70,1, -0x079e78,1, -0x079e80,1, -0x079e88,1, -0x079e90,1, -0x079e98,1, -0x079ea0,1, -0x079ea8,1, -0x079eb0,1, -0x079eb8,1, -0x079ec0,1, -0x079ec8,1, -0x079ed0,1, -0x079ed8,1, -0x079ee0,1, -0x079ee8,1, -0x079ef0,1, -0x079ef8,1, -0x079f00,1, -0x079f08,1, -0x079f10,1, -0x079f18,1, -0x079f20,1, -0x079f28,1, -0x079f30,1, -0x079f38,1, -0x079f40,1, -0x079f48,1, -0x079f50,1, -0x079f58,1, -0x079f60,1, -0x079f68,1, -0x079f70,1, -0x079f78,1, -0x079f80,1, -0x079f88,1, -0x079f90,1, -0x079f98,1, -0x079fa0,1, -0x079fa8,1, -0x079fb0,1, -0x079fb8,1, -0x079fc0,1, -0x079fc8,1, -0x079fd0,1, -0x079fd8,1, -0x079fe0,1, -0x079fe8,1, -0x079ff0,1, -0x079ff8,1, -0x07bef8,2, -0x07bf04,1, -0x07bf14,22, -0x07bf80,2, -0x07bffc,1033, -0x07e000,1040, -0x07f100,24, -0x07f200,3, -0x07f7f8,514, -0x080680,7, -0x081000,3, -0x081010,12, -0x081120,3, -0x081130,2, -0x081140,3, -0x081150,2, -0x081160,3, -0x081170,2, -0x081204,18, -0x081304,2, -0x08139c,25, -0x081404,21, -0x08145c,1, -0x081468,6, -0x081504,2, -0x081604,14, -0x081640,128, -0x081904,5, -0x081a30,4, -0x081a60,18, -0x081ad0,4, -0x081c00,128, -0x081e04,13, -0x082000,8, -0x082024,1, -0x082030,1, -0x082044,39, -0x082180,1, -0x0821c4,1, -0x0821e0,5, -0x0821f8,1, -0x082200,9, -0x08229c,3, -0x0822e0,7, -0x082328,6, -0x082430,20, -0x082484,3, -0x082498,2, -0x082500,16, -0x082548,2, -0x082558,2, -0x082564,2, -0x082590,4, -0x0827fc,14, -0x082838,66, -0x082c00,13, -0x082c38,66, -0x083000,13, -0x083038,66, -0x0f0000,8, -0x0f0040,8, -0x0f0064,1, -0x0f0078,5, -0x0f0090,2, -0x0f00a4,2, -0x0f00b0,4, -0x0f00f0,24, -0x0f0180,17, -0x0f0200,8, -0x0f0240,11, -0x0f0270,2, -0x0f0280,1, -0x0f02a4,5, -0x0f02c0,11, -0x0f0400,2, -0x0f0410,10, -0x0f0440,7, -0x0f0470,11, -0x0f04b0,11, -0x0f04f0,4, -0x0f3000,2, -0x0f300c,3, -0x0f301c,6, -0x0f3040,5, -0x0f3058,6, -0x0f3078,14, -0x0f30c0,13, -0x0f30fc,2, -0x0f310c,1, -0x0f3120,2, -0x0f3130,5, -0x0f3184,15, -0x0f3204,1, -0x0f3210,5, -0x0f3244,6, -0x0f3264,5, -0x0f3280,2, -0x0f3290,8, -0x0f32e4,1, -0x0f32ec,1, -0x0f3300,11, -0x0f3330,2, -0x0f3400,34, -0x0f3500,2, -0x0f350c,11, -0x0f3540,15, -0x0f3580,11, -0x0f35b0,2, -0x0f35cc,8, -0x0f3700,13, -0x0f3740,3, -0x0f3750,2, -0x0f3760,3, -0x0f3770,2, -0x0f3780,3, -0x0f3790,2, -0x0f37a0,10, -0x0f3800,3, -0x0f3810,2, -0x0f381c,22, -0x0f3880,12, -0x0f38f8,6, -0x0f3920,1, -0x0f3928,1, -0x0f3930,24, -0x0f39a0,1, -0x0f39a8,1, -0x0f39b0,23, -0x0f3a10,13, -0x0f3a84,3, -0x0f3c00,256, diff --git a/mstdump/mstdump_dbs/ConnectX2.csv b/mstdump/mstdump_dbs/ConnectX2.csv deleted file mode 100755 index 01d9838..0000000 --- a/mstdump/mstdump_dbs/ConnectX2.csv +++ /dev/null @@ -1,2335 +0,0 @@ -#Addr, Size, Enable addr -0x010000,2, -0x0100a0,15, -0x0100ec,2, -0x0100fc,2, -0x01010c,2, -0x010150,1, -0x0101cc,1, -0x0101fc,1, -0x010208,10, -0x010300,6, -0x010320,20, -0x010374,3, -0x010400,1, -0x010410,2, -0x010440,1, -0x010450,2, -0x010480,1, -0x010488,2, -0x0104a0,1, -0x0104a8,14, -0x0104f4,4, -0x010510,2, -0x010520,13, -0x0105c0,15, -0x010600,29, -0x010680,1, -0x010690,2, -0x0106ac,1, -0x0106b8,1, -0x0106e0,3, -0x0106f0,3, -0x010740,4, -0x010754,8, -0x010800,2, -0x0108a0,15, -0x0108ec,2, -0x0108fc,2, -0x01090c,2, -0x010950,1, -0x0109cc,1, -0x0109fc,1, -0x010a08,10, -0x010b00,6, -0x010b20,20, -0x010b74,3, -0x010c00,1, -0x010c10,2, -0x010c40,1, -0x010c50,2, -0x010c80,1, -0x010c88,2, -0x010ca0,1, -0x010ca8,14, -0x010cf4,4, -0x010d10,2, -0x010d20,13, -0x010dc0,15, -0x010e00,29, -0x010e80,1, -0x010e90,2, -0x010eac,1, -0x010eb8,1, -0x010ee0,3, -0x010ef0,3, -0x010f40,4, -0x010f54,8, -0x011000,1, -0x011010,4, -0x011024,2, -0x011080,2, -0x011090,12, -0x011180,6, -0x011200,7, -0x011220,1, -0x011240,4, -0x011260,1, -0x011280,5, -0x011300,1, -0x011310,2, -0x011400,1, -0x011408,1, -0x011460,1, -0x0114b0,4, -0x011800,1, -0x011810,4, -0x011824,2, -0x011880,2, -0x011890,12, -0x011980,6, -0x011a00,7, -0x011a20,1, -0x011a40,4, -0x011a60,1, -0x011a80,5, -0x011b00,1, -0x011b10,2, -0x011c00,1, -0x011c08,1, -0x011c60,1, -0x011cb0,4, -0x012000,2, -0x012020,1, -0x012030,2, -0x012044,2, -0x0120a0,4, -0x0120c0,7, -0x01211c,13, -0x012164,1, -0x012170,4, -0x0121e0,6, -0x012250,1, -0x012360,4, -0x012380,3, -0x012390,5, -0x0123b0,5, -0x012440,3, -0x012450,3, -0x0124a8,2, -0x0124c0,2, -0x0124d0,2, -0x012568,2, -0x0125c0,4, -0x0125fc,10, -0x012628,6, -0x012644,1, -0x012660,2, -0x012670,2, -0x01268c,5, -0x01270c,1, -0x012728,8, -0x012750,2, -0x01275c,1, -0x0127d8,2, -0x0127e8,2, -0x012840,1, -0x012850,2, -0x0128a0,5, -0x0128c0,2, -0x012904,1, -0x012910,5, -0x012928,4, -0x012944,4, -0x012958,4, -0x0129a0,1, -0x0129b0,2, -0x012a00,2, -0x012a14,2, -0x012a28,3, -0x012a40,1, -0x012a50,2, -0x012a60,1, -0x012a70,2, -0x012ae4,4, -0x012b00,9, -0x012b30,2, -0x012b40,2, -0x012b4c,4, -0x012b80,9, -0x012bb0,2, -0x012bc0,2, -0x012bcc,4, -0x012c00,37, -0x012ca0,5, -0x012cc0,5, -0x012ce0,5, -0x012d00,2, -0x012d48,4, -0x012e00,32, -0x012e84,7, -0x012ea8,2, -0x012ec4,7, -0x012ee8,2, -0x018000,1, -0x01805c,4, -0x018080,8, -0x0180a4,7, -0x0180c4,2, -0x018100,32, -0x018200,4, -0x018224,1, -0x018234,5, -0x018300,32, -0x018384,1, -0x01838c,1, -0x0183a4,3, -0x018400,5, -0x018420,5, -0x018440,5, -0x018460,5, -0x018480,5, -0x0184a0,5, -0x0184c0,5, -0x0184e0,5, -0x018500,5, -0x018520,5, -0x018540,5, -0x018560,5, -0x018580,5, -0x0185a0,5, -0x0185c0,5, -0x0185e0,5, -0x018610,4, -0x018624,4, -0x018810,3, -0x018820,11, -0x018850,3, -0x018860,7, -0x018884,11, -0x0188c8,2, -0x0188d4,2, -0x0188e0,8, -0x018a04,3, -0x018a20,3, -0x018a30,4, -0x018a44,21, -0x018b04,3, -0x018b14,11, -0x018b4c,5, -0x018b68,5, -0x018c00,17, -0x018c50,29, -0x018cd0,14, -0x018d0c,2, -0x018e00,1, -0x018e10,2, -0x018e50,2, -0x018f00,2, -0x018f14,2, -0x018f28,3, -0x018f40,1, -0x018f50,2, -0x018f60,1, -0x018f70,2, -0x018fe4,5, -0x019ff0,2052, -0x01c004,2, -0x01c010,1, -0x01c01c,2, -0x01c06c,27, -0x01c180,1, -0x01c190,2, -0x01c1a0,1, -0x01c1b0,2, -0x01c1c0,7, -0x01c1e0,7, -0x01c200,17, -0x01c250,29, -0x01c2d0,14, -0x01c30c,2, -0x01c40c,5, -0x01c428,2, -0x01c434,1, -0x01c448,2, -0x01c454,1, -0x01c464,24, -0x01c4d8,2, -0x01c4e4,8, -0x01c514,1, -0x01c528,2, -0x01c540,1, -0x01c550,2, -0x01c5e4,5, -0x01c608,4, -0x01c624,3, -0x01c63c,1, -0x01c64c,22, -0x01c6a8,4, -0x01c6c0,9, -0x01c6e8,8, -0x01c70c,2, -0x01c71c,5, -0x01c738,2, -0x01c744,1, -0x01c75c,1, -0x01c7dc,1, -0x01c7e4,1, -0x01c7f8,7, -0x01c818,7, -0x01c840,19, -0x01c8a0,5, -0x01c8c0,1, -0x01c900,5, -0x01c918,7, -0x01c940,19, -0x01c9a0,5, -0x01c9c0,1, -0x01ca00,5, -0x01ca18,7, -0x01ca40,19, -0x01caa0,5, -0x01cac0,1, -0x01cb00,5, -0x01cb18,7, -0x01cb40,19, -0x01cba0,5, -0x01cbc0,1, -0x01cc00,5, -0x01cc18,7, -0x01cc40,19, -0x01cca0,5, -0x01ccc0,1, -0x01cd00,5, -0x01cd18,7, -0x01cd40,19, -0x01cda0,5, -0x01cdc0,1, -0x01ce00,5, -0x01ce18,7, -0x01ce40,19, -0x01cea0,5, -0x01cec0,1, -0x01cf00,5, -0x01cf18,7, -0x01cf40,19, -0x01cfa0,5, -0x01cfc0,1, -0x01d000,19, -0x01d050,22, -0x01d0ac,6, -0x01d0d0,2, -0x01d0e8,15, -0x01d140,1, -0x01d148,53, -0x01d220,10, -0x01d260,5, -0x01d278,2, -0x01d284,1, -0x01d298,2, -0x01d2a8,6, -0x01d300,2, -0x01d310,19, -0x01d368,2, -0x01d37c,6, -0x01d3c0,5, -0x01d3e0,6, -0x01d400,19, -0x01d450,22, -0x01d4ac,6, -0x01d4d0,2, -0x01d4e8,15, -0x01d540,1, -0x01d548,53, -0x01d620,10, -0x01d660,5, -0x01d678,2, -0x01d684,1, -0x01d698,2, -0x01d6a8,6, -0x01d700,2, -0x01d710,19, -0x01d768,2, -0x01d77c,6, -0x01d7c0,5, -0x01d7e0,6, -0x01d800,16, -0x01d844,1, -0x01d880,8, -0x01d8c4,1, -0x01d8cc,5, -0x01d8e4,7, -0x01d920,1, -0x01d968,2, -0x01d9e0,6, -0x01da00,4, -0x01da14,2, -0x01db0c,14, -0x01db50,2, -0x01db60,1, -0x01db70,2, -0x01db80,1, -0x01db90,2, -0x01dba0,3, -0x01dc00,1, -0x01dc0c,1, -0x01dd80,13, -0x01ddbc,1, -0x01dde0,9, -0x01df00,1, -0x01df14,1, -0x01df28,2, -0x01df40,1, -0x01df50,2, -0x01dfe4,4, -0x01e5c0,1, -0x01e5dc,1, -0x01e5e4,14, -0x01e620,4, -0x01e668,6, -0x01e780,160, -0x01ea04,12, -0x01ec00,8, -0x01ec24,1, -0x01ec30,1, -0x01ec44,20, -0x01ec9c,2, -0x01ecac,14, -0x01ed80,1, -0x01edc4,1, -0x01ede0,1, -0x01ede8,3, -0x01edf8,1, -0x01ee00,8, -0x01ee24,1, -0x01ee30,1, -0x01ee44,20, -0x01ee9c,2, -0x01eeac,14, -0x01ef80,1, -0x01efc4,1, -0x01efe0,1, -0x01efe8,3, -0x01eff8,1, -0x01f000,1024, -0x030000,1, -0x030010,2, -0x030020,1, -0x030030,2, -0x030040,1, -0x030050,2, -0x030100,27, -0x030180,3, -0x030200,80, -0x030400,288, -0x030900,32, -0x030a04,1, -0x030c00,128, -0x030e1c,1, -0x030e3c,1, -0x030e44,1, -0x030e5c,16, -0x030f10,28, -0x031000,14, -0x031040,14, -0x031080,14, -0x0310c0,14, -0x031100,133, -0x031318,13, -0x034000,1, -0x034010,2, -0x034224,1, -0x034260,7, -0x034284,4, -0x034304,1, -0x034314,3, -0x034324,1, -0x034334,3, -0x034344,1, -0x034358,2, -0x034414,3, -0x034510,4, -0x034608,6, -0x034800,7, -0x034820,4, -0x034868,6, -0x034980,45, -0x034a40,13, -0x034a80,13, -0x034ac0,13, -0x034b00,13, -0x034b40,13, -0x034b80,13, -0x034bc0,13, -0x035020,1, -0x035028,1, -0x035040,2, -0x03504c,1, -0x035058,3, -0x035068,4, -0x035104,5, -0x035200,12, -0x035240,12, -0x035280,12, -0x0352c0,12, -0x035300,12, -0x035340,12, -0x035380,12, -0x0353c0,12, -0x036000,128, -0x036204,12, -0x036400,8, -0x036424,1, -0x036430,1, -0x036444,20, -0x03649c,2, -0x0364ac,14, -0x036580,1, -0x0365c4,1, -0x0365e0,1, -0x0365e8,3, -0x0365f8,1, -0x036600,2, -0x036614,2, -0x036628,3, -0x036640,1, -0x036650,2, -0x036660,1, -0x036670,2, -0x0366e4,5, -0x036700,1, -0x036710,2, -0x036720,1, -0x036730,2, -0x040000,19, -0x040050,3, -0x040060,2, -0x040080,1, -0x0400a4,5, -0x0400c0,4, -0x0400e0,3, -0x040100,6, -0x04011c,14, -0x04015c,1, -0x040170,4, -0x040190,3, -0x0401a4,1, -0x0401ac,5, -0x0401c4,1, -0x0401cc,6, -0x040200,3, -0x040210,3, -0x040220,3, -0x040230,3, -0x040240,3, -0x040250,3, -0x040260,3, -0x040270,3, -0x040280,3, -0x040290,3, -0x0402a0,3, -0x0402b0,3, -0x0402c0,3, -0x0402d0,3, -0x0402e0,3, -0x0402f0,3, -0x040304,1, -0x040314,8, -0x040340,11, -0x040490,1, -0x0404a8,15, -0x040510,18, -0x04055c,3, -0x04056c,3, -0x04057c,3, -0x04058c,2, -0x04059c,17, -0x040610,16, -0x0406e0,51, -0x0407d0,3, -0x0407f0,1, -0x040800,337, -0x040d50,18, -0x040d9c,4, -0x040db0,11, -0x040df0,11, -0x040e20,1, -0x040e28,11, -0x040e58,1, -0x040e60,2, -0x040e6c,1, -0x040e74,11, -0x040eb0,4, -0x040ec8,2, -0x040ed4,7, -0x040ef8,6, -0x041000,33, -0x041100,15, -0x041140,14, -0x041180,15, -0x0411dc,1, -0x0411e4,15, -0x041224,1, -0x041230,1, -0x041244,20, -0x04129c,2, -0x0412ac,14, -0x041380,1, -0x0413c4,1, -0x0413e0,1, -0x0413e8,3, -0x0413f8,1, -0x041400,8, -0x041424,1, -0x041430,1, -0x041444,20, -0x04149c,2, -0x0414ac,14, -0x041580,1, -0x0415c4,1, -0x0415e0,1, -0x0415e8,3, -0x0415f8,1, -0x041600,2, -0x041614,2, -0x041628,3, -0x041640,1, -0x041650,2, -0x041660,1, -0x041670,2, -0x0416e4,6, -0x041a00,1, -0x041a10,2, -0x041a20,1, -0x041a30,2, -0x041c00,128, -0x041e04,12, -0x042000,5, -0x042020,5, -0x042040,5, -0x042060,5, -0x042080,5, -0x0420a0,5, -0x0420c0,5, -0x0420e0,5, -0x042100,5, -0x042120,5, -0x042140,5, -0x042160,5, -0x042180,5, -0x0421a0,5, -0x0421c0,5, -0x0421e0,5, -0x042200,5, -0x042220,5, -0x042240,5, -0x042260,5, -0x042280,5, -0x0422a0,5, -0x0422c0,5, -0x0422e0,5, -0x042300,5, -0x042320,5, -0x042340,5, -0x042360,5, -0x042380,5, -0x0423a0,5, -0x0423c0,5, -0x0423e0,5, -0x042400,5, -0x042420,5, -0x042440,5, -0x042460,5, -0x042480,5, -0x0424a0,5, -0x0424c0,5, -0x0424e0,5, -0x042500,5, -0x042520,5, -0x042540,5, -0x042560,5, -0x042580,5, -0x0425a0,5, -0x0425c0,5, -0x0425e0,5, -0x042600,5, -0x042620,5, -0x042640,5, -0x042660,5, -0x042680,5, -0x0426a0,5, -0x0426c0,5, -0x0426e0,5, -0x042700,5, -0x042720,5, -0x042740,5, -0x042760,5, -0x042780,5, -0x0427a0,5, -0x0427c0,5, -0x0427e0,5, -0x042800,5, -0x042820,5, -0x042840,5, -0x042860,5, -0x042880,5, -0x0428a0,5, -0x0428c0,5, -0x0428e0,5, -0x042900,5, -0x042920,5, -0x042940,5, -0x042960,5, -0x042980,5, -0x0429a0,5, -0x0429c0,5, -0x0429e0,5, -0x042a00,5, -0x042a20,5, -0x042a40,5, -0x042a60,5, -0x042a80,5, -0x042aa0,5, -0x042ac0,5, -0x042ae0,5, -0x042b00,5, -0x042b20,5, -0x042b40,5, -0x042b60,5, -0x042b80,5, -0x042ba0,5, -0x042bc0,5, -0x042be0,5, -0x042c00,5, -0x042c20,5, -0x042c40,5, -0x042c60,5, -0x042c80,5, -0x042ca0,5, -0x042cc0,5, -0x042ce0,5, -0x042d00,5, -0x042d20,5, -0x042d40,5, -0x042d60,5, -0x042d80,5, -0x042da0,5, -0x042dc0,5, -0x042de0,5, -0x042e00,5, -0x042e20,5, -0x042e40,5, -0x042e60,5, -0x042e80,5, -0x042ea0,5, -0x042ec0,5, -0x042ee0,5, -0x042f00,5, -0x042f20,5, -0x042f40,5, -0x042f60,5, -0x042f80,5, -0x042fa0,5, -0x042fc0,5, -0x042fe0,5, -0x043000,5, -0x043020,5, -0x043040,5, -0x043060,5, -0x043080,5, -0x0430a0,5, -0x0430c0,5, -0x0430e0,5, -0x043100,5, -0x043120,5, -0x043140,5, -0x043160,5, -0x043180,5, -0x0431a0,5, -0x0431c0,5, -0x0431e0,5, -0x043200,5, -0x043220,5, -0x043240,5, -0x043260,5, -0x043280,5, -0x0432a0,5, -0x0432c0,5, -0x0432e0,5, -0x043300,5, -0x043320,5, -0x043340,5, -0x043360,5, -0x043380,5, -0x0433a0,5, -0x0433c0,5, -0x0433e0,5, -0x043400,5, -0x043420,5, -0x043440,5, -0x043460,5, -0x043480,5, -0x0434a0,5, -0x0434c0,5, -0x0434e0,5, -0x043500,5, -0x043520,5, -0x043540,5, -0x043560,5, -0x043580,5, -0x0435a0,5, -0x0435c0,5, -0x0435e0,5, -0x043600,5, -0x043620,5, -0x043640,5, -0x043660,5, -0x043680,5, -0x0436a0,5, -0x0436c0,5, -0x0436e0,5, -0x043700,5, -0x043720,5, -0x043740,5, -0x043760,5, -0x043780,5, -0x0437a0,5, -0x0437c0,5, -0x0437e0,5, -0x043800,5, -0x043820,5, -0x043840,5, -0x043860,5, -0x043880,5, -0x0438a0,5, -0x0438c0,5, -0x0438e0,5, -0x043900,5, -0x043920,5, -0x043940,5, -0x043960,5, -0x043980,5, -0x0439a0,5, -0x0439c0,5, -0x0439e0,5, -0x043a00,5, -0x043a20,5, -0x043a40,5, -0x043a60,5, -0x043a80,5, -0x043aa0,5, -0x043ac0,5, -0x043ae0,5, -0x043b00,5, -0x043b20,5, -0x043b40,5, -0x043b60,5, -0x043b80,5, -0x043ba0,5, -0x043bc0,5, -0x043be0,5, -0x043c00,5, -0x043c20,5, -0x043c40,5, -0x043c60,5, -0x043c80,5, -0x043ca0,5, -0x043cc0,5, -0x043ce0,5, -0x043d00,5, -0x043d20,5, -0x043d40,5, -0x043d60,5, -0x043d80,5, -0x043da0,5, -0x043dc0,5, -0x043de0,5, -0x043e00,5, -0x043e20,5, -0x043e40,5, -0x043e60,5, -0x043e80,5, -0x043ea0,5, -0x043ec0,5, -0x043ee0,5, -0x043f00,5, -0x043f20,5, -0x043f40,5, -0x043f60,5, -0x043f80,5, -0x043fa0,5, -0x043fc0,5, -0x043fe0,5, -0x044004,1, -0x044200,8, -0x044230,9, -0x044260,5, -0x044280,32, -0x044fc8,112, -0x045190,88, -0x045300,39, -0x045400,13, -0x045440,9, -0x04546c,5, -0x047ff0,2, -0x048000,5, -0x048020,5, -0x048040,5, -0x048060,5, -0x048080,5, -0x0480a0,5, -0x0480c0,5, -0x0480e0,5, -0x048100,5, -0x048120,5, -0x048140,5, -0x048160,5, -0x048180,5, -0x0481a0,5, -0x0481c0,5, -0x0481e0,5, -0x048200,5, -0x048220,5, -0x048240,5, -0x048260,5, -0x048280,5, -0x0482a0,5, -0x0482c0,5, -0x0482e0,5, -0x048300,5, -0x048320,5, -0x048340,5, -0x048360,5, -0x048380,5, -0x0483a0,5, -0x0483c0,5, -0x0483e0,5, -0x048400,5, -0x048420,5, -0x048440,5, -0x048460,5, -0x048480,5, -0x0484a0,5, -0x0484c0,5, -0x0484e0,5, -0x048500,5, -0x048520,5, -0x048540,5, -0x048560,5, -0x048580,5, -0x0485a0,5, -0x0485c0,5, -0x0485e0,5, -0x048600,5, -0x048620,5, -0x048640,5, -0x048660,5, -0x048680,5, -0x0486a0,5, -0x0486c0,5, -0x0486e0,5, -0x048700,5, -0x048720,5, -0x048740,5, -0x048760,5, -0x048780,5, -0x0487a0,5, -0x0487c0,5, -0x0487e0,5, -0x048800,5, -0x048820,5, -0x048840,5, -0x048860,5, -0x048880,5, -0x0488a0,5, -0x0488c0,5, -0x0488e0,5, -0x048900,5, -0x048920,5, -0x048940,5, -0x048960,5, -0x048980,5, -0x0489a0,5, -0x0489c0,5, -0x0489e0,5, -0x048a00,5, -0x048a20,5, -0x048a40,5, -0x048a60,5, -0x048a80,5, -0x048aa0,5, -0x048ac0,5, -0x048ae0,5, -0x048b00,5, -0x048b20,5, -0x048b40,5, -0x048b60,5, -0x048b80,5, -0x048ba0,5, -0x048bc0,5, -0x048be0,5, -0x048c00,5, -0x048c20,5, -0x048c40,5, -0x048c60,5, -0x048c80,5, -0x048ca0,5, -0x048cc0,5, -0x048ce0,5, -0x048d00,5, -0x048d20,5, -0x048d40,5, -0x048d60,5, -0x048d80,5, -0x048da0,5, -0x048dc0,5, -0x048de0,5, -0x048e00,5, -0x048e20,5, -0x048e40,5, -0x048e60,5, -0x048e80,5, -0x048ea0,5, -0x048ec0,5, -0x048ee0,5, -0x048f00,5, -0x048f20,5, -0x048f40,5, -0x048f60,5, -0x048f80,5, -0x048fa0,5, -0x048fc0,5, -0x048fe0,5, -0x049000,5, -0x049020,5, -0x049040,5, -0x049060,5, -0x049080,5, -0x0490a0,5, -0x0490c0,5, -0x0490e0,5, -0x049100,5, -0x049120,5, -0x049140,5, -0x049160,5, -0x049180,5, -0x0491a0,5, -0x0491c0,5, -0x0491e0,5, -0x049200,5, -0x049220,5, -0x049240,5, -0x049260,5, -0x049280,5, -0x0492a0,5, -0x0492c0,5, -0x0492e0,5, -0x049300,5, -0x049320,5, -0x049340,5, -0x049360,5, -0x049380,5, -0x0493a0,5, -0x0493c0,5, -0x0493e0,5, -0x049400,5, -0x049420,5, -0x049440,5, -0x049460,5, -0x049480,5, -0x0494a0,5, -0x0494c0,5, -0x0494e0,5, -0x049500,5, -0x049520,5, -0x049540,5, -0x049560,5, -0x049580,5, -0x0495a0,5, -0x0495c0,5, -0x0495e0,5, -0x049600,5, -0x049620,5, -0x049640,5, -0x049660,5, -0x049680,5, -0x0496a0,5, -0x0496c0,5, -0x0496e0,5, -0x049700,5, -0x049720,5, -0x049740,5, -0x049760,5, -0x049780,5, -0x0497a0,5, -0x0497c0,5, -0x0497e0,5, -0x049800,5, -0x049820,5, -0x049840,5, -0x049860,5, -0x049880,5, -0x0498a0,5, -0x0498c0,5, -0x0498e0,5, -0x049900,5, -0x049920,5, -0x049940,5, -0x049960,5, -0x049980,5, -0x0499a0,5, -0x0499c0,5, -0x0499e0,5, -0x049a00,5, -0x049a20,5, -0x049a40,5, -0x049a60,5, -0x049a80,5, -0x049aa0,5, -0x049ac0,5, -0x049ae0,5, -0x049b00,5, -0x049b20,5, -0x049b40,5, -0x049b60,5, -0x049b80,5, -0x049ba0,5, -0x049bc0,5, -0x049be0,5, -0x049c00,5, -0x049c20,5, -0x049c40,5, -0x049c60,5, -0x049c80,5, -0x049ca0,5, -0x049cc0,5, -0x049ce0,5, -0x049d00,5, -0x049d20,5, -0x049d40,5, -0x049d60,5, -0x049d80,5, -0x049da0,5, -0x049dc0,5, -0x049de0,5, -0x049e00,5, -0x049e20,5, -0x049e40,5, -0x049e60,5, -0x049e80,5, -0x049ea0,5, -0x049ec0,5, -0x049ee0,5, -0x049f00,5, -0x049f20,5, -0x049f40,5, -0x049f60,5, -0x049f80,5, -0x049fa0,5, -0x049fc0,5, -0x049fe0,5, -0x04a000,5, -0x04a020,5, -0x04a040,5, -0x04a060,5, -0x04a080,5, -0x04a0a0,5, -0x04a0c0,5, -0x04a0e0,5, -0x04a100,5, -0x04a120,5, -0x04a140,5, -0x04a160,5, -0x04a180,5, -0x04a1a0,5, -0x04a1c0,5, -0x04a1e0,5, -0x04a200,5, -0x04a220,5, -0x04a240,5, -0x04a260,5, -0x04a280,5, -0x04a2a0,5, -0x04a2c0,5, -0x04a2e0,5, -0x04a300,5, -0x04a320,5, -0x04a340,5, -0x04a360,5, -0x04a380,5, -0x04a3a0,5, -0x04a3c0,5, -0x04a3e0,5, -0x04a400,5, -0x04a420,5, -0x04a440,5, -0x04a460,5, -0x04a480,5, -0x04a4a0,5, -0x04a4c0,5, -0x04a4e0,5, -0x04a500,5, -0x04a520,5, -0x04a540,5, -0x04a560,5, -0x04a580,5, -0x04a5a0,5, -0x04a5c0,5, -0x04a5e0,5, -0x04a600,5, -0x04a620,5, -0x04a640,5, -0x04a660,5, -0x04a680,5, -0x04a6a0,5, -0x04a6c0,5, -0x04a6e0,5, -0x04a700,5, -0x04a720,5, -0x04a740,5, -0x04a760,5, -0x04a780,5, -0x04a7a0,5, -0x04a7c0,5, -0x04a7e0,5, -0x04a800,5, -0x04a820,5, -0x04a840,5, -0x04a860,5, -0x04a880,5, -0x04a8a0,5, -0x04a8c0,5, -0x04a8e0,5, -0x04a900,5, -0x04a920,5, -0x04a940,5, -0x04a960,5, -0x04a980,5, -0x04a9a0,5, -0x04a9c0,5, -0x04a9e0,5, -0x04aa00,5, -0x04aa20,5, -0x04aa40,5, -0x04aa60,5, -0x04aa80,5, -0x04aaa0,5, -0x04aac0,5, -0x04aae0,5, -0x04ab00,5, -0x04ab20,5, -0x04ab40,5, -0x04ab60,5, -0x04ab80,5, -0x04aba0,5, -0x04abc0,5, -0x04abe0,5, -0x04ac00,5, -0x04ac20,5, -0x04ac40,5, -0x04ac60,5, -0x04ac80,5, -0x04aca0,5, -0x04acc0,5, -0x04ace0,5, -0x04ad00,5, -0x04ad20,5, -0x04ad40,5, -0x04ad60,5, -0x04ad80,5, -0x04ada0,5, -0x04adc0,5, -0x04ade0,5, -0x04ae00,5, -0x04ae20,5, -0x04ae40,5, -0x04ae60,5, -0x04ae80,5, -0x04aea0,5, -0x04aec0,5, -0x04aee0,5, -0x04af00,5, -0x04af20,5, -0x04af40,5, -0x04af60,5, -0x04af80,5, -0x04afa0,5, -0x04afc0,5, -0x04afe0,5, -0x04b000,5, -0x04b020,5, -0x04b040,5, -0x04b060,5, -0x04b080,5, -0x04b0a0,5, -0x04b0c0,5, -0x04b0e0,5, -0x04b100,5, -0x04b120,5, -0x04b140,5, -0x04b160,5, -0x04b180,5, -0x04b1a0,5, -0x04b1c0,5, -0x04b1e0,5, -0x04b200,5, -0x04b220,5, -0x04b240,5, -0x04b260,5, -0x04b280,5, -0x04b2a0,5, -0x04b2c0,5, -0x04b2e0,5, -0x04b300,5, -0x04b320,5, -0x04b340,5, -0x04b360,5, -0x04b380,5, -0x04b3a0,5, -0x04b3c0,5, -0x04b3e0,5, -0x04b400,5, -0x04b420,5, -0x04b440,5, -0x04b460,5, -0x04b480,5, -0x04b4a0,5, -0x04b4c0,5, -0x04b4e0,5, -0x04b500,5, -0x04b520,5, -0x04b540,5, -0x04b560,5, -0x04b580,5, -0x04b5a0,5, -0x04b5c0,5, -0x04b5e0,5, -0x04b600,5, -0x04b620,5, -0x04b640,5, -0x04b660,5, -0x04b680,5, -0x04b6a0,5, -0x04b6c0,5, -0x04b6e0,5, -0x04b700,5, -0x04b720,5, -0x04b740,5, -0x04b760,5, -0x04b780,5, -0x04b7a0,5, -0x04b7c0,5, -0x04b7e0,5, -0x04b800,5, -0x04b820,5, -0x04b840,5, -0x04b860,5, -0x04b880,5, -0x04b8a0,5, -0x04b8c0,5, -0x04b8e0,5, -0x04b900,5, -0x04b920,5, -0x04b940,5, -0x04b960,5, -0x04b980,5, -0x04b9a0,5, -0x04b9c0,5, -0x04b9e0,5, -0x04ba00,5, -0x04ba20,5, -0x04ba40,5, -0x04ba60,5, -0x04ba80,5, -0x04baa0,5, -0x04bac0,5, -0x04bae0,5, -0x04bb00,5, -0x04bb20,5, -0x04bb40,5, -0x04bb60,5, -0x04bb80,5, -0x04bba0,5, -0x04bbc0,5, -0x04bbe0,5, -0x04bc00,5, -0x04bc20,5, -0x04bc40,5, -0x04bc60,5, -0x04bc80,5, -0x04bca0,5, -0x04bcc0,5, -0x04bce0,5, -0x04bd00,5, -0x04bd20,5, -0x04bd40,5, -0x04bd60,5, -0x04bd80,5, -0x04bda0,5, -0x04bdc0,5, -0x04bde0,5, -0x04be00,5, -0x04be20,5, -0x04be40,5, -0x04be60,5, -0x04be80,5, -0x04bea0,5, -0x04bec0,5, -0x04bee0,5, -0x04bf00,5, -0x04bf20,5, -0x04bf40,5, -0x04bf60,5, -0x04bf80,5, -0x04bfa0,5, -0x04bfc0,5, -0x04bfe0,5, -0x04c000,5, -0x04c020,5, -0x04c040,5, -0x04c060,5, -0x04c080,5, -0x04c0a0,5, -0x04c0c0,5, -0x04c0e0,5, -0x04c100,5, -0x04c120,5, -0x04c140,5, -0x04c160,5, -0x04c180,5, -0x04c1a0,5, -0x04c1c0,5, -0x04c1e0,5, -0x04c200,5, -0x04c220,5, -0x04c240,5, -0x04c260,5, -0x04c280,5, -0x04c2a0,5, -0x04c2c0,5, -0x04c2e0,5, -0x04c300,5, -0x04c320,5, -0x04c340,5, -0x04c360,5, -0x04c380,5, -0x04c3a0,5, -0x04c3c0,5, -0x04c3e0,5, -0x04c400,5, -0x04c420,5, -0x04c440,5, -0x04c460,5, -0x04c480,5, -0x04c4a0,5, -0x04c4c0,5, -0x04c4e0,5, -0x04c500,5, -0x04c520,5, -0x04c540,5, -0x04c560,5, -0x04c580,5, -0x04c5a0,5, -0x04c5c0,5, -0x04c5e0,5, -0x04c600,5, -0x04c620,5, -0x04c640,5, -0x04c660,5, -0x04c680,5, -0x04c6a0,5, -0x04c6c0,5, -0x04c6e0,5, -0x04c700,5, -0x04c720,5, -0x04c740,5, -0x04c760,5, -0x04c780,5, -0x04c7a0,5, -0x04c7c0,5, -0x04c7e0,5, -0x04c800,5, -0x04c820,5, -0x04c840,5, -0x04c860,5, -0x04c880,5, -0x04c8a0,5, -0x04c8c0,5, -0x04c8e0,5, -0x04c900,5, -0x04c920,5, -0x04c940,5, -0x04c960,5, -0x04c980,5, -0x04c9a0,5, -0x04c9c0,5, -0x04c9e0,5, -0x04ca00,5, -0x04ca20,5, -0x04ca40,5, -0x04ca60,5, -0x04ca80,5, -0x04caa0,5, -0x04cac0,5, -0x04cae0,5, -0x04cb00,5, -0x04cb20,5, -0x04cb40,5, -0x04cb60,5, -0x04cb80,5, -0x04cba0,5, -0x04cbc0,5, -0x04cbe0,5, -0x04cc00,5, -0x04cc20,5, -0x04cc40,5, -0x04cc60,5, -0x04cc80,5, -0x04cca0,5, -0x04ccc0,5, -0x04cce0,5, -0x04cd00,5, -0x04cd20,5, -0x04cd40,5, -0x04cd60,5, -0x04cd80,5, -0x04cda0,5, -0x04cdc0,5, -0x04cde0,5, -0x04ce00,5, -0x04ce20,5, -0x04ce40,5, -0x04ce60,5, -0x04ce80,5, -0x04cea0,5, -0x04cec0,5, -0x04cee0,5, -0x04cf00,5, -0x04cf20,5, -0x04cf40,5, -0x04cf60,5, -0x04cf80,5, -0x04cfa0,5, -0x04cfc0,5, -0x04cfe0,5, -0x050004,1, -0x05000c,5, -0x05900c,10, -0x05903c,1, -0x060400,5, -0x060500,6, -0x060520,6, -0x060600,6, -0x060700,7, -0x060800,64, -0x060940,1, -0x060a04,7, -0x060c00,4, -0x060d00,2, -0x060e00,4, -0x060f40,16, -0x060f88,2, -0x061000,34, -0x061100,34, -0x061200,34, -0x061300,34, -0x061400,34, -0x061500,34, -0x061600,34, -0x061700,34, -0x061800,34, -0x061900,34, -0x061a00,34, -0x061b00,34, -0x061c00,34, -0x061d00,34, -0x061e00,34, -0x061f00,34, -0x062100,2, -0x064000,2048, -0x066100,3, -0x068000,2, -0x068014,2, -0x068028,3, -0x068040,1, -0x068050,2, -0x068060,1, -0x068070,2, -0x0680e4,5, -0x068800,7, -0x068820,4, -0x068868,6, -0x068980,32, -0x068a20,1, -0x068a30,2, -0x068a80,2, -0x070000,1, -0x07000c,6, -0x070028,3, -0x070040,12, -0x07007c,13, -0x0700bc,6, -0x0700d8,5, -0x0700f0,20, -0x070144,1, -0x070180,5, -0x0701fc,1, -0x070210,12, -0x070244,7, -0x070290,12, -0x0702c4,1, -0x0702d0,4, -0x070300,69, -0x070418,2, -0x070424,1, -0x07042c,1, -0x070434,3, -0x070448,1, -0x070450,1, -0x071000,33, -0x071100,33, -0x071200,33, -0x071300,33, -0x071400,33, -0x071500,33, -0x071600,33, -0x071700,33, -0x071800,33, -0x071900,33, -0x071a00,33, -0x071b00,33, -0x072000,67, -0x072200,67, -0x072400,67, -0x072600,67, -0x072800,67, -0x072a00,67, -0x072c00,67, -0x073000,33, -0x073100,33, -0x073200,33, -0x073300,33, -0x073400,33, -0x073500,33, -0x073600,33, -0x073700,33, -0x073800,33, -0x073900,33, -0x073a00,33, -0x073b00,33, -0x074000,1536, -0x076000,12, -0x077000,384, -0x077800,256, -0x078000,17, -0x078080,17, -0x078100,17, -0x078180,17, -0x078210,5, -0x078240,1, -0x078250,1, -0x078260,1, -0x078270,1, -0x078284,2, -0x0782d4,59, -0x078400,2, -0x078420,1, -0x078a60,5, -0x078a84,16, -0x078b00,32, -0x078b84,6, -0x078c20,10, -0x078c50,2, -0x078c5c,7, -0x078c80,4, -0x078ca0,1, -0x078cc0,9, -0x078e60,1, -0x078e80,10, -0x078ec0,2, -0x078ecc,1, -0x078ee0,6, -0x078f00,7, -0x078f20,7, -0x078f44,2, -0x078f50,2, -0x078f60,3, -0x078f70,1, -0x078f78,2, -0x078fb4,6, -0x078fd0,1, -0x079000,1, -0x079008,1, -0x079010,1, -0x079018,1, -0x079020,1, -0x079028,1, -0x079030,1, -0x079038,1, -0x079040,1, -0x079048,1, -0x079050,1, -0x079058,1, -0x079060,1, -0x079068,1, -0x079070,1, -0x079078,1, -0x079080,1, -0x079088,1, -0x079090,1, -0x079098,1, -0x0790a0,1, -0x0790a8,1, -0x0790b0,1, -0x0790b8,1, -0x0790c0,1, -0x0790c8,1, -0x0790d0,1, -0x0790d8,1, -0x0790e0,1, -0x0790e8,1, -0x0790f0,1, -0x0790f8,1, -0x079100,1, -0x079108,1, -0x079110,1, -0x079118,1, -0x079120,1, -0x079128,1, -0x079130,1, -0x079138,1, -0x079140,1, -0x079148,1, -0x079150,1, -0x079158,1, -0x079160,1, -0x079168,1, -0x079170,1, -0x079178,1, -0x079180,1, -0x079188,1, -0x079190,1, -0x079198,1, -0x0791a0,1, -0x0791a8,1, -0x0791b0,1, -0x0791b8,1, -0x0791c0,1, -0x0791c8,1, -0x0791d0,1, -0x0791d8,1, -0x0791e0,1, -0x0791e8,1, -0x0791f0,1, -0x0791f8,1, -0x079200,1, -0x079208,1, -0x079210,1, -0x079218,1, -0x079220,1, -0x079228,1, -0x079230,1, -0x079238,1, -0x079240,1, -0x079248,1, -0x079250,1, -0x079258,1, -0x079260,1, -0x079268,1, -0x079270,1, -0x079278,1, -0x079280,1, -0x079288,1, -0x079290,1, -0x079298,1, -0x0792a0,1, -0x0792a8,1, -0x0792b0,1, -0x0792b8,1, -0x0792c0,1, -0x0792c8,1, -0x0792d0,1, -0x0792d8,1, -0x0792e0,1, -0x0792e8,1, -0x0792f0,1, -0x0792f8,1, -0x079300,1, -0x079308,1, -0x079310,1, -0x079318,1, -0x079320,1, -0x079328,1, -0x079330,1, -0x079338,1, -0x079340,1, -0x079348,1, -0x079350,1, -0x079358,1, -0x079360,1, -0x079368,1, -0x079370,1, -0x079378,1, -0x079380,1, -0x079388,1, -0x079390,1, -0x079398,1, -0x0793a0,1, -0x0793a8,1, -0x0793b0,1, -0x0793b8,1, -0x0793c0,1, -0x0793c8,1, -0x0793d0,1, -0x0793d8,1, -0x0793e0,1, -0x0793e8,1, -0x0793f0,1, -0x0793f8,1, -0x079400,1, -0x079408,1, -0x079410,1, -0x079418,1, -0x079420,1, -0x079428,1, -0x079430,1, -0x079438,1, -0x079440,1, -0x079448,1, -0x079450,1, -0x079458,1, -0x079460,1, -0x079468,1, -0x079470,1, -0x079478,1, -0x079480,1, -0x079488,1, -0x079490,1, -0x079498,1, -0x0794a0,1, -0x0794a8,1, -0x0794b0,1, -0x0794b8,1, -0x0794c0,1, -0x0794c8,1, -0x0794d0,1, -0x0794d8,1, -0x0794e0,1, -0x0794e8,1, -0x0794f0,1, -0x0794f8,1, -0x079500,1, -0x079508,1, -0x079510,1, -0x079518,1, -0x079520,1, -0x079528,1, -0x079530,1, -0x079538,1, -0x079540,1, -0x079548,1, -0x079550,1, -0x079558,1, -0x079560,1, -0x079568,1, -0x079570,1, -0x079578,1, -0x079580,1, -0x079588,1, -0x079590,1, -0x079598,1, -0x0795a0,1, -0x0795a8,1, -0x0795b0,1, -0x0795b8,1, -0x0795c0,1, -0x0795c8,1, -0x0795d0,1, -0x0795d8,1, -0x0795e0,1, -0x0795e8,1, -0x0795f0,1, -0x0795f8,1, -0x079600,1, -0x079608,1, -0x079610,1, -0x079618,1, -0x079620,1, -0x079628,1, -0x079630,1, -0x079638,1, -0x079640,1, -0x079648,1, -0x079650,1, -0x079658,1, -0x079660,1, -0x079668,1, -0x079670,1, -0x079678,1, -0x079680,1, -0x079688,1, -0x079690,1, -0x079698,1, -0x0796a0,1, -0x0796a8,1, -0x0796b0,1, -0x0796b8,1, -0x0796c0,1, -0x0796c8,1, -0x0796d0,1, -0x0796d8,1, -0x0796e0,1, -0x0796e8,1, -0x0796f0,1, -0x0796f8,1, -0x079700,1, -0x079708,1, -0x079710,1, -0x079718,1, -0x079720,1, -0x079728,1, -0x079730,1, -0x079738,1, -0x079740,1, -0x079748,1, -0x079750,1, -0x079758,1, -0x079760,1, -0x079768,1, -0x079770,1, -0x079778,1, -0x079780,1, -0x079788,1, -0x079790,1, -0x079798,1, -0x0797a0,1, -0x0797a8,1, -0x0797b0,1, -0x0797b8,1, -0x0797c0,1, -0x0797c8,1, -0x0797d0,1, -0x0797d8,1, -0x0797e0,1, -0x0797e8,1, -0x0797f0,1, -0x0797f8,1, -0x079800,1, -0x079808,1, -0x079810,1, -0x079818,1, -0x079820,1, -0x079828,1, -0x079830,1, -0x079838,1, -0x079840,1, -0x079848,1, -0x079850,1, -0x079858,1, -0x079860,1, -0x079868,1, -0x079870,1, -0x079878,1, -0x079880,1, -0x079888,1, -0x079890,1, -0x079898,1, -0x0798a0,1, -0x0798a8,1, -0x0798b0,1, -0x0798b8,1, -0x0798c0,1, -0x0798c8,1, -0x0798d0,1, -0x0798d8,1, -0x0798e0,1, -0x0798e8,1, -0x0798f0,1, -0x0798f8,1, -0x079900,1, -0x079908,1, -0x079910,1, -0x079918,1, -0x079920,1, -0x079928,1, -0x079930,1, -0x079938,1, -0x079940,1, -0x079948,1, -0x079950,1, -0x079958,1, -0x079960,1, -0x079968,1, -0x079970,1, -0x079978,1, -0x079980,1, -0x079988,1, -0x079990,1, -0x079998,1, -0x0799a0,1, -0x0799a8,1, -0x0799b0,1, -0x0799b8,1, -0x0799c0,1, -0x0799c8,1, -0x0799d0,1, -0x0799d8,1, -0x0799e0,1, -0x0799e8,1, -0x0799f0,1, -0x0799f8,1, -0x079a00,1, -0x079a08,1, -0x079a10,1, -0x079a18,1, -0x079a20,1, -0x079a28,1, -0x079a30,1, -0x079a38,1, -0x079a40,1, -0x079a48,1, -0x079a50,1, -0x079a58,1, -0x079a60,1, -0x079a68,1, -0x079a70,1, -0x079a78,1, -0x079a80,1, -0x079a88,1, -0x079a90,1, -0x079a98,1, -0x079aa0,1, -0x079aa8,1, -0x079ab0,1, -0x079ab8,1, -0x079ac0,1, -0x079ac8,1, -0x079ad0,1, -0x079ad8,1, -0x079ae0,1, -0x079ae8,1, -0x079af0,1, -0x079af8,1, -0x079b00,1, -0x079b08,1, -0x079b10,1, -0x079b18,1, -0x079b20,1, -0x079b28,1, -0x079b30,1, -0x079b38,1, -0x079b40,1, -0x079b48,1, -0x079b50,1, -0x079b58,1, -0x079b60,1, -0x079b68,1, -0x079b70,1, -0x079b78,1, -0x079b80,1, -0x079b88,1, -0x079b90,1, -0x079b98,1, -0x079ba0,1, -0x079ba8,1, -0x079bb0,1, -0x079bb8,1, -0x079bc0,1, -0x079bc8,1, -0x079bd0,1, -0x079bd8,1, -0x079be0,1, -0x079be8,1, -0x079bf0,1, -0x079bf8,1, -0x079c00,1, -0x079c08,1, -0x079c10,1, -0x079c18,1, -0x079c20,1, -0x079c28,1, -0x079c30,1, -0x079c38,1, -0x079c40,1, -0x079c48,1, -0x079c50,1, -0x079c58,1, -0x079c60,1, -0x079c68,1, -0x079c70,1, -0x079c78,1, -0x079c80,1, -0x079c88,1, -0x079c90,1, -0x079c98,1, -0x079ca0,1, -0x079ca8,1, -0x079cb0,1, -0x079cb8,1, -0x079cc0,1, -0x079cc8,1, -0x079cd0,1, -0x079cd8,1, -0x079ce0,1, -0x079ce8,1, -0x079cf0,1, -0x079cf8,1, -0x079d00,1, -0x079d08,1, -0x079d10,1, -0x079d18,1, -0x079d20,1, -0x079d28,1, -0x079d30,1, -0x079d38,1, -0x079d40,1, -0x079d48,1, -0x079d50,1, -0x079d58,1, -0x079d60,1, -0x079d68,1, -0x079d70,1, -0x079d78,1, -0x079d80,1, -0x079d88,1, -0x079d90,1, -0x079d98,1, -0x079da0,1, -0x079da8,1, -0x079db0,1, -0x079db8,1, -0x079dc0,1, -0x079dc8,1, -0x079dd0,1, -0x079dd8,1, -0x079de0,1, -0x079de8,1, -0x079df0,1, -0x079df8,1, -0x079e00,1, -0x079e08,1, -0x079e10,1, -0x079e18,1, -0x079e20,1, -0x079e28,1, -0x079e30,1, -0x079e38,1, -0x079e40,1, -0x079e48,1, -0x079e50,1, -0x079e58,1, -0x079e60,1, -0x079e68,1, -0x079e70,1, -0x079e78,1, -0x079e80,1, -0x079e88,1, -0x079e90,1, -0x079e98,1, -0x079ea0,1, -0x079ea8,1, -0x079eb0,1, -0x079eb8,1, -0x079ec0,1, -0x079ec8,1, -0x079ed0,1, -0x079ed8,1, -0x079ee0,1, -0x079ee8,1, -0x079ef0,1, -0x079ef8,1, -0x079f00,1, -0x079f08,1, -0x079f10,1, -0x079f18,1, -0x079f20,1, -0x079f28,1, -0x079f30,1, -0x079f38,1, -0x079f40,1, -0x079f48,1, -0x079f50,1, -0x079f58,1, -0x079f60,1, -0x079f68,1, -0x079f70,1, -0x079f78,1, -0x079f80,1, -0x079f88,1, -0x079f90,1, -0x079f98,1, -0x079fa0,1, -0x079fa8,1, -0x079fb0,1, -0x079fb8,1, -0x079fc0,1, -0x079fc8,1, -0x079fd0,1, -0x079fd8,1, -0x079fe0,1, -0x079fe8,1, -0x079ff0,1, -0x079ff8,1, -0x07bef8,2, -0x07bf04,1, -0x07bf14,22, -0x07bf80,2, -0x07bffc,1033, -0x07e000,1044, -0x07f100,8, -0x07f160,4, -0x07f200,3, -0x07f7f8,514, -0x080680,7, -0x081000,3, -0x081010,16, -0x081120,1, -0x081130,2, -0x081140,1, -0x081150,2, -0x081160,1, -0x081170,2, -0x081204,18, -0x081304,2, -0x08139c,25, -0x081404,23, -0x081468,6, -0x081504,2, -0x081604,14, -0x081640,2, -0x08164c,15, -0x08168c,15, -0x0816cc,15, -0x08170c,15, -0x08174c,15, -0x08178c,15, -0x0817cc,15, -0x08180c,13, -0x081904,5, -0x081a30,4, -0x081a60,18, -0x081ab0,3, -0x081ad0,4, -0x081c00,128, -0x081e04,12, -0x082000,8, -0x082024,1, -0x082030,1, -0x082044,20, -0x08209c,2, -0x0820ac,14, -0x082180,1, -0x0821c4,1, -0x0821e0,1, -0x0821e8,3, -0x0821f8,1, -0x082200,9, -0x08229c,3, -0x0822e0,7, -0x082328,2, -0x082430,20, -0x082484,3, -0x082498,2, -0x082500,16, -0x082548,2, -0x082558,2, -0x082564,2, -0x082590,11, -0x0825c4,7, -0x0827fc,14, -0x082838,66, -0x082c00,13, -0x082c38,66, -0x083000,13, -0x083038,66, -0x083800,2, -0x083814,2, -0x083828,3, -0x083840,1, -0x083850,2, -0x083860,1, -0x083870,2, -0x0838e4,5, -0x083910,5, -0x083948,6, -0x0f0000,3, -0x0f0014,4, -0x0f0040,6, -0x0f0078,3, -0x0f0090,2, -0x0f00a4,2, -0x0f00b0,4, -0x0f00f0,24, -0x0f0180,17, -0x0f01e0,4, -0x0f01f4,1, -0x0f0200,4, -0x0f0240,9, -0x0f0270,2, -0x0f0280,3, -0x0f02a4,5, -0x0f02c0,11, -0x0f0400,2, -0x0f0410,10, -0x0f0510,20, -0x0f3000,1, -0x0f300c,3, -0x0f301c,21, -0x0f3078,14, -0x0f30c0,13, -0x0f30fc,2, -0x0f310c,1, -0x0f3120,2, -0x0f3130,5, -0x0f3184,13, -0x0f31bc,2, -0x0f3204,1, -0x0f3210,5, -0x0f3240,1, -0x0f3248,3, -0x0f3260,6, -0x0f3280,8, -0x0f32d4,1, -0x0f3400,12, -0x0f3434,3, -0x0f3444,15, -0x0f3500,1, -0x0f3520,6, -0x0f3540,15, -0x0f3580,9, -0x0f35b0,2, -0x0f35c0,2, -0x0f35dc,6, -0x0f360c,6, -0x0f362c,5, -0x0f3700,15, -0x0f3740,4, -0x0f3760,1, -0x0f3770,2, -0x0f3780,1, -0x0f3790,2, -0x0f3800,3, -0x0f3810,25, -0x0f389c,5, -0x0f38f8,2, -0x0f3a00,3, -0x0f3a10,4, -0x0f3a24,3, -0x0f3a34,4, -0x0f3a84,3, -0x0f3b00,1, -0x0f3b08,2, -0x0f3b20,1, -0x0f3b28,23, -0x0f3b88,2, -0x0f3ba0,1, -0x0f3ba8,27, -0x0f3c18,3, -0x0f3c30,4, -0x0f3d00,1, -0x0f3d14,1, -0x0f3d28,2, -0x0f3d40,1, -0x0f3d50,2, -0x0f3de4,4, -0x0f3e00,73, diff --git a/mstdump/mstdump_dbs/InfiniScaleIV.csv b/mstdump/mstdump_dbs/InfiniScaleIV.csv deleted file mode 100755 index 61b145d..0000000 --- a/mstdump/mstdump_dbs/InfiniScaleIV.csv +++ /dev/null @@ -1,14584 +0,0 @@ -# addr, size, enable addr -0x0f3c0c,1,UNKNOWN -0x0f3c08,1,UNKNOWN -0x0f3c04,1,UNKNOWN -0x0f3c00,1,UNKNOWN -0x0f3bf8,1,UNKNOWN -0x0f3bf4,1,UNKNOWN -0x0f3bf0,1,UNKNOWN -0x0f3b54,1,UNKNOWN -0x0f3b50,1,UNKNOWN -0x0f3b40,1,UNKNOWN -0x0f3b28,1,UNKNOWN -0x0f3b1c,1,UNKNOWN -0x0f3b18,1,UNKNOWN -0x0f3b0c,1,UNKNOWN -0x0f3b00,1,UNKNOWN -0x0f3a8c,1,UNKNOWN -0x0f3a88,1,UNKNOWN -0x0f3a84,1,UNKNOWN -0x0f3a74,1,UNKNOWN -0x0f3a70,1,UNKNOWN -0x0f3a60,1,UNKNOWN -0x0f3a40,1,UNKNOWN -0x0f3a3c,1,UNKNOWN -0x0f3a38,1,UNKNOWN -0x0f3a34,1,UNKNOWN -0x0f3a2c,1,UNKNOWN -0x0f3a28,1,UNKNOWN -0x0f3a24,1,UNKNOWN -0x0f3a1c,1,UNKNOWN -0x0f3a18,1,UNKNOWN -0x0f3a14,1,UNKNOWN -0x0f3a10,1,UNKNOWN -0x0f3a08,1,UNKNOWN -0x0f3a04,1,UNKNOWN -0x0f3a00,1,UNKNOWN -0x0f39bc,1,UNKNOWN -0x0f39b8,1,UNKNOWN -0x0f39b4,1,UNKNOWN -0x0f39b0,1,UNKNOWN -0x0f39a0,1,UNKNOWN -0x0f399c,1,UNKNOWN -0x0f3998,1,UNKNOWN -0x0f3990,1,UNKNOWN -0x0f398c,1,UNKNOWN -0x0f3988,1,UNKNOWN -0x0f3984,1,UNKNOWN -0x0f3980,1,UNKNOWN -0x0f397c,1,UNKNOWN -0x0f3978,1,UNKNOWN -0x0f3974,1,UNKNOWN -0x0f3970,1,UNKNOWN -0x0f396c,1,UNKNOWN -0x0f3968,1,UNKNOWN -0x0f3964,1,UNKNOWN -0x0f3960,1,UNKNOWN -0x0f395c,1,UNKNOWN -0x0f3958,1,UNKNOWN -0x0f3954,1,UNKNOWN -0x0f3950,1,UNKNOWN -0x0f394c,1,UNKNOWN -0x0f3948,1,UNKNOWN -0x0f3944,1,UNKNOWN -0x0f3940,1,UNKNOWN -0x0f393c,1,UNKNOWN -0x0f3938,1,UNKNOWN -0x0f3934,1,UNKNOWN -0x0f3930,1,UNKNOWN -0x0f392c,1,UNKNOWN -0x0f3928,1,UNKNOWN -0x0f3920,1,UNKNOWN -0x0f390c,1,UNKNOWN -0x0f3908,1,UNKNOWN -0x0f3900,1,UNKNOWN -0x0f38fc,1,UNKNOWN -0x0f38f8,1,UNKNOWN -0x0f38c0,1,UNKNOWN -0x0f38b4,1,UNKNOWN -0x0f38b0,1,UNKNOWN -0x0f38a0,1,UNKNOWN -0x0f389c,1,UNKNOWN -0x0f3898,1,UNKNOWN -0x0f3894,1,UNKNOWN -0x0f3890,1,UNKNOWN -0x0f388c,1,UNKNOWN -0x0f3888,1,UNKNOWN -0x0f3884,1,UNKNOWN -0x0f3880,1,UNKNOWN -0x0f386c,1,UNKNOWN -0x0f3868,1,UNKNOWN -0x0f3864,1,UNKNOWN -0x0f3860,1,UNKNOWN -0x0f385c,1,UNKNOWN -0x0f3858,1,UNKNOWN -0x0f3854,1,UNKNOWN -0x0f3850,1,UNKNOWN -0x0f384c,1,UNKNOWN -0x0f3848,1,UNKNOWN -0x0f3844,1,UNKNOWN -0x0f3840,1,UNKNOWN -0x0f383c,1,UNKNOWN -0x0f3838,1,UNKNOWN -0x0f3834,1,UNKNOWN -0x0f3830,1,UNKNOWN -0x0f382c,1,UNKNOWN -0x0f3828,1,UNKNOWN -0x0f3824,1,UNKNOWN -0x0f3820,1,UNKNOWN -0x0f381c,1,UNKNOWN -0x0f3814,1,UNKNOWN -0x0f3810,1,UNKNOWN -0x0f3808,1,UNKNOWN -0x0f3804,1,UNKNOWN -0x0f3800,1,UNKNOWN -0x0f37bc,1,UNKNOWN -0x0f37b8,1,UNKNOWN -0x0f37b4,1,UNKNOWN -0x0f37b0,1,UNKNOWN -0x0f37ac,1,UNKNOWN -0x0f3794,1,UNKNOWN -0x0f3790,1,UNKNOWN -0x0f3780,1,UNKNOWN -0x0f3774,1,UNKNOWN -0x0f3770,1,UNKNOWN -0x0f3760,1,UNKNOWN -0x0f3738,1,UNKNOWN -0x0f3734,1,UNKNOWN -0x0f3730,1,UNKNOWN -0x0f372c,1,UNKNOWN -0x0f3728,1,UNKNOWN -0x0f3724,1,UNKNOWN -0x0f3720,1,UNKNOWN -0x0f371c,1,UNKNOWN -0x0f3718,1,UNKNOWN -0x0f3714,1,UNKNOWN -0x0f3710,1,UNKNOWN -0x0f370c,1,UNKNOWN -0x0f3704,1,UNKNOWN -0x0f35e8,1,UNKNOWN -0x0f35e4,1,UNKNOWN -0x0f35e0,1,UNKNOWN -0x0f35dc,1,UNKNOWN -0x0f35d8,1,UNKNOWN -0x0f35d4,1,UNKNOWN -0x0f35d0,1,UNKNOWN -0x0f35cc,1,UNKNOWN -0x0f35b4,1,UNKNOWN -0x0f35b0,1,UNKNOWN -0x0f35a0,1,UNKNOWN -0x0f359c,1,UNKNOWN -0x0f3598,1,UNKNOWN -0x0f3594,1,UNKNOWN -0x0f3590,1,UNKNOWN -0x0f358c,1,UNKNOWN -0x0f3588,1,UNKNOWN -0x0f3584,1,UNKNOWN -0x0f3580,1,UNKNOWN -0x0f3578,1,UNKNOWN -0x0f3574,1,UNKNOWN -0x0f3560,1,UNKNOWN -0x0f355c,1,UNKNOWN -0x0f3558,1,UNKNOWN -0x0f3554,1,UNKNOWN -0x0f354c,1,UNKNOWN -0x0f3548,1,UNKNOWN -0x0f3534,1,UNKNOWN -0x0f3530,1,UNKNOWN -0x0f352c,1,UNKNOWN -0x0f3528,1,UNKNOWN -0x0f3524,1,UNKNOWN -0x0f3520,1,UNKNOWN -0x0f351c,1,UNKNOWN -0x0f3518,1,UNKNOWN -0x0f3514,1,UNKNOWN -0x0f3510,1,UNKNOWN -0x0f350c,1,UNKNOWN -0x0f3504,1,UNKNOWN -0x0f3500,1,UNKNOWN -0x0f347c,1,UNKNOWN -0x0f3478,1,UNKNOWN -0x0f3474,1,UNKNOWN -0x0f3470,1,UNKNOWN -0x0f346c,1,UNKNOWN -0x0f3468,1,UNKNOWN -0x0f3464,1,UNKNOWN -0x0f3460,1,UNKNOWN -0x0f345c,1,UNKNOWN -0x0f3458,1,UNKNOWN -0x0f3454,1,UNKNOWN -0x0f3450,1,UNKNOWN -0x0f344c,1,UNKNOWN -0x0f3448,1,UNKNOWN -0x0f3444,1,UNKNOWN -0x0f3440,1,UNKNOWN -0x0f343c,1,UNKNOWN -0x0f3438,1,UNKNOWN -0x0f3434,1,UNKNOWN -0x0f3430,1,UNKNOWN -0x0f342c,1,UNKNOWN -0x0f3428,1,UNKNOWN -0x0f3424,1,UNKNOWN -0x0f3420,1,UNKNOWN -0x0f341c,1,UNKNOWN -0x0f3418,1,UNKNOWN -0x0f3414,1,UNKNOWN -0x0f3410,1,UNKNOWN -0x0f340c,1,UNKNOWN -0x0f3408,1,UNKNOWN -0x0f3404,1,UNKNOWN -0x0f3400,1,UNKNOWN -0x0f3330,1,UNKNOWN -0x0f3328,1,UNKNOWN -0x0f3324,1,UNKNOWN -0x0f3320,1,UNKNOWN -0x0f331c,1,UNKNOWN -0x0f3318,1,UNKNOWN -0x0f3314,1,UNKNOWN -0x0f3310,1,UNKNOWN -0x0f330c,1,UNKNOWN -0x0f3308,1,UNKNOWN -0x0f3304,1,UNKNOWN -0x0f3300,1,UNKNOWN -0x0f32ec,1,UNKNOWN -0x0f32ac,1,UNKNOWN -0x0f32a8,1,UNKNOWN -0x0f32a4,1,UNKNOWN -0x0f32a0,1,UNKNOWN -0x0f329c,1,UNKNOWN -0x0f3298,1,UNKNOWN -0x0f3294,1,UNKNOWN -0x0f3290,1,UNKNOWN -0x0f3284,1,UNKNOWN -0x0f3280,1,UNKNOWN -0x0f3274,1,UNKNOWN -0x0f3270,1,UNKNOWN -0x0f326c,1,UNKNOWN -0x0f3268,1,UNKNOWN -0x0f3264,1,UNKNOWN -0x0f3258,1,UNKNOWN -0x0f3254,1,UNKNOWN -0x0f3250,1,UNKNOWN -0x0f324c,1,UNKNOWN -0x0f3248,1,UNKNOWN -0x0f3244,1,UNKNOWN -0x0f3220,1,UNKNOWN -0x0f321c,1,UNKNOWN -0x0f3218,1,UNKNOWN -0x0f3214,1,UNKNOWN -0x0f3210,1,UNKNOWN -0x0f3204,1,UNKNOWN -0x0f31bc,1,UNKNOWN -0x0f31b4,1,UNKNOWN -0x0f31b0,1,UNKNOWN -0x0f31ac,1,UNKNOWN -0x0f31a8,1,UNKNOWN -0x0f31a4,1,UNKNOWN -0x0f31a0,1,UNKNOWN -0x0f319c,1,UNKNOWN -0x0f3198,1,UNKNOWN -0x0f3194,1,UNKNOWN -0x0f3190,1,UNKNOWN -0x0f318c,1,UNKNOWN -0x0f3188,1,UNKNOWN -0x0f3184,1,UNKNOWN -0x0f3140,1,UNKNOWN -0x0f313c,1,UNKNOWN -0x0f3138,1,UNKNOWN -0x0f3134,1,UNKNOWN -0x0f3130,1,UNKNOWN -0x0f3124,1,UNKNOWN -0x0f3120,1,UNKNOWN -0x0f310c,1,UNKNOWN -0x0f3100,1,UNKNOWN -0x0f30f0,1,UNKNOWN -0x0f30ec,1,UNKNOWN -0x0f30e8,1,UNKNOWN -0x0f30e4,1,UNKNOWN -0x0f30e0,1,UNKNOWN -0x0f30dc,1,UNKNOWN -0x0f30d8,1,UNKNOWN -0x0f30d4,1,UNKNOWN -0x0f30d0,1,UNKNOWN -0x0f30cc,1,UNKNOWN -0x0f30c8,1,UNKNOWN -0x0f30c4,1,UNKNOWN -0x0f30c0,1,UNKNOWN -0x0f30ac,1,UNKNOWN -0x0f30a8,1,UNKNOWN -0x0f30a4,1,UNKNOWN -0x0f30a0,1,UNKNOWN -0x0f309c,1,UNKNOWN -0x0f3098,1,UNKNOWN -0x0f3094,1,UNKNOWN -0x0f3090,1,UNKNOWN -0x0f308c,1,UNKNOWN -0x0f3088,1,UNKNOWN -0x0f3084,1,UNKNOWN -0x0f3080,1,UNKNOWN -0x0f307c,1,UNKNOWN -0x0f3078,1,UNKNOWN -0x0f3070,1,UNKNOWN -0x0f306c,1,UNKNOWN -0x0f3068,1,UNKNOWN -0x0f3064,1,UNKNOWN -0x0f3060,1,UNKNOWN -0x0f305c,1,UNKNOWN -0x0f3058,1,UNKNOWN -0x0f3050,1,UNKNOWN -0x0f304c,1,UNKNOWN -0x0f3048,1,UNKNOWN -0x0f3044,1,UNKNOWN -0x0f3040,1,UNKNOWN -0x0f3030,1,UNKNOWN -0x0f302c,1,UNKNOWN -0x0f3028,1,UNKNOWN -0x0f3024,1,UNKNOWN -0x0f3020,1,UNKNOWN -0x0f301c,1,UNKNOWN -0x0f3014,1,UNKNOWN -0x0f3010,1,UNKNOWN -0x0f300c,1,UNKNOWN -0x0f3008,1,UNKNOWN -0x0f3004,1,UNKNOWN -0x0f3000,1,UNKNOWN -0x0f04d4,1, -0x0f04d0,1, -0x0f04cc,1, -0x0f04c8,1, -0x0f04c4,1, -0x0f04c0,1, -0x0f04bc,1, -0x0f04b8,1, -0x0f04b4,1, -0x0f04b0,1, -0x0f04ac,1, -0x0f04a8,1, -0x0f04a4,1, -0x0f04a0,1, -0x0f049c,1, -0x0f0498,1, -0x0f0494,1, -0x0f0490,1, -0x0f048c,1, -0x0f0488,1, -0x0f0484,1, -0x0f0480,1, -0x0f0434,1, -0x0f0430,1, -0x0f042c,1, -0x0f0428,1, -0x0f0424,1, -0x0f0420,1, -0x0f041c,1, -0x0f0418,1, -0x0f0414,1, -0x0f0410,1, -0x0f0408,1, -0x0f0404,1, -0x0f02fc,1, -0x0f02f8,1, -0x0f02f4,1, -0x0f02f0,1, -0x0f02ec,1, -0x0f02e8,1, -0x0f02e4,1, -0x0f02e0,1, -0x0f02cc,1, -0x0f02c8,1, -0x0f02c4,1, -0x0f02c0,1, -0x0f02b4,1, -0x0f02b0,1, -0x0f02ac,1, -0x0f02a8,1, -0x0f02a4,1, -0x0f0298,1, -0x0f0294,1, -0x0f0290,1, -0x0f0258,1, -0x0f0254,1, -0x0f0250,1, -0x0f024c,1, -0x0f0248,1, -0x0f0244,1, -0x0f0240,1, -0x0f023c,1, -0x0f0238,1, -0x0f0234,1, -0x0f0230,1, -0x0f022c,1, -0x0f0228,1, -0x0f0224,1, -0x0f0220,1, -0x0f021c,1, -0x0f0218,1, -0x0f0214,1, -0x0f0210,1, -0x0f020c,1, -0x0f0208,1, -0x0f0204,1, -0x0f0200,1, -0x0f01c0,1, -0x0f01bc,1, -0x0f01b8,1, -0x0f01b4,1, -0x0f01b0,1, -0x0f01ac,1, -0x0f01a8,1, -0x0f01a4,1, -0x0f01a0,1, -0x0f019c,1, -0x0f0198,1, -0x0f0194,1, -0x0f0190,1, -0x0f018c,1, -0x0f0188,1, -0x0f0184,1, -0x0f0180,1, -0x0f0170,1, -0x0f016c,1, -0x0f0168,1, -0x0f0164,1, -0x0f0160,1, -0x0f0154,1, -0x0f0150,1, -0x0f0140,1, -0x0f013c,1, -0x0f0138,1, -0x0f0134,1, -0x0f0130,1, -0x0f012c,1, -0x0f0128,1, -0x0f0110,1, -0x0f010c,1, -0x0f0108,1, -0x0f0104,1, -0x0f0100,1, -0x0f00fc,1, -0x0f00f8,1, -0x0f00f4,1, -0x0f00f0,1, -0x0f00ec,1, -0x0f00e8,1, -0x0f00e4,1, -0x0f00e0,1, -0x0f00dc,1, -0x0f00d8,1, -0x0f00d4,1, -0x0f00d0,1, -0x0f00cc,1, -0x0f00c8,1, -0x0f00c4,1, -0x0f00c0,1, -0x0f00b4,1, -0x0f00b0,1, -0x0f00a0,1, -0x0f0094,1, -0x0f0090,1, -0x0f008c,1, -0x0f0084,1, -0x0f0080,1, -0x0f0074,1, -0x0f0070,1, -0x0f0060,1, -0x0f0054,1, -0x0f0050,1, -0x0f004c,1, -0x0f0044,1, -0x0f0040,1, -0x0f0038,1, -0x0f0034,1, -0x0f0030,1, -0x0f001c,1, -0x0f0014,1, -0x0f0008,1, -0x0f0004,1, -0x0f0000,1, -0x0d7844,1, -0x0d7840,1, -0x0d783c,1, -0x0d7838,1, -0x0d7834,1, -0x0d7830,1, -0x0d782c,1, -0x0d7828,1, -0x0d7824,1, -0x0d7820,1, -0x0d7814,1, -0x0d7810,1, -0x0d7800,1, -0x0d7624,1, -0x0d7620,1, -0x0d7554,1, -0x0d7550,1, -0x0d7540,1, -0x0d752c,1, -0x0d7528,1, -0x0d7524,1, -0x0d7520,1, -0x0d751c,1, -0x0d7518,1, -0x0d7514,1, -0x0d7510,1, -0x0d750c,1, -0x0d7508,1, -0x0d7504,1, -0x0d7500,1, -0x0d74fc,1, -0x0d74f8,1, -0x0d74f4,1, -0x0d74f0,1, -0x0d74c8,1, -0x0d74c4,1, -0x0d74c0,1, -0x0d74b8,1, -0x0d74b4,1, -0x0d74b0,1, -0x0d74ac,1, -0x0d74a8,1, -0x0d749c,1, -0x0d7498,1, -0x0d7494,1, -0x0d7490,1, -0x0d748c,1, -0x0d7488,1, -0x0d7484,1, -0x0d7480,1, -0x0d7474,1, -0x0d7470,1, -0x0d746c,1, -0x0d7468,1, -0x0d7464,1, -0x0d7460,1, -0x0d745c,1, -0x0d7458,1, -0x0d7454,1, -0x0d7450,1, -0x0d7440,1, -0x0d7430,1, -0x0d7428,1, -0x0d7424,1, -0x0d7420,1, -0x0d741c,1, -0x0d7418,1, -0x0d7414,1, -0x0d7410,1, -0x0d740c,1, -0x0d7408,1, -0x0d7404,1, -0x0d7400,1, -0x0d7354,1, -0x0d7350,1, -0x0d7340,1, -0x0d732c,1, -0x0d7328,1, -0x0d7324,1, -0x0d7320,1, -0x0d731c,1, -0x0d7318,1, -0x0d7314,1, -0x0d7310,1, -0x0d730c,1, -0x0d7308,1, -0x0d7304,1, -0x0d7300,1, -0x0d72fc,1, -0x0d72f8,1, -0x0d72f4,1, -0x0d72f0,1, -0x0d72c8,1, -0x0d72c4,1, -0x0d72c0,1, -0x0d72b8,1, -0x0d72b4,1, -0x0d72b0,1, -0x0d72ac,1, -0x0d72a8,1, -0x0d729c,1, -0x0d7298,1, -0x0d7294,1, -0x0d7290,1, -0x0d728c,1, -0x0d7288,1, -0x0d7284,1, -0x0d7280,1, -0x0d7274,1, -0x0d7270,1, -0x0d726c,1, -0x0d7268,1, -0x0d7264,1, -0x0d7260,1, -0x0d725c,1, -0x0d7258,1, -0x0d7254,1, -0x0d7250,1, -0x0d7240,1, -0x0d7230,1, -0x0d7228,1, -0x0d7224,1, -0x0d7220,1, -0x0d721c,1, -0x0d7218,1, -0x0d7214,1, -0x0d7210,1, -0x0d720c,1, -0x0d7208,1, -0x0d7204,1, -0x0d7200,1, -0x0d7154,1, -0x0d7150,1, -0x0d7140,1, -0x0d712c,1, -0x0d7128,1, -0x0d7124,1, -0x0d7120,1, -0x0d711c,1, -0x0d7118,1, -0x0d7114,1, -0x0d7110,1, -0x0d710c,1, -0x0d7108,1, -0x0d7104,1, -0x0d7100,1, -0x0d70fc,1, -0x0d70f8,1, -0x0d70f4,1, -0x0d70f0,1, -0x0d70c8,1, -0x0d70c4,1, -0x0d70c0,1, -0x0d70b8,1, -0x0d70b4,1, -0x0d70b0,1, -0x0d70ac,1, -0x0d70a8,1, -0x0d709c,1, -0x0d7098,1, -0x0d7094,1, -0x0d7090,1, -0x0d708c,1, -0x0d7088,1, -0x0d7084,1, -0x0d7080,1, -0x0d7074,1, -0x0d7070,1, -0x0d706c,1, -0x0d7068,1, -0x0d7064,1, -0x0d7060,1, -0x0d705c,1, -0x0d7058,1, -0x0d7054,1, -0x0d7050,1, -0x0d7040,1, -0x0d7030,1, -0x0d7028,1, -0x0d7024,1, -0x0d7020,1, -0x0d701c,1, -0x0d7018,1, -0x0d7014,1, -0x0d7010,1, -0x0d700c,1, -0x0d7008,1, -0x0d7004,1, -0x0d7000,1, -0x0d6e24,1, -0x0d6e20,1, -0x0d6d54,1, -0x0d6d50,1, -0x0d6d40,1, -0x0d6d2c,1, -0x0d6d28,1, -0x0d6d24,1, -0x0d6d20,1, -0x0d6d1c,1, -0x0d6d18,1, -0x0d6d14,1, -0x0d6d10,1, -0x0d6d0c,1, -0x0d6d08,1, -0x0d6d04,1, -0x0d6d00,1, -0x0d6cfc,1, -0x0d6cf8,1, -0x0d6cf4,1, -0x0d6cf0,1, -0x0d6cc8,1, -0x0d6cc4,1, -0x0d6cc0,1, -0x0d6cb8,1, -0x0d6cb4,1, -0x0d6cb0,1, -0x0d6cac,1, -0x0d6ca8,1, -0x0d6c9c,1, -0x0d6c98,1, -0x0d6c94,1, -0x0d6c90,1, -0x0d6c8c,1, -0x0d6c88,1, -0x0d6c84,1, -0x0d6c80,1, -0x0d6c74,1, -0x0d6c70,1, -0x0d6c6c,1, -0x0d6c68,1, -0x0d6c64,1, -0x0d6c60,1, -0x0d6c5c,1, -0x0d6c58,1, -0x0d6c54,1, -0x0d6c50,1, -0x0d6c40,1, -0x0d6c30,1, -0x0d6c28,1, -0x0d6c24,1, -0x0d6c20,1, -0x0d6c1c,1, -0x0d6c18,1, -0x0d6c14,1, -0x0d6c10,1, -0x0d6c0c,1, -0x0d6c08,1, -0x0d6c04,1, -0x0d6c00,1, -0x0d6b54,1, -0x0d6b50,1,UNKNOWN -0x0d6b40,1, -0x0d6b2c,1, -0x0d6b28,1, -0x0d6b24,1, -0x0d6b20,1, -0x0d6b1c,1, -0x0d6b18,1, -0x0d6b14,1, -0x0d6b10,1, -0x0d6b0c,1, -0x0d6b08,1, -0x0d6b04,1, -0x0d6b00,1, -0x0d6afc,1, -0x0d6af8,1, -0x0d6af4,1, -0x0d6af0,1, -0x0d6ac8,1, -0x0d6ac4,1, -0x0d6ac0,1, -0x0d6ab8,1, -0x0d6ab4,1, -0x0d6ab0,1, -0x0d6aac,1, -0x0d6aa8,1, -0x0d6a9c,1, -0x0d6a98,1, -0x0d6a94,1, -0x0d6a90,1, -0x0d6a8c,1, -0x0d6a88,1, -0x0d6a84,1, -0x0d6a80,1, -0x0d6a74,1, -0x0d6a70,1, -0x0d6a6c,1, -0x0d6a68,1, -0x0d6a64,1, -0x0d6a60,1, -0x0d6a5c,1, -0x0d6a58,1, -0x0d6a54,1, -0x0d6a50,1, -0x0d6a40,1, -0x0d6a30,1, -0x0d6a28,1, -0x0d6a24,1, -0x0d6a20,1,UNKNOWN -0x0d6a1c,1, -0x0d6a18,1, -0x0d6a14,1, -0x0d6a10,1, -0x0d6a0c,1, -0x0d6a08,1, -0x0d6a04,1, -0x0d6a00,1, -0x0d6954,1, -0x0d6950,1, -0x0d6940,1, -0x0d692c,1, -0x0d6928,1, -0x0d6924,1, -0x0d6920,1, -0x0d691c,1, -0x0d6918,1, -0x0d6914,1, -0x0d6910,1, -0x0d690c,1, -0x0d6908,1, -0x0d6904,1, -0x0d6900,1, -0x0d68fc,1, -0x0d68f8,1, -0x0d68f4,1, -0x0d68f0,1, -0x0d68c8,1, -0x0d68c4,1, -0x0d68c0,1, -0x0d68b8,1, -0x0d68b4,1, -0x0d68b0,1, -0x0d68ac,1, -0x0d68a8,1, -0x0d689c,1, -0x0d6898,1, -0x0d6894,1, -0x0d6890,1, -0x0d688c,1, -0x0d6888,1, -0x0d6884,1, -0x0d6880,1, -0x0d6874,1, -0x0d6870,1, -0x0d686c,1, -0x0d6868,1, -0x0d6864,1, -0x0d6860,1, -0x0d685c,1, -0x0d6858,1, -0x0d6854,1, -0x0d6850,1, -0x0d6840,1, -0x0d6830,1, -0x0d6828,1, -0x0d6824,1, -0x0d6820,1, -0x0d681c,1, -0x0d6818,1, -0x0d6814,1, -0x0d6810,1, -0x0d680c,1, -0x0d6808,1, -0x0d6804,1, -0x0d6800,1, -0x0d6624,1, -0x0d6620,1, -0x0d6554,1, -0x0d6550,1, -0x0d6540,1, -0x0d652c,1, -0x0d6528,1, -0x0d6524,1, -0x0d6520,1, -0x0d651c,1, -0x0d6518,1, -0x0d6514,1, -0x0d6510,1, -0x0d650c,1, -0x0d6508,1, -0x0d6504,1, -0x0d6500,1, -0x0d64fc,1, -0x0d64f8,1, -0x0d64f4,1, -0x0d64f0,1, -0x0d64c8,1, -0x0d64c4,1, -0x0d64c0,1, -0x0d64b8,1, -0x0d64b4,1, -0x0d64b0,1, -0x0d64ac,1, -0x0d64a8,1, -0x0d649c,1, -0x0d6498,1, -0x0d6494,1, -0x0d6490,1, -0x0d648c,1, -0x0d6488,1, -0x0d6484,1, -0x0d6480,1, -0x0d6474,1, -0x0d6470,1, -0x0d646c,1, -0x0d6468,1, -0x0d6464,1, -0x0d6460,1, -0x0d645c,1, -0x0d6458,1, -0x0d6454,1, -0x0d6450,1, -0x0d6440,1, -0x0d6430,1, -0x0d6428,1, -0x0d6424,1, -0x0d6420,1, -0x0d641c,1, -0x0d6418,1, -0x0d6414,1, -0x0d6410,1, -0x0d640c,1, -0x0d6408,1, -0x0d6404,1, -0x0d6400,1, -0x0d6354,1, -0x0d6350,1, -0x0d6340,1, -0x0d632c,1, -0x0d6328,1, -0x0d6324,1, -0x0d6320,1, -0x0d631c,1, -0x0d6318,1, -0x0d6314,1, -0x0d6310,1, -0x0d630c,1, -0x0d6308,1, -0x0d6304,1, -0x0d6300,1, -0x0d62fc,1, -0x0d62f8,1, -0x0d62f4,1, -0x0d62f0,1, -0x0d62c8,1, -0x0d62c4,1, -0x0d62c0,1, -0x0d62b8,1, -0x0d62b4,1, -0x0d62b0,1, -0x0d62ac,1, -0x0d62a8,1, -0x0d629c,1, -0x0d6298,1, -0x0d6294,1, -0x0d6290,1, -0x0d628c,1, -0x0d6288,1, -0x0d6284,1, -0x0d6280,1, -0x0d6274,1, -0x0d6270,1, -0x0d626c,1, -0x0d6268,1, -0x0d6264,1, -0x0d6260,1, -0x0d625c,1, -0x0d6258,1, -0x0d6254,1, -0x0d6250,1, -0x0d6240,1, -0x0d6230,1, -0x0d6228,1, -0x0d6224,1, -0x0d6220,1, -0x0d621c,1, -0x0d6218,1, -0x0d6214,1, -0x0d6210,1, -0x0d620c,1, -0x0d6208,1, -0x0d6204,1, -0x0d6200,1, -0x0d6154,1, -0x0d6150,1, -0x0d6140,1, -0x0d612c,1, -0x0d6128,1, -0x0d6124,1, -0x0d6120,1, -0x0d611c,1, -0x0d6118,1, -0x0d6114,1, -0x0d6110,1, -0x0d610c,1, -0x0d6108,1, -0x0d6104,1, -0x0d6100,1, -0x0d60fc,1, -0x0d60f8,1, -0x0d60f4,1, -0x0d60f0,1, -0x0d60c8,1, -0x0d60c4,1, -0x0d60c0,1, -0x0d60b8,1, -0x0d60b4,1, -0x0d60b0,1, -0x0d60ac,1, -0x0d60a8,1, -0x0d609c,1, -0x0d6098,1, -0x0d6094,1, -0x0d6090,1, -0x0d608c,1, -0x0d6088,1, -0x0d6084,1, -0x0d6080,1, -0x0d6074,1, -0x0d6070,1, -0x0d606c,1, -0x0d6068,1, -0x0d6064,1, -0x0d6060,1, -0x0d605c,1, -0x0d6058,1, -0x0d6054,1, -0x0d6050,1, -0x0d6040,1, -0x0d6030,1, -0x0d6028,1, -0x0d6024,1, -0x0d6020,1, -0x0d601c,1, -0x0d6018,1, -0x0d6014,1, -0x0d6010,1, -0x0d600c,1, -0x0d6008,1, -0x0d6004,1, -0x0d6000,1, -0x0d5e24,1, -0x0d5e20,1, -0x0d5d54,1, -0x0d5d50,1, -0x0d5d40,1, -0x0d5d2c,1, -0x0d5d28,1, -0x0d5d24,1, -0x0d5d20,1, -0x0d5d1c,1, -0x0d5d18,1, -0x0d5d14,1, -0x0d5d10,1, -0x0d5d0c,1, -0x0d5d08,1, -0x0d5d04,1, -0x0d5d00,1, -0x0d5cfc,1, -0x0d5cf8,1, -0x0d5cf4,1, -0x0d5cf0,1, -0x0d5cc8,1, -0x0d5cc4,1, -0x0d5cc0,1, -0x0d5cb8,1, -0x0d5cb4,1, -0x0d5cb0,1, -0x0d5cac,1, -0x0d5ca8,1, -0x0d5c9c,1, -0x0d5c98,1, -0x0d5c94,1, -0x0d5c90,1, -0x0d5c8c,1, -0x0d5c88,1, -0x0d5c84,1, -0x0d5c80,1, -0x0d5c74,1, -0x0d5c70,1, -0x0d5c6c,1, -0x0d5c68,1, -0x0d5c64,1, -0x0d5c60,1, -0x0d5c5c,1, -0x0d5c58,1, -0x0d5c54,1, -0x0d5c50,1, -0x0d5c40,1, -0x0d5c30,1, -0x0d5c28,1, -0x0d5c24,1, -0x0d5c20,1, -0x0d5c1c,1, -0x0d5c18,1, -0x0d5c14,1, -0x0d5c10,1, -0x0d5c0c,1, -0x0d5c08,1, -0x0d5c04,1, -0x0d5c00,1, -0x0d5b54,1, -0x0d5b50,1, -0x0d5b40,1, -0x0d5b2c,1, -0x0d5b28,1, -0x0d5b24,1, -0x0d5b20,1, -0x0d5b1c,1, -0x0d5b18,1, -0x0d5b14,1, -0x0d5b10,1, -0x0d5b0c,1, -0x0d5b08,1, -0x0d5b04,1, -0x0d5b00,1, -0x0d5afc,1, -0x0d5af8,1, -0x0d5af4,1, -0x0d5af0,1, -0x0d5ac8,1, -0x0d5ac4,1, -0x0d5ac0,1, -0x0d5ab8,1, -0x0d5ab4,1, -0x0d5ab0,1, -0x0d5aac,1, -0x0d5aa8,1, -0x0d5a9c,1, -0x0d5a98,1, -0x0d5a94,1, -0x0d5a90,1, -0x0d5a8c,1, -0x0d5a88,1, -0x0d5a84,1, -0x0d5a80,1, -0x0d5a74,1, -0x0d5a70,1, -0x0d5a6c,1, -0x0d5a68,1, -0x0d5a64,1, -0x0d5a60,1, -0x0d5a5c,1, -0x0d5a58,1, -0x0d5a54,1, -0x0d5a50,1, -0x0d5a40,1, -0x0d5a30,1, -0x0d5a28,1, -0x0d5a24,1, -0x0d5a20,1, -0x0d5a1c,1, -0x0d5a18,1, -0x0d5a14,1, -0x0d5a10,1, -0x0d5a0c,1, -0x0d5a08,1, -0x0d5a04,1, -0x0d5a00,1, -0x0d5954,1, -0x0d5950,1, -0x0d5940,1, -0x0d592c,1, -0x0d5928,1, -0x0d5924,1, -0x0d5920,1, -0x0d591c,1, -0x0d5918,1, -0x0d5914,1, -0x0d5910,1, -0x0d590c,1, -0x0d5908,1, -0x0d5904,1, -0x0d5900,1, -0x0d58fc,1, -0x0d58f8,1, -0x0d58f4,1, -0x0d58f0,1, -0x0d58c8,1, -0x0d58c4,1, -0x0d58c0,1, -0x0d58b8,1, -0x0d58b4,1, -0x0d58b0,1, -0x0d58ac,1, -0x0d58a8,1, -0x0d589c,1, -0x0d5898,1, -0x0d5894,1, -0x0d5890,1, -0x0d588c,1, -0x0d5888,1, -0x0d5884,1, -0x0d5880,1, -0x0d5874,1, -0x0d5870,1, -0x0d586c,1, -0x0d5868,1, -0x0d5864,1, -0x0d5860,1, -0x0d585c,1, -0x0d5858,1, -0x0d5854,1, -0x0d5850,1, -0x0d5840,1, -0x0d5830,1, -0x0d5828,1, -0x0d5824,1, -0x0d5820,1, -0x0d581c,1, -0x0d5818,1, -0x0d5814,1, -0x0d5810,1, -0x0d580c,1, -0x0d5808,1, -0x0d5804,1, -0x0d5800,1, -0x0d5624,1, -0x0d5620,1, -0x0d5554,1, -0x0d5550,1, -0x0d5540,1, -0x0d552c,1, -0x0d5528,1, -0x0d5524,1, -0x0d5520,1, -0x0d551c,1, -0x0d5518,1, -0x0d5514,1, -0x0d5510,1, -0x0d550c,1, -0x0d5508,1, -0x0d5504,1, -0x0d5500,1, -0x0d54fc,1, -0x0d54f8,1, -0x0d54f4,1, -0x0d54f0,1, -0x0d54c8,1, -0x0d54c4,1, -0x0d54c0,1, -0x0d54b8,1, -0x0d54b4,1, -0x0d54b0,1, -0x0d54ac,1, -0x0d54a8,1, -0x0d549c,1, -0x0d5498,1, -0x0d5494,1, -0x0d5490,1, -0x0d548c,1, -0x0d5488,1, -0x0d5484,1, -0x0d5480,1, -0x0d5474,1, -0x0d5470,1, -0x0d546c,1, -0x0d5468,1, -0x0d5464,1, -0x0d5460,1, -0x0d545c,1, -0x0d5458,1, -0x0d5454,1, -0x0d5450,1, -0x0d5440,1, -0x0d5430,1, -0x0d5428,1, -0x0d5424,1, -0x0d5420,1, -0x0d541c,1, -0x0d5418,1, -0x0d5414,1, -0x0d5410,1, -0x0d540c,1, -0x0d5408,1, -0x0d5404,1, -0x0d5400,1, -0x0d5354,1, -0x0d5350,1, -0x0d5340,1, -0x0d532c,1, -0x0d5328,1, -0x0d5324,1, -0x0d5320,1, -0x0d531c,1, -0x0d5318,1, -0x0d5314,1, -0x0d5310,1, -0x0d530c,1, -0x0d5308,1, -0x0d5304,1, -0x0d5300,1, -0x0d52fc,1, -0x0d52f8,1, -0x0d52f4,1, -0x0d52f0,1, -0x0d52c8,1, -0x0d52c4,1, -0x0d52c0,1, -0x0d52b8,1, -0x0d52b4,1, -0x0d52b0,1, -0x0d52ac,1, -0x0d52a8,1, -0x0d529c,1, -0x0d5298,1, -0x0d5294,1, -0x0d5290,1, -0x0d528c,1, -0x0d5288,1, -0x0d5284,1, -0x0d5280,1, -0x0d5274,1, -0x0d5270,1, -0x0d526c,1, -0x0d5268,1, -0x0d5264,1, -0x0d5260,1, -0x0d525c,1, -0x0d5258,1, -0x0d5254,1, -0x0d5250,1, -0x0d5240,1, -0x0d5230,1, -0x0d5228,1, -0x0d5224,1, -0x0d5220,1, -0x0d521c,1, -0x0d5218,1, -0x0d5214,1, -0x0d5210,1, -0x0d520c,1, -0x0d5208,1, -0x0d5204,1, -0x0d5200,1, -0x0d5154,1, -0x0d5150,1, -0x0d5140,1, -0x0d512c,1, -0x0d5128,1, -0x0d5124,1, -0x0d5120,1, -0x0d511c,1, -0x0d5118,1, -0x0d5114,1, -0x0d5110,1, -0x0d510c,1, -0x0d5108,1, -0x0d5104,1, -0x0d5100,1, -0x0d50fc,1, -0x0d50f8,1, -0x0d50f4,1, -0x0d50f0,1, -0x0d50c8,1, -0x0d50c4,1, -0x0d50c0,1, -0x0d50b8,1, -0x0d50b4,1, -0x0d50b0,1, -0x0d50ac,1, -0x0d50a8,1, -0x0d509c,1, -0x0d5098,1, -0x0d5094,1, -0x0d5090,1, -0x0d508c,1, -0x0d5088,1, -0x0d5084,1, -0x0d5080,1, -0x0d5074,1, -0x0d5070,1, -0x0d506c,1, -0x0d5068,1, -0x0d5064,1, -0x0d5060,1, -0x0d505c,1, -0x0d5058,1, -0x0d5054,1, -0x0d5050,1, -0x0d5040,1, -0x0d5030,1, -0x0d5028,1, -0x0d5024,1, -0x0d5020,1, -0x0d501c,1, -0x0d5018,1, -0x0d5014,1, -0x0d5010,1, -0x0d500c,1, -0x0d5008,1, -0x0d5004,1, -0x0d5000,1, -0x0d4e24,1, -0x0d4e20,1, -0x0d4d54,1, -0x0d4d50,1, -0x0d4d40,1, -0x0d4d2c,1, -0x0d4d28,1, -0x0d4d24,1, -0x0d4d20,1, -0x0d4d1c,1, -0x0d4d18,1, -0x0d4d14,1, -0x0d4d10,1, -0x0d4d0c,1, -0x0d4d08,1, -0x0d4d04,1, -0x0d4d00,1, -0x0d4cfc,1, -0x0d4cf8,1, -0x0d4cf4,1, -0x0d4cf0,1, -0x0d4cc8,1, -0x0d4cc4,1, -0x0d4cc0,1, -0x0d4cb8,1, -0x0d4cb4,1, -0x0d4cb0,1, -0x0d4cac,1, -0x0d4ca8,1, -0x0d4c9c,1, -0x0d4c98,1, -0x0d4c94,1, -0x0d4c90,1, -0x0d4c8c,1, -0x0d4c88,1, -0x0d4c84,1, -0x0d4c80,1, -0x0d4c74,1, -0x0d4c70,1, -0x0d4c6c,1, -0x0d4c68,1, -0x0d4c64,1, -0x0d4c60,1, -0x0d4c5c,1, -0x0d4c58,1, -0x0d4c54,1, -0x0d4c50,1, -0x0d4c40,1, -0x0d4c30,1, -0x0d4c28,1, -0x0d4c24,1, -0x0d4c20,1, -0x0d4c1c,1, -0x0d4c18,1, -0x0d4c14,1, -0x0d4c10,1, -0x0d4c0c,1, -0x0d4c08,1, -0x0d4c04,1, -0x0d4c00,1, -0x0d4b54,1, -0x0d4b50,1, -0x0d4b40,1, -0x0d4b2c,1, -0x0d4b28,1, -0x0d4b24,1, -0x0d4b20,1, -0x0d4b1c,1, -0x0d4b18,1, -0x0d4b14,1, -0x0d4b10,1, -0x0d4b0c,1, -0x0d4b08,1, -0x0d4b04,1, -0x0d4b00,1, -0x0d4afc,1, -0x0d4af8,1, -0x0d4af4,1, -0x0d4af0,1, -0x0d4ac8,1, -0x0d4ac4,1, -0x0d4ac0,1, -0x0d4ab8,1, -0x0d4ab4,1, -0x0d4ab0,1, -0x0d4aac,1, -0x0d4aa8,1, -0x0d4a9c,1, -0x0d4a98,1, -0x0d4a94,1, -0x0d4a90,1, -0x0d4a8c,1, -0x0d4a88,1, -0x0d4a84,1, -0x0d4a80,1, -0x0d4a74,1, -0x0d4a70,1, -0x0d4a6c,1, -0x0d4a68,1, -0x0d4a64,1, -0x0d4a60,1, -0x0d4a5c,1, -0x0d4a58,1, -0x0d4a54,1, -0x0d4a50,1, -0x0d4a40,1, -0x0d4a30,1, -0x0d4a28,1, -0x0d4a24,1, -0x0d4a20,1, -0x0d4a1c,1, -0x0d4a18,1, -0x0d4a14,1, -0x0d4a10,1, -0x0d4a0c,1, -0x0d4a08,1, -0x0d4a04,1, -0x0d4a00,1, -0x0d4954,1, -0x0d4950,1, -0x0d4940,1, -0x0d492c,1, -0x0d4928,1, -0x0d4924,1, -0x0d4920,1, -0x0d491c,1, -0x0d4918,1, -0x0d4914,1, -0x0d4910,1, -0x0d490c,1, -0x0d4908,1, -0x0d4904,1, -0x0d4900,1, -0x0d48fc,1, -0x0d48f8,1, -0x0d48f4,1, -0x0d48f0,1, -0x0d48c8,1, -0x0d48c4,1, -0x0d48c0,1, -0x0d48b8,1, -0x0d48b4,1, -0x0d48b0,1, -0x0d48ac,1, -0x0d48a8,1, -0x0d489c,1, -0x0d4898,1, -0x0d4894,1, -0x0d4890,1, -0x0d488c,1, -0x0d4888,1, -0x0d4884,1, -0x0d4880,1, -0x0d4874,1, -0x0d4870,1, -0x0d486c,1, -0x0d4868,1, -0x0d4864,1, -0x0d4860,1, -0x0d485c,1, -0x0d4858,1, -0x0d4854,1, -0x0d4850,1, -0x0d4840,1, -0x0d4830,1, -0x0d4828,1, -0x0d4824,1, -0x0d4820,1, -0x0d481c,1, -0x0d4818,1, -0x0d4814,1, -0x0d4810,1, -0x0d480c,1, -0x0d4808,1, -0x0d4804,1, -0x0d4800,1, -0x0d4624,1, -0x0d4620,1, -0x0d4554,1, -0x0d4550,1, -0x0d4540,1, -0x0d452c,1, -0x0d4528,1, -0x0d4524,1, -0x0d4520,1, -0x0d451c,1, -0x0d4518,1, -0x0d4514,1, -0x0d4510,1, -0x0d450c,1, -0x0d4508,1, -0x0d4504,1, -0x0d4500,1, -0x0d44fc,1, -0x0d44f8,1, -0x0d44f4,1, -0x0d44f0,1, -0x0d44c8,1, -0x0d44c4,1, -0x0d44c0,1, -0x0d44b8,1, -0x0d44b4,1, -0x0d44b0,1, -0x0d44ac,1, -0x0d44a8,1, -0x0d449c,1, -0x0d4498,1, -0x0d4494,1, -0x0d4490,1, -0x0d448c,1, -0x0d4488,1, -0x0d4484,1, -0x0d4480,1, -0x0d4474,1, -0x0d4470,1, -0x0d446c,1, -0x0d4468,1, -0x0d4464,1, -0x0d4460,1, -0x0d445c,1, -0x0d4458,1, -0x0d4454,1, -0x0d4450,1, -0x0d4440,1, -0x0d4430,1, -0x0d4428,1, -0x0d4424,1, -0x0d4420,1, -0x0d441c,1, -0x0d4418,1, -0x0d4414,1, -0x0d4410,1, -0x0d440c,1, -0x0d4408,1, -0x0d4404,1, -0x0d4400,1, -0x0d4354,1, -0x0d4350,1, -0x0d4340,1, -0x0d432c,1, -0x0d4328,1, -0x0d4324,1, -0x0d4320,1, -0x0d431c,1, -0x0d4318,1, -0x0d4314,1, -0x0d4310,1, -0x0d430c,1, -0x0d4308,1, -0x0d4304,1, -0x0d4300,1, -0x0d42fc,1, -0x0d42f8,1, -0x0d42f4,1, -0x0d42f0,1, -0x0d42c8,1, -0x0d42c4,1, -0x0d42c0,1, -0x0d42b8,1, -0x0d42b4,1, -0x0d42b0,1, -0x0d42ac,1, -0x0d42a8,1, -0x0d429c,1, -0x0d4298,1, -0x0d4294,1, -0x0d4290,1, -0x0d428c,1, -0x0d4288,1, -0x0d4284,1, -0x0d4280,1, -0x0d4274,1, -0x0d4270,1, -0x0d426c,1, -0x0d4268,1, -0x0d4264,1, -0x0d4260,1, -0x0d425c,1, -0x0d4258,1, -0x0d4254,1, -0x0d4250,1, -0x0d4240,1, -0x0d4230,1, -0x0d4228,1, -0x0d4224,1, -0x0d4220,1, -0x0d421c,1, -0x0d4218,1, -0x0d4214,1, -0x0d4210,1, -0x0d420c,1, -0x0d4208,1, -0x0d4204,1, -0x0d4200,1, -0x0d4154,1, -0x0d4150,1, -0x0d4140,1, -0x0d412c,1, -0x0d4128,1, -0x0d4124,1, -0x0d4120,1, -0x0d411c,1, -0x0d4118,1, -0x0d4114,1, -0x0d4110,1, -0x0d410c,1, -0x0d4108,1, -0x0d4104,1, -0x0d4100,1, -0x0d40fc,1, -0x0d40f8,1, -0x0d40f4,1, -0x0d40f0,1, -0x0d40c8,1, -0x0d40c4,1, -0x0d40c0,1, -0x0d40b8,1, -0x0d40b4,1, -0x0d40b0,1, -0x0d40ac,1, -0x0d40a8,1, -0x0d409c,1, -0x0d4098,1, -0x0d4094,1, -0x0d4090,1, -0x0d408c,1, -0x0d4088,1, -0x0d4084,1, -0x0d4080,1, -0x0d4074,1, -0x0d4070,1, -0x0d406c,1, -0x0d4068,1, -0x0d4064,1, -0x0d4060,1, -0x0d405c,1, -0x0d4058,1, -0x0d4054,1, -0x0d4050,1, -0x0d4040,1, -0x0d4030,1, -0x0d4028,1, -0x0d4024,1, -0x0d4020,1, -0x0d401c,1, -0x0d4018,1, -0x0d4014,1, -0x0d4010,1, -0x0d400c,1, -0x0d4008,1, -0x0d4004,1, -0x0d4000,1, -0x0d3844,1, -0x0d3840,1, -0x0d383c,1, -0x0d3838,1, -0x0d3834,1, -0x0d3830,1, -0x0d382c,1, -0x0d3828,1, -0x0d3824,1, -0x0d3820,1, -0x0d3814,1, -0x0d3810,1, -0x0d3800,1, -0x0d3624,1, -0x0d3620,1, -0x0d3554,1, -0x0d3550,1, -0x0d3540,1, -0x0d352c,1, -0x0d3528,1, -0x0d3524,1, -0x0d3520,1, -0x0d351c,1, -0x0d3518,1, -0x0d3514,1, -0x0d3510,1, -0x0d350c,1, -0x0d3508,1, -0x0d3504,1, -0x0d3500,1, -0x0d34fc,1, -0x0d34f8,1, -0x0d34f4,1, -0x0d34f0,1, -0x0d34c8,1, -0x0d34c4,1, -0x0d34c0,1, -0x0d34b8,1, -0x0d34b4,1, -0x0d34b0,1, -0x0d34ac,1, -0x0d34a8,1, -0x0d349c,1, -0x0d3498,1, -0x0d3494,1, -0x0d3490,1, -0x0d348c,1, -0x0d3488,1, -0x0d3484,1, -0x0d3480,1, -0x0d3474,1, -0x0d3470,1, -0x0d346c,1, -0x0d3468,1, -0x0d3464,1, -0x0d3460,1, -0x0d345c,1, -0x0d3458,1, -0x0d3454,1, -0x0d3450,1, -0x0d3440,1, -0x0d3430,1, -0x0d3428,1, -0x0d3424,1, -0x0d3420,1, -0x0d341c,1, -0x0d3418,1, -0x0d3414,1, -0x0d3410,1, -0x0d340c,1, -0x0d3408,1, -0x0d3404,1, -0x0d3400,1, -0x0d3354,1, -0x0d3350,1, -0x0d3340,1, -0x0d332c,1, -0x0d3328,1, -0x0d3324,1, -0x0d3320,1, -0x0d331c,1, -0x0d3318,1, -0x0d3314,1, -0x0d3310,1, -0x0d330c,1, -0x0d3308,1, -0x0d3304,1, -0x0d3300,1, -0x0d32fc,1, -0x0d32f8,1, -0x0d32f4,1, -0x0d32f0,1, -0x0d32c8,1, -0x0d32c4,1, -0x0d32c0,1, -0x0d32b8,1, -0x0d32b4,1, -0x0d32b0,1, -0x0d32ac,1, -0x0d32a8,1, -0x0d329c,1, -0x0d3298,1, -0x0d3294,1, -0x0d3290,1, -0x0d328c,1, -0x0d3288,1, -0x0d3284,1, -0x0d3280,1, -0x0d3274,1, -0x0d3270,1, -0x0d326c,1, -0x0d3268,1, -0x0d3264,1, -0x0d3260,1, -0x0d325c,1, -0x0d3258,1, -0x0d3254,1, -0x0d3250,1, -0x0d3240,1, -0x0d3230,1, -0x0d3228,1, -0x0d3224,1, -0x0d3220,1, -0x0d321c,1, -0x0d3218,1, -0x0d3214,1, -0x0d3210,1, -0x0d320c,1, -0x0d3208,1, -0x0d3204,1, -0x0d3200,1, -0x0d3154,1, -0x0d3150,1, -0x0d3140,1, -0x0d312c,1, -0x0d3128,1, -0x0d3124,1, -0x0d3120,1, -0x0d311c,1, -0x0d3118,1, -0x0d3114,1, -0x0d3110,1, -0x0d310c,1, -0x0d3108,1, -0x0d3104,1, -0x0d3100,1, -0x0d30fc,1, -0x0d30f8,1, -0x0d30f4,1, -0x0d30f0,1, -0x0d30c8,1, -0x0d30c4,1, -0x0d30c0,1, -0x0d30b8,1, -0x0d30b4,1, -0x0d30b0,1, -0x0d30ac,1, -0x0d30a8,1, -0x0d309c,1, -0x0d3098,1, -0x0d3094,1, -0x0d3090,1, -0x0d308c,1, -0x0d3088,1, -0x0d3084,1, -0x0d3080,1, -0x0d3074,1, -0x0d3070,1, -0x0d306c,1, -0x0d3068,1, -0x0d3064,1, -0x0d3060,1, -0x0d305c,1, -0x0d3058,1, -0x0d3054,1, -0x0d3050,1, -0x0d3040,1, -0x0d3030,1, -0x0d3028,1, -0x0d3024,1, -0x0d3020,1, -0x0d301c,1, -0x0d3018,1, -0x0d3014,1, -0x0d3010,1, -0x0d300c,1, -0x0d3008,1, -0x0d3004,1, -0x0d3000,1, -0x0d2e24,1, -0x0d2e20,1, -0x0d2d54,1, -0x0d2d50,1, -0x0d2d40,1, -0x0d2d2c,1, -0x0d2d28,1, -0x0d2d24,1, -0x0d2d20,1, -0x0d2d1c,1, -0x0d2d18,1, -0x0d2d14,1, -0x0d2d10,1, -0x0d2d0c,1, -0x0d2d08,1, -0x0d2d04,1, -0x0d2d00,1, -0x0d2cfc,1, -0x0d2cf8,1, -0x0d2cf4,1, -0x0d2cf0,1, -0x0d2cc8,1, -0x0d2cc4,1, -0x0d2cc0,1, -0x0d2cb8,1, -0x0d2cb4,1, -0x0d2cb0,1, -0x0d2cac,1, -0x0d2ca8,1, -0x0d2c9c,1, -0x0d2c98,1, -0x0d2c94,1, -0x0d2c90,1, -0x0d2c8c,1, -0x0d2c88,1, -0x0d2c84,1, -0x0d2c80,1, -0x0d2c74,1, -0x0d2c70,1, -0x0d2c6c,1, -0x0d2c68,1, -0x0d2c64,1, -0x0d2c60,1, -0x0d2c5c,1, -0x0d2c58,1, -0x0d2c54,1, -0x0d2c50,1, -0x0d2c40,1, -0x0d2c30,1, -0x0d2c28,1, -0x0d2c24,1, -0x0d2c20,1, -0x0d2c1c,1, -0x0d2c18,1, -0x0d2c14,1, -0x0d2c10,1, -0x0d2c0c,1, -0x0d2c08,1, -0x0d2c04,1, -0x0d2c00,1, -0x0d2b54,1, -0x0d2b50,1, -0x0d2b40,1, -0x0d2b2c,1, -0x0d2b28,1, -0x0d2b24,1, -0x0d2b20,1, -0x0d2b1c,1, -0x0d2b18,1, -0x0d2b14,1, -0x0d2b10,1, -0x0d2b0c,1, -0x0d2b08,1, -0x0d2b04,1, -0x0d2b00,1, -0x0d2afc,1, -0x0d2af8,1, -0x0d2af4,1, -0x0d2af0,1, -0x0d2ac8,1, -0x0d2ac4,1, -0x0d2ac0,1, -0x0d2ab8,1, -0x0d2ab4,1, -0x0d2ab0,1, -0x0d2aac,1, -0x0d2aa8,1, -0x0d2a9c,1, -0x0d2a98,1, -0x0d2a94,1, -0x0d2a90,1, -0x0d2a8c,1, -0x0d2a88,1, -0x0d2a84,1, -0x0d2a80,1, -0x0d2a74,1, -0x0d2a70,1, -0x0d2a6c,1, -0x0d2a68,1, -0x0d2a64,1, -0x0d2a60,1, -0x0d2a5c,1, -0x0d2a58,1, -0x0d2a54,1, -0x0d2a50,1, -0x0d2a40,1, -0x0d2a30,1, -0x0d2a28,1, -0x0d2a24,1, -0x0d2a20,1, -0x0d2a1c,1, -0x0d2a18,1, -0x0d2a14,1, -0x0d2a10,1, -0x0d2a0c,1, -0x0d2a08,1, -0x0d2a04,1, -0x0d2a00,1, -0x0d2954,1, -0x0d2950,1, -0x0d2940,1, -0x0d292c,1, -0x0d2928,1, -0x0d2924,1, -0x0d2920,1, -0x0d291c,1, -0x0d2918,1, -0x0d2914,1, -0x0d2910,1, -0x0d290c,1, -0x0d2908,1, -0x0d2904,1, -0x0d2900,1, -0x0d28fc,1, -0x0d28f8,1, -0x0d28f4,1, -0x0d28f0,1, -0x0d28c8,1, -0x0d28c4,1, -0x0d28c0,1, -0x0d28b8,1, -0x0d28b4,1, -0x0d28b0,1, -0x0d28ac,1, -0x0d28a8,1, -0x0d289c,1, -0x0d2898,1, -0x0d2894,1, -0x0d2890,1, -0x0d288c,1, -0x0d2888,1, -0x0d2884,1, -0x0d2880,1, -0x0d2874,1, -0x0d2870,1, -0x0d286c,1, -0x0d2868,1, -0x0d2864,1, -0x0d2860,1, -0x0d285c,1, -0x0d2858,1, -0x0d2854,1, -0x0d2850,1, -0x0d2840,1, -0x0d2830,1, -0x0d2828,1, -0x0d2824,1, -0x0d2820,1, -0x0d281c,1, -0x0d2818,1, -0x0d2814,1, -0x0d2810,1, -0x0d280c,1, -0x0d2808,1, -0x0d2804,1, -0x0d2800,1, -0x0d2624,1, -0x0d2620,1, -0x0d2554,1, -0x0d2550,1, -0x0d2540,1, -0x0d252c,1, -0x0d2528,1, -0x0d2524,1, -0x0d2520,1, -0x0d251c,1, -0x0d2518,1, -0x0d2514,1, -0x0d2510,1, -0x0d250c,1, -0x0d2508,1, -0x0d2504,1, -0x0d2500,1, -0x0d24fc,1, -0x0d24f8,1, -0x0d24f4,1, -0x0d24f0,1, -0x0d24c8,1, -0x0d24c4,1, -0x0d24c0,1, -0x0d24b8,1, -0x0d24b4,1, -0x0d24b0,1, -0x0d24ac,1, -0x0d24a8,1, -0x0d249c,1, -0x0d2498,1, -0x0d2494,1, -0x0d2490,1, -0x0d248c,1, -0x0d2488,1, -0x0d2484,1, -0x0d2480,1, -0x0d2474,1, -0x0d2470,1, -0x0d246c,1, -0x0d2468,1, -0x0d2464,1, -0x0d2460,1, -0x0d245c,1, -0x0d2458,1, -0x0d2454,1, -0x0d2450,1, -0x0d2440,1, -0x0d2430,1, -0x0d2428,1, -0x0d2424,1, -0x0d2420,1, -0x0d241c,1, -0x0d2418,1, -0x0d2414,1, -0x0d2410,1, -0x0d240c,1, -0x0d2408,1, -0x0d2404,1, -0x0d2400,1, -0x0d2354,1, -0x0d2350,1, -0x0d2340,1, -0x0d232c,1, -0x0d2328,1, -0x0d2324,1, -0x0d2320,1, -0x0d231c,1, -0x0d2318,1, -0x0d2314,1, -0x0d2310,1, -0x0d230c,1, -0x0d2308,1, -0x0d2304,1, -0x0d2300,1, -0x0d22fc,1, -0x0d22f8,1, -0x0d22f4,1, -0x0d22f0,1, -0x0d22c8,1, -0x0d22c4,1, -0x0d22c0,1, -0x0d22b8,1, -0x0d22b4,1, -0x0d22b0,1, -0x0d22ac,1, -0x0d22a8,1, -0x0d229c,1, -0x0d2298,1, -0x0d2294,1, -0x0d2290,1, -0x0d228c,1, -0x0d2288,1, -0x0d2284,1, -0x0d2280,1, -0x0d2274,1, -0x0d2270,1, -0x0d226c,1, -0x0d2268,1, -0x0d2264,1, -0x0d2260,1, -0x0d225c,1, -0x0d2258,1, -0x0d2254,1, -0x0d2250,1, -0x0d2240,1, -0x0d2230,1, -0x0d2228,1, -0x0d2224,1, -0x0d2220,1, -0x0d221c,1, -0x0d2218,1, -0x0d2214,1, -0x0d2210,1, -0x0d220c,1, -0x0d2208,1, -0x0d2204,1, -0x0d2200,1, -0x0d2154,1, -0x0d2150,1, -0x0d2140,1, -0x0d212c,1, -0x0d2128,1, -0x0d2124,1, -0x0d2120,1, -0x0d211c,1, -0x0d2118,1, -0x0d2114,1, -0x0d2110,1, -0x0d210c,1, -0x0d2108,1, -0x0d2104,1, -0x0d2100,1, -0x0d20fc,1, -0x0d20f8,1, -0x0d20f4,1, -0x0d20f0,1, -0x0d20c8,1, -0x0d20c4,1, -0x0d20c0,1, -0x0d20b8,1, -0x0d20b4,1, -0x0d20b0,1, -0x0d20ac,1, -0x0d20a8,1, -0x0d209c,1, -0x0d2098,1, -0x0d2094,1, -0x0d2090,1, -0x0d208c,1, -0x0d2088,1, -0x0d2084,1, -0x0d2080,1, -0x0d2074,1, -0x0d2070,1, -0x0d206c,1, -0x0d2068,1, -0x0d2064,1, -0x0d2060,1, -0x0d205c,1, -0x0d2058,1, -0x0d2054,1, -0x0d2050,1, -0x0d2040,1, -0x0d2030,1, -0x0d2028,1, -0x0d2024,1, -0x0d2020,1, -0x0d201c,1, -0x0d2018,1, -0x0d2014,1, -0x0d2010,1, -0x0d200c,1, -0x0d2008,1, -0x0d2004,1, -0x0d2000,1, -0x0d1e24,1, -0x0d1e20,1, -0x0d1d54,1, -0x0d1d50,1, -0x0d1d40,1, -0x0d1d2c,1, -0x0d1d28,1, -0x0d1d24,1, -0x0d1d20,1, -0x0d1d1c,1, -0x0d1d18,1, -0x0d1d14,1, -0x0d1d10,1, -0x0d1d0c,1, -0x0d1d08,1, -0x0d1d04,1, -0x0d1d00,1, -0x0d1cfc,1, -0x0d1cf8,1, -0x0d1cf4,1, -0x0d1cf0,1, -0x0d1cc8,1, -0x0d1cc4,1, -0x0d1cc0,1, -0x0d1cb8,1, -0x0d1cb4,1, -0x0d1cb0,1, -0x0d1cac,1, -0x0d1ca8,1, -0x0d1c9c,1, -0x0d1c98,1, -0x0d1c94,1, -0x0d1c90,1, -0x0d1c8c,1, -0x0d1c88,1, -0x0d1c84,1, -0x0d1c80,1, -0x0d1c74,1, -0x0d1c70,1, -0x0d1c6c,1, -0x0d1c68,1, -0x0d1c64,1, -0x0d1c60,1, -0x0d1c5c,1, -0x0d1c58,1, -0x0d1c54,1, -0x0d1c50,1, -0x0d1c40,1, -0x0d1c30,1, -0x0d1c28,1, -0x0d1c24,1, -0x0d1c20,1, -0x0d1c1c,1, -0x0d1c18,1, -0x0d1c14,1, -0x0d1c10,1, -0x0d1c0c,1, -0x0d1c08,1, -0x0d1c04,1, -0x0d1c00,1, -0x0d1b54,1, -0x0d1b50,1, -0x0d1b40,1, -0x0d1b2c,1, -0x0d1b28,1, -0x0d1b24,1, -0x0d1b20,1, -0x0d1b1c,1, -0x0d1b18,1, -0x0d1b14,1, -0x0d1b10,1, -0x0d1b0c,1, -0x0d1b08,1, -0x0d1b04,1, -0x0d1b00,1, -0x0d1afc,1, -0x0d1af8,1, -0x0d1af4,1, -0x0d1af0,1, -0x0d1ac8,1, -0x0d1ac4,1, -0x0d1ac0,1, -0x0d1ab8,1, -0x0d1ab4,1, -0x0d1ab0,1, -0x0d1aac,1, -0x0d1aa8,1, -0x0d1a9c,1, -0x0d1a98,1, -0x0d1a94,1, -0x0d1a90,1, -0x0d1a8c,1, -0x0d1a88,1, -0x0d1a84,1, -0x0d1a80,1, -0x0d1a74,1, -0x0d1a70,1, -0x0d1a6c,1, -0x0d1a68,1, -0x0d1a64,1, -0x0d1a60,1, -0x0d1a5c,1, -0x0d1a58,1, -0x0d1a54,1, -0x0d1a50,1, -0x0d1a40,1, -0x0d1a30,1, -0x0d1a28,1, -0x0d1a24,1, -0x0d1a20,1, -0x0d1a1c,1,UNKNOWN -0x0d1a18,1, -0x0d1a14,1, -0x0d1a10,1, -0x0d1a0c,1, -0x0d1a08,1, -0x0d1a04,1, -0x0d1a00,1, -0x0d1954,1, -0x0d1950,1, -0x0d1940,1, -0x0d192c,1, -0x0d1928,1, -0x0d1924,1, -0x0d1920,1, -0x0d191c,1, -0x0d1918,1, -0x0d1914,1, -0x0d1910,1, -0x0d190c,1, -0x0d1908,1, -0x0d1904,1, -0x0d1900,1, -0x0d18fc,1, -0x0d18f8,1, -0x0d18f4,1, -0x0d18f0,1, -0x0d18c8,1, -0x0d18c4,1, -0x0d18c0,1, -0x0d18b8,1, -0x0d18b4,1, -0x0d18b0,1, -0x0d18ac,1, -0x0d18a8,1, -0x0d189c,1, -0x0d1898,1, -0x0d1894,1, -0x0d1890,1, -0x0d188c,1, -0x0d1888,1, -0x0d1884,1, -0x0d1880,1, -0x0d1874,1, -0x0d1870,1, -0x0d186c,1, -0x0d1868,1, -0x0d1864,1, -0x0d1860,1, -0x0d185c,1, -0x0d1858,1, -0x0d1854,1, -0x0d1850,1, -0x0d1840,1, -0x0d1830,1, -0x0d1828,1, -0x0d1824,1, -0x0d1820,1, -0x0d181c,1, -0x0d1818,1, -0x0d1814,1, -0x0d1810,1, -0x0d180c,1, -0x0d1808,1, -0x0d1804,1, -0x0d1800,1, -0x0d1624,1, -0x0d1620,1, -0x0d1554,1, -0x0d1550,1, -0x0d1540,1, -0x0d152c,1, -0x0d1528,1, -0x0d1524,1, -0x0d1520,1, -0x0d151c,1, -0x0d1518,1, -0x0d1514,1, -0x0d1510,1, -0x0d150c,1, -0x0d1508,1, -0x0d1504,1, -0x0d1500,1, -0x0d14fc,1, -0x0d14f8,1, -0x0d14f4,1, -0x0d14f0,1, -0x0d14c8,1, -0x0d14c4,1, -0x0d14c0,1, -0x0d14b8,1, -0x0d14b4,1, -0x0d14b0,1, -0x0d14ac,1, -0x0d14a8,1, -0x0d149c,1, -0x0d1498,1, -0x0d1494,1, -0x0d1490,1, -0x0d148c,1, -0x0d1488,1, -0x0d1484,1, -0x0d1480,1, -0x0d1474,1, -0x0d1470,1, -0x0d146c,1, -0x0d1468,1, -0x0d1464,1, -0x0d1460,1, -0x0d145c,1, -0x0d1458,1, -0x0d1454,1, -0x0d1450,1, -0x0d1440,1, -0x0d1430,1, -0x0d1428,1, -0x0d1424,1, -0x0d1420,1, -0x0d141c,1, -0x0d1418,1, -0x0d1414,1, -0x0d1410,1, -0x0d140c,1, -0x0d1408,1, -0x0d1404,1, -0x0d1400,1, -0x0d1354,1, -0x0d1350,1, -0x0d1340,1, -0x0d132c,1, -0x0d1328,1, -0x0d1324,1, -0x0d1320,1, -0x0d131c,1, -0x0d1318,1, -0x0d1314,1, -0x0d1310,1, -0x0d130c,1, -0x0d1308,1, -0x0d1304,1, -0x0d1300,1, -0x0d12fc,1, -0x0d12f8,1, -0x0d12f4,1, -0x0d12f0,1, -0x0d12c8,1, -0x0d12c4,1, -0x0d12c0,1, -0x0d12b8,1, -0x0d12b4,1, -0x0d12b0,1, -0x0d12ac,1, -0x0d12a8,1, -0x0d129c,1, -0x0d1298,1, -0x0d1294,1, -0x0d1290,1, -0x0d128c,1, -0x0d1288,1, -0x0d1284,1, -0x0d1280,1, -0x0d1274,1, -0x0d1270,1, -0x0d126c,1, -0x0d1268,1, -0x0d1264,1, -0x0d1260,1, -0x0d125c,1, -0x0d1258,1, -0x0d1254,1, -0x0d1250,1, -0x0d1240,1, -0x0d1230,1, -0x0d1228,1, -0x0d1224,1, -0x0d1220,1, -0x0d121c,1, -0x0d1218,1, -0x0d1214,1, -0x0d1210,1, -0x0d120c,1, -0x0d1208,1, -0x0d1204,1, -0x0d1200,1, -0x0d1154,1, -0x0d1150,1, -0x0d1140,1, -0x0d112c,1, -0x0d1128,1, -0x0d1124,1, -0x0d1120,1, -0x0d111c,1, -0x0d1118,1, -0x0d1114,1, -0x0d1110,1, -0x0d110c,1, -0x0d1108,1, -0x0d1104,1, -0x0d1100,1, -0x0d10fc,1, -0x0d10f8,1, -0x0d10f4,1, -0x0d10f0,1, -0x0d10c8,1, -0x0d10c4,1, -0x0d10c0,1, -0x0d10b8,1, -0x0d10b4,1, -0x0d10b0,1, -0x0d10ac,1, -0x0d10a8,1, -0x0d109c,1, -0x0d1098,1, -0x0d1094,1, -0x0d1090,1, -0x0d108c,1, -0x0d1088,1, -0x0d1084,1, -0x0d1080,1, -0x0d1074,1, -0x0d1070,1, -0x0d106c,1, -0x0d1068,1, -0x0d1064,1, -0x0d1060,1, -0x0d105c,1, -0x0d1058,1, -0x0d1054,1, -0x0d1050,1, -0x0d1040,1, -0x0d1030,1, -0x0d1028,1, -0x0d1024,1, -0x0d1020,1, -0x0d101c,1, -0x0d1018,1, -0x0d1014,1, -0x0d1010,1, -0x0d100c,1, -0x0d1008,1, -0x0d1004,1, -0x0d1000,1, -0x0d0e24,1, -0x0d0e20,1, -0x0d0d54,1, -0x0d0d50,1, -0x0d0d40,1, -0x0d0d2c,1, -0x0d0d28,1, -0x0d0d24,1, -0x0d0d20,1, -0x0d0d1c,1, -0x0d0d18,1, -0x0d0d14,1, -0x0d0d10,1, -0x0d0d0c,1, -0x0d0d08,1, -0x0d0d04,1, -0x0d0d00,1, -0x0d0cfc,1, -0x0d0cf8,1, -0x0d0cf4,1, -0x0d0cf0,1, -0x0d0cc8,1, -0x0d0cc4,1, -0x0d0cc0,1, -0x0d0cb8,1, -0x0d0cb4,1, -0x0d0cb0,1, -0x0d0cac,1, -0x0d0ca8,1, -0x0d0c9c,1, -0x0d0c98,1, -0x0d0c94,1, -0x0d0c90,1, -0x0d0c8c,1, -0x0d0c88,1, -0x0d0c84,1, -0x0d0c80,1, -0x0d0c74,1, -0x0d0c70,1, -0x0d0c6c,1, -0x0d0c68,1, -0x0d0c64,1, -0x0d0c60,1, -0x0d0c5c,1, -0x0d0c58,1, -0x0d0c54,1, -0x0d0c50,1, -0x0d0c40,1, -0x0d0c30,1, -0x0d0c28,1, -0x0d0c24,1, -0x0d0c20,1, -0x0d0c1c,1, -0x0d0c18,1, -0x0d0c14,1, -0x0d0c10,1, -0x0d0c0c,1, -0x0d0c08,1, -0x0d0c04,1, -0x0d0c00,1, -0x0d0b54,1, -0x0d0b50,1, -0x0d0b40,1, -0x0d0b2c,1, -0x0d0b28,1, -0x0d0b24,1, -0x0d0b20,1, -0x0d0b1c,1, -0x0d0b18,1, -0x0d0b14,1, -0x0d0b10,1, -0x0d0b0c,1, -0x0d0b08,1, -0x0d0b04,1, -0x0d0b00,1, -0x0d0afc,1, -0x0d0af8,1, -0x0d0af4,1, -0x0d0af0,1, -0x0d0ac8,1, -0x0d0ac4,1, -0x0d0ac0,1, -0x0d0ab8,1, -0x0d0ab4,1, -0x0d0ab0,1, -0x0d0aac,1, -0x0d0aa8,1, -0x0d0a9c,1, -0x0d0a98,1, -0x0d0a94,1, -0x0d0a90,1, -0x0d0a8c,1, -0x0d0a88,1, -0x0d0a84,1, -0x0d0a80,1, -0x0d0a74,1, -0x0d0a70,1, -0x0d0a6c,1, -0x0d0a68,1, -0x0d0a64,1, -0x0d0a60,1, -0x0d0a5c,1, -0x0d0a58,1, -0x0d0a54,1, -0x0d0a50,1,UNKNOWN -0x0d0a40,1, -0x0d0a30,1, -0x0d0a28,1, -0x0d0a24,1, -0x0d0a20,1, -0x0d0a1c,1, -0x0d0a18,1, -0x0d0a14,1, -0x0d0a10,1, -0x0d0a0c,1, -0x0d0a08,1, -0x0d0a04,1, -0x0d0a00,1, -0x0d0954,1, -0x0d0950,1, -0x0d0940,1, -0x0d092c,1, -0x0d0928,1, -0x0d0924,1, -0x0d0920,1, -0x0d091c,1, -0x0d0918,1, -0x0d0914,1, -0x0d0910,1, -0x0d090c,1, -0x0d0908,1, -0x0d0904,1, -0x0d0900,1, -0x0d08fc,1, -0x0d08f8,1, -0x0d08f4,1, -0x0d08f0,1, -0x0d08c8,1, -0x0d08c4,1, -0x0d08c0,1, -0x0d08b8,1, -0x0d08b4,1, -0x0d08b0,1, -0x0d08ac,1, -0x0d08a8,1, -0x0d089c,1, -0x0d0898,1, -0x0d0894,1, -0x0d0890,1, -0x0d088c,1, -0x0d0888,1, -0x0d0884,1, -0x0d0880,1, -0x0d0874,1, -0x0d0870,1, -0x0d086c,1, -0x0d0868,1, -0x0d0864,1, -0x0d0860,1, -0x0d085c,1, -0x0d0858,1, -0x0d0854,1, -0x0d0850,1, -0x0d0840,1, -0x0d0830,1, -0x0d0828,1, -0x0d0824,1, -0x0d0820,1, -0x0d081c,1, -0x0d0818,1, -0x0d0814,1, -0x0d0810,1, -0x0d080c,1, -0x0d0808,1, -0x0d0804,1, -0x0d0800,1, -0x0d0624,1, -0x0d0620,1, -0x0d0554,1, -0x0d0550,1, -0x0d0540,1, -0x0d052c,1, -0x0d0528,1, -0x0d0524,1, -0x0d0520,1, -0x0d051c,1, -0x0d0518,1, -0x0d0514,1, -0x0d0510,1, -0x0d050c,1, -0x0d0508,1, -0x0d0504,1, -0x0d0500,1, -0x0d04fc,1, -0x0d04f8,1, -0x0d04f4,1, -0x0d04f0,1, -0x0d04c8,1, -0x0d04c4,1, -0x0d04c0,1, -0x0d04b8,1, -0x0d04b4,1, -0x0d04b0,1, -0x0d04ac,1, -0x0d04a8,1, -0x0d049c,1, -0x0d0498,1, -0x0d0494,1, -0x0d0490,1, -0x0d048c,1, -0x0d0488,1, -0x0d0484,1, -0x0d0480,1, -0x0d0474,1, -0x0d0470,1, -0x0d046c,1, -0x0d0468,1, -0x0d0464,1, -0x0d0460,1, -0x0d045c,1, -0x0d0458,1, -0x0d0454,1, -0x0d0450,1, -0x0d0440,1, -0x0d0430,1, -0x0d0428,1, -0x0d0424,1, -0x0d0420,1, -0x0d041c,1, -0x0d0418,1, -0x0d0414,1, -0x0d0410,1, -0x0d040c,1, -0x0d0408,1, -0x0d0404,1, -0x0d0400,1, -0x0d0354,1, -0x0d0350,1, -0x0d0340,1, -0x0d032c,1, -0x0d0328,1, -0x0d0324,1, -0x0d0320,1, -0x0d031c,1, -0x0d0318,1, -0x0d0314,1, -0x0d0310,1, -0x0d030c,1, -0x0d0308,1, -0x0d0304,1, -0x0d0300,1, -0x0d02fc,1, -0x0d02f8,1, -0x0d02f4,1, -0x0d02f0,1, -0x0d02c8,1, -0x0d02c4,1, -0x0d02c0,1, -0x0d02b8,1, -0x0d02b4,1, -0x0d02b0,1, -0x0d02ac,1, -0x0d02a8,1, -0x0d029c,1, -0x0d0298,1, -0x0d0294,1, -0x0d0290,1, -0x0d028c,1, -0x0d0288,1, -0x0d0284,1, -0x0d0280,1, -0x0d0274,1, -0x0d0270,1, -0x0d026c,1, -0x0d0268,1, -0x0d0264,1, -0x0d0260,1, -0x0d025c,1, -0x0d0258,1, -0x0d0254,1, -0x0d0250,1, -0x0d0240,1, -0x0d0230,1, -0x0d0228,1, -0x0d0224,1, -0x0d0220,1, -0x0d021c,1, -0x0d0218,1, -0x0d0214,1, -0x0d0210,1, -0x0d020c,1, -0x0d0208,1, -0x0d0204,1, -0x0d0200,1, -0x0d0154,1, -0x0d0150,1, -0x0d0140,1, -0x0d012c,1, -0x0d0128,1, -0x0d0124,1, -0x0d0120,1, -0x0d011c,1, -0x0d0118,1, -0x0d0114,1, -0x0d0110,1, -0x0d010c,1, -0x0d0108,1, -0x0d0104,1, -0x0d0100,1, -0x0d00fc,1, -0x0d00f8,1, -0x0d00f4,1, -0x0d00f0,1, -0x0d00c8,1, -0x0d00c4,1, -0x0d00c0,1, -0x0d00b8,1, -0x0d00b4,1, -0x0d00b0,1, -0x0d00ac,1, -0x0d00a8,1, -0x0d009c,1, -0x0d0098,1, -0x0d0094,1, -0x0d0090,1, -0x0d008c,1, -0x0d0088,1, -0x0d0084,1, -0x0d0080,1, -0x0d0074,1, -0x0d0070,1, -0x0d006c,1, -0x0d0068,1, -0x0d0064,1, -0x0d0060,1, -0x0d005c,1, -0x0d0058,1, -0x0d0054,1, -0x0d0050,1, -0x0d0040,1, -0x0d0030,1, -0x0d0028,1, -0x0d0024,1, -0x0d0020,1, -0x0d001c,1, -0x0d0018,1, -0x0d0014,1, -0x0d0010,1, -0x0d000c,1, -0x0d0008,1, -0x0d0004,1, -0x0d0000,1, -0x0c2514,1, -0x0c2510,1, -0x0c2500,1, -0x0c2400,1, -0x0c2208,1, -0x0c2204,1, -0x0c2124,1, -0x0c2120,1, -0x0c211c,1, -0x0c2118,1, -0x0c2114,1, -0x0c2110,1, -0x0c210c,1, -0x0c2108,1, -0x0c2104,1, -0x0c2100,1, -0x0c2000,1, -0x0c1ff4,1, -0x0c1ff0,1, -0x0c1fb4,1, -0x0c1fb0,1, -0x0c1fa0,1, -0x0c1f94,1, -0x0c1f90,1, -0x0c1f80,1, -0x0c1f74,1, -0x0c1f70,1, -0x0c1f60,1, -0x0c1f54,1, -0x0c1f50,1, -0x0c1f40,1, -0x0c1f28,1, -0x0c1f20,1, -0x0c1f1c,1, -0x0c1f18,1, -0x0c1f10,1, -0x0c1f0c,1, -0x0c1f04,1, -0x0c1f00,1, -0x0c180c,1, -0x0c1808,1, -0x0c1804,1, -0x0c1800,1, -0x0c1754,1, -0x0c1750,1, -0x0c1740,1, -0x0c1734,1, -0x0c1730,1, -0x0c1720,1, -0x0c1714,1, -0x0c1710,1, -0x0c1700,1, -0x0c1694,1, -0x0c1690,1, -0x0c1680,1, -0x0c1674,1, -0x0c1670,1, -0x0c1660,1, -0x0c164c,1, -0x0c1648,1, -0x0c1644,1, -0x0c1640,1, -0x0c1600,1, -0x0c146c,1, -0x0c1468,1, -0x0c145c,1, -0x0c1458,1, -0x0c144c,1, -0x0c1448,1, -0x0c143c,1, -0x0c1438,1, -0x0c142c,1, -0x0c1428,1, -0x0c141c,1, -0x0c1418,1, -0x0c140c,1, -0x0c1408,1, -0x0c130c,1, -0x0c1308,1, -0x0c1304,1, -0x0c1300,1, -0x0c12ec,1, -0x0c12e8,1, -0x0c12e4,1, -0x0c12e0,1, -0x0c12dc,1, -0x0c12d8,1, -0x0c12d4,1, -0x0c12d0,1, -0x0c12cc,1, -0x0c12c8,1, -0x0c12c4,1, -0x0c12c0,1, -0x0c12bc,1, -0x0c12b8,1, -0x0c12b4,1, -0x0c12b0,1, -0x0c12ac,1, -0x0c12a8,1, -0x0c12a4,1, -0x0c12a0,1, -0x0c129c,1, -0x0c1298,1, -0x0c1294,1, -0x0c1290,1, -0x0c128c,1, -0x0c1288,1, -0x0c1284,1, -0x0c1280,1, -0x0c127c,1, -0x0c1278,1, -0x0c1270,1, -0x0c1268,1, -0x0c1264,1, -0x0c1260,1, -0x0c125c,1, -0x0c1258,1, -0x0c1254,1, -0x0c1250,1, -0x0c124c,1, -0x0c1248,1, -0x0c1244,1, -0x0c1240,1, -0x0c123c,1, -0x0c1238,1, -0x0c1234,1, -0x0c1230,1, -0x0c122c,1, -0x0c1228,1, -0x0c1224,1, -0x0c1220,1, -0x0c1218,1, -0x0c1214,1, -0x0c1210,1, -0x0c120c,1, -0x0c1208,1, -0x0c1204,1, -0x0c1200,1, -0x0c11fc,1, -0x0c11f8,1, -0x0c11f4,1, -0x0c11f0,1, -0x0c11ec,1, -0x0c11e8,1, -0x0c11e4,1, -0x0c11e0,1, -0x0c11dc,1, -0x0c11d8,1, -0x0c11d0,1, -0x0c11cc,1, -0x0c11c8,1, -0x0c11c4,1, -0x0c11c0,1, -0x0c11bc,1, -0x0c11b8,1, -0x0c11b4,1, -0x0c11b0,1, -0x0c11ac,1, -0x0c11a8,1, -0x0c11a4,1, -0x0c11a0,1, -0x0c119c,1, -0x0c1198,1, -0x0c1194,1, -0x0c1190,1, -0x0c118c,1, -0x0c1188,1, -0x0c1184,1, -0x0c1180,1, -0x0c117c,1, -0x0c1178,1, -0x0c1174,1, -0x0c1170,1, -0x0c116c,1, -0x0c1168,1, -0x0c1164,1, -0x0c1160,1, -0x0c115c,1, -0x0c1158,1, -0x0c1154,1, -0x0c1150,1, -0x0c114c,1, -0x0c1148,1, -0x0c1144,1, -0x0c1140,1, -0x0c113c,1, -0x0c1138,1, -0x0c1134,1, -0x0c1130,1, -0x0c112c,1, -0x0c1128,1, -0x0c1124,1, -0x0c1120,1, -0x0c111c,1, -0x0c1118,1, -0x0c1114,1, -0x0c1110,1, -0x0c110c,1, -0x0c1108,1, -0x0c1104,1, -0x0c1100,1, -0x0c1064,1, -0x0c1060,1, -0x0c105c,1, -0x0c1058,1, -0x0c1054,1, -0x0c1050,1, -0x0c104c,1, -0x0c1048,1, -0x0c1044,1, -0x0c1040,1, -0x0c103c,1, -0x0c1038,1, -0x0c1034,1, -0x0c1030,1, -0x0c102c,1, -0x0c1028,1, -0x0c1024,1, -0x0c1020,1, -0x0c101c,1, -0x0c1018,1, -0x0c1014,1, -0x0c1010,1, -0x0c100c,1, -0x0c1008,1, -0x0c1004,1, -0x0c1000,1, -0x0c0ff4,1, -0x0c0ff0,1, -0x0c0fb4,1, -0x0c0fb0,1, -0x0c0fa0,1, -0x0c0f94,1, -0x0c0f90,1, -0x0c0f80,1, -0x0c0f74,1, -0x0c0f70,1, -0x0c0f60,1, -0x0c0f54,1, -0x0c0f50,1, -0x0c0f40,1, -0x0c0f28,1, -0x0c0f20,1, -0x0c0f1c,1, -0x0c0f18,1, -0x0c0f10,1, -0x0c0f0c,1, -0x0c0f04,1, -0x0c0f00,1, -0x0c080c,1, -0x0c0808,1, -0x0c0804,1, -0x0c0800,1, -0x0c0754,1, -0x0c0750,1, -0x0c0740,1, -0x0c0734,1, -0x0c0730,1, -0x0c0720,1, -0x0c0714,1, -0x0c0710,1, -0x0c0700,1, -0x0c0694,1, -0x0c0690,1, -0x0c0680,1, -0x0c0674,1, -0x0c0670,1, -0x0c0660,1, -0x0c064c,1, -0x0c0648,1, -0x0c0644,1, -0x0c0640,1, -0x0c0600,1, -0x0c046c,1, -0x0c0468,1, -0x0c045c,1, -0x0c0458,1, -0x0c044c,1, -0x0c0448,1, -0x0c043c,1, -0x0c0438,1, -0x0c042c,1, -0x0c0428,1, -0x0c041c,1, -0x0c0418,1, -0x0c040c,1, -0x0c0408,1, -0x0c030c,1, -0x0c0308,1, -0x0c0304,1, -0x0c0300,1, -0x0c02ec,1, -0x0c02e8,1, -0x0c02e4,1, -0x0c02e0,1, -0x0c02dc,1, -0x0c02d8,1, -0x0c02d4,1, -0x0c02d0,1, -0x0c02cc,1, -0x0c02c8,1, -0x0c02c4,1, -0x0c02c0,1, -0x0c02bc,1, -0x0c02b8,1, -0x0c02b4,1, -0x0c02b0,1, -0x0c02ac,1, -0x0c02a8,1, -0x0c02a4,1, -0x0c02a0,1, -0x0c029c,1, -0x0c0298,1, -0x0c0294,1, -0x0c0290,1, -0x0c028c,1, -0x0c0288,1, -0x0c0284,1, -0x0c0280,1, -0x0c027c,1, -0x0c0278,1, -0x0c0270,1, -0x0c0268,1, -0x0c0264,1, -0x0c0260,1, -0x0c025c,1, -0x0c0258,1, -0x0c0254,1, -0x0c0250,1, -0x0c024c,1, -0x0c0248,1, -0x0c0244,1, -0x0c0240,1, -0x0c023c,1, -0x0c0238,1, -0x0c0234,1, -0x0c0230,1, -0x0c022c,1, -0x0c0228,1, -0x0c0224,1, -0x0c0220,1, -0x0c0218,1, -0x0c0214,1, -0x0c0210,1, -0x0c020c,1, -0x0c0208,1, -0x0c0204,1, -0x0c0200,1, -0x0c01fc,1, -0x0c01f8,1, -0x0c01f4,1, -0x0c01f0,1, -0x0c01ec,1, -0x0c01e8,1, -0x0c01e4,1, -0x0c01e0,1, -0x0c01dc,1, -0x0c01d8,1, -0x0c01d0,1, -0x0c01cc,1, -0x0c01c8,1, -0x0c01c4,1, -0x0c01c0,1, -0x0c01bc,1, -0x0c01b8,1, -0x0c01b4,1, -0x0c01b0,1, -0x0c01ac,1, -0x0c01a8,1, -0x0c01a4,1, -0x0c01a0,1, -0x0c019c,1, -0x0c0198,1, -0x0c0194,1, -0x0c0190,1, -0x0c018c,1, -0x0c0188,1, -0x0c0184,1, -0x0c0180,1, -0x0c017c,1, -0x0c0178,1, -0x0c0174,1, -0x0c0170,1, -0x0c016c,1, -0x0c0168,1, -0x0c0164,1, -0x0c0160,1, -0x0c015c,1, -0x0c0158,1, -0x0c0154,1, -0x0c0150,1, -0x0c014c,1, -0x0c0148,1, -0x0c0144,1, -0x0c0140,1, -0x0c013c,1, -0x0c0138,1, -0x0c0134,1, -0x0c0130,1, -0x0c012c,1, -0x0c0128,1, -0x0c0124,1, -0x0c0120,1, -0x0c011c,1, -0x0c0118,1, -0x0c0114,1, -0x0c0110,1, -0x0c010c,1, -0x0c0108,1, -0x0c0104,1, -0x0c0100,1, -0x0c0064,1, -0x0c0060,1, -0x0c005c,1, -0x0c0058,1, -0x0c0054,1, -0x0c0050,1, -0x0c004c,1, -0x0c0048,1, -0x0c0044,1, -0x0c0040,1, -0x0c003c,1, -0x0c0038,1, -0x0c0034,1, -0x0c0030,1, -0x0c002c,1, -0x0c0028,1, -0x0c0024,1, -0x0c0020,1, -0x0c001c,1, -0x0c0018,1, -0x0c0014,1, -0x0c0010,1, -0x0c000c,1, -0x0c0008,1, -0x0c0004,1, -0x0c0000,1, -0x0b0f5c,1, -0x0b0f58,1, -0x0b0f4c,1, -0x0b0f48,1, -0x0b0f3c,1, -0x0b0f38,1, -0x0b0f2c,1, -0x0b0f28,1, -0x0b0f1c,1, -0x0b0f18,1, -0x0b0f0c,1, -0x0b0f08,1, -0x0b0efc,1, -0x0b0ef8,1, -0x0b0ef4,1, -0x0b0ef0,1, -0x0b0eec,1, -0x0b0ee8,1, -0x0b0ee4,1, -0x0b0ee0,1, -0x0b0edc,1, -0x0b0ed8,1, -0x0b0ed4,1, -0x0b0ed0,1, -0x0b0ebc,1, -0x0b0eb8,1, -0x0b0eb4,1, -0x0b0eb0,1, -0x0b0eac,1, -0x0b0ea8,1, -0x0b0ea4,1, -0x0b0ea0,1, -0x0b0e9c,1, -0x0b0e98,1, -0x0b0e94,1, -0x0b0e90,1, -0x0b0e7c,1, -0x0b0e78,1, -0x0b0e74,1, -0x0b0e70,1, -0x0b0e6c,1, -0x0b0e68,1, -0x0b0e64,1, -0x0b0e60,1, -0x0b0e5c,1, -0x0b0e58,1, -0x0b0e54,1, -0x0b0e50,1, -0x0b0e3c,1, -0x0b0e38,1, -0x0b0e34,1, -0x0b0e30,1, -0x0b0e2c,1, -0x0b0e28,1, -0x0b0e24,1, -0x0b0e20,1, -0x0b0e1c,1, -0x0b0e18,1, -0x0b0e14,1, -0x0b0e10,1, -0x0b0dfc,1, -0x0b0df8,1, -0x0b0df4,1, -0x0b0df0,1, -0x0b0dec,1, -0x0b0de8,1, -0x0b0de4,1, -0x0b0de0,1, -0x0b0ddc,1, -0x0b0dd8,1, -0x0b0dd4,1, -0x0b0dd0,1, -0x0b0dbc,1, -0x0b0db8,1, -0x0b0db4,1, -0x0b0db0,1, -0x0b0dac,1, -0x0b0da8,1, -0x0b0da4,1, -0x0b0da0,1, -0x0b0d9c,1, -0x0b0d98,1, -0x0b0d94,1, -0x0b0d90,1, -0x0b0d7c,1, -0x0b0d78,1, -0x0b0d6c,1, -0x0b0d68,1, -0x0b0d5c,1, -0x0b0d58,1, -0x0b0d4c,1, -0x0b0d48,1, -0x0b0d3c,1, -0x0b0d38,1, -0x0b0d2c,1, -0x0b0d28,1, -0x0b0cfc,1, -0x0b0cf8,1, -0x0b0cec,1, -0x0b0ce8,1, -0x0b0cdc,1, -0x0b0cd8,1, -0x0b0ccc,1, -0x0b0cc8,1, -0x0b0cbc,1, -0x0b0cb8,1, -0x0b0cac,1, -0x0b0ca8,1, -0x0b0bdc,1, -0x0b0bd8,1, -0x0b0bd4,1, -0x0b0bd0,1, -0x0b0bcc,1, -0x0b0bbc,1, -0x0b0bb8,1, -0x0b0bb4,1, -0x0b0bb0,1, -0x0b0bac,1, -0x0b0b9c,1, -0x0b0b98,1, -0x0b0b94,1, -0x0b0b90,1, -0x0b0b8c,1, -0x0b0b7c,1, -0x0b0b78,1, -0x0b0b74,1, -0x0b0b70,1, -0x0b0b6c,1, -0x0b0b5c,1, -0x0b0b58,1, -0x0b0b54,1, -0x0b0b50,1, -0x0b0b4c,1, -0x0b0b3c,1, -0x0b0b38,1, -0x0b0b34,1, -0x0b0b30,1, -0x0b0b2c,1, -0x0b0b1c,1, -0x0b0b18,1, -0x0b0b14,1, -0x0b0b10,1, -0x0b0b0c,1, -0x0b0aa4,1, -0x0b0aa0,1, -0x0b0a9c,1, -0x0b0a98,1, -0x0b0a90,1, -0x0b0a8c,1, -0x0b0a88,1, -0x0b0a74,1, -0x0b0a6c,1, -0x0b0a68,1, -0x0b0a64,1, -0x0b0a60,1, -0x0b0a5c,1, -0x0b0a58,1, -0x0b0a54,1, -0x0b0a50,1, -0x0b0a4c,1, -0x0b0a48,1, -0x0b0a44,1, -0x0b0a40,1, -0x0b0a3c,1, -0x0b0a38,1, -0x0b0a34,1, -0x0b0a30,1, -0x0b0a2c,1, -0x0b0a28,1, -0x0b0a24,1, -0x0b0a20,1, -0x0b0a1c,1, -0x0b0a18,1, -0x0b0a14,1, -0x0b0a10,1, -0x0b0a0c,1, -0x0b0a08,1, -0x0b0a04,1, -0x0b0a00,1, -0x0b09fc,1, -0x0b09f8,1, -0x0b09f4,1, -0x0b09f0,1, -0x0b09ec,1, -0x0b09e8,1, -0x0b09e4,1, -0x0b09e0,1, -0x0b09dc,1, -0x0b09d8,1, -0x0b09d4,1, -0x0b09d0,1, -0x0b09cc,1, -0x0b09c8,1, -0x0b09c4,1, -0x0b09c0,1, -0x0b09bc,1, -0x0b09b8,1, -0x0b09b4,1, -0x0b09b0,1, -0x0b09a8,1, -0x0b09a4,1, -0x0b09a0,1, -0x0b095c,1, -0x0b0958,1, -0x0b0954,1, -0x0b0950,1, -0x0b0914,1, -0x0b0910,1, -0x0b0900,1, -0x0b08f4,1, -0x0b08f0,1, -0x0b08b4,1, -0x0b08b0,1, -0x0b08a0,1, -0x0b0894,1, -0x0b0890,1, -0x0b0880,1, -0x0b0874,1, -0x0b0870,1, -0x0b0860,1, -0x0b0854,1, -0x0b0850,1, -0x0b0840,1, -0x0b0828,1, -0x0b0820,1, -0x0b081c,1, -0x0b0818,1, -0x0b0810,1, -0x0b080c,1, -0x0b0804,1, -0x0b0800,1, -0x0b07fc,1, -0x0b07f8,1, -0x0b07f4,1, -0x0b07f0,1, -0x0b07ec,1, -0x0b07e8,1, -0x0b07e4,1, -0x0b07e0,1, -0x0b07dc,1, -0x0b07c4,1, -0x0b07c0,1, -0x0b07bc,1, -0x0b07b8,1, -0x0b07b4,1, -0x0b07b0,1, -0x0b07ac,1, -0x0b07a8,1, -0x0b07a4,1, -0x0b07a0,1, -0x0b079c,1, -0x0b0784,1, -0x0b0780,1, -0x0b0768,1, -0x0b0764,1, -0x0b0760,1, -0x0b0754,1, -0x0b0750,1, -0x0b0534,1, -0x0b0530,1, -0x0b052c,1, -0x0b0528,1, -0x0b0524,1, -0x0b0520,1, -0x0b051c,1, -0x0b0518,1, -0x0b0514,1, -0x0b0510,1, -0x0b050c,1, -0x0b0508,1, -0x0b0504,1, -0x0b0500,1, -0x0b0408,1, -0x0b0404,1, -0x0b0400,1, -0x0b03fc,1, -0x0b03f8,1, -0x0b03f4,1, -0x0b03f0,1, -0x0b03ec,1, -0x0b03e8,1, -0x0b03e4,1, -0x0b03e0,1, -0x0b03dc,1, -0x0b03d8,1, -0x0b03d4,1, -0x0b03d0,1, -0x0b03cc,1, -0x0b03c8,1, -0x0b03c4,1, -0x0b03c0,1, -0x0b03bc,1, -0x0b03b8,1, -0x0b03b4,1, -0x0b03b0,1, -0x0b03ac,1, -0x0b03a8,1, -0x0b03a4,1, -0x0b03a0,1, -0x0b039c,1, -0x0b0398,1, -0x0b0394,1, -0x0b0390,1, -0x0b038c,1, -0x0b0388,1, -0x0b0384,1, -0x0b0380,1, -0x0b037c,1, -0x0b0378,1, -0x0b0374,1, -0x0b0370,1, -0x0b036c,1, -0x0b0368,1, -0x0b0364,1, -0x0b0360,1, -0x0b035c,1, -0x0b0358,1, -0x0b0354,1, -0x0b0350,1, -0x0b034c,1, -0x0b0348,1, -0x0b0344,1, -0x0b0340,1, -0x0b033c,1, -0x0b0338,1, -0x0b0334,1, -0x0b0330,1, -0x0b032c,1, -0x0b0328,1, -0x0b0324,1, -0x0b0320,1, -0x0b031c,1, -0x0b0318,1, -0x0b0314,1, -0x0b0310,1, -0x0b030c,1, -0x0b0308,1, -0x0b0304,1, -0x0b0300,1, -0x0b02fc,1, -0x0b02f8,1, -0x0b02f4,1, -0x0b02f0,1, -0x0b02ec,1, -0x0b02e8,1, -0x0b02e4,1, -0x0b02e0,1, -0x0b02dc,1, -0x0b02d8,1, -0x0b02d4,1, -0x0b02d0,1, -0x0b02cc,1, -0x0b02c8,1, -0x0b02c4,1, -0x0b02c0,1, -0x0b02bc,1, -0x0b02b8,1, -0x0b02b4,1, -0x0b02b0,1, -0x0b02ac,1, -0x0b02a8,1, -0x0b02a4,1, -0x0b02a0,1, -0x0b029c,1, -0x0b0298,1, -0x0b0294,1, -0x0b0290,1, -0x0b028c,1, -0x0b0288,1, -0x0b0284,1, -0x0b0280,1, -0x0b027c,1, -0x0b0278,1, -0x0b0274,1, -0x0b0270,1, -0x0b026c,1, -0x0b0268,1, -0x0b0264,1, -0x0b0260,1, -0x0b025c,1, -0x0b0258,1, -0x0b0254,1, -0x0b0250,1, -0x0b01f8,1, -0x0b01f4,1, -0x0b01f0,1, -0x0b01ec,1, -0x0b01e8,1, -0x0b01e4,1, -0x0b01e0,1, -0x0b01dc,1, -0x0b01d8,1, -0x0b01d4,1, -0x0b01cc,1, -0x0b01c8,1, -0x0b01c4,1, -0x0b01c0,1, -0x0b01ac,1, -0x0b01a8,1, -0x0b01a4,1, -0x0b01a0,1, -0x0b0180,1, -0x0b017c,1, -0x0b0178,1, -0x0b0174,1, -0x0b0170,1, -0x0b016c,1, -0x0b0168,1, -0x0b0164,1, -0x0b0160,1, -0x0b015c,1, -0x0b0158,1, -0x0b0154,1, -0x0b0150,1, -0x0b014c,1, -0x0b0148,1, -0x0b0144,1, -0x0b0140,1, -0x0b013c,1, -0x0b0138,1, -0x0b0134,1, -0x0b0130,1, -0x0b012c,1, -0x0b0128,1, -0x0b011c,1, -0x0b0118,1, -0x0b0110,1, -0x0b010c,1, -0x0b0108,1, -0x0b0104,1, -0x0b0100,1, -0x0b00fc,1, -0x0b00f8,1, -0x0b00f4,1, -0x0b00f0,1, -0x0b00e4,1, -0x0b00e0,1, -0x0b00dc,1, -0x0b00d8,1, -0x0b00d4,1, -0x0b00d0,1, -0x0b00cc,1, -0x0b00c8,1, -0x0b00c4,1, -0x0b00c0,1, -0x0b00bc,1, -0x0b00b8,1, -0x0b00b4,1, -0x0b00b0,1, -0x0b00ac,1, -0x0b00a8,1, -0x0b00a4,1, -0x0b00a0,1, -0x0b009c,1, -0x0b0098,1, -0x0b0094,1, -0x0b0090,1, -0x0b008c,1, -0x0b0088,1, -0x0b0084,1, -0x0b0080,1, -0x0b007c,1, -0x0b0078,1, -0x0b0074,1, -0x0b0070,1, -0x0b006c,1, -0x0b0068,1, -0x0b0064,1, -0x0b0060,1, -0x0b005c,1, -0x0b0058,1, -0x0b0054,1, -0x0b0050,1, -0x0b004c,1, -0x0b0048,1, -0x0b0044,1, -0x0b0040,1, -0x0b0038,1, -0x0b0030,1, -0x0b002c,1, -0x0b0028,1, -0x0b0024,1, -0x0b0020,1, -0x0b001c,1, -0x0b0018,1, -0x0b0014,1, -0x0b0010,1, -0x0b000c,1, -0x0b0008,1, -0x0b0004,1, -0x0b0000,1, -0x074550,1, -0x07454c,1, -0x074548,1, -0x074544,1, -0x074540,1, -0x074504,1, -0x074500,1, -0x0744f8,1, -0x0744ac,1, -0x0744a8,1, -0x0744a4,1, -0x0744a0,1, -0x07449c,1, -0x074498,1, -0x074494,1, -0x074490,1, -0x07448c,1, -0x074488,1, -0x074484,1, -0x074480,1, -0x0743d4,1, -0x0743d0,1, -0x0743c0,1, -0x0743b4,1, -0x0743b0,1, -0x0743a0,1, -0x074394,1, -0x074390,1, -0x074380,1, -0x074374,1, -0x074370,1, -0x074360,1, -0x074354,1, -0x074350,1, -0x074340,1, -0x074334,1, -0x074330,1, -0x074320,1, -0x074314,1, -0x074310,1, -0x074300,1, -0x0742f4,1, -0x0742f0,1, -0x0742e0,1, -0x0742d4,1, -0x0742d0,1, -0x0742c0,1, -0x0742b4,1, -0x0742b0,1, -0x0742a0,1, -0x074294,1, -0x074290,1, -0x074280,1, -0x074274,1, -0x074270,1, -0x074260,1, -0x074254,1, -0x074250,1, -0x074240,1, -0x074234,1, -0x074230,1, -0x074220,1, -0x074214,1, -0x074210,1, -0x074200,1, -0x073d0c,1, -0x073d08,1, -0x073d04,1, -0x073d00,1, -0x073cfc,1, -0x073cf8,1, -0x073cf4,1, -0x073cf0,1, -0x073cec,1, -0x073ce8,1, -0x073ce4,1, -0x073ce0,1, -0x073cdc,1, -0x073cd8,1, -0x073cd4,1, -0x073cd0,1, -0x073ccc,1, -0x073cc8,1, -0x073cc4,1, -0x073cc0,1, -0x073cbc,1, -0x073cb8,1, -0x073cb4,1, -0x073cb0,1, -0x073cac,1, -0x073ca8,1, -0x073ca4,1, -0x073ca0,1, -0x073c9c,1, -0x073c98,1, -0x073c94,1, -0x073c90,1, -0x073c8c,1, -0x073c88,1, -0x073c84,1, -0x073c80,1, -0x073c7c,1, -0x073c78,1, -0x073c74,1, -0x073c70,1, -0x073c6c,1, -0x073c68,1, -0x073c64,1, -0x073c60,1, -0x073c5c,1, -0x073c58,1, -0x073c54,1, -0x073c50,1, -0x073c4c,1, -0x073c48,1, -0x073c44,1, -0x073c40,1, -0x073c3c,1, -0x073c38,1, -0x073c34,1, -0x073c30,1, -0x073c2c,1, -0x073c28,1, -0x073c24,1, -0x073c20,1, -0x073c1c,1, -0x073c18,1, -0x073c14,1, -0x073c10,1, -0x073c0c,1, -0x073c08,1, -0x073c04,1, -0x073c00,1, -0x073bfc,1, -0x073bf8,1, -0x073bf4,1, -0x073bf0,1, -0x073bec,1, -0x073be8,1, -0x073be4,1, -0x073be0,1, -0x073bdc,1, -0x073bd8,1, -0x073bd4,1, -0x073bd0,1, -0x073bcc,1, -0x073bc8,1, -0x073bc4,1, -0x073bc0,1, -0x073bbc,1, -0x073bb8,1, -0x073bb4,1, -0x073bb0,1, -0x073bac,1, -0x073ba8,1, -0x073ba4,1, -0x073ba0,1, -0x073b9c,1, -0x073b98,1, -0x073b94,1, -0x073b90,1, -0x073b8c,1, -0x073b88,1, -0x073b84,1, -0x073b80,1, -0x073b7c,1, -0x073b78,1, -0x073b74,1, -0x073b70,1, -0x073b6c,1, -0x073b68,1, -0x073b64,1, -0x073b60,1, -0x073b5c,1, -0x073b58,1, -0x073b54,1, -0x073b50,1, -0x073b4c,1, -0x073b48,1, -0x073b44,1, -0x073b40,1, -0x073b3c,1, -0x073b38,1, -0x073b34,1, -0x073b30,1, -0x073b2c,1, -0x073b28,1, -0x073b24,1, -0x073b20,1, -0x073b1c,1, -0x073b18,1, -0x073b14,1, -0x073b10,1, -0x073b0c,1, -0x073b08,1, -0x073b04,1, -0x073b00,1, -0x073afc,1, -0x073af8,1, -0x073af4,1, -0x073af0,1, -0x073aec,1, -0x073ae8,1, -0x073ae4,1, -0x073ae0,1, -0x073adc,1, -0x073ad8,1, -0x073ad4,1, -0x073ad0,1, -0x073acc,1, -0x073ac8,1, -0x073ac4,1, -0x073ac0,1, -0x073abc,1, -0x073ab8,1, -0x073ab4,1, -0x073ab0,1, -0x073aac,1, -0x073aa8,1, -0x073aa4,1, -0x073aa0,1, -0x073a9c,1, -0x073a98,1, -0x073a94,1, -0x073a90,1, -0x073a8c,1, -0x073a88,1, -0x073a84,1, -0x073a80,1, -0x073a7c,1, -0x073a78,1, -0x073a74,1, -0x073a70,1, -0x073a6c,1, -0x073a68,1, -0x073a64,1, -0x073a60,1, -0x073a5c,1, -0x073a58,1, -0x073a54,1, -0x073a50,1, -0x073a4c,1, -0x073a48,1, -0x073a44,1, -0x073a40,1, -0x073a3c,1, -0x073a38,1, -0x073a34,1, -0x073a30,1, -0x073a2c,1, -0x073a28,1, -0x073a24,1, -0x073a20,1, -0x073a1c,1, -0x073a18,1, -0x073a14,1, -0x073a10,1, -0x073a0c,1, -0x073a08,1, -0x073a04,1, -0x073a00,1, -0x0739fc,1, -0x0739f8,1, -0x0739f4,1, -0x0739f0,1, -0x0739ec,1, -0x0739e8,1, -0x0739e4,1, -0x0739e0,1, -0x0739dc,1, -0x0739d8,1, -0x0739d4,1, -0x0739d0,1, -0x0739cc,1, -0x0739c8,1, -0x0739c4,1, -0x0739c0,1, -0x0739bc,1, -0x0739b8,1, -0x0739b4,1, -0x0739b0,1, -0x0739ac,1, -0x0739a8,1, -0x0739a4,1, -0x0739a0,1, -0x07399c,1, -0x073998,1, -0x073994,1, -0x073990,1, -0x07398c,1, -0x073988,1, -0x073984,1, -0x073980,1, -0x07397c,1, -0x073978,1, -0x073974,1, -0x073970,1, -0x07396c,1, -0x073968,1, -0x073964,1, -0x073960,1, -0x07395c,1, -0x073958,1, -0x073954,1, -0x073950,1, -0x07394c,1, -0x073948,1, -0x073944,1, -0x073940,1, -0x07393c,1, -0x073938,1, -0x073934,1, -0x073930,1, -0x07392c,1, -0x073928,1, -0x073924,1, -0x073920,1, -0x07391c,1, -0x073918,1, -0x073914,1, -0x073910,1, -0x07390c,1, -0x073908,1, -0x073904,1, -0x073900,1, -0x0738fc,1, -0x0738f8,1, -0x0738f4,1, -0x0738f0,1, -0x0738ec,1, -0x0738e8,1, -0x0738e4,1, -0x0738e0,1, -0x0738dc,1, -0x0738d8,1, -0x0738d4,1, -0x0738d0,1, -0x0738cc,1, -0x0738c8,1, -0x0738c4,1, -0x0738c0,1, -0x0738bc,1, -0x0738b8,1, -0x0738b4,1, -0x0738b0,1, -0x0738ac,1, -0x0738a8,1, -0x0738a4,1, -0x0738a0,1, -0x07389c,1, -0x073898,1, -0x073894,1, -0x073890,1, -0x07388c,1, -0x073888,1, -0x073884,1, -0x073880,1, -0x07387c,1, -0x073878,1, -0x073874,1, -0x073870,1, -0x07386c,1, -0x073868,1, -0x073864,1, -0x073860,1, -0x07385c,1, -0x073858,1, -0x073854,1, -0x073850,1, -0x07384c,1, -0x073848,1, -0x073844,1, -0x073840,1, -0x07383c,1, -0x073838,1, -0x073834,1, -0x073830,1, -0x07382c,1, -0x073828,1, -0x073824,1, -0x073820,1, -0x07381c,1, -0x073818,1, -0x073814,1, -0x073810,1, -0x07380c,1, -0x073808,1, -0x073804,1, -0x073800,1, -0x07350c,1, -0x073508,1, -0x073504,1, -0x073500,1, -0x0734fc,1, -0x0734f8,1, -0x0734f4,1, -0x0734f0,1, -0x0734ec,1, -0x0734e8,1, -0x0734e4,1, -0x0734e0,1, -0x0734dc,1, -0x0734d8,1, -0x0734d4,1, -0x0734d0,1, -0x0734cc,1, -0x0734c8,1, -0x0734c4,1, -0x0734c0,1, -0x0734bc,1, -0x0734b8,1, -0x0734b4,1, -0x0734b0,1, -0x0734ac,1, -0x0734a8,1, -0x0734a4,1, -0x0734a0,1, -0x07349c,1, -0x073498,1, -0x073494,1, -0x073490,1, -0x07348c,1, -0x073488,1, -0x073484,1, -0x073480,1, -0x07347c,1, -0x073478,1, -0x073474,1, -0x073470,1, -0x07346c,1, -0x073468,1, -0x073464,1, -0x073460,1, -0x07345c,1, -0x073458,1, -0x073454,1, -0x073450,1, -0x07344c,1, -0x073448,1, -0x073444,1, -0x073440,1, -0x07343c,1, -0x073438,1, -0x073434,1, -0x073430,1, -0x07342c,1, -0x073428,1, -0x073424,1, -0x073420,1, -0x07341c,1, -0x073418,1, -0x073414,1, -0x073410,1, -0x07340c,1, -0x073408,1, -0x073404,1, -0x073400,1, -0x0733fc,1, -0x0733f8,1, -0x0733f4,1, -0x0733f0,1, -0x0733ec,1, -0x0733e8,1, -0x0733e4,1, -0x0733e0,1, -0x0733dc,1, -0x0733d8,1, -0x0733d4,1, -0x0733d0,1, -0x0733cc,1, -0x0733c8,1, -0x0733c4,1, -0x0733c0,1, -0x0733bc,1, -0x0733b8,1, -0x0733b4,1, -0x0733b0,1, -0x0733ac,1, -0x0733a8,1, -0x0733a4,1, -0x0733a0,1, -0x07339c,1, -0x073398,1, -0x073394,1, -0x073390,1, -0x07338c,1, -0x073388,1, -0x073384,1, -0x073380,1, -0x07337c,1, -0x073378,1, -0x073374,1, -0x073370,1, -0x07336c,1, -0x073368,1, -0x073364,1, -0x073360,1, -0x07335c,1, -0x073358,1, -0x073354,1, -0x073350,1, -0x07334c,1, -0x073348,1, -0x073344,1, -0x073340,1, -0x07333c,1, -0x073338,1, -0x073334,1, -0x073330,1, -0x07332c,1, -0x073328,1, -0x073324,1, -0x073320,1, -0x07331c,1, -0x073318,1, -0x073314,1, -0x073310,1, -0x07330c,1, -0x073308,1, -0x073304,1, -0x073300,1, -0x0732fc,1, -0x0732f8,1, -0x0732f4,1, -0x0732f0,1, -0x0732ec,1, -0x0732e8,1, -0x0732e4,1, -0x0732e0,1, -0x0732dc,1, -0x0732d8,1, -0x0732d4,1, -0x0732d0,1, -0x0732cc,1, -0x0732c8,1, -0x0732c4,1, -0x0732c0,1, -0x0732bc,1, -0x0732b8,1, -0x0732b4,1, -0x0732b0,1, -0x0732ac,1, -0x0732a8,1, -0x0732a4,1, -0x0732a0,1, -0x07329c,1, -0x073298,1, -0x073294,1, -0x073290,1, -0x07328c,1, -0x073288,1, -0x073284,1, -0x073280,1, -0x07327c,1, -0x073278,1, -0x073274,1, -0x073270,1, -0x07326c,1, -0x073268,1, -0x073264,1, -0x073260,1, -0x07325c,1, -0x073258,1, -0x073254,1, -0x073250,1, -0x07324c,1, -0x073248,1, -0x073244,1, -0x073240,1, -0x07323c,1, -0x073238,1, -0x073234,1, -0x073230,1, -0x07322c,1, -0x073228,1, -0x073224,1, -0x073220,1, -0x07321c,1, -0x073218,1, -0x073214,1, -0x073210,1, -0x07320c,1, -0x073208,1, -0x073204,1, -0x073200,1, -0x0731fc,1, -0x0731f8,1, -0x0731f4,1, -0x0731f0,1, -0x0731ec,1, -0x0731e8,1, -0x0731e4,1, -0x0731e0,1, -0x0731dc,1, -0x0731d8,1, -0x0731d4,1, -0x0731d0,1, -0x0731cc,1, -0x0731c8,1, -0x0731c4,1, -0x0731c0,1, -0x0731bc,1, -0x0731b8,1, -0x0731b4,1, -0x0731b0,1, -0x0731ac,1, -0x0731a8,1, -0x0731a4,1, -0x0731a0,1, -0x07319c,1, -0x073198,1, -0x073194,1, -0x073190,1, -0x07318c,1, -0x073188,1, -0x073184,1, -0x073180,1, -0x07317c,1, -0x073178,1, -0x073174,1, -0x073170,1, -0x07316c,1, -0x073168,1, -0x073164,1, -0x073160,1, -0x07315c,1, -0x073158,1, -0x073154,1, -0x073150,1, -0x07314c,1, -0x073148,1, -0x073144,1, -0x073140,1, -0x07313c,1, -0x073138,1, -0x073134,1, -0x073130,1, -0x07312c,1, -0x073128,1, -0x073124,1, -0x073120,1, -0x07311c,1, -0x073118,1, -0x073114,1, -0x073110,1, -0x07310c,1, -0x073108,1, -0x073104,1, -0x073100,1, -0x0730fc,1, -0x0730f8,1, -0x0730f4,1, -0x0730f0,1, -0x0730ec,1, -0x0730e8,1, -0x0730e4,1, -0x0730e0,1, -0x0730dc,1, -0x0730d8,1, -0x0730d4,1, -0x0730d0,1, -0x0730cc,1, -0x0730c8,1, -0x0730c4,1, -0x0730c0,1, -0x0730bc,1, -0x0730b8,1, -0x0730b4,1, -0x0730b0,1, -0x0730ac,1, -0x0730a8,1, -0x0730a4,1, -0x0730a0,1, -0x07309c,1, -0x073098,1, -0x073094,1, -0x073090,1, -0x07308c,1, -0x073088,1, -0x073084,1, -0x073080,1, -0x07307c,1, -0x073078,1, -0x073074,1, -0x073070,1, -0x07306c,1, -0x073068,1, -0x073064,1, -0x073060,1, -0x07305c,1, -0x073058,1, -0x073054,1, -0x073050,1, -0x07304c,1, -0x073048,1, -0x073044,1, -0x073040,1, -0x07303c,1, -0x073038,1, -0x073034,1, -0x073030,1, -0x07302c,1, -0x073028,1, -0x073024,1, -0x073020,1, -0x07301c,1, -0x073018,1, -0x073014,1, -0x073010,1, -0x07300c,1, -0x073008,1, -0x073004,1, -0x073000,1, -0x072018,1, -0x072014,1, -0x072010,1, -0x07200c,1, -0x072008,1, -0x072004,1, -0x072000,1, -0x071018,1, -0x071014,1, -0x071010,1, -0x07100c,1, -0x071008,1, -0x071004,1, -0x071000,1, -0x070e18,1, -0x070e14,1, -0x070e10,1, -0x070e0c,1, -0x070e08,1, -0x070e04,1, -0x070e00,1, -0x070db4,1, -0x070db0,1, -0x070da0,1, -0x070d94,1, -0x070d90,1, -0x070d80,1, -0x070d74,1, -0x070d70,1, -0x070d60,1, -0x070d54,1, -0x070d50,1, -0x070d40,1, -0x070d30,1, -0x070d2c,1, -0x070d28,1, -0x070d1c,1, -0x070d18,1, -0x070d14,1, -0x070d10,1, -0x070d0c,1, -0x070c44,1, -0x070c40,1, -0x0702f4,1, -0x0702f0,1, -0x0702ec,1, -0x0702e8,1, -0x0702e4,1, -0x0702e0,1, -0x0702dc,1, -0x0702d8,1, -0x0702d4,1, -0x0702d0,1, -0x0702cc,1, -0x0702c8,1, -0x0702c4,1, -0x0702c0,1, -0x0702b4,1, -0x0702b0,1, -0x0702a0,1, -0x070290,1, -0x07028c,1, -0x070288,1, -0x070284,1, -0x070280,1, -0x07027c,1, -0x070278,1, -0x070274,1, -0x070270,1, -0x07026c,1, -0x070268,1, -0x070264,1, -0x070260,1, -0x07025c,1, -0x070258,1, -0x070254,1, -0x070250,1, -0x07023c,1, -0x070238,1, -0x070234,1, -0x070230,1, -0x07022c,1, -0x070224,1, -0x070220,1, -0x07021c,1, -0x070210,1, -0x070208,1, -0x070204,1, -0x070200,1, -0x0701b4,1, -0x0701b0,1, -0x0701a0,1, -0x07018c,1, -0x070188,1, -0x070184,1, -0x070180,1, -0x070150,1, -0x07014c,1, -0x070148,1, -0x070144,1, -0x070140,1, -0x070130,1, -0x07012c,1, -0x070128,1, -0x070120,1, -0x07011c,1, -0x070118,1, -0x070114,1, -0x070110,1, -0x07010c,1, -0x070104,1, -0x0700fc,1, -0x0700f8,1, -0x0700f4,1, -0x0700f0,1, -0x070094,1, -0x070090,1, -0x070080,1, -0x070074,1, -0x070070,1, -0x070060,1, -0x070054,1, -0x070050,1, -0x070040,1, -0x070028,1, -0x070020,1, -0x07001c,1, -0x070018,1, -0x070010,1, -0x07000c,1, -0x070004,1, -0x070000,1, -0x060000,0, -0x0577fc,1,UNKNOWN -0x0577f8,1,UNKNOWN -0x057208,1,UNKNOWN -0x057204,1,UNKNOWN -0x057200,1,UNKNOWN -0x057100,1,UNKNOWN -0x057020,1,UNKNOWN -0x057000,1,UNKNOWN -0x056ff0,1,UNKNOWN -0x056fe0,1,UNKNOWN -0x056fd0,1,UNKNOWN -0x056fc0,1,UNKNOWN -0x056fb0,1,UNKNOWN -0x056fa0,1,UNKNOWN -0x056f90,1,UNKNOWN -0x056f80,1,UNKNOWN -0x056f70,1,UNKNOWN -0x056f60,1,UNKNOWN -0x056f50,1,UNKNOWN -0x056f40,1,UNKNOWN -0x056f30,1,UNKNOWN -0x056f20,1,UNKNOWN -0x056f10,1,UNKNOWN -0x056f00,1,UNKNOWN -0x056ef0,1,UNKNOWN -0x056ee0,1,UNKNOWN -0x056ed0,1,UNKNOWN -0x056ec0,1,UNKNOWN -0x056eb0,1,UNKNOWN -0x056ea0,1,UNKNOWN -0x056e90,1,UNKNOWN -0x056e80,1,UNKNOWN -0x056e70,1,UNKNOWN -0x056e60,1,UNKNOWN -0x056e50,1,UNKNOWN -0x056e40,1,UNKNOWN -0x056e30,1,UNKNOWN -0x056e20,1,UNKNOWN -0x056e10,1,UNKNOWN -0x056e00,1,UNKNOWN -0x056df0,1,UNKNOWN -0x056de0,1,UNKNOWN -0x056dd0,1,UNKNOWN -0x056dc0,1,UNKNOWN -0x056db0,1,UNKNOWN -0x056da0,1,UNKNOWN -0x056d90,1,UNKNOWN -0x056d80,1,UNKNOWN -0x056d70,1,UNKNOWN -0x056d60,1,UNKNOWN -0x056d50,1,UNKNOWN -0x056d40,1,UNKNOWN -0x056d30,1,UNKNOWN -0x056d20,1,UNKNOWN -0x056d10,1,UNKNOWN -0x056d00,1,UNKNOWN -0x056cf0,1,UNKNOWN -0x056ce0,1,UNKNOWN -0x056cd0,1,UNKNOWN -0x056cc0,1,UNKNOWN -0x056cb0,1,UNKNOWN -0x056ca0,1,UNKNOWN -0x056c90,1,UNKNOWN -0x056c80,1,UNKNOWN -0x056c70,1,UNKNOWN -0x056c60,1,UNKNOWN -0x056c50,1,UNKNOWN -0x056c40,1,UNKNOWN -0x056c30,1,UNKNOWN -0x056c20,1,UNKNOWN -0x056c10,1,UNKNOWN -0x056c00,1,UNKNOWN -0x056bf0,1,UNKNOWN -0x056be0,1,UNKNOWN -0x056bd0,1,UNKNOWN -0x056bc0,1,UNKNOWN -0x056bb0,1,UNKNOWN -0x056ba0,1,UNKNOWN -0x056b90,1,UNKNOWN -0x056b80,1,UNKNOWN -0x056b70,1,UNKNOWN -0x056b60,1,UNKNOWN -0x056b50,1,UNKNOWN -0x056b40,1,UNKNOWN -0x056b30,1,UNKNOWN -0x056b20,1,UNKNOWN -0x056b10,1,UNKNOWN -0x056b00,1,UNKNOWN -0x056af0,1,UNKNOWN -0x056ae0,1,UNKNOWN -0x056ad0,1,UNKNOWN -0x056ac0,1,UNKNOWN -0x056ab0,1,UNKNOWN -0x056aa0,1,UNKNOWN -0x056a90,1,UNKNOWN -0x056a80,1,UNKNOWN -0x056a70,1,UNKNOWN -0x056a60,1,UNKNOWN -0x056a50,1,UNKNOWN -0x056a40,1,UNKNOWN -0x056a30,1,UNKNOWN -0x056a20,1,UNKNOWN -0x056a10,1,UNKNOWN -0x056a00,1,UNKNOWN -0x0569f0,1,UNKNOWN -0x0569e0,1,UNKNOWN -0x0569d0,1,UNKNOWN -0x0569c0,1,UNKNOWN -0x0569b0,1,UNKNOWN -0x0569a0,1,UNKNOWN -0x056990,1,UNKNOWN -0x056980,1,UNKNOWN -0x056970,1,UNKNOWN -0x056960,1,UNKNOWN -0x056950,1,UNKNOWN -0x056940,1,UNKNOWN -0x056930,1,UNKNOWN -0x056920,1,UNKNOWN -0x056910,1,UNKNOWN -0x056900,1,UNKNOWN -0x0568f0,1,UNKNOWN -0x0568e0,1,UNKNOWN -0x0568d0,1,UNKNOWN -0x0568c0,1,UNKNOWN -0x0568b0,1,UNKNOWN -0x0568a0,1,UNKNOWN -0x056890,1,UNKNOWN -0x056880,1,UNKNOWN -0x056870,1,UNKNOWN -0x056860,1,UNKNOWN -0x056850,1,UNKNOWN -0x056840,1,UNKNOWN -0x056830,1,UNKNOWN -0x056820,1,UNKNOWN -0x056810,1,UNKNOWN -0x056800,1,UNKNOWN -0x0567f0,1,UNKNOWN -0x0567e0,1,UNKNOWN -0x0567d0,1,UNKNOWN -0x0567c0,1,UNKNOWN -0x0567b0,1,UNKNOWN -0x0567a0,1,UNKNOWN -0x056790,1,UNKNOWN -0x056780,1,UNKNOWN -0x056770,1,UNKNOWN -0x056760,1,UNKNOWN -0x056750,1,UNKNOWN -0x056740,1,UNKNOWN -0x056730,1,UNKNOWN -0x056720,1,UNKNOWN -0x056710,1,UNKNOWN -0x056700,1,UNKNOWN -0x0566f0,1,UNKNOWN -0x0566e0,1,UNKNOWN -0x0566d0,1,UNKNOWN -0x0566c0,1,UNKNOWN -0x0566b0,1,UNKNOWN -0x0566a0,1,UNKNOWN -0x056690,1,UNKNOWN -0x056680,1,UNKNOWN -0x056670,1,UNKNOWN -0x056660,1,UNKNOWN -0x056650,1,UNKNOWN -0x056640,1,UNKNOWN -0x056630,1,UNKNOWN -0x056620,1,UNKNOWN -0x056610,1,UNKNOWN -0x056600,1,UNKNOWN -0x0565f0,1,UNKNOWN -0x0565e0,1,UNKNOWN -0x0565d0,1,UNKNOWN -0x0565c0,1,UNKNOWN -0x0565b0,1,UNKNOWN -0x0565a0,1,UNKNOWN -0x056590,1,UNKNOWN -0x056580,1,UNKNOWN -0x056570,1,UNKNOWN -0x056560,1,UNKNOWN -0x056550,1,UNKNOWN -0x056540,1,UNKNOWN -0x056530,1,UNKNOWN -0x056520,1,UNKNOWN -0x056510,1,UNKNOWN -0x056500,1,UNKNOWN -0x0564f0,1,UNKNOWN -0x0564e0,1,UNKNOWN -0x0564d0,1,UNKNOWN -0x0564c0,1,UNKNOWN -0x0564b0,1,UNKNOWN -0x0564a0,1,UNKNOWN -0x056490,1,UNKNOWN -0x056480,1,UNKNOWN -0x056470,1,UNKNOWN -0x056460,1,UNKNOWN -0x056450,1,UNKNOWN -0x056440,1,UNKNOWN -0x056430,1,UNKNOWN -0x056420,1,UNKNOWN -0x056410,1,UNKNOWN -0x056400,1,UNKNOWN -0x0563f0,1,UNKNOWN -0x0563e0,1,UNKNOWN -0x0563d0,1,UNKNOWN -0x0563c0,1,UNKNOWN -0x0563b0,1,UNKNOWN -0x0563a0,1,UNKNOWN -0x056390,1,UNKNOWN -0x056380,1,UNKNOWN -0x056370,1,UNKNOWN -0x056360,1,UNKNOWN -0x056350,1,UNKNOWN -0x056340,1,UNKNOWN -0x056330,1,UNKNOWN -0x056320,1,UNKNOWN -0x056310,1,UNKNOWN -0x056300,1,UNKNOWN -0x0562f0,1,UNKNOWN -0x0562e0,1,UNKNOWN -0x0562d0,1,UNKNOWN -0x0562c0,1,UNKNOWN -0x0562b0,1,UNKNOWN -0x0562a0,1,UNKNOWN -0x056290,1,UNKNOWN -0x056280,1,UNKNOWN -0x056270,1,UNKNOWN -0x056260,1,UNKNOWN -0x056250,1,UNKNOWN -0x056240,1,UNKNOWN -0x056230,1,UNKNOWN -0x056220,1,UNKNOWN -0x056210,1,UNKNOWN -0x056200,1,UNKNOWN -0x0561f0,1,UNKNOWN -0x0561e0,1,UNKNOWN -0x0561d0,1,UNKNOWN -0x0561c0,1,UNKNOWN -0x0561b0,1,UNKNOWN -0x0561a0,1,UNKNOWN -0x056190,1,UNKNOWN -0x056180,1,UNKNOWN -0x056170,1,UNKNOWN -0x056160,1,UNKNOWN -0x056150,1,UNKNOWN -0x056140,1,UNKNOWN -0x056130,1,UNKNOWN -0x056120,1,UNKNOWN -0x056110,1,UNKNOWN -0x056100,1,UNKNOWN -0x0560f0,1,UNKNOWN -0x0560e0,1,UNKNOWN -0x0560d0,1,UNKNOWN -0x0560c0,1,UNKNOWN -0x0560b0,1,UNKNOWN -0x0560a0,1,UNKNOWN -0x056090,1,UNKNOWN -0x056080,1,UNKNOWN -0x056070,1,UNKNOWN -0x056060,1,UNKNOWN -0x056050,1,UNKNOWN -0x056040,1,UNKNOWN -0x056030,1,UNKNOWN -0x056020,1,UNKNOWN -0x056010,1,UNKNOWN -0x05600c,1,UNKNOWN -0x056008,1,UNKNOWN -0x056004,1,UNKNOWN -0x056000,1,UNKNOWN -0x055000,1,UNKNOWN -0x054ff0,1,UNKNOWN -0x054fe0,1,UNKNOWN -0x054fd0,1,UNKNOWN -0x054fc0,1,UNKNOWN -0x054fb0,1,UNKNOWN -0x054fa0,1,UNKNOWN -0x054f90,1,UNKNOWN -0x054f80,1,UNKNOWN -0x054f70,1,UNKNOWN -0x054f60,1,UNKNOWN -0x054f50,1,UNKNOWN -0x054f40,1,UNKNOWN -0x054f30,1,UNKNOWN -0x054f20,1,UNKNOWN -0x054f10,1,UNKNOWN -0x054f00,1,UNKNOWN -0x054ef0,1,UNKNOWN -0x054ee0,1,UNKNOWN -0x054ed0,1,UNKNOWN -0x054ec0,1,UNKNOWN -0x054eb0,1,UNKNOWN -0x054ea0,1,UNKNOWN -0x054e90,1,UNKNOWN -0x054e80,1,UNKNOWN -0x054e70,1,UNKNOWN -0x054e60,1,UNKNOWN -0x054e50,1,UNKNOWN -0x054e40,1,UNKNOWN -0x054e30,1,UNKNOWN -0x054e20,1,UNKNOWN -0x054e10,1,UNKNOWN -0x054e00,1,UNKNOWN -0x054df0,1,UNKNOWN -0x054de0,1,UNKNOWN -0x054dd0,1,UNKNOWN -0x054dc0,1,UNKNOWN -0x054db0,1,UNKNOWN -0x054da0,1,UNKNOWN -0x054d90,1,UNKNOWN -0x054d80,1,UNKNOWN -0x054d70,1,UNKNOWN -0x054d60,1,UNKNOWN -0x054d50,1,UNKNOWN -0x054d40,1,UNKNOWN -0x054d30,1,UNKNOWN -0x054d20,1,UNKNOWN -0x054d10,1,UNKNOWN -0x054d00,1,UNKNOWN -0x054cf0,1,UNKNOWN -0x054ce0,1,UNKNOWN -0x054cd0,1,UNKNOWN -0x054cc0,1,UNKNOWN -0x054cb0,1,UNKNOWN -0x054ca0,1,UNKNOWN -0x054c90,1,UNKNOWN -0x054c80,1,UNKNOWN -0x054c70,1,UNKNOWN -0x054c60,1,UNKNOWN -0x054c50,1,UNKNOWN -0x054c40,1,UNKNOWN -0x054c30,1,UNKNOWN -0x054c20,1,UNKNOWN -0x054c10,1,UNKNOWN -0x054c00,1,UNKNOWN -0x054bf0,1,UNKNOWN -0x054be0,1,UNKNOWN -0x054bd0,1,UNKNOWN -0x054bc0,1,UNKNOWN -0x054bb0,1,UNKNOWN -0x054ba0,1,UNKNOWN -0x054b90,1,UNKNOWN -0x054b80,1,UNKNOWN -0x054b70,1,UNKNOWN -0x054b60,1,UNKNOWN -0x054b50,1,UNKNOWN -0x054b40,1,UNKNOWN -0x054b30,1,UNKNOWN -0x054b20,1,UNKNOWN -0x054b10,1,UNKNOWN -0x054b00,1,UNKNOWN -0x054af0,1,UNKNOWN -0x054ae0,1,UNKNOWN -0x054ad0,1,UNKNOWN -0x054ac0,1,UNKNOWN -0x054ab0,1,UNKNOWN -0x054aa0,1,UNKNOWN -0x054a90,1,UNKNOWN -0x054a80,1,UNKNOWN -0x054a70,1,UNKNOWN -0x054a60,1,UNKNOWN -0x054a50,1,UNKNOWN -0x054a40,1,UNKNOWN -0x054a30,1,UNKNOWN -0x054a20,1,UNKNOWN -0x054a10,1,UNKNOWN -0x054a00,1,UNKNOWN -0x0549f0,1,UNKNOWN -0x0549e0,1,UNKNOWN -0x0549d0,1,UNKNOWN -0x0549c0,1,UNKNOWN -0x0549b0,1,UNKNOWN -0x0549a0,1,UNKNOWN -0x054990,1,UNKNOWN -0x054980,1,UNKNOWN -0x054970,1,UNKNOWN -0x054960,1,UNKNOWN -0x054950,1,UNKNOWN -0x054940,1,UNKNOWN -0x054930,1,UNKNOWN -0x054920,1,UNKNOWN -0x054910,1,UNKNOWN -0x054900,1,UNKNOWN -0x0548f0,1,UNKNOWN -0x0548e0,1,UNKNOWN -0x0548d0,1,UNKNOWN -0x0548c0,1,UNKNOWN -0x0548b0,1,UNKNOWN -0x0548a0,1,UNKNOWN -0x054890,1,UNKNOWN -0x054880,1,UNKNOWN -0x054870,1,UNKNOWN -0x054860,1,UNKNOWN -0x054850,1,UNKNOWN -0x054840,1,UNKNOWN -0x054830,1,UNKNOWN -0x054820,1,UNKNOWN -0x054810,1,UNKNOWN -0x054800,1,UNKNOWN -0x0547f0,1,UNKNOWN -0x0547e0,1,UNKNOWN -0x0547d0,1,UNKNOWN -0x0547c0,1,UNKNOWN -0x0547b0,1,UNKNOWN -0x0547a0,1,UNKNOWN -0x054790,1,UNKNOWN -0x054780,1,UNKNOWN -0x054770,1,UNKNOWN -0x054760,1,UNKNOWN -0x054750,1,UNKNOWN -0x054740,1,UNKNOWN -0x054730,1,UNKNOWN -0x054720,1,UNKNOWN -0x054710,1,UNKNOWN -0x054700,1,UNKNOWN -0x0546f0,1,UNKNOWN -0x0546e0,1,UNKNOWN -0x0546d0,1,UNKNOWN -0x0546c0,1,UNKNOWN -0x0546b0,1,UNKNOWN -0x0546a0,1,UNKNOWN -0x054690,1,UNKNOWN -0x054680,1,UNKNOWN -0x054670,1,UNKNOWN -0x054660,1,UNKNOWN -0x054650,1,UNKNOWN -0x054640,1,UNKNOWN -0x054630,1,UNKNOWN -0x054620,1,UNKNOWN -0x054610,1,UNKNOWN -0x054600,1,UNKNOWN -0x0545f0,1,UNKNOWN -0x0545e0,1,UNKNOWN -0x0545d0,1,UNKNOWN -0x0545c0,1,UNKNOWN -0x0545b0,1,UNKNOWN -0x0545a0,1,UNKNOWN -0x054590,1,UNKNOWN -0x054580,1,UNKNOWN -0x054570,1,UNKNOWN -0x054560,1,UNKNOWN -0x054550,1,UNKNOWN -0x054540,1,UNKNOWN -0x054530,1,UNKNOWN -0x054520,1,UNKNOWN -0x054510,1,UNKNOWN -0x054500,1,UNKNOWN -0x0544f0,1,UNKNOWN -0x0544e0,1,UNKNOWN -0x0544d0,1,UNKNOWN -0x0544c0,1,UNKNOWN -0x0544b0,1,UNKNOWN -0x0544a0,1,UNKNOWN -0x054490,1,UNKNOWN -0x054480,1,UNKNOWN -0x054470,1,UNKNOWN -0x054460,1,UNKNOWN -0x054450,1,UNKNOWN -0x054440,1,UNKNOWN -0x054430,1,UNKNOWN -0x054420,1,UNKNOWN -0x054410,1,UNKNOWN -0x054400,1,UNKNOWN -0x0543f0,1,UNKNOWN -0x0543e0,1,UNKNOWN -0x0543d0,1,UNKNOWN -0x0543c0,1,UNKNOWN -0x0543b0,1,UNKNOWN -0x0543a0,1,UNKNOWN -0x054390,1,UNKNOWN -0x054380,1,UNKNOWN -0x054370,1,UNKNOWN -0x054360,1,UNKNOWN -0x054350,1,UNKNOWN -0x054340,1,UNKNOWN -0x054330,1,UNKNOWN -0x054320,1,UNKNOWN -0x054310,1,UNKNOWN -0x054300,1,UNKNOWN -0x0542f0,1,UNKNOWN -0x0542e0,1,UNKNOWN -0x0542d0,1,UNKNOWN -0x0542c0,1,UNKNOWN -0x0542b0,1,UNKNOWN -0x0542a0,1,UNKNOWN -0x054290,1,UNKNOWN -0x054280,1,UNKNOWN -0x054270,1,UNKNOWN -0x054260,1,UNKNOWN -0x054250,1,UNKNOWN -0x054240,1,UNKNOWN -0x054230,1,UNKNOWN -0x054220,1,UNKNOWN -0x054210,1,UNKNOWN -0x054200,1,UNKNOWN -0x0541f0,1,UNKNOWN -0x0541e0,1,UNKNOWN -0x0541d0,1,UNKNOWN -0x0541c0,1,UNKNOWN -0x0541b0,1,UNKNOWN -0x0541a0,1,UNKNOWN -0x054190,1,UNKNOWN -0x054180,1,UNKNOWN -0x054170,1,UNKNOWN -0x054160,1,UNKNOWN -0x054150,1,UNKNOWN -0x054140,1,UNKNOWN -0x054130,1,UNKNOWN -0x054120,1,UNKNOWN -0x054110,1,UNKNOWN -0x054100,1,UNKNOWN -0x0540f0,1,UNKNOWN -0x0540e0,1,UNKNOWN -0x0540d0,1,UNKNOWN -0x0540c0,1,UNKNOWN -0x0540b0,1,UNKNOWN -0x0540a0,1,UNKNOWN -0x054090,1,UNKNOWN -0x054080,1,UNKNOWN -0x054070,1,UNKNOWN -0x054060,1,UNKNOWN -0x054050,1,UNKNOWN -0x054040,1,UNKNOWN -0x054030,1,UNKNOWN -0x054020,1,UNKNOWN -0x054010,1,UNKNOWN -0x05400c,1,UNKNOWN -0x054008,1,UNKNOWN -0x054004,1,UNKNOWN -0x054000,1,UNKNOWN -0x053ffc,1, -0x053f20,1, -0x053f1c,1, -0x053f18,1, -0x053f14,1, -0x053f10,1, -0x053f0c,1, -0x053f08,1, -0x053f04,1, -0x053ea8,1, -0x053ea4,1, -0x053ea0,1, -0x053e9c,1, -0x053e94,1, -0x053e90,1, -0x053e8c,1, -0x053e70,1, -0x053e6c,1, -0x053e64,1, -0x053e60,1, -0x053e3c,1, -0x053e38,1, -0x053e34,1, -0x053e30,1, -0x053e2c,1, -0x053e28,1, -0x053e24,1, -0x053e1c,1, -0x053e18,1, -0x053e14,1, -0x053e10,1, -0x053e0c,1, -0x053e08,1, -0x053e04,1, -0x053e00,1, -0x053d00,1, -0x053ca8,1, -0x053ca4,1, -0x053ca0,1, -0x053c9c,1, -0x053c94,1, -0x053c90,1, -0x053c8c,1, -0x053c70,1, -0x053c6c,1, -0x053c64,1, -0x053c60,1, -0x053c44,1, -0x053c40,1, -0x053c3c,1, -0x053c38,1, -0x053c34,1, -0x053c30,1, -0x053c2c,1, -0x053c28,1, -0x053c24,1, -0x053c1c,1, -0x053c18,1, -0x053c14,1, -0x053c10,1, -0x053c0c,1, -0x053c08,1, -0x053c04,1, -0x053c00,1, -0x051934,1, -0x051930,1, -0x05192c,1, -0x051928,1, -0x051924,1, -0x051920,1, -0x05191c,1, -0x051918,1, -0x051914,1, -0x051910,1, -0x05190c,1, -0x051908,1, -0x051904,1, -0x051900,1, -0x0518f4,1, -0x0518f0,1, -0x0518ec,1, -0x0518e8,1, -0x0518e4,1, -0x0518e0,1, -0x0518dc,1, -0x0518d8,1, -0x0518d4,1, -0x0518d0,1, -0x0518cc,1, -0x0518c8,1, -0x0518c4,1, -0x0518c0,1, -0x0518bc,1, -0x0518b8,1, -0x0518a0,1, -0x05189c,1, -0x051898,1, -0x051894,1, -0x051890,1, -0x05188c,1, -0x051888,1, -0x051884,1, -0x051844,1, -0x051840,1, -0x051834,1, -0x051830,1, -0x05182c,1, -0x051828,1, -0x051824,1, -0x051820,1, -0x051814,1, -0x051810,1, -0x05180c,1, -0x051808,1, -0x051804,1, -0x051800,1, -0x0517fc,1, -0x051170,1, -0x051168,1, -0x051164,1, -0x051160,1, -0x05114c,1, -0x051148,1, -0x051144,1, -0x051140,1, -0x05113c,1, -0x051134,1, -0x05112c,1, -0x051128,1, -0x051124,1, -0x051120,1, -0x05111c,1, -0x051118,1, -0x051114,1, -0x051110,1, -0x05110c,1, -0x051108,1, -0x051104,1, -0x051100,1, -0x050280,1, -0x05023c,1, -0x050238,1, -0x050234,1, -0x050230,1, -0x05022c,1, -0x050228,1, -0x050224,1, -0x050220,1, -0x05021c,1, -0x050218,1, -0x050214,1, -0x050210,1, -0x05020c,1, -0x050208,1, -0x050204,1, -0x050200,1, -0x0501d0,1, -0x0501cc,1, -0x0501c8,1, -0x0501c4,1, -0x0501c0,1, -0x0501bc,1, -0x0501b8,1, -0x050188,1, -0x050184,1, -0x050180,1, -0x05017c,1, -0x050178,1, -0x050174,1, -0x050170,1, -0x05016c,1, -0x050168,1, -0x050164,1, -0x050160,1, -0x05015c,1, -0x050158,1, -0x050148,1, -0x050144,1, -0x050140,1, -0x05013c,1, -0x050138,1, -0x050134,1, -0x050130,1, -0x050128,1, -0x050124,1, -0x050120,1, -0x05010c,1, -0x050108,1, -0x050104,1, -0x050100,1, -0x0500fc,1, -0x0500f8,1, -0x0500f4,1, -0x0500f0,1, -0x0500ec,1, -0x0500e8,1, -0x0500e4,1, -0x0500e0,1, -0x0500dc,1, -0x0500d8,1, -0x0500d4,1, -0x0500c4,1, -0x0500c0,1, -0x0500bc,1, -0x0500b8,1, -0x0500b4,1, -0x0500b0,1, -0x0500ac,1, -0x050068,1, -0x050064,1, -0x050060,1, -0x05004c,1, -0x050048,1, -0x050044,1, -0x050040,1, -0x04314c,1, -0x043148,1, -0x043144,1, -0x043140,1, -0x043118,1, -0x043114,1, -0x043110,1, -0x043104,1, -0x043100,1, -0x043048,1, -0x043044,1, -0x043040,1, -0x04303c,1, -0x043038,1, -0x043034,1, -0x043030,1, -0x04301c,1, -0x043018,1, -0x043014,1, -0x043010,1, -0x042ffc,1, -0x042ff8,1, -0x042ff4,1, -0x042fec,1, -0x042a04,1,UNKNOWN -0x042a00,1,UNKNOWN -0x0428a4,1,UNKNOWN -0x0428a0,1,UNKNOWN -0x04289c,1,UNKNOWN -0x042898,1,UNKNOWN -0x042894,1,UNKNOWN -0x042890,1,UNKNOWN -0x04288c,1,UNKNOWN -0x042888,1,UNKNOWN -0x042884,1,UNKNOWN -0x042880,1,UNKNOWN -0x04287c,1,UNKNOWN -0x042878,1,UNKNOWN -0x042874,1,UNKNOWN -0x042870,1,UNKNOWN -0x04286c,1,UNKNOWN -0x042868,1,UNKNOWN -0x042864,1,UNKNOWN -0x042860,1,UNKNOWN -0x04285c,1,UNKNOWN -0x042858,1,UNKNOWN -0x042854,1,UNKNOWN -0x042850,1,UNKNOWN -0x04284c,1,UNKNOWN -0x042848,1,UNKNOWN -0x042844,1,UNKNOWN -0x042840,1,UNKNOWN -0x04283c,1,UNKNOWN -0x042838,1,UNKNOWN -0x042834,1,UNKNOWN -0x042830,1,UNKNOWN -0x04282c,1,UNKNOWN -0x042828,1,UNKNOWN -0x042824,1,UNKNOWN -0x042820,1,UNKNOWN -0x04281c,1,UNKNOWN -0x042818,1,UNKNOWN -0x042814,1,UNKNOWN -0x042810,1,UNKNOWN -0x04280c,1,UNKNOWN -0x042808,1,UNKNOWN -0x042804,1,UNKNOWN -0x042800,1,UNKNOWN -0x042604,1,UNKNOWN -0x042600,1,UNKNOWN -0x0424a4,1,UNKNOWN -0x0424a0,1,UNKNOWN -0x04249c,1,UNKNOWN -0x042498,1,UNKNOWN -0x042494,1,UNKNOWN -0x042490,1,UNKNOWN -0x04248c,1,UNKNOWN -0x042488,1,UNKNOWN -0x042484,1,UNKNOWN -0x042480,1,UNKNOWN -0x04247c,1,UNKNOWN -0x042478,1,UNKNOWN -0x042474,1,UNKNOWN -0x042470,1,UNKNOWN -0x04246c,1,UNKNOWN -0x042468,1,UNKNOWN -0x042464,1,UNKNOWN -0x042460,1,UNKNOWN -0x04245c,1,UNKNOWN -0x042458,1,UNKNOWN -0x042454,1,UNKNOWN -0x042450,1,UNKNOWN -0x04244c,1,UNKNOWN -0x042448,1,UNKNOWN -0x042444,1,UNKNOWN -0x042440,1,UNKNOWN -0x04243c,1,UNKNOWN -0x042438,1,UNKNOWN -0x042434,1,UNKNOWN -0x042430,1,UNKNOWN -0x04242c,1,UNKNOWN -0x042428,1,UNKNOWN -0x042424,1,UNKNOWN -0x042420,1,UNKNOWN -0x04241c,1,UNKNOWN -0x042418,1,UNKNOWN -0x042414,1,UNKNOWN -0x042410,1,UNKNOWN -0x04240c,1,UNKNOWN -0x042408,1,UNKNOWN -0x042404,1,UNKNOWN -0x042400,1,UNKNOWN -0x042244,1,UNKNOWN -0x042240,1,UNKNOWN -0x04223c,1,UNKNOWN -0x042238,1,UNKNOWN -0x042234,1,UNKNOWN -0x042230,1,UNKNOWN -0x04222c,1,UNKNOWN -0x042228,1,UNKNOWN -0x042224,1,UNKNOWN -0x042220,1,UNKNOWN -0x04221c,1,UNKNOWN -0x042218,1,UNKNOWN -0x042214,1,UNKNOWN -0x042210,1,UNKNOWN -0x04220c,1,UNKNOWN -0x042208,1,UNKNOWN -0x042204,1,UNKNOWN -0x042200,1,UNKNOWN -0x04205c,1,UNKNOWN -0x042058,1,UNKNOWN -0x042054,1,UNKNOWN -0x042050,1,UNKNOWN -0x04204c,1,UNKNOWN -0x042048,1,UNKNOWN -0x042044,1,UNKNOWN -0x042040,1,UNKNOWN -0x04203c,1,UNKNOWN -0x042038,1,UNKNOWN -0x042034,1,UNKNOWN -0x042030,1,UNKNOWN -0x04202c,1,UNKNOWN -0x042028,1,UNKNOWN -0x042024,1,UNKNOWN -0x042020,1,UNKNOWN -0x04201c,1,UNKNOWN -0x042018,1,UNKNOWN -0x042014,1,UNKNOWN -0x042010,1,UNKNOWN -0x04200c,1,UNKNOWN -0x042008,1,UNKNOWN -0x042004,1,UNKNOWN -0x042000,1,UNKNOWN -0x0418c4,1, -0x0418c0,1, -0x0418bc,1, -0x0418b8,1, -0x0418b4,1, -0x0418b0,1, -0x0418ac,1, -0x0418a8,1, -0x0418a4,1, -0x0418a0,1, -0x04189c,1, -0x041898,1, -0x041894,1, -0x041890,1, -0x04188c,1, -0x041888,1, -0x041884,1, -0x041880,1, -0x041808,1, -0x041804,1, -0x041800,1, -0x040a9c,1, -0x040a80,1, -0x040a6c,1, -0x040a68,1, -0x040a64,1, -0x040a60,1, -0x040a5c,1, -0x040a40,1, -0x040a2c,1, -0x040a28,1, -0x040a24,1, -0x040a20,1, -0x040a1c,1, -0x040a00,1, -0x0409ec,1, -0x0409e8,1, -0x0409e4,1, -0x0409e0,1, -0x0409dc,1, -0x0409c0,1, -0x0409ac,1, -0x0409a8,1, -0x0409a4,1, -0x0409a0,1, -0x04099c,1, -0x040980,1, -0x04096c,1, -0x040968,1, -0x040964,1, -0x040960,1, -0x04095c,1, -0x040940,1, -0x04092c,1, -0x040928,1, -0x040924,1, -0x040920,1, -0x040914,1, -0x040910,1, -0x040900,1, -0x0408f4,1, -0x0408f0,1, -0x0408e0,1, -0x0408d4,1, -0x0408d0,1, -0x0408c0,1, -0x0408bc,1, -0x0408b8,1, -0x0408b4,1, -0x0408b0,1, -0x04088c,1, -0x040888,1, -0x040884,1, -0x04087c,1, -0x040874,1, -0x040870,1, -0x04086c,1, -0x040868,1, -0x040864,1, -0x040860,1, -0x04085c,1, -0x040858,1, -0x040854,1, -0x040850,1, -0x040844,1, -0x040824,1, -0x040820,1, -0x04081c,1, -0x040818,1, -0x040814,1, -0x040810,1, -0x04080c,1, -0x040808,1, -0x040804,1, -0x04061c,1, -0x040618,1, -0x040604,1, -0x0405fc,1, -0x0405f8,1, -0x0405f4,1, -0x0405f0,1, -0x0405ec,1, -0x0405e8,1, -0x0405e4,1, -0x0405e0,1, -0x0405dc,1, -0x0405d8,1, -0x0405d4,1, -0x0405d0,1, -0x0405cc,1, -0x0405c8,1, -0x0405c4,1, -0x0405c0,1, -0x0405bc,1, -0x0405b8,1, -0x0405b4,1, -0x0405b0,1, -0x0405ac,1, -0x0405a8,1, -0x0405a4,1, -0x0405a0,1, -0x04059c,1, -0x040598,1, -0x040594,1, -0x040590,1, -0x04058c,1, -0x040588,1, -0x040584,1, -0x040580,1, -0x04057c,1, -0x040578,1, -0x040574,1, -0x040570,1, -0x04056c,1, -0x040568,1, -0x040564,1, -0x040560,1, -0x04055c,1, -0x040558,1, -0x040554,1, -0x040550,1, -0x04054c,1, -0x040548,1, -0x040544,1, -0x040540,1, -0x04053c,1, -0x040538,1, -0x040534,1, -0x040530,1, -0x04052c,1, -0x040528,1, -0x040524,1, -0x040520,1, -0x04051c,1, -0x040518,1, -0x040514,1, -0x040510,1, -0x04050c,1, -0x040508,1, -0x040504,1, -0x040500,1, -0x0404fc,1, -0x0404f8,1, -0x0404f4,1, -0x0404f0,1, -0x0404ec,1, -0x0404e8,1, -0x0404e4,1, -0x0404e0,1, -0x0404dc,1, -0x0404d8,1, -0x0404d4,1, -0x0404d0,1, -0x0404cc,1, -0x0404c8,1, -0x0404c4,1, -0x0404c0,1, -0x0404bc,1, -0x0404b8,1, -0x0404b4,1, -0x0404b0,1, -0x0404ac,1, -0x0404a8,1, -0x0404a4,1, -0x0404a0,1, -0x04049c,1, -0x040498,1, -0x040494,1, -0x040490,1, -0x04048c,1, -0x040488,1, -0x040484,1, -0x040480,1, -0x04047c,1, -0x040478,1, -0x040474,1, -0x040470,1, -0x04046c,1, -0x040468,1, -0x040464,1, -0x040460,1, -0x04045c,1, -0x040458,1, -0x040454,1, -0x040450,1, -0x04044c,1, -0x040448,1, -0x040444,1, -0x040440,1, -0x04043c,1, -0x040438,1, -0x040434,1, -0x040430,1, -0x04042c,1, -0x040428,1, -0x040424,1, -0x040420,1, -0x04041c,1, -0x040418,1, -0x040414,1, -0x040410,1, -0x04040c,1, -0x040408,1, -0x040404,1, -0x040400,1, -0x0403f8,1, -0x0403f0,1, -0x0403ec,1, -0x0403e0,1, -0x040380,1, -0x0402dc,1, -0x0402d8,1, -0x0402d4,1, -0x0402d0,1, -0x0402cc,1, -0x0402c8,1, -0x0402c4,1, -0x0402c0,1, -0x0402bc,1, -0x0402b8,1, -0x0402b4,1, -0x0402b0,1, -0x0402ac,1, -0x0402a0,1, -0x04029c,1, -0x040290,1, -0x04028c,1, -0x040288,1, -0x040284,1, -0x040280,1, -0x04027c,1, -0x040278,1, -0x040274,1, -0x040270,1, -0x04026c,1, -0x040268,1, -0x040230,1, -0x04021c,1, -0x040204,1, -0x040200,1, -0x0401f8,1, -0x0401f0,1, -0x0401ec,1, -0x0401e0,1, -0x040180,1, -0x0400dc,1, -0x0400d8,1, -0x0400d4,1, -0x0400d0,1, -0x0400cc,1, -0x0400c8,1, -0x0400c4,1, -0x0400c0,1, -0x0400bc,1, -0x0400b8,1, -0x0400b4,1, -0x0400b0,1, -0x0400ac,1, -0x0400a0,1, -0x04009c,1, -0x040090,1, -0x04008c,1, -0x040088,1, -0x040084,1, -0x040080,1, -0x04007c,1, -0x040078,1, -0x040074,1, -0x040070,1, -0x04006c,1, -0x040068,1, -0x040030,1, -0x04001c,1, -0x040004,1, -0x040000,1, -0x02d9f4,1, -0x02d9f0,1, -0x02d9d4,1, -0x02d9d0,1, -0x02d9c0,1, -0x02d9b4,1, -0x02d9b0,1, -0x02d9a0,1, -0x02d994,1, -0x02d990,1, -0x02d980,1, -0x02d974,1, -0x02d970,1, -0x02d960,1, -0x02d954,1, -0x02d950,1, -0x02d940,1, -0x02d928,1, -0x02d924,1, -0x02d920,1, -0x02d91c,1, -0x02d918,1, -0x02d914,1, -0x02d910,1, -0x02d90c,1, -0x02d908,1, -0x02d904,1, -0x02d900,1, -0x02d8d4,1, -0x02d8d0,1, -0x02d8cc,1, -0x02d8c8,1, -0x02d8c4,1, -0x02d8c0,1, -0x02d8ac,1, -0x02d870,1, -0x02d86c,1, -0x02d868,1, -0x02d864,1, -0x02d860,1, -0x02d85c,1, -0x02d858,1, -0x02d854,1, -0x02d850,1, -0x02d84c,1, -0x02d848,1, -0x02d844,1, -0x02d840,1, -0x02d83c,1, -0x02d838,1, -0x02d834,1, -0x02d830,1, -0x02d82c,1, -0x02d828,1, -0x02d824,1, -0x02d820,1, -0x02d814,1, -0x02d810,1, -0x02d800,1, -0x02bb0c,1, -0x02bb08,1, -0x02bb04,1, -0x02bb00,1, -0x02baf4,1, -0x02baf0,1, -0x02ba74,1, -0x02ba70,1, -0x02ba60,1, -0x02ba54,1, -0x02ba50,1, -0x02ba40,1, -0x02ba28,1, -0x02ba1c,1, -0x02ba18,1, -0x02ba0c,1, -0x02ba00,1, -0x02b934,1, -0x02b930,1, -0x02b924,1, -0x02b920,1, -0x02b914,1, -0x02b910,1, -0x02b904,1, -0x02b900,1, -0x02b8f4,1, -0x02b8f0,1, -0x02b8e4,1, -0x02b8e0,1, -0x02b8b4,1, -0x02b8b0,1, -0x02b8ac,1, -0x02b8a8,1, -0x02b8a4,1, -0x02b8a0,1, -0x02b894,1, -0x02b890,1, -0x02b88c,1, -0x02b888,1, -0x02b884,1, -0x02b880,1, -0x02b870,1, -0x02b83c,1, -0x02b838,1, -0x02b834,1, -0x02b830,1, -0x02b82c,1, -0x02b828,1, -0x02b824,1, -0x02b820,1, -0x02b814,1, -0x02b810,1, -0x02b800,1, -0x02b7bc,1,UNKNOWN -0x02b7b8,1, -0x02b7b4,1, -0x02b67c,1, -0x02b678,1, -0x02b674,1, -0x02b670,1, -0x02b66c,1, -0x02b668,1, -0x02b664,1, -0x02b660,1, -0x02b65c,1, -0x02b658,1, -0x02b654,1, -0x02b64c,1, -0x02b648,1, -0x02b644,1, -0x02b640,1, -0x02b62c,1, -0x02b628,1, -0x02b624,1, -0x02b620,1, -0x02b61c,1, -0x02b618,1, -0x02b614,1, -0x02b610,1, -0x02b60c,1, -0x02b608,1, -0x02b604,1, -0x02b600,1, -0x02b4a0,1, -0x02b49c,1, -0x02b498,1, -0x02b494,1, -0x02b490,1, -0x02b48c,1, -0x02b488,1, -0x02b484,1, -0x02b480,1, -0x02b47c,1, -0x02b478,1, -0x02b474,1, -0x02b470,1, -0x02b46c,1, -0x02b464,1, -0x02b45c,1, -0x02b458,1, -0x02b454,1, -0x02b450,1, -0x02b44c,1, -0x02b448,1, -0x02b444,1, -0x02b440,1, -0x02b43c,1, -0x02b438,1, -0x02b424,1, -0x02b420,1, -0x02b41c,1, -0x02b418,1, -0x02b414,1, -0x02b410,1, -0x02b40c,1, -0x02b408,1, -0x02b404,1, -0x02b400,1, -0x02b040,1, -0x02b000,1, -0x02affc,1, -0x02aff8,1, -0x02aff4,1, -0x02afdc,1, -0x02afd4,1, -0x02afd0,1, -0x02afcc,1, -0x02afc8,1, -0x02afc4,1, -0x02afc0,1, -0x02afbc,1, -0x02afb8,1, -0x02afb4,1, -0x02afb0,1, -0x02afac,1, -0x02afa8,1, -0x02afa0,1, -0x02af9c,1, -0x02af98,1, -0x02af94,1, -0x02af90,1, -0x02af8c,1, -0x02af88,1, -0x02af84,1, -0x02af80,1, -0x02ae94,1, -0x02ae90,1, -0x02ae80,1, -0x02ae30,1, -0x02ae2c,1, -0x02ae28,1, -0x02ae24,1, -0x02ae20,1, -0x02ae1c,1, -0x02ae18,1, -0x02ae14,1, -0x02ae10,1, -0x02ae0c,1, -0x02ae04,1, -0x02ae00,1, -0x02adfc,1, -0x02adf8,1, -0x02adf4,1, -0x02adec,1, -0x02ade4,1, -0x02ade0,1, -0x02addc,1, -0x02add8,1, -0x02add4,1, -0x02adcc,1, -0x02adc8,1, -0x02adc0,1, -0x02adb8,1, -0x02adb4,1, -0x02adb0,1, -0x02ada8,1, -0x02ada4,1, -0x02ada0,1, -0x02ad80,1, -0x02ad7c,1, -0x02ad78,1, -0x02ad74,1, -0x02ad70,1, -0x02ad6c,1, -0x02ad68,1, -0x02ad64,1, -0x02ad60,1, -0x02ad5c,1, -0x02ad58,1, -0x02ad54,1, -0x02ad50,1, -0x02ad4c,1, -0x02ad48,1, -0x02ad44,1, -0x02ad40,1, -0x02ad34,1, -0x02ad30,1, -0x02ad20,1, -0x02ad14,1, -0x02ad10,1, -0x02ad00,1, -0x02acec,1, -0x02ace8,1, -0x02ace4,1, -0x02ace0,1, -0x02acdc,1, -0x02acd8,1, -0x02acd4,1, -0x02acd0,1, -0x02accc,1, -0x02acc8,1, -0x02ac90,1, -0x02ac8c,1, -0x02ac88,1, -0x02ac84,1, -0x02ac80,1, -0x02ac68,1, -0x02ac50,1, -0x02ac4c,1, -0x02ac24,1, -0x02ac20,1, -0x02ac1c,1, -0x02ac18,1, -0x02ac14,1, -0x02ac10,1, -0x02ac0c,1, -0x02ac08,1, -0x02ac04,1, -0x02ac00,1, -0x02ab34,1, -0x02ab30,1, -0x02ab20,1, -0x02ab14,1, -0x02ab10,1, -0x02ab00,1, -0x02a978,1, -0x02a974,1, -0x02a970,1, -0x02a96c,1, -0x02a968,1, -0x02a964,1, -0x02a960,1, -0x02a95c,1, -0x02a958,1, -0x02a954,1, -0x02a950,1, -0x02a94c,1, -0x02a948,1, -0x02a944,1, -0x02a940,1, -0x02a93c,1, -0x02a938,1, -0x02a934,1, -0x02a930,1, -0x02a92c,1, -0x02a928,1, -0x02a924,1, -0x02a920,1, -0x02a91c,1, -0x02a918,1, -0x02a914,1, -0x02a910,1, -0x02a90c,1, -0x02a908,1, -0x02a904,1, -0x02a900,1, -0x02a8fc,1, -0x02a8f8,1, -0x02a8f4,1, -0x02a8f0,1, -0x02a8ec,1, -0x02a8e8,1, -0x02a8e4,1, -0x02a8e0,1, -0x02a8dc,1, -0x02a8d8,1, -0x02a8d4,1, -0x02a8d0,1, -0x02a8cc,1, -0x02a8c8,1, -0x02a8c4,1, -0x02a8c0,1, -0x02a8bc,1, -0x02a8b8,1, -0x02a8b4,1, -0x02a8b0,1, -0x02a8ac,1, -0x02a8a8,1, -0x02a8a4,1, -0x02a8a0,1, -0x02a89c,1, -0x02a898,1, -0x02a894,1, -0x02a890,1, -0x02a88c,1, -0x02a888,1, -0x02a884,1, -0x02a880,1, -0x02a87c,1, -0x02a878,1, -0x02a874,1, -0x02a870,1, -0x02a86c,1, -0x02a868,1, -0x02a864,1, -0x02a860,1, -0x02a85c,1, -0x02a858,1, -0x02a854,1, -0x02a850,1, -0x02a84c,1, -0x02a848,1, -0x02a844,1, -0x02a840,1, -0x02a83c,1, -0x02a838,1, -0x02a834,1, -0x02a830,1, -0x02a82c,1, -0x02a828,1, -0x02a824,1, -0x02a820,1, -0x02a81c,1, -0x02a818,1, -0x02a814,1, -0x02a810,1, -0x02a80c,1, -0x02a808,1, -0x02a804,1, -0x02a800,1, -0x02a7fc,1, -0x02a7f8,1, -0x02a7f4,1, -0x02a7dc,1, -0x02a7d4,1, -0x02a7d0,1, -0x02a7cc,1, -0x02a7c8,1, -0x02a7c4,1, -0x02a7c0,1, -0x02a7bc,1, -0x02a7b8,1, -0x02a7b4,1, -0x02a7b0,1, -0x02a7ac,1, -0x02a7a8,1, -0x02a7a0,1, -0x02a79c,1, -0x02a798,1, -0x02a794,1, -0x02a790,1, -0x02a78c,1, -0x02a788,1, -0x02a784,1, -0x02a780,1, -0x02a694,1, -0x02a690,1, -0x02a680,1, -0x02a630,1, -0x02a62c,1, -0x02a628,1, -0x02a624,1, -0x02a620,1, -0x02a61c,1, -0x02a618,1, -0x02a614,1, -0x02a610,1, -0x02a60c,1, -0x02a604,1, -0x02a600,1, -0x02a5fc,1, -0x02a5f8,1, -0x02a5f4,1, -0x02a5ec,1, -0x02a5e4,1, -0x02a5e0,1, -0x02a5dc,1, -0x02a5d8,1, -0x02a5d4,1, -0x02a5cc,1, -0x02a5c8,1, -0x02a5c0,1, -0x02a5b8,1, -0x02a5b4,1, -0x02a5b0,1, -0x02a5a8,1, -0x02a5a4,1, -0x02a5a0,1, -0x02a580,1, -0x02a57c,1, -0x02a578,1, -0x02a574,1, -0x02a570,1, -0x02a56c,1, -0x02a568,1, -0x02a564,1, -0x02a560,1, -0x02a55c,1, -0x02a558,1, -0x02a554,1, -0x02a550,1, -0x02a54c,1, -0x02a548,1, -0x02a544,1, -0x02a540,1, -0x02a534,1, -0x02a530,1, -0x02a520,1, -0x02a514,1, -0x02a510,1, -0x02a500,1, -0x02a4ec,1, -0x02a4e8,1, -0x02a4e4,1, -0x02a4e0,1, -0x02a4dc,1, -0x02a4d8,1, -0x02a4d4,1, -0x02a4d0,1, -0x02a4cc,1, -0x02a4c8,1, -0x02a490,1, -0x02a48c,1, -0x02a488,1, -0x02a484,1, -0x02a480,1, -0x02a468,1, -0x02a450,1, -0x02a44c,1, -0x02a424,1, -0x02a420,1, -0x02a41c,1, -0x02a418,1, -0x02a414,1, -0x02a410,1, -0x02a40c,1, -0x02a408,1, -0x02a404,1, -0x02a400,1, -0x02a334,1, -0x02a330,1, -0x02a320,1, -0x02a314,1, -0x02a310,1, -0x02a300,1, -0x02a178,1, -0x02a174,1, -0x02a170,1, -0x02a16c,1, -0x02a168,1, -0x02a164,1, -0x02a160,1, -0x02a15c,1, -0x02a158,1, -0x02a154,1, -0x02a150,1, -0x02a14c,1, -0x02a148,1, -0x02a144,1, -0x02a140,1, -0x02a13c,1, -0x02a138,1, -0x02a134,1, -0x02a130,1, -0x02a12c,1, -0x02a128,1, -0x02a124,1, -0x02a120,1, -0x02a11c,1, -0x02a118,1, -0x02a114,1, -0x02a110,1, -0x02a10c,1, -0x02a108,1, -0x02a104,1, -0x02a100,1, -0x02a0fc,1, -0x02a0f8,1, -0x02a0f4,1, -0x02a0f0,1, -0x02a0ec,1, -0x02a0e8,1, -0x02a0e4,1, -0x02a0e0,1, -0x02a0dc,1, -0x02a0d8,1, -0x02a0d4,1, -0x02a0d0,1, -0x02a0cc,1, -0x02a0c8,1, -0x02a0c4,1, -0x02a0c0,1, -0x02a0bc,1, -0x02a0b8,1, -0x02a0b4,1, -0x02a0b0,1, -0x02a0ac,1, -0x02a0a8,1, -0x02a0a4,1, -0x02a0a0,1, -0x02a09c,1, -0x02a098,1, -0x02a094,1, -0x02a090,1, -0x02a08c,1, -0x02a088,1, -0x02a084,1, -0x02a080,1, -0x02a07c,1, -0x02a078,1, -0x02a074,1, -0x02a070,1, -0x02a06c,1, -0x02a068,1, -0x02a064,1, -0x02a060,1, -0x02a05c,1, -0x02a058,1, -0x02a054,1, -0x02a050,1, -0x02a04c,1, -0x02a048,1, -0x02a044,1, -0x02a040,1, -0x02a03c,1, -0x02a038,1, -0x02a034,1, -0x02a030,1, -0x02a02c,1, -0x02a028,1, -0x02a024,1, -0x02a020,1, -0x02a01c,1, -0x02a018,1, -0x02a014,1, -0x02a010,1, -0x02a00c,1, -0x02a008,1, -0x02a004,1, -0x02a000,1, -0x029ffc,1, -0x029ff8,1, -0x029ff4,1, -0x029fdc,1, -0x029fd4,1, -0x029fd0,1, -0x029fcc,1, -0x029fc8,1, -0x029fc4,1, -0x029fc0,1, -0x029fbc,1, -0x029fb8,1, -0x029fb4,1, -0x029fb0,1, -0x029fac,1, -0x029fa8,1, -0x029fa0,1, -0x029f9c,1, -0x029f98,1, -0x029f94,1, -0x029f90,1, -0x029f8c,1, -0x029f88,1, -0x029f84,1, -0x029f80,1, -0x029e94,1, -0x029e90,1, -0x029e80,1, -0x029e30,1, -0x029e2c,1, -0x029e28,1, -0x029e24,1, -0x029e20,1, -0x029e1c,1, -0x029e18,1, -0x029e14,1, -0x029e10,1, -0x029e0c,1, -0x029e04,1, -0x029e00,1, -0x029dfc,1, -0x029df8,1, -0x029df4,1, -0x029dec,1, -0x029de4,1, -0x029de0,1, -0x029ddc,1, -0x029dd8,1, -0x029dd4,1, -0x029dcc,1, -0x029dc8,1, -0x029dc0,1, -0x029db8,1, -0x029db4,1, -0x029db0,1, -0x029da8,1, -0x029da4,1, -0x029da0,1, -0x029d80,1, -0x029d7c,1, -0x029d78,1, -0x029d74,1, -0x029d70,1, -0x029d6c,1, -0x029d68,1, -0x029d64,1, -0x029d60,1, -0x029d5c,1, -0x029d58,1, -0x029d54,1, -0x029d50,1, -0x029d4c,1, -0x029d48,1, -0x029d44,1, -0x029d40,1, -0x029d34,1, -0x029d30,1, -0x029d20,1, -0x029d14,1, -0x029d10,1, -0x029d00,1, -0x029cec,1, -0x029ce8,1, -0x029ce4,1, -0x029ce0,1, -0x029cdc,1, -0x029cd8,1, -0x029cd4,1, -0x029cd0,1, -0x029ccc,1, -0x029cc8,1, -0x029c90,1, -0x029c8c,1, -0x029c88,1, -0x029c84,1, -0x029c80,1, -0x029c68,1, -0x029c50,1, -0x029c4c,1, -0x029c24,1, -0x029c20,1, -0x029c1c,1, -0x029c18,1, -0x029c14,1, -0x029c10,1, -0x029c0c,1, -0x029c08,1, -0x029c04,1, -0x029c00,1, -0x029b34,1, -0x029b30,1, -0x029b20,1, -0x029b14,1, -0x029b10,1, -0x029b00,1, -0x029978,1, -0x029974,1, -0x029970,1, -0x02996c,1, -0x029968,1, -0x029964,1, -0x029960,1, -0x02995c,1, -0x029958,1, -0x029954,1, -0x029950,1, -0x02994c,1, -0x029948,1, -0x029944,1, -0x029940,1, -0x02993c,1, -0x029938,1, -0x029934,1, -0x029930,1, -0x02992c,1, -0x029928,1, -0x029924,1, -0x029920,1, -0x02991c,1, -0x029918,1, -0x029914,1, -0x029910,1, -0x02990c,1, -0x029908,1, -0x029904,1, -0x029900,1, -0x0298fc,1, -0x0298f8,1, -0x0298f4,1, -0x0298f0,1, -0x0298ec,1, -0x0298e8,1, -0x0298e4,1, -0x0298e0,1, -0x0298dc,1, -0x0298d8,1, -0x0298d4,1, -0x0298d0,1, -0x0298cc,1, -0x0298c8,1, -0x0298c4,1, -0x0298c0,1, -0x0298bc,1, -0x0298b8,1, -0x0298b4,1, -0x0298b0,1, -0x0298ac,1, -0x0298a8,1, -0x0298a4,1, -0x0298a0,1, -0x02989c,1, -0x029898,1, -0x029894,1, -0x029890,1, -0x02988c,1, -0x029888,1, -0x029884,1, -0x029880,1, -0x02987c,1, -0x029878,1, -0x029874,1, -0x029870,1, -0x02986c,1, -0x029868,1, -0x029864,1, -0x029860,1, -0x02985c,1, -0x029858,1, -0x029854,1, -0x029850,1, -0x02984c,1, -0x029848,1, -0x029844,1, -0x029840,1, -0x02983c,1, -0x029838,1, -0x029834,1, -0x029830,1, -0x02982c,1, -0x029828,1, -0x029824,1, -0x029820,1, -0x02981c,1, -0x029818,1, -0x029814,1, -0x029810,1, -0x02980c,1, -0x029808,1, -0x029804,1, -0x029800,1, -0x0297fc,1, -0x0297f8,1, -0x0297f4,1, -0x0297dc,1, -0x0297d4,1, -0x0297d0,1, -0x0297cc,1, -0x0297c8,1, -0x0297c4,1, -0x0297c0,1, -0x0297bc,1, -0x0297b8,1, -0x0297b4,1, -0x0297b0,1, -0x0297ac,1, -0x0297a8,1, -0x0297a0,1, -0x02979c,1, -0x029798,1, -0x029794,1, -0x029790,1, -0x02978c,1, -0x029788,1, -0x029784,1, -0x029780,1, -0x029694,1, -0x029690,1, -0x029680,1, -0x029630,1, -0x02962c,1, -0x029628,1, -0x029624,1, -0x029620,1, -0x02961c,1, -0x029618,1, -0x029614,1, -0x029610,1, -0x02960c,1, -0x029604,1, -0x029600,1, -0x0295fc,1, -0x0295f8,1, -0x0295f4,1, -0x0295ec,1, -0x0295e4,1, -0x0295e0,1, -0x0295dc,1, -0x0295d8,1, -0x0295d4,1, -0x0295cc,1, -0x0295c8,1, -0x0295c0,1, -0x0295b8,1, -0x0295b4,1, -0x0295b0,1, -0x0295a8,1, -0x0295a4,1, -0x0295a0,1, -0x029580,1, -0x02957c,1, -0x029578,1, -0x029574,1, -0x029570,1, -0x02956c,1, -0x029568,1, -0x029564,1, -0x029560,1, -0x02955c,1, -0x029558,1, -0x029554,1, -0x029550,1, -0x02954c,1, -0x029548,1, -0x029544,1, -0x029540,1, -0x029534,1, -0x029530,1, -0x029520,1, -0x029514,1, -0x029510,1, -0x029500,1, -0x0294ec,1, -0x0294e8,1, -0x0294e4,1, -0x0294e0,1, -0x0294dc,1, -0x0294d8,1, -0x0294d4,1, -0x0294d0,1, -0x0294cc,1, -0x0294c8,1, -0x029490,1, -0x02948c,1, -0x029488,1, -0x029484,1, -0x029480,1, -0x029468,1, -0x029450,1, -0x02944c,1, -0x029424,1, -0x029420,1, -0x02941c,1, -0x029418,1, -0x029414,1, -0x029410,1, -0x02940c,1, -0x029408,1, -0x029404,1, -0x029400,1, -0x029334,1, -0x029330,1, -0x029320,1, -0x029314,1, -0x029310,1, -0x029300,1, -0x029178,1, -0x029174,1, -0x029170,1, -0x02916c,1, -0x029168,1, -0x029164,1, -0x029160,1, -0x02915c,1, -0x029158,1, -0x029154,1, -0x029150,1, -0x02914c,1, -0x029148,1, -0x029144,1, -0x029140,1, -0x02913c,1, -0x029138,1, -0x029134,1, -0x029130,1, -0x02912c,1, -0x029128,1, -0x029124,1, -0x029120,1, -0x02911c,1, -0x029118,1, -0x029114,1, -0x029110,1, -0x02910c,1, -0x029108,1, -0x029104,1, -0x029100,1, -0x0290fc,1, -0x0290f8,1, -0x0290f4,1, -0x0290f0,1, -0x0290ec,1, -0x0290e8,1, -0x0290e4,1, -0x0290e0,1, -0x0290dc,1, -0x0290d8,1, -0x0290d4,1, -0x0290d0,1, -0x0290cc,1, -0x0290c8,1, -0x0290c4,1, -0x0290c0,1, -0x0290bc,1, -0x0290b8,1, -0x0290b4,1, -0x0290b0,1, -0x0290ac,1, -0x0290a8,1, -0x0290a4,1, -0x0290a0,1, -0x02909c,1, -0x029098,1, -0x029094,1, -0x029090,1, -0x02908c,1, -0x029088,1, -0x029084,1, -0x029080,1, -0x02907c,1, -0x029078,1, -0x029074,1, -0x029070,1, -0x02906c,1, -0x029068,1, -0x029064,1, -0x029060,1, -0x02905c,1, -0x029058,1, -0x029054,1, -0x029050,1, -0x02904c,1, -0x029048,1, -0x029044,1, -0x029040,1, -0x02903c,1, -0x029038,1, -0x029034,1, -0x029030,1, -0x02902c,1, -0x029028,1, -0x029024,1, -0x029020,1, -0x02901c,1, -0x029018,1, -0x029014,1, -0x029010,1, -0x02900c,1, -0x029008,1, -0x029004,1, -0x029000,1, -0x028ffc,1, -0x028ff8,1, -0x028ff4,1, -0x028fdc,1, -0x028fd4,1, -0x028fd0,1, -0x028fcc,1, -0x028fc8,1, -0x028fc4,1, -0x028fc0,1, -0x028fbc,1, -0x028fb8,1, -0x028fb4,1, -0x028fb0,1, -0x028fac,1, -0x028fa8,1, -0x028fa0,1, -0x028f9c,1, -0x028f98,1, -0x028f94,1, -0x028f90,1, -0x028f8c,1, -0x028f88,1, -0x028f84,1, -0x028f80,1, -0x028e94,1, -0x028e90,1, -0x028e80,1, -0x028e30,1, -0x028e2c,1, -0x028e28,1, -0x028e24,1, -0x028e20,1, -0x028e1c,1, -0x028e18,1, -0x028e14,1, -0x028e10,1, -0x028e0c,1, -0x028e04,1, -0x028e00,1, -0x028dfc,1, -0x028df8,1, -0x028df4,1, -0x028dec,1, -0x028de4,1, -0x028de0,1, -0x028ddc,1, -0x028dd8,1, -0x028dd4,1, -0x028dcc,1, -0x028dc8,1, -0x028dc0,1, -0x028db8,1, -0x028db4,1, -0x028db0,1, -0x028da8,1, -0x028da4,1, -0x028da0,1, -0x028d80,1, -0x028d7c,1, -0x028d78,1, -0x028d74,1, -0x028d70,1, -0x028d6c,1, -0x028d68,1, -0x028d64,1, -0x028d60,1, -0x028d5c,1, -0x028d58,1, -0x028d54,1, -0x028d50,1, -0x028d4c,1, -0x028d48,1, -0x028d44,1, -0x028d40,1, -0x028d34,1, -0x028d30,1, -0x028d20,1, -0x028d14,1, -0x028d10,1, -0x028d00,1, -0x028cec,1, -0x028ce8,1, -0x028ce4,1, -0x028ce0,1, -0x028cdc,1, -0x028cd8,1, -0x028cd4,1, -0x028cd0,1, -0x028ccc,1, -0x028cc8,1, -0x028c90,1, -0x028c8c,1, -0x028c88,1, -0x028c84,1, -0x028c80,1, -0x028c68,1, -0x028c50,1, -0x028c4c,1, -0x028c24,1, -0x028c20,1, -0x028c1c,1, -0x028c18,1, -0x028c14,1, -0x028c10,1, -0x028c0c,1, -0x028c08,1, -0x028c04,1, -0x028c00,1, -0x028b34,1, -0x028b30,1, -0x028b20,1, -0x028b14,1, -0x028b10,1, -0x028b00,1, -0x028978,1, -0x028974,1, -0x028970,1, -0x02896c,1, -0x028968,1, -0x028964,1, -0x028960,1, -0x02895c,1, -0x028958,1, -0x028954,1, -0x028950,1, -0x02894c,1, -0x028948,1, -0x028944,1, -0x028940,1, -0x02893c,1, -0x028938,1, -0x028934,1, -0x028930,1, -0x02892c,1, -0x028928,1, -0x028924,1, -0x028920,1, -0x02891c,1, -0x028918,1, -0x028914,1, -0x028910,1, -0x02890c,1, -0x028908,1, -0x028904,1, -0x028900,1, -0x0288fc,1, -0x0288f8,1, -0x0288f4,1, -0x0288f0,1, -0x0288ec,1, -0x0288e8,1, -0x0288e4,1, -0x0288e0,1, -0x0288dc,1, -0x0288d8,1, -0x0288d4,1, -0x0288d0,1, -0x0288cc,1, -0x0288c8,1, -0x0288c4,1, -0x0288c0,1, -0x0288bc,1, -0x0288b8,1, -0x0288b4,1, -0x0288b0,1, -0x0288ac,1, -0x0288a8,1, -0x0288a4,1, -0x0288a0,1, -0x02889c,1, -0x028898,1, -0x028894,1, -0x028890,1, -0x02888c,1, -0x028888,1, -0x028884,1, -0x028880,1, -0x02887c,1, -0x028878,1, -0x028874,1, -0x028870,1, -0x02886c,1, -0x028868,1, -0x028864,1, -0x028860,1, -0x02885c,1, -0x028858,1, -0x028854,1, -0x028850,1, -0x02884c,1, -0x028848,1, -0x028844,1, -0x028840,1, -0x02883c,1, -0x028838,1, -0x028834,1, -0x028830,1, -0x02882c,1, -0x028828,1, -0x028824,1, -0x028820,1, -0x02881c,1, -0x028818,1, -0x028814,1, -0x028810,1, -0x02880c,1, -0x028808,1, -0x028804,1, -0x028800,1, -0x0287fc,1, -0x0287f8,1, -0x0287f4,1, -0x0287dc,1, -0x0287d4,1, -0x0287d0,1, -0x0287cc,1, -0x0287c8,1, -0x0287c4,1, -0x0287c0,1, -0x0287bc,1, -0x0287b8,1, -0x0287b4,1, -0x0287b0,1, -0x0287ac,1, -0x0287a8,1, -0x0287a0,1, -0x02879c,1, -0x028798,1, -0x028794,1, -0x028790,1, -0x02878c,1, -0x028788,1, -0x028784,1, -0x028780,1, -0x028694,1, -0x028690,1, -0x028680,1, -0x028630,1, -0x02862c,1, -0x028628,1, -0x028624,1, -0x028620,1, -0x02861c,1, -0x028618,1, -0x028614,1, -0x028610,1, -0x02860c,1, -0x028604,1, -0x028600,1, -0x0285fc,1, -0x0285f8,1, -0x0285f4,1, -0x0285ec,1, -0x0285e4,1, -0x0285e0,1, -0x0285dc,1, -0x0285d8,1, -0x0285d4,1, -0x0285cc,1, -0x0285c8,1, -0x0285c0,1, -0x0285b8,1, -0x0285b4,1, -0x0285b0,1, -0x0285a8,1, -0x0285a4,1, -0x0285a0,1, -0x028580,1, -0x02857c,1, -0x028578,1, -0x028574,1, -0x028570,1, -0x02856c,1, -0x028568,1, -0x028564,1, -0x028560,1, -0x02855c,1, -0x028558,1, -0x028554,1, -0x028550,1, -0x02854c,1, -0x028548,1, -0x028544,1, -0x028540,1, -0x028534,1, -0x028530,1, -0x028520,1, -0x028514,1, -0x028510,1, -0x028500,1, -0x0284ec,1, -0x0284e8,1, -0x0284e4,1, -0x0284e0,1, -0x0284dc,1, -0x0284d8,1, -0x0284d4,1, -0x0284d0,1, -0x0284cc,1, -0x0284c8,1, -0x028490,1, -0x02848c,1, -0x028488,1, -0x028484,1, -0x028480,1, -0x028468,1, -0x028450,1, -0x02844c,1, -0x028424,1, -0x028420,1, -0x02841c,1, -0x028418,1, -0x028414,1, -0x028410,1, -0x02840c,1, -0x028408,1, -0x028404,1, -0x028400,1, -0x028334,1, -0x028330,1, -0x028320,1, -0x028314,1, -0x028310,1, -0x028300,1, -0x028178,1, -0x028174,1, -0x028170,1, -0x02816c,1, -0x028168,1, -0x028164,1, -0x028160,1, -0x02815c,1, -0x028158,1, -0x028154,1, -0x028150,1, -0x02814c,1, -0x028148,1, -0x028144,1, -0x028140,1, -0x02813c,1, -0x028138,1, -0x028134,1, -0x028130,1, -0x02812c,1, -0x028128,1, -0x028124,1, -0x028120,1, -0x02811c,1, -0x028118,1, -0x028114,1, -0x028110,1, -0x02810c,1, -0x028108,1, -0x028104,1, -0x028100,1, -0x0280fc,1, -0x0280f8,1, -0x0280f4,1, -0x0280f0,1, -0x0280ec,1, -0x0280e8,1, -0x0280e4,1, -0x0280e0,1, -0x0280dc,1, -0x0280d8,1, -0x0280d4,1, -0x0280d0,1, -0x0280cc,1, -0x0280c8,1, -0x0280c4,1, -0x0280c0,1, -0x0280bc,1, -0x0280b8,1, -0x0280b4,1, -0x0280b0,1, -0x0280ac,1, -0x0280a8,1, -0x0280a4,1, -0x0280a0,1, -0x02809c,1, -0x028098,1, -0x028094,1, -0x028090,1, -0x02808c,1, -0x028088,1, -0x028084,1, -0x028080,1, -0x02807c,1, -0x028078,1, -0x028074,1, -0x028070,1, -0x02806c,1, -0x028068,1, -0x028064,1, -0x028060,1, -0x02805c,1, -0x028058,1, -0x028054,1, -0x028050,1, -0x02804c,1, -0x028048,1, -0x028044,1, -0x028040,1, -0x02803c,1, -0x028038,1, -0x028034,1, -0x028030,1, -0x02802c,1, -0x028028,1, -0x028024,1, -0x028020,1, -0x02801c,1, -0x028018,1, -0x028014,1, -0x028010,1, -0x02800c,1, -0x028008,1, -0x028004,1, -0x028000,1, -0x0259f4,1, -0x0259f0,1, -0x0259d4,1, -0x0259d0,1, -0x0259c0,1, -0x0259b4,1, -0x0259b0,1, -0x0259a0,1, -0x025994,1, -0x025990,1, -0x025980,1, -0x025974,1, -0x025970,1, -0x025960,1, -0x025954,1, -0x025950,1, -0x025940,1, -0x025928,1, -0x025924,1, -0x025920,1, -0x02591c,1, -0x025918,1, -0x025914,1, -0x025910,1, -0x02590c,1, -0x025908,1, -0x025904,1, -0x025900,1, -0x0258d4,1, -0x0258d0,1, -0x0258cc,1, -0x0258c8,1, -0x0258c4,1, -0x0258c0,1, -0x0258ac,1, -0x025870,1, -0x02586c,1, -0x025868,1, -0x025864,1, -0x025860,1, -0x02585c,1, -0x025858,1, -0x025854,1, -0x025850,1, -0x02584c,1, -0x025848,1, -0x025844,1, -0x025840,1, -0x02583c,1, -0x025838,1, -0x025834,1, -0x025830,1, -0x02582c,1, -0x025828,1, -0x025824,1, -0x025820,1, -0x025814,1, -0x025810,1, -0x025800,1, -0x023b0c,1, -0x023b08,1, -0x023b04,1, -0x023b00,1, -0x023af4,1, -0x023af0,1, -0x023a74,1, -0x023a70,1, -0x023a60,1, -0x023a54,1, -0x023a50,1, -0x023a40,1, -0x023a28,1, -0x023a1c,1, -0x023a18,1, -0x023a0c,1, -0x023a00,1, -0x023934,1, -0x023930,1, -0x023924,1, -0x023920,1, -0x023914,1, -0x023910,1, -0x023904,1, -0x023900,1, -0x0238f4,1, -0x0238f0,1, -0x0238e4,1, -0x0238e0,1, -0x0238b4,1, -0x0238b0,1, -0x0238ac,1, -0x0238a8,1, -0x0238a4,1, -0x0238a0,1, -0x023894,1, -0x023890,1, -0x02388c,1, -0x023888,1, -0x023884,1, -0x023880,1, -0x023870,1, -0x02383c,1, -0x023838,1, -0x023834,1, -0x023830,1, -0x02382c,1, -0x023828,1, -0x023824,1, -0x023820,1, -0x023814,1, -0x023810,1, -0x023800,1, -0x0237bc,1, -0x0237b8,1, -0x0237b4,1, -0x0237b0,1, -0x0237a0,1, -0x02379c,1, -0x023798,1, -0x023790,1, -0x02378c,1, -0x023788,1, -0x023784,1, -0x023780,1, -0x02367c,1, -0x023678,1, -0x023674,1, -0x023670,1, -0x02366c,1, -0x023668,1, -0x023664,1, -0x023660,1, -0x02365c,1, -0x023658,1, -0x023654,1, -0x02364c,1, -0x023648,1, -0x023644,1, -0x023640,1, -0x02362c,1, -0x023628,1, -0x023624,1, -0x023620,1, -0x02361c,1, -0x023618,1, -0x023614,1, -0x023610,1, -0x02360c,1, -0x023608,1, -0x023604,1, -0x023600,1, -0x0234a0,1, -0x02349c,1, -0x023498,1, -0x023494,1, -0x023490,1, -0x02348c,1, -0x023488,1, -0x023484,1, -0x023480,1, -0x02347c,1, -0x023478,1, -0x023474,1, -0x023470,1, -0x02346c,1, -0x023464,1, -0x02345c,1, -0x023458,1, -0x023454,1, -0x023450,1, -0x02344c,1, -0x023448,1, -0x023444,1, -0x023440,1, -0x02343c,1, -0x023438,1, -0x023424,1, -0x023420,1, -0x02341c,1, -0x023418,1, -0x023414,1, -0x023410,1, -0x02340c,1, -0x023408,1, -0x023404,1, -0x023400,1, -0x023040,1, -0x023000,1, -0x022ffc,1, -0x022ff8,1, -0x022ff4,1, -0x022fdc,1, -0x022fd4,1, -0x022fd0,1, -0x022fcc,1, -0x022fc8,1, -0x022fc4,1, -0x022fc0,1, -0x022fbc,1, -0x022fb8,1, -0x022fb4,1, -0x022fb0,1, -0x022fac,1, -0x022fa8,1, -0x022fa0,1, -0x022f9c,1, -0x022f98,1, -0x022f94,1, -0x022f90,1, -0x022f8c,1, -0x022f88,1, -0x022f84,1, -0x022f80,1, -0x022e94,1, -0x022e90,1, -0x022e80,1, -0x022e30,1, -0x022e2c,1, -0x022e28,1, -0x022e24,1, -0x022e20,1, -0x022e1c,1, -0x022e18,1, -0x022e14,1, -0x022e10,1, -0x022e0c,1, -0x022e04,1, -0x022e00,1, -0x022dfc,1, -0x022df8,1, -0x022df4,1, -0x022dec,1, -0x022de4,1, -0x022de0,1, -0x022ddc,1, -0x022dd8,1, -0x022dd4,1, -0x022dcc,1, -0x022dc8,1, -0x022dc0,1, -0x022db8,1, -0x022db4,1, -0x022db0,1, -0x022da8,1, -0x022da4,1, -0x022da0,1, -0x022d80,1, -0x022d7c,1, -0x022d78,1, -0x022d74,1, -0x022d70,1, -0x022d6c,1, -0x022d68,1, -0x022d64,1, -0x022d60,1, -0x022d5c,1, -0x022d58,1, -0x022d54,1, -0x022d50,1, -0x022d4c,1, -0x022d48,1, -0x022d44,1, -0x022d40,1, -0x022d34,1, -0x022d30,1, -0x022d20,1, -0x022d14,1, -0x022d10,1, -0x022d00,1, -0x022cec,1, -0x022ce8,1, -0x022ce4,1, -0x022ce0,1, -0x022cdc,1, -0x022cd8,1, -0x022cd4,1, -0x022cd0,1, -0x022ccc,1, -0x022cc8,1, -0x022c90,1, -0x022c8c,1, -0x022c88,1, -0x022c84,1, -0x022c80,1, -0x022c68,1, -0x022c50,1, -0x022c4c,1, -0x022c24,1, -0x022c20,1, -0x022c1c,1, -0x022c18,1, -0x022c14,1, -0x022c10,1, -0x022c0c,1, -0x022c08,1, -0x022c04,1, -0x022c00,1, -0x022b34,1, -0x022b30,1, -0x022b20,1, -0x022b14,1, -0x022b10,1, -0x022b00,1, -0x022978,1, -0x022974,1, -0x022970,1, -0x02296c,1, -0x022968,1, -0x022964,1, -0x022960,1, -0x02295c,1, -0x022958,1, -0x022954,1, -0x022950,1, -0x02294c,1, -0x022948,1, -0x022944,1, -0x022940,1, -0x02293c,1, -0x022938,1, -0x022934,1, -0x022930,1, -0x02292c,1, -0x022928,1, -0x022924,1, -0x022920,1, -0x02291c,1, -0x022918,1, -0x022914,1, -0x022910,1, -0x02290c,1, -0x022908,1, -0x022904,1, -0x022900,1, -0x0228fc,1, -0x0228f8,1, -0x0228f4,1, -0x0228f0,1, -0x0228ec,1, -0x0228e8,1, -0x0228e4,1, -0x0228e0,1, -0x0228dc,1, -0x0228d8,1, -0x0228d4,1, -0x0228d0,1, -0x0228cc,1, -0x0228c8,1, -0x0228c4,1, -0x0228c0,1, -0x0228bc,1, -0x0228b8,1, -0x0228b4,1, -0x0228b0,1, -0x0228ac,1, -0x0228a8,1, -0x0228a4,1, -0x0228a0,1, -0x02289c,1, -0x022898,1, -0x022894,1, -0x022890,1, -0x02288c,1, -0x022888,1, -0x022884,1, -0x022880,1, -0x02287c,1, -0x022878,1, -0x022874,1, -0x022870,1, -0x02286c,1, -0x022868,1, -0x022864,1, -0x022860,1, -0x02285c,1, -0x022858,1, -0x022854,1, -0x022850,1, -0x02284c,1, -0x022848,1, -0x022844,1, -0x022840,1, -0x02283c,1, -0x022838,1, -0x022834,1, -0x022830,1, -0x02282c,1, -0x022828,1, -0x022824,1, -0x022820,1, -0x02281c,1, -0x022818,1, -0x022814,1, -0x022810,1, -0x02280c,1, -0x022808,1, -0x022804,1, -0x022800,1, -0x0227fc,1, -0x0227f8,1, -0x0227f4,1, -0x0227dc,1, -0x0227d4,1, -0x0227d0,1, -0x0227cc,1, -0x0227c8,1, -0x0227c4,1, -0x0227c0,1, -0x0227bc,1, -0x0227b8,1, -0x0227b4,1, -0x0227b0,1, -0x0227ac,1, -0x0227a8,1, -0x0227a0,1, -0x02279c,1, -0x022798,1, -0x022794,1, -0x022790,1, -0x02278c,1, -0x022788,1, -0x022784,1, -0x022780,1, -0x022694,1, -0x022690,1, -0x022680,1, -0x022630,1, -0x02262c,1, -0x022628,1, -0x022624,1, -0x022620,1, -0x02261c,1, -0x022618,1, -0x022614,1, -0x022610,1, -0x02260c,1, -0x022604,1, -0x022600,1, -0x0225fc,1, -0x0225f8,1, -0x0225f4,1, -0x0225ec,1, -0x0225e4,1, -0x0225e0,1, -0x0225dc,1, -0x0225d8,1, -0x0225d4,1, -0x0225cc,1, -0x0225c8,1, -0x0225c0,1, -0x0225b8,1, -0x0225b4,1, -0x0225b0,1, -0x0225a8,1, -0x0225a4,1, -0x0225a0,1, -0x022580,1, -0x02257c,1, -0x022578,1, -0x022574,1, -0x022570,1, -0x02256c,1, -0x022568,1, -0x022564,1, -0x022560,1, -0x02255c,1, -0x022558,1, -0x022554,1, -0x022550,1, -0x02254c,1, -0x022548,1, -0x022544,1, -0x022540,1, -0x022534,1, -0x022530,1, -0x022520,1, -0x022514,1, -0x022510,1, -0x022500,1, -0x0224ec,1, -0x0224e8,1, -0x0224e4,1, -0x0224e0,1, -0x0224dc,1, -0x0224d8,1, -0x0224d4,1, -0x0224d0,1, -0x0224cc,1, -0x0224c8,1, -0x022490,1, -0x02248c,1, -0x022488,1, -0x022484,1, -0x022480,1, -0x022468,1, -0x022450,1, -0x02244c,1, -0x022424,1, -0x022420,1, -0x02241c,1, -0x022418,1, -0x022414,1, -0x022410,1, -0x02240c,1, -0x022408,1, -0x022404,1, -0x022400,1, -0x022334,1, -0x022330,1, -0x022320,1, -0x022314,1, -0x022310,1, -0x022300,1, -0x022178,1, -0x022174,1, -0x022170,1, -0x02216c,1, -0x022168,1, -0x022164,1, -0x022160,1, -0x02215c,1, -0x022158,1, -0x022154,1, -0x022150,1, -0x02214c,1, -0x022148,1, -0x022144,1, -0x022140,1, -0x02213c,1, -0x022138,1, -0x022134,1, -0x022130,1, -0x02212c,1, -0x022128,1, -0x022124,1, -0x022120,1, -0x02211c,1, -0x022118,1, -0x022114,1, -0x022110,1, -0x02210c,1, -0x022108,1, -0x022104,1, -0x022100,1, -0x0220fc,1, -0x0220f8,1, -0x0220f4,1, -0x0220f0,1, -0x0220ec,1, -0x0220e8,1, -0x0220e4,1, -0x0220e0,1, -0x0220dc,1, -0x0220d8,1, -0x0220d4,1, -0x0220d0,1, -0x0220cc,1, -0x0220c8,1, -0x0220c4,1, -0x0220c0,1, -0x0220bc,1, -0x0220b8,1, -0x0220b4,1, -0x0220b0,1, -0x0220ac,1, -0x0220a8,1, -0x0220a4,1, -0x0220a0,1, -0x02209c,1, -0x022098,1, -0x022094,1, -0x022090,1, -0x02208c,1, -0x022088,1, -0x022084,1, -0x022080,1, -0x02207c,1, -0x022078,1, -0x022074,1, -0x022070,1, -0x02206c,1, -0x022068,1, -0x022064,1, -0x022060,1, -0x02205c,1, -0x022058,1, -0x022054,1, -0x022050,1, -0x02204c,1, -0x022048,1, -0x022044,1, -0x022040,1, -0x02203c,1, -0x022038,1, -0x022034,1, -0x022030,1, -0x02202c,1, -0x022028,1, -0x022024,1, -0x022020,1, -0x02201c,1, -0x022018,1, -0x022014,1, -0x022010,1, -0x02200c,1, -0x022008,1, -0x022004,1, -0x022000,1, -0x021ffc,1, -0x021ff8,1, -0x021ff4,1, -0x021fdc,1, -0x021fd4,1, -0x021fd0,1, -0x021fcc,1, -0x021fc8,1, -0x021fc4,1, -0x021fc0,1, -0x021fbc,1, -0x021fb8,1, -0x021fb4,1, -0x021fb0,1, -0x021fac,1, -0x021fa8,1, -0x021fa0,1, -0x021f9c,1, -0x021f98,1, -0x021f94,1, -0x021f90,1, -0x021f8c,1, -0x021f88,1, -0x021f84,1, -0x021f80,1, -0x021e94,1, -0x021e90,1, -0x021e80,1, -0x021e30,1, -0x021e2c,1, -0x021e28,1, -0x021e24,1, -0x021e20,1, -0x021e1c,1, -0x021e18,1, -0x021e14,1, -0x021e10,1, -0x021e0c,1, -0x021e04,1, -0x021e00,1, -0x021dfc,1, -0x021df8,1, -0x021df4,1, -0x021dec,1, -0x021de4,1, -0x021de0,1, -0x021ddc,1, -0x021dd8,1, -0x021dd4,1, -0x021dcc,1, -0x021dc8,1, -0x021dc0,1, -0x021db8,1, -0x021db4,1, -0x021db0,1, -0x021da8,1, -0x021da4,1, -0x021da0,1, -0x021d80,1, -0x021d7c,1, -0x021d78,1, -0x021d74,1, -0x021d70,1, -0x021d6c,1, -0x021d68,1, -0x021d64,1, -0x021d60,1, -0x021d5c,1, -0x021d58,1, -0x021d54,1, -0x021d50,1, -0x021d4c,1, -0x021d48,1, -0x021d44,1, -0x021d40,1, -0x021d34,1, -0x021d30,1, -0x021d20,1, -0x021d14,1, -0x021d10,1, -0x021d00,1, -0x021cec,1, -0x021ce8,1, -0x021ce4,1, -0x021ce0,1, -0x021cdc,1, -0x021cd8,1, -0x021cd4,1, -0x021cd0,1, -0x021ccc,1, -0x021cc8,1, -0x021c90,1, -0x021c8c,1, -0x021c88,1, -0x021c84,1, -0x021c80,1, -0x021c68,1, -0x021c50,1, -0x021c4c,1, -0x021c24,1, -0x021c20,1, -0x021c1c,1, -0x021c18,1, -0x021c14,1, -0x021c10,1, -0x021c0c,1, -0x021c08,1, -0x021c04,1, -0x021c00,1, -0x021b34,1, -0x021b30,1, -0x021b20,1, -0x021b14,1, -0x021b10,1, -0x021b00,1, -0x021978,1, -0x021974,1, -0x021970,1, -0x02196c,1, -0x021968,1, -0x021964,1, -0x021960,1, -0x02195c,1, -0x021958,1, -0x021954,1, -0x021950,1, -0x02194c,1, -0x021948,1, -0x021944,1, -0x021940,1, -0x02193c,1, -0x021938,1, -0x021934,1, -0x021930,1, -0x02192c,1, -0x021928,1, -0x021924,1, -0x021920,1, -0x02191c,1, -0x021918,1, -0x021914,1, -0x021910,1, -0x02190c,1, -0x021908,1, -0x021904,1, -0x021900,1, -0x0218fc,1, -0x0218f8,1, -0x0218f4,1, -0x0218f0,1, -0x0218ec,1, -0x0218e8,1, -0x0218e4,1, -0x0218e0,1, -0x0218dc,1, -0x0218d8,1, -0x0218d4,1, -0x0218d0,1, -0x0218cc,1, -0x0218c8,1, -0x0218c4,1, -0x0218c0,1, -0x0218bc,1, -0x0218b8,1, -0x0218b4,1, -0x0218b0,1, -0x0218ac,1, -0x0218a8,1, -0x0218a4,1, -0x0218a0,1, -0x02189c,1, -0x021898,1, -0x021894,1, -0x021890,1, -0x02188c,1, -0x021888,1, -0x021884,1, -0x021880,1, -0x02187c,1, -0x021878,1, -0x021874,1, -0x021870,1, -0x02186c,1, -0x021868,1, -0x021864,1, -0x021860,1, -0x02185c,1, -0x021858,1, -0x021854,1, -0x021850,1, -0x02184c,1, -0x021848,1, -0x021844,1, -0x021840,1, -0x02183c,1, -0x021838,1, -0x021834,1, -0x021830,1, -0x02182c,1, -0x021828,1, -0x021824,1, -0x021820,1, -0x02181c,1, -0x021818,1, -0x021814,1, -0x021810,1, -0x02180c,1, -0x021808,1, -0x021804,1, -0x021800,1, -0x0217fc,1, -0x0217f8,1, -0x0217f4,1, -0x0217dc,1, -0x0217d4,1, -0x0217d0,1, -0x0217cc,1, -0x0217c8,1, -0x0217c4,1, -0x0217c0,1, -0x0217bc,1, -0x0217b8,1, -0x0217b4,1, -0x0217b0,1, -0x0217ac,1, -0x0217a8,1, -0x0217a0,1, -0x02179c,1, -0x021798,1, -0x021794,1, -0x021790,1, -0x02178c,1, -0x021788,1, -0x021784,1, -0x021780,1, -0x021694,1, -0x021690,1, -0x021680,1, -0x021630,1, -0x02162c,1, -0x021628,1, -0x021624,1, -0x021620,1, -0x02161c,1, -0x021618,1, -0x021614,1, -0x021610,1, -0x02160c,1, -0x021604,1, -0x021600,1, -0x0215fc,1, -0x0215f8,1, -0x0215f4,1, -0x0215ec,1, -0x0215e4,1, -0x0215e0,1, -0x0215dc,1, -0x0215d8,1, -0x0215d4,1, -0x0215cc,1, -0x0215c8,1, -0x0215c0,1, -0x0215b8,1, -0x0215b4,1, -0x0215b0,1, -0x0215a8,1, -0x0215a4,1, -0x0215a0,1, -0x021580,1, -0x02157c,1, -0x021578,1, -0x021574,1, -0x021570,1, -0x02156c,1, -0x021568,1, -0x021564,1, -0x021560,1, -0x02155c,1, -0x021558,1, -0x021554,1, -0x021550,1, -0x02154c,1, -0x021548,1, -0x021544,1, -0x021540,1, -0x021534,1, -0x021530,1, -0x021520,1, -0x021514,1, -0x021510,1, -0x021500,1, -0x0214ec,1, -0x0214e8,1, -0x0214e4,1, -0x0214e0,1, -0x0214dc,1, -0x0214d8,1, -0x0214d4,1, -0x0214d0,1, -0x0214cc,1, -0x0214c8,1, -0x021490,1, -0x02148c,1, -0x021488,1, -0x021484,1, -0x021480,1, -0x021468,1, -0x021450,1, -0x02144c,1, -0x021424,1, -0x021420,1, -0x02141c,1, -0x021418,1, -0x021414,1, -0x021410,1, -0x02140c,1, -0x021408,1, -0x021404,1, -0x021400,1, -0x021334,1, -0x021330,1, -0x021320,1, -0x021314,1, -0x021310,1, -0x021300,1, -0x021178,1, -0x021174,1, -0x021170,1, -0x02116c,1, -0x021168,1, -0x021164,1, -0x021160,1, -0x02115c,1, -0x021158,1, -0x021154,1, -0x021150,1, -0x02114c,1, -0x021148,1, -0x021144,1, -0x021140,1, -0x02113c,1, -0x021138,1, -0x021134,1, -0x021130,1, -0x02112c,1, -0x021128,1, -0x021124,1, -0x021120,1, -0x02111c,1, -0x021118,1, -0x021114,1, -0x021110,1, -0x02110c,1, -0x021108,1, -0x021104,1, -0x021100,1, -0x0210fc,1, -0x0210f8,1, -0x0210f4,1, -0x0210f0,1, -0x0210ec,1, -0x0210e8,1, -0x0210e4,1, -0x0210e0,1, -0x0210dc,1, -0x0210d8,1, -0x0210d4,1, -0x0210d0,1, -0x0210cc,1, -0x0210c8,1, -0x0210c4,1, -0x0210c0,1, -0x0210bc,1, -0x0210b8,1, -0x0210b4,1, -0x0210b0,1, -0x0210ac,1, -0x0210a8,1, -0x0210a4,1, -0x0210a0,1, -0x02109c,1, -0x021098,1, -0x021094,1, -0x021090,1, -0x02108c,1, -0x021088,1, -0x021084,1, -0x021080,1, -0x02107c,1, -0x021078,1, -0x021074,1, -0x021070,1, -0x02106c,1, -0x021068,1, -0x021064,1, -0x021060,1, -0x02105c,1, -0x021058,1, -0x021054,1, -0x021050,1, -0x02104c,1, -0x021048,1, -0x021044,1, -0x021040,1, -0x02103c,1, -0x021038,1, -0x021034,1, -0x021030,1, -0x02102c,1, -0x021028,1, -0x021024,1, -0x021020,1, -0x02101c,1, -0x021018,1, -0x021014,1, -0x021010,1, -0x02100c,1, -0x021008,1, -0x021004,1, -0x021000,1, -0x020ffc,1, -0x020ff8,1, -0x020ff4,1, -0x020fdc,1, -0x020fd4,1, -0x020fd0,1, -0x020fcc,1, -0x020fc8,1, -0x020fc4,1, -0x020fc0,1, -0x020fbc,1, -0x020fb8,1, -0x020fb4,1, -0x020fb0,1, -0x020fac,1, -0x020fa8,1, -0x020fa0,1, -0x020f9c,1, -0x020f98,1, -0x020f94,1, -0x020f90,1, -0x020f8c,1, -0x020f88,1, -0x020f84,1, -0x020f80,1, -0x020e94,1, -0x020e90,1, -0x020e80,1, -0x020e30,1, -0x020e2c,1, -0x020e28,1, -0x020e24,1, -0x020e20,1, -0x020e1c,1, -0x020e18,1, -0x020e14,1, -0x020e10,1, -0x020e0c,1, -0x020e04,1, -0x020e00,1, -0x020dfc,1, -0x020df8,1, -0x020df4,1, -0x020dec,1, -0x020de4,1, -0x020de0,1, -0x020ddc,1, -0x020dd8,1, -0x020dd4,1, -0x020dcc,1, -0x020dc8,1, -0x020dc0,1, -0x020db8,1, -0x020db4,1, -0x020db0,1, -0x020da8,1, -0x020da4,1, -0x020da0,1, -0x020d80,1, -0x020d7c,1, -0x020d78,1, -0x020d74,1, -0x020d70,1, -0x020d6c,1, -0x020d68,1, -0x020d64,1, -0x020d60,1, -0x020d5c,1, -0x020d58,1, -0x020d54,1, -0x020d50,1, -0x020d4c,1, -0x020d48,1, -0x020d44,1, -0x020d40,1, -0x020d34,1, -0x020d30,1, -0x020d20,1, -0x020d14,1, -0x020d10,1, -0x020d00,1, -0x020cec,1, -0x020ce8,1, -0x020ce4,1, -0x020ce0,1, -0x020cdc,1, -0x020cd8,1, -0x020cd4,1, -0x020cd0,1, -0x020ccc,1, -0x020cc8,1, -0x020c90,1, -0x020c8c,1, -0x020c88,1, -0x020c84,1, -0x020c80,1, -0x020c68,1, -0x020c50,1, -0x020c4c,1, -0x020c24,1, -0x020c20,1, -0x020c1c,1, -0x020c18,1, -0x020c14,1, -0x020c10,1, -0x020c0c,1, -0x020c08,1, -0x020c04,1, -0x020c00,1, -0x020b34,1, -0x020b30,1, -0x020b20,1, -0x020b14,1, -0x020b10,1, -0x020b00,1, -0x020978,1, -0x020974,1, -0x020970,1, -0x02096c,1, -0x020968,1, -0x020964,1, -0x020960,1, -0x02095c,1, -0x020958,1, -0x020954,1, -0x020950,1, -0x02094c,1, -0x020948,1, -0x020944,1, -0x020940,1, -0x02093c,1, -0x020938,1, -0x020934,1, -0x020930,1, -0x02092c,1, -0x020928,1, -0x020924,1, -0x020920,1, -0x02091c,1, -0x020918,1, -0x020914,1, -0x020910,1, -0x02090c,1, -0x020908,1, -0x020904,1, -0x020900,1, -0x0208fc,1, -0x0208f8,1, -0x0208f4,1, -0x0208f0,1, -0x0208ec,1, -0x0208e8,1, -0x0208e4,1, -0x0208e0,1, -0x0208dc,1, -0x0208d8,1, -0x0208d4,1, -0x0208d0,1, -0x0208cc,1, -0x0208c8,1, -0x0208c4,1, -0x0208c0,1, -0x0208bc,1, -0x0208b8,1, -0x0208b4,1, -0x0208b0,1, -0x0208ac,1, -0x0208a8,1, -0x0208a4,1, -0x0208a0,1, -0x02089c,1, -0x020898,1, -0x020894,1, -0x020890,1, -0x02088c,1, -0x020888,1, -0x020884,1, -0x020880,1, -0x02087c,1, -0x020878,1, -0x020874,1, -0x020870,1, -0x02086c,1, -0x020868,1, -0x020864,1, -0x020860,1, -0x02085c,1, -0x020858,1, -0x020854,1, -0x020850,1, -0x02084c,1, -0x020848,1, -0x020844,1, -0x020840,1, -0x02083c,1, -0x020838,1, -0x020834,1, -0x020830,1, -0x02082c,1, -0x020828,1, -0x020824,1, -0x020820,1, -0x02081c,1, -0x020818,1, -0x020814,1, -0x020810,1, -0x02080c,1, -0x020808,1, -0x020804,1, -0x020800,1, -0x0207fc,1, -0x0207f8,1, -0x0207f4,1, -0x0207dc,1, -0x0207d4,1, -0x0207d0,1, -0x0207cc,1, -0x0207c8,1, -0x0207c4,1, -0x0207c0,1, -0x0207bc,1, -0x0207b8,1, -0x0207b4,1, -0x0207b0,1, -0x0207ac,1, -0x0207a8,1, -0x0207a0,1, -0x02079c,1, -0x020798,1, -0x020794,1, -0x020790,1, -0x02078c,1, -0x020788,1, -0x020784,1, -0x020780,1, -0x020694,1, -0x020690,1, -0x020680,1, -0x020630,1, -0x02062c,1, -0x020628,1, -0x020624,1, -0x020620,1, -0x02061c,1, -0x020618,1, -0x020614,1, -0x020610,1, -0x02060c,1, -0x020604,1, -0x020600,1, -0x0205fc,1, -0x0205f8,1, -0x0205f4,1, -0x0205ec,1, -0x0205e4,1, -0x0205e0,1, -0x0205dc,1, -0x0205d8,1, -0x0205d4,1, -0x0205cc,1, -0x0205c8,1, -0x0205c0,1, -0x0205b8,1, -0x0205b4,1, -0x0205b0,1, -0x0205a8,1, -0x0205a4,1, -0x0205a0,1, -0x020580,1, -0x02057c,1, -0x020578,1, -0x020574,1, -0x020570,1, -0x02056c,1, -0x020568,1, -0x020564,1, -0x020560,1, -0x02055c,1, -0x020558,1, -0x020554,1, -0x020550,1, -0x02054c,1, -0x020548,1, -0x020544,1, -0x020540,1, -0x020534,1, -0x020530,1, -0x020520,1, -0x020514,1, -0x020510,1, -0x020500,1, -0x0204ec,1, -0x0204e8,1, -0x0204e4,1, -0x0204e0,1, -0x0204dc,1, -0x0204d8,1, -0x0204d4,1, -0x0204d0,1, -0x0204cc,1, -0x0204c8,1, -0x020490,1, -0x02048c,1, -0x020488,1, -0x020484,1, -0x020480,1, -0x020468,1, -0x020450,1, -0x02044c,1, -0x020424,1, -0x020420,1, -0x02041c,1, -0x020418,1, -0x020414,1, -0x020410,1, -0x02040c,1, -0x020408,1, -0x020404,1, -0x020400,1, -0x020334,1, -0x020330,1, -0x020320,1, -0x020314,1, -0x020310,1, -0x020300,1, -0x020178,1, -0x020174,1, -0x020170,1, -0x02016c,1, -0x020168,1, -0x020164,1, -0x020160,1, -0x02015c,1, -0x020158,1, -0x020154,1, -0x020150,1, -0x02014c,1, -0x020148,1, -0x020144,1, -0x020140,1, -0x02013c,1, -0x020138,1, -0x020134,1, -0x020130,1, -0x02012c,1, -0x020128,1, -0x020124,1, -0x020120,1, -0x02011c,1, -0x020118,1, -0x020114,1, -0x020110,1, -0x02010c,1, -0x020108,1, -0x020104,1, -0x020100,1, -0x0200fc,1, -0x0200f8,1, -0x0200f4,1, -0x0200f0,1, -0x0200ec,1, -0x0200e8,1, -0x0200e4,1, -0x0200e0,1, -0x0200dc,1, -0x0200d8,1, -0x0200d4,1, -0x0200d0,1, -0x0200cc,1, -0x0200c8,1, -0x0200c4,1, -0x0200c0,1, -0x0200bc,1, -0x0200b8,1, -0x0200b4,1, -0x0200b0,1, -0x0200ac,1, -0x0200a8,1, -0x0200a4,1, -0x0200a0,1, -0x02009c,1, -0x020098,1, -0x020094,1, -0x020090,1, -0x02008c,1, -0x020088,1, -0x020084,1, -0x020080,1, -0x02007c,1, -0x020078,1, -0x020074,1, -0x020070,1, -0x02006c,1, -0x020068,1, -0x020064,1, -0x020060,1, -0x02005c,1, -0x020058,1, -0x020054,1, -0x020050,1, -0x02004c,1, -0x020048,1, -0x020044,1, -0x020040,1, -0x02003c,1, -0x020038,1, -0x020034,1, -0x020030,1, -0x02002c,1, -0x020028,1, -0x020024,1, -0x020020,1, -0x02001c,1, -0x020018,1, -0x020014,1, -0x020010,1, -0x02000c,1, -0x020008,1, -0x020004,1, -0x020000,1, -0x01d9f4,1, -0x01d9f0,1, -0x01d9d4,1, -0x01d9d0,1, -0x01d9c0,1, -0x01d9b4,1, -0x01d9b0,1, -0x01d9a0,1, -0x01d994,1, -0x01d990,1, -0x01d980,1, -0x01d974,1, -0x01d970,1, -0x01d960,1, -0x01d954,1, -0x01d950,1, -0x01d940,1, -0x01d928,1, -0x01d924,1, -0x01d920,1, -0x01d91c,1, -0x01d918,1, -0x01d914,1, -0x01d910,1, -0x01d90c,1, -0x01d908,1, -0x01d904,1, -0x01d900,1, -0x01d8d4,1, -0x01d8d0,1, -0x01d8cc,1, -0x01d8c8,1, -0x01d8c4,1, -0x01d8c0,1, -0x01d8ac,1, -0x01d870,1, -0x01d86c,1, -0x01d868,1, -0x01d864,1, -0x01d860,1, -0x01d85c,1, -0x01d858,1, -0x01d854,1, -0x01d850,1, -0x01d84c,1, -0x01d848,1, -0x01d844,1, -0x01d840,1, -0x01d83c,1, -0x01d838,1, -0x01d834,1, -0x01d830,1, -0x01d82c,1, -0x01d828,1, -0x01d824,1, -0x01d820,1, -0x01d814,1, -0x01d810,1, -0x01d800,1, -0x01bb0c,1, -0x01bb08,1, -0x01bb04,1, -0x01bb00,1, -0x01baf4,1, -0x01baf0,1, -0x01ba74,1, -0x01ba70,1, -0x01ba60,1, -0x01ba54,1, -0x01ba50,1, -0x01ba40,1, -0x01ba28,1, -0x01ba1c,1, -0x01ba18,1, -0x01ba0c,1, -0x01ba00,1, -0x01b934,1, -0x01b930,1, -0x01b924,1, -0x01b920,1, -0x01b914,1, -0x01b910,1, -0x01b904,1, -0x01b900,1, -0x01b8f4,1, -0x01b8f0,1, -0x01b8e4,1, -0x01b8e0,1, -0x01b8b4,1, -0x01b8b0,1, -0x01b8ac,1, -0x01b8a8,1, -0x01b8a4,1, -0x01b8a0,1, -0x01b894,1, -0x01b890,1, -0x01b88c,1, -0x01b888,1, -0x01b884,1, -0x01b880,1, -0x01b870,1, -0x01b83c,1, -0x01b838,1, -0x01b834,1, -0x01b830,1, -0x01b82c,1, -0x01b828,1, -0x01b824,1, -0x01b820,1, -0x01b814,1, -0x01b810,1, -0x01b800,1, -0x01b7bc,1, -0x01b7b8,1, -0x01b7b4,1, -0x01b67c,1, -0x01b678,1, -0x01b674,1, -0x01b670,1, -0x01b66c,1, -0x01b668,1, -0x01b664,1, -0x01b660,1, -0x01b65c,1, -0x01b658,1, -0x01b654,1, -0x01b64c,1, -0x01b648,1, -0x01b644,1, -0x01b640,1, -0x01b62c,1, -0x01b628,1, -0x01b624,1, -0x01b620,1, -0x01b61c,1, -0x01b618,1, -0x01b614,1, -0x01b610,1, -0x01b60c,1, -0x01b608,1, -0x01b604,1, -0x01b600,1, -0x01b4a0,1, -0x01b49c,1, -0x01b498,1, -0x01b494,1, -0x01b490,1, -0x01b48c,1, -0x01b488,1, -0x01b484,1, -0x01b480,1, -0x01b47c,1, -0x01b478,1, -0x01b474,1, -0x01b470,1, -0x01b46c,1, -0x01b464,1, -0x01b45c,1, -0x01b458,1, -0x01b454,1, -0x01b450,1, -0x01b44c,1, -0x01b448,1, -0x01b444,1, -0x01b440,1, -0x01b43c,1, -0x01b438,1, -0x01b424,1, -0x01b420,1, -0x01b41c,1, -0x01b418,1, -0x01b414,1, -0x01b410,1, -0x01b40c,1, -0x01b408,1, -0x01b404,1, -0x01b400,1, -0x01b040,1, -0x01b000,1, -0x01affc,1, -0x01aff8,1, -0x01aff4,1, -0x01afdc,1, -0x01afd4,1, -0x01afd0,1, -0x01afcc,1, -0x01afc8,1, -0x01afc4,1, -0x01afc0,1, -0x01afbc,1, -0x01afb8,1, -0x01afb4,1, -0x01afb0,1, -0x01afac,1, -0x01afa8,1, -0x01afa0,1, -0x01af9c,1, -0x01af98,1, -0x01af94,1, -0x01af90,1, -0x01af8c,1, -0x01af88,1, -0x01af84,1, -0x01af80,1, -0x01ae94,1, -0x01ae90,1, -0x01ae80,1, -0x01ae30,1, -0x01ae2c,1, -0x01ae28,1, -0x01ae24,1, -0x01ae20,1, -0x01ae1c,1, -0x01ae18,1, -0x01ae14,1, -0x01ae10,1, -0x01ae0c,1, -0x01ae04,1, -0x01ae00,1, -0x01adfc,1, -0x01adf8,1, -0x01adf4,1, -0x01adec,1, -0x01ade4,1, -0x01ade0,1, -0x01addc,1, -0x01add8,1, -0x01add4,1, -0x01adcc,1, -0x01adc8,1, -0x01adc0,1, -0x01adb8,1, -0x01adb4,1, -0x01adb0,1, -0x01ada8,1, -0x01ada4,1, -0x01ada0,1, -0x01ad80,1, -0x01ad7c,1, -0x01ad78,1, -0x01ad74,1, -0x01ad70,1, -0x01ad6c,1, -0x01ad68,1, -0x01ad64,1, -0x01ad60,1, -0x01ad5c,1, -0x01ad58,1, -0x01ad54,1, -0x01ad50,1, -0x01ad4c,1, -0x01ad48,1, -0x01ad44,1, -0x01ad40,1, -0x01ad34,1, -0x01ad30,1, -0x01ad20,1, -0x01ad14,1, -0x01ad10,1, -0x01ad00,1, -0x01acec,1, -0x01ace8,1, -0x01ace4,1, -0x01ace0,1, -0x01acdc,1, -0x01acd8,1, -0x01acd4,1, -0x01acd0,1, -0x01accc,1, -0x01acc8,1, -0x01ac90,1, -0x01ac8c,1, -0x01ac88,1, -0x01ac84,1, -0x01ac80,1, -0x01ac68,1, -0x01ac50,1, -0x01ac4c,1, -0x01ac24,1, -0x01ac20,1, -0x01ac1c,1, -0x01ac18,1, -0x01ac14,1, -0x01ac10,1, -0x01ac0c,1, -0x01ac08,1, -0x01ac04,1, -0x01ac00,1, -0x01ab34,1, -0x01ab30,1, -0x01ab20,1, -0x01ab14,1, -0x01ab10,1, -0x01ab00,1, -0x01a978,1, -0x01a974,1, -0x01a970,1, -0x01a96c,1, -0x01a968,1, -0x01a964,1, -0x01a960,1, -0x01a95c,1, -0x01a958,1, -0x01a954,1, -0x01a950,1, -0x01a94c,1, -0x01a948,1, -0x01a944,1, -0x01a940,1, -0x01a93c,1, -0x01a938,1, -0x01a934,1, -0x01a930,1, -0x01a92c,1, -0x01a928,1, -0x01a924,1, -0x01a920,1, -0x01a91c,1, -0x01a918,1, -0x01a914,1, -0x01a910,1, -0x01a90c,1, -0x01a908,1, -0x01a904,1, -0x01a900,1, -0x01a8fc,1, -0x01a8f8,1, -0x01a8f4,1, -0x01a8f0,1, -0x01a8ec,1, -0x01a8e8,1, -0x01a8e4,1, -0x01a8e0,1, -0x01a8dc,1, -0x01a8d8,1, -0x01a8d4,1, -0x01a8d0,1, -0x01a8cc,1, -0x01a8c8,1, -0x01a8c4,1, -0x01a8c0,1, -0x01a8bc,1, -0x01a8b8,1, -0x01a8b4,1, -0x01a8b0,1, -0x01a8ac,1, -0x01a8a8,1, -0x01a8a4,1, -0x01a8a0,1, -0x01a89c,1, -0x01a898,1, -0x01a894,1, -0x01a890,1, -0x01a88c,1, -0x01a888,1, -0x01a884,1, -0x01a880,1, -0x01a87c,1, -0x01a878,1, -0x01a874,1, -0x01a870,1, -0x01a86c,1, -0x01a868,1, -0x01a864,1, -0x01a860,1, -0x01a85c,1, -0x01a858,1, -0x01a854,1, -0x01a850,1, -0x01a84c,1, -0x01a848,1, -0x01a844,1, -0x01a840,1, -0x01a83c,1, -0x01a838,1, -0x01a834,1, -0x01a830,1, -0x01a82c,1, -0x01a828,1, -0x01a824,1, -0x01a820,1, -0x01a81c,1, -0x01a818,1, -0x01a814,1, -0x01a810,1, -0x01a80c,1, -0x01a808,1, -0x01a804,1, -0x01a800,1, -0x01a7fc,1, -0x01a7f8,1, -0x01a7f4,1, -0x01a7dc,1, -0x01a7d4,1, -0x01a7d0,1, -0x01a7cc,1, -0x01a7c8,1, -0x01a7c4,1, -0x01a7c0,1, -0x01a7bc,1, -0x01a7b8,1, -0x01a7b4,1, -0x01a7b0,1, -0x01a7ac,1, -0x01a7a8,1, -0x01a7a0,1, -0x01a79c,1, -0x01a798,1, -0x01a794,1, -0x01a790,1, -0x01a78c,1, -0x01a788,1, -0x01a784,1, -0x01a780,1, -0x01a694,1, -0x01a690,1, -0x01a680,1, -0x01a630,1, -0x01a62c,1, -0x01a628,1, -0x01a624,1, -0x01a620,1, -0x01a61c,1, -0x01a618,1, -0x01a614,1, -0x01a610,1, -0x01a60c,1, -0x01a604,1, -0x01a600,1, -0x01a5fc,1, -0x01a5f8,1, -0x01a5f4,1, -0x01a5ec,1, -0x01a5e4,1, -0x01a5e0,1, -0x01a5dc,1, -0x01a5d8,1, -0x01a5d4,1, -0x01a5cc,1, -0x01a5c8,1, -0x01a5c0,1, -0x01a5b8,1, -0x01a5b4,1, -0x01a5b0,1, -0x01a5a8,1, -0x01a5a4,1, -0x01a5a0,1, -0x01a580,1, -0x01a57c,1, -0x01a578,1, -0x01a574,1, -0x01a570,1, -0x01a56c,1, -0x01a568,1, -0x01a564,1, -0x01a560,1, -0x01a55c,1, -0x01a558,1, -0x01a554,1, -0x01a550,1, -0x01a54c,1, -0x01a548,1, -0x01a544,1, -0x01a540,1, -0x01a534,1, -0x01a530,1, -0x01a520,1, -0x01a514,1, -0x01a510,1, -0x01a500,1, -0x01a4ec,1, -0x01a4e8,1, -0x01a4e4,1, -0x01a4e0,1, -0x01a4dc,1, -0x01a4d8,1, -0x01a4d4,1, -0x01a4d0,1, -0x01a4cc,1, -0x01a4c8,1, -0x01a490,1, -0x01a48c,1, -0x01a488,1, -0x01a484,1, -0x01a480,1, -0x01a468,1, -0x01a450,1, -0x01a44c,1, -0x01a424,1, -0x01a420,1, -0x01a41c,1, -0x01a418,1, -0x01a414,1, -0x01a410,1, -0x01a40c,1, -0x01a408,1, -0x01a404,1, -0x01a400,1, -0x01a334,1, -0x01a330,1, -0x01a320,1, -0x01a314,1, -0x01a310,1, -0x01a300,1, -0x01a178,1, -0x01a174,1, -0x01a170,1, -0x01a16c,1, -0x01a168,1, -0x01a164,1, -0x01a160,1, -0x01a15c,1, -0x01a158,1, -0x01a154,1, -0x01a150,1, -0x01a14c,1, -0x01a148,1, -0x01a144,1, -0x01a140,1, -0x01a13c,1, -0x01a138,1, -0x01a134,1, -0x01a130,1, -0x01a12c,1, -0x01a128,1, -0x01a124,1, -0x01a120,1, -0x01a11c,1, -0x01a118,1, -0x01a114,1, -0x01a110,1, -0x01a10c,1, -0x01a108,1, -0x01a104,1, -0x01a100,1, -0x01a0fc,1, -0x01a0f8,1, -0x01a0f4,1, -0x01a0f0,1, -0x01a0ec,1, -0x01a0e8,1, -0x01a0e4,1, -0x01a0e0,1, -0x01a0dc,1, -0x01a0d8,1, -0x01a0d4,1, -0x01a0d0,1, -0x01a0cc,1, -0x01a0c8,1, -0x01a0c4,1, -0x01a0c0,1, -0x01a0bc,1, -0x01a0b8,1, -0x01a0b4,1, -0x01a0b0,1, -0x01a0ac,1, -0x01a0a8,1, -0x01a0a4,1, -0x01a0a0,1, -0x01a09c,1, -0x01a098,1, -0x01a094,1, -0x01a090,1, -0x01a08c,1, -0x01a088,1, -0x01a084,1, -0x01a080,1, -0x01a07c,1, -0x01a078,1, -0x01a074,1, -0x01a070,1, -0x01a06c,1, -0x01a068,1, -0x01a064,1, -0x01a060,1, -0x01a05c,1, -0x01a058,1, -0x01a054,1, -0x01a050,1, -0x01a04c,1, -0x01a048,1, -0x01a044,1, -0x01a040,1, -0x01a03c,1, -0x01a038,1, -0x01a034,1, -0x01a030,1, -0x01a02c,1, -0x01a028,1, -0x01a024,1, -0x01a020,1, -0x01a01c,1, -0x01a018,1, -0x01a014,1, -0x01a010,1, -0x01a00c,1, -0x01a008,1, -0x01a004,1, -0x01a000,1, -0x019ffc,1, -0x019ff8,1, -0x019ff4,1, -0x019fdc,1, -0x019fd4,1, -0x019fd0,1, -0x019fcc,1, -0x019fc8,1, -0x019fc4,1, -0x019fc0,1, -0x019fbc,1, -0x019fb8,1, -0x019fb4,1, -0x019fb0,1, -0x019fac,1, -0x019fa8,1, -0x019fa0,1, -0x019f9c,1, -0x019f98,1, -0x019f94,1, -0x019f90,1, -0x019f8c,1, -0x019f88,1, -0x019f84,1, -0x019f80,1, -0x019e94,1, -0x019e90,1, -0x019e80,1, -0x019e30,1, -0x019e2c,1, -0x019e28,1, -0x019e24,1, -0x019e20,1, -0x019e1c,1, -0x019e18,1, -0x019e14,1, -0x019e10,1, -0x019e0c,1, -0x019e04,1, -0x019e00,1, -0x019dfc,1, -0x019df8,1, -0x019df4,1, -0x019dec,1, -0x019de4,1, -0x019de0,1, -0x019ddc,1, -0x019dd8,1, -0x019dd4,1, -0x019dcc,1, -0x019dc8,1, -0x019dc0,1, -0x019db8,1, -0x019db4,1, -0x019db0,1, -0x019da8,1, -0x019da4,1, -0x019da0,1, -0x019d80,1, -0x019d7c,1, -0x019d78,1, -0x019d74,1, -0x019d70,1, -0x019d6c,1, -0x019d68,1, -0x019d64,1, -0x019d60,1, -0x019d5c,1, -0x019d58,1, -0x019d54,1, -0x019d50,1, -0x019d4c,1, -0x019d48,1, -0x019d44,1, -0x019d40,1, -0x019d34,1, -0x019d30,1, -0x019d20,1, -0x019d14,1, -0x019d10,1, -0x019d00,1, -0x019cec,1, -0x019ce8,1, -0x019ce4,1, -0x019ce0,1, -0x019cdc,1, -0x019cd8,1, -0x019cd4,1, -0x019cd0,1, -0x019ccc,1, -0x019cc8,1, -0x019c90,1, -0x019c8c,1, -0x019c88,1, -0x019c84,1, -0x019c80,1, -0x019c68,1, -0x019c50,1, -0x019c4c,1, -0x019c24,1, -0x019c20,1, -0x019c1c,1, -0x019c18,1, -0x019c14,1, -0x019c10,1, -0x019c0c,1, -0x019c08,1, -0x019c04,1, -0x019c00,1, -0x019b34,1, -0x019b30,1, -0x019b20,1, -0x019b14,1, -0x019b10,1, -0x019b00,1, -0x019978,1, -0x019974,1, -0x019970,1, -0x01996c,1, -0x019968,1, -0x019964,1, -0x019960,1, -0x01995c,1, -0x019958,1, -0x019954,1, -0x019950,1, -0x01994c,1, -0x019948,1, -0x019944,1, -0x019940,1, -0x01993c,1, -0x019938,1, -0x019934,1, -0x019930,1, -0x01992c,1, -0x019928,1, -0x019924,1, -0x019920,1, -0x01991c,1, -0x019918,1, -0x019914,1, -0x019910,1, -0x01990c,1, -0x019908,1, -0x019904,1, -0x019900,1, -0x0198fc,1, -0x0198f8,1, -0x0198f4,1, -0x0198f0,1, -0x0198ec,1, -0x0198e8,1, -0x0198e4,1, -0x0198e0,1, -0x0198dc,1, -0x0198d8,1, -0x0198d4,1, -0x0198d0,1, -0x0198cc,1, -0x0198c8,1, -0x0198c4,1, -0x0198c0,1, -0x0198bc,1, -0x0198b8,1, -0x0198b4,1, -0x0198b0,1, -0x0198ac,1, -0x0198a8,1, -0x0198a4,1, -0x0198a0,1, -0x01989c,1, -0x019898,1, -0x019894,1, -0x019890,1, -0x01988c,1, -0x019888,1, -0x019884,1, -0x019880,1, -0x01987c,1, -0x019878,1, -0x019874,1, -0x019870,1, -0x01986c,1, -0x019868,1, -0x019864,1, -0x019860,1, -0x01985c,1, -0x019858,1, -0x019854,1, -0x019850,1, -0x01984c,1, -0x019848,1, -0x019844,1, -0x019840,1, -0x01983c,1, -0x019838,1, -0x019834,1, -0x019830,1, -0x01982c,1, -0x019828,1, -0x019824,1, -0x019820,1, -0x01981c,1, -0x019818,1, -0x019814,1, -0x019810,1, -0x01980c,1, -0x019808,1, -0x019804,1, -0x019800,1, -0x0197fc,1, -0x0197f8,1, -0x0197f4,1, -0x0197dc,1, -0x0197d4,1, -0x0197d0,1, -0x0197cc,1, -0x0197c8,1, -0x0197c4,1, -0x0197c0,1, -0x0197bc,1, -0x0197b8,1, -0x0197b4,1, -0x0197b0,1, -0x0197ac,1, -0x0197a8,1, -0x0197a0,1, -0x01979c,1, -0x019798,1, -0x019794,1, -0x019790,1, -0x01978c,1, -0x019788,1, -0x019784,1, -0x019780,1, -0x019694,1, -0x019690,1, -0x019680,1, -0x019630,1, -0x01962c,1, -0x019628,1, -0x019624,1, -0x019620,1, -0x01961c,1, -0x019618,1, -0x019614,1, -0x019610,1, -0x01960c,1, -0x019604,1, -0x019600,1, -0x0195fc,1, -0x0195f8,1, -0x0195f4,1, -0x0195ec,1, -0x0195e4,1, -0x0195e0,1, -0x0195dc,1, -0x0195d8,1, -0x0195d4,1, -0x0195cc,1, -0x0195c8,1, -0x0195c0,1, -0x0195b8,1, -0x0195b4,1, -0x0195b0,1, -0x0195a8,1, -0x0195a4,1, -0x0195a0,1, -0x019580,1, -0x01957c,1, -0x019578,1, -0x019574,1, -0x019570,1, -0x01956c,1, -0x019568,1, -0x019564,1, -0x019560,1, -0x01955c,1, -0x019558,1, -0x019554,1, -0x019550,1, -0x01954c,1, -0x019548,1, -0x019544,1, -0x019540,1, -0x019534,1, -0x019530,1, -0x019520,1, -0x019514,1, -0x019510,1, -0x019500,1, -0x0194ec,1, -0x0194e8,1, -0x0194e4,1, -0x0194e0,1, -0x0194dc,1, -0x0194d8,1, -0x0194d4,1, -0x0194d0,1, -0x0194cc,1, -0x0194c8,1, -0x019490,1, -0x01948c,1, -0x019488,1, -0x019484,1, -0x019480,1, -0x019468,1, -0x019450,1, -0x01944c,1, -0x019424,1, -0x019420,1, -0x01941c,1, -0x019418,1, -0x019414,1, -0x019410,1, -0x01940c,1, -0x019408,1, -0x019404,1, -0x019400,1, -0x019334,1, -0x019330,1, -0x019320,1, -0x019314,1, -0x019310,1, -0x019300,1, -0x019178,1, -0x019174,1, -0x019170,1, -0x01916c,1, -0x019168,1, -0x019164,1, -0x019160,1, -0x01915c,1, -0x019158,1, -0x019154,1, -0x019150,1, -0x01914c,1, -0x019148,1, -0x019144,1, -0x019140,1, -0x01913c,1, -0x019138,1, -0x019134,1, -0x019130,1, -0x01912c,1, -0x019128,1, -0x019124,1, -0x019120,1, -0x01911c,1, -0x019118,1, -0x019114,1, -0x019110,1, -0x01910c,1, -0x019108,1, -0x019104,1, -0x019100,1, -0x0190fc,1, -0x0190f8,1, -0x0190f4,1, -0x0190f0,1, -0x0190ec,1, -0x0190e8,1, -0x0190e4,1, -0x0190e0,1, -0x0190dc,1, -0x0190d8,1, -0x0190d4,1, -0x0190d0,1, -0x0190cc,1, -0x0190c8,1, -0x0190c4,1, -0x0190c0,1, -0x0190bc,1, -0x0190b8,1, -0x0190b4,1, -0x0190b0,1, -0x0190ac,1, -0x0190a8,1, -0x0190a4,1, -0x0190a0,1, -0x01909c,1, -0x019098,1, -0x019094,1, -0x019090,1, -0x01908c,1, -0x019088,1, -0x019084,1, -0x019080,1, -0x01907c,1, -0x019078,1, -0x019074,1, -0x019070,1, -0x01906c,1, -0x019068,1, -0x019064,1, -0x019060,1, -0x01905c,1, -0x019058,1, -0x019054,1, -0x019050,1, -0x01904c,1, -0x019048,1, -0x019044,1, -0x019040,1, -0x01903c,1, -0x019038,1, -0x019034,1, -0x019030,1, -0x01902c,1, -0x019028,1, -0x019024,1, -0x019020,1, -0x01901c,1, -0x019018,1, -0x019014,1, -0x019010,1, -0x01900c,1, -0x019008,1, -0x019004,1, -0x019000,1, -0x018ffc,1, -0x018ff8,1, -0x018ff4,1, -0x018fdc,1, -0x018fd4,1, -0x018fd0,1, -0x018fcc,1, -0x018fc8,1, -0x018fc4,1, -0x018fc0,1, -0x018fbc,1, -0x018fb8,1, -0x018fb4,1, -0x018fb0,1, -0x018fac,1, -0x018fa8,1, -0x018fa0,1, -0x018f9c,1, -0x018f98,1, -0x018f94,1, -0x018f90,1, -0x018f8c,1, -0x018f88,1, -0x018f84,1, -0x018f80,1, -0x018e94,1, -0x018e90,1, -0x018e80,1, -0x018e30,1, -0x018e2c,1, -0x018e28,1, -0x018e24,1, -0x018e20,1, -0x018e1c,1, -0x018e18,1, -0x018e14,1, -0x018e10,1, -0x018e0c,1, -0x018e04,1, -0x018e00,1, -0x018dfc,1, -0x018df8,1, -0x018df4,1, -0x018dec,1, -0x018de4,1, -0x018de0,1, -0x018ddc,1, -0x018dd8,1, -0x018dd4,1, -0x018dcc,1, -0x018dc8,1, -0x018dc0,1, -0x018db8,1, -0x018db4,1, -0x018db0,1, -0x018da8,1, -0x018da4,1, -0x018da0,1, -0x018d80,1, -0x018d7c,1, -0x018d78,1, -0x018d74,1, -0x018d70,1, -0x018d6c,1, -0x018d68,1, -0x018d64,1, -0x018d60,1, -0x018d5c,1, -0x018d58,1, -0x018d54,1, -0x018d50,1, -0x018d4c,1, -0x018d48,1, -0x018d44,1, -0x018d40,1, -0x018d34,1, -0x018d30,1, -0x018d20,1, -0x018d14,1, -0x018d10,1, -0x018d00,1, -0x018cec,1, -0x018ce8,1, -0x018ce4,1, -0x018ce0,1, -0x018cdc,1, -0x018cd8,1, -0x018cd4,1, -0x018cd0,1, -0x018ccc,1, -0x018cc8,1, -0x018c90,1, -0x018c8c,1, -0x018c88,1, -0x018c84,1, -0x018c80,1, -0x018c68,1, -0x018c50,1, -0x018c4c,1, -0x018c24,1, -0x018c20,1, -0x018c1c,1, -0x018c18,1, -0x018c14,1, -0x018c10,1, -0x018c0c,1, -0x018c08,1, -0x018c04,1, -0x018c00,1, -0x018b34,1, -0x018b30,1, -0x018b20,1, -0x018b14,1, -0x018b10,1, -0x018b00,1, -0x018978,1, -0x018974,1, -0x018970,1, -0x01896c,1, -0x018968,1, -0x018964,1, -0x018960,1, -0x01895c,1, -0x018958,1, -0x018954,1, -0x018950,1, -0x01894c,1, -0x018948,1, -0x018944,1, -0x018940,1, -0x01893c,1, -0x018938,1, -0x018934,1, -0x018930,1, -0x01892c,1, -0x018928,1, -0x018924,1, -0x018920,1, -0x01891c,1, -0x018918,1, -0x018914,1, -0x018910,1, -0x01890c,1, -0x018908,1, -0x018904,1, -0x018900,1, -0x0188fc,1, -0x0188f8,1, -0x0188f4,1, -0x0188f0,1, -0x0188ec,1, -0x0188e8,1, -0x0188e4,1, -0x0188e0,1, -0x0188dc,1, -0x0188d8,1, -0x0188d4,1, -0x0188d0,1, -0x0188cc,1, -0x0188c8,1, -0x0188c4,1, -0x0188c0,1, -0x0188bc,1, -0x0188b8,1, -0x0188b4,1, -0x0188b0,1, -0x0188ac,1, -0x0188a8,1, -0x0188a4,1, -0x0188a0,1, -0x01889c,1, -0x018898,1, -0x018894,1, -0x018890,1, -0x01888c,1, -0x018888,1, -0x018884,1, -0x018880,1, -0x01887c,1, -0x018878,1, -0x018874,1, -0x018870,1, -0x01886c,1, -0x018868,1, -0x018864,1, -0x018860,1, -0x01885c,1, -0x018858,1, -0x018854,1, -0x018850,1, -0x01884c,1, -0x018848,1, -0x018844,1, -0x018840,1, -0x01883c,1, -0x018838,1, -0x018834,1, -0x018830,1, -0x01882c,1, -0x018828,1, -0x018824,1, -0x018820,1, -0x01881c,1, -0x018818,1, -0x018814,1, -0x018810,1, -0x01880c,1, -0x018808,1, -0x018804,1, -0x018800,1, -0x0187fc,1, -0x0187f8,1, -0x0187f4,1, -0x0187dc,1, -0x0187d4,1, -0x0187d0,1, -0x0187cc,1, -0x0187c8,1, -0x0187c4,1, -0x0187c0,1, -0x0187bc,1, -0x0187b8,1, -0x0187b4,1, -0x0187b0,1, -0x0187ac,1, -0x0187a8,1, -0x0187a0,1, -0x01879c,1, -0x018798,1, -0x018794,1, -0x018790,1, -0x01878c,1, -0x018788,1, -0x018784,1, -0x018780,1, -0x018694,1, -0x018690,1, -0x018680,1, -0x018630,1, -0x01862c,1, -0x018628,1, -0x018624,1, -0x018620,1, -0x01861c,1, -0x018618,1, -0x018614,1, -0x018610,1, -0x01860c,1, -0x018604,1, -0x018600,1, -0x0185fc,1, -0x0185f8,1, -0x0185f4,1, -0x0185ec,1, -0x0185e4,1, -0x0185e0,1, -0x0185dc,1, -0x0185d8,1, -0x0185d4,1, -0x0185cc,1, -0x0185c8,1, -0x0185c0,1, -0x0185b8,1, -0x0185b4,1, -0x0185b0,1, -0x0185a8,1, -0x0185a4,1, -0x0185a0,1, -0x018580,1, -0x01857c,1, -0x018578,1, -0x018574,1, -0x018570,1, -0x01856c,1, -0x018568,1, -0x018564,1, -0x018560,1, -0x01855c,1, -0x018558,1, -0x018554,1, -0x018550,1, -0x01854c,1, -0x018548,1, -0x018544,1, -0x018540,1, -0x018534,1, -0x018530,1, -0x018520,1, -0x018514,1, -0x018510,1, -0x018500,1, -0x0184ec,1, -0x0184e8,1, -0x0184e4,1, -0x0184e0,1, -0x0184dc,1, -0x0184d8,1, -0x0184d4,1, -0x0184d0,1, -0x0184cc,1, -0x0184c8,1, -0x018490,1, -0x01848c,1, -0x018488,1, -0x018484,1, -0x018480,1, -0x018468,1, -0x018450,1, -0x01844c,1, -0x018424,1, -0x018420,1, -0x01841c,1, -0x018418,1, -0x018414,1, -0x018410,1, -0x01840c,1, -0x018408,1, -0x018404,1, -0x018400,1, -0x018334,1, -0x018330,1, -0x018320,1, -0x018314,1, -0x018310,1, -0x018300,1, -0x018178,1, -0x018174,1, -0x018170,1, -0x01816c,1, -0x018168,1, -0x018164,1, -0x018160,1, -0x01815c,1, -0x018158,1, -0x018154,1, -0x018150,1, -0x01814c,1, -0x018148,1, -0x018144,1, -0x018140,1, -0x01813c,1, -0x018138,1, -0x018134,1, -0x018130,1, -0x01812c,1, -0x018128,1, -0x018124,1, -0x018120,1, -0x01811c,1, -0x018118,1, -0x018114,1, -0x018110,1, -0x01810c,1, -0x018108,1, -0x018104,1, -0x018100,1, -0x0180fc,1, -0x0180f8,1, -0x0180f4,1, -0x0180f0,1, -0x0180ec,1, -0x0180e8,1, -0x0180e4,1, -0x0180e0,1, -0x0180dc,1, -0x0180d8,1, -0x0180d4,1, -0x0180d0,1, -0x0180cc,1, -0x0180c8,1, -0x0180c4,1, -0x0180c0,1, -0x0180bc,1, -0x0180b8,1, -0x0180b4,1, -0x0180b0,1, -0x0180ac,1, -0x0180a8,1, -0x0180a4,1, -0x0180a0,1, -0x01809c,1, -0x018098,1, -0x018094,1, -0x018090,1, -0x01808c,1, -0x018088,1, -0x018084,1, -0x018080,1, -0x01807c,1, -0x018078,1, -0x018074,1, -0x018070,1, -0x01806c,1, -0x018068,1, -0x018064,1, -0x018060,1, -0x01805c,1, -0x018058,1, -0x018054,1, -0x018050,1, -0x01804c,1, -0x018048,1, -0x018044,1, -0x018040,1, -0x01803c,1, -0x018038,1, -0x018034,1, -0x018030,1, -0x01802c,1, -0x018028,1, -0x018024,1, -0x018020,1, -0x01801c,1, -0x018018,1, -0x018014,1, -0x018010,1, -0x01800c,1, -0x018008,1, -0x018004,1, -0x018000,1, -0x0159f4,1, -0x0159f0,1, -0x0159d4,1, -0x0159d0,1, -0x0159c0,1, -0x0159b4,1, -0x0159b0,1, -0x0159a0,1, -0x015994,1, -0x015990,1, -0x015980,1, -0x015974,1, -0x015970,1, -0x015960,1, -0x015954,1, -0x015950,1, -0x015940,1, -0x015928,1, -0x015924,1, -0x015920,1, -0x01591c,1, -0x015918,1, -0x015914,1, -0x015910,1, -0x01590c,1, -0x015908,1, -0x015904,1, -0x015900,1, -0x0158d4,1, -0x0158d0,1, -0x0158cc,1, -0x0158c8,1, -0x0158c4,1, -0x0158c0,1, -0x0158ac,1, -0x015870,1, -0x01586c,1, -0x015868,1, -0x015864,1, -0x015860,1, -0x01585c,1, -0x015858,1, -0x015854,1, -0x015850,1, -0x01584c,1, -0x015848,1, -0x015844,1, -0x015840,1, -0x01583c,1, -0x015838,1, -0x015834,1, -0x015830,1, -0x01582c,1, -0x015828,1, -0x015824,1, -0x015820,1, -0x015814,1, -0x015810,1, -0x015800,1, -0x013b0c,1, -0x013b08,1, -0x013b04,1, -0x013b00,1, -0x013af4,1, -0x013af0,1, -0x013a74,1, -0x013a70,1, -0x013a60,1, -0x013a54,1, -0x013a50,1, -0x013a40,1, -0x013a28,1, -0x013a1c,1, -0x013a18,1, -0x013a0c,1, -0x013a00,1, -0x013934,1, -0x013930,1, -0x013924,1, -0x013920,1, -0x013914,1, -0x013910,1, -0x013904,1, -0x013900,1, -0x0138f4,1, -0x0138f0,1, -0x0138e4,1, -0x0138e0,1, -0x0138b4,1, -0x0138b0,1, -0x0138ac,1, -0x0138a8,1, -0x0138a4,1, -0x0138a0,1, -0x013894,1, -0x013890,1, -0x01388c,1, -0x013888,1, -0x013884,1, -0x013880,1, -0x013870,1, -0x01383c,1, -0x013838,1, -0x013834,1, -0x013830,1, -0x01382c,1, -0x013828,1, -0x013824,1, -0x013820,1, -0x013814,1, -0x013810,1, -0x013800,1, -0x0137bc,1, -0x0137b8,1, -0x0137b4,1, -0x01367c,1, -0x013678,1, -0x013674,1, -0x013670,1, -0x01366c,1, -0x013668,1, -0x013664,1, -0x013660,1, -0x01365c,1, -0x013658,1, -0x013654,1, -0x01364c,1, -0x013648,1, -0x013644,1, -0x013640,1, -0x01362c,1, -0x013628,1, -0x013624,1, -0x013620,1, -0x01361c,1, -0x013618,1, -0x013614,1, -0x013610,1, -0x01360c,1, -0x013608,1, -0x013604,1, -0x013600,1, -0x0134a0,1, -0x01349c,1, -0x013498,1, -0x013494,1, -0x013490,1, -0x01348c,1, -0x013488,1, -0x013484,1, -0x013480,1, -0x01347c,1, -0x013478,1, -0x013474,1, -0x013470,1, -0x01346c,1, -0x013464,1, -0x01345c,1, -0x013458,1, -0x013454,1, -0x013450,1, -0x01344c,1, -0x013448,1, -0x013444,1, -0x013440,1, -0x01343c,1, -0x013438,1, -0x013424,1, -0x013420,1, -0x01341c,1, -0x013418,1, -0x013414,1, -0x013410,1, -0x01340c,1, -0x013408,1, -0x013404,1, -0x013400,1, -0x013040,1, -0x013000,1, -0x012ffc,1, -0x012ff8,1, -0x012ff4,1, -0x012fdc,1, -0x012fd4,1, -0x012fd0,1, -0x012fcc,1, -0x012fc8,1, -0x012fc4,1, -0x012fc0,1, -0x012fbc,1, -0x012fb8,1, -0x012fb4,1, -0x012fb0,1, -0x012fac,1, -0x012fa8,1, -0x012fa0,1, -0x012f9c,1, -0x012f98,1, -0x012f94,1, -0x012f90,1, -0x012f8c,1, -0x012f88,1, -0x012f84,1, -0x012f80,1, -0x012e94,1, -0x012e90,1, -0x012e80,1, -0x012e30,1, -0x012e2c,1, -0x012e28,1, -0x012e24,1, -0x012e20,1, -0x012e1c,1, -0x012e18,1, -0x012e14,1, -0x012e10,1, -0x012e0c,1, -0x012e04,1, -0x012e00,1, -0x012dfc,1, -0x012df8,1, -0x012df4,1, -0x012dec,1, -0x012de4,1, -0x012de0,1, -0x012ddc,1, -0x012dd8,1, -0x012dd4,1, -0x012dcc,1, -0x012dc8,1, -0x012dc0,1, -0x012db8,1, -0x012db4,1, -0x012db0,1, -0x012da8,1, -0x012da4,1, -0x012da0,1, -0x012d80,1, -0x012d7c,1, -0x012d78,1, -0x012d74,1, -0x012d70,1, -0x012d6c,1, -0x012d68,1, -0x012d64,1, -0x012d60,1, -0x012d5c,1, -0x012d58,1, -0x012d54,1, -0x012d50,1, -0x012d4c,1, -0x012d48,1, -0x012d44,1, -0x012d40,1, -0x012d34,1, -0x012d30,1, -0x012d20,1, -0x012d14,1, -0x012d10,1, -0x012d00,1, -0x012cec,1, -0x012ce8,1, -0x012ce4,1, -0x012ce0,1, -0x012cdc,1, -0x012cd8,1, -0x012cd4,1, -0x012cd0,1, -0x012ccc,1, -0x012cc8,1, -0x012c90,1, -0x012c8c,1, -0x012c88,1, -0x012c84,1, -0x012c80,1, -0x012c68,1, -0x012c50,1, -0x012c4c,1, -0x012c24,1, -0x012c20,1, -0x012c1c,1, -0x012c18,1, -0x012c14,1, -0x012c10,1, -0x012c0c,1, -0x012c08,1, -0x012c04,1, -0x012c00,1, -0x012b34,1, -0x012b30,1, -0x012b20,1, -0x012b14,1, -0x012b10,1, -0x012b00,1, -0x012978,1, -0x012974,1, -0x012970,1, -0x01296c,1, -0x012968,1, -0x012964,1, -0x012960,1, -0x01295c,1, -0x012958,1, -0x012954,1, -0x012950,1, -0x01294c,1, -0x012948,1, -0x012944,1, -0x012940,1, -0x01293c,1, -0x012938,1, -0x012934,1, -0x012930,1, -0x01292c,1, -0x012928,1, -0x012924,1, -0x012920,1, -0x01291c,1, -0x012918,1, -0x012914,1, -0x012910,1, -0x01290c,1, -0x012908,1, -0x012904,1, -0x012900,1, -0x0128fc,1, -0x0128f8,1, -0x0128f4,1, -0x0128f0,1, -0x0128ec,1, -0x0128e8,1, -0x0128e4,1, -0x0128e0,1, -0x0128dc,1, -0x0128d8,1, -0x0128d4,1, -0x0128d0,1, -0x0128cc,1, -0x0128c8,1, -0x0128c4,1, -0x0128c0,1, -0x0128bc,1, -0x0128b8,1, -0x0128b4,1, -0x0128b0,1, -0x0128ac,1, -0x0128a8,1, -0x0128a4,1, -0x0128a0,1, -0x01289c,1, -0x012898,1, -0x012894,1, -0x012890,1, -0x01288c,1, -0x012888,1, -0x012884,1, -0x012880,1, -0x01287c,1, -0x012878,1, -0x012874,1, -0x012870,1, -0x01286c,1, -0x012868,1, -0x012864,1, -0x012860,1, -0x01285c,1, -0x012858,1, -0x012854,1, -0x012850,1, -0x01284c,1, -0x012848,1, -0x012844,1, -0x012840,1, -0x01283c,1, -0x012838,1, -0x012834,1, -0x012830,1, -0x01282c,1, -0x012828,1, -0x012824,1, -0x012820,1, -0x01281c,1, -0x012818,1, -0x012814,1, -0x012810,1, -0x01280c,1, -0x012808,1, -0x012804,1, -0x012800,1, -0x0127fc,1, -0x0127f8,1, -0x0127f4,1, -0x0127dc,1, -0x0127d4,1, -0x0127d0,1, -0x0127cc,1, -0x0127c8,1, -0x0127c4,1, -0x0127c0,1, -0x0127bc,1, -0x0127b8,1, -0x0127b4,1, -0x0127b0,1, -0x0127ac,1, -0x0127a8,1, -0x0127a0,1, -0x01279c,1, -0x012798,1, -0x012794,1, -0x012790,1, -0x01278c,1, -0x012788,1, -0x012784,1, -0x012780,1, -0x012694,1, -0x012690,1, -0x012680,1, -0x012630,1, -0x01262c,1, -0x012628,1, -0x012624,1, -0x012620,1, -0x01261c,1, -0x012618,1, -0x012614,1, -0x012610,1, -0x01260c,1, -0x012604,1, -0x012600,1, -0x0125fc,1, -0x0125f8,1, -0x0125f4,1, -0x0125ec,1, -0x0125e4,1, -0x0125e0,1, -0x0125dc,1, -0x0125d8,1, -0x0125d4,1, -0x0125cc,1, -0x0125c8,1, -0x0125c0,1, -0x0125b8,1, -0x0125b4,1, -0x0125b0,1, -0x0125a8,1, -0x0125a4,1, -0x0125a0,1, -0x012580,1, -0x01257c,1, -0x012578,1, -0x012574,1, -0x012570,1, -0x01256c,1, -0x012568,1, -0x012564,1, -0x012560,1, -0x01255c,1, -0x012558,1, -0x012554,1, -0x012550,1, -0x01254c,1, -0x012548,1, -0x012544,1, -0x012540,1, -0x012534,1, -0x012530,1, -0x012520,1, -0x012514,1, -0x012510,1, -0x012500,1, -0x0124ec,1, -0x0124e8,1, -0x0124e4,1, -0x0124e0,1, -0x0124dc,1, -0x0124d8,1, -0x0124d4,1, -0x0124d0,1, -0x0124cc,1, -0x0124c8,1, -0x012490,1, -0x01248c,1, -0x012488,1, -0x012484,1, -0x012480,1, -0x012468,1, -0x012450,1, -0x01244c,1, -0x012424,1, -0x012420,1, -0x01241c,1, -0x012418,1, -0x012414,1, -0x012410,1, -0x01240c,1, -0x012408,1, -0x012404,1, -0x012400,1, -0x012334,1, -0x012330,1, -0x012320,1, -0x012314,1, -0x012310,1, -0x012300,1, -0x012178,1, -0x012174,1, -0x012170,1, -0x01216c,1, -0x012168,1, -0x012164,1, -0x012160,1, -0x01215c,1, -0x012158,1, -0x012154,1, -0x012150,1, -0x01214c,1, -0x012148,1, -0x012144,1, -0x012140,1, -0x01213c,1, -0x012138,1, -0x012134,1, -0x012130,1, -0x01212c,1, -0x012128,1, -0x012124,1, -0x012120,1, -0x01211c,1, -0x012118,1, -0x012114,1, -0x012110,1, -0x01210c,1, -0x012108,1, -0x012104,1, -0x012100,1, -0x0120fc,1, -0x0120f8,1, -0x0120f4,1, -0x0120f0,1, -0x0120ec,1, -0x0120e8,1, -0x0120e4,1, -0x0120e0,1, -0x0120dc,1, -0x0120d8,1, -0x0120d4,1, -0x0120d0,1, -0x0120cc,1, -0x0120c8,1, -0x0120c4,1, -0x0120c0,1, -0x0120bc,1, -0x0120b8,1, -0x0120b4,1, -0x0120b0,1, -0x0120ac,1, -0x0120a8,1, -0x0120a4,1, -0x0120a0,1, -0x01209c,1, -0x012098,1, -0x012094,1, -0x012090,1, -0x01208c,1, -0x012088,1, -0x012084,1, -0x012080,1, -0x01207c,1, -0x012078,1, -0x012074,1, -0x012070,1, -0x01206c,1, -0x012068,1, -0x012064,1, -0x012060,1, -0x01205c,1, -0x012058,1, -0x012054,1, -0x012050,1, -0x01204c,1, -0x012048,1, -0x012044,1, -0x012040,1, -0x01203c,1, -0x012038,1, -0x012034,1, -0x012030,1, -0x01202c,1, -0x012028,1, -0x012024,1, -0x012020,1, -0x01201c,1, -0x012018,1, -0x012014,1, -0x012010,1, -0x01200c,1, -0x012008,1, -0x012004,1, -0x012000,1, -0x011ffc,1, -0x011ff8,1, -0x011ff4,1, -0x011fdc,1, -0x011fd4,1, -0x011fd0,1, -0x011fcc,1, -0x011fc8,1, -0x011fc4,1, -0x011fc0,1, -0x011fbc,1, -0x011fb8,1, -0x011fb4,1, -0x011fb0,1, -0x011fac,1, -0x011fa8,1, -0x011fa0,1, -0x011f9c,1, -0x011f98,1, -0x011f94,1, -0x011f90,1, -0x011f8c,1, -0x011f88,1, -0x011f84,1, -0x011f80,1, -0x011e94,1, -0x011e90,1, -0x011e80,1, -0x011e30,1, -0x011e2c,1, -0x011e28,1, -0x011e24,1, -0x011e20,1, -0x011e1c,1, -0x011e18,1, -0x011e14,1, -0x011e10,1, -0x011e0c,1, -0x011e04,1, -0x011e00,1, -0x011dfc,1, -0x011df8,1, -0x011df4,1, -0x011dec,1, -0x011de4,1, -0x011de0,1, -0x011ddc,1, -0x011dd8,1, -0x011dd4,1, -0x011dcc,1, -0x011dc8,1, -0x011dc0,1, -0x011db8,1, -0x011db4,1, -0x011db0,1, -0x011da8,1, -0x011da4,1, -0x011da0,1, -0x011d80,1, -0x011d7c,1, -0x011d78,1, -0x011d74,1, -0x011d70,1, -0x011d6c,1, -0x011d68,1, -0x011d64,1, -0x011d60,1, -0x011d5c,1, -0x011d58,1, -0x011d54,1, -0x011d50,1, -0x011d4c,1, -0x011d48,1, -0x011d44,1, -0x011d40,1, -0x011d34,1, -0x011d30,1, -0x011d20,1, -0x011d14,1, -0x011d10,1, -0x011d00,1, -0x011cec,1, -0x011ce8,1, -0x011ce4,1, -0x011ce0,1, -0x011cdc,1, -0x011cd8,1, -0x011cd4,1, -0x011cd0,1, -0x011ccc,1, -0x011cc8,1, -0x011c90,1, -0x011c8c,1, -0x011c88,1, -0x011c84,1, -0x011c80,1, -0x011c68,1, -0x011c50,1, -0x011c4c,1, -0x011c24,1, -0x011c20,1, -0x011c1c,1, -0x011c18,1, -0x011c14,1, -0x011c10,1, -0x011c0c,1, -0x011c08,1, -0x011c04,1, -0x011c00,1, -0x011b34,1, -0x011b30,1, -0x011b20,1, -0x011b14,1, -0x011b10,1, -0x011b00,1, -0x011978,1, -0x011974,1, -0x011970,1, -0x01196c,1, -0x011968,1, -0x011964,1, -0x011960,1, -0x01195c,1, -0x011958,1, -0x011954,1, -0x011950,1, -0x01194c,1, -0x011948,1, -0x011944,1, -0x011940,1, -0x01193c,1, -0x011938,1, -0x011934,1, -0x011930,1, -0x01192c,1, -0x011928,1, -0x011924,1, -0x011920,1, -0x01191c,1, -0x011918,1, -0x011914,1, -0x011910,1, -0x01190c,1, -0x011908,1, -0x011904,1, -0x011900,1, -0x0118fc,1, -0x0118f8,1, -0x0118f4,1, -0x0118f0,1, -0x0118ec,1, -0x0118e8,1, -0x0118e4,1, -0x0118e0,1, -0x0118dc,1, -0x0118d8,1, -0x0118d4,1, -0x0118d0,1, -0x0118cc,1, -0x0118c8,1, -0x0118c4,1, -0x0118c0,1, -0x0118bc,1, -0x0118b8,1, -0x0118b4,1, -0x0118b0,1, -0x0118ac,1, -0x0118a8,1, -0x0118a4,1, -0x0118a0,1, -0x01189c,1, -0x011898,1, -0x011894,1, -0x011890,1, -0x01188c,1, -0x011888,1, -0x011884,1, -0x011880,1, -0x01187c,1, -0x011878,1, -0x011874,1, -0x011870,1, -0x01186c,1, -0x011868,1, -0x011864,1, -0x011860,1, -0x01185c,1, -0x011858,1, -0x011854,1, -0x011850,1, -0x01184c,1, -0x011848,1, -0x011844,1, -0x011840,1, -0x01183c,1, -0x011838,1, -0x011834,1, -0x011830,1, -0x01182c,1, -0x011828,1, -0x011824,1, -0x011820,1, -0x01181c,1, -0x011818,1, -0x011814,1, -0x011810,1, -0x01180c,1, -0x011808,1, -0x011804,1, -0x011800,1, -0x0117fc,1, -0x0117f8,1, -0x0117f4,1, -0x0117dc,1, -0x0117d4,1, -0x0117d0,1, -0x0117cc,1, -0x0117c8,1, -0x0117c4,1, -0x0117c0,1, -0x0117bc,1, -0x0117b8,1, -0x0117b4,1, -0x0117b0,1, -0x0117ac,1, -0x0117a8,1, -0x0117a0,1, -0x01179c,1, -0x011798,1, -0x011794,1, -0x011790,1, -0x01178c,1, -0x011788,1, -0x011784,1, -0x011780,1, -0x011694,1, -0x011690,1, -0x011680,1, -0x011630,1, -0x01162c,1, -0x011628,1, -0x011624,1, -0x011620,1, -0x01161c,1, -0x011618,1, -0x011614,1, -0x011610,1, -0x01160c,1, -0x011604,1, -0x011600,1, -0x0115fc,1, -0x0115f8,1, -0x0115f4,1, -0x0115ec,1, -0x0115e4,1, -0x0115e0,1, -0x0115dc,1, -0x0115d8,1, -0x0115d4,1, -0x0115cc,1, -0x0115c8,1, -0x0115c0,1, -0x0115b8,1, -0x0115b4,1, -0x0115b0,1, -0x0115a8,1, -0x0115a4,1, -0x0115a0,1, -0x011580,1, -0x01157c,1, -0x011578,1, -0x011574,1, -0x011570,1, -0x01156c,1, -0x011568,1, -0x011564,1, -0x011560,1, -0x01155c,1, -0x011558,1, -0x011554,1, -0x011550,1, -0x01154c,1, -0x011548,1, -0x011544,1, -0x011540,1, -0x011534,1, -0x011530,1, -0x011520,1, -0x011514,1, -0x011510,1, -0x011500,1, -0x0114ec,1, -0x0114e8,1, -0x0114e4,1, -0x0114e0,1, -0x0114dc,1, -0x0114d8,1, -0x0114d4,1, -0x0114d0,1, -0x0114cc,1, -0x0114c8,1, -0x011490,1, -0x01148c,1, -0x011488,1, -0x011484,1, -0x011480,1, -0x011468,1, -0x011450,1, -0x01144c,1, -0x011424,1, -0x011420,1, -0x01141c,1, -0x011418,1, -0x011414,1, -0x011410,1, -0x01140c,1, -0x011408,1, -0x011404,1, -0x011400,1, -0x011334,1, -0x011330,1, -0x011320,1, -0x011314,1, -0x011310,1, -0x011300,1, -0x011178,1, -0x011174,1, -0x011170,1, -0x01116c,1, -0x011168,1, -0x011164,1, -0x011160,1, -0x01115c,1, -0x011158,1, -0x011154,1, -0x011150,1, -0x01114c,1, -0x011148,1, -0x011144,1, -0x011140,1, -0x01113c,1, -0x011138,1, -0x011134,1, -0x011130,1, -0x01112c,1, -0x011128,1, -0x011124,1, -0x011120,1, -0x01111c,1, -0x011118,1, -0x011114,1, -0x011110,1, -0x01110c,1, -0x011108,1, -0x011104,1, -0x011100,1, -0x0110fc,1, -0x0110f8,1, -0x0110f4,1, -0x0110f0,1, -0x0110ec,1, -0x0110e8,1, -0x0110e4,1, -0x0110e0,1, -0x0110dc,1, -0x0110d8,1, -0x0110d4,1, -0x0110d0,1, -0x0110cc,1, -0x0110c8,1, -0x0110c4,1, -0x0110c0,1, -0x0110bc,1, -0x0110b8,1, -0x0110b4,1, -0x0110b0,1, -0x0110ac,1, -0x0110a8,1, -0x0110a4,1, -0x0110a0,1, -0x01109c,1, -0x011098,1, -0x011094,1, -0x011090,1, -0x01108c,1, -0x011088,1, -0x011084,1, -0x011080,1, -0x01107c,1, -0x011078,1, -0x011074,1, -0x011070,1, -0x01106c,1, -0x011068,1, -0x011064,1, -0x011060,1, -0x01105c,1, -0x011058,1, -0x011054,1, -0x011050,1, -0x01104c,1, -0x011048,1, -0x011044,1, -0x011040,1, -0x01103c,1, -0x011038,1, -0x011034,1, -0x011030,1, -0x01102c,1, -0x011028,1, -0x011024,1, -0x011020,1, -0x01101c,1, -0x011018,1, -0x011014,1, -0x011010,1, -0x01100c,1, -0x011008,1, -0x011004,1, -0x011000,1, -0x010ffc,1, -0x010ff8,1, -0x010ff4,1, -0x010fdc,1, -0x010fd4,1, -0x010fd0,1, -0x010fcc,1, -0x010fc8,1, -0x010fc4,1, -0x010fc0,1, -0x010fbc,1, -0x010fb8,1, -0x010fb4,1, -0x010fb0,1, -0x010fac,1, -0x010fa8,1, -0x010fa0,1, -0x010f9c,1, -0x010f98,1, -0x010f94,1, -0x010f90,1, -0x010f8c,1, -0x010f88,1, -0x010f84,1, -0x010f80,1, -0x010e94,1, -0x010e90,1, -0x010e80,1, -0x010e30,1, -0x010e2c,1, -0x010e28,1, -0x010e24,1, -0x010e20,1, -0x010e1c,1, -0x010e18,1, -0x010e14,1, -0x010e10,1, -0x010e0c,1, -0x010e04,1, -0x010e00,1, -0x010dfc,1, -0x010df8,1, -0x010df4,1, -0x010dec,1, -0x010de4,1, -0x010de0,1, -0x010ddc,1, -0x010dd8,1, -0x010dd4,1, -0x010dcc,1, -0x010dc8,1, -0x010dc0,1, -0x010db8,1, -0x010db4,1, -0x010db0,1, -0x010da8,1, -0x010da4,1, -0x010da0,1, -0x010d80,1, -0x010d7c,1, -0x010d78,1, -0x010d74,1, -0x010d70,1, -0x010d6c,1, -0x010d68,1, -0x010d64,1, -0x010d60,1, -0x010d5c,1, -0x010d58,1, -0x010d54,1, -0x010d50,1, -0x010d4c,1, -0x010d48,1, -0x010d44,1, -0x010d40,1, -0x010d34,1, -0x010d30,1, -0x010d20,1, -0x010d14,1, -0x010d10,1, -0x010d00,1, -0x010cec,1, -0x010ce8,1, -0x010ce4,1, -0x010ce0,1, -0x010cdc,1, -0x010cd8,1, -0x010cd4,1, -0x010cd0,1, -0x010ccc,1, -0x010cc8,1, -0x010c90,1, -0x010c8c,1, -0x010c88,1, -0x010c84,1, -0x010c80,1, -0x010c68,1, -0x010c50,1, -0x010c4c,1, -0x010c24,1, -0x010c20,1, -0x010c1c,1, -0x010c18,1, -0x010c14,1, -0x010c10,1, -0x010c0c,1, -0x010c08,1, -0x010c04,1, -0x010c00,1, -0x010b34,1, -0x010b30,1, -0x010b20,1, -0x010b14,1, -0x010b10,1, -0x010b00,1, -0x010978,1, -0x010974,1, -0x010970,1, -0x01096c,1, -0x010968,1, -0x010964,1, -0x010960,1, -0x01095c,1, -0x010958,1, -0x010954,1, -0x010950,1, -0x01094c,1, -0x010948,1, -0x010944,1, -0x010940,1, -0x01093c,1, -0x010938,1, -0x010934,1, -0x010930,1, -0x01092c,1, -0x010928,1, -0x010924,1, -0x010920,1, -0x01091c,1, -0x010918,1, -0x010914,1, -0x010910,1, -0x01090c,1, -0x010908,1, -0x010904,1, -0x010900,1, -0x0108fc,1, -0x0108f8,1, -0x0108f4,1, -0x0108f0,1, -0x0108ec,1, -0x0108e8,1, -0x0108e4,1, -0x0108e0,1, -0x0108dc,1, -0x0108d8,1, -0x0108d4,1, -0x0108d0,1, -0x0108cc,1, -0x0108c8,1, -0x0108c4,1, -0x0108c0,1, -0x0108bc,1, -0x0108b8,1, -0x0108b4,1, -0x0108b0,1, -0x0108ac,1, -0x0108a8,1, -0x0108a4,1, -0x0108a0,1, -0x01089c,1, -0x010898,1, -0x010894,1, -0x010890,1, -0x01088c,1, -0x010888,1, -0x010884,1, -0x010880,1, -0x01087c,1, -0x010878,1, -0x010874,1, -0x010870,1, -0x01086c,1, -0x010868,1, -0x010864,1, -0x010860,1, -0x01085c,1, -0x010858,1, -0x010854,1, -0x010850,1, -0x01084c,1, -0x010848,1, -0x010844,1, -0x010840,1, -0x01083c,1, -0x010838,1, -0x010834,1, -0x010830,1, -0x01082c,1, -0x010828,1, -0x010824,1, -0x010820,1, -0x01081c,1, -0x010818,1, -0x010814,1, -0x010810,1, -0x01080c,1, -0x010808,1, -0x010804,1, -0x010800,1, -0x0107fc,1, -0x0107f8,1, -0x0107f4,1, -0x0107dc,1, -0x0107d4,1, -0x0107d0,1, -0x0107cc,1, -0x0107c8,1, -0x0107c4,1, -0x0107c0,1, -0x0107bc,1, -0x0107b8,1, -0x0107b4,1, -0x0107b0,1, -0x0107ac,1, -0x0107a8,1, -0x0107a0,1, -0x01079c,1, -0x010798,1, -0x010794,1, -0x010790,1, -0x01078c,1, -0x010788,1, -0x010784,1, -0x010780,1, -0x010694,1, -0x010690,1, -0x010680,1, -0x010630,1, -0x01062c,1, -0x010628,1, -0x010624,1, -0x010620,1, -0x01061c,1, -0x010618,1, -0x010614,1, -0x010610,1, -0x01060c,1, -0x010604,1, -0x010600,1, -0x0105fc,1, -0x0105f8,1, -0x0105f4,1, -0x0105ec,1, -0x0105e4,1, -0x0105e0,1, -0x0105dc,1, -0x0105d8,1, -0x0105d4,1, -0x0105cc,1, -0x0105c8,1, -0x0105c0,1, -0x0105b8,1, -0x0105b4,1, -0x0105b0,1, -0x0105a8,1, -0x0105a4,1, -0x0105a0,1, -0x010580,1, -0x01057c,1, -0x010578,1, -0x010574,1, -0x010570,1, -0x01056c,1, -0x010568,1, -0x010564,1, -0x010560,1, -0x01055c,1, -0x010558,1, -0x010554,1, -0x010550,1, -0x01054c,1, -0x010548,1, -0x010544,1, -0x010540,1, -0x010534,1, -0x010530,1, -0x010520,1, -0x010514,1, -0x010510,1, -0x010500,1, -0x0104ec,1, -0x0104e8,1, -0x0104e4,1, -0x0104e0,1, -0x0104dc,1, -0x0104d8,1, -0x0104d4,1, -0x0104d0,1, -0x0104cc,1, -0x0104c8,1, -0x010490,1, -0x01048c,1, -0x010488,1, -0x010484,1, -0x010480,1, -0x010468,1, -0x010450,1, -0x01044c,1, -0x010424,1, -0x010420,1, -0x01041c,1, -0x010418,1, -0x010414,1, -0x010410,1, -0x01040c,1, -0x010408,1, -0x010404,1, -0x010400,1, -0x010334,1, -0x010330,1, -0x010320,1, -0x010314,1, -0x010310,1, -0x010300,1, -0x010178,1, -0x010174,1, -0x010170,1, -0x01016c,1, -0x010168,1, -0x010164,1, -0x010160,1, -0x01015c,1, -0x010158,1, -0x010154,1, -0x010150,1, -0x01014c,1, -0x010148,1, -0x010144,1, -0x010140,1, -0x01013c,1, -0x010138,1, -0x010134,1, -0x010130,1, -0x01012c,1, -0x010128,1, -0x010124,1, -0x010120,1, -0x01011c,1, -0x010118,1, -0x010114,1, -0x010110,1, -0x01010c,1, -0x010108,1, -0x010104,1, -0x010100,1, -0x0100fc,1, -0x0100f8,1, -0x0100f4,1, -0x0100f0,1, -0x0100ec,1, -0x0100e8,1, -0x0100e4,1, -0x0100e0,1, -0x0100dc,1, -0x0100d8,1, -0x0100d4,1, -0x0100d0,1, -0x0100cc,1, -0x0100c8,1, -0x0100c4,1, -0x0100c0,1, -0x0100bc,1, -0x0100b8,1, -0x0100b4,1, -0x0100b0,1, -0x0100ac,1, -0x0100a8,1, -0x0100a4,1, -0x0100a0,1, -0x01009c,1, -0x010098,1, -0x010094,1, -0x010090,1, -0x01008c,1, -0x010088,1, -0x010084,1, -0x010080,1, -0x01007c,1, -0x010078,1, -0x010074,1, -0x010070,1, -0x01006c,1, -0x010068,1, -0x010064,1, -0x010060,1, -0x01005c,1, -0x010058,1, -0x010054,1, -0x010050,1, -0x01004c,1, -0x010048,1, -0x010044,1, -0x010040,1, -0x01003c,1, -0x010038,1, -0x010034,1, -0x010030,1, -0x01002c,1, -0x010028,1, -0x010024,1, -0x010020,1, -0x01001c,1, -0x010018,1, -0x010014,1, -0x010010,1, -0x01000c,1, -0x010008,1, -0x010004,1, -0x010000,1, -0x00d9f4,1, -0x00d9f0,1, -0x00d9d4,1, -0x00d9d0,1, -0x00d9c0,1, -0x00d9b4,1, -0x00d9b0,1, -0x00d9a0,1, -0x00d994,1, -0x00d990,1, -0x00d980,1, -0x00d974,1, -0x00d970,1, -0x00d960,1, -0x00d954,1, -0x00d950,1, -0x00d940,1, -0x00d928,1, -0x00d924,1, -0x00d920,1, -0x00d91c,1, -0x00d918,1, -0x00d914,1, -0x00d910,1, -0x00d90c,1, -0x00d908,1, -0x00d904,1, -0x00d900,1, -0x00d8d4,1, -0x00d8d0,1, -0x00d8cc,1, -0x00d8c8,1, -0x00d8c4,1, -0x00d8c0,1, -0x00d8ac,1, -0x00d870,1, -0x00d86c,1, -0x00d868,1, -0x00d864,1, -0x00d860,1, -0x00d85c,1, -0x00d858,1, -0x00d854,1, -0x00d850,1, -0x00d84c,1, -0x00d848,1, -0x00d844,1, -0x00d840,1, -0x00d83c,1, -0x00d838,1, -0x00d834,1, -0x00d830,1, -0x00d82c,1, -0x00d828,1, -0x00d824,1, -0x00d820,1, -0x00d814,1, -0x00d810,1, -0x00d800,1, -0x00bb0c,1, -0x00bb08,1, -0x00bb04,1, -0x00bb00,1, -0x00baf4,1, -0x00baf0,1, -0x00ba74,1, -0x00ba70,1, -0x00ba60,1, -0x00ba54,1, -0x00ba50,1, -0x00ba40,1, -0x00ba28,1, -0x00ba1c,1, -0x00ba18,1, -0x00ba0c,1, -0x00ba00,1, -0x00b934,1, -0x00b930,1, -0x00b924,1, -0x00b920,1, -0x00b914,1, -0x00b910,1, -0x00b904,1, -0x00b900,1, -0x00b8f4,1, -0x00b8f0,1, -0x00b8e4,1, -0x00b8e0,1, -0x00b8b4,1, -0x00b8b0,1, -0x00b8ac,1, -0x00b8a8,1, -0x00b8a4,1, -0x00b8a0,1, -0x00b894,1, -0x00b890,1, -0x00b88c,1, -0x00b888,1, -0x00b884,1, -0x00b880,1, -0x00b870,1, -0x00b83c,1, -0x00b838,1, -0x00b834,1, -0x00b830,1, -0x00b82c,1, -0x00b828,1, -0x00b824,1, -0x00b820,1, -0x00b814,1, -0x00b810,1, -0x00b800,1, -0x00b7bc,1, -0x00b7b8,1, -0x00b7b4,1, -0x00b7b0,1, -0x00b7a0,1, -0x00b79c,1, -0x00b798,1, -0x00b790,1, -0x00b78c,1, -0x00b788,1, -0x00b784,1, -0x00b780,1, -0x00b67c,1, -0x00b678,1, -0x00b674,1, -0x00b670,1, -0x00b66c,1, -0x00b668,1, -0x00b664,1, -0x00b660,1, -0x00b65c,1, -0x00b658,1, -0x00b654,1, -0x00b64c,1, -0x00b648,1, -0x00b644,1, -0x00b640,1, -0x00b62c,1, -0x00b628,1, -0x00b624,1, -0x00b620,1, -0x00b61c,1, -0x00b618,1, -0x00b614,1, -0x00b610,1, -0x00b60c,1, -0x00b608,1, -0x00b604,1, -0x00b600,1, -0x00b4a0,1, -0x00b49c,1, -0x00b498,1, -0x00b494,1, -0x00b490,1, -0x00b48c,1, -0x00b488,1, -0x00b484,1, -0x00b480,1, -0x00b47c,1, -0x00b478,1, -0x00b474,1, -0x00b470,1, -0x00b46c,1, -0x00b464,1, -0x00b45c,1, -0x00b458,1, -0x00b454,1, -0x00b450,1, -0x00b44c,1, -0x00b448,1, -0x00b444,1, -0x00b440,1, -0x00b43c,1, -0x00b438,1, -0x00b424,1, -0x00b420,1, -0x00b41c,1, -0x00b418,1, -0x00b414,1, -0x00b410,1, -0x00b40c,1, -0x00b408,1, -0x00b404,1, -0x00b400,1, -0x00b040,1, -0x00b000,1, -0x00affc,1, -0x00aff8,1, -0x00aff4,1, -0x00afdc,1, -0x00afd4,1, -0x00afd0,1, -0x00afcc,1, -0x00afc8,1, -0x00afc4,1, -0x00afc0,1, -0x00afbc,1, -0x00afb8,1, -0x00afb4,1, -0x00afb0,1, -0x00afac,1, -0x00afa8,1, -0x00afa0,1, -0x00af9c,1, -0x00af98,1, -0x00af94,1, -0x00af90,1, -0x00af8c,1, -0x00af88,1, -0x00af84,1, -0x00af80,1, -0x00ae94,1, -0x00ae90,1, -0x00ae80,1, -0x00ae30,1, -0x00ae2c,1, -0x00ae28,1, -0x00ae24,1, -0x00ae20,1, -0x00ae1c,1, -0x00ae18,1, -0x00ae14,1, -0x00ae10,1, -0x00ae0c,1, -0x00ae04,1, -0x00ae00,1, -0x00adfc,1, -0x00adf8,1, -0x00adf4,1, -0x00adec,1, -0x00ade4,1, -0x00ade0,1, -0x00addc,1, -0x00add8,1, -0x00add4,1, -0x00adcc,1, -0x00adc8,1, -0x00adc0,1, -0x00adb8,1, -0x00adb4,1, -0x00adb0,1, -0x00ada8,1, -0x00ada4,1, -0x00ada0,1, -0x00ad80,1, -0x00ad7c,1, -0x00ad78,1, -0x00ad74,1, -0x00ad70,1, -0x00ad6c,1, -0x00ad68,1, -0x00ad64,1, -0x00ad60,1, -0x00ad5c,1, -0x00ad58,1, -0x00ad54,1, -0x00ad50,1, -0x00ad4c,1, -0x00ad48,1, -0x00ad44,1, -0x00ad40,1, -0x00ad34,1, -0x00ad30,1, -0x00ad20,1, -0x00ad14,1, -0x00ad10,1, -0x00ad00,1, -0x00acec,1, -0x00ace8,1, -0x00ace4,1, -0x00ace0,1, -0x00acdc,1, -0x00acd8,1, -0x00acd4,1, -0x00acd0,1, -0x00accc,1, -0x00acc8,1, -0x00ac90,1, -0x00ac8c,1, -0x00ac88,1, -0x00ac84,1, -0x00ac80,1, -0x00ac68,1, -0x00ac50,1, -0x00ac4c,1, -0x00ac24,1, -0x00ac20,1, -0x00ac1c,1, -0x00ac18,1, -0x00ac14,1, -0x00ac10,1, -0x00ac0c,1, -0x00ac08,1, -0x00ac04,1, -0x00ac00,1, -0x00ab34,1, -0x00ab30,1, -0x00ab20,1, -0x00ab14,1, -0x00ab10,1, -0x00ab00,1, -0x00a978,1, -0x00a974,1, -0x00a970,1, -0x00a96c,1, -0x00a968,1, -0x00a964,1, -0x00a960,1, -0x00a95c,1, -0x00a958,1, -0x00a954,1, -0x00a950,1, -0x00a94c,1, -0x00a948,1, -0x00a944,1, -0x00a940,1, -0x00a93c,1, -0x00a938,1, -0x00a934,1, -0x00a930,1, -0x00a92c,1, -0x00a928,1, -0x00a924,1, -0x00a920,1, -0x00a91c,1, -0x00a918,1, -0x00a914,1, -0x00a910,1, -0x00a90c,1, -0x00a908,1, -0x00a904,1, -0x00a900,1, -0x00a8fc,1, -0x00a8f8,1, -0x00a8f4,1, -0x00a8f0,1, -0x00a8ec,1, -0x00a8e8,1, -0x00a8e4,1, -0x00a8e0,1, -0x00a8dc,1, -0x00a8d8,1, -0x00a8d4,1, -0x00a8d0,1, -0x00a8cc,1, -0x00a8c8,1, -0x00a8c4,1, -0x00a8c0,1, -0x00a8bc,1, -0x00a8b8,1, -0x00a8b4,1, -0x00a8b0,1, -0x00a8ac,1, -0x00a8a8,1, -0x00a8a4,1, -0x00a8a0,1, -0x00a89c,1, -0x00a898,1, -0x00a894,1, -0x00a890,1, -0x00a88c,1, -0x00a888,1, -0x00a884,1, -0x00a880,1, -0x00a87c,1, -0x00a878,1, -0x00a874,1, -0x00a870,1, -0x00a86c,1, -0x00a868,1, -0x00a864,1, -0x00a860,1, -0x00a85c,1, -0x00a858,1, -0x00a854,1, -0x00a850,1, -0x00a84c,1, -0x00a848,1, -0x00a844,1, -0x00a840,1, -0x00a83c,1, -0x00a838,1, -0x00a834,1, -0x00a830,1, -0x00a82c,1, -0x00a828,1, -0x00a824,1, -0x00a820,1, -0x00a81c,1, -0x00a818,1, -0x00a814,1, -0x00a810,1, -0x00a80c,1, -0x00a808,1, -0x00a804,1, -0x00a800,1, -0x00a7fc,1, -0x00a7f8,1, -0x00a7f4,1, -0x00a7dc,1, -0x00a7d4,1, -0x00a7d0,1, -0x00a7cc,1, -0x00a7c8,1, -0x00a7c4,1, -0x00a7c0,1, -0x00a7bc,1, -0x00a7b8,1, -0x00a7b4,1, -0x00a7b0,1, -0x00a7ac,1, -0x00a7a8,1, -0x00a7a0,1, -0x00a79c,1, -0x00a798,1, -0x00a794,1, -0x00a790,1, -0x00a78c,1, -0x00a788,1, -0x00a784,1, -0x00a780,1, -0x00a694,1, -0x00a690,1, -0x00a680,1, -0x00a630,1, -0x00a62c,1, -0x00a628,1, -0x00a624,1, -0x00a620,1, -0x00a61c,1, -0x00a618,1, -0x00a614,1, -0x00a610,1, -0x00a60c,1, -0x00a604,1, -0x00a600,1, -0x00a5fc,1, -0x00a5f8,1, -0x00a5f4,1, -0x00a5ec,1, -0x00a5e4,1, -0x00a5e0,1, -0x00a5dc,1, -0x00a5d8,1, -0x00a5d4,1, -0x00a5cc,1, -0x00a5c8,1, -0x00a5c0,1, -0x00a5b8,1, -0x00a5b4,1, -0x00a5b0,1, -0x00a5a8,1, -0x00a5a4,1, -0x00a5a0,1, -0x00a580,1, -0x00a57c,1, -0x00a578,1, -0x00a574,1, -0x00a570,1, -0x00a56c,1, -0x00a568,1, -0x00a564,1, -0x00a560,1, -0x00a55c,1, -0x00a558,1, -0x00a554,1, -0x00a550,1, -0x00a54c,1, -0x00a548,1, -0x00a544,1, -0x00a540,1, -0x00a534,1, -0x00a530,1, -0x00a520,1, -0x00a514,1, -0x00a510,1, -0x00a500,1, -0x00a4ec,1, -0x00a4e8,1, -0x00a4e4,1, -0x00a4e0,1, -0x00a4dc,1, -0x00a4d8,1, -0x00a4d4,1, -0x00a4d0,1, -0x00a4cc,1, -0x00a4c8,1, -0x00a490,1, -0x00a48c,1, -0x00a488,1, -0x00a484,1, -0x00a480,1, -0x00a468,1, -0x00a450,1, -0x00a44c,1, -0x00a424,1, -0x00a420,1, -0x00a41c,1, -0x00a418,1, -0x00a414,1, -0x00a410,1, -0x00a40c,1, -0x00a408,1, -0x00a404,1, -0x00a400,1, -0x00a334,1, -0x00a330,1, -0x00a320,1, -0x00a314,1, -0x00a310,1, -0x00a300,1, -0x00a178,1, -0x00a174,1, -0x00a170,1, -0x00a16c,1, -0x00a168,1, -0x00a164,1, -0x00a160,1, -0x00a15c,1, -0x00a158,1, -0x00a154,1, -0x00a150,1, -0x00a14c,1, -0x00a148,1, -0x00a144,1, -0x00a140,1, -0x00a13c,1, -0x00a138,1, -0x00a134,1, -0x00a130,1, -0x00a12c,1, -0x00a128,1, -0x00a124,1, -0x00a120,1, -0x00a11c,1, -0x00a118,1, -0x00a114,1, -0x00a110,1, -0x00a10c,1, -0x00a108,1, -0x00a104,1, -0x00a100,1, -0x00a0fc,1, -0x00a0f8,1, -0x00a0f4,1, -0x00a0f0,1, -0x00a0ec,1, -0x00a0e8,1, -0x00a0e4,1, -0x00a0e0,1, -0x00a0dc,1, -0x00a0d8,1, -0x00a0d4,1, -0x00a0d0,1, -0x00a0cc,1, -0x00a0c8,1, -0x00a0c4,1, -0x00a0c0,1, -0x00a0bc,1, -0x00a0b8,1, -0x00a0b4,1, -0x00a0b0,1, -0x00a0ac,1, -0x00a0a8,1, -0x00a0a4,1, -0x00a0a0,1, -0x00a09c,1, -0x00a098,1, -0x00a094,1, -0x00a090,1, -0x00a08c,1, -0x00a088,1, -0x00a084,1, -0x00a080,1, -0x00a07c,1, -0x00a078,1, -0x00a074,1, -0x00a070,1, -0x00a06c,1, -0x00a068,1, -0x00a064,1, -0x00a060,1, -0x00a05c,1, -0x00a058,1, -0x00a054,1, -0x00a050,1, -0x00a04c,1, -0x00a048,1, -0x00a044,1, -0x00a040,1, -0x00a03c,1, -0x00a038,1, -0x00a034,1, -0x00a030,1, -0x00a02c,1, -0x00a028,1, -0x00a024,1, -0x00a020,1, -0x00a01c,1, -0x00a018,1, -0x00a014,1, -0x00a010,1, -0x00a00c,1, -0x00a008,1, -0x00a004,1, -0x00a000,1, -0x009ffc,1, -0x009ff8,1, -0x009ff4,1, -0x009fdc,1, -0x009fd4,1, -0x009fd0,1, -0x009fcc,1, -0x009fc8,1, -0x009fc4,1, -0x009fc0,1, -0x009fbc,1, -0x009fb8,1, -0x009fb4,1, -0x009fb0,1, -0x009fac,1, -0x009fa8,1, -0x009fa0,1, -0x009f9c,1, -0x009f98,1, -0x009f94,1, -0x009f90,1, -0x009f8c,1, -0x009f88,1, -0x009f84,1, -0x009f80,1, -0x009e94,1, -0x009e90,1, -0x009e80,1, -0x009e30,1, -0x009e2c,1, -0x009e28,1, -0x009e24,1, -0x009e20,1, -0x009e1c,1, -0x009e18,1, -0x009e14,1, -0x009e10,1, -0x009e0c,1, -0x009e04,1, -0x009e00,1, -0x009dfc,1, -0x009df8,1, -0x009df4,1, -0x009dec,1, -0x009de4,1, -0x009de0,1, -0x009ddc,1, -0x009dd8,1, -0x009dd4,1, -0x009dcc,1, -0x009dc8,1, -0x009dc0,1, -0x009db8,1, -0x009db4,1, -0x009db0,1, -0x009da8,1, -0x009da4,1, -0x009da0,1, -0x009d80,1, -0x009d7c,1, -0x009d78,1, -0x009d74,1, -0x009d70,1, -0x009d6c,1, -0x009d68,1, -0x009d64,1, -0x009d60,1, -0x009d5c,1, -0x009d58,1, -0x009d54,1, -0x009d50,1, -0x009d4c,1, -0x009d48,1, -0x009d44,1, -0x009d40,1, -0x009d34,1, -0x009d30,1, -0x009d20,1, -0x009d14,1, -0x009d10,1, -0x009d00,1, -0x009cec,1, -0x009ce8,1, -0x009ce4,1, -0x009ce0,1, -0x009cdc,1, -0x009cd8,1, -0x009cd4,1, -0x009cd0,1, -0x009ccc,1, -0x009cc8,1, -0x009c90,1, -0x009c8c,1, -0x009c88,1, -0x009c84,1, -0x009c80,1, -0x009c68,1, -0x009c50,1, -0x009c4c,1, -0x009c24,1, -0x009c20,1, -0x009c1c,1, -0x009c18,1, -0x009c14,1, -0x009c10,1, -0x009c0c,1, -0x009c08,1, -0x009c04,1, -0x009c00,1, -0x009b34,1, -0x009b30,1, -0x009b20,1, -0x009b14,1, -0x009b10,1, -0x009b00,1, -0x009978,1, -0x009974,1, -0x009970,1, -0x00996c,1, -0x009968,1, -0x009964,1, -0x009960,1, -0x00995c,1, -0x009958,1, -0x009954,1, -0x009950,1, -0x00994c,1, -0x009948,1, -0x009944,1, -0x009940,1, -0x00993c,1, -0x009938,1, -0x009934,1, -0x009930,1, -0x00992c,1, -0x009928,1, -0x009924,1, -0x009920,1, -0x00991c,1, -0x009918,1, -0x009914,1, -0x009910,1, -0x00990c,1, -0x009908,1, -0x009904,1, -0x009900,1, -0x0098fc,1, -0x0098f8,1, -0x0098f4,1, -0x0098f0,1, -0x0098ec,1, -0x0098e8,1, -0x0098e4,1, -0x0098e0,1, -0x0098dc,1, -0x0098d8,1, -0x0098d4,1, -0x0098d0,1, -0x0098cc,1, -0x0098c8,1, -0x0098c4,1, -0x0098c0,1, -0x0098bc,1, -0x0098b8,1, -0x0098b4,1, -0x0098b0,1, -0x0098ac,1, -0x0098a8,1, -0x0098a4,1, -0x0098a0,1, -0x00989c,1, -0x009898,1, -0x009894,1, -0x009890,1, -0x00988c,1, -0x009888,1, -0x009884,1, -0x009880,1, -0x00987c,1, -0x009878,1, -0x009874,1, -0x009870,1, -0x00986c,1, -0x009868,1, -0x009864,1, -0x009860,1, -0x00985c,1, -0x009858,1, -0x009854,1, -0x009850,1, -0x00984c,1, -0x009848,1, -0x009844,1, -0x009840,1, -0x00983c,1, -0x009838,1, -0x009834,1, -0x009830,1, -0x00982c,1, -0x009828,1, -0x009824,1, -0x009820,1, -0x00981c,1, -0x009818,1, -0x009814,1, -0x009810,1, -0x00980c,1, -0x009808,1, -0x009804,1, -0x009800,1, -0x0097fc,1, -0x0097f8,1, -0x0097f4,1, -0x0097dc,1, -0x0097d4,1, -0x0097d0,1, -0x0097cc,1, -0x0097c8,1, -0x0097c4,1, -0x0097c0,1, -0x0097bc,1, -0x0097b8,1, -0x0097b4,1, -0x0097b0,1, -0x0097ac,1, -0x0097a8,1, -0x0097a0,1, -0x00979c,1, -0x009798,1, -0x009794,1, -0x009790,1, -0x00978c,1, -0x009788,1, -0x009784,1, -0x009780,1, -0x009694,1, -0x009690,1, -0x009680,1, -0x009630,1, -0x00962c,1, -0x009628,1, -0x009624,1, -0x009620,1, -0x00961c,1, -0x009618,1, -0x009614,1, -0x009610,1, -0x00960c,1, -0x009604,1, -0x009600,1, -0x0095fc,1, -0x0095f8,1, -0x0095f4,1, -0x0095ec,1, -0x0095e4,1, -0x0095e0,1, -0x0095dc,1, -0x0095d8,1, -0x0095d4,1, -0x0095cc,1, -0x0095c8,1, -0x0095c0,1, -0x0095b8,1, -0x0095b4,1, -0x0095b0,1, -0x0095a8,1, -0x0095a4,1, -0x0095a0,1, -0x009580,1, -0x00957c,1, -0x009578,1, -0x009574,1, -0x009570,1, -0x00956c,1, -0x009568,1, -0x009564,1, -0x009560,1, -0x00955c,1, -0x009558,1, -0x009554,1, -0x009550,1, -0x00954c,1, -0x009548,1, -0x009544,1, -0x009540,1, -0x009534,1, -0x009530,1, -0x009520,1, -0x009514,1, -0x009510,1, -0x009500,1, -0x0094ec,1, -0x0094e8,1, -0x0094e4,1, -0x0094e0,1, -0x0094dc,1, -0x0094d8,1, -0x0094d4,1, -0x0094d0,1, -0x0094cc,1, -0x0094c8,1, -0x009490,1, -0x00948c,1, -0x009488,1, -0x009484,1, -0x009480,1, -0x009468,1, -0x009450,1, -0x00944c,1, -0x009424,1, -0x009420,1, -0x00941c,1, -0x009418,1, -0x009414,1, -0x009410,1, -0x00940c,1, -0x009408,1, -0x009404,1, -0x009400,1, -0x009334,1, -0x009330,1, -0x009320,1, -0x009314,1, -0x009310,1, -0x009300,1, -0x009178,1, -0x009174,1, -0x009170,1, -0x00916c,1, -0x009168,1, -0x009164,1, -0x009160,1, -0x00915c,1, -0x009158,1, -0x009154,1, -0x009150,1, -0x00914c,1, -0x009148,1, -0x009144,1, -0x009140,1, -0x00913c,1, -0x009138,1, -0x009134,1, -0x009130,1, -0x00912c,1, -0x009128,1, -0x009124,1, -0x009120,1, -0x00911c,1, -0x009118,1, -0x009114,1, -0x009110,1, -0x00910c,1, -0x009108,1, -0x009104,1, -0x009100,1, -0x0090fc,1, -0x0090f8,1, -0x0090f4,1, -0x0090f0,1, -0x0090ec,1, -0x0090e8,1, -0x0090e4,1, -0x0090e0,1, -0x0090dc,1, -0x0090d8,1, -0x0090d4,1, -0x0090d0,1, -0x0090cc,1, -0x0090c8,1, -0x0090c4,1, -0x0090c0,1, -0x0090bc,1, -0x0090b8,1, -0x0090b4,1, -0x0090b0,1, -0x0090ac,1, -0x0090a8,1, -0x0090a4,1, -0x0090a0,1, -0x00909c,1, -0x009098,1, -0x009094,1, -0x009090,1, -0x00908c,1, -0x009088,1, -0x009084,1, -0x009080,1, -0x00907c,1, -0x009078,1, -0x009074,1, -0x009070,1, -0x00906c,1, -0x009068,1, -0x009064,1, -0x009060,1, -0x00905c,1, -0x009058,1, -0x009054,1, -0x009050,1, -0x00904c,1, -0x009048,1, -0x009044,1, -0x009040,1, -0x00903c,1, -0x009038,1, -0x009034,1, -0x009030,1, -0x00902c,1, -0x009028,1, -0x009024,1, -0x009020,1, -0x00901c,1, -0x009018,1, -0x009014,1, -0x009010,1, -0x00900c,1, -0x009008,1, -0x009004,1, -0x009000,1, -0x008ffc,1, -0x008ff8,1, -0x008ff4,1, -0x008fdc,1, -0x008fd4,1, -0x008fd0,1, -0x008fcc,1, -0x008fc8,1, -0x008fc4,1, -0x008fc0,1, -0x008fbc,1, -0x008fb8,1, -0x008fb4,1, -0x008fb0,1, -0x008fac,1, -0x008fa8,1, -0x008fa0,1, -0x008f9c,1, -0x008f98,1, -0x008f94,1, -0x008f90,1, -0x008f8c,1, -0x008f88,1, -0x008f84,1, -0x008f80,1, -0x008e94,1, -0x008e90,1, -0x008e80,1, -0x008e30,1, -0x008e2c,1, -0x008e28,1, -0x008e24,1, -0x008e20,1, -0x008e1c,1, -0x008e18,1, -0x008e14,1, -0x008e10,1, -0x008e0c,1, -0x008e04,1, -0x008e00,1, -0x008dfc,1, -0x008df8,1, -0x008df4,1, -0x008dec,1, -0x008de4,1, -0x008de0,1, -0x008ddc,1, -0x008dd8,1, -0x008dd4,1, -0x008dcc,1, -0x008dc8,1, -0x008dc0,1, -0x008db8,1, -0x008db4,1, -0x008db0,1, -0x008da8,1, -0x008da4,1, -0x008da0,1, -0x008d80,1, -0x008d7c,1, -0x008d78,1, -0x008d74,1, -0x008d70,1, -0x008d6c,1, -0x008d68,1, -0x008d64,1, -0x008d60,1, -0x008d5c,1, -0x008d58,1, -0x008d54,1, -0x008d50,1, -0x008d4c,1, -0x008d48,1, -0x008d44,1, -0x008d40,1, -0x008d34,1, -0x008d30,1, -0x008d20,1, -0x008d14,1, -0x008d10,1, -0x008d00,1, -0x008cec,1, -0x008ce8,1, -0x008ce4,1, -0x008ce0,1, -0x008cdc,1, -0x008cd8,1, -0x008cd4,1, -0x008cd0,1, -0x008ccc,1, -0x008cc8,1, -0x008c90,1, -0x008c8c,1, -0x008c88,1, -0x008c84,1, -0x008c80,1, -0x008c68,1, -0x008c50,1, -0x008c4c,1, -0x008c24,1, -0x008c20,1, -0x008c1c,1, -0x008c18,1, -0x008c14,1, -0x008c10,1, -0x008c0c,1, -0x008c08,1, -0x008c04,1, -0x008c00,1, -0x008b34,1, -0x008b30,1, -0x008b20,1, -0x008b14,1, -0x008b10,1, -0x008b00,1, -0x008978,1, -0x008974,1, -0x008970,1, -0x00896c,1, -0x008968,1, -0x008964,1, -0x008960,1, -0x00895c,1, -0x008958,1, -0x008954,1, -0x008950,1, -0x00894c,1, -0x008948,1, -0x008944,1, -0x008940,1, -0x00893c,1, -0x008938,1, -0x008934,1, -0x008930,1, -0x00892c,1, -0x008928,1, -0x008924,1, -0x008920,1, -0x00891c,1, -0x008918,1, -0x008914,1, -0x008910,1, -0x00890c,1, -0x008908,1, -0x008904,1, -0x008900,1, -0x0088fc,1, -0x0088f8,1, -0x0088f4,1, -0x0088f0,1, -0x0088ec,1, -0x0088e8,1, -0x0088e4,1, -0x0088e0,1, -0x0088dc,1, -0x0088d8,1, -0x0088d4,1, -0x0088d0,1, -0x0088cc,1, -0x0088c8,1, -0x0088c4,1, -0x0088c0,1, -0x0088bc,1, -0x0088b8,1, -0x0088b4,1, -0x0088b0,1, -0x0088ac,1, -0x0088a8,1, -0x0088a4,1, -0x0088a0,1, -0x00889c,1, -0x008898,1, -0x008894,1, -0x008890,1, -0x00888c,1, -0x008888,1, -0x008884,1, -0x008880,1, -0x00887c,1, -0x008878,1, -0x008874,1, -0x008870,1, -0x00886c,1, -0x008868,1, -0x008864,1, -0x008860,1, -0x00885c,1, -0x008858,1, -0x008854,1, -0x008850,1, -0x00884c,1, -0x008848,1, -0x008844,1, -0x008840,1, -0x00883c,1, -0x008838,1, -0x008834,1, -0x008830,1, -0x00882c,1, -0x008828,1, -0x008824,1, -0x008820,1, -0x00881c,1, -0x008818,1, -0x008814,1, -0x008810,1, -0x00880c,1, -0x008808,1, -0x008804,1, -0x008800,1, -0x0087fc,1, -0x0087f8,1, -0x0087f4,1, -0x0087dc,1, -0x0087d4,1, -0x0087d0,1, -0x0087cc,1, -0x0087c8,1, -0x0087c4,1, -0x0087c0,1, -0x0087bc,1, -0x0087b8,1, -0x0087b4,1, -0x0087b0,1, -0x0087ac,1, -0x0087a8,1, -0x0087a0,1, -0x00879c,1, -0x008798,1, -0x008794,1, -0x008790,1, -0x00878c,1, -0x008788,1, -0x008784,1, -0x008780,1, -0x008694,1, -0x008690,1, -0x008680,1, -0x008630,1, -0x00862c,1, -0x008628,1, -0x008624,1, -0x008620,1, -0x00861c,1, -0x008618,1, -0x008614,1, -0x008610,1, -0x00860c,1, -0x008604,1, -0x008600,1, -0x0085fc,1, -0x0085f8,1, -0x0085f4,1, -0x0085ec,1, -0x0085e4,1, -0x0085e0,1, -0x0085dc,1, -0x0085d8,1, -0x0085d4,1, -0x0085cc,1, -0x0085c8,1, -0x0085c0,1, -0x0085b8,1, -0x0085b4,1, -0x0085b0,1, -0x0085a8,1, -0x0085a4,1, -0x0085a0,1, -0x008580,1, -0x00857c,1, -0x008578,1, -0x008574,1, -0x008570,1, -0x00856c,1, -0x008568,1, -0x008564,1, -0x008560,1, -0x00855c,1, -0x008558,1, -0x008554,1, -0x008550,1, -0x00854c,1, -0x008548,1, -0x008544,1, -0x008540,1, -0x008534,1, -0x008530,1, -0x008520,1, -0x008514,1, -0x008510,1, -0x008500,1, -0x0084ec,1, -0x0084e8,1, -0x0084e4,1, -0x0084e0,1, -0x0084dc,1, -0x0084d8,1, -0x0084d4,1, -0x0084d0,1, -0x0084cc,1, -0x0084c8,1, -0x008490,1, -0x00848c,1, -0x008488,1, -0x008484,1, -0x008480,1, -0x008468,1, -0x008450,1, -0x00844c,1, -0x008424,1, -0x008420,1, -0x00841c,1, -0x008418,1, -0x008414,1, -0x008410,1, -0x00840c,1, -0x008408,1, -0x008404,1, -0x008400,1, -0x008334,1, -0x008330,1, -0x008320,1, -0x008314,1, -0x008310,1, -0x008300,1, -0x008178,1, -0x008174,1, -0x008170,1, -0x00816c,1, -0x008168,1, -0x008164,1, -0x008160,1, -0x00815c,1, -0x008158,1, -0x008154,1, -0x008150,1, -0x00814c,1, -0x008148,1, -0x008144,1, -0x008140,1, -0x00813c,1, -0x008138,1, -0x008134,1, -0x008130,1, -0x00812c,1, -0x008128,1, -0x008124,1, -0x008120,1, -0x00811c,1, -0x008118,1, -0x008114,1, -0x008110,1, -0x00810c,1, -0x008108,1, -0x008104,1, -0x008100,1, -0x0080fc,1, -0x0080f8,1, -0x0080f4,1, -0x0080f0,1, -0x0080ec,1, -0x0080e8,1, -0x0080e4,1, -0x0080e0,1, -0x0080dc,1, -0x0080d8,1, -0x0080d4,1, -0x0080d0,1, -0x0080cc,1, -0x0080c8,1, -0x0080c4,1, -0x0080c0,1, -0x0080bc,1, -0x0080b8,1, -0x0080b4,1, -0x0080b0,1, -0x0080ac,1, -0x0080a8,1, -0x0080a4,1, -0x0080a0,1, -0x00809c,1, -0x008098,1, -0x008094,1, -0x008090,1, -0x00808c,1, -0x008088,1, -0x008084,1, -0x008080,1, -0x00807c,1, -0x008078,1, -0x008074,1, -0x008070,1, -0x00806c,1, -0x008068,1, -0x008064,1, -0x008060,1, -0x00805c,1, -0x008058,1, -0x008054,1, -0x008050,1, -0x00804c,1, -0x008048,1, -0x008044,1, -0x008040,1, -0x00803c,1, -0x008038,1, -0x008034,1, -0x008030,1, -0x00802c,1, -0x008028,1, -0x008024,1, -0x008020,1, -0x00801c,1, -0x008018,1, -0x008014,1, -0x008010,1, -0x00800c,1, -0x008008,1, -0x008004,1, -0x008000,1, -0x0059f4,1, -0x0059f0,1, -0x0059d4,1, -0x0059d0,1, -0x0059c0,1, -0x0059b4,1, -0x0059b0,1, -0x0059a0,1, -0x005994,1, -0x005990,1, -0x005980,1, -0x005974,1, -0x005970,1, -0x005960,1, -0x005954,1, -0x005950,1, -0x005940,1, -0x005928,1, -0x005924,1, -0x005920,1, -0x00591c,1, -0x005918,1, -0x005914,1, -0x005910,1, -0x00590c,1, -0x005908,1, -0x005904,1, -0x005900,1, -0x0058d4,1, -0x0058d0,1, -0x0058cc,1, -0x0058c8,1, -0x0058c4,1, -0x0058c0,1, -0x0058ac,1, -0x005870,1, -0x00586c,1, -0x005868,1, -0x005864,1, -0x005860,1, -0x00585c,1, -0x005858,1, -0x005854,1, -0x005850,1, -0x00584c,1, -0x005848,1, -0x005844,1, -0x005840,1, -0x00583c,1, -0x005838,1, -0x005834,1, -0x005830,1, -0x00582c,1, -0x005828,1, -0x005824,1, -0x005820,1, -0x005814,1, -0x005810,1, -0x005800,1, -0x003b0c,1, -0x003b08,1, -0x003b04,1, -0x003b00,1, -0x003af4,1, -0x003af0,1, -0x003a74,1, -0x003a70,1, -0x003a60,1, -0x003a54,1, -0x003a50,1, -0x003a40,1, -0x003a28,1, -0x003a1c,1, -0x003a18,1, -0x003a0c,1, -0x003a00,1, -0x003934,1, -0x003930,1, -0x003924,1, -0x003920,1, -0x003914,1, -0x003910,1, -0x003904,1, -0x003900,1, -0x0038f4,1, -0x0038f0,1, -0x0038e4,1, -0x0038e0,1, -0x0038b4,1, -0x0038b0,1, -0x0038ac,1, -0x0038a8,1, -0x0038a4,1, -0x0038a0,1, -0x003894,1, -0x003890,1, -0x00388c,1, -0x003888,1, -0x003884,1, -0x003880,1, -0x003870,1, -0x00383c,1, -0x003838,1, -0x003834,1, -0x003830,1, -0x00382c,1, -0x003828,1, -0x003824,1, -0x003820,1, -0x003814,1, -0x003810,1, -0x003800,1, -0x0037bc,1, -0x0037b8,1, -0x0037b4,1, -0x00367c,1, -0x003678,1, -0x003674,1, -0x003670,1, -0x00366c,1, -0x003668,1, -0x003664,1, -0x003660,1, -0x00365c,1, -0x003658,1, -0x003654,1, -0x00364c,1, -0x003648,1, -0x003644,1, -0x003640,1, -0x00362c,1, -0x003628,1, -0x003624,1, -0x003620,1, -0x00361c,1, -0x003618,1, -0x003614,1, -0x003610,1, -0x00360c,1, -0x003608,1, -0x003604,1, -0x003600,1, -0x0034a0,1, -0x00349c,1, -0x003498,1, -0x003494,1, -0x003490,1, -0x00348c,1, -0x003488,1, -0x003484,1, -0x003480,1, -0x00347c,1, -0x003478,1, -0x003474,1, -0x003470,1, -0x00346c,1, -0x003464,1, -0x00345c,1, -0x003458,1, -0x003454,1, -0x003450,1, -0x00344c,1, -0x003448,1, -0x003444,1, -0x003440,1, -0x00343c,1, -0x003438,1, -0x003424,1, -0x003420,1, -0x00341c,1, -0x003418,1, -0x003414,1, -0x003410,1, -0x00340c,1, -0x003408,1, -0x003404,1, -0x003400,1, -0x003040,1, -0x003000,1, -0x002ffc,1, -0x002ff8,1, -0x002ff4,1, -0x002fdc,1, -0x002fd4,1, -0x002fd0,1, -0x002fcc,1, -0x002fc8,1, -0x002fc4,1, -0x002fc0,1, -0x002fbc,1, -0x002fb8,1, -0x002fb4,1, -0x002fb0,1, -0x002fac,1, -0x002fa8,1, -0x002fa0,1, -0x002f9c,1, -0x002f98,1, -0x002f94,1, -0x002f90,1, -0x002f8c,1, -0x002f88,1, -0x002f84,1, -0x002f80,1, -0x002e94,1, -0x002e90,1, -0x002e80,1, -0x002e30,1, -0x002e2c,1, -0x002e28,1, -0x002e24,1, -0x002e20,1, -0x002e1c,1, -0x002e18,1, -0x002e14,1, -0x002e10,1, -0x002e0c,1, -0x002e04,1, -0x002e00,1, -0x002dfc,1, -0x002df8,1, -0x002df4,1, -0x002dec,1, -0x002de4,1, -0x002de0,1, -0x002ddc,1, -0x002dd8,1, -0x002dd4,1, -0x002dcc,1, -0x002dc8,1, -0x002dc0,1, -0x002db8,1, -0x002db4,1, -0x002db0,1, -0x002da8,1, -0x002da4,1, -0x002da0,1, -0x002d80,1, -0x002d7c,1, -0x002d78,1, -0x002d74,1, -0x002d70,1, -0x002d6c,1, -0x002d68,1, -0x002d64,1, -0x002d60,1, -0x002d5c,1, -0x002d58,1, -0x002d54,1, -0x002d50,1, -0x002d4c,1, -0x002d48,1, -0x002d44,1, -0x002d40,1, -0x002d34,1, -0x002d30,1, -0x002d20,1, -0x002d14,1, -0x002d10,1, -0x002d00,1, -0x002cec,1, -0x002ce8,1, -0x002ce4,1, -0x002ce0,1, -0x002cdc,1, -0x002cd8,1, -0x002cd4,1, -0x002cd0,1, -0x002ccc,1, -0x002cc8,1, -0x002c90,1, -0x002c8c,1, -0x002c88,1, -0x002c84,1, -0x002c80,1, -0x002c68,1, -0x002c50,1, -0x002c4c,1, -0x002c24,1, -0x002c20,1, -0x002c1c,1, -0x002c18,1, -0x002c14,1, -0x002c10,1, -0x002c0c,1, -0x002c08,1, -0x002c04,1, -0x002c00,1, -0x002b34,1, -0x002b30,1, -0x002b20,1, -0x002b14,1, -0x002b10,1, -0x002b00,1, -0x002978,1, -0x002974,1, -0x002970,1, -0x00296c,1, -0x002968,1, -0x002964,1, -0x002960,1, -0x00295c,1, -0x002958,1, -0x002954,1, -0x002950,1, -0x00294c,1, -0x002948,1, -0x002944,1, -0x002940,1, -0x00293c,1, -0x002938,1, -0x002934,1, -0x002930,1, -0x00292c,1, -0x002928,1, -0x002924,1, -0x002920,1, -0x00291c,1, -0x002918,1, -0x002914,1, -0x002910,1, -0x00290c,1, -0x002908,1, -0x002904,1, -0x002900,1, -0x0028fc,1, -0x0028f8,1, -0x0028f4,1, -0x0028f0,1, -0x0028ec,1, -0x0028e8,1, -0x0028e4,1, -0x0028e0,1, -0x0028dc,1, -0x0028d8,1, -0x0028d4,1, -0x0028d0,1, -0x0028cc,1, -0x0028c8,1, -0x0028c4,1, -0x0028c0,1, -0x0028bc,1, -0x0028b8,1, -0x0028b4,1, -0x0028b0,1, -0x0028ac,1, -0x0028a8,1, -0x0028a4,1, -0x0028a0,1, -0x00289c,1, -0x002898,1, -0x002894,1, -0x002890,1, -0x00288c,1, -0x002888,1, -0x002884,1, -0x002880,1, -0x00287c,1, -0x002878,1, -0x002874,1, -0x002870,1, -0x00286c,1, -0x002868,1, -0x002864,1, -0x002860,1, -0x00285c,1, -0x002858,1, -0x002854,1, -0x002850,1, -0x00284c,1, -0x002848,1, -0x002844,1, -0x002840,1, -0x00283c,1, -0x002838,1, -0x002834,1, -0x002830,1, -0x00282c,1, -0x002828,1, -0x002824,1, -0x002820,1, -0x00281c,1, -0x002818,1, -0x002814,1, -0x002810,1, -0x00280c,1, -0x002808,1, -0x002804,1, -0x002800,1, -0x0027fc,1, -0x0027f8,1, -0x0027f4,1, -0x0027dc,1, -0x0027d4,1, -0x0027d0,1, -0x0027cc,1, -0x0027c8,1, -0x0027c4,1, -0x0027c0,1, -0x0027bc,1, -0x0027b8,1, -0x0027b4,1, -0x0027b0,1, -0x0027ac,1, -0x0027a8,1, -0x0027a0,1, -0x00279c,1, -0x002798,1, -0x002794,1, -0x002790,1, -0x00278c,1, -0x002788,1, -0x002784,1, -0x002780,1, -0x002694,1, -0x002690,1, -0x002680,1, -0x002630,1, -0x00262c,1, -0x002628,1, -0x002624,1, -0x002620,1, -0x00261c,1, -0x002618,1, -0x002614,1, -0x002610,1, -0x00260c,1, -0x002604,1, -0x002600,1, -0x0025fc,1, -0x0025f8,1, -0x0025f4,1, -0x0025ec,1, -0x0025e4,1, -0x0025e0,1, -0x0025dc,1, -0x0025d8,1, -0x0025d4,1, -0x0025cc,1, -0x0025c8,1, -0x0025c0,1, -0x0025b8,1, -0x0025b4,1, -0x0025b0,1, -0x0025a8,1, -0x0025a4,1, -0x0025a0,1, -0x002580,1, -0x00257c,1, -0x002578,1, -0x002574,1, -0x002570,1, -0x00256c,1, -0x002568,1, -0x002564,1, -0x002560,1, -0x00255c,1, -0x002558,1, -0x002554,1, -0x002550,1, -0x00254c,1, -0x002548,1, -0x002544,1, -0x002540,1, -0x002534,1, -0x002530,1, -0x002520,1, -0x002514,1, -0x002510,1, -0x002500,1, -0x0024ec,1, -0x0024e8,1, -0x0024e4,1, -0x0024e0,1, -0x0024dc,1, -0x0024d8,1, -0x0024d4,1, -0x0024d0,1, -0x0024cc,1, -0x0024c8,1, -0x002490,1, -0x00248c,1, -0x002488,1, -0x002484,1, -0x002480,1, -0x002468,1, -0x002450,1, -0x00244c,1, -0x002424,1, -0x002420,1, -0x00241c,1, -0x002418,1, -0x002414,1, -0x002410,1, -0x00240c,1, -0x002408,1, -0x002404,1, -0x002400,1, -0x002334,1, -0x002330,1, -0x002320,1, -0x002314,1, -0x002310,1, -0x002300,1, -0x002178,1, -0x002174,1, -0x002170,1, -0x00216c,1, -0x002168,1, -0x002164,1, -0x002160,1, -0x00215c,1, -0x002158,1, -0x002154,1, -0x002150,1, -0x00214c,1, -0x002148,1, -0x002144,1, -0x002140,1, -0x00213c,1, -0x002138,1, -0x002134,1, -0x002130,1, -0x00212c,1, -0x002128,1, -0x002124,1, -0x002120,1, -0x00211c,1, -0x002118,1, -0x002114,1, -0x002110,1, -0x00210c,1, -0x002108,1, -0x002104,1, -0x002100,1, -0x0020fc,1, -0x0020f8,1, -0x0020f4,1, -0x0020f0,1, -0x0020ec,1, -0x0020e8,1, -0x0020e4,1, -0x0020e0,1, -0x0020dc,1, -0x0020d8,1, -0x0020d4,1, -0x0020d0,1, -0x0020cc,1, -0x0020c8,1, -0x0020c4,1, -0x0020c0,1, -0x0020bc,1, -0x0020b8,1, -0x0020b4,1, -0x0020b0,1, -0x0020ac,1, -0x0020a8,1, -0x0020a4,1, -0x0020a0,1, -0x00209c,1, -0x002098,1, -0x002094,1, -0x002090,1, -0x00208c,1, -0x002088,1, -0x002084,1, -0x002080,1, -0x00207c,1, -0x002078,1, -0x002074,1, -0x002070,1, -0x00206c,1, -0x002068,1, -0x002064,1, -0x002060,1, -0x00205c,1, -0x002058,1, -0x002054,1, -0x002050,1, -0x00204c,1, -0x002048,1, -0x002044,1, -0x002040,1, -0x00203c,1, -0x002038,1, -0x002034,1, -0x002030,1, -0x00202c,1, -0x002028,1, -0x002024,1, -0x002020,1, -0x00201c,1, -0x002018,1, -0x002014,1, -0x002010,1, -0x00200c,1, -0x002008,1, -0x002004,1, -0x002000,1, -0x001ffc,1, -0x001ff8,1, -0x001ff4,1, -0x001fdc,1, -0x001fd4,1, -0x001fd0,1, -0x001fcc,1, -0x001fc8,1, -0x001fc4,1, -0x001fc0,1, -0x001fbc,1, -0x001fb8,1, -0x001fb4,1, -0x001fb0,1, -0x001fac,1, -0x001fa8,1, -0x001fa0,1, -0x001f9c,1, -0x001f98,1, -0x001f94,1, -0x001f90,1, -0x001f8c,1, -0x001f88,1, -0x001f84,1, -0x001f80,1, -0x001e94,1, -0x001e90,1, -0x001e80,1, -0x001e30,1, -0x001e2c,1, -0x001e28,1, -0x001e24,1, -0x001e20,1, -0x001e1c,1, -0x001e18,1, -0x001e14,1, -0x001e10,1, -0x001e0c,1, -0x001e04,1, -0x001e00,1, -0x001dfc,1, -0x001df8,1, -0x001df4,1, -0x001dec,1, -0x001de4,1, -0x001de0,1, -0x001ddc,1, -0x001dd8,1, -0x001dd4,1, -0x001dcc,1, -0x001dc8,1, -0x001dc0,1, -0x001db8,1, -0x001db4,1, -0x001db0,1, -0x001da8,1, -0x001da4,1, -0x001da0,1, -0x001d80,1, -0x001d7c,1, -0x001d78,1, -0x001d74,1, -0x001d70,1, -0x001d6c,1, -0x001d68,1, -0x001d64,1, -0x001d60,1, -0x001d5c,1, -0x001d58,1, -0x001d54,1, -0x001d50,1, -0x001d4c,1, -0x001d48,1, -0x001d44,1, -0x001d40,1, -0x001d34,1, -0x001d30,1, -0x001d20,1, -0x001d14,1, -0x001d10,1, -0x001d00,1, -0x001cec,1, -0x001ce8,1, -0x001ce4,1, -0x001ce0,1, -0x001cdc,1, -0x001cd8,1, -0x001cd4,1, -0x001cd0,1, -0x001ccc,1, -0x001cc8,1, -0x001c90,1, -0x001c8c,1, -0x001c88,1, -0x001c84,1, -0x001c80,1, -0x001c68,1, -0x001c50,1, -0x001c4c,1, -0x001c24,1, -0x001c20,1, -0x001c1c,1, -0x001c18,1, -0x001c14,1, -0x001c10,1, -0x001c0c,1, -0x001c08,1, -0x001c04,1, -0x001c00,1, -0x001b34,1, -0x001b30,1, -0x001b20,1, -0x001b14,1, -0x001b10,1, -0x001b00,1, -0x001978,1, -0x001974,1, -0x001970,1, -0x00196c,1, -0x001968,1, -0x001964,1, -0x001960,1, -0x00195c,1, -0x001958,1, -0x001954,1, -0x001950,1, -0x00194c,1, -0x001948,1, -0x001944,1, -0x001940,1, -0x00193c,1, -0x001938,1, -0x001934,1, -0x001930,1, -0x00192c,1, -0x001928,1, -0x001924,1, -0x001920,1, -0x00191c,1, -0x001918,1, -0x001914,1, -0x001910,1, -0x00190c,1, -0x001908,1, -0x001904,1, -0x001900,1, -0x0018fc,1, -0x0018f8,1, -0x0018f4,1, -0x0018f0,1, -0x0018ec,1, -0x0018e8,1, -0x0018e4,1, -0x0018e0,1, -0x0018dc,1, -0x0018d8,1, -0x0018d4,1, -0x0018d0,1, -0x0018cc,1, -0x0018c8,1, -0x0018c4,1, -0x0018c0,1, -0x0018bc,1, -0x0018b8,1, -0x0018b4,1, -0x0018b0,1, -0x0018ac,1, -0x0018a8,1, -0x0018a4,1, -0x0018a0,1, -0x00189c,1, -0x001898,1, -0x001894,1, -0x001890,1, -0x00188c,1, -0x001888,1, -0x001884,1, -0x001880,1, -0x00187c,1, -0x001878,1, -0x001874,1, -0x001870,1, -0x00186c,1, -0x001868,1, -0x001864,1, -0x001860,1, -0x00185c,1, -0x001858,1, -0x001854,1, -0x001850,1, -0x00184c,1, -0x001848,1, -0x001844,1, -0x001840,1, -0x00183c,1, -0x001838,1, -0x001834,1, -0x001830,1, -0x00182c,1, -0x001828,1, -0x001824,1, -0x001820,1, -0x00181c,1, -0x001818,1, -0x001814,1, -0x001810,1, -0x00180c,1, -0x001808,1, -0x001804,1, -0x001800,1, -0x0017fc,1, -0x0017f8,1, -0x0017f4,1, -0x0017dc,1, -0x0017d4,1, -0x0017d0,1, -0x0017cc,1, -0x0017c8,1, -0x0017c4,1, -0x0017c0,1, -0x0017bc,1, -0x0017b8,1, -0x0017b4,1, -0x0017b0,1, -0x0017ac,1, -0x0017a8,1, -0x0017a0,1, -0x00179c,1, -0x001798,1, -0x001794,1, -0x001790,1, -0x00178c,1, -0x001788,1, -0x001784,1, -0x001780,1, -0x001694,1, -0x001690,1, -0x001680,1, -0x001630,1, -0x00162c,1, -0x001628,1, -0x001624,1, -0x001620,1, -0x00161c,1, -0x001618,1, -0x001614,1, -0x001610,1, -0x00160c,1, -0x001604,1, -0x001600,1, -0x0015fc,1, -0x0015f8,1, -0x0015f4,1, -0x0015ec,1, -0x0015e4,1, -0x0015e0,1, -0x0015dc,1, -0x0015d8,1, -0x0015d4,1, -0x0015cc,1, -0x0015c8,1, -0x0015c0,1, -0x0015b8,1, -0x0015b4,1, -0x0015b0,1, -0x0015a8,1, -0x0015a4,1, -0x0015a0,1, -0x001580,1, -0x00157c,1, -0x001578,1, -0x001574,1, -0x001570,1, -0x00156c,1, -0x001568,1, -0x001564,1, -0x001560,1, -0x00155c,1, -0x001558,1, -0x001554,1, -0x001550,1, -0x00154c,1, -0x001548,1, -0x001544,1, -0x001540,1, -0x001534,1, -0x001530,1, -0x001520,1, -0x001514,1, -0x001510,1, -0x001500,1, -0x0014ec,1, -0x0014e8,1, -0x0014e4,1, -0x0014e0,1, -0x0014dc,1, -0x0014d8,1, -0x0014d4,1, -0x0014d0,1, -0x0014cc,1, -0x0014c8,1, -0x001490,1, -0x00148c,1, -0x001488,1, -0x001484,1, -0x001480,1, -0x001468,1, -0x001450,1, -0x00144c,1, -0x001424,1, -0x001420,1, -0x00141c,1, -0x001418,1, -0x001414,1, -0x001410,1, -0x00140c,1, -0x001408,1, -0x001404,1, -0x001400,1, -0x001334,1, -0x001330,1, -0x001320,1, -0x001314,1, -0x001310,1, -0x001300,1, -0x001178,1, -0x001174,1, -0x001170,1, -0x00116c,1, -0x001168,1, -0x001164,1, -0x001160,1, -0x00115c,1, -0x001158,1, -0x001154,1, -0x001150,1, -0x00114c,1, -0x001148,1, -0x001144,1, -0x001140,1, -0x00113c,1, -0x001138,1, -0x001134,1, -0x001130,1, -0x00112c,1, -0x001128,1, -0x001124,1, -0x001120,1, -0x00111c,1, -0x001118,1, -0x001114,1, -0x001110,1, -0x00110c,1, -0x001108,1, -0x001104,1, -0x001100,1, -0x0010fc,1, -0x0010f8,1, -0x0010f4,1, -0x0010f0,1, -0x0010ec,1, -0x0010e8,1, -0x0010e4,1, -0x0010e0,1, -0x0010dc,1, -0x0010d8,1, -0x0010d4,1, -0x0010d0,1, -0x0010cc,1, -0x0010c8,1, -0x0010c4,1, -0x0010c0,1, -0x0010bc,1, -0x0010b8,1, -0x0010b4,1, -0x0010b0,1, -0x0010ac,1, -0x0010a8,1, -0x0010a4,1, -0x0010a0,1, -0x00109c,1, -0x001098,1, -0x001094,1, -0x001090,1, -0x00108c,1, -0x001088,1, -0x001084,1, -0x001080,1, -0x00107c,1, -0x001078,1, -0x001074,1, -0x001070,1, -0x00106c,1, -0x001068,1, -0x001064,1, -0x001060,1, -0x00105c,1, -0x001058,1, -0x001054,1, -0x001050,1, -0x00104c,1, -0x001048,1, -0x001044,1, -0x001040,1, -0x00103c,1, -0x001038,1, -0x001034,1, -0x001030,1, -0x00102c,1, -0x001028,1, -0x001024,1, -0x001020,1, -0x00101c,1, -0x001018,1, -0x001014,1, -0x001010,1, -0x00100c,1, -0x001008,1, -0x001004,1, -0x001000,1, -0x000ffc,1, -0x000ff8,1, -0x000ff4,1, -0x000fdc,1, -0x000fd4,1, -0x000fd0,1, -0x000fcc,1, -0x000fc8,1, -0x000fc4,1, -0x000fc0,1, -0x000fbc,1, -0x000fb8,1, -0x000fb4,1, -0x000fb0,1, -0x000fac,1, -0x000fa8,1, -0x000fa0,1, -0x000f9c,1, -0x000f98,1, -0x000f94,1, -0x000f90,1, -0x000f8c,1, -0x000f88,1, -0x000f84,1, -0x000f80,1, -0x000e94,1, -0x000e90,1, -0x000e80,1, -0x000e30,1, -0x000e2c,1, -0x000e28,1, -0x000e24,1, -0x000e20,1, -0x000e1c,1, -0x000e18,1, -0x000e14,1, -0x000e10,1, -0x000e0c,1, -0x000e04,1, -0x000e00,1, -0x000dfc,1, -0x000df8,1, -0x000df4,1, -0x000dec,1, -0x000de4,1, -0x000de0,1, -0x000ddc,1, -0x000dd8,1, -0x000dd4,1, -0x000dcc,1, -0x000dc8,1, -0x000dc0,1, -0x000db8,1, -0x000db4,1, -0x000db0,1, -0x000da8,1, -0x000da4,1, -0x000da0,1, -0x000d80,1, -0x000d7c,1, -0x000d78,1, -0x000d74,1, -0x000d70,1, -0x000d6c,1, -0x000d68,1, -0x000d64,1, -0x000d60,1, -0x000d5c,1, -0x000d58,1, -0x000d54,1, -0x000d50,1, -0x000d4c,1, -0x000d48,1, -0x000d44,1, -0x000d40,1, -0x000d34,1, -0x000d30,1, -0x000d20,1, -0x000d14,1, -0x000d10,1, -0x000d00,1, -0x000cec,1, -0x000ce8,1, -0x000ce4,1, -0x000ce0,1, -0x000cdc,1, -0x000cd8,1, -0x000cd4,1, -0x000cd0,1, -0x000ccc,1, -0x000cc8,1, -0x000c90,1, -0x000c8c,1, -0x000c88,1, -0x000c84,1, -0x000c80,1, -0x000c68,1, -0x000c50,1, -0x000c4c,1, -0x000c24,1, -0x000c20,1, -0x000c1c,1, -0x000c18,1, -0x000c14,1, -0x000c10,1, -0x000c0c,1, -0x000c08,1, -0x000c04,1, -0x000c00,1, -0x000b34,1, -0x000b30,1, -0x000b20,1, -0x000b14,1, -0x000b10,1, -0x000b00,1, -0x000978,1, -0x000974,1, -0x000970,1, -0x00096c,1, -0x000968,1, -0x000964,1, -0x000960,1, -0x00095c,1, -0x000958,1, -0x000954,1, -0x000950,1, -0x00094c,1, -0x000948,1, -0x000944,1, -0x000940,1, -0x00093c,1, -0x000938,1, -0x000934,1, -0x000930,1, -0x00092c,1, -0x000928,1, -0x000924,1, -0x000920,1, -0x00091c,1, -0x000918,1, -0x000914,1, -0x000910,1, -0x00090c,1, -0x000908,1, -0x000904,1, -0x000900,1, -0x0008fc,1, -0x0008f8,1, -0x0008f4,1, -0x0008f0,1, -0x0008ec,1, -0x0008e8,1, -0x0008e4,1, -0x0008e0,1, -0x0008dc,1, -0x0008d8,1, -0x0008d4,1, -0x0008d0,1, -0x0008cc,1, -0x0008c8,1, -0x0008c4,1, -0x0008c0,1, -0x0008bc,1, -0x0008b8,1, -0x0008b4,1, -0x0008b0,1, -0x0008ac,1, -0x0008a8,1, -0x0008a4,1, -0x0008a0,1, -0x00089c,1, -0x000898,1, -0x000894,1, -0x000890,1, -0x00088c,1, -0x000888,1, -0x000884,1, -0x000880,1, -0x00087c,1, -0x000878,1, -0x000874,1, -0x000870,1, -0x00086c,1, -0x000868,1, -0x000864,1, -0x000860,1, -0x00085c,1, -0x000858,1, -0x000854,1, -0x000850,1, -0x00084c,1, -0x000848,1, -0x000844,1, -0x000840,1, -0x00083c,1, -0x000838,1, -0x000834,1, -0x000830,1, -0x00082c,1, -0x000828,1, -0x000824,1, -0x000820,1, -0x00081c,1, -0x000818,1, -0x000814,1, -0x000810,1, -0x00080c,1, -0x000808,1, -0x000804,1, -0x000800,1, -0x0007fc,1, -0x0007f8,1, -0x0007f4,1, -0x0007dc,1, -0x0007d4,1, -0x0007d0,1, -0x0007cc,1, -0x0007c8,1, -0x0007c4,1, -0x0007c0,1, -0x0007bc,1, -0x0007b8,1, -0x0007b4,1, -0x0007b0,1, -0x0007ac,1, -0x0007a8,1, -0x0007a0,1, -0x00079c,1, -0x000798,1, -0x000794,1, -0x000790,1, -0x00078c,1, -0x000788,1, -0x000784,1, -0x000780,1, -0x000694,1, -0x000690,1, -0x000680,1, -0x000630,1, -0x00062c,1, -0x000628,1, -0x000624,1, -0x000620,1, -0x00061c,1, -0x000618,1, -0x000614,1, -0x000610,1, -0x00060c,1, -0x000604,1, -0x000600,1, -0x0005fc,1, -0x0005f8,1, -0x0005f4,1, -0x0005ec,1, -0x0005e4,1, -0x0005e0,1, -0x0005dc,1, -0x0005d8,1, -0x0005d4,1, -0x0005cc,1, -0x0005c8,1, -0x0005c0,1, -0x0005b8,1, -0x0005b4,1, -0x0005b0,1, -0x0005a8,1, -0x0005a4,1, -0x0005a0,1, -0x000580,1, -0x00057c,1, -0x000578,1, -0x000574,1, -0x000570,1, -0x00056c,1, -0x000568,1, -0x000564,1, -0x000560,1, -0x00055c,1, -0x000558,1, -0x000554,1, -0x000550,1, -0x00054c,1, -0x000548,1, -0x000544,1, -0x000540,1, -0x000534,1, -0x000530,1, -0x000520,1, -0x000514,1, -0x000510,1, -0x000500,1, -0x0004ec,1, -0x0004e8,1, -0x0004e4,1, -0x0004e0,1, -0x0004dc,1, -0x0004d8,1, -0x0004d4,1, -0x0004d0,1, -0x0004cc,1, -0x0004c8,1, -0x000490,1, -0x00048c,1, -0x000488,1, -0x000484,1, -0x000480,1, -0x000468,1, -0x000450,1, -0x00044c,1, -0x000424,1, -0x000420,1, -0x00041c,1, -0x000418,1, -0x000414,1, -0x000410,1, -0x00040c,1, -0x000408,1, -0x000404,1, -0x000400,1, -0x000334,1, -0x000330,1, -0x000320,1, -0x000314,1, -0x000310,1, -0x000300,1, -0x000178,1, -0x000174,1, -0x000170,1, -0x00016c,1, -0x000168,1, -0x000164,1, -0x000160,1, -0x00015c,1, -0x000158,1, -0x000154,1, -0x000150,1, -0x00014c,1, -0x000148,1, -0x000144,1, -0x000140,1, -0x00013c,1, -0x000138,1, -0x000134,1, -0x000130,1, -0x00012c,1, -0x000128,1, -0x000124,1, -0x000120,1, -0x00011c,1, -0x000118,1, -0x000114,1, -0x000110,1, -0x00010c,1, -0x000108,1, -0x000104,1, -0x000100,1, -0x0000fc,1, -0x0000f8,1, -0x0000f4,1, -0x0000f0,1, -0x0000ec,1, -0x0000e8,1, -0x0000e4,1, -0x0000e0,1, -0x0000dc,1, -0x0000d8,1, -0x0000d4,1, -0x0000d0,1, -0x0000cc,1, -0x0000c8,1, -0x0000c4,1, -0x0000c0,1, -0x0000bc,1, -0x0000b8,1, -0x0000b4,1, -0x0000b0,1, -0x0000ac,1, -0x0000a8,1, -0x0000a4,1, -0x0000a0,1, -0x00009c,1, -0x000098,1, -0x000094,1, -0x000090,1, -0x00008c,1, -0x000088,1, -0x000084,1, -0x000080,1, -0x00007c,1, -0x000078,1, -0x000074,1, -0x000070,1, -0x00006c,1, -0x000068,1, -0x000064,1, -0x000060,1, -0x00005c,1, -0x000058,1, -0x000054,1, -0x000050,1, -0x00004c,1, -0x000048,1, -0x000044,1, -0x000040,1, -0x00003c,1, -0x000038,1, -0x000034,1, -0x000030,1, -0x00002c,1, -0x000028,1, -0x000024,1, -0x000020,1, -0x00001c,1, -0x000018,1, -0x000014,1, -0x000010,1, -0x00000c,1, -0x000008,1, -0x000004,1, -0x000000,1, diff --git a/mstdump/mstdump_dbs/Spectrum.csv b/mstdump/mstdump_dbs/Spectrum.csv index 9b0a4a0..83f58fb 100644 --- a/mstdump/mstdump_dbs/Spectrum.csv +++ b/mstdump/mstdump_dbs/Spectrum.csv @@ -3986,7 +3986,7 @@ 0x0c2b80,19, 0x0c2bd0,10, 0x0c2c00,19, -0x0c2c50,10, +0x0c2c60,6, 0x0c2c84,1, 0x0c2c94,8, 0x0c2cb8,14, @@ -4097,7 +4097,6 @@ 0x0d0000,4, 0x0d0014,1, 0x0d0020,3, -0x0d0030,3, 0x0d0040,8, 0x0d007c,2, 0x0d00a0,6, @@ -4230,7 +4229,6 @@ 0x0d8020,3, 0x0d8030,1, 0x0d8038,4, -0x0d8050,1, 0x0d8100,6, 0x0d8120,10, 0x0d8150,10, @@ -4238,16 +4236,6 @@ 0x0d81b0,6, 0x0d81d0,6, 0x0d81f0,2, -0x0d8400,1, -0x0d8428,1, -0x0d8450,1, -0x0d8478,1, -0x0d84a0,6, -0x0d85ac,1, -0x0d85d8,4, -0x0d8600,6, -0x0d8620,6, -0x0d8640,3, 0x0d8800,6, 0x0d8820,3, 0x0d8830,4, @@ -4257,12 +4245,6 @@ 0x0d8958,2, 0x0d8964,1, 0x0d8974,3, -0x0d8998,2, -0x0d89a4,1, -0x0d89b4,3, -0x0d89d8,2, -0x0d89e4,1, -0x0d89f4,3, 0x0d9020,4, 0x0d9040,11, 0x0d9074,2, @@ -4319,62 +4301,6 @@ 0x0da570,18, 0x0da5bc,5, 0x0da800,480, -0x0db020,4, -0x0db040,11, -0x0db074,2, -0x0db080,4, -0x0db0b0,22, -0x0db110,2, -0x0db120,22, -0x0db180,2, -0x0db1a0,6, -0x0db1c0,9, -0x0db200,42, -0x0db2c0,1, -0x0db2c8,13, -0x0db300,25, -0x0db36c,4, -0x0db380,2, -0x0db3a0,1, -0x0db3c0,11, -0x0db404,3, -0x0db420,11, -0x0db480,6, -0x0db500,1, -0x0db520,6, -0x0db540,3, -0x0db550,7, -0x0db570,18, -0x0db5bc,5, -0x0db800,480, -0x0dc020,4, -0x0dc040,11, -0x0dc074,2, -0x0dc080,4, -0x0dc0b0,22, -0x0dc110,2, -0x0dc120,22, -0x0dc180,2, -0x0dc1a0,6, -0x0dc1c0,9, -0x0dc200,42, -0x0dc2c0,1, -0x0dc2c8,13, -0x0dc300,25, -0x0dc36c,4, -0x0dc380,2, -0x0dc3a0,1, -0x0dc3c0,11, -0x0dc404,3, -0x0dc420,11, -0x0dc480,6, -0x0dc500,1, -0x0dc520,6, -0x0dc540,3, -0x0dc550,7, -0x0dc570,18, -0x0dc5bc,5, -0x0dc800,480, 0x0df800,5, 0x0df818,1, 0x0df854,6, @@ -4387,18 +4313,6 @@ 0x0df980,4, 0x0df9a4,1, 0x0df9ac,2, -0x0dfa00,5, -0x0dfa18,1, -0x0dfa54,6, -0x0dfa80,4, -0x0dfaa4,1, -0x0dfaac,2, -0x0dfb00,5, -0x0dfb18,1, -0x0dfb54,6, -0x0dfb80,4, -0x0dfba4,1, -0x0dfbac,2, 0x0e8000,1, 0x0e8008,2, 0x0e8058,3, @@ -4576,78 +4490,6 @@ 0x0f208c,3, 0x0f20a0,10, 0x0f20e0,6, -0x0f2100,2, -0x0f210c,3, -0x0f2120,10, -0x0f2160,6, -0x0f2180,2, -0x0f218c,3, -0x0f21a0,10, -0x0f21e0,6, -0x0f2200,2, -0x0f220c,3, -0x0f2220,10, -0x0f2260,6, -0x0f2280,2, -0x0f228c,3, -0x0f22a0,10, -0x0f22e0,6, -0x0f2300,2, -0x0f230c,3, -0x0f2320,10, -0x0f2360,6, -0x0f2380,2, -0x0f238c,3, -0x0f23a0,10, -0x0f23e0,6, -0x0f2400,2, -0x0f240c,3, -0x0f2420,10, -0x0f2460,6, -0x0f2480,2, -0x0f248c,3, -0x0f24a0,10, -0x0f24e0,6, -0x0f2500,2, -0x0f250c,3, -0x0f2520,10, -0x0f2560,6, -0x0f2580,2, -0x0f258c,3, -0x0f25a0,10, -0x0f25e0,6, -0x0f2600,2, -0x0f260c,3, -0x0f2620,10, -0x0f2660,6, -0x0f2680,2, -0x0f268c,3, -0x0f26a0,10, -0x0f26e0,6, -0x0f2700,2, -0x0f270c,3, -0x0f2720,10, -0x0f2760,6, -0x0f2780,2, -0x0f278c,3, -0x0f27a0,10, -0x0f27e0,6, -0x0f2800,2, -0x0f280c,3, -0x0f2820,10, -0x0f2860,6, -0x0f2880,2, -0x0f288c,3, -0x0f28a0,10, -0x0f28e0,6, -0x0f2900,2, -0x0f290c,3, -0x0f2920,10, -0x0f2960,6, -0x0f2980,2, -0x0f298c,3, -0x0f29a0,10, -0x0f29e0,6, 0x0f4000,7, 0x0f4020,4, 0x0f4204,1, @@ -10212,30 +10054,11 @@ 0x1c91e0,40, 0x1c92e0,10, 0x1c9320,10, -0x1c9560,10, +0x1c9560,8, 0x1c95a0,10, 0x1c95e0,5, 0x1c9600,10, 0x1c9660,21, -0x1c9800,18, -0x1c9880,18, -0x1c9a00,15, -0x1c9a40,15, -0x1c9a80,10, -0x1c9ac0,10, -0x1c9b00,3, -0x1c9b80,18, -0x1c9c00,13, -0x1c9c40,10, -0x1c9c80,15, -0x1c9d00,10, -0x1c9e00,1, -0x1ca000,1, -0x1ca184,1, -0x1ca18c,1, -0x1ca1a4,1, -0x1ca1ac,1, -0x1ca1c0,1, 0x1ca804,1, 0x1ca80c,4, 0x1ca824,1, @@ -10320,30 +10143,11 @@ 0x1cd1e0,40, 0x1cd2e0,10, 0x1cd320,10, -0x1cd560,10, +0x1cd560,8, 0x1cd5a0,10, 0x1cd5e0,5, 0x1cd600,10, 0x1cd660,21, -0x1cd800,18, -0x1cd880,18, -0x1cda00,15, -0x1cda40,15, -0x1cda80,10, -0x1cdac0,10, -0x1cdb00,3, -0x1cdb80,18, -0x1cdc00,13, -0x1cdc40,10, -0x1cdc80,15, -0x1cdd00,10, -0x1cde00,1, -0x1ce000,1, -0x1ce184,1, -0x1ce18c,1, -0x1ce1a4,1, -0x1ce1ac,1, -0x1ce1c0,1, 0x1ce804,1, 0x1ce80c,4, 0x1ce824,1, @@ -10428,30 +10232,11 @@ 0x1d11e0,40, 0x1d12e0,10, 0x1d1320,10, -0x1d1560,10, +0x1d1560,8, 0x1d15a0,10, 0x1d15e0,5, 0x1d1600,10, 0x1d1660,21, -0x1d1800,18, -0x1d1880,18, -0x1d1a00,15, -0x1d1a40,15, -0x1d1a80,10, -0x1d1ac0,10, -0x1d1b00,3, -0x1d1b80,18, -0x1d1c00,13, -0x1d1c40,10, -0x1d1c80,15, -0x1d1d00,10, -0x1d1e00,1, -0x1d2000,1, -0x1d2184,1, -0x1d218c,1, -0x1d21a4,1, -0x1d21ac,1, -0x1d21c0,1, 0x1d2804,1, 0x1d280c,4, 0x1d2824,1, @@ -10536,30 +10321,11 @@ 0x1d51e0,40, 0x1d52e0,10, 0x1d5320,10, -0x1d5560,10, +0x1d5560,8, 0x1d55a0,10, 0x1d55e0,5, 0x1d5600,10, 0x1d5660,21, -0x1d5800,18, -0x1d5880,18, -0x1d5a00,15, -0x1d5a40,15, -0x1d5a80,10, -0x1d5ac0,10, -0x1d5b00,3, -0x1d5b80,18, -0x1d5c00,13, -0x1d5c40,10, -0x1d5c80,15, -0x1d5d00,10, -0x1d5e00,1, -0x1d6000,1, -0x1d6184,1, -0x1d618c,1, -0x1d61a4,1, -0x1d61ac,1, -0x1d61c0,1, 0x1d6804,1, 0x1d680c,4, 0x1d6824,1, @@ -11358,23 +11124,6 @@ 0x20620c,6, 0x206240,13, 0x206280,16, -0x206400,8, -0x206424,15, -0x206464,15, -0x2064a4,15, -0x2064e4,30, -0x206580,10, -0x2065ac,1, -0x2065b4,5, -0x2065cc,1, -0x2065d4,5, -0x2065ec,1, -0x2065f4,13, -0x206680,4, -0x206694,2, -0x2066a0,5, -0x2066c0,5, -0x2066e0,4, 0x206800,19, 0x206850,10, 0x206880,19, @@ -11392,7 +11141,7 @@ 0x206b80,19, 0x206bd0,10, 0x206c00,19, -0x206c50,10, +0x206c60,6, 0x206c84,1, 0x206c94,8, 0x206cb8,14, @@ -11421,13 +11170,6 @@ 0x208030,1, 0x208038,4, 0x208050,1, -0x208100,6, -0x208120,10, -0x208150,10, -0x208180,10, -0x2081b0,6, -0x2081d0,6, -0x2081f0,2, 0x208400,1, 0x208428,1, 0x208450,1, @@ -12105,23 +11847,6 @@ 0x22620c,6, 0x226240,13, 0x226280,16, -0x226400,8, -0x226424,15, -0x226464,15, -0x2264a4,15, -0x2264e4,30, -0x226580,10, -0x2265ac,1, -0x2265b4,5, -0x2265cc,1, -0x2265d4,5, -0x2265ec,1, -0x2265f4,13, -0x226680,4, -0x226694,2, -0x2266a0,5, -0x2266c0,5, -0x2266e0,4, 0x226800,19, 0x226850,10, 0x226880,19, @@ -12139,7 +11864,7 @@ 0x226b80,19, 0x226bd0,10, 0x226c00,19, -0x226c50,10, +0x226c60,6, 0x226c84,1, 0x226c94,8, 0x226cb8,14, @@ -12168,13 +11893,6 @@ 0x228030,1, 0x228038,4, 0x228050,1, -0x228100,6, -0x228120,10, -0x228150,10, -0x228180,10, -0x2281b0,6, -0x2281d0,6, -0x2281f0,2, 0x228400,1, 0x228428,1, 0x228450,1, @@ -12852,23 +12570,6 @@ 0x24620c,6, 0x246240,13, 0x246280,16, -0x246400,8, -0x246424,15, -0x246464,15, -0x2464a4,15, -0x2464e4,30, -0x246580,10, -0x2465ac,1, -0x2465b4,5, -0x2465cc,1, -0x2465d4,5, -0x2465ec,1, -0x2465f4,13, -0x246680,4, -0x246694,2, -0x2466a0,5, -0x2466c0,5, -0x2466e0,4, 0x246800,19, 0x246850,10, 0x246880,19, @@ -12886,7 +12587,7 @@ 0x246b80,19, 0x246bd0,10, 0x246c00,19, -0x246c50,10, +0x246c60,6, 0x246c84,1, 0x246c94,8, 0x246cb8,14, @@ -12915,13 +12616,6 @@ 0x248030,1, 0x248038,4, 0x248050,1, -0x248100,6, -0x248120,10, -0x248150,10, -0x248180,10, -0x2481b0,6, -0x2481d0,6, -0x2481f0,2, 0x248400,1, 0x248428,1, 0x248450,1, @@ -13633,7 +13327,7 @@ 0x266b80,19, 0x266bd0,10, 0x266c00,19, -0x266c50,10, +0x266c60,6, 0x266c84,1, 0x266c94,8, 0x266cb8,14, @@ -13662,13 +13356,6 @@ 0x268030,1, 0x268038,4, 0x268050,1, -0x268100,6, -0x268120,10, -0x268150,10, -0x268180,10, -0x2681b0,6, -0x2681d0,6, -0x2681f0,2, 0x268400,1, 0x268428,1, 0x268450,1, @@ -14346,23 +14033,6 @@ 0x28620c,6, 0x286240,13, 0x286280,16, -0x286400,8, -0x286424,15, -0x286464,15, -0x2864a4,15, -0x2864e4,30, -0x286580,10, -0x2865ac,1, -0x2865b4,5, -0x2865cc,1, -0x2865d4,5, -0x2865ec,1, -0x2865f4,13, -0x286680,4, -0x286694,2, -0x2866a0,5, -0x2866c0,5, -0x2866e0,4, 0x286800,19, 0x286850,10, 0x286880,19, @@ -14380,7 +14050,7 @@ 0x286b80,19, 0x286bd0,10, 0x286c00,19, -0x286c50,10, +0x286c60,6, 0x286c84,1, 0x286c94,8, 0x286cb8,14, @@ -14409,13 +14079,6 @@ 0x288030,1, 0x288038,4, 0x288050,1, -0x288100,6, -0x288120,10, -0x288150,10, -0x288180,10, -0x2881b0,6, -0x2881d0,6, -0x2881f0,2, 0x288400,1, 0x288428,1, 0x288450,1, @@ -15093,23 +14756,6 @@ 0x2a620c,6, 0x2a6240,13, 0x2a6280,16, -0x2a6400,8, -0x2a6424,15, -0x2a6464,15, -0x2a64a4,15, -0x2a64e4,30, -0x2a6580,10, -0x2a65ac,1, -0x2a65b4,5, -0x2a65cc,1, -0x2a65d4,5, -0x2a65ec,1, -0x2a65f4,13, -0x2a6680,4, -0x2a6694,2, -0x2a66a0,5, -0x2a66c0,5, -0x2a66e0,4, 0x2a6800,19, 0x2a6850,10, 0x2a6880,19, @@ -15127,7 +14773,7 @@ 0x2a6b80,19, 0x2a6bd0,10, 0x2a6c00,19, -0x2a6c50,10, +0x2a6c60,6, 0x2a6c84,1, 0x2a6c94,8, 0x2a6cb8,14, @@ -15156,13 +14802,6 @@ 0x2a8030,1, 0x2a8038,4, 0x2a8050,1, -0x2a8100,6, -0x2a8120,10, -0x2a8150,10, -0x2a8180,10, -0x2a81b0,6, -0x2a81d0,6, -0x2a81f0,2, 0x2a8400,1, 0x2a8428,1, 0x2a8450,1, @@ -15840,23 +15479,6 @@ 0x2c620c,6, 0x2c6240,13, 0x2c6280,16, -0x2c6400,8, -0x2c6424,15, -0x2c6464,15, -0x2c64a4,15, -0x2c64e4,30, -0x2c6580,10, -0x2c65ac,1, -0x2c65b4,5, -0x2c65cc,1, -0x2c65d4,5, -0x2c65ec,1, -0x2c65f4,13, -0x2c6680,4, -0x2c6694,2, -0x2c66a0,5, -0x2c66c0,5, -0x2c66e0,4, 0x2c6800,19, 0x2c6850,10, 0x2c6880,19, @@ -15874,7 +15496,7 @@ 0x2c6b80,19, 0x2c6bd0,10, 0x2c6c00,19, -0x2c6c50,10, +0x2c6c60,6, 0x2c6c84,1, 0x2c6c94,8, 0x2c6cb8,14, @@ -15903,13 +15525,6 @@ 0x2c8030,1, 0x2c8038,4, 0x2c8050,1, -0x2c8100,6, -0x2c8120,10, -0x2c8150,10, -0x2c8180,10, -0x2c81b0,6, -0x2c81d0,6, -0x2c81f0,2, 0x2c8400,1, 0x2c8428,1, 0x2c8450,1, @@ -16587,23 +16202,6 @@ 0x2e620c,6, 0x2e6240,13, 0x2e6280,16, -0x2e6400,8, -0x2e6424,15, -0x2e6464,15, -0x2e64a4,15, -0x2e64e4,30, -0x2e6580,10, -0x2e65ac,1, -0x2e65b4,5, -0x2e65cc,1, -0x2e65d4,5, -0x2e65ec,1, -0x2e65f4,13, -0x2e6680,4, -0x2e6694,2, -0x2e66a0,5, -0x2e66c0,5, -0x2e66e0,4, 0x2e6800,19, 0x2e6850,10, 0x2e6880,19, @@ -16621,7 +16219,7 @@ 0x2e6b80,19, 0x2e6bd0,10, 0x2e6c00,19, -0x2e6c50,10, +0x2e6c60,6, 0x2e6c84,1, 0x2e6c94,8, 0x2e6cb8,14, @@ -16650,13 +16248,6 @@ 0x2e8030,1, 0x2e8038,4, 0x2e8050,1, -0x2e8100,6, -0x2e8120,10, -0x2e8150,10, -0x2e8180,10, -0x2e81b0,6, -0x2e81d0,6, -0x2e81f0,2, 0x2e8400,1, 0x2e8428,1, 0x2e8450,1, @@ -17334,23 +16925,6 @@ 0x30620c,6, 0x306240,13, 0x306280,16, -0x306400,8, -0x306424,15, -0x306464,15, -0x3064a4,15, -0x3064e4,30, -0x306580,10, -0x3065ac,1, -0x3065b4,5, -0x3065cc,1, -0x3065d4,5, -0x3065ec,1, -0x3065f4,13, -0x306680,4, -0x306694,2, -0x3066a0,5, -0x3066c0,5, -0x3066e0,4, 0x306800,19, 0x306850,10, 0x306880,19, @@ -17368,7 +16942,7 @@ 0x306b80,19, 0x306bd0,10, 0x306c00,19, -0x306c50,10, +0x306c60,6, 0x306c84,1, 0x306c94,8, 0x306cb8,14, @@ -17397,13 +16971,6 @@ 0x308030,1, 0x308038,4, 0x308050,1, -0x308100,6, -0x308120,10, -0x308150,10, -0x308180,10, -0x3081b0,6, -0x3081d0,6, -0x3081f0,2, 0x308400,1, 0x308428,1, 0x308450,1, @@ -18081,23 +17648,6 @@ 0x32620c,6, 0x326240,13, 0x326280,16, -0x326400,8, -0x326424,15, -0x326464,15, -0x3264a4,15, -0x3264e4,30, -0x326580,10, -0x3265ac,1, -0x3265b4,5, -0x3265cc,1, -0x3265d4,5, -0x3265ec,1, -0x3265f4,13, -0x326680,4, -0x326694,2, -0x3266a0,5, -0x3266c0,5, -0x3266e0,4, 0x326800,19, 0x326850,10, 0x326880,19, @@ -18115,7 +17665,7 @@ 0x326b80,19, 0x326bd0,10, 0x326c00,19, -0x326c50,10, +0x326c60,6, 0x326c84,1, 0x326c94,8, 0x326cb8,14, @@ -18144,13 +17694,6 @@ 0x328030,1, 0x328038,4, 0x328050,1, -0x328100,6, -0x328120,10, -0x328150,10, -0x328180,10, -0x3281b0,6, -0x3281d0,6, -0x3281f0,2, 0x328400,1, 0x328428,1, 0x328450,1, @@ -18828,23 +18371,6 @@ 0x34620c,6, 0x346240,13, 0x346280,16, -0x346400,8, -0x346424,15, -0x346464,15, -0x3464a4,15, -0x3464e4,30, -0x346580,10, -0x3465ac,1, -0x3465b4,5, -0x3465cc,1, -0x3465d4,5, -0x3465ec,1, -0x3465f4,13, -0x346680,4, -0x346694,2, -0x3466a0,5, -0x3466c0,5, -0x3466e0,4, 0x346800,19, 0x346850,10, 0x346880,19, @@ -18862,7 +18388,7 @@ 0x346b80,19, 0x346bd0,10, 0x346c00,19, -0x346c50,10, +0x346c60,6, 0x346c84,1, 0x346c94,8, 0x346cb8,14, @@ -18891,13 +18417,6 @@ 0x348030,1, 0x348038,4, 0x348050,1, -0x348100,6, -0x348120,10, -0x348150,10, -0x348180,10, -0x3481b0,6, -0x3481d0,6, -0x3481f0,2, 0x348400,1, 0x348428,1, 0x348450,1, @@ -19609,7 +19128,7 @@ 0x366b80,19, 0x366bd0,10, 0x366c00,19, -0x366c50,10, +0x366c60,6, 0x366c84,1, 0x366c94,8, 0x366cb8,14, @@ -19638,13 +19157,6 @@ 0x368030,1, 0x368038,4, 0x368050,1, -0x368100,6, -0x368120,10, -0x368150,10, -0x368180,10, -0x3681b0,6, -0x3681d0,6, -0x3681f0,2, 0x368400,1, 0x368428,1, 0x368450,1, @@ -20322,23 +19834,6 @@ 0x38620c,6, 0x386240,13, 0x386280,16, -0x386400,8, -0x386424,15, -0x386464,15, -0x3864a4,15, -0x3864e4,30, -0x386580,10, -0x3865ac,1, -0x3865b4,5, -0x3865cc,1, -0x3865d4,5, -0x3865ec,1, -0x3865f4,13, -0x386680,4, -0x386694,2, -0x3866a0,5, -0x3866c0,5, -0x3866e0,4, 0x386800,19, 0x386850,10, 0x386880,19, @@ -20356,7 +19851,7 @@ 0x386b80,19, 0x386bd0,10, 0x386c00,19, -0x386c50,10, +0x386c60,6, 0x386c84,1, 0x386c94,8, 0x386cb8,14, @@ -20385,13 +19880,6 @@ 0x388030,1, 0x388038,4, 0x388050,1, -0x388100,6, -0x388120,10, -0x388150,10, -0x388180,10, -0x3881b0,6, -0x3881d0,6, -0x3881f0,2, 0x388400,1, 0x388428,1, 0x388450,1, @@ -21069,23 +20557,6 @@ 0x3a620c,6, 0x3a6240,13, 0x3a6280,16, -0x3a6400,8, -0x3a6424,15, -0x3a6464,15, -0x3a64a4,15, -0x3a64e4,30, -0x3a6580,10, -0x3a65ac,1, -0x3a65b4,5, -0x3a65cc,1, -0x3a65d4,5, -0x3a65ec,1, -0x3a65f4,13, -0x3a6680,4, -0x3a6694,2, -0x3a66a0,5, -0x3a66c0,5, -0x3a66e0,4, 0x3a6800,19, 0x3a6850,10, 0x3a6880,19, @@ -21103,7 +20574,7 @@ 0x3a6b80,19, 0x3a6bd0,10, 0x3a6c00,19, -0x3a6c50,10, +0x3a6c60,6, 0x3a6c84,1, 0x3a6c94,8, 0x3a6cb8,14, @@ -21132,13 +20603,6 @@ 0x3a8030,1, 0x3a8038,4, 0x3a8050,1, -0x3a8100,6, -0x3a8120,10, -0x3a8150,10, -0x3a8180,10, -0x3a81b0,6, -0x3a81d0,6, -0x3a81f0,2, 0x3a8400,1, 0x3a8428,1, 0x3a8450,1, @@ -21816,23 +21280,6 @@ 0x3c620c,6, 0x3c6240,13, 0x3c6280,16, -0x3c6400,8, -0x3c6424,15, -0x3c6464,15, -0x3c64a4,15, -0x3c64e4,30, -0x3c6580,10, -0x3c65ac,1, -0x3c65b4,5, -0x3c65cc,1, -0x3c65d4,5, -0x3c65ec,1, -0x3c65f4,13, -0x3c6680,4, -0x3c6694,2, -0x3c66a0,5, -0x3c66c0,5, -0x3c66e0,4, 0x3c6800,19, 0x3c6850,10, 0x3c6880,19, @@ -21850,7 +21297,7 @@ 0x3c6b80,19, 0x3c6bd0,10, 0x3c6c00,19, -0x3c6c50,10, +0x3c6c60,6, 0x3c6c84,1, 0x3c6c94,8, 0x3c6cb8,14, @@ -21879,13 +21326,6 @@ 0x3c8030,1, 0x3c8038,4, 0x3c8050,1, -0x3c8100,6, -0x3c8120,10, -0x3c8150,10, -0x3c8180,10, -0x3c81b0,6, -0x3c81d0,6, -0x3c81f0,2, 0x3c8400,1, 0x3c8428,1, 0x3c8450,1, @@ -22563,23 +22003,6 @@ 0x3e620c,6, 0x3e6240,13, 0x3e6280,16, -0x3e6400,8, -0x3e6424,15, -0x3e6464,15, -0x3e64a4,15, -0x3e64e4,30, -0x3e6580,10, -0x3e65ac,1, -0x3e65b4,5, -0x3e65cc,1, -0x3e65d4,5, -0x3e65ec,1, -0x3e65f4,13, -0x3e6680,4, -0x3e6694,2, -0x3e66a0,5, -0x3e66c0,5, -0x3e66e0,4, 0x3e6800,19, 0x3e6850,10, 0x3e6880,19, @@ -22597,7 +22020,7 @@ 0x3e6b80,19, 0x3e6bd0,10, 0x3e6c00,19, -0x3e6c50,10, +0x3e6c60,6, 0x3e6c84,1, 0x3e6c94,8, 0x3e6cb8,14, @@ -22626,13 +22049,6 @@ 0x3e8030,1, 0x3e8038,4, 0x3e8050,1, -0x3e8100,6, -0x3e8120,10, -0x3e8150,10, -0x3e8180,10, -0x3e81b0,6, -0x3e81d0,6, -0x3e81f0,2, 0x3e8400,1, 0x3e8428,1, 0x3e8450,1, diff --git a/mstdump/mstdump_dbs/SwitchIB2.csv b/mstdump/mstdump_dbs/SwitchIB2.csv new file mode 100644 index 0000000..cd74222 --- /dev/null +++ b/mstdump/mstdump_dbs/SwitchIB2.csv @@ -0,0 +1,13081 @@ +#Addr, Size, Enable addr +0x000400,1, +0x000408,14, +0x000480,1, +0x000488,18, +0x000500,9, +0x000534,2, +0x00054c,4, +0x00056c,11, +0x0005ac,8, +0x0005d0,1, +0x000604,1, +0x00060c,13, +0x000644,1, +0x000654,3, +0x000664,1, +0x00066c,8, +0x0006a8,3, +0x0006c0,8, +0x000700,6, +0x000760,4, +0x000780,8, +0x0007b8,8, +0x0007dc,10, +0x000808,14, +0x000880,1, +0x000888,18, +0x000900,9, +0x000934,2, +0x00094c,4, +0x00096c,11, +0x0009ac,8, +0x0009d0,1, +0x000a04,1, +0x000a0c,13, +0x000a44,1, +0x000a54,3, +0x000a64,1, +0x000a6c,8, +0x000aa8,3, +0x000ac0,8, +0x000b00,6, +0x000b60,4, +0x000b80,8, +0x000bb8,8, +0x000bdc,10, +0x000c08,14, +0x000c80,1, +0x000c88,18, +0x000d00,9, +0x000d34,2, +0x000d4c,4, +0x000d6c,11, +0x000dac,8, +0x000dd0,1, +0x000e04,1, +0x000e0c,13, +0x000e44,1, +0x000e54,3, +0x000e64,1, +0x000e6c,8, +0x000ea8,3, +0x000ec0,8, +0x000f00,6, +0x000f60,4, +0x000f80,8, +0x000fb8,8, +0x000fdc,10, +0x001008,14, +0x001080,1, +0x001088,18, +0x001100,9, +0x001134,2, +0x00114c,4, +0x00116c,11, +0x0011ac,8, +0x0011d0,1, +0x001204,1, +0x00120c,13, +0x001244,1, +0x001254,3, +0x001264,1, +0x00126c,8, +0x0012a8,3, +0x0012c0,8, +0x001300,6, +0x001360,4, +0x001380,8, +0x0013b8,8, +0x0013dc,10, +0x001408,14, +0x001480,1, +0x001488,18, +0x001500,9, +0x001534,2, +0x00154c,4, +0x00156c,11, +0x0015ac,8, +0x0015d0,1, +0x001604,1, +0x00160c,13, +0x001644,1, +0x001654,3, +0x001664,1, +0x00166c,8, +0x0016a8,3, +0x0016c0,8, +0x001700,6, +0x001760,4, +0x001780,8, +0x0017b8,8, +0x0017dc,10, +0x001808,14, +0x001880,1, +0x001888,18, +0x001900,9, +0x001934,2, +0x00194c,4, +0x00196c,11, +0x0019ac,8, +0x0019d0,1, +0x001a04,1, +0x001a0c,13, +0x001a44,1, +0x001a54,3, +0x001a64,1, +0x001a6c,8, +0x001aa8,3, +0x001ac0,8, +0x001b00,6, +0x001b60,4, +0x001b80,8, +0x001bb8,8, +0x001bdc,10, +0x001c08,14, +0x001c80,1, +0x001c88,18, +0x001d00,9, +0x001d34,2, +0x001d4c,4, +0x001d6c,11, +0x001dac,8, +0x001dd0,1, +0x001e04,1, +0x001e0c,13, +0x001e44,1, +0x001e54,3, +0x001e64,1, +0x001e6c,8, +0x001ea8,3, +0x001ec0,8, +0x001f00,6, +0x001f60,4, +0x001f80,8, +0x001fb8,8, +0x001fdc,10, +0x002008,14, +0x002080,1, +0x002088,18, +0x002100,9, +0x002134,2, +0x00214c,4, +0x00216c,11, +0x0021ac,8, +0x0021d0,1, +0x002204,1, +0x00220c,13, +0x002244,1, +0x002254,3, +0x002264,1, +0x00226c,8, +0x0022a8,3, +0x0022c0,8, +0x002300,6, +0x002360,4, +0x002380,8, +0x0023b8,8, +0x0023dc,10, +0x002408,14, +0x002480,1, +0x002488,18, +0x002500,9, +0x002534,2, +0x00254c,4, +0x00256c,11, +0x0025ac,8, +0x0025d0,1, +0x002604,1, +0x00260c,13, +0x002644,1, +0x002654,3, +0x002664,1, +0x00266c,8, +0x0026a8,3, +0x0026c0,8, +0x002700,6, +0x002760,4, +0x002780,8, +0x0027b8,8, +0x0027dc,10, +0x002808,14, +0x002880,1, +0x002888,18, +0x002900,9, +0x002934,2, +0x00294c,4, +0x00296c,11, +0x0029ac,8, +0x0029d0,1, +0x002a04,1, +0x002a0c,13, +0x002a44,1, +0x002a54,3, +0x002a64,1, +0x002a6c,8, +0x002aa8,3, +0x002ac0,8, +0x002b00,6, +0x002b60,4, +0x002b80,8, +0x002bb8,8, +0x002bdc,10, +0x002c08,14, +0x002c80,1, +0x002c88,18, +0x002d00,9, +0x002d34,2, +0x002d4c,4, +0x002d6c,11, +0x002dac,8, +0x002dd0,1, +0x002e04,1, +0x002e0c,13, +0x002e44,1, +0x002e54,3, +0x002e64,1, +0x002e6c,8, +0x002ea8,3, +0x002ec0,8, +0x002f00,6, +0x002f60,4, +0x002f80,8, +0x002fb8,8, +0x002fdc,10, +0x003008,14, +0x003080,1, +0x003088,18, +0x003100,9, +0x003134,2, +0x00314c,4, +0x00316c,11, +0x0031ac,8, +0x0031d0,1, +0x003204,1, +0x00320c,13, +0x003244,1, +0x003254,3, +0x003264,1, +0x00326c,8, +0x0032a8,3, +0x0032c0,8, +0x003300,6, +0x003360,4, +0x003380,8, +0x0033b8,8, +0x0033dc,10, +0x003408,14, +0x003480,1, +0x003488,18, +0x003500,9, +0x003534,2, +0x00354c,4, +0x00356c,11, +0x0035ac,8, +0x0035d0,1, +0x003604,1, +0x00360c,13, +0x003644,1, +0x003654,3, +0x003664,1, +0x00366c,8, +0x0036a8,3, +0x0036c0,8, +0x003700,6, +0x003760,4, +0x003780,8, +0x0037b8,8, +0x0037dc,10, +0x003808,14, +0x003880,1, +0x003888,18, +0x003900,9, +0x003934,2, +0x00394c,4, +0x00396c,11, +0x0039ac,8, +0x0039d0,1, +0x003a04,1, +0x003a0c,13, +0x003a44,1, +0x003a54,3, +0x003a64,1, +0x003a6c,8, +0x003aa8,3, +0x003ac0,8, +0x003b00,6, +0x003b60,4, +0x003b80,8, +0x003bb8,8, +0x003bdc,10, +0x003c08,14, +0x003c80,1, +0x003c88,18, +0x003d00,9, +0x003d34,2, +0x003d4c,4, +0x003d6c,11, +0x003dac,8, +0x003dd0,1, +0x003e04,1, +0x003e0c,13, +0x003e44,1, +0x003e54,3, +0x003e64,1, +0x003e6c,8, +0x003ea8,3, +0x003ec0,8, +0x003f00,6, +0x003f60,4, +0x003f80,8, +0x003fb8,8, +0x003fdc,10, +0x004008,14, +0x004080,1, +0x004088,18, +0x004100,9, +0x004134,2, +0x00414c,4, +0x00416c,11, +0x0041ac,8, +0x0041d0,1, +0x004204,1, +0x00420c,13, +0x004244,1, +0x004254,3, +0x004264,1, +0x00426c,8, +0x0042a8,3, +0x0042c0,8, +0x004300,6, +0x004360,4, +0x004380,8, +0x0043b8,8, +0x0043dc,10, +0x004408,14, +0x004480,1, +0x004488,18, +0x004500,9, +0x004534,2, +0x00454c,4, +0x00456c,11, +0x0045ac,8, +0x0045d0,1, +0x004604,1, +0x00460c,13, +0x004644,1, +0x004654,3, +0x004664,1, +0x00466c,8, +0x0046a8,3, +0x0046c0,8, +0x004700,6, +0x004760,4, +0x004780,8, +0x0047b8,8, +0x0047dc,10, +0x004808,14, +0x004880,1, +0x004888,18, +0x004900,9, +0x004934,2, +0x00494c,4, +0x00496c,11, +0x0049ac,8, +0x0049d0,1, +0x004a04,1, +0x004a0c,13, +0x004a44,1, +0x004a54,3, +0x004a64,1, +0x004a6c,8, +0x004aa8,3, +0x004ac0,8, +0x004b00,6, +0x004b60,4, +0x004b80,8, +0x004bb8,8, +0x004bdc,10, +0x004c08,14, +0x004c80,1, +0x004c88,18, +0x004d00,9, +0x004d34,2, +0x004d4c,4, +0x004d6c,11, +0x004dac,8, +0x004dd0,1, +0x004e04,1, +0x004e0c,13, +0x004e44,1, +0x004e54,3, +0x004e64,1, +0x004e6c,8, +0x004ea8,3, +0x004ec0,8, +0x004f00,6, +0x004f60,4, +0x004f80,8, +0x004fb8,8, +0x004fdc,10, +0x005008,14, +0x005080,1, +0x005088,18, +0x005100,9, +0x005134,2, +0x00514c,4, +0x00516c,11, +0x0051ac,8, +0x0051d0,1, +0x005204,1, +0x00520c,13, +0x005244,1, +0x005254,3, +0x005264,1, +0x00526c,8, +0x0052a8,3, +0x0052c0,8, +0x005300,6, +0x005360,4, +0x005380,8, +0x0053b8,8, +0x0053dc,10, +0x005428,1, +0x005450,1, +0x005478,1, +0x0054a0,1, +0x0055ac,1, +0x0055d8,4, +0x005600,6, +0x005620,6, +0x005640,3, +0x005800,13, +0x005840,6, +0x005860,3, +0x005880,2, +0x005904,2, +0x005918,1, +0x005940,1, +0x008400,1, +0x008408,14, +0x008480,1, +0x008488,18, +0x008500,9, +0x008534,2, +0x00854c,4, +0x00856c,11, +0x0085ac,8, +0x0085d0,1, +0x008604,1, +0x00860c,13, +0x008644,1, +0x008654,3, +0x008664,1, +0x00866c,8, +0x0086a8,3, +0x0086c0,8, +0x008700,6, +0x008760,4, +0x008780,8, +0x0087b8,8, +0x0087dc,10, +0x008808,14, +0x008880,1, +0x008888,18, +0x008900,9, +0x008934,2, +0x00894c,4, +0x00896c,11, +0x0089ac,8, +0x0089d0,1, +0x008a04,1, +0x008a0c,13, +0x008a44,1, +0x008a54,3, +0x008a64,1, +0x008a6c,8, +0x008aa8,3, +0x008ac0,8, +0x008b00,6, +0x008b60,4, +0x008b80,8, +0x008bb8,8, +0x008bdc,10, +0x008c08,14, +0x008c80,1, +0x008c88,18, +0x008d00,9, +0x008d34,2, +0x008d4c,4, +0x008d6c,11, +0x008dac,8, +0x008dd0,1, +0x008e04,1, +0x008e0c,13, +0x008e44,1, +0x008e54,3, +0x008e64,1, +0x008e6c,8, +0x008ea8,3, +0x008ec0,8, +0x008f00,6, +0x008f60,4, +0x008f80,8, +0x008fb8,8, +0x008fdc,10, +0x009008,14, +0x009080,1, +0x009088,18, +0x009100,9, +0x009134,2, +0x00914c,4, +0x00916c,11, +0x0091ac,8, +0x0091d0,1, +0x009204,1, +0x00920c,13, +0x009244,1, +0x009254,3, +0x009264,1, +0x00926c,8, +0x0092a8,3, +0x0092c0,8, +0x009300,6, +0x009360,4, +0x009380,8, +0x0093b8,8, +0x0093dc,10, +0x009408,14, +0x009480,1, +0x009488,18, +0x009500,9, +0x009534,2, +0x00954c,4, +0x00956c,11, +0x0095ac,8, +0x0095d0,1, +0x009604,1, +0x00960c,13, +0x009644,1, +0x009654,3, +0x009664,1, +0x00966c,8, +0x0096a8,3, +0x0096c0,8, +0x009700,6, +0x009760,4, +0x009780,8, +0x0097b8,8, +0x0097dc,10, +0x009808,14, +0x009880,1, +0x009888,18, +0x009900,9, +0x009934,2, +0x00994c,4, +0x00996c,11, +0x0099ac,8, +0x0099d0,1, +0x009a04,1, +0x009a0c,13, +0x009a44,1, +0x009a54,3, +0x009a64,1, +0x009a6c,8, +0x009aa8,3, +0x009ac0,8, +0x009b00,6, +0x009b60,4, +0x009b80,8, +0x009bb8,8, +0x009bdc,10, +0x009c08,14, +0x009c80,1, +0x009c88,18, +0x009d00,9, +0x009d34,2, +0x009d4c,4, +0x009d6c,11, +0x009dac,8, +0x009dd0,1, +0x009e04,1, +0x009e0c,13, +0x009e44,1, +0x009e54,3, +0x009e64,1, +0x009e6c,8, +0x009ea8,3, +0x009ec0,8, +0x009f00,6, +0x009f60,4, +0x009f80,8, +0x009fb8,8, +0x009fdc,10, +0x00a008,14, +0x00a080,1, +0x00a088,18, +0x00a100,9, +0x00a134,2, +0x00a14c,4, +0x00a16c,11, +0x00a1ac,8, +0x00a1d0,1, +0x00a204,1, +0x00a20c,13, +0x00a244,1, +0x00a254,3, +0x00a264,1, +0x00a26c,8, +0x00a2a8,3, +0x00a2c0,8, +0x00a300,6, +0x00a360,4, +0x00a380,8, +0x00a3b8,8, +0x00a3dc,10, +0x00a408,14, +0x00a480,1, +0x00a488,18, +0x00a500,9, +0x00a534,2, +0x00a54c,4, +0x00a56c,11, +0x00a5ac,8, +0x00a5d0,1, +0x00a604,1, +0x00a60c,13, +0x00a644,1, +0x00a654,3, +0x00a664,1, +0x00a66c,8, +0x00a6a8,3, +0x00a6c0,8, +0x00a700,6, +0x00a760,4, +0x00a780,8, +0x00a7b8,8, +0x00a7dc,10, +0x00a808,14, +0x00a880,1, +0x00a888,18, +0x00a900,9, +0x00a934,2, +0x00a94c,4, +0x00a96c,11, +0x00a9ac,8, +0x00a9d0,1, +0x00aa04,1, +0x00aa0c,13, +0x00aa44,1, +0x00aa54,3, +0x00aa64,1, +0x00aa6c,8, +0x00aaa8,3, +0x00aac0,8, +0x00ab00,6, +0x00ab60,4, +0x00ab80,8, +0x00abb8,8, +0x00abdc,10, +0x00ac08,14, +0x00ac80,1, +0x00ac88,18, +0x00ad00,9, +0x00ad34,2, +0x00ad4c,4, +0x00ad6c,11, +0x00adac,8, +0x00add0,1, +0x00ae04,1, +0x00ae0c,13, +0x00ae44,1, +0x00ae54,3, +0x00ae64,1, +0x00ae6c,8, +0x00aea8,3, +0x00aec0,8, +0x00af00,6, +0x00af60,4, +0x00af80,8, +0x00afb8,8, +0x00afdc,10, +0x00b008,14, +0x00b080,1, +0x00b088,18, +0x00b100,9, +0x00b134,2, +0x00b14c,4, +0x00b16c,11, +0x00b1ac,8, +0x00b1d0,1, +0x00b204,1, +0x00b20c,13, +0x00b244,1, +0x00b254,3, +0x00b264,1, +0x00b26c,8, +0x00b2a8,3, +0x00b2c0,8, +0x00b300,6, +0x00b360,4, +0x00b380,8, +0x00b3b8,8, +0x00b3dc,10, +0x00b408,14, +0x00b480,1, +0x00b488,18, +0x00b500,9, +0x00b534,2, +0x00b54c,4, +0x00b56c,11, +0x00b5ac,8, +0x00b5d0,1, +0x00b604,1, +0x00b60c,13, +0x00b644,1, +0x00b654,3, +0x00b664,1, +0x00b66c,8, +0x00b6a8,3, +0x00b6c0,8, +0x00b700,6, +0x00b760,4, +0x00b780,8, +0x00b7b8,8, +0x00b7dc,10, +0x00b808,14, +0x00b880,1, +0x00b888,18, +0x00b900,9, +0x00b934,2, +0x00b94c,4, +0x00b96c,11, +0x00b9ac,8, +0x00b9d0,1, +0x00ba04,1, +0x00ba0c,13, +0x00ba44,1, +0x00ba54,3, +0x00ba64,1, +0x00ba6c,8, +0x00baa8,3, +0x00bac0,8, +0x00bb00,6, +0x00bb60,4, +0x00bb80,8, +0x00bbb8,8, +0x00bbdc,10, +0x00bc08,14, +0x00bc80,1, +0x00bc88,18, +0x00bd00,9, +0x00bd34,2, +0x00bd4c,4, +0x00bd6c,11, +0x00bdac,8, +0x00bdd0,1, +0x00be04,1, +0x00be0c,13, +0x00be44,1, +0x00be54,3, +0x00be64,1, +0x00be6c,8, +0x00bea8,3, +0x00bec0,8, +0x00bf00,6, +0x00bf60,4, +0x00bf80,8, +0x00bfb8,8, +0x00bfdc,10, +0x00c008,14, +0x00c080,1, +0x00c088,18, +0x00c100,9, +0x00c134,2, +0x00c14c,4, +0x00c16c,11, +0x00c1ac,8, +0x00c1d0,1, +0x00c204,1, +0x00c20c,13, +0x00c244,1, +0x00c254,3, +0x00c264,1, +0x00c26c,8, +0x00c2a8,3, +0x00c2c0,8, +0x00c300,6, +0x00c360,4, +0x00c380,8, +0x00c3b8,8, +0x00c3dc,10, +0x00c408,14, +0x00c480,1, +0x00c488,18, +0x00c500,9, +0x00c534,2, +0x00c54c,4, +0x00c56c,11, +0x00c5ac,8, +0x00c5d0,1, +0x00c604,1, +0x00c60c,13, +0x00c644,1, +0x00c654,3, +0x00c664,1, +0x00c66c,8, +0x00c6a8,3, +0x00c6c0,8, +0x00c700,6, +0x00c760,4, +0x00c780,8, +0x00c7b8,8, +0x00c7dc,10, +0x00c808,14, +0x00c880,1, +0x00c888,18, +0x00c900,9, +0x00c934,2, +0x00c94c,4, +0x00c96c,11, +0x00c9ac,8, +0x00c9d0,1, +0x00ca04,1, +0x00ca0c,13, +0x00ca44,1, +0x00ca54,3, +0x00ca64,1, +0x00ca6c,8, +0x00caa8,3, +0x00cac0,8, +0x00cb00,6, +0x00cb60,4, +0x00cb80,8, +0x00cbb8,8, +0x00cbdc,10, +0x00cc08,14, +0x00cc80,1, +0x00cc88,18, +0x00cd00,9, +0x00cd34,2, +0x00cd4c,4, +0x00cd6c,11, +0x00cdac,8, +0x00cdd0,1, +0x00ce04,1, +0x00ce0c,13, +0x00ce44,1, +0x00ce54,3, +0x00ce64,1, +0x00ce6c,8, +0x00cea8,3, +0x00cec0,8, +0x00cf00,6, +0x00cf60,4, +0x00cf80,8, +0x00cfb8,8, +0x00cfdc,10, +0x00d008,14, +0x00d080,1, +0x00d088,18, +0x00d100,9, +0x00d134,2, +0x00d14c,4, +0x00d16c,11, +0x00d1ac,8, +0x00d1d0,1, +0x00d204,1, +0x00d20c,13, +0x00d244,1, +0x00d254,3, +0x00d264,1, +0x00d26c,8, +0x00d2a8,3, +0x00d2c0,8, +0x00d300,6, +0x00d360,4, +0x00d380,8, +0x00d3b8,8, +0x00d3dc,10, +0x00d428,1, +0x00d450,1, +0x00d478,1, +0x00d4a0,1, +0x00d5ac,1, +0x00d5d8,4, +0x00d600,6, +0x00d620,6, +0x00d640,3, +0x00d800,13, +0x00d840,6, +0x00d860,3, +0x00d880,2, +0x00d904,2, +0x00d918,1, +0x00d940,1, +0x010000,1, +0x010008,10, +0x010034,16, +0x010080,33, +0x010110,5, +0x010128,2, +0x010134,1, +0x01013c,13, +0x010174,1, +0x01017c,7, +0x0101a0,17, +0x0101e8,3, +0x010200,1, +0x010208,10, +0x010234,16, +0x010280,33, +0x010310,5, +0x010328,2, +0x010334,1, +0x01033c,13, +0x010374,1, +0x01037c,7, +0x0103a0,17, +0x0103e8,3, +0x010400,1, +0x010408,10, +0x010434,16, +0x010480,33, +0x010510,5, +0x010528,2, +0x010534,1, +0x01053c,13, +0x010574,1, +0x01057c,7, +0x0105a0,17, +0x0105e8,3, +0x010600,1, +0x010608,10, +0x010634,16, +0x010680,33, +0x010710,5, +0x010728,2, +0x010734,1, +0x01073c,13, +0x010774,1, +0x01077c,7, +0x0107a0,17, +0x0107e8,3, +0x010800,1, +0x010808,10, +0x010834,16, +0x010880,33, +0x010910,5, +0x010928,2, +0x010934,1, +0x01093c,13, +0x010974,1, +0x01097c,7, +0x0109a0,17, +0x0109e8,3, +0x010a00,1, +0x010a08,10, +0x010a34,16, +0x010a80,33, +0x010b10,5, +0x010b28,2, +0x010b34,1, +0x010b3c,13, +0x010b74,1, +0x010b7c,7, +0x010ba0,17, +0x010be8,3, +0x010c00,1, +0x010c08,10, +0x010c34,16, +0x010c80,33, +0x010d10,5, +0x010d28,2, +0x010d34,1, +0x010d3c,13, +0x010d74,1, +0x010d7c,7, +0x010da0,17, +0x010de8,3, +0x010e00,1, +0x010e08,10, +0x010e34,16, +0x010e80,33, +0x010f10,5, +0x010f28,2, +0x010f34,1, +0x010f3c,13, +0x010f74,1, +0x010f7c,7, +0x010fa0,17, +0x010fe8,3, +0x011000,1, +0x011008,10, +0x011034,16, +0x011080,33, +0x011110,5, +0x011128,2, +0x011134,1, +0x01113c,13, +0x011174,1, +0x01117c,7, +0x0111a0,17, +0x0111e8,3, +0x011200,1, +0x011208,10, +0x011234,16, +0x011280,33, +0x011310,5, +0x011328,2, +0x011334,1, +0x01133c,13, +0x011374,1, +0x01137c,7, +0x0113a0,17, +0x0113e8,3, +0x011400,1, +0x011408,10, +0x011434,16, +0x011480,33, +0x011510,5, +0x011528,2, +0x011534,1, +0x01153c,13, +0x011574,1, +0x01157c,7, +0x0115a0,17, +0x0115e8,3, +0x011600,1, +0x011608,10, +0x011634,16, +0x011680,33, +0x011710,5, +0x011728,2, +0x011734,1, +0x01173c,13, +0x011774,1, +0x01177c,7, +0x0117a0,17, +0x0117e8,3, +0x011800,1, +0x011808,10, +0x011834,16, +0x011880,33, +0x011910,5, +0x011928,2, +0x011934,1, +0x01193c,13, +0x011974,1, +0x01197c,7, +0x0119a0,17, +0x0119e8,3, +0x011a00,1, +0x011a08,10, +0x011a34,16, +0x011a80,33, +0x011b10,5, +0x011b28,2, +0x011b34,1, +0x011b3c,13, +0x011b74,1, +0x011b7c,7, +0x011ba0,17, +0x011be8,3, +0x011c00,1, +0x011c08,10, +0x011c34,16, +0x011c80,33, +0x011d10,5, +0x011d28,2, +0x011d34,1, +0x011d3c,13, +0x011d74,1, +0x011d7c,7, +0x011da0,17, +0x011de8,3, +0x011e00,1, +0x011e08,10, +0x011e34,16, +0x011e80,33, +0x011f10,5, +0x011f28,2, +0x011f34,1, +0x011f3c,13, +0x011f74,1, +0x011f7c,7, +0x011fa0,17, +0x011fe8,3, +0x012000,1, +0x012008,10, +0x012034,16, +0x012080,33, +0x012110,5, +0x012128,2, +0x012134,1, +0x01213c,13, +0x012174,1, +0x01217c,7, +0x0121a0,17, +0x0121e8,3, +0x012200,1, +0x012208,10, +0x012234,16, +0x012280,33, +0x012310,5, +0x012328,2, +0x012334,1, +0x01233c,13, +0x012374,1, +0x01237c,7, +0x0123a0,17, +0x0123e8,3, +0x012800,2, +0x01280c,37, +0x0128a4,64, +0x012a00,84, +0x012b54,2, +0x012b7c,1, +0x012b84,1, +0x012b8c,4, +0x012ba4,1, +0x012bac,75, +0x012d00,60, +0x012dfc,7, +0x012e20,6, +0x012e40,6, +0x012e60,6, +0x012e80,3, +0x012f00,14, +0x012f40,1, +0x013000,3, +0x013028,3, +0x013050,3, +0x013078,3, +0x0130a0,6, +0x0131ac,1, +0x0131d8,4, +0x013200,6, +0x013220,6, +0x013240,6, +0x013260,6, +0x013280,6, +0x0132a0,6, +0x0132c0,3, +0x013400,6, +0x013420,3, +0x013440,3, +0x013500,13, +0x013540,1, +0x013900,1, +0x014000,1, +0x014008,10, +0x014034,16, +0x014080,33, +0x014110,5, +0x014128,2, +0x014134,1, +0x01413c,13, +0x014174,1, +0x01417c,7, +0x0141a0,17, +0x0141e8,3, +0x014200,1, +0x014208,10, +0x014234,16, +0x014280,33, +0x014310,5, +0x014328,2, +0x014334,1, +0x01433c,13, +0x014374,1, +0x01437c,7, +0x0143a0,17, +0x0143e8,3, +0x014400,1, +0x014408,10, +0x014434,16, +0x014480,33, +0x014510,5, +0x014528,2, +0x014534,1, +0x01453c,13, +0x014574,1, +0x01457c,7, +0x0145a0,17, +0x0145e8,3, +0x014600,1, +0x014608,10, +0x014634,16, +0x014680,33, +0x014710,5, +0x014728,2, +0x014734,1, +0x01473c,13, +0x014774,1, +0x01477c,7, +0x0147a0,17, +0x0147e8,3, +0x014800,1, +0x014808,10, +0x014834,16, +0x014880,33, +0x014910,5, +0x014928,2, +0x014934,1, +0x01493c,13, +0x014974,1, +0x01497c,7, +0x0149a0,17, +0x0149e8,3, +0x014a00,1, +0x014a08,10, +0x014a34,16, +0x014a80,33, +0x014b10,5, +0x014b28,2, +0x014b34,1, +0x014b3c,13, +0x014b74,1, +0x014b7c,7, +0x014ba0,17, +0x014be8,3, +0x014c00,1, +0x014c08,10, +0x014c34,16, +0x014c80,33, +0x014d10,5, +0x014d28,2, +0x014d34,1, +0x014d3c,13, +0x014d74,1, +0x014d7c,7, +0x014da0,17, +0x014de8,3, +0x014e00,1, +0x014e08,10, +0x014e34,16, +0x014e80,33, +0x014f10,5, +0x014f28,2, +0x014f34,1, +0x014f3c,13, +0x014f74,1, +0x014f7c,7, +0x014fa0,17, +0x014fe8,3, +0x015000,1, +0x015008,10, +0x015034,16, +0x015080,33, +0x015110,5, +0x015128,2, +0x015134,1, +0x01513c,13, +0x015174,1, +0x01517c,7, +0x0151a0,17, +0x0151e8,3, +0x015200,1, +0x015208,10, +0x015234,16, +0x015280,33, +0x015310,5, +0x015328,2, +0x015334,1, +0x01533c,13, +0x015374,1, +0x01537c,7, +0x0153a0,17, +0x0153e8,3, +0x015400,1, +0x015408,10, +0x015434,16, +0x015480,33, +0x015510,5, +0x015528,2, +0x015534,1, +0x01553c,13, +0x015574,1, +0x01557c,7, +0x0155a0,17, +0x0155e8,3, +0x015600,1, +0x015608,10, +0x015634,16, +0x015680,33, +0x015710,5, +0x015728,2, +0x015734,1, +0x01573c,13, +0x015774,1, +0x01577c,7, +0x0157a0,17, +0x0157e8,3, +0x015800,1, +0x015808,10, +0x015834,16, +0x015880,33, +0x015910,5, +0x015928,2, +0x015934,1, +0x01593c,13, +0x015974,1, +0x01597c,7, +0x0159a0,17, +0x0159e8,3, +0x015a00,1, +0x015a08,10, +0x015a34,16, +0x015a80,33, +0x015b10,5, +0x015b28,2, +0x015b34,1, +0x015b3c,13, +0x015b74,1, +0x015b7c,7, +0x015ba0,17, +0x015be8,3, +0x015c00,1, +0x015c08,10, +0x015c34,16, +0x015c80,33, +0x015d10,5, +0x015d28,2, +0x015d34,1, +0x015d3c,13, +0x015d74,1, +0x015d7c,7, +0x015da0,17, +0x015de8,3, +0x015e00,1, +0x015e08,10, +0x015e34,16, +0x015e80,33, +0x015f10,5, +0x015f28,2, +0x015f34,1, +0x015f3c,13, +0x015f74,1, +0x015f7c,7, +0x015fa0,17, +0x015fe8,3, +0x016000,1, +0x016008,10, +0x016034,16, +0x016080,33, +0x016110,5, +0x016128,2, +0x016134,1, +0x01613c,13, +0x016174,1, +0x01617c,7, +0x0161a0,17, +0x0161e8,3, +0x016200,1, +0x016208,10, +0x016234,16, +0x016280,33, +0x016310,5, +0x016328,2, +0x016334,1, +0x01633c,13, +0x016374,1, +0x01637c,7, +0x0163a0,17, +0x0163e8,3, +0x016800,2, +0x01680c,37, +0x0168a4,64, +0x016a00,84, +0x016b54,2, +0x016b7c,1, +0x016b84,1, +0x016b8c,4, +0x016ba4,1, +0x016bac,75, +0x016d00,60, +0x016dfc,7, +0x016e20,6, +0x016e40,6, +0x016e60,6, +0x016e80,3, +0x016f00,14, +0x016f40,1, +0x017000,3, +0x017028,3, +0x017050,3, +0x017078,3, +0x0170a0,6, +0x0171ac,1, +0x0171d8,4, +0x017200,6, +0x017220,6, +0x017240,6, +0x017260,6, +0x017280,6, +0x0172a0,6, +0x0172c0,3, +0x017400,6, +0x017420,3, +0x017440,3, +0x017500,13, +0x017540,1, +0x017900,1, +0x018000,9, +0x018030,8, +0x018080,9, +0x0180b0,8, +0x018100,9, +0x018130,8, +0x018180,9, +0x0181b0,8, +0x018200,9, +0x018230,8, +0x018280,9, +0x0182b0,8, +0x018300,9, +0x018330,8, +0x018380,9, +0x0183b0,8, +0x018400,9, +0x018430,8, +0x018480,9, +0x0184b0,8, +0x018500,9, +0x018530,8, +0x018580,9, +0x0185b0,8, +0x018600,9, +0x018630,8, +0x018680,9, +0x0186b0,8, +0x018700,9, +0x018730,8, +0x018780,9, +0x0187b0,8, +0x018800,9, +0x018830,8, +0x018880,9, +0x0188b0,8, +0x018900,9, +0x018930,8, +0x018980,9, +0x0189b0,8, +0x018a00,9, +0x018a30,8, +0x018a80,9, +0x018ab0,8, +0x018b00,9, +0x018b30,8, +0x018b80,9, +0x018bb0,8, +0x018c00,9, +0x018c30,8, +0x018c80,9, +0x018cb0,8, +0x018d00,9, +0x018d30,8, +0x018d80,9, +0x018db0,8, +0x018e00,9, +0x018e30,8, +0x018e80,9, +0x018eb0,8, +0x018f00,9, +0x018f30,8, +0x018f80,9, +0x018fb0,8, +0x019000,9, +0x019030,8, +0x019080,9, +0x0190b0,8, +0x019100,9, +0x019130,8, +0x019180,9, +0x0191b0,8, +0x019200,6, +0x019220,3, +0x019230,10, +0x019260,3, +0x019270,10, +0x0192a0,3, +0x0192b0,10, +0x0192e0,3, +0x0192f0,10, +0x019320,3, +0x019330,10, +0x019360,3, +0x019370,10, +0x0193a0,3, +0x0193b0,10, +0x0193e0,3, +0x0193f0,10, +0x019420,3, +0x019430,10, +0x019460,3, +0x019470,10, +0x0194a0,3, +0x0194b0,10, +0x0194e0,3, +0x0194f0,10, +0x019520,3, +0x019530,10, +0x019560,3, +0x019570,10, +0x0195a0,3, +0x0195b0,10, +0x0195e0,3, +0x0195f0,10, +0x019620,3, +0x019630,10, +0x019660,3, +0x019670,10, +0x0196a0,3, +0x0196b0,10, +0x0196e0,3, +0x0196f0,10, +0x019720,3, +0x019730,10, +0x019760,3, +0x019770,10, +0x0197a0,3, +0x0197b0,10, +0x0197e0,3, +0x0197f0,10, +0x019820,3, +0x019830,10, +0x019860,3, +0x019870,10, +0x0198a0,3, +0x0198b0,10, +0x0198e0,3, +0x0198f0,10, +0x019920,3, +0x019930,10, +0x019960,3, +0x019970,10, +0x0199a0,3, +0x0199b0,10, +0x0199e0,3, +0x0199f0,10, +0x019a20,3, +0x019a30,10, +0x019a60,3, +0x019a70,10, +0x019aa0,3, +0x019ab0,10, +0x019ae0,3, +0x019af0,4, +0x01a400,13, +0x01a440,6, +0x01a460,3, +0x01a480,8, +0x01a4b0,7, +0x01a4d0,3, +0x01a500,6, +0x01a520,6, +0x01a540,6, +0x01a560,6, +0x01a580,6, +0x01a5a0,6, +0x01a5c0,6, +0x01a5e0,6, +0x01a600,6, +0x01a620,6, +0x01a640,6, +0x01a660,6, +0x01a680,6, +0x01a6a0,6, +0x01a6c0,6, +0x01a6e0,6, +0x01a700,6, +0x01a720,6, +0x01a740,6, +0x01a760,6, +0x01a780,6, +0x01a7a0,6, +0x01a7c0,6, +0x01a7e0,6, +0x01a800,6, +0x01a820,6, +0x01a840,6, +0x01a860,6, +0x01a880,6, +0x01a8a0,6, +0x01a8c0,6, +0x01a8e0,6, +0x01a900,6, +0x01a920,6, +0x01a940,6, +0x01a960,6, +0x01ab00,6, +0x01ab20,3, +0x01ab30,10, +0x01ab60,3, +0x01ab70,10, +0x01aba0,3, +0x01abb0,10, +0x01abe0,3, +0x01abf0,9, +0x01acf4,3, +0x01b000,38, +0x01b100,37, +0x01b200,18, +0x01b400,6, +0x01b420,6, +0x01b440,6, +0x01b460,6, +0x01b480,6, +0x01b4a0,6, +0x01b4c0,6, +0x01b4e0,6, +0x01b500,6, +0x01b520,6, +0x01b540,6, +0x01b560,6, +0x01b580,6, +0x01b5a0,6, +0x01b5c0,6, +0x01b5e0,6, +0x01b600,6, +0x01b620,6, +0x01b640,3, +0x01b800,6, +0x01b820,6, +0x01b840,6, +0x01b860,6, +0x01b880,6, +0x01b8a0,6, +0x01b8c0,6, +0x01b8e0,6, +0x01b900,6, +0x01b920,6, +0x01b940,6, +0x01b960,6, +0x01b980,6, +0x01b9a0,6, +0x01b9c0,6, +0x01b9e0,6, +0x01ba00,6, +0x01ba20,6, +0x01ba40,6, +0x01ba60,3, +0x01bc00,2, +0x01c000,22, +0x01c060,3, +0x01c070,26, +0x01c0e0,3, +0x01c0f0,26, +0x01c160,3, +0x01c170,26, +0x01c1e0,3, +0x01c1f0,26, +0x01c260,3, +0x01c270,26, +0x01c2e0,3, +0x01c2f0,26, +0x01c360,3, +0x01c370,26, +0x01c3e0,3, +0x01c3f0,26, +0x01c460,3, +0x01c470,26, +0x01c4e0,3, +0x01c4f0,26, +0x01c560,3, +0x01c570,26, +0x01c5e0,3, +0x01c5f0,26, +0x01c660,3, +0x01c670,26, +0x01c6e0,3, +0x01c6f0,26, +0x01c760,3, +0x01c770,26, +0x01c7e0,3, +0x01c7f0,26, +0x01c860,3, +0x01c870,26, +0x01c8e0,3, +0x01c8f0,26, +0x01c960,3, +0x01c970,26, +0x01c9e0,3, +0x01c9f0,26, +0x01ca60,3, +0x01ca70,26, +0x01cae0,3, +0x01caf0,26, +0x01cb60,3, +0x01cb70,26, +0x01cbe0,3, +0x01cbf0,26, +0x01cc60,3, +0x01cc70,26, +0x01cce0,3, +0x01ccf0,26, +0x01cd60,3, +0x01cd70,26, +0x01cde0,3, +0x01cdf0,26, +0x01ce60,3, +0x01ce70,26, +0x01cee0,3, +0x01cef0,26, +0x01cf60,3, +0x01cf70,26, +0x01cfe0,3, +0x01cff0,26, +0x01d060,3, +0x01d070,26, +0x01d0e0,3, +0x01d0f0,26, +0x01d160,3, +0x01d170,26, +0x01d1e0,3, +0x01d1f0,6, +0x01d800,6, +0x01d820,4, +0x01d840,8, +0x01d87c,7, +0x01d8a0,4, +0x01d8c0,8, +0x01d8fc,7, +0x01d920,4, +0x01d940,8, +0x01d97c,7, +0x01d9a0,4, +0x01d9c0,8, +0x01d9fc,7, +0x01da20,4, +0x01da40,8, +0x01da7c,7, +0x01daa0,4, +0x01dac0,8, +0x01dafc,7, +0x01db20,4, +0x01db40,8, +0x01db7c,7, +0x01dba0,4, +0x01dbc0,8, +0x01dbfc,7, +0x01dc20,4, +0x01dc40,8, +0x01dc7c,7, +0x01dca0,4, +0x01dcc0,8, +0x01dcfc,7, +0x01dd20,4, +0x01dd40,8, +0x01dd7c,7, +0x01dda0,4, +0x01ddc0,8, +0x01ddfc,7, +0x01de20,4, +0x01de40,8, +0x01de7c,7, +0x01dea0,4, +0x01dec0,8, +0x01defc,7, +0x01df20,4, +0x01df40,8, +0x01df7c,7, +0x01dfa0,4, +0x01dfc0,8, +0x01dffc,7, +0x01e020,4, +0x01e040,8, +0x01e07c,7, +0x01e0a0,4, +0x01e0c0,8, +0x01e0fc,7, +0x01e120,4, +0x01e140,8, +0x01e17c,7, +0x01e1a0,4, +0x01e1c0,8, +0x01e1fc,7, +0x01e220,4, +0x01e240,8, +0x01e27c,7, +0x01e2a0,4, +0x01e2c0,8, +0x01e2fc,7, +0x01e320,4, +0x01e340,8, +0x01e37c,7, +0x01e3a0,4, +0x01e3c0,8, +0x01e3fc,7, +0x01e420,4, +0x01e440,8, +0x01e47c,7, +0x01e4a0,4, +0x01e4c0,8, +0x01e4fc,7, +0x01e520,4, +0x01e540,8, +0x01e57c,7, +0x01e5a0,4, +0x01e5c0,8, +0x01e5fc,7, +0x01e620,4, +0x01e640,8, +0x01e67c,7, +0x01e6a0,4, +0x01e6c0,8, +0x01e6fc,7, +0x01e720,4, +0x01e740,8, +0x01e77c,7, +0x01e7a0,4, +0x01e7c0,8, +0x01e7fc,7, +0x01e820,4, +0x01e840,8, +0x01e87c,7, +0x01e8a0,4, +0x01e8c0,8, +0x01e8fc,7, +0x01e920,4, +0x01e940,8, +0x01e97c,7, +0x01e9a0,4, +0x01e9c0,8, +0x01e9fc,7, +0x01ea20,4, +0x01ea40,8, +0x01ea7c,7, +0x01eaa0,4, +0x01eac0,8, +0x01eafc,1, +0x01f408,13, +0x01f440,1, +0x01f448,1, +0x01f45c,4, +0x01f470,10, +0x01f4a0,6, +0x01f4c0,6, +0x01f4e0,3, +0x01f800,4, +0x01f828,4, +0x01f850,4, +0x01f878,4, +0x01f8a0,4, +0x01f9ac,1, +0x01f9d8,4, +0x01fa00,6, +0x01fa20,6, +0x01fa40,6, +0x01fa60,6, +0x01fa80,6, +0x01faa0,6, +0x01fac0,6, +0x01fae0,6, +0x01fb00,3, +0x01fc00,13, +0x01fc40,3, +0x01fc50,6, +0x01fc6c,1, +0x01fc80,6, +0x01fca0,6, +0x01fcc0,6, +0x01fce0,3, +0x01fd00,1, +0x01fd80,6, +0x01fda0,6, +0x01fdc0,6, +0x01fde0,3, +0x01fe00,1, +0x01fe08,4, +0x01fffc,1, +0x049000,6, +0x049020,20, +0x049080,10, +0x0490b0,1, +0x0490c0,3, +0x0490d0,3, +0x049100,2, +0x049110,3, +0x049120,4, +0x049140,7, +0x049160,7, +0x049180,3, +0x049190,1, +0x049200,6, +0x049220,20, +0x049280,10, +0x0492b0,1, +0x0492c0,3, +0x0492d0,3, +0x049300,2, +0x049310,3, +0x049320,4, +0x049340,7, +0x049360,7, +0x049380,3, +0x049390,1, +0x049400,6, +0x049420,20, +0x049480,10, +0x0494b0,1, +0x0494c0,3, +0x0494d0,3, +0x049500,2, +0x049510,3, +0x049520,4, +0x049540,7, +0x049560,7, +0x049580,3, +0x049590,1, +0x049608,2, +0x049620,1, +0x049648,2, +0x049660,1, +0x049688,2, +0x0496a0,1, +0x0496c8,2, +0x0496e0,1, +0x049708,2, +0x049720,1, +0x049748,2, +0x049760,1, +0x049788,2, +0x0497a0,1, +0x0497c8,2, +0x0497e0,1, +0x049804,28, +0x049880,3, +0x0498a0,2, +0x0498c0,1, +0x0498e0,3, +0x049a00,13, +0x049a40,2, +0x049a4c,4, +0x050400,11, +0x050430,6, +0x050460,3, +0x0504a0,3, +0x050700,13, +0x050740,7, +0x050760,7, +0x051800,162, +0x051a90,2, +0x051aa0,2, +0x051c00,8, +0x051d00,26, +0x051d84,1, +0x051d94,9, +0x051e00,16, +0x058400,12, +0x058440,7, +0x058460,2, +0x058480,12, +0x0584c0,7, +0x0584e0,2, +0x058500,6, +0x058520,6, +0x058540,3, +0x058584,1, +0x058590,9, +0x0585e0,7, +0x058600,10, +0x058640,10, +0x058680,15, +0x0586d8,9, +0x058800,6, +0x058820,6, +0x058840,6, +0x058860,6, +0x058880,6, +0x0588a0,6, +0x0588c0,6, +0x0588e0,6, +0x058900,3, +0x058a00,6, +0x058b00,6, +0x058b20,6, +0x058b40,6, +0x058b60,6, +0x058b80,6, +0x058ba0,6, +0x058bc0,3, +0x060000,32, +0x060200,64, +0x060400,96, +0x060600,2, +0x060800,96, +0x060a00,2, +0x060c20,8, +0x060f80,6, +0x060fa0,7, +0x060fd8,2, +0x060fe4,1, +0x060ff0,10, +0x061020,16, +0x061084,1, +0x0610c0,16, +0x061204,1, +0x061220,8, +0x061250,3, +0x061260,5, +0x061280,6, +0x0612a0,6, +0x061300,3, +0x061310,2, +0x061320,2, +0x061330,1, +0x061340,3, +0x062000,16, +0x062060,7, +0x062080,5, +0x062100,2, +0x06210c,2, +0x062118,1, +0x062120,1, +0x062180,10, +0x0621b0,2, +0x0621c0,2, +0x0621d0,5, +0x062200,3, +0x062210,3, +0x062280,4, +0x063600,5, +0x063620,14, +0x063660,5, +0x063684,1, +0x06368c,10, +0x063700,1, +0x063800,5, +0x063820,12, +0x063860,5, +0x063884,1, +0x06388c,10, +0x063904,1, +0x06390c,5, +0x063940,1, +0x063950,2, +0x0639fc,1, +0x064000,5, +0x064020,1, +0x064030,1, +0x064040,1, +0x064050,1, +0x064060,1, +0x064070,1, +0x064080,1, +0x064090,1, +0x0640a0,1, +0x0640b0,1, +0x0640c0,1, +0x0640d0,1, +0x0640e0,1, +0x0640f0,1, +0x064100,1, +0x064110,1, +0x064120,1, +0x064130,1, +0x064140,1, +0x064150,1, +0x064160,1, +0x064170,1, +0x064180,1, +0x064190,1, +0x0641a0,1, +0x0641b0,1, +0x0641c0,1, +0x0641d0,1, +0x0641e0,1, +0x0641f0,1, +0x064200,1, +0x064210,1, +0x064220,1, +0x064230,1, +0x064240,1, +0x064250,1, +0x064260,1, +0x064270,1, +0x064280,1, +0x064290,1, +0x0642a0,1, +0x0642b0,1, +0x0642c0,1, +0x0642d0,1, +0x0642e0,1, +0x0642f0,1, +0x064300,1, +0x064310,1, +0x064320,1, +0x064330,1, +0x064340,1, +0x064350,1, +0x064360,1, +0x064370,1, +0x064380,1, +0x064390,1, +0x0643a0,1, +0x0643b0,1, +0x0643c0,1, +0x0643d0,1, +0x0643e0,1, +0x0643f0,1, +0x064400,1, +0x064410,1, +0x064420,1, +0x064430,1, +0x064440,1, +0x064450,1, +0x064460,1, +0x064470,1, +0x064480,1, +0x064490,1, +0x0644a0,1, +0x0644b0,1, +0x0644c0,1, +0x0644d0,1, +0x0644e0,1, +0x0644f0,1, +0x064500,1, +0x064510,1, +0x064520,1, +0x064530,1, +0x064540,1, +0x064550,1, +0x064560,1, +0x064570,1, +0x064580,1, +0x064590,1, +0x0645a0,1, +0x0645b0,1, +0x0645c0,1, +0x0645d0,1, +0x0645e0,1, +0x0645f0,1, +0x064600,1, +0x064610,1, +0x064620,1, +0x064630,1, +0x064640,1, +0x064650,1, +0x064660,1, +0x064670,1, +0x064680,1, +0x064690,1, +0x0646a0,1, +0x0646b0,1, +0x0646c0,1, +0x0646d0,1, +0x0646e0,1, +0x0646f0,1, +0x064700,1, +0x064710,1, +0x064720,1, +0x064730,1, +0x064740,1, +0x064750,1, +0x064760,1, +0x064770,1, +0x064780,1, +0x064790,1, +0x0647a0,1, +0x0647b0,1, +0x0647c0,1, +0x0647d0,1, +0x0647e0,1, +0x0647f0,1, +0x064800,1, +0x064810,1, +0x064820,1, +0x064830,1, +0x064840,1, +0x064850,1, +0x064860,1, +0x064870,1, +0x064880,1, +0x064890,1, +0x0648a0,1, +0x0648b0,1, +0x0648c0,1, +0x0648d0,1, +0x0648e0,1, +0x0648f0,1, +0x064900,1, +0x064910,1, +0x064920,1, +0x064930,1, +0x064940,1, +0x064950,1, +0x064960,1, +0x064970,1, +0x064980,1, +0x064990,1, +0x0649a0,1, +0x0649b0,1, +0x0649c0,1, +0x0649d0,1, +0x0649e0,1, +0x0649f0,1, +0x064a00,1, +0x064a10,1, +0x064a20,1, +0x064a30,1, +0x064a40,1, +0x064a50,1, +0x064a60,1, +0x064a70,1, +0x064a80,1, +0x064a90,1, +0x064aa0,1, +0x064ab0,1, +0x064ac0,1, +0x064ad0,1, +0x064ae0,1, +0x064af0,1, +0x064b00,1, +0x064b10,1, +0x064b20,1, +0x064b30,1, +0x064b40,1, +0x064b50,1, +0x064b60,1, +0x064b70,1, +0x064b80,1, +0x064b90,1, +0x064ba0,1, +0x064bb0,1, +0x064bc0,1, +0x064bd0,1, +0x064be0,1, +0x064bf0,1, +0x064c00,1, +0x064c10,1, +0x064c20,1, +0x064c30,1, +0x064c40,1, +0x064c50,1, +0x064c60,1, +0x064c70,1, +0x064c80,1, +0x064c90,1, +0x064ca0,1, +0x064cb0,1, +0x064cc0,1, +0x064cd0,1, +0x064ce0,1, +0x064cf0,1, +0x064d00,1, +0x064d10,1, +0x064d20,1, +0x064d30,1, +0x064d40,1, +0x064d50,1, +0x064d60,1, +0x064d70,1, +0x064d80,1, +0x064d90,1, +0x064da0,1, +0x064db0,1, +0x064dc0,1, +0x064dd0,1, +0x064de0,1, +0x064df0,1, +0x064e00,1, +0x064e10,1, +0x064e20,1, +0x064e30,1, +0x064e40,1, +0x064e50,1, +0x064e60,1, +0x064e70,1, +0x064e80,1, +0x064e90,1, +0x064ea0,1, +0x064eb0,1, +0x064ec0,1, +0x064ed0,1, +0x064ee0,1, +0x064ef0,1, +0x064f00,1, +0x064f10,1, +0x064f20,1, +0x064f30,1, +0x064f40,1, +0x064f50,1, +0x064f60,1, +0x064f70,1, +0x064f80,1, +0x064f90,1, +0x064fa0,1, +0x064fb0,1, +0x064fc0,1, +0x064fd0,1, +0x064fe0,1, +0x064ff0,1, +0x065000,8, +0x066000,5, +0x066020,1, +0x066030,1, +0x066040,1, +0x066050,1, +0x066060,1, +0x066070,1, +0x066080,1, +0x066090,1, +0x0660a0,1, +0x0660b0,1, +0x0660c0,1, +0x0660d0,1, +0x0660e0,1, +0x0660f0,1, +0x066100,1, +0x066110,1, +0x066120,1, +0x066130,1, +0x066140,1, +0x066150,1, +0x066160,1, +0x066170,1, +0x066180,1, +0x066190,1, +0x0661a0,1, +0x0661b0,1, +0x0661c0,1, +0x0661d0,1, +0x0661e0,1, +0x0661f0,1, +0x066200,1, +0x066210,1, +0x066220,1, +0x066230,1, +0x066240,1, +0x066250,1, +0x066260,1, +0x066270,1, +0x066280,1, +0x066290,1, +0x0662a0,1, +0x0662b0,1, +0x0662c0,1, +0x0662d0,1, +0x0662e0,1, +0x0662f0,1, +0x066300,1, +0x066310,1, +0x066320,1, +0x066330,1, +0x066340,1, +0x066350,1, +0x066360,1, +0x066370,1, +0x066380,1, +0x066390,1, +0x0663a0,1, +0x0663b0,1, +0x0663c0,1, +0x0663d0,1, +0x0663e0,1, +0x0663f0,1, +0x066400,1, +0x066410,1, +0x066420,1, +0x066430,1, +0x066440,1, +0x066450,1, +0x066460,1, +0x066470,1, +0x066480,1, +0x066490,1, +0x0664a0,1, +0x0664b0,1, +0x0664c0,1, +0x0664d0,1, +0x0664e0,1, +0x0664f0,1, +0x066500,1, +0x066510,1, +0x066520,1, +0x066530,1, +0x066540,1, +0x066550,1, +0x066560,1, +0x066570,1, +0x066580,1, +0x066590,1, +0x0665a0,1, +0x0665b0,1, +0x0665c0,1, +0x0665d0,1, +0x0665e0,1, +0x0665f0,1, +0x066600,1, +0x066610,1, +0x066620,1, +0x066630,1, +0x066640,1, +0x066650,1, +0x066660,1, +0x066670,1, +0x066680,1, +0x066690,1, +0x0666a0,1, +0x0666b0,1, +0x0666c0,1, +0x0666d0,1, +0x0666e0,1, +0x0666f0,1, +0x066700,1, +0x066710,1, +0x066720,1, +0x066730,1, +0x066740,1, +0x066750,1, +0x066760,1, +0x066770,1, +0x066780,1, +0x066790,1, +0x0667a0,1, +0x0667b0,1, +0x0667c0,1, +0x0667d0,1, +0x0667e0,1, +0x0667f0,1, +0x066800,1, +0x066810,1, +0x066820,1, +0x066830,1, +0x066840,1, +0x066850,1, +0x066860,1, +0x066870,1, +0x066880,1, +0x066890,1, +0x0668a0,1, +0x0668b0,1, +0x0668c0,1, +0x0668d0,1, +0x0668e0,1, +0x0668f0,1, +0x066900,1, +0x066910,1, +0x066920,1, +0x066930,1, +0x066940,1, +0x066950,1, +0x066960,1, +0x066970,1, +0x066980,1, +0x066990,1, +0x0669a0,1, +0x0669b0,1, +0x0669c0,1, +0x0669d0,1, +0x0669e0,1, +0x0669f0,1, +0x066a00,1, +0x066a10,1, +0x066a20,1, +0x066a30,1, +0x066a40,1, +0x066a50,1, +0x066a60,1, +0x066a70,1, +0x066a80,1, +0x066a90,1, +0x066aa0,1, +0x066ab0,1, +0x066ac0,1, +0x066ad0,1, +0x066ae0,1, +0x066af0,1, +0x066b00,1, +0x066b10,1, +0x066b20,1, +0x066b30,1, +0x066b40,1, +0x066b50,1, +0x066b60,1, +0x066b70,1, +0x066b80,1, +0x066b90,1, +0x066ba0,1, +0x066bb0,1, +0x066bc0,1, +0x066bd0,1, +0x066be0,1, +0x066bf0,1, +0x066c00,1, +0x066c10,1, +0x066c20,1, +0x066c30,1, +0x066c40,1, +0x066c50,1, +0x066c60,1, +0x066c70,1, +0x066c80,1, +0x066c90,1, +0x066ca0,1, +0x066cb0,1, +0x066cc0,1, +0x066cd0,1, +0x066ce0,1, +0x066cf0,1, +0x066d00,1, +0x066d10,1, +0x066d20,1, +0x066d30,1, +0x066d40,1, +0x066d50,1, +0x066d60,1, +0x066d70,1, +0x066d80,1, +0x066d90,1, +0x066da0,1, +0x066db0,1, +0x066dc0,1, +0x066dd0,1, +0x066de0,1, +0x066df0,1, +0x066e00,1, +0x066e10,1, +0x066e20,1, +0x066e30,1, +0x066e40,1, +0x066e50,1, +0x066e60,1, +0x066e70,1, +0x066e80,1, +0x066e90,1, +0x066ea0,1, +0x066eb0,1, +0x066ec0,1, +0x066ed0,1, +0x066ee0,1, +0x066ef0,1, +0x066f00,1, +0x066f10,1, +0x066f20,1, +0x066f30,1, +0x066f40,1, +0x066f50,1, +0x066f60,1, +0x066f70,1, +0x066f80,1, +0x066f90,1, +0x066fa0,1, +0x066fb0,1, +0x066fc0,1, +0x066fd0,1, +0x066fe0,1, +0x066ff0,1, +0x067000,16, +0x067100,8, +0x067124,7, +0x067144,7, +0x067200,3, +0x0677f8,2, +0x06f008,2, +0x06f014,11, +0x06f044,1, +0x06f04c,3, +0x06f05c,1, +0x06f064,1, +0x06f07c,1, +0x06f500,2, +0x06f518,1, +0x06f520,3, +0x06f540,6, +0x06f580,10, +0x06f800,2, +0x070000,4, +0x070020,25, +0x070088,8, +0x070100,6, +0x070120,7, +0x070140,4, +0x070200,24, +0x070280,1, +0x070288,4, +0x070300,37, +0x070b00,14, +0x070b40,14, +0x070b84,1, +0x070c00,1, +0x070c10,3, +0x070c3c,3, +0x070c50,8, +0x071000,7, +0x072000,7, +0x073000,114, +0x0731d0,3, +0x0731e0,3, +0x0731f0,3, +0x073200,2, +0x073210,7, +0x073230,1, +0x073240,48, +0x073338,15, +0x074000,8, +0x074044,3, +0x074060,4, +0x074080,8, +0x075000,1025, +0x07600c,1, +0x07f000,2, +0x07f028,2, +0x07f050,2, +0x07f078,2, +0x07f0a0,23, +0x07f1ac,1, +0x07f1d8,4, +0x07f200,6, +0x07f220,6, +0x07f240,6, +0x07f260,6, +0x07f280,3, +0x07fa00,6, +0x07fb00,7, +0x07fb20,7, +0x07fb40,7, +0x07fb60,1, +0x07fb70,1, +0x07fb80,7, +0x07fc00,3, +0x080000,32771, +0x0a0010,2, +0x0a001c,6, +0x0a0038,2, +0x0a0048,2, +0x0a0058,2, +0x0a0064,16, +0x0a00ac,14, +0x0a00f0,1, +0x0a00fc,35, +0x0a01e0,1, +0x0a01e8,5, +0x0a0200,3, +0x0a0210,2, +0x0a021c,6, +0x0a0238,2, +0x0a0248,2, +0x0a0258,2, +0x0a0264,16, +0x0a02ac,14, +0x0a02f0,1, +0x0a02fc,35, +0x0a03e0,1, +0x0a03e8,5, +0x0a0400,3, +0x0a0410,2, +0x0a041c,6, +0x0a0438,2, +0x0a0448,2, +0x0a0458,2, +0x0a0464,16, +0x0a04ac,14, +0x0a04f0,1, +0x0a04fc,35, +0x0a05e0,1, +0x0a05e8,5, +0x0a0600,3, +0x0a0610,2, +0x0a061c,6, +0x0a0638,2, +0x0a0648,2, +0x0a0658,2, +0x0a0664,16, +0x0a06ac,14, +0x0a06f0,1, +0x0a06fc,35, +0x0a07e0,1, +0x0a07e8,5, +0x0a0800,3, +0x0a0810,2, +0x0a081c,6, +0x0a0838,2, +0x0a0848,2, +0x0a0858,2, +0x0a0864,16, +0x0a08ac,14, +0x0a08f0,1, +0x0a08fc,35, +0x0a09e0,1, +0x0a09e8,5, +0x0a0a00,3, +0x0a0a10,2, +0x0a0a1c,6, +0x0a0a38,2, +0x0a0a48,2, +0x0a0a58,2, +0x0a0a64,16, +0x0a0aac,14, +0x0a0af0,1, +0x0a0afc,35, +0x0a0be0,1, +0x0a0be8,5, +0x0a0c00,3, +0x0a0c10,2, +0x0a0c1c,6, +0x0a0c38,2, +0x0a0c48,2, +0x0a0c58,2, +0x0a0c64,16, +0x0a0cac,14, +0x0a0cf0,1, +0x0a0cfc,35, +0x0a0de0,1, +0x0a0de8,5, +0x0a0e00,3, +0x0a0e10,2, +0x0a0e1c,6, +0x0a0e38,2, +0x0a0e48,2, +0x0a0e58,2, +0x0a0e64,16, +0x0a0eac,14, +0x0a0ef0,1, +0x0a0efc,35, +0x0a0fe0,1, +0x0a0fe8,5, +0x0a1000,128, +0x0a1208,2, +0x0a1218,2, +0x0a1404,17, +0x0a1484,1, +0x0a14a0,17, +0x0a1504,1, +0x0a1540,17, +0x0a15e0,8, +0x0a1604,3, +0x0a1700,33, +0x0a1800,6, +0x0a1820,10, +0x0a1870,1, +0x0a1c00,2, +0x0a1c28,2, +0x0a1c50,2, +0x0a1c78,2, +0x0a1ca0,7, +0x0a1dac,1, +0x0a1dd8,4, +0x0a1e00,6, +0x0a1e20,6, +0x0a1e40,6, +0x0a1e60,6, +0x0a1e80,3, +0x0a2010,2, +0x0a201c,1, +0x0a2028,2, +0x0a2040,8, +0x0a2064,5, +0x0a20d0,8, +0x0a20f4,22, +0x0a2150,3, +0x0a2160,8, +0x0a2184,3, +0x0a21a0,8, +0x0a2200,4, +0x0a2218,52, +0x0a2300,8, +0x0a2330,3, +0x0a2600,1, +0x0a2800,6, +0x0a2820,6, +0x0a2840,6, +0x0a2860,6, +0x0a2880,3, +0x0a2900,6, +0x0a2920,6, +0x0a2940,3, +0x0a2980,6, +0x0a29a0,6, +0x0a29c0,6, +0x0a29e0,3, +0x0a2a00,6, +0x0a2a20,3, +0x0a2a30,1, +0x0a3120,6, +0x0a3140,6, +0x0a3160,6, +0x0a3180,6, +0x0a31a0,6, +0x0a31c0,6, +0x0a3604,2, +0x0a3700,16, +0x0a3a00,1, +0x0a3b00,8, +0x0a8000,8192, +0x0c1000,1, +0x0c1028,1, +0x0c1050,1, +0x0c1078,1, +0x0c10a0,9, +0x0c11ac,1, +0x0c11d8,4, +0x0c1200,6, +0x0c1220,6, +0x0c1240,3, +0x0c1400,6, +0x0c1420,3, +0x0c1500,13, +0x0c1540,3, +0x0c2000,14, +0x0c2070,3, +0x0c2080,6, +0x0c2100,9, +0x0c2204,1, +0x0c220c,6, +0x0c2240,13, +0x0c2280,16, +0x0c2400,8, +0x0c2424,15, +0x0c2464,15, +0x0c24a4,15, +0x0c24e4,30, +0x0c2580,10, +0x0c25ac,1, +0x0c25b4,5, +0x0c25cc,1, +0x0c25d4,5, +0x0c25ec,1, +0x0c25f4,13, +0x0c2680,4, +0x0c2694,2, +0x0c26a0,5, +0x0c26c0,5, +0x0c26e0,4, +0x0c2800,19, +0x0c2850,10, +0x0c2880,19, +0x0c28d0,10, +0x0c2900,19, +0x0c2950,10, +0x0c2980,19, +0x0c29d0,10, +0x0c2a00,19, +0x0c2a50,10, +0x0c2a80,19, +0x0c2ad0,10, +0x0c2b00,19, +0x0c2b50,10, +0x0c2b80,19, +0x0c2bd0,10, +0x0c2c00,19, +0x0c2c60,6, +0x0c2c84,1, +0x0c2c94,8, +0x0c2cb8,9, +0x0c2ce0,4, +0x0c3000,29, +0x0c3078,4, +0x0c3090,2, +0x0c30a0,7, +0x0c30c0,11, +0x0c3100,14, +0x0c3140,14, +0x0c3180,61, +0x0c3278,4, +0x0c3290,2, +0x0c32a0,7, +0x0c32c0,11, +0x0c3300,14, +0x0c3340,14, +0x0c3380,61, +0x0c3478,4, +0x0c3490,2, +0x0c34a0,7, +0x0c34c0,11, +0x0c3500,14, +0x0c3540,14, +0x0c3580,61, +0x0c3678,4, +0x0c3690,2, +0x0c36a0,7, +0x0c36c0,11, +0x0c3700,14, +0x0c3740,14, +0x0c3780,67, +0x0c3890,1, +0x0c3a00,8, +0x0c3a24,15, +0x0c3a64,30, +0x0c3b00,4, +0x0c3b20,2, +0x0c3c00,6, +0x0c3c40,14, +0x0c3c80,9, +0x0c3d00,9, +0x0c3d2c,1, +0x0c3d40,3, +0x0c3d60,1, +0x0c3d80,3, +0x0c3e00,2, +0x0c3e0c,1, +0x0c3e14,5, +0x0c3e2c,1, +0x0c3e34,5, +0x0c3e4c,1, +0x0c3e54,5, +0x0c3e6c,1, +0x0c3e74,5, +0x0c3e8c,1, +0x0c3e94,5, +0x0c3eac,1, +0x0c3eb4,3, +0x0c8000,25, +0x0c8068,4, +0x0c807c,4, +0x0c80a0,3, +0x0c80b0,2, +0x0c80c8,6, +0x0c8180,6, +0x0ca000,3, +0x0ca010,21, +0x0ca068,14, +0x0ca0a4,2, +0x0ca0b0,2, +0x0ca0c0,14, +0x0ca100,12, +0x0ca140,4, +0x0ca160,1, +0x0ca184,1, +0x0ca194,2, +0x0ca1b8,3, +0x0ca1d0,5, +0x0ca1e8,3, +0x0ca1f8,8, +0x0ca220,6, +0x0ca240,3, +0x0ca280,6, +0x0ca2a0,6, +0x0ca2c0,3, +0x0ca300,6, +0x0ca320,6, +0x0ca340,6, +0x0ca360,6, +0x0ca380,6, +0x0ca3a0,6, +0x0ca3c0,6, +0x0ca3e0,6, +0x0ca400,6, +0x0ca6fc,1, +0x0ca800,72, +0x0cb000,4, +0x0cb044,1, +0x0cb04c,1, +0x0cb100,8, +0x0cb1f0,6, +0x0cb210,3, +0x0cb220,2, +0x0cb230,3, +0x0cb240,2, +0x0cb250,3, +0x0cb260,2, +0x0cb270,3, +0x0cb280,1, +0x0cb400,5, +0x0cb59c,1, +0x0cb5ac,9, +0x0d0000,5, +0x0d0020,4, +0x0d0034,17, +0x0d0080,1, +0x0d00a0,6, +0x0d0100,5, +0x0d0120,4, +0x0d0134,17, +0x0d0180,1, +0x0d01a0,6, +0x0d0200,5, +0x0d0220,4, +0x0d0234,17, +0x0d0280,1, +0x0d02a0,6, +0x0d0300,5, +0x0d0320,4, +0x0d0334,17, +0x0d0380,1, +0x0d03a0,6, +0x0d0400,6, +0x0d0440,6, +0x0d0480,3, +0x0d04c0,3, +0x0d0500,6, +0x0d051c,7, +0x0d0540,1, +0x0d0c00,13, +0x0d0c40,12, +0x0d0c80,13, +0x0d0cc0,12, +0x0d0d00,6, +0x0d0d20,6, +0x0d0e40,11, +0x0d0e80,6, +0x0d0ea0,6, +0x0d1000,2, +0x0d1010,5, +0x0d1040,3, +0x0d1050,3, +0x0d1060,32, +0x0d1100,8, +0x0d1140,8, +0x0d1180,3, +0x0d1190,2, +0x0d119c,9, +0x0d1218,9, +0x0d1240,3, +0x0d1250,6, +0x0d1280,1, +0x0d1288,6, +0x0d12a4,1, +0x0d12c0,1, +0x0d12c8,6, +0x0d12e4,1, +0x0d1400,8, +0x0d1424,2, +0x0d1800,24, +0x0d1864,5, +0x0d1880,8, +0x0d1900,13, +0x0d1980,4, +0x0d19a0,6, +0x0d19c0,6, +0x0d19dc,1, +0x0d1a00,6, +0x0d1a1c,1, +0x0d1a40,1, +0x0d1a60,1, +0x0d1a68,23, +0x0d1ac8,6, +0x0d1b00,17, +0x0d1b48,6, +0x0d1b80,12, +0x0d1c00,6, +0x0d1c20,6, +0x0d1c40,6, +0x0d1c60,3, +0x0d1d00,6, +0x0d1d20,6, +0x0d1d40,3, +0x0d1d80,6, +0x0d1da0,6, +0x0d1dc0,3, +0x0d4000,5, +0x0d4038,1, +0x0d4044,1, +0x0d4050,2, +0x0d4100,6, +0x0d8000,6, +0x0d8020,3, +0x0d8030,8, +0x0d8100,6, +0x0d8120,10, +0x0d8150,8, +0x0d8800,6, +0x0d8820,3, +0x0d8830,4, +0x0d8858,2, +0x0d8864,1, +0x0d8874,3, +0x0d8898,2, +0x0d88a4,1, +0x0d88b4,3, +0x0d9000,6, +0x0d9020,6, +0x0d9040,3, +0x0d9080,14, +0x0d90bc,1, +0x0d90c4,13, +0x0d90fc,5, +0x0d9120,4, +0x0d9140,3, +0x0d9180,3, +0x0d9190,3, +0x0d91a0,1, +0x0d91e0,6, +0x0d9200,20, +0x0d925c,30, +0x0d9300,24, +0x0d9380,2, +0x0d93a0,1, +0x0d93c0,11, +0x0d9404,3, +0x0d9420,11, +0x0d9460,3, +0x0d9480,6, +0x0d9500,6, +0x0d9520,6, +0x0d9540,1, +0x0d9558,2, +0x0d9600,17, +0x0d9800,410, +0x0da000,6, +0x0da020,6, +0x0da040,3, +0x0da080,14, +0x0da0bc,1, +0x0da0c4,13, +0x0da0fc,5, +0x0da120,4, +0x0da140,3, +0x0da180,3, +0x0da190,3, +0x0da1a0,1, +0x0da1e0,6, +0x0da200,20, +0x0da25c,30, +0x0da300,24, +0x0da380,2, +0x0da3a0,1, +0x0da3c0,11, +0x0da404,3, +0x0da420,11, +0x0da460,3, +0x0da480,6, +0x0da500,6, +0x0da520,6, +0x0da540,1, +0x0da558,2, +0x0da600,17, +0x0da800,410, +0x0db800,5, +0x0db818,1, +0x0db854,6, +0x0db880,2, +0x0db8a4,1, +0x0db8ac,2, +0x0dba00,28, +0x0dba7c,13, +0x0dbab4,1, +0x0dbabc,10, +0x0dbb04,1, +0x0dbb0c,5, +0x0dbb24,1, +0x0dbb34,9, +0x0dbb60,6, +0x0dbb80,22, +0x0dbbe0,3, +0x0dbbf0,2, +0x0dbc00,5, +0x0dbc18,1, +0x0dbc54,6, +0x0dbc80,2, +0x0dbca4,1, +0x0dbcac,2, +0x0dbe00,28, +0x0dbe7c,13, +0x0dbeb4,1, +0x0dbebc,10, +0x0dbf04,1, +0x0dbf0c,5, +0x0dbf24,1, +0x0dbf34,9, +0x0dbf60,6, +0x0dbf80,22, +0x0dbfe0,3, +0x0dbff0,2, +0x0dc000,1, +0x0e8000,1, +0x0e8008,2, +0x0e8058,3, +0x0e8120,2, +0x0e8130,2, +0x0e8140,1, +0x0e8184,11, +0x0e81c4,3, +0x0e81dc,3, +0x0e8280,13, +0x0e8400,16, +0x0e8444,7, +0x0e8500,4, +0x0e8804,1, +0x0e8824,7, +0x0e8844,1, +0x0e884c,27, +0x0e88d4,2, +0x0e8c00,1, +0x0e8c08,3, +0x0e8c80,20, +0x0e8d00,3, +0x0e8d20,6, +0x0e8d80,4, +0x0e8da0,6, +0x0e8dbc,7, +0x0e8e00,21, +0x0e8e80,6, +0x0e8ea0,6, +0x0e8ec0,3, +0x0e9000,35, +0x0e9090,2, +0x0e90f0,1, +0x0e90f8,1, +0x0e9100,1, +0x0e9108,5, +0x0e9138,2, +0x0e9144,1, +0x0e9160,13, +0x0e91a0,3, +0x0e9200,2, +0x0e9214,11, +0x0e9244,7, +0x0e92b8,2, +0x0e92c4,7, +0x0e9310,1, +0x0e9340,4, +0x0e9380,7, +0x0e9400,14, +0x0e9440,10, +0x0e947c,1, +0x0e9700,2, +0x0e9720,8, +0x0e9800,3, +0x0e9810,3, +0x0e9820,3, +0x0e9830,3, +0x0e9840,3, +0x0e9850,3, +0x0e9860,3, +0x0e9870,3, +0x0e9880,3, +0x0e9890,3, +0x0e98a0,3, +0x0e98b0,3, +0x0e98c0,3, +0x0e98d0,3, +0x0e98e0,3, +0x0e98f0,3, +0x0e9900,68, +0x0e9c00,36, +0x0e9d00,3, +0x0e9d40,2, +0x0e9d4c,1, +0x0e9d84,1, +0x0e9d90,4, +0x0e9e00,6, +0x0e9e20,6, +0x0e9e40,6, +0x0e9e60,3, +0x0e9e80,6, +0x0e9ea0,3, +0x0e9f80,13, +0x0e9fc0,2, +0x0ea000,1, +0x0ea028,1, +0x0ea050,1, +0x0ea078,1, +0x0ea0a0,3, +0x0ea1ac,1, +0x0ea1d8,4, +0x0ea200,6, +0x0ea220,6, +0x0ea240,3, +0x0ea400,6, +0x0ea420,2, +0x0ea430,2, +0x0ea440,2, +0x0ea450,6, +0x0ea470,2, +0x0ea490,24, +0x0ea520,8, +0x0ea604,1, +0x0ea6f0,72, +0x0f0000,3, +0x0f0014,11, +0x0f0044,15, +0x0f00f0,3, +0x0f0100,1, +0x0f0108,3, +0x0f0118,1, +0x0f0130,4, +0x0f0180,3, +0x0f0190,2, +0x0f01a0,3, +0x0f01c0,2, +0x0f01d0,10, +0x0f0200,61, +0x0f0404,9, +0x0f0440,12, +0x0f0480,5, +0x0f04b8,19, +0x0f05a0,1, +0x0f05c0,8, +0x0f0800,17, +0x0f0850,9, +0x0f0880,9, +0x0f08b0,9, +0x0f08e0,9, +0x0f0920,4, +0x0f093c,5, +0x0f095c,5, +0x0f097c,5, +0x0f099c,5, +0x0f09bc,5, +0x0f09dc,1, +0x0f0a90,2, +0x0f0c00,128, +0x0f0e04,1, +0x0f0e14,9, +0x0f0e3c,1, +0x0f1000,3, +0x0f1010,4, +0x0f1030,2, +0x0f1080,10, +0x0f10c0,1, +0x0f10e0,2, +0x0f10ec,1, +0x0f10f4,3, +0x0f1400,6, +0x0f1420,6, +0x0f1440,6, +0x0f1460,6, +0x0f1480,6, +0x0f14a0,6, +0x0f14c0,6, +0x0f14e0,6, +0x0f1500,6, +0x0f1520,6, +0x0f1540,6, +0x0f1560,6, +0x0f1580,6, +0x0f15a0,6, +0x0f15c0,6, +0x0f15e0,6, +0x0f1600,6, +0x0f1620,3, +0x0f1800,3, +0x0f2000,2, +0x0f200c,3, +0x0f2020,8, +0x0f2060,6, +0x0f2080,2, +0x0f208c,3, +0x0f20a0,8, +0x0f20e0,6, +0x0f2100,2, +0x0f210c,3, +0x0f2120,8, +0x0f2160,6, +0x0f2180,2, +0x0f218c,3, +0x0f21a0,8, +0x0f21e0,6, +0x0f2200,2, +0x0f220c,3, +0x0f2220,8, +0x0f2260,6, +0x0f2280,2, +0x0f228c,3, +0x0f22a0,8, +0x0f22e0,6, +0x0f2300,2, +0x0f230c,3, +0x0f2320,8, +0x0f2360,6, +0x0f2380,2, +0x0f238c,3, +0x0f23a0,8, +0x0f23e0,6, +0x0f2400,2, +0x0f240c,3, +0x0f2420,8, +0x0f2460,6, +0x0f2480,2, +0x0f248c,3, +0x0f24a0,8, +0x0f24e0,6, +0x0f2500,2, +0x0f250c,3, +0x0f2520,8, +0x0f2560,6, +0x0f2580,2, +0x0f258c,3, +0x0f25a0,8, +0x0f25e0,6, +0x0f2600,2, +0x0f260c,3, +0x0f2620,8, +0x0f2660,6, +0x0f2680,2, +0x0f268c,3, +0x0f26a0,8, +0x0f26e0,6, +0x0f2700,2, +0x0f270c,3, +0x0f2720,8, +0x0f2760,6, +0x0f2780,2, +0x0f278c,3, +0x0f27a0,8, +0x0f27e0,6, +0x0f2800,2, +0x0f280c,3, +0x0f2820,8, +0x0f2860,6, +0x0f2880,2, +0x0f288c,3, +0x0f28a0,8, +0x0f28e0,6, +0x0f2900,2, +0x0f290c,3, +0x0f2920,8, +0x0f2960,6, +0x0f2980,2, +0x0f298c,3, +0x0f29a0,8, +0x0f29e0,6, +0x0f4000,7, +0x0f4020,4, +0x0f4204,1, +0x0f4280,35, +0x0f4310,4, +0x0f4404,1, +0x0f4480,34, +0x0f4510,10, +0x0f453c,3, +0x0f4800,7, +0x0f4820,4, +0x0f4a04,1, +0x0f4a80,35, +0x0f4b10,4, +0x0f4c04,1, +0x0f4c80,34, +0x0f4d10,10, +0x0f4d3c,3, +0x0f5000,7, +0x0f5020,4, +0x0f5204,1, +0x0f5280,35, +0x0f5310,4, +0x0f5404,1, +0x0f5480,34, +0x0f5510,10, +0x0f553c,3, +0x0f5800,7, +0x0f5820,4, +0x0f5a04,1, +0x0f5a80,35, +0x0f5b10,4, +0x0f5c04,1, +0x0f5c80,34, +0x0f5d10,10, +0x0f5d3c,3, +0x0f6000,7, +0x0f6020,4, +0x0f6204,1, +0x0f6280,35, +0x0f6310,4, +0x0f6404,1, +0x0f6480,34, +0x0f6510,10, +0x0f653c,3, +0x0f6800,7, +0x0f6820,4, +0x0f6a04,1, +0x0f6a80,35, +0x0f6b10,4, +0x0f6c04,1, +0x0f6c80,34, +0x0f6d10,10, +0x0f6d3c,3, +0x0f8000,9, +0x0f8100,6, +0x0f8120,6, +0x0f8140,3, +0x0f8180,10, +0x0f81c0,3, +0x0f81d0,2, +0x0f8200,9, +0x0f8300,6, +0x0f8320,6, +0x0f8340,3, +0x0f8380,10, +0x0f83c0,3, +0x0f83d0,2, +0x0f8400,9, +0x0f8500,6, +0x0f8520,6, +0x0f8540,3, +0x0f8580,10, +0x0f85c0,3, +0x0f85d0,2, +0x0f8600,9, +0x0f8700,6, +0x0f8720,6, +0x0f8740,3, +0x0f8780,10, +0x0f87c0,3, +0x0f87d0,2, +0x0f8800,9, +0x0f8900,6, +0x0f8920,6, +0x0f8940,3, +0x0f8980,10, +0x0f89c0,3, +0x0f89d0,2, +0x0f8a00,9, +0x0f8b00,6, +0x0f8b20,6, +0x0f8b40,3, +0x0f8b80,10, +0x0f8bc0,3, +0x0f8bd0,2, +0x0f8c00,9, +0x0f8d00,6, +0x0f8d20,6, +0x0f8d40,3, +0x0f8d80,10, +0x0f8dc0,3, +0x0f8dd0,2, +0x0f8e00,9, +0x0f8f00,6, +0x0f8f20,6, +0x0f8f40,3, +0x0f8f80,10, +0x0f8fc0,3, +0x0f8fd0,2, +0x0f9000,9, +0x0f9100,6, +0x0f9120,6, +0x0f9140,3, +0x0f9180,10, +0x0f91c0,3, +0x0f91d0,2, +0x0f9200,9, +0x0f9300,6, +0x0f9320,6, +0x0f9340,3, +0x0f9380,10, +0x0f93c0,3, +0x0f93d0,2, +0x0f9400,9, +0x0f9500,6, +0x0f9520,6, +0x0f9540,3, +0x0f9580,10, +0x0f95c0,3, +0x0f95d0,2, +0x0f9600,9, +0x0f9700,6, +0x0f9720,6, +0x0f9740,3, +0x0f9780,10, +0x0f97c0,3, +0x0f97d0,2, +0x0f9800,9, +0x0f9900,6, +0x0f9920,6, +0x0f9940,3, +0x0f9980,10, +0x0f99c0,3, +0x0f99d0,2, +0x0f9a00,9, +0x0f9b00,6, +0x0f9b20,6, +0x0f9b40,3, +0x0f9b80,10, +0x0f9bc0,3, +0x0f9bd0,2, +0x0f9c00,9, +0x0f9d00,6, +0x0f9d20,6, +0x0f9d40,3, +0x0f9d80,10, +0x0f9dc0,3, +0x0f9dd0,2, +0x0f9e00,9, +0x0f9f00,6, +0x0f9f20,6, +0x0f9f40,3, +0x0f9f80,10, +0x0f9fc0,3, +0x0f9fd0,2, +0x0fa000,9, +0x0fa100,6, +0x0fa120,6, +0x0fa140,3, +0x0fa180,10, +0x0fa1c0,3, +0x0fa1d0,2, +0x0fa200,9, +0x0fa300,6, +0x0fa320,6, +0x0fa340,3, +0x0fa380,10, +0x0fa3c0,3, +0x0fa3d0,2, +0x0fa400,9, +0x0fa480,10, +0x0fa4c0,1, +0x0fa4e0,2, +0x0fa4ec,1, +0x0fa4f4,9, +0x0fa520,6, +0x0fa540,3, +0x0fa580,6, +0x0fa5c0,3, +0x0fa5d0,6, +0x0fa600,9, +0x0fa680,10, +0x0fa6c0,1, +0x0fa6e0,2, +0x0fa6ec,1, +0x0fa6f4,9, +0x0fa720,6, +0x0fa740,3, +0x0fa780,6, +0x0fa7c0,3, +0x0fa7d0,6, +0x0fa800,9, +0x0fa880,10, +0x0fa8c0,1, +0x0fa8e0,2, +0x0fa8ec,1, +0x0fa8f4,9, +0x0fa920,6, +0x0fa940,3, +0x0fa980,8, +0x0fa9c0,3, +0x0fa9d0,2, +0x0faa00,9, +0x0faa80,10, +0x0faac0,1, +0x0faae0,2, +0x0faaec,1, +0x0faaf4,9, +0x0fab20,6, +0x0fab40,3, +0x0fab80,8, +0x0fabc0,3, +0x0fabd0,2, +0x0fac00,9, +0x0fac80,10, +0x0facc0,1, +0x0face0,2, +0x0facec,1, +0x0facf4,9, +0x0fad20,6, +0x0fad40,3, +0x0fad80,10, +0x0fadc0,3, +0x0fadd0,2, +0x0fade8,2, +0x0fae00,9, +0x0fae80,10, +0x0faec0,1, +0x0faee0,2, +0x0faeec,1, +0x0faef4,9, +0x0faf20,6, +0x0faf40,3, +0x0faf80,12, +0x0fafc0,3, +0x0fafd0,2, +0x0fb000,9, +0x0fb100,6, +0x0fb120,6, +0x0fb140,3, +0x0fb180,4, +0x0fb1a8,2, +0x0fb1c0,3, +0x0fb1d0,2, +0x100000,6, +0x100100,30, +0x100180,5, +0x100200,6, +0x100300,30, +0x100380,5, +0x100400,11, +0x100430,29, +0x100500,2, +0x10050c,4, +0x100520,5, +0x10053c,1, +0x100544,1, +0x10054c,5, +0x100564,3, +0x100600,4, +0x100620,6, +0x100640,6, +0x100660,6, +0x100680,6, +0x1006a0,4, +0x100800,6, +0x100820,6, +0x100840,6, +0x100860,3, +0x100884,14, +0x1008c0,16, +0x100c00,20, +0x100c58,4, +0x100c70,2, +0x100c7c,7, +0x100d00,4, +0x100d30,2, +0x100d3c,12, +0x100d70,2, +0x100d80,3, +0x100e00,32, +0x101000,6, +0x101100,30, +0x101180,5, +0x101200,6, +0x101300,30, +0x101380,5, +0x101400,11, +0x101430,29, +0x101500,2, +0x10150c,4, +0x101520,5, +0x10153c,1, +0x101544,1, +0x10154c,5, +0x101564,3, +0x101600,4, +0x101620,6, +0x101640,6, +0x101660,6, +0x101680,6, +0x1016a0,4, +0x101800,6, +0x101820,6, +0x101840,6, +0x101860,3, +0x101884,14, +0x1018c0,16, +0x101c00,20, +0x101c58,4, +0x101c70,2, +0x101c7c,7, +0x101d00,4, +0x101d30,2, +0x101d3c,12, +0x101d70,2, +0x101d80,3, +0x101e00,32, +0x102000,6, +0x102100,30, +0x102180,5, +0x102200,6, +0x102300,30, +0x102380,5, +0x102400,11, +0x102430,29, +0x102500,2, +0x10250c,4, +0x102520,5, +0x10253c,1, +0x102544,1, +0x10254c,5, +0x102564,3, +0x102600,4, +0x102620,6, +0x102640,6, +0x102660,6, +0x102680,6, +0x1026a0,4, +0x102800,6, +0x102820,6, +0x102840,6, +0x102860,3, +0x102884,14, +0x1028c0,16, +0x102c00,20, +0x102c58,4, +0x102c70,2, +0x102c7c,7, +0x102d00,4, +0x102d30,2, +0x102d3c,12, +0x102d70,2, +0x102d80,3, +0x102e00,32, +0x103000,6, +0x103100,30, +0x103180,5, +0x103200,6, +0x103300,30, +0x103380,5, +0x103400,11, +0x103430,29, +0x103500,2, +0x10350c,4, +0x103520,5, +0x10353c,1, +0x103544,1, +0x10354c,5, +0x103564,3, +0x103600,4, +0x103620,6, +0x103640,6, +0x103660,6, +0x103680,6, +0x1036a0,4, +0x103800,6, +0x103820,6, +0x103840,6, +0x103860,3, +0x103884,14, +0x1038c0,16, +0x103c00,20, +0x103c58,4, +0x103c70,2, +0x103c7c,7, +0x103d00,4, +0x103d30,2, +0x103d3c,12, +0x103d70,2, +0x103d80,3, +0x103e00,32, +0x104000,6, +0x104100,30, +0x104180,5, +0x104200,6, +0x104300,30, +0x104380,5, +0x104400,11, +0x104430,29, +0x104500,2, +0x10450c,4, +0x104520,5, +0x10453c,1, +0x104544,1, +0x10454c,5, +0x104564,3, +0x104600,4, +0x104620,6, +0x104640,6, +0x104660,6, +0x104680,6, +0x1046a0,4, +0x104800,6, +0x104820,6, +0x104840,6, +0x104860,3, +0x104884,14, +0x1048c0,16, +0x104c00,20, +0x104c58,4, +0x104c70,2, +0x104c7c,7, +0x104d00,4, +0x104d30,2, +0x104d3c,12, +0x104d70,2, +0x104d80,3, +0x104e00,32, +0x105000,6, +0x105100,30, +0x105180,5, +0x105200,6, +0x105300,30, +0x105380,5, +0x105400,11, +0x105430,29, +0x105500,2, +0x10550c,4, +0x105520,5, +0x10553c,1, +0x105544,1, +0x10554c,5, +0x105564,3, +0x105600,4, +0x105620,6, +0x105640,6, +0x105660,6, +0x105680,6, +0x1056a0,4, +0x105800,6, +0x105820,6, +0x105840,6, +0x105860,3, +0x105884,14, +0x1058c0,16, +0x105c00,20, +0x105c58,4, +0x105c70,2, +0x105c7c,7, +0x105d00,4, +0x105d30,2, +0x105d3c,12, +0x105d70,2, +0x105d80,3, +0x105e00,32, +0x106000,6, +0x106100,30, +0x106180,5, +0x106200,6, +0x106300,30, +0x106380,5, +0x106400,11, +0x106430,29, +0x106500,2, +0x10650c,4, +0x106520,5, +0x10653c,1, +0x106544,1, +0x10654c,5, +0x106564,3, +0x106600,4, +0x106620,6, +0x106640,6, +0x106660,6, +0x106680,6, +0x1066a0,4, +0x106800,6, +0x106820,6, +0x106840,6, +0x106860,3, +0x106884,14, +0x1068c0,16, +0x106c00,20, +0x106c58,4, +0x106c70,2, +0x106c7c,7, +0x106d00,4, +0x106d30,2, +0x106d3c,12, +0x106d70,2, +0x106d80,3, +0x106e00,32, +0x107000,6, +0x107100,30, +0x107180,5, +0x107200,6, +0x107300,30, +0x107380,5, +0x107400,11, +0x107430,29, +0x107500,2, +0x10750c,4, +0x107520,5, +0x10753c,1, +0x107544,1, +0x10754c,5, +0x107564,3, +0x107600,4, +0x107620,6, +0x107640,6, +0x107660,6, +0x107680,6, +0x1076a0,4, +0x107800,6, +0x107820,6, +0x107840,6, +0x107860,3, +0x107884,14, +0x1078c0,16, +0x107c00,20, +0x107c58,4, +0x107c70,2, +0x107c7c,7, +0x107d00,4, +0x107d30,2, +0x107d3c,12, +0x107d70,2, +0x107d80,3, +0x107e00,32, +0x108000,6, +0x108100,30, +0x108180,5, +0x108200,6, +0x108300,30, +0x108380,5, +0x108400,11, +0x108430,29, +0x108500,2, +0x10850c,4, +0x108520,5, +0x10853c,1, +0x108544,1, +0x10854c,5, +0x108564,3, +0x108600,4, +0x108620,6, +0x108640,6, +0x108660,6, +0x108680,6, +0x1086a0,4, +0x108800,6, +0x108820,6, +0x108840,6, +0x108860,3, +0x108884,14, +0x1088c0,16, +0x108c00,20, +0x108c58,4, +0x108c70,2, +0x108c7c,7, +0x108d00,4, +0x108d30,2, +0x108d3c,12, +0x108d70,2, +0x108d80,3, +0x108e00,32, +0x109000,6, +0x109100,30, +0x109180,5, +0x109200,6, +0x109300,30, +0x109380,5, +0x109400,11, +0x109430,29, +0x109500,2, +0x10950c,4, +0x109520,5, +0x10953c,1, +0x109544,1, +0x10954c,5, +0x109564,3, +0x109600,4, +0x109620,6, +0x109640,6, +0x109660,6, +0x109680,6, +0x1096a0,4, +0x109800,6, +0x109820,6, +0x109840,6, +0x109860,3, +0x109884,14, +0x1098c0,16, +0x109c00,20, +0x109c58,4, +0x109c70,2, +0x109c7c,7, +0x109d00,4, +0x109d30,2, +0x109d3c,12, +0x109d70,2, +0x109d80,3, +0x109e00,32, +0x10a000,1, +0x113ffc,6, +0x114018,3, +0x114028,3, +0x114038,3, +0x114048,3, +0x114058,3, +0x114068,3, +0x114078,3, +0x114088,12, +0x1140c8,13, +0x114100,29, +0x114178,11, +0x1141c0,3, +0x1141d0,3, +0x1141e0,6, +0x114400,5, +0x114428,5, +0x114450,5, +0x114478,5, +0x1144a0,4, +0x1145ac,1, +0x1145d8,4, +0x114600,6, +0x114620,6, +0x114640,6, +0x114660,6, +0x114680,6, +0x1146a0,6, +0x1146c0,6, +0x1146e0,6, +0x114700,6, +0x114720,6, +0x114740,3, +0x114900,7, +0x114920,36, +0x114c00,1, +0x114c08,1, +0x114c10,5, +0x114c38,1, +0x114c60,7, +0x115000,1, +0x115008,11, +0x115038,10, +0x115068,3, +0x115104,4, +0x115128,3, +0x115204,5, +0x115220,10, +0x115250,3, +0x115280,6, +0x1152a0,6, +0x1152c0,6, +0x1152e0,3, +0x115300,7, +0x140000,6, +0x140100,30, +0x140180,5, +0x140200,6, +0x140300,30, +0x140380,5, +0x140400,11, +0x140430,29, +0x140500,2, +0x14050c,4, +0x140520,5, +0x14053c,1, +0x140544,1, +0x14054c,5, +0x140564,3, +0x140600,4, +0x140620,6, +0x140640,6, +0x140660,6, +0x140680,6, +0x1406a0,4, +0x140800,6, +0x140820,6, +0x140840,6, +0x140860,3, +0x140884,14, +0x1408c0,16, +0x140c00,20, +0x140c58,4, +0x140c70,2, +0x140c7c,7, +0x140d00,4, +0x140d30,2, +0x140d3c,12, +0x140d70,2, +0x140d80,3, +0x140e00,32, +0x141000,6, +0x141100,30, +0x141180,5, +0x141200,6, +0x141300,30, +0x141380,5, +0x141400,11, +0x141430,29, +0x141500,2, +0x14150c,4, +0x141520,5, +0x14153c,1, +0x141544,1, +0x14154c,5, +0x141564,3, +0x141600,4, +0x141620,6, +0x141640,6, +0x141660,6, +0x141680,6, +0x1416a0,4, +0x141800,6, +0x141820,6, +0x141840,6, +0x141860,3, +0x141884,14, +0x1418c0,16, +0x141c00,20, +0x141c58,4, +0x141c70,2, +0x141c7c,7, +0x141d00,4, +0x141d30,2, +0x141d3c,12, +0x141d70,2, +0x141d80,3, +0x141e00,32, +0x142000,6, +0x142100,30, +0x142180,5, +0x142200,6, +0x142300,30, +0x142380,5, +0x142400,11, +0x142430,29, +0x142500,2, +0x14250c,4, +0x142520,5, +0x14253c,1, +0x142544,1, +0x14254c,5, +0x142564,3, +0x142600,4, +0x142620,6, +0x142640,6, +0x142660,6, +0x142680,6, +0x1426a0,4, +0x142800,6, +0x142820,6, +0x142840,6, +0x142860,3, +0x142884,14, +0x1428c0,16, +0x142c00,20, +0x142c58,4, +0x142c70,2, +0x142c7c,7, +0x142d00,4, +0x142d30,2, +0x142d3c,12, +0x142d70,2, +0x142d80,3, +0x142e00,32, +0x143000,6, +0x143100,30, +0x143180,5, +0x143200,6, +0x143300,30, +0x143380,5, +0x143400,11, +0x143430,29, +0x143500,2, +0x14350c,4, +0x143520,5, +0x14353c,1, +0x143544,1, +0x14354c,5, +0x143564,3, +0x143600,4, +0x143620,6, +0x143640,6, +0x143660,6, +0x143680,6, +0x1436a0,4, +0x143800,6, +0x143820,6, +0x143840,6, +0x143860,3, +0x143884,14, +0x1438c0,16, +0x143c00,20, +0x143c58,4, +0x143c70,2, +0x143c7c,7, +0x143d00,4, +0x143d30,2, +0x143d3c,12, +0x143d70,2, +0x143d80,3, +0x143e00,32, +0x144000,6, +0x144100,30, +0x144180,5, +0x144200,6, +0x144300,30, +0x144380,5, +0x144400,11, +0x144430,29, +0x144500,2, +0x14450c,4, +0x144520,5, +0x14453c,1, +0x144544,1, +0x14454c,5, +0x144564,3, +0x144600,4, +0x144620,6, +0x144640,6, +0x144660,6, +0x144680,6, +0x1446a0,4, +0x144800,6, +0x144820,6, +0x144840,6, +0x144860,3, +0x144884,14, +0x1448c0,16, +0x144c00,20, +0x144c58,4, +0x144c70,2, +0x144c7c,7, +0x144d00,4, +0x144d30,2, +0x144d3c,12, +0x144d70,2, +0x144d80,3, +0x144e00,32, +0x145000,6, +0x145100,30, +0x145180,5, +0x145200,6, +0x145300,30, +0x145380,5, +0x145400,11, +0x145430,29, +0x145500,2, +0x14550c,4, +0x145520,5, +0x14553c,1, +0x145544,1, +0x14554c,5, +0x145564,3, +0x145600,4, +0x145620,6, +0x145640,6, +0x145660,6, +0x145680,6, +0x1456a0,4, +0x145800,6, +0x145820,6, +0x145840,6, +0x145860,3, +0x145884,14, +0x1458c0,16, +0x145c00,20, +0x145c58,4, +0x145c70,2, +0x145c7c,7, +0x145d00,4, +0x145d30,2, +0x145d3c,12, +0x145d70,2, +0x145d80,3, +0x145e00,32, +0x146000,6, +0x146100,30, +0x146180,5, +0x146200,6, +0x146300,30, +0x146380,5, +0x146400,11, +0x146430,29, +0x146500,2, +0x14650c,4, +0x146520,5, +0x14653c,1, +0x146544,1, +0x14654c,5, +0x146564,3, +0x146600,4, +0x146620,6, +0x146640,6, +0x146660,6, +0x146680,6, +0x1466a0,4, +0x146800,6, +0x146820,6, +0x146840,6, +0x146860,3, +0x146884,14, +0x1468c0,16, +0x146c00,20, +0x146c58,4, +0x146c70,2, +0x146c7c,7, +0x146d00,4, +0x146d30,2, +0x146d3c,12, +0x146d70,2, +0x146d80,3, +0x146e00,32, +0x147000,6, +0x147100,30, +0x147180,5, +0x147200,6, +0x147300,30, +0x147380,5, +0x147400,11, +0x147430,29, +0x147500,2, +0x14750c,4, +0x147520,5, +0x14753c,1, +0x147544,1, +0x14754c,5, +0x147564,3, +0x147600,4, +0x147620,6, +0x147640,6, +0x147660,6, +0x147680,6, +0x1476a0,4, +0x147800,6, +0x147820,6, +0x147840,6, +0x147860,3, +0x147884,14, +0x1478c0,16, +0x147c00,20, +0x147c58,4, +0x147c70,2, +0x147c7c,7, +0x147d00,4, +0x147d30,2, +0x147d3c,12, +0x147d70,2, +0x147d80,3, +0x147e00,32, +0x148000,6, +0x148100,30, +0x148180,5, +0x148200,6, +0x148300,30, +0x148380,5, +0x148400,11, +0x148430,29, +0x148500,2, +0x14850c,4, +0x148520,5, +0x14853c,1, +0x148544,1, +0x14854c,5, +0x148564,3, +0x148600,4, +0x148620,6, +0x148640,6, +0x148660,6, +0x148680,6, +0x1486a0,4, +0x148800,6, +0x148820,6, +0x148840,6, +0x148860,3, +0x148884,14, +0x1488c0,16, +0x148c00,20, +0x148c58,4, +0x148c70,2, +0x148c7c,7, +0x148d00,4, +0x148d30,2, +0x148d3c,12, +0x148d70,2, +0x148d80,3, +0x148e00,32, +0x149000,6, +0x149100,30, +0x149180,5, +0x149200,6, +0x149300,30, +0x149380,5, +0x149400,11, +0x149430,29, +0x149500,2, +0x14950c,4, +0x149520,5, +0x14953c,1, +0x149544,1, +0x14954c,5, +0x149564,3, +0x149600,4, +0x149620,6, +0x149640,6, +0x149660,6, +0x149680,6, +0x1496a0,4, +0x149800,6, +0x149820,6, +0x149840,6, +0x149860,3, +0x149884,14, +0x1498c0,16, +0x149c00,20, +0x149c58,4, +0x149c70,2, +0x149c7c,7, +0x149d00,4, +0x149d30,2, +0x149d3c,12, +0x149d70,2, +0x149d80,3, +0x149e00,32, +0x14a000,1, +0x153ffc,6, +0x154018,3, +0x154028,3, +0x154038,3, +0x154048,3, +0x154058,3, +0x154068,3, +0x154078,3, +0x154088,12, +0x1540c8,13, +0x154100,29, +0x154178,11, +0x1541c0,3, +0x1541d0,3, +0x1541e0,6, +0x154400,5, +0x154428,5, +0x154450,5, +0x154478,5, +0x1544a0,4, +0x1545ac,1, +0x1545d8,4, +0x154600,6, +0x154620,6, +0x154640,6, +0x154660,6, +0x154680,6, +0x1546a0,6, +0x1546c0,6, +0x1546e0,6, +0x154700,6, +0x154720,6, +0x154740,3, +0x154900,7, +0x154920,36, +0x154c00,1, +0x154c08,1, +0x154c10,5, +0x154c38,1, +0x154c60,7, +0x155000,1, +0x155008,11, +0x155038,10, +0x155068,3, +0x155104,4, +0x155128,3, +0x155204,5, +0x155220,10, +0x155250,3, +0x155280,6, +0x1552a0,6, +0x1552c0,6, +0x1552e0,3, +0x155300,7, +0x180000,6, +0x180020,6, +0x180040,6, +0x180060,6, +0x180080,6, +0x1800a0,6, +0x1800c0,3, +0x180100,1, +0x180110,1, +0x188000,11, +0x188040,61, +0x188140,2, +0x188190,67, +0x1882a0,3, +0x1882b0,2, +0x1882cc,24, +0x188330,2, +0x188604,1, +0x188630,40, +0x188764,1, +0x18876c,1, +0x188800,1, +0x189004,1, +0x18900c,13, +0x189044,1, +0x18904c,3, +0x189084,1, +0x189090,4, +0x1890a4,1, +0x1890ac,1, +0x1890b4,1, +0x1890bc,1, +0x189404,1, +0x189474,35, +0x189504,1, +0x18950c,3, +0x189604,16, +0x189804,1, +0x18982c,23, +0x189904,27, +0x189980,12, +0x1899c4,1, +0x1899cc,2, +0x189c00,2, +0x189ffc,1, +0x18a004,1, +0x18a07c,33, +0x18a104,1, +0x18a120,11, +0x18a184,3, +0x18a194,31, +0x18a8e0,1, +0x18b004,1, +0x18b020,8, +0x18b044,1, +0x18b060,10, +0x18b104,1, +0x18b178,34, +0x18b204,1, +0x18b218,12, +0x18b280,2, +0x18b304,1, +0x18b30c,1, +0x18b314,1, +0x18b31c,1, +0x18b324,1, +0x18b32c,2, +0x18b340,2, +0x18b400,2, +0x18b808,1, +0x18c000,298, +0x18c804,6, +0x18c8e0,1, +0x18d000,1, +0x18d028,1, +0x18d050,1, +0x18d078,1, +0x18d0a0,14, +0x18d1ac,1, +0x18d1d8,4, +0x18d200,6, +0x18d220,6, +0x18d240,3, +0x18d400,2, +0x18d500,6, +0x18d520,6, +0x18d540,6, +0x18d560,6, +0x18d580,6, +0x18d5a0,6, +0x18d5c0,3, +0x18d600,13, +0x18d640,1, +0x18d700,1, +0x200000,5, +0x200020,4, +0x200034,17, +0x200080,1, +0x2000a0,6, +0x200100,5, +0x200120,4, +0x200134,17, +0x200180,1, +0x2001a0,6, +0x200200,5, +0x200220,4, +0x200234,17, +0x200280,1, +0x2002a0,6, +0x200300,5, +0x200320,4, +0x200334,17, +0x200380,1, +0x2003a0,6, +0x200500,6, +0x20051c,7, +0x200540,1, +0x200c00,13, +0x200c40,12, +0x200c80,13, +0x200cc0,12, +0x200d00,6, +0x200d20,6, +0x200d80,14, +0x200dc0,2, +0x200e40,11, +0x200e80,6, +0x200ea0,6, +0x201000,2, +0x201010,5, +0x201060,32, +0x201100,8, +0x201180,3, +0x201190,2, +0x20119c,5, +0x201218,9, +0x201240,3, +0x201250,6, +0x201280,1, +0x201288,6, +0x2012a4,1, +0x201400,8, +0x201424,2, +0x201500,5, +0x201520,4, +0x201540,5, +0x201560,4, +0x201800,24, +0x201864,5, +0x201880,8, +0x201900,13, +0x201980,4, +0x2019a0,6, +0x201a40,1, +0x201a60,1, +0x201a68,23, +0x201ac8,6, +0x201b00,17, +0x201b48,6, +0x201b80,12, +0x201c00,6, +0x201c20,6, +0x201c40,6, +0x201c60,3, +0x201d00,6, +0x201d20,6, +0x201d40,3, +0x202000,5, +0x202020,4, +0x202034,17, +0x202080,1, +0x2020a0,6, +0x202100,5, +0x202120,4, +0x202134,17, +0x202180,1, +0x2021a0,6, +0x202200,5, +0x202220,4, +0x202234,17, +0x202280,1, +0x2022a0,6, +0x202300,5, +0x202320,4, +0x202334,17, +0x202380,1, +0x2023a0,6, +0x202500,6, +0x20251c,7, +0x202540,1, +0x202c00,13, +0x202c40,12, +0x202c80,13, +0x202cc0,12, +0x202d00,6, +0x202d20,6, +0x202d80,14, +0x202dc0,2, +0x202e40,11, +0x202e80,6, +0x202ea0,6, +0x203000,2, +0x203010,5, +0x203060,32, +0x203100,8, +0x203180,3, +0x203190,2, +0x20319c,5, +0x203218,9, +0x203240,3, +0x203250,6, +0x203280,1, +0x203288,6, +0x2032a4,1, +0x203400,8, +0x203424,2, +0x203500,5, +0x203520,4, +0x203540,5, +0x203560,4, +0x203800,24, +0x203864,5, +0x203880,8, +0x203900,13, +0x203980,4, +0x2039a0,6, +0x203a40,1, +0x203a60,1, +0x203a68,23, +0x203ac8,6, +0x203b00,17, +0x203b48,6, +0x203b80,12, +0x203c00,6, +0x203c20,6, +0x203c40,6, +0x203c60,3, +0x203d00,6, +0x203d20,6, +0x203d40,3, +0x204000,29, +0x204078,4, +0x204090,2, +0x2040a0,7, +0x2040c0,11, +0x204100,14, +0x204140,14, +0x204180,61, +0x204278,4, +0x204290,2, +0x2042a0,7, +0x2042c0,11, +0x204300,14, +0x204340,14, +0x204380,61, +0x204478,4, +0x204490,2, +0x2044a0,7, +0x2044c0,11, +0x204500,14, +0x204540,14, +0x204580,61, +0x204678,4, +0x204690,2, +0x2046a0,7, +0x2046c0,11, +0x204700,14, +0x204740,14, +0x204780,67, +0x204890,1, +0x204a00,8, +0x204a24,15, +0x204a64,30, +0x204b00,4, +0x204b20,2, +0x204c00,6, +0x204c40,14, +0x204c80,9, +0x204d00,9, +0x204d2c,1, +0x204d40,3, +0x204d60,1, +0x204d80,3, +0x204e00,2, +0x204e0c,1, +0x204e14,5, +0x204e2c,1, +0x204e34,5, +0x204e4c,1, +0x204e54,5, +0x204e6c,1, +0x204e74,5, +0x204e8c,1, +0x204e94,5, +0x204eac,1, +0x204eb4,3, +0x205000,29, +0x205078,4, +0x205090,2, +0x2050a0,7, +0x2050c0,11, +0x205100,14, +0x205140,14, +0x205180,61, +0x205278,4, +0x205290,2, +0x2052a0,7, +0x2052c0,11, +0x205300,14, +0x205340,14, +0x205380,61, +0x205478,4, +0x205490,2, +0x2054a0,7, +0x2054c0,11, +0x205500,14, +0x205540,14, +0x205580,61, +0x205678,4, +0x205690,2, +0x2056a0,7, +0x2056c0,11, +0x205700,14, +0x205740,14, +0x205780,67, +0x205890,1, +0x205a00,8, +0x205a24,15, +0x205a64,30, +0x205b00,4, +0x205b20,2, +0x205c00,6, +0x205c40,14, +0x205c80,9, +0x205d00,9, +0x205d2c,1, +0x205d40,3, +0x205d60,1, +0x205d80,3, +0x205e00,2, +0x205e0c,1, +0x205e14,5, +0x205e2c,1, +0x205e34,5, +0x205e4c,1, +0x205e54,5, +0x205e6c,1, +0x205e74,5, +0x205e8c,1, +0x205e94,5, +0x205eac,1, +0x205eb4,3, +0x206000,14, +0x206070,3, +0x206080,6, +0x206100,9, +0x206204,1, +0x20620c,6, +0x206240,13, +0x206280,16, +0x206800,19, +0x206850,10, +0x206880,19, +0x2068d0,10, +0x206900,19, +0x206950,10, +0x206980,19, +0x2069d0,10, +0x206a00,19, +0x206a50,10, +0x206a80,19, +0x206ad0,10, +0x206b00,19, +0x206b50,10, +0x206b80,19, +0x206bd0,10, +0x206c00,19, +0x206c60,6, +0x206c84,1, +0x206c94,8, +0x206cb8,9, +0x206ce0,4, +0x207000,6, +0x207020,3, +0x207040,7, +0x207060,6, +0x207100,5, +0x207138,1, +0x207144,1, +0x207150,2, +0x208000,6, +0x208020,3, +0x208030,9, +0x208100,6, +0x208120,10, +0x208150,8, +0x208400,1, +0x208428,1, +0x208450,1, +0x208478,1, +0x2084a0,8, +0x2085ac,1, +0x2085d8,4, +0x208600,6, +0x208620,6, +0x208640,3, +0x208800,6, +0x208820,3, +0x208830,4, +0x208858,2, +0x208864,1, +0x208874,3, +0x208898,2, +0x2088a4,1, +0x2088b4,3, +0x209000,6, +0x209020,6, +0x209040,3, +0x209080,14, +0x2090bc,1, +0x2090c4,13, +0x2090fc,1, +0x209200,20, +0x20925c,30, +0x209300,24, +0x209380,2, +0x2093a0,1, +0x2093c0,11, +0x209404,3, +0x209420,11, +0x209460,3, +0x209480,6, +0x209500,6, +0x209520,6, +0x209540,1, +0x209558,2, +0x209600,17, +0x209800,410, +0x20a000,6, +0x20a020,6, +0x20a040,3, +0x20a080,14, +0x20a0bc,1, +0x20a0c4,13, +0x20a0fc,1, +0x20a200,20, +0x20a25c,30, +0x20a300,24, +0x20a380,2, +0x20a3a0,1, +0x20a3c0,11, +0x20a404,3, +0x20a420,11, +0x20a460,3, +0x20a480,6, +0x20a500,6, +0x20a520,6, +0x20a540,1, +0x20a558,2, +0x20a600,17, +0x20a800,410, +0x20b000,4, +0x20b020,25, +0x20b088,8, +0x20b100,4, +0x20b120,25, +0x20b188,8, +0x20b200,34, +0x20b300,37, +0x20b400,16, +0x20b464,1, +0x20b474,3, +0x20b500,6, +0x20b520,2, +0x20b530,9, +0x20b570,10, +0x20b5a0,2, +0x20b5b0,9, +0x20b5f0,4, +0x20b620,7, +0x20b640,16, +0x20b700,6, +0x20b720,6, +0x20b740,6, +0x20b760,6, +0x20b780,3, +0x20b800,5, +0x20b818,1, +0x20b854,6, +0x20b880,2, +0x20b8a4,1, +0x20b8ac,2, +0x20ba00,28, +0x20ba7c,13, +0x20bab4,1, +0x20babc,10, +0x20bb04,1, +0x20bb0c,5, +0x20bb24,1, +0x20bb34,9, +0x20bb60,6, +0x20bb80,22, +0x20bbe0,3, +0x20bbf0,2, +0x20bc00,5, +0x20bc18,1, +0x20bc54,6, +0x20bc80,2, +0x20bca4,1, +0x20bcac,2, +0x20be00,28, +0x20be7c,13, +0x20beb4,1, +0x20bebc,10, +0x20bf04,1, +0x20bf0c,5, +0x20bf24,1, +0x20bf34,9, +0x20bf60,6, +0x20bf80,22, +0x20bfe0,3, +0x20bff0,2, +0x20c008,2, +0x20c014,11, +0x20c044,1, +0x20c04c,3, +0x20c05c,1, +0x20c064,1, +0x20c07c,1, +0x20c500,2, +0x20c518,1, +0x20c520,3, +0x20c540,6, +0x20c580,10, +0x20c808,2, +0x20c814,11, +0x20c844,1, +0x20c84c,3, +0x20c85c,1, +0x20c864,1, +0x20c87c,1, +0x20cd00,2, +0x20cd18,1, +0x20cd20,3, +0x20cd40,6, +0x20cd80,10, +0x20d800,2, +0x20d828,2, +0x20d850,2, +0x20d878,2, +0x20d8a0,6, +0x20d9ac,1, +0x20d9d8,4, +0x20da00,6, +0x20da20,6, +0x20da40,6, +0x20da60,6, +0x20da80,3, +0x20dc00,6, +0x20dc20,3, +0x20dc40,2, +0x20dc60,1, +0x210000,5, +0x210020,4, +0x210034,17, +0x210080,1, +0x2100a0,6, +0x210100,5, +0x210120,4, +0x210134,17, +0x210180,1, +0x2101a0,6, +0x210200,5, +0x210220,4, +0x210234,17, +0x210280,1, +0x2102a0,6, +0x210300,5, +0x210320,4, +0x210334,17, +0x210380,1, +0x2103a0,6, +0x210500,6, +0x21051c,7, +0x210540,1, +0x210c00,13, +0x210c40,12, +0x210c80,13, +0x210cc0,12, +0x210d00,6, +0x210d20,6, +0x210d80,14, +0x210dc0,2, +0x210e40,11, +0x210e80,6, +0x210ea0,6, +0x211000,2, +0x211010,5, +0x211060,32, +0x211100,8, +0x211180,3, +0x211190,2, +0x21119c,5, +0x211218,9, +0x211240,3, +0x211250,6, +0x211280,1, +0x211288,6, +0x2112a4,1, +0x211400,8, +0x211424,2, +0x211500,5, +0x211520,4, +0x211540,5, +0x211560,4, +0x211800,24, +0x211864,5, +0x211880,8, +0x211900,13, +0x211980,4, +0x2119a0,6, +0x211a40,1, +0x211a60,1, +0x211a68,23, +0x211ac8,6, +0x211b00,17, +0x211b48,6, +0x211b80,12, +0x211c00,6, +0x211c20,6, +0x211c40,6, +0x211c60,3, +0x211d00,6, +0x211d20,6, +0x211d40,3, +0x212000,5, +0x212020,4, +0x212034,17, +0x212080,1, +0x2120a0,6, +0x212100,5, +0x212120,4, +0x212134,17, +0x212180,1, +0x2121a0,6, +0x212200,5, +0x212220,4, +0x212234,17, +0x212280,1, +0x2122a0,6, +0x212300,5, +0x212320,4, +0x212334,17, +0x212380,1, +0x2123a0,6, +0x212500,6, +0x21251c,7, +0x212540,1, +0x212c00,13, +0x212c40,12, +0x212c80,13, +0x212cc0,12, +0x212d00,6, +0x212d20,6, +0x212d80,14, +0x212dc0,2, +0x212e40,11, +0x212e80,6, +0x212ea0,6, +0x213000,2, +0x213010,5, +0x213060,32, +0x213100,8, +0x213180,3, +0x213190,2, +0x21319c,5, +0x213218,9, +0x213240,3, +0x213250,6, +0x213280,1, +0x213288,6, +0x2132a4,1, +0x213400,8, +0x213424,2, +0x213500,5, +0x213520,4, +0x213540,5, +0x213560,4, +0x213800,24, +0x213864,5, +0x213880,8, +0x213900,13, +0x213980,4, +0x2139a0,6, +0x213a40,1, +0x213a60,1, +0x213a68,23, +0x213ac8,6, +0x213b00,17, +0x213b48,6, +0x213b80,12, +0x213c00,6, +0x213c20,6, +0x213c40,6, +0x213c60,3, +0x213d00,6, +0x213d20,6, +0x213d40,3, +0x214000,29, +0x214078,4, +0x214090,2, +0x2140a0,7, +0x2140c0,11, +0x214100,14, +0x214140,14, +0x214180,61, +0x214278,4, +0x214290,2, +0x2142a0,7, +0x2142c0,11, +0x214300,14, +0x214340,14, +0x214380,61, +0x214478,4, +0x214490,2, +0x2144a0,7, +0x2144c0,11, +0x214500,14, +0x214540,14, +0x214580,61, +0x214678,4, +0x214690,2, +0x2146a0,7, +0x2146c0,11, +0x214700,14, +0x214740,14, +0x214780,67, +0x214890,1, +0x214a00,8, +0x214a24,15, +0x214a64,30, +0x214b00,4, +0x214b20,2, +0x214c00,6, +0x214c40,14, +0x214c80,9, +0x214d00,9, +0x214d2c,1, +0x214d40,3, +0x214d60,1, +0x214d80,3, +0x214e00,2, +0x214e0c,1, +0x214e14,5, +0x214e2c,1, +0x214e34,5, +0x214e4c,1, +0x214e54,5, +0x214e6c,1, +0x214e74,5, +0x214e8c,1, +0x214e94,5, +0x214eac,1, +0x214eb4,3, +0x215000,29, +0x215078,4, +0x215090,2, +0x2150a0,7, +0x2150c0,11, +0x215100,14, +0x215140,14, +0x215180,61, +0x215278,4, +0x215290,2, +0x2152a0,7, +0x2152c0,11, +0x215300,14, +0x215340,14, +0x215380,61, +0x215478,4, +0x215490,2, +0x2154a0,7, +0x2154c0,11, +0x215500,14, +0x215540,14, +0x215580,61, +0x215678,4, +0x215690,2, +0x2156a0,7, +0x2156c0,11, +0x215700,14, +0x215740,14, +0x215780,67, +0x215890,1, +0x215a00,8, +0x215a24,15, +0x215a64,30, +0x215b00,4, +0x215b20,2, +0x215c00,6, +0x215c40,14, +0x215c80,9, +0x215d00,9, +0x215d2c,1, +0x215d40,3, +0x215d60,1, +0x215d80,3, +0x215e00,2, +0x215e0c,1, +0x215e14,5, +0x215e2c,1, +0x215e34,5, +0x215e4c,1, +0x215e54,5, +0x215e6c,1, +0x215e74,5, +0x215e8c,1, +0x215e94,5, +0x215eac,1, +0x215eb4,3, +0x216000,14, +0x216070,3, +0x216080,6, +0x216100,9, +0x216204,1, +0x21620c,6, +0x216240,13, +0x216280,16, +0x216800,19, +0x216850,10, +0x216880,19, +0x2168d0,10, +0x216900,19, +0x216950,10, +0x216980,19, +0x2169d0,10, +0x216a00,19, +0x216a50,10, +0x216a80,19, +0x216ad0,10, +0x216b00,19, +0x216b50,10, +0x216b80,19, +0x216bd0,10, +0x216c00,19, +0x216c60,6, +0x216c84,1, +0x216c94,8, +0x216cb8,9, +0x216ce0,4, +0x217000,6, +0x217020,3, +0x217040,7, +0x217060,6, +0x217100,5, +0x217138,1, +0x217144,1, +0x217150,2, +0x218000,6, +0x218020,3, +0x218030,9, +0x218100,6, +0x218120,10, +0x218150,8, +0x218400,1, +0x218428,1, +0x218450,1, +0x218478,1, +0x2184a0,8, +0x2185ac,1, +0x2185d8,4, +0x218600,6, +0x218620,6, +0x218640,3, +0x218800,6, +0x218820,3, +0x218830,4, +0x218858,2, +0x218864,1, +0x218874,3, +0x218898,2, +0x2188a4,1, +0x2188b4,3, +0x219000,6, +0x219020,6, +0x219040,3, +0x219080,14, +0x2190bc,1, +0x2190c4,13, +0x2190fc,1, +0x219200,20, +0x21925c,30, +0x219300,24, +0x219380,2, +0x2193a0,1, +0x2193c0,11, +0x219404,3, +0x219420,11, +0x219460,3, +0x219480,6, +0x219500,6, +0x219520,6, +0x219540,1, +0x219558,2, +0x219600,17, +0x219800,410, +0x21a000,6, +0x21a020,6, +0x21a040,3, +0x21a080,14, +0x21a0bc,1, +0x21a0c4,13, +0x21a0fc,1, +0x21a200,20, +0x21a25c,30, +0x21a300,24, +0x21a380,2, +0x21a3a0,1, +0x21a3c0,11, +0x21a404,3, +0x21a420,11, +0x21a460,3, +0x21a480,6, +0x21a500,6, +0x21a520,6, +0x21a540,1, +0x21a558,2, +0x21a600,17, +0x21a800,410, +0x21b000,4, +0x21b020,25, +0x21b088,8, +0x21b100,4, +0x21b120,25, +0x21b188,8, +0x21b200,34, +0x21b300,37, +0x21b400,16, +0x21b464,1, +0x21b474,3, +0x21b500,6, +0x21b520,2, +0x21b530,9, +0x21b570,10, +0x21b5a0,2, +0x21b5b0,9, +0x21b5f0,4, +0x21b620,7, +0x21b640,16, +0x21b700,6, +0x21b720,6, +0x21b740,6, +0x21b760,6, +0x21b780,3, +0x21b800,5, +0x21b818,1, +0x21b854,6, +0x21b880,2, +0x21b8a4,1, +0x21b8ac,2, +0x21ba00,28, +0x21ba7c,13, +0x21bab4,1, +0x21babc,10, +0x21bb04,1, +0x21bb0c,5, +0x21bb24,1, +0x21bb34,9, +0x21bb60,6, +0x21bb80,22, +0x21bbe0,3, +0x21bbf0,2, +0x21bc00,5, +0x21bc18,1, +0x21bc54,6, +0x21bc80,2, +0x21bca4,1, +0x21bcac,2, +0x21be00,28, +0x21be7c,13, +0x21beb4,1, +0x21bebc,10, +0x21bf04,1, +0x21bf0c,5, +0x21bf24,1, +0x21bf34,9, +0x21bf60,6, +0x21bf80,22, +0x21bfe0,3, +0x21bff0,2, +0x21c008,2, +0x21c014,11, +0x21c044,1, +0x21c04c,3, +0x21c05c,1, +0x21c064,1, +0x21c07c,1, +0x21c500,2, +0x21c518,1, +0x21c520,3, +0x21c540,6, +0x21c580,10, +0x21c808,2, +0x21c814,11, +0x21c844,1, +0x21c84c,3, +0x21c85c,1, +0x21c864,1, +0x21c87c,1, +0x21cd00,2, +0x21cd18,1, +0x21cd20,3, +0x21cd40,6, +0x21cd80,10, +0x21d800,2, +0x21d828,2, +0x21d850,2, +0x21d878,2, +0x21d8a0,6, +0x21d9ac,1, +0x21d9d8,4, +0x21da00,6, +0x21da20,6, +0x21da40,6, +0x21da60,6, +0x21da80,3, +0x21dc00,6, +0x21dc20,3, +0x21dc40,2, +0x21dc60,1, +0x220000,5, +0x220020,4, +0x220034,17, +0x220080,1, +0x2200a0,6, +0x220100,5, +0x220120,4, +0x220134,17, +0x220180,1, +0x2201a0,6, +0x220200,5, +0x220220,4, +0x220234,17, +0x220280,1, +0x2202a0,6, +0x220300,5, +0x220320,4, +0x220334,17, +0x220380,1, +0x2203a0,6, +0x220500,6, +0x22051c,7, +0x220540,1, +0x220c00,13, +0x220c40,12, +0x220c80,13, +0x220cc0,12, +0x220d00,6, +0x220d20,6, +0x220d80,14, +0x220dc0,2, +0x220e40,11, +0x220e80,6, +0x220ea0,6, +0x221000,2, +0x221010,5, +0x221060,32, +0x221100,8, +0x221180,3, +0x221190,2, +0x22119c,5, +0x221218,9, +0x221240,3, +0x221250,6, +0x221280,1, +0x221288,6, +0x2212a4,1, +0x221400,8, +0x221424,2, +0x221500,5, +0x221520,4, +0x221540,5, +0x221560,4, +0x221800,24, +0x221864,5, +0x221880,8, +0x221900,13, +0x221980,4, +0x2219a0,6, +0x221a40,1, +0x221a60,1, +0x221a68,23, +0x221ac8,6, +0x221b00,17, +0x221b48,6, +0x221b80,12, +0x221c00,6, +0x221c20,6, +0x221c40,6, +0x221c60,3, +0x221d00,6, +0x221d20,6, +0x221d40,3, +0x222000,5, +0x222020,4, +0x222034,17, +0x222080,1, +0x2220a0,6, +0x222100,5, +0x222120,4, +0x222134,17, +0x222180,1, +0x2221a0,6, +0x222200,5, +0x222220,4, +0x222234,17, +0x222280,1, +0x2222a0,6, +0x222300,5, +0x222320,4, +0x222334,17, +0x222380,1, +0x2223a0,6, +0x222500,6, +0x22251c,7, +0x222540,1, +0x222c00,13, +0x222c40,12, +0x222c80,13, +0x222cc0,12, +0x222d00,6, +0x222d20,6, +0x222d80,14, +0x222dc0,2, +0x222e40,11, +0x222e80,6, +0x222ea0,6, +0x223000,2, +0x223010,5, +0x223060,32, +0x223100,8, +0x223180,3, +0x223190,2, +0x22319c,5, +0x223218,9, +0x223240,3, +0x223250,6, +0x223280,1, +0x223288,6, +0x2232a4,1, +0x223400,8, +0x223424,2, +0x223500,5, +0x223520,4, +0x223540,5, +0x223560,4, +0x223800,24, +0x223864,5, +0x223880,8, +0x223900,13, +0x223980,4, +0x2239a0,6, +0x223a40,1, +0x223a60,1, +0x223a68,23, +0x223ac8,6, +0x223b00,17, +0x223b48,6, +0x223b80,12, +0x223c00,6, +0x223c20,6, +0x223c40,6, +0x223c60,3, +0x223d00,6, +0x223d20,6, +0x223d40,3, +0x224000,29, +0x224078,4, +0x224090,2, +0x2240a0,7, +0x2240c0,11, +0x224100,14, +0x224140,14, +0x224180,61, +0x224278,4, +0x224290,2, +0x2242a0,7, +0x2242c0,11, +0x224300,14, +0x224340,14, +0x224380,61, +0x224478,4, +0x224490,2, +0x2244a0,7, +0x2244c0,11, +0x224500,14, +0x224540,14, +0x224580,61, +0x224678,4, +0x224690,2, +0x2246a0,7, +0x2246c0,11, +0x224700,14, +0x224740,14, +0x224780,67, +0x224890,1, +0x224a00,8, +0x224a24,15, +0x224a64,30, +0x224b00,4, +0x224b20,2, +0x224c00,6, +0x224c40,14, +0x224c80,9, +0x224d00,9, +0x224d2c,1, +0x224d40,3, +0x224d60,1, +0x224d80,3, +0x224e00,2, +0x224e0c,1, +0x224e14,5, +0x224e2c,1, +0x224e34,5, +0x224e4c,1, +0x224e54,5, +0x224e6c,1, +0x224e74,5, +0x224e8c,1, +0x224e94,5, +0x224eac,1, +0x224eb4,3, +0x225000,29, +0x225078,4, +0x225090,2, +0x2250a0,7, +0x2250c0,11, +0x225100,14, +0x225140,14, +0x225180,61, +0x225278,4, +0x225290,2, +0x2252a0,7, +0x2252c0,11, +0x225300,14, +0x225340,14, +0x225380,61, +0x225478,4, +0x225490,2, +0x2254a0,7, +0x2254c0,11, +0x225500,14, +0x225540,14, +0x225580,61, +0x225678,4, +0x225690,2, +0x2256a0,7, +0x2256c0,11, +0x225700,14, +0x225740,14, +0x225780,67, +0x225890,1, +0x225a00,8, +0x225a24,15, +0x225a64,30, +0x225b00,4, +0x225b20,2, +0x225c00,6, +0x225c40,14, +0x225c80,9, +0x225d00,9, +0x225d2c,1, +0x225d40,3, +0x225d60,1, +0x225d80,3, +0x225e00,2, +0x225e0c,1, +0x225e14,5, +0x225e2c,1, +0x225e34,5, +0x225e4c,1, +0x225e54,5, +0x225e6c,1, +0x225e74,5, +0x225e8c,1, +0x225e94,5, +0x225eac,1, +0x225eb4,3, +0x226000,14, +0x226070,3, +0x226080,6, +0x226100,9, +0x226204,1, +0x22620c,6, +0x226240,13, +0x226280,16, +0x226800,19, +0x226850,10, +0x226880,19, +0x2268d0,10, +0x226900,19, +0x226950,10, +0x226980,19, +0x2269d0,10, +0x226a00,19, +0x226a50,10, +0x226a80,19, +0x226ad0,10, +0x226b00,19, +0x226b50,10, +0x226b80,19, +0x226bd0,10, +0x226c00,19, +0x226c60,6, +0x226c84,1, +0x226c94,8, +0x226cb8,9, +0x226ce0,4, +0x227000,6, +0x227020,3, +0x227040,7, +0x227060,6, +0x227100,5, +0x227138,1, +0x227144,1, +0x227150,2, +0x228000,6, +0x228020,3, +0x228030,9, +0x228100,6, +0x228120,10, +0x228150,8, +0x228400,1, +0x228428,1, +0x228450,1, +0x228478,1, +0x2284a0,8, +0x2285ac,1, +0x2285d8,4, +0x228600,6, +0x228620,6, +0x228640,3, +0x228800,6, +0x228820,3, +0x228830,4, +0x228858,2, +0x228864,1, +0x228874,3, +0x228898,2, +0x2288a4,1, +0x2288b4,3, +0x229000,6, +0x229020,6, +0x229040,3, +0x229080,14, +0x2290bc,1, +0x2290c4,13, +0x2290fc,1, +0x229200,20, +0x22925c,30, +0x229300,24, +0x229380,2, +0x2293a0,1, +0x2293c0,11, +0x229404,3, +0x229420,11, +0x229460,3, +0x229480,6, +0x229500,6, +0x229520,6, +0x229540,1, +0x229558,2, +0x229600,17, +0x229800,410, +0x22a000,6, +0x22a020,6, +0x22a040,3, +0x22a080,14, +0x22a0bc,1, +0x22a0c4,13, +0x22a0fc,1, +0x22a200,20, +0x22a25c,30, +0x22a300,24, +0x22a380,2, +0x22a3a0,1, +0x22a3c0,11, +0x22a404,3, +0x22a420,11, +0x22a460,3, +0x22a480,6, +0x22a500,6, +0x22a520,6, +0x22a540,1, +0x22a558,2, +0x22a600,17, +0x22a800,410, +0x22b000,4, +0x22b020,25, +0x22b088,8, +0x22b100,4, +0x22b120,25, +0x22b188,8, +0x22b200,34, +0x22b300,37, +0x22b400,16, +0x22b464,1, +0x22b474,3, +0x22b500,6, +0x22b520,2, +0x22b530,9, +0x22b570,10, +0x22b5a0,2, +0x22b5b0,9, +0x22b5f0,4, +0x22b620,7, +0x22b640,16, +0x22b700,6, +0x22b720,6, +0x22b740,6, +0x22b760,6, +0x22b780,3, +0x22b800,5, +0x22b818,1, +0x22b854,6, +0x22b880,2, +0x22b8a4,1, +0x22b8ac,2, +0x22ba00,28, +0x22ba7c,13, +0x22bab4,1, +0x22babc,10, +0x22bb04,1, +0x22bb0c,5, +0x22bb24,1, +0x22bb34,9, +0x22bb60,6, +0x22bb80,22, +0x22bbe0,3, +0x22bbf0,2, +0x22bc00,5, +0x22bc18,1, +0x22bc54,6, +0x22bc80,2, +0x22bca4,1, +0x22bcac,2, +0x22be00,28, +0x22be7c,13, +0x22beb4,1, +0x22bebc,10, +0x22bf04,1, +0x22bf0c,5, +0x22bf24,1, +0x22bf34,9, +0x22bf60,6, +0x22bf80,22, +0x22bfe0,3, +0x22bff0,2, +0x22c008,2, +0x22c014,11, +0x22c044,1, +0x22c04c,3, +0x22c05c,1, +0x22c064,1, +0x22c07c,1, +0x22c500,2, +0x22c518,1, +0x22c520,3, +0x22c540,6, +0x22c580,10, +0x22c808,2, +0x22c814,11, +0x22c844,1, +0x22c84c,3, +0x22c85c,1, +0x22c864,1, +0x22c87c,1, +0x22cd00,2, +0x22cd18,1, +0x22cd20,3, +0x22cd40,6, +0x22cd80,10, +0x22d800,2, +0x22d828,2, +0x22d850,2, +0x22d878,2, +0x22d8a0,6, +0x22d9ac,1, +0x22d9d8,4, +0x22da00,6, +0x22da20,6, +0x22da40,6, +0x22da60,6, +0x22da80,3, +0x22dc00,6, +0x22dc20,3, +0x22dc40,2, +0x22dc60,1, +0x230000,5, +0x230020,4, +0x230034,17, +0x230080,1, +0x2300a0,6, +0x230100,5, +0x230120,4, +0x230134,17, +0x230180,1, +0x2301a0,6, +0x230200,5, +0x230220,4, +0x230234,17, +0x230280,1, +0x2302a0,6, +0x230300,5, +0x230320,4, +0x230334,17, +0x230380,1, +0x2303a0,6, +0x230500,6, +0x23051c,7, +0x230540,1, +0x230c00,13, +0x230c40,12, +0x230c80,13, +0x230cc0,12, +0x230d00,6, +0x230d20,6, +0x230d80,14, +0x230dc0,2, +0x230e40,11, +0x230e80,6, +0x230ea0,6, +0x231000,2, +0x231010,5, +0x231060,32, +0x231100,8, +0x231180,3, +0x231190,2, +0x23119c,5, +0x231218,9, +0x231240,3, +0x231250,6, +0x231280,1, +0x231288,6, +0x2312a4,1, +0x231400,8, +0x231424,2, +0x231500,5, +0x231520,4, +0x231540,5, +0x231560,4, +0x231800,24, +0x231864,5, +0x231880,8, +0x231900,13, +0x231980,4, +0x2319a0,6, +0x231a40,1, +0x231a60,1, +0x231a68,23, +0x231ac8,6, +0x231b00,17, +0x231b48,6, +0x231b80,12, +0x231c00,6, +0x231c20,6, +0x231c40,6, +0x231c60,3, +0x231d00,6, +0x231d20,6, +0x231d40,3, +0x232000,5, +0x232020,4, +0x232034,17, +0x232080,1, +0x2320a0,6, +0x232100,5, +0x232120,4, +0x232134,17, +0x232180,1, +0x2321a0,6, +0x232200,5, +0x232220,4, +0x232234,17, +0x232280,1, +0x2322a0,6, +0x232300,5, +0x232320,4, +0x232334,17, +0x232380,1, +0x2323a0,6, +0x232500,6, +0x23251c,7, +0x232540,1, +0x232c00,13, +0x232c40,12, +0x232c80,13, +0x232cc0,12, +0x232d00,6, +0x232d20,6, +0x232d80,14, +0x232dc0,2, +0x232e40,11, +0x232e80,6, +0x232ea0,6, +0x233000,2, +0x233010,5, +0x233060,32, +0x233100,8, +0x233180,3, +0x233190,2, +0x23319c,5, +0x233218,9, +0x233240,3, +0x233250,6, +0x233280,1, +0x233288,6, +0x2332a4,1, +0x233400,8, +0x233424,2, +0x233500,5, +0x233520,4, +0x233540,5, +0x233560,4, +0x233800,24, +0x233864,5, +0x233880,8, +0x233900,13, +0x233980,4, +0x2339a0,6, +0x233a40,1, +0x233a60,1, +0x233a68,23, +0x233ac8,6, +0x233b00,17, +0x233b48,6, +0x233b80,12, +0x233c00,6, +0x233c20,6, +0x233c40,6, +0x233c60,3, +0x233d00,6, +0x233d20,6, +0x233d40,3, +0x234000,29, +0x234078,4, +0x234090,2, +0x2340a0,7, +0x2340c0,11, +0x234100,14, +0x234140,14, +0x234180,61, +0x234278,4, +0x234290,2, +0x2342a0,7, +0x2342c0,11, +0x234300,14, +0x234340,14, +0x234380,61, +0x234478,4, +0x234490,2, +0x2344a0,7, +0x2344c0,11, +0x234500,14, +0x234540,14, +0x234580,61, +0x234678,4, +0x234690,2, +0x2346a0,7, +0x2346c0,11, +0x234700,14, +0x234740,14, +0x234780,67, +0x234890,1, +0x234a00,8, +0x234a24,15, +0x234a64,30, +0x234b00,4, +0x234b20,2, +0x234c00,6, +0x234c40,14, +0x234c80,9, +0x234d00,9, +0x234d2c,1, +0x234d40,3, +0x234d60,1, +0x234d80,3, +0x234e00,2, +0x234e0c,1, +0x234e14,5, +0x234e2c,1, +0x234e34,5, +0x234e4c,1, +0x234e54,5, +0x234e6c,1, +0x234e74,5, +0x234e8c,1, +0x234e94,5, +0x234eac,1, +0x234eb4,3, +0x235000,29, +0x235078,4, +0x235090,2, +0x2350a0,7, +0x2350c0,11, +0x235100,14, +0x235140,14, +0x235180,61, +0x235278,4, +0x235290,2, +0x2352a0,7, +0x2352c0,11, +0x235300,14, +0x235340,14, +0x235380,61, +0x235478,4, +0x235490,2, +0x2354a0,7, +0x2354c0,11, +0x235500,14, +0x235540,14, +0x235580,61, +0x235678,4, +0x235690,2, +0x2356a0,7, +0x2356c0,11, +0x235700,14, +0x235740,14, +0x235780,67, +0x235890,1, +0x235a00,8, +0x235a24,15, +0x235a64,30, +0x235b00,4, +0x235b20,2, +0x235c00,6, +0x235c40,14, +0x235c80,9, +0x235d00,9, +0x235d2c,1, +0x235d40,3, +0x235d60,1, +0x235d80,3, +0x235e00,2, +0x235e0c,1, +0x235e14,5, +0x235e2c,1, +0x235e34,5, +0x235e4c,1, +0x235e54,5, +0x235e6c,1, +0x235e74,5, +0x235e8c,1, +0x235e94,5, +0x235eac,1, +0x235eb4,3, +0x236000,14, +0x236070,3, +0x236080,6, +0x236100,9, +0x236204,1, +0x23620c,6, +0x236240,13, +0x236280,16, +0x236800,19, +0x236850,10, +0x236880,19, +0x2368d0,10, +0x236900,19, +0x236950,10, +0x236980,19, +0x2369d0,10, +0x236a00,19, +0x236a50,10, +0x236a80,19, +0x236ad0,10, +0x236b00,19, +0x236b50,10, +0x236b80,19, +0x236bd0,10, +0x236c00,19, +0x236c60,6, +0x236c84,1, +0x236c94,8, +0x236cb8,9, +0x236ce0,4, +0x237000,6, +0x237020,3, +0x237040,7, +0x237060,6, +0x237100,5, +0x237138,1, +0x237144,1, +0x237150,2, +0x238000,6, +0x238020,3, +0x238030,9, +0x238100,6, +0x238120,10, +0x238150,8, +0x238400,1, +0x238428,1, +0x238450,1, +0x238478,1, +0x2384a0,8, +0x2385ac,1, +0x2385d8,4, +0x238600,6, +0x238620,6, +0x238640,3, +0x238800,6, +0x238820,3, +0x238830,4, +0x238858,2, +0x238864,1, +0x238874,3, +0x238898,2, +0x2388a4,1, +0x2388b4,3, +0x239000,6, +0x239020,6, +0x239040,3, +0x239080,14, +0x2390bc,1, +0x2390c4,13, +0x2390fc,1, +0x239200,20, +0x23925c,30, +0x239300,24, +0x239380,2, +0x2393a0,1, +0x2393c0,11, +0x239404,3, +0x239420,11, +0x239460,3, +0x239480,6, +0x239500,6, +0x239520,6, +0x239540,1, +0x239558,2, +0x239600,17, +0x239800,410, +0x23a000,6, +0x23a020,6, +0x23a040,3, +0x23a080,14, +0x23a0bc,1, +0x23a0c4,13, +0x23a0fc,1, +0x23a200,20, +0x23a25c,30, +0x23a300,24, +0x23a380,2, +0x23a3a0,1, +0x23a3c0,11, +0x23a404,3, +0x23a420,11, +0x23a460,3, +0x23a480,6, +0x23a500,6, +0x23a520,6, +0x23a540,1, +0x23a558,2, +0x23a600,17, +0x23a800,410, +0x23b000,4, +0x23b020,25, +0x23b088,8, +0x23b100,4, +0x23b120,25, +0x23b188,8, +0x23b200,34, +0x23b300,37, +0x23b400,16, +0x23b464,1, +0x23b474,3, +0x23b500,6, +0x23b520,2, +0x23b530,9, +0x23b570,10, +0x23b5a0,2, +0x23b5b0,9, +0x23b5f0,4, +0x23b620,7, +0x23b640,16, +0x23b700,6, +0x23b720,6, +0x23b740,6, +0x23b760,6, +0x23b780,3, +0x23b800,5, +0x23b818,1, +0x23b854,6, +0x23b880,2, +0x23b8a4,1, +0x23b8ac,2, +0x23ba00,28, +0x23ba7c,13, +0x23bab4,1, +0x23babc,10, +0x23bb04,1, +0x23bb0c,5, +0x23bb24,1, +0x23bb34,9, +0x23bb60,6, +0x23bb80,22, +0x23bbe0,3, +0x23bbf0,2, +0x23bc00,5, +0x23bc18,1, +0x23bc54,6, +0x23bc80,2, +0x23bca4,1, +0x23bcac,2, +0x23be00,28, +0x23be7c,13, +0x23beb4,1, +0x23bebc,10, +0x23bf04,1, +0x23bf0c,5, +0x23bf24,1, +0x23bf34,9, +0x23bf60,6, +0x23bf80,22, +0x23bfe0,3, +0x23bff0,2, +0x23c008,2, +0x23c014,11, +0x23c044,1, +0x23c04c,3, +0x23c05c,1, +0x23c064,1, +0x23c07c,1, +0x23c500,2, +0x23c518,1, +0x23c520,3, +0x23c540,6, +0x23c580,10, +0x23c808,2, +0x23c814,11, +0x23c844,1, +0x23c84c,3, +0x23c85c,1, +0x23c864,1, +0x23c87c,1, +0x23cd00,2, +0x23cd18,1, +0x23cd20,3, +0x23cd40,6, +0x23cd80,10, +0x23d800,2, +0x23d828,2, +0x23d850,2, +0x23d878,2, +0x23d8a0,6, +0x23d9ac,1, +0x23d9d8,4, +0x23da00,6, +0x23da20,6, +0x23da40,6, +0x23da60,6, +0x23da80,3, +0x23dc00,6, +0x23dc20,3, +0x23dc40,2, +0x23dc60,1, +0x240000,5, +0x240020,4, +0x240034,17, +0x240080,1, +0x2400a0,6, +0x240100,5, +0x240120,4, +0x240134,17, +0x240180,1, +0x2401a0,6, +0x240200,5, +0x240220,4, +0x240234,17, +0x240280,1, +0x2402a0,6, +0x240300,5, +0x240320,4, +0x240334,17, +0x240380,1, +0x2403a0,6, +0x240500,6, +0x24051c,7, +0x240540,1, +0x240c00,13, +0x240c40,12, +0x240c80,13, +0x240cc0,12, +0x240d00,6, +0x240d20,6, +0x240d80,14, +0x240dc0,2, +0x240e40,11, +0x240e80,6, +0x240ea0,6, +0x241000,2, +0x241010,5, +0x241060,32, +0x241100,8, +0x241180,3, +0x241190,2, +0x24119c,5, +0x241218,9, +0x241240,3, +0x241250,6, +0x241280,1, +0x241288,6, +0x2412a4,1, +0x241400,8, +0x241424,2, +0x241500,5, +0x241520,4, +0x241540,5, +0x241560,4, +0x241800,24, +0x241864,5, +0x241880,8, +0x241900,13, +0x241980,4, +0x2419a0,6, +0x241a40,1, +0x241a60,1, +0x241a68,23, +0x241ac8,6, +0x241b00,17, +0x241b48,6, +0x241b80,12, +0x241c00,6, +0x241c20,6, +0x241c40,6, +0x241c60,3, +0x241d00,6, +0x241d20,6, +0x241d40,3, +0x242000,5, +0x242020,4, +0x242034,17, +0x242080,1, +0x2420a0,6, +0x242100,5, +0x242120,4, +0x242134,17, +0x242180,1, +0x2421a0,6, +0x242200,5, +0x242220,4, +0x242234,17, +0x242280,1, +0x2422a0,6, +0x242300,5, +0x242320,4, +0x242334,17, +0x242380,1, +0x2423a0,6, +0x242500,6, +0x24251c,7, +0x242540,1, +0x242c00,13, +0x242c40,12, +0x242c80,13, +0x242cc0,12, +0x242d00,6, +0x242d20,6, +0x242d80,14, +0x242dc0,2, +0x242e40,11, +0x242e80,6, +0x242ea0,6, +0x243000,2, +0x243010,5, +0x243060,32, +0x243100,8, +0x243180,3, +0x243190,2, +0x24319c,5, +0x243218,9, +0x243240,3, +0x243250,6, +0x243280,1, +0x243288,6, +0x2432a4,1, +0x243400,8, +0x243424,2, +0x243500,5, +0x243520,4, +0x243540,5, +0x243560,4, +0x243800,24, +0x243864,5, +0x243880,8, +0x243900,13, +0x243980,4, +0x2439a0,6, +0x243a40,1, +0x243a60,1, +0x243a68,23, +0x243ac8,6, +0x243b00,17, +0x243b48,6, +0x243b80,12, +0x243c00,6, +0x243c20,6, +0x243c40,6, +0x243c60,3, +0x243d00,6, +0x243d20,6, +0x243d40,3, +0x244000,29, +0x244078,4, +0x244090,2, +0x2440a0,7, +0x2440c0,11, +0x244100,14, +0x244140,14, +0x244180,61, +0x244278,4, +0x244290,2, +0x2442a0,7, +0x2442c0,11, +0x244300,14, +0x244340,14, +0x244380,61, +0x244478,4, +0x244490,2, +0x2444a0,7, +0x2444c0,11, +0x244500,14, +0x244540,14, +0x244580,61, +0x244678,4, +0x244690,2, +0x2446a0,7, +0x2446c0,11, +0x244700,14, +0x244740,14, +0x244780,67, +0x244890,1, +0x244a00,8, +0x244a24,15, +0x244a64,30, +0x244b00,4, +0x244b20,2, +0x244c00,6, +0x244c40,14, +0x244c80,9, +0x244d00,9, +0x244d2c,1, +0x244d40,3, +0x244d60,1, +0x244d80,3, +0x244e00,2, +0x244e0c,1, +0x244e14,5, +0x244e2c,1, +0x244e34,5, +0x244e4c,1, +0x244e54,5, +0x244e6c,1, +0x244e74,5, +0x244e8c,1, +0x244e94,5, +0x244eac,1, +0x244eb4,3, +0x245000,29, +0x245078,4, +0x245090,2, +0x2450a0,7, +0x2450c0,11, +0x245100,14, +0x245140,14, +0x245180,61, +0x245278,4, +0x245290,2, +0x2452a0,7, +0x2452c0,11, +0x245300,14, +0x245340,14, +0x245380,61, +0x245478,4, +0x245490,2, +0x2454a0,7, +0x2454c0,11, +0x245500,14, +0x245540,14, +0x245580,61, +0x245678,4, +0x245690,2, +0x2456a0,7, +0x2456c0,11, +0x245700,14, +0x245740,14, +0x245780,67, +0x245890,1, +0x245a00,8, +0x245a24,15, +0x245a64,30, +0x245b00,4, +0x245b20,2, +0x245c00,6, +0x245c40,14, +0x245c80,9, +0x245d00,9, +0x245d2c,1, +0x245d40,3, +0x245d60,1, +0x245d80,3, +0x245e00,2, +0x245e0c,1, +0x245e14,5, +0x245e2c,1, +0x245e34,5, +0x245e4c,1, +0x245e54,5, +0x245e6c,1, +0x245e74,5, +0x245e8c,1, +0x245e94,5, +0x245eac,1, +0x245eb4,3, +0x246000,14, +0x246070,3, +0x246080,6, +0x246100,9, +0x246204,1, +0x24620c,6, +0x246240,13, +0x246280,16, +0x246400,8, +0x246424,15, +0x246464,15, +0x2464a4,15, +0x2464e4,30, +0x246580,10, +0x2465ac,1, +0x2465b4,5, +0x2465cc,1, +0x2465d4,5, +0x2465ec,1, +0x2465f4,13, +0x246680,4, +0x246694,2, +0x2466a0,5, +0x2466c0,5, +0x2466e0,4, +0x246800,19, +0x246850,10, +0x246880,19, +0x2468d0,10, +0x246900,19, +0x246950,10, +0x246980,19, +0x2469d0,10, +0x246a00,19, +0x246a50,10, +0x246a80,19, +0x246ad0,10, +0x246b00,19, +0x246b50,10, +0x246b80,19, +0x246bd0,10, +0x246c00,19, +0x246c60,6, +0x246c84,1, +0x246c94,8, +0x246cb8,9, +0x246ce0,4, +0x247000,6, +0x247020,3, +0x247040,7, +0x247060,6, +0x247100,5, +0x247138,1, +0x247144,1, +0x247150,2, +0x248000,6, +0x248020,3, +0x248030,9, +0x248100,6, +0x248120,10, +0x248150,8, +0x248400,1, +0x248428,1, +0x248450,1, +0x248478,1, +0x2484a0,8, +0x2485ac,1, +0x2485d8,4, +0x248600,6, +0x248620,6, +0x248640,3, +0x248800,6, +0x248820,3, +0x248830,4, +0x248858,2, +0x248864,1, +0x248874,3, +0x248898,2, +0x2488a4,1, +0x2488b4,3, +0x249000,6, +0x249020,6, +0x249040,3, +0x249080,14, +0x2490bc,1, +0x2490c4,13, +0x2490fc,1, +0x249200,20, +0x24925c,30, +0x249300,24, +0x249380,2, +0x2493a0,1, +0x2493c0,11, +0x249404,3, +0x249420,11, +0x249460,3, +0x249480,6, +0x249500,6, +0x249520,6, +0x249540,1, +0x249558,2, +0x249600,17, +0x249800,410, +0x24a000,6, +0x24a020,6, +0x24a040,3, +0x24a080,14, +0x24a0bc,1, +0x24a0c4,13, +0x24a0fc,1, +0x24a200,20, +0x24a25c,30, +0x24a300,24, +0x24a380,2, +0x24a3a0,1, +0x24a3c0,11, +0x24a404,3, +0x24a420,11, +0x24a460,3, +0x24a480,6, +0x24a500,6, +0x24a520,6, +0x24a540,1, +0x24a558,2, +0x24a600,17, +0x24a800,410, +0x24b000,4, +0x24b020,25, +0x24b088,8, +0x24b100,4, +0x24b120,25, +0x24b188,8, +0x24b200,34, +0x24b300,37, +0x24b400,16, +0x24b464,1, +0x24b474,3, +0x24b500,6, +0x24b520,2, +0x24b530,9, +0x24b570,10, +0x24b5a0,2, +0x24b5b0,9, +0x24b5f0,4, +0x24b620,7, +0x24b640,16, +0x24b700,6, +0x24b720,6, +0x24b740,6, +0x24b760,6, +0x24b780,3, +0x24b800,5, +0x24b818,1, +0x24b854,6, +0x24b880,2, +0x24b8a4,1, +0x24b8ac,2, +0x24ba00,28, +0x24ba7c,13, +0x24bab4,1, +0x24babc,10, +0x24bb04,1, +0x24bb0c,5, +0x24bb24,1, +0x24bb34,9, +0x24bb60,6, +0x24bb80,22, +0x24bbe0,3, +0x24bbf0,2, +0x24bc00,5, +0x24bc18,1, +0x24bc54,6, +0x24bc80,2, +0x24bca4,1, +0x24bcac,2, +0x24be00,28, +0x24be7c,13, +0x24beb4,1, +0x24bebc,10, +0x24bf04,1, +0x24bf0c,5, +0x24bf24,1, +0x24bf34,9, +0x24bf60,6, +0x24bf80,22, +0x24bfe0,3, +0x24bff0,2, +0x24c008,2, +0x24c014,11, +0x24c044,1, +0x24c04c,3, +0x24c05c,1, +0x24c064,1, +0x24c07c,1, +0x24c500,2, +0x24c518,1, +0x24c520,3, +0x24c540,6, +0x24c580,10, +0x24c808,2, +0x24c814,11, +0x24c844,1, +0x24c84c,3, +0x24c85c,1, +0x24c864,1, +0x24c87c,1, +0x24cd00,2, +0x24cd18,1, +0x24cd20,3, +0x24cd40,6, +0x24cd80,10, +0x24d800,2, +0x24d828,2, +0x24d850,2, +0x24d878,2, +0x24d8a0,6, +0x24d9ac,1, +0x24d9d8,4, +0x24da00,6, +0x24da20,6, +0x24da40,6, +0x24da60,6, +0x24da80,3, +0x24dc00,6, +0x24dc20,3, +0x24dc40,2, +0x24dc60,1, +0x250000,5, +0x250020,4, +0x250034,17, +0x250080,1, +0x2500a0,6, +0x250100,5, +0x250120,4, +0x250134,17, +0x250180,1, +0x2501a0,6, +0x250200,5, +0x250220,4, +0x250234,17, +0x250280,1, +0x2502a0,6, +0x250300,5, +0x250320,4, +0x250334,17, +0x250380,1, +0x2503a0,6, +0x250500,6, +0x25051c,7, +0x250540,1, +0x250c00,13, +0x250c40,12, +0x250c80,13, +0x250cc0,12, +0x250d00,6, +0x250d20,6, +0x250d80,14, +0x250dc0,2, +0x250e40,11, +0x250e80,6, +0x250ea0,6, +0x251000,2, +0x251010,5, +0x251060,32, +0x251100,8, +0x251180,3, +0x251190,2, +0x25119c,5, +0x251218,9, +0x251240,3, +0x251250,6, +0x251280,1, +0x251288,6, +0x2512a4,1, +0x251400,8, +0x251424,2, +0x251500,5, +0x251520,4, +0x251540,5, +0x251560,4, +0x251800,24, +0x251864,5, +0x251880,8, +0x251900,13, +0x251980,4, +0x2519a0,6, +0x251a40,1, +0x251a60,1, +0x251a68,23, +0x251ac8,6, +0x251b00,17, +0x251b48,6, +0x251b80,12, +0x251c00,6, +0x251c20,6, +0x251c40,6, +0x251c60,3, +0x251d00,6, +0x251d20,6, +0x251d40,3, +0x252000,5, +0x252020,4, +0x252034,17, +0x252080,1, +0x2520a0,6, +0x252100,5, +0x252120,4, +0x252134,17, +0x252180,1, +0x2521a0,6, +0x252200,5, +0x252220,4, +0x252234,17, +0x252280,1, +0x2522a0,6, +0x252300,5, +0x252320,4, +0x252334,17, +0x252380,1, +0x2523a0,6, +0x252500,6, +0x25251c,7, +0x252540,1, +0x252c00,13, +0x252c40,12, +0x252c80,13, +0x252cc0,12, +0x252d00,6, +0x252d20,6, +0x252d80,14, +0x252dc0,2, +0x252e40,11, +0x252e80,6, +0x252ea0,6, +0x253000,2, +0x253010,5, +0x253060,32, +0x253100,8, +0x253180,3, +0x253190,2, +0x25319c,5, +0x253218,9, +0x253240,3, +0x253250,6, +0x253280,1, +0x253288,6, +0x2532a4,1, +0x253400,8, +0x253424,2, +0x253500,5, +0x253520,4, +0x253540,5, +0x253560,4, +0x253800,24, +0x253864,5, +0x253880,8, +0x253900,13, +0x253980,4, +0x2539a0,6, +0x253a40,1, +0x253a60,1, +0x253a68,23, +0x253ac8,6, +0x253b00,17, +0x253b48,6, +0x253b80,12, +0x253c00,6, +0x253c20,6, +0x253c40,6, +0x253c60,3, +0x253d00,6, +0x253d20,6, +0x253d40,3, +0x254000,29, +0x254078,4, +0x254090,2, +0x2540a0,7, +0x2540c0,11, +0x254100,14, +0x254140,14, +0x254180,61, +0x254278,4, +0x254290,2, +0x2542a0,7, +0x2542c0,11, +0x254300,14, +0x254340,14, +0x254380,61, +0x254478,4, +0x254490,2, +0x2544a0,7, +0x2544c0,11, +0x254500,14, +0x254540,14, +0x254580,61, +0x254678,4, +0x254690,2, +0x2546a0,7, +0x2546c0,11, +0x254700,14, +0x254740,14, +0x254780,67, +0x254890,1, +0x254a00,8, +0x254a24,15, +0x254a64,30, +0x254b00,4, +0x254b20,2, +0x254c00,6, +0x254c40,14, +0x254c80,9, +0x254d00,9, +0x254d2c,1, +0x254d40,3, +0x254d60,1, +0x254d80,3, +0x254e00,2, +0x254e0c,1, +0x254e14,5, +0x254e2c,1, +0x254e34,5, +0x254e4c,1, +0x254e54,5, +0x254e6c,1, +0x254e74,5, +0x254e8c,1, +0x254e94,5, +0x254eac,1, +0x254eb4,3, +0x255000,29, +0x255078,4, +0x255090,2, +0x2550a0,7, +0x2550c0,11, +0x255100,14, +0x255140,14, +0x255180,61, +0x255278,4, +0x255290,2, +0x2552a0,7, +0x2552c0,11, +0x255300,14, +0x255340,14, +0x255380,61, +0x255478,4, +0x255490,2, +0x2554a0,7, +0x2554c0,11, +0x255500,14, +0x255540,14, +0x255580,61, +0x255678,4, +0x255690,2, +0x2556a0,7, +0x2556c0,11, +0x255700,14, +0x255740,14, +0x255780,67, +0x255890,1, +0x255a00,8, +0x255a24,15, +0x255a64,30, +0x255b00,4, +0x255b20,2, +0x255c00,6, +0x255c40,14, +0x255c80,9, +0x255d00,9, +0x255d2c,1, +0x255d40,3, +0x255d60,1, +0x255d80,3, +0x255e00,2, +0x255e0c,1, +0x255e14,5, +0x255e2c,1, +0x255e34,5, +0x255e4c,1, +0x255e54,5, +0x255e6c,1, +0x255e74,5, +0x255e8c,1, +0x255e94,5, +0x255eac,1, +0x255eb4,3, +0x256000,14, +0x256070,3, +0x256080,6, +0x256100,9, +0x256204,1, +0x25620c,6, +0x256240,13, +0x256280,16, +0x256800,19, +0x256850,10, +0x256880,19, +0x2568d0,10, +0x256900,19, +0x256950,10, +0x256980,19, +0x2569d0,10, +0x256a00,19, +0x256a50,10, +0x256a80,19, +0x256ad0,10, +0x256b00,19, +0x256b50,10, +0x256b80,19, +0x256bd0,10, +0x256c00,19, +0x256c60,6, +0x256c84,1, +0x256c94,8, +0x256cb8,9, +0x256ce0,4, +0x257000,6, +0x257020,3, +0x257040,7, +0x257060,6, +0x257100,5, +0x257138,1, +0x257144,1, +0x257150,2, +0x258000,6, +0x258020,3, +0x258030,9, +0x258100,6, +0x258120,10, +0x258150,8, +0x258400,1, +0x258428,1, +0x258450,1, +0x258478,1, +0x2584a0,8, +0x2585ac,1, +0x2585d8,4, +0x258600,6, +0x258620,6, +0x258640,3, +0x258800,6, +0x258820,3, +0x258830,4, +0x258858,2, +0x258864,1, +0x258874,3, +0x258898,2, +0x2588a4,1, +0x2588b4,3, +0x259000,6, +0x259020,6, +0x259040,3, +0x259080,14, +0x2590bc,1, +0x2590c4,13, +0x2590fc,1, +0x259200,20, +0x25925c,30, +0x259300,24, +0x259380,2, +0x2593a0,1, +0x2593c0,11, +0x259404,3, +0x259420,11, +0x259460,3, +0x259480,6, +0x259500,6, +0x259520,6, +0x259540,1, +0x259558,2, +0x259600,17, +0x259800,410, +0x25a000,6, +0x25a020,6, +0x25a040,3, +0x25a080,14, +0x25a0bc,1, +0x25a0c4,13, +0x25a0fc,1, +0x25a200,20, +0x25a25c,30, +0x25a300,24, +0x25a380,2, +0x25a3a0,1, +0x25a3c0,11, +0x25a404,3, +0x25a420,11, +0x25a460,3, +0x25a480,6, +0x25a500,6, +0x25a520,6, +0x25a540,1, +0x25a558,2, +0x25a600,17, +0x25a800,410, +0x25b000,4, +0x25b020,25, +0x25b088,8, +0x25b100,4, +0x25b120,25, +0x25b188,8, +0x25b200,34, +0x25b300,37, +0x25b400,16, +0x25b464,1, +0x25b474,3, +0x25b500,6, +0x25b520,2, +0x25b530,9, +0x25b570,10, +0x25b5a0,2, +0x25b5b0,9, +0x25b5f0,4, +0x25b620,7, +0x25b640,16, +0x25b700,6, +0x25b720,6, +0x25b740,6, +0x25b760,6, +0x25b780,3, +0x25b800,5, +0x25b818,1, +0x25b854,6, +0x25b880,2, +0x25b8a4,1, +0x25b8ac,2, +0x25ba00,28, +0x25ba7c,13, +0x25bab4,1, +0x25babc,10, +0x25bb04,1, +0x25bb0c,5, +0x25bb24,1, +0x25bb34,9, +0x25bb60,6, +0x25bb80,22, +0x25bbe0,3, +0x25bbf0,2, +0x25bc00,5, +0x25bc18,1, +0x25bc54,6, +0x25bc80,2, +0x25bca4,1, +0x25bcac,2, +0x25be00,28, +0x25be7c,13, +0x25beb4,1, +0x25bebc,10, +0x25bf04,1, +0x25bf0c,5, +0x25bf24,1, +0x25bf34,9, +0x25bf60,6, +0x25bf80,22, +0x25bfe0,3, +0x25bff0,2, +0x25c008,2, +0x25c014,11, +0x25c044,1, +0x25c04c,3, +0x25c05c,1, +0x25c064,1, +0x25c07c,1, +0x25c500,2, +0x25c518,1, +0x25c520,3, +0x25c540,6, +0x25c580,10, +0x25c808,2, +0x25c814,11, +0x25c844,1, +0x25c84c,3, +0x25c85c,1, +0x25c864,1, +0x25c87c,1, +0x25cd00,2, +0x25cd18,1, +0x25cd20,3, +0x25cd40,6, +0x25cd80,10, +0x25d800,2, +0x25d828,2, +0x25d850,2, +0x25d878,2, +0x25d8a0,6, +0x25d9ac,1, +0x25d9d8,4, +0x25da00,6, +0x25da20,6, +0x25da40,6, +0x25da60,6, +0x25da80,3, +0x25dc00,6, +0x25dc20,3, +0x25dc40,2, +0x25dc60,1, +0x260000,5, +0x260020,4, +0x260034,17, +0x260080,1, +0x2600a0,6, +0x260100,5, +0x260120,4, +0x260134,17, +0x260180,1, +0x2601a0,6, +0x260200,5, +0x260220,4, +0x260234,17, +0x260280,1, +0x2602a0,6, +0x260300,5, +0x260320,4, +0x260334,17, +0x260380,1, +0x2603a0,6, +0x260500,6, +0x26051c,7, +0x260540,1, +0x260c00,13, +0x260c40,12, +0x260c80,13, +0x260cc0,12, +0x260d00,6, +0x260d20,6, +0x260d80,14, +0x260dc0,2, +0x260e40,11, +0x260e80,6, +0x260ea0,6, +0x261000,2, +0x261010,5, +0x261060,32, +0x261100,8, +0x261180,3, +0x261190,2, +0x26119c,5, +0x261218,9, +0x261240,3, +0x261250,6, +0x261280,1, +0x261288,6, +0x2612a4,1, +0x261400,8, +0x261424,2, +0x261500,5, +0x261520,4, +0x261540,5, +0x261560,4, +0x261800,24, +0x261864,5, +0x261880,8, +0x261900,13, +0x261980,4, +0x2619a0,6, +0x261a40,1, +0x261a60,1, +0x261a68,23, +0x261ac8,6, +0x261b00,17, +0x261b48,6, +0x261b80,12, +0x261c00,6, +0x261c20,6, +0x261c40,6, +0x261c60,3, +0x261d00,6, +0x261d20,6, +0x261d40,3, +0x262000,5, +0x262020,4, +0x262034,17, +0x262080,1, +0x2620a0,6, +0x262100,5, +0x262120,4, +0x262134,17, +0x262180,1, +0x2621a0,6, +0x262200,5, +0x262220,4, +0x262234,17, +0x262280,1, +0x2622a0,6, +0x262300,5, +0x262320,4, +0x262334,17, +0x262380,1, +0x2623a0,6, +0x262500,6, +0x26251c,7, +0x262540,1, +0x262c00,13, +0x262c40,12, +0x262c80,13, +0x262cc0,12, +0x262d00,6, +0x262d20,6, +0x262d80,14, +0x262dc0,2, +0x262e40,11, +0x262e80,6, +0x262ea0,6, +0x263000,2, +0x263010,5, +0x263060,32, +0x263100,8, +0x263180,3, +0x263190,2, +0x26319c,5, +0x263218,9, +0x263240,3, +0x263250,6, +0x263280,1, +0x263288,6, +0x2632a4,1, +0x263400,8, +0x263424,2, +0x263500,5, +0x263520,4, +0x263540,5, +0x263560,4, +0x263800,24, +0x263864,5, +0x263880,8, +0x263900,13, +0x263980,4, +0x2639a0,6, +0x263a40,1, +0x263a60,1, +0x263a68,23, +0x263ac8,6, +0x263b00,17, +0x263b48,6, +0x263b80,12, +0x263c00,6, +0x263c20,6, +0x263c40,6, +0x263c60,3, +0x263d00,6, +0x263d20,6, +0x263d40,3, +0x264000,29, +0x264078,4, +0x264090,2, +0x2640a0,7, +0x2640c0,11, +0x264100,14, +0x264140,14, +0x264180,61, +0x264278,4, +0x264290,2, +0x2642a0,7, +0x2642c0,11, +0x264300,14, +0x264340,14, +0x264380,61, +0x264478,4, +0x264490,2, +0x2644a0,7, +0x2644c0,11, +0x264500,14, +0x264540,14, +0x264580,61, +0x264678,4, +0x264690,2, +0x2646a0,7, +0x2646c0,11, +0x264700,14, +0x264740,14, +0x264780,67, +0x264890,1, +0x264a00,8, +0x264a24,15, +0x264a64,30, +0x264b00,4, +0x264b20,2, +0x264c00,6, +0x264c40,14, +0x264c80,9, +0x264d00,9, +0x264d2c,1, +0x264d40,3, +0x264d60,1, +0x264d80,3, +0x264e00,2, +0x264e0c,1, +0x264e14,5, +0x264e2c,1, +0x264e34,5, +0x264e4c,1, +0x264e54,5, +0x264e6c,1, +0x264e74,5, +0x264e8c,1, +0x264e94,5, +0x264eac,1, +0x264eb4,3, +0x265000,29, +0x265078,4, +0x265090,2, +0x2650a0,7, +0x2650c0,11, +0x265100,14, +0x265140,14, +0x265180,61, +0x265278,4, +0x265290,2, +0x2652a0,7, +0x2652c0,11, +0x265300,14, +0x265340,14, +0x265380,61, +0x265478,4, +0x265490,2, +0x2654a0,7, +0x2654c0,11, +0x265500,14, +0x265540,14, +0x265580,61, +0x265678,4, +0x265690,2, +0x2656a0,7, +0x2656c0,11, +0x265700,14, +0x265740,14, +0x265780,67, +0x265890,1, +0x265a00,8, +0x265a24,15, +0x265a64,30, +0x265b00,4, +0x265b20,2, +0x265c00,6, +0x265c40,14, +0x265c80,9, +0x265d00,9, +0x265d2c,1, +0x265d40,3, +0x265d60,1, +0x265d80,3, +0x265e00,2, +0x265e0c,1, +0x265e14,5, +0x265e2c,1, +0x265e34,5, +0x265e4c,1, +0x265e54,5, +0x265e6c,1, +0x265e74,5, +0x265e8c,1, +0x265e94,5, +0x265eac,1, +0x265eb4,3, +0x266000,14, +0x266070,3, +0x266080,6, +0x266100,9, +0x266204,1, +0x26620c,6, +0x266240,13, +0x266280,16, +0x266800,19, +0x266850,10, +0x266880,19, +0x2668d0,10, +0x266900,19, +0x266950,10, +0x266980,19, +0x2669d0,10, +0x266a00,19, +0x266a50,10, +0x266a80,19, +0x266ad0,10, +0x266b00,19, +0x266b50,10, +0x266b80,19, +0x266bd0,10, +0x266c00,19, +0x266c60,6, +0x266c84,1, +0x266c94,8, +0x266cb8,9, +0x266ce0,4, +0x267000,6, +0x267020,3, +0x267040,7, +0x267060,6, +0x267100,5, +0x267138,1, +0x267144,1, +0x267150,2, +0x268000,6, +0x268020,3, +0x268030,9, +0x268100,6, +0x268120,10, +0x268150,8, +0x268400,1, +0x268428,1, +0x268450,1, +0x268478,1, +0x2684a0,8, +0x2685ac,1, +0x2685d8,4, +0x268600,6, +0x268620,6, +0x268640,3, +0x268800,6, +0x268820,3, +0x268830,4, +0x268858,2, +0x268864,1, +0x268874,3, +0x268898,2, +0x2688a4,1, +0x2688b4,3, +0x269000,6, +0x269020,6, +0x269040,3, +0x269080,14, +0x2690bc,1, +0x2690c4,13, +0x2690fc,1, +0x269200,20, +0x26925c,30, +0x269300,24, +0x269380,2, +0x2693a0,1, +0x2693c0,11, +0x269404,3, +0x269420,11, +0x269460,3, +0x269480,6, +0x269500,6, +0x269520,6, +0x269540,1, +0x269558,2, +0x269600,17, +0x269800,410, +0x26a000,6, +0x26a020,6, +0x26a040,3, +0x26a080,14, +0x26a0bc,1, +0x26a0c4,13, +0x26a0fc,1, +0x26a200,20, +0x26a25c,30, +0x26a300,24, +0x26a380,2, +0x26a3a0,1, +0x26a3c0,11, +0x26a404,3, +0x26a420,11, +0x26a460,3, +0x26a480,6, +0x26a500,6, +0x26a520,6, +0x26a540,1, +0x26a558,2, +0x26a600,17, +0x26a800,410, +0x26b000,4, +0x26b020,25, +0x26b088,8, +0x26b100,4, +0x26b120,25, +0x26b188,8, +0x26b200,34, +0x26b300,37, +0x26b400,16, +0x26b464,1, +0x26b474,3, +0x26b500,6, +0x26b520,2, +0x26b530,9, +0x26b570,10, +0x26b5a0,2, +0x26b5b0,9, +0x26b5f0,4, +0x26b620,7, +0x26b640,16, +0x26b700,6, +0x26b720,6, +0x26b740,6, +0x26b760,6, +0x26b780,3, +0x26b800,5, +0x26b818,1, +0x26b854,6, +0x26b880,2, +0x26b8a4,1, +0x26b8ac,2, +0x26ba00,28, +0x26ba7c,13, +0x26bab4,1, +0x26babc,10, +0x26bb04,1, +0x26bb0c,5, +0x26bb24,1, +0x26bb34,9, +0x26bb60,6, +0x26bb80,22, +0x26bbe0,3, +0x26bbf0,2, +0x26bc00,5, +0x26bc18,1, +0x26bc54,6, +0x26bc80,2, +0x26bca4,1, +0x26bcac,2, +0x26be00,28, +0x26be7c,13, +0x26beb4,1, +0x26bebc,10, +0x26bf04,1, +0x26bf0c,5, +0x26bf24,1, +0x26bf34,9, +0x26bf60,6, +0x26bf80,22, +0x26bfe0,3, +0x26bff0,2, +0x26c008,2, +0x26c014,11, +0x26c044,1, +0x26c04c,3, +0x26c05c,1, +0x26c064,1, +0x26c07c,1, +0x26c500,2, +0x26c518,1, +0x26c520,3, +0x26c540,6, +0x26c580,10, +0x26c808,2, +0x26c814,11, +0x26c844,1, +0x26c84c,3, +0x26c85c,1, +0x26c864,1, +0x26c87c,1, +0x26cd00,2, +0x26cd18,1, +0x26cd20,3, +0x26cd40,6, +0x26cd80,10, +0x26d800,2, +0x26d828,2, +0x26d850,2, +0x26d878,2, +0x26d8a0,6, +0x26d9ac,1, +0x26d9d8,4, +0x26da00,6, +0x26da20,6, +0x26da40,6, +0x26da60,6, +0x26da80,3, +0x26dc00,6, +0x26dc20,3, +0x26dc40,2, +0x26dc60,1, +0x270000,5, +0x270020,4, +0x270034,17, +0x270080,1, +0x2700a0,6, +0x270100,5, +0x270120,4, +0x270134,17, +0x270180,1, +0x2701a0,6, +0x270200,5, +0x270220,4, +0x270234,17, +0x270280,1, +0x2702a0,6, +0x270300,5, +0x270320,4, +0x270334,17, +0x270380,1, +0x2703a0,6, +0x270500,6, +0x27051c,7, +0x270540,1, +0x270c00,13, +0x270c40,12, +0x270c80,13, +0x270cc0,12, +0x270d00,6, +0x270d20,6, +0x270d80,14, +0x270dc0,2, +0x270e40,11, +0x270e80,6, +0x270ea0,6, +0x271000,2, +0x271010,5, +0x271060,32, +0x271100,8, +0x271180,3, +0x271190,2, +0x27119c,5, +0x271218,9, +0x271240,3, +0x271250,6, +0x271280,1, +0x271288,6, +0x2712a4,1, +0x271400,8, +0x271424,2, +0x271500,5, +0x271520,4, +0x271540,5, +0x271560,4, +0x271800,24, +0x271864,5, +0x271880,8, +0x271900,13, +0x271980,4, +0x2719a0,6, +0x271a40,1, +0x271a60,1, +0x271a68,23, +0x271ac8,6, +0x271b00,17, +0x271b48,6, +0x271b80,12, +0x271c00,6, +0x271c20,6, +0x271c40,6, +0x271c60,3, +0x271d00,6, +0x271d20,6, +0x271d40,3, +0x272000,5, +0x272020,4, +0x272034,17, +0x272080,1, +0x2720a0,6, +0x272100,5, +0x272120,4, +0x272134,17, +0x272180,1, +0x2721a0,6, +0x272200,5, +0x272220,4, +0x272234,17, +0x272280,1, +0x2722a0,6, +0x272300,5, +0x272320,4, +0x272334,17, +0x272380,1, +0x2723a0,6, +0x272500,6, +0x27251c,7, +0x272540,1, +0x272c00,13, +0x272c40,12, +0x272c80,13, +0x272cc0,12, +0x272d00,6, +0x272d20,6, +0x272d80,14, +0x272dc0,2, +0x272e40,11, +0x272e80,6, +0x272ea0,6, +0x273000,2, +0x273010,5, +0x273060,32, +0x273100,8, +0x273180,3, +0x273190,2, +0x27319c,5, +0x273218,9, +0x273240,3, +0x273250,6, +0x273280,1, +0x273288,6, +0x2732a4,1, +0x273400,8, +0x273424,2, +0x273500,5, +0x273520,4, +0x273540,5, +0x273560,4, +0x273800,24, +0x273864,5, +0x273880,8, +0x273900,13, +0x273980,4, +0x2739a0,6, +0x273a40,1, +0x273a60,1, +0x273a68,23, +0x273ac8,6, +0x273b00,17, +0x273b48,6, +0x273b80,12, +0x273c00,6, +0x273c20,6, +0x273c40,6, +0x273c60,3, +0x273d00,6, +0x273d20,6, +0x273d40,3, +0x274000,29, +0x274078,4, +0x274090,2, +0x2740a0,7, +0x2740c0,11, +0x274100,14, +0x274140,14, +0x274180,61, +0x274278,4, +0x274290,2, +0x2742a0,7, +0x2742c0,11, +0x274300,14, +0x274340,14, +0x274380,61, +0x274478,4, +0x274490,2, +0x2744a0,7, +0x2744c0,11, +0x274500,14, +0x274540,14, +0x274580,61, +0x274678,4, +0x274690,2, +0x2746a0,7, +0x2746c0,11, +0x274700,14, +0x274740,14, +0x274780,67, +0x274890,1, +0x274a00,8, +0x274a24,15, +0x274a64,30, +0x274b00,4, +0x274b20,2, +0x274c00,6, +0x274c40,14, +0x274c80,9, +0x274d00,9, +0x274d2c,1, +0x274d40,3, +0x274d60,1, +0x274d80,3, +0x274e00,2, +0x274e0c,1, +0x274e14,5, +0x274e2c,1, +0x274e34,5, +0x274e4c,1, +0x274e54,5, +0x274e6c,1, +0x274e74,5, +0x274e8c,1, +0x274e94,5, +0x274eac,1, +0x274eb4,3, +0x275000,29, +0x275078,4, +0x275090,2, +0x2750a0,7, +0x2750c0,11, +0x275100,14, +0x275140,14, +0x275180,61, +0x275278,4, +0x275290,2, +0x2752a0,7, +0x2752c0,11, +0x275300,14, +0x275340,14, +0x275380,61, +0x275478,4, +0x275490,2, +0x2754a0,7, +0x2754c0,11, +0x275500,14, +0x275540,14, +0x275580,61, +0x275678,4, +0x275690,2, +0x2756a0,7, +0x2756c0,11, +0x275700,14, +0x275740,14, +0x275780,67, +0x275890,1, +0x275a00,8, +0x275a24,15, +0x275a64,30, +0x275b00,4, +0x275b20,2, +0x275c00,6, +0x275c40,14, +0x275c80,9, +0x275d00,9, +0x275d2c,1, +0x275d40,3, +0x275d60,1, +0x275d80,3, +0x275e00,2, +0x275e0c,1, +0x275e14,5, +0x275e2c,1, +0x275e34,5, +0x275e4c,1, +0x275e54,5, +0x275e6c,1, +0x275e74,5, +0x275e8c,1, +0x275e94,5, +0x275eac,1, +0x275eb4,3, +0x276000,14, +0x276070,3, +0x276080,6, +0x276100,9, +0x276204,1, +0x27620c,6, +0x276240,13, +0x276280,16, +0x276800,19, +0x276850,10, +0x276880,19, +0x2768d0,10, +0x276900,19, +0x276950,10, +0x276980,19, +0x2769d0,10, +0x276a00,19, +0x276a50,10, +0x276a80,19, +0x276ad0,10, +0x276b00,19, +0x276b50,10, +0x276b80,19, +0x276bd0,10, +0x276c00,19, +0x276c60,6, +0x276c84,1, +0x276c94,8, +0x276cb8,9, +0x276ce0,4, +0x277000,6, +0x277020,3, +0x277040,7, +0x277060,6, +0x277100,5, +0x277138,1, +0x277144,1, +0x277150,2, +0x278000,6, +0x278020,3, +0x278030,9, +0x278100,6, +0x278120,10, +0x278150,8, +0x278400,1, +0x278428,1, +0x278450,1, +0x278478,1, +0x2784a0,8, +0x2785ac,1, +0x2785d8,4, +0x278600,6, +0x278620,6, +0x278640,3, +0x278800,6, +0x278820,3, +0x278830,4, +0x278858,2, +0x278864,1, +0x278874,3, +0x278898,2, +0x2788a4,1, +0x2788b4,3, +0x279000,6, +0x279020,6, +0x279040,3, +0x279080,14, +0x2790bc,1, +0x2790c4,13, +0x2790fc,1, +0x279200,20, +0x27925c,30, +0x279300,24, +0x279380,2, +0x2793a0,1, +0x2793c0,11, +0x279404,3, +0x279420,11, +0x279460,3, +0x279480,6, +0x279500,6, +0x279520,6, +0x279540,1, +0x279558,2, +0x279600,17, +0x279800,410, +0x27a000,6, +0x27a020,6, +0x27a040,3, +0x27a080,14, +0x27a0bc,1, +0x27a0c4,13, +0x27a0fc,1, +0x27a200,20, +0x27a25c,30, +0x27a300,24, +0x27a380,2, +0x27a3a0,1, +0x27a3c0,11, +0x27a404,3, +0x27a420,11, +0x27a460,3, +0x27a480,6, +0x27a500,6, +0x27a520,6, +0x27a540,1, +0x27a558,2, +0x27a600,17, +0x27a800,410, +0x27b000,4, +0x27b020,25, +0x27b088,8, +0x27b100,4, +0x27b120,25, +0x27b188,8, +0x27b200,34, +0x27b300,37, +0x27b400,16, +0x27b464,1, +0x27b474,3, +0x27b500,6, +0x27b520,2, +0x27b530,9, +0x27b570,10, +0x27b5a0,2, +0x27b5b0,9, +0x27b5f0,4, +0x27b620,7, +0x27b640,16, +0x27b700,6, +0x27b720,6, +0x27b740,6, +0x27b760,6, +0x27b780,3, +0x27b800,5, +0x27b818,1, +0x27b854,6, +0x27b880,2, +0x27b8a4,1, +0x27b8ac,2, +0x27ba00,28, +0x27ba7c,13, +0x27bab4,1, +0x27babc,10, +0x27bb04,1, +0x27bb0c,5, +0x27bb24,1, +0x27bb34,9, +0x27bb60,6, +0x27bb80,22, +0x27bbe0,3, +0x27bbf0,2, +0x27bc00,5, +0x27bc18,1, +0x27bc54,6, +0x27bc80,2, +0x27bca4,1, +0x27bcac,2, +0x27be00,28, +0x27be7c,13, +0x27beb4,1, +0x27bebc,10, +0x27bf04,1, +0x27bf0c,5, +0x27bf24,1, +0x27bf34,9, +0x27bf60,6, +0x27bf80,22, +0x27bfe0,3, +0x27bff0,2, +0x27c008,2, +0x27c014,11, +0x27c044,1, +0x27c04c,3, +0x27c05c,1, +0x27c064,1, +0x27c07c,1, +0x27c500,2, +0x27c518,1, +0x27c520,3, +0x27c540,6, +0x27c580,10, +0x27c808,2, +0x27c814,11, +0x27c844,1, +0x27c84c,3, +0x27c85c,1, +0x27c864,1, +0x27c87c,1, +0x27cd00,2, +0x27cd18,1, +0x27cd20,3, +0x27cd40,6, +0x27cd80,10, +0x27d800,2, +0x27d828,2, +0x27d850,2, +0x27d878,2, +0x27d8a0,6, +0x27d9ac,1, +0x27d9d8,4, +0x27da00,6, +0x27da20,6, +0x27da40,6, +0x27da60,6, +0x27da80,3, +0x27dc00,6, +0x27dc20,3, +0x27dc40,2, +0x27dc60,1, +0x280000,5, +0x280020,4, +0x280034,17, +0x280080,1, +0x2800a0,6, +0x280100,5, +0x280120,4, +0x280134,17, +0x280180,1, +0x2801a0,6, +0x280200,5, +0x280220,4, +0x280234,17, +0x280280,1, +0x2802a0,6, +0x280300,5, +0x280320,4, +0x280334,17, +0x280380,1, +0x2803a0,6, +0x280500,6, +0x28051c,7, +0x280540,1, +0x280c00,13, +0x280c40,12, +0x280c80,13, +0x280cc0,12, +0x280d00,6, +0x280d20,6, +0x280d80,14, +0x280dc0,2, +0x280e40,11, +0x280e80,6, +0x280ea0,6, +0x281000,2, +0x281010,5, +0x281060,32, +0x281100,8, +0x281180,3, +0x281190,2, +0x28119c,5, +0x281218,9, +0x281240,3, +0x281250,6, +0x281280,1, +0x281288,6, +0x2812a4,1, +0x281400,8, +0x281424,2, +0x281500,5, +0x281520,4, +0x281540,5, +0x281560,4, +0x281800,24, +0x281864,5, +0x281880,8, +0x281900,13, +0x281980,4, +0x2819a0,6, +0x281a40,1, +0x281a60,1, +0x281a68,23, +0x281ac8,6, +0x281b00,17, +0x281b48,6, +0x281b80,12, +0x281c00,6, +0x281c20,6, +0x281c40,6, +0x281c60,3, +0x281d00,6, +0x281d20,6, +0x281d40,3, +0x282000,5, +0x282020,4, +0x282034,17, +0x282080,1, +0x2820a0,6, +0x282100,5, +0x282120,4, +0x282134,17, +0x282180,1, +0x2821a0,6, +0x282200,5, +0x282220,4, +0x282234,17, +0x282280,1, +0x2822a0,6, +0x282300,5, +0x282320,4, +0x282334,17, +0x282380,1, +0x2823a0,6, +0x282500,6, +0x28251c,7, +0x282540,1, +0x282c00,13, +0x282c40,12, +0x282c80,13, +0x282cc0,12, +0x282d00,6, +0x282d20,6, +0x282d80,14, +0x282dc0,2, +0x282e40,11, +0x282e80,6, +0x282ea0,6, +0x283000,2, +0x283010,5, +0x283060,32, +0x283100,8, +0x283180,3, +0x283190,2, +0x28319c,5, +0x283218,9, +0x283240,3, +0x283250,6, +0x283280,1, +0x283288,6, +0x2832a4,1, +0x283400,8, +0x283424,2, +0x283500,5, +0x283520,4, +0x283540,5, +0x283560,4, +0x283800,24, +0x283864,5, +0x283880,8, +0x283900,13, +0x283980,4, +0x2839a0,6, +0x283a40,1, +0x283a60,1, +0x283a68,23, +0x283ac8,6, +0x283b00,17, +0x283b48,6, +0x283b80,12, +0x283c00,6, +0x283c20,6, +0x283c40,6, +0x283c60,3, +0x283d00,6, +0x283d20,6, +0x283d40,3, +0x284000,29, +0x284078,4, +0x284090,2, +0x2840a0,7, +0x2840c0,11, +0x284100,14, +0x284140,14, +0x284180,61, +0x284278,4, +0x284290,2, +0x2842a0,7, +0x2842c0,11, +0x284300,14, +0x284340,14, +0x284380,61, +0x284478,4, +0x284490,2, +0x2844a0,7, +0x2844c0,11, +0x284500,14, +0x284540,14, +0x284580,61, +0x284678,4, +0x284690,2, +0x2846a0,7, +0x2846c0,11, +0x284700,14, +0x284740,14, +0x284780,67, +0x284890,1, +0x284a00,8, +0x284a24,15, +0x284a64,30, +0x284b00,4, +0x284b20,2, +0x284c00,6, +0x284c40,14, +0x284c80,9, +0x284d00,9, +0x284d2c,1, +0x284d40,3, +0x284d60,1, +0x284d80,3, +0x284e00,2, +0x284e0c,1, +0x284e14,5, +0x284e2c,1, +0x284e34,5, +0x284e4c,1, +0x284e54,5, +0x284e6c,1, +0x284e74,5, +0x284e8c,1, +0x284e94,5, +0x284eac,1, +0x284eb4,3, +0x285000,29, +0x285078,4, +0x285090,2, +0x2850a0,7, +0x2850c0,11, +0x285100,14, +0x285140,14, +0x285180,61, +0x285278,4, +0x285290,2, +0x2852a0,7, +0x2852c0,11, +0x285300,14, +0x285340,14, +0x285380,61, +0x285478,4, +0x285490,2, +0x2854a0,7, +0x2854c0,11, +0x285500,14, +0x285540,14, +0x285580,61, +0x285678,4, +0x285690,2, +0x2856a0,7, +0x2856c0,11, +0x285700,14, +0x285740,14, +0x285780,67, +0x285890,1, +0x285a00,8, +0x285a24,15, +0x285a64,30, +0x285b00,4, +0x285b20,2, +0x285c00,6, +0x285c40,14, +0x285c80,9, +0x285d00,9, +0x285d2c,1, +0x285d40,3, +0x285d60,1, +0x285d80,3, +0x285e00,2, +0x285e0c,1, +0x285e14,5, +0x285e2c,1, +0x285e34,5, +0x285e4c,1, +0x285e54,5, +0x285e6c,1, +0x285e74,5, +0x285e8c,1, +0x285e94,5, +0x285eac,1, +0x285eb4,3, +0x286000,14, +0x286070,3, +0x286080,6, +0x286100,9, +0x286204,1, +0x28620c,6, +0x286240,13, +0x286280,16, +0x286800,19, +0x286850,10, +0x286880,19, +0x2868d0,10, +0x286900,19, +0x286950,10, +0x286980,19, +0x2869d0,10, +0x286a00,19, +0x286a50,10, +0x286a80,19, +0x286ad0,10, +0x286b00,19, +0x286b50,10, +0x286b80,19, +0x286bd0,10, +0x286c00,19, +0x286c60,6, +0x286c84,1, +0x286c94,8, +0x286cb8,9, +0x286ce0,4, +0x287000,6, +0x287020,3, +0x287040,7, +0x287060,6, +0x287100,5, +0x287138,1, +0x287144,1, +0x287150,2, +0x288000,6, +0x288020,3, +0x288030,9, +0x288100,6, +0x288120,10, +0x288150,8, +0x288400,1, +0x288428,1, +0x288450,1, +0x288478,1, +0x2884a0,8, +0x2885ac,1, +0x2885d8,4, +0x288600,6, +0x288620,6, +0x288640,3, +0x288800,6, +0x288820,3, +0x288830,4, +0x288858,2, +0x288864,1, +0x288874,3, +0x288898,2, +0x2888a4,1, +0x2888b4,3, +0x289000,6, +0x289020,6, +0x289040,3, +0x289080,14, +0x2890bc,1, +0x2890c4,13, +0x2890fc,1, +0x289200,20, +0x28925c,30, +0x289300,24, +0x289380,2, +0x2893a0,1, +0x2893c0,11, +0x289404,3, +0x289420,11, +0x289460,3, +0x289480,6, +0x289500,6, +0x289520,6, +0x289540,1, +0x289558,2, +0x289600,17, +0x289800,410, +0x28a000,6, +0x28a020,6, +0x28a040,3, +0x28a080,14, +0x28a0bc,1, +0x28a0c4,13, +0x28a0fc,1, +0x28a200,20, +0x28a25c,30, +0x28a300,24, +0x28a380,2, +0x28a3a0,1, +0x28a3c0,11, +0x28a404,3, +0x28a420,11, +0x28a460,3, +0x28a480,6, +0x28a500,6, +0x28a520,6, +0x28a540,1, +0x28a558,2, +0x28a600,17, +0x28a800,410, +0x28b000,4, +0x28b020,25, +0x28b088,8, +0x28b100,4, +0x28b120,25, +0x28b188,8, +0x28b200,34, +0x28b300,37, +0x28b400,16, +0x28b464,1, +0x28b474,3, +0x28b500,6, +0x28b520,2, +0x28b530,9, +0x28b570,10, +0x28b5a0,2, +0x28b5b0,9, +0x28b5f0,4, +0x28b620,7, +0x28b640,16, +0x28b700,6, +0x28b720,6, +0x28b740,6, +0x28b760,6, +0x28b780,3, +0x28b800,5, +0x28b818,1, +0x28b854,6, +0x28b880,2, +0x28b8a4,1, +0x28b8ac,2, +0x28ba00,28, +0x28ba7c,13, +0x28bab4,1, +0x28babc,10, +0x28bb04,1, +0x28bb0c,5, +0x28bb24,1, +0x28bb34,9, +0x28bb60,6, +0x28bb80,22, +0x28bbe0,3, +0x28bbf0,2, +0x28bc00,5, +0x28bc18,1, +0x28bc54,6, +0x28bc80,2, +0x28bca4,1, +0x28bcac,2, +0x28be00,28, +0x28be7c,13, +0x28beb4,1, +0x28bebc,10, +0x28bf04,1, +0x28bf0c,5, +0x28bf24,1, +0x28bf34,9, +0x28bf60,6, +0x28bf80,22, +0x28bfe0,3, +0x28bff0,2, +0x28c008,2, +0x28c014,11, +0x28c044,1, +0x28c04c,3, +0x28c05c,1, +0x28c064,1, +0x28c07c,1, +0x28c500,2, +0x28c518,1, +0x28c520,3, +0x28c540,6, +0x28c580,10, +0x28c808,2, +0x28c814,11, +0x28c844,1, +0x28c84c,3, +0x28c85c,1, +0x28c864,1, +0x28c87c,1, +0x28cd00,2, +0x28cd18,1, +0x28cd20,3, +0x28cd40,6, +0x28cd80,10, +0x28d800,2, +0x28d828,2, +0x28d850,2, +0x28d878,2, +0x28d8a0,6, +0x28d9ac,1, +0x28d9d8,4, +0x28da00,6, +0x28da20,6, +0x28da40,6, +0x28da60,6, +0x28da80,3, +0x28dc00,6, +0x28dc20,3, +0x28dc40,2, +0x28dc60,1, +0x290000,5, +0x290020,4, +0x290034,17, +0x290080,1, +0x2900a0,6, +0x290100,5, +0x290120,4, +0x290134,17, +0x290180,1, +0x2901a0,6, +0x290200,5, +0x290220,4, +0x290234,17, +0x290280,1, +0x2902a0,6, +0x290300,5, +0x290320,4, +0x290334,17, +0x290380,1, +0x2903a0,6, +0x290500,6, +0x29051c,7, +0x290540,1, +0x290c00,13, +0x290c40,12, +0x290c80,13, +0x290cc0,12, +0x290d00,6, +0x290d20,6, +0x290d80,14, +0x290dc0,2, +0x290e40,11, +0x290e80,6, +0x290ea0,6, +0x291000,2, +0x291010,5, +0x291060,32, +0x291100,8, +0x291180,3, +0x291190,2, +0x29119c,5, +0x291218,9, +0x291240,3, +0x291250,6, +0x291280,1, +0x291288,6, +0x2912a4,1, +0x291400,8, +0x291424,2, +0x291500,5, +0x291520,4, +0x291540,5, +0x291560,4, +0x291800,24, +0x291864,5, +0x291880,8, +0x291900,13, +0x291980,4, +0x2919a0,6, +0x291a40,1, +0x291a60,1, +0x291a68,23, +0x291ac8,6, +0x291b00,17, +0x291b48,6, +0x291b80,12, +0x291c00,6, +0x291c20,6, +0x291c40,6, +0x291c60,3, +0x291d00,6, +0x291d20,6, +0x291d40,3, +0x292000,5, +0x292020,4, +0x292034,17, +0x292080,1, +0x2920a0,6, +0x292100,5, +0x292120,4, +0x292134,17, +0x292180,1, +0x2921a0,6, +0x292200,5, +0x292220,4, +0x292234,17, +0x292280,1, +0x2922a0,6, +0x292300,5, +0x292320,4, +0x292334,17, +0x292380,1, +0x2923a0,6, +0x292500,6, +0x29251c,7, +0x292540,1, +0x292c00,13, +0x292c40,12, +0x292c80,13, +0x292cc0,12, +0x292d00,6, +0x292d20,6, +0x292d80,14, +0x292dc0,2, +0x292e40,11, +0x292e80,6, +0x292ea0,6, +0x293000,2, +0x293010,5, +0x293060,32, +0x293100,8, +0x293180,3, +0x293190,2, +0x29319c,5, +0x293218,9, +0x293240,3, +0x293250,6, +0x293280,1, +0x293288,6, +0x2932a4,1, +0x293400,8, +0x293424,2, +0x293500,5, +0x293520,4, +0x293540,5, +0x293560,4, +0x293800,24, +0x293864,5, +0x293880,8, +0x293900,13, +0x293980,4, +0x2939a0,6, +0x293a40,1, +0x293a60,1, +0x293a68,23, +0x293ac8,6, +0x293b00,17, +0x293b48,6, +0x293b80,12, +0x293c00,6, +0x293c20,6, +0x293c40,6, +0x293c60,3, +0x293d00,6, +0x293d20,6, +0x293d40,3, +0x294000,29, +0x294078,4, +0x294090,2, +0x2940a0,7, +0x2940c0,11, +0x294100,14, +0x294140,14, +0x294180,61, +0x294278,4, +0x294290,2, +0x2942a0,7, +0x2942c0,11, +0x294300,14, +0x294340,14, +0x294380,61, +0x294478,4, +0x294490,2, +0x2944a0,7, +0x2944c0,11, +0x294500,14, +0x294540,14, +0x294580,61, +0x294678,4, +0x294690,2, +0x2946a0,7, +0x2946c0,11, +0x294700,14, +0x294740,14, +0x294780,67, +0x294890,1, +0x294a00,8, +0x294a24,15, +0x294a64,30, +0x294b00,4, +0x294b20,2, +0x294c00,6, +0x294c40,14, +0x294c80,9, +0x294d00,9, +0x294d2c,1, +0x294d40,3, +0x294d60,1, +0x294d80,3, +0x294e00,2, +0x294e0c,1, +0x294e14,5, +0x294e2c,1, +0x294e34,5, +0x294e4c,1, +0x294e54,5, +0x294e6c,1, +0x294e74,5, +0x294e8c,1, +0x294e94,5, +0x294eac,1, +0x294eb4,3, +0x295000,29, +0x295078,4, +0x295090,2, +0x2950a0,7, +0x2950c0,11, +0x295100,14, +0x295140,14, +0x295180,61, +0x295278,4, +0x295290,2, +0x2952a0,7, +0x2952c0,11, +0x295300,14, +0x295340,14, +0x295380,61, +0x295478,4, +0x295490,2, +0x2954a0,7, +0x2954c0,11, +0x295500,14, +0x295540,14, +0x295580,61, +0x295678,4, +0x295690,2, +0x2956a0,7, +0x2956c0,11, +0x295700,14, +0x295740,14, +0x295780,67, +0x295890,1, +0x295a00,8, +0x295a24,15, +0x295a64,30, +0x295b00,4, +0x295b20,2, +0x295c00,6, +0x295c40,14, +0x295c80,9, +0x295d00,9, +0x295d2c,1, +0x295d40,3, +0x295d60,1, +0x295d80,3, +0x295e00,2, +0x295e0c,1, +0x295e14,5, +0x295e2c,1, +0x295e34,5, +0x295e4c,1, +0x295e54,5, +0x295e6c,1, +0x295e74,5, +0x295e8c,1, +0x295e94,5, +0x295eac,1, +0x295eb4,3, +0x296000,14, +0x296070,3, +0x296080,6, +0x296100,9, +0x296204,1, +0x29620c,6, +0x296240,13, +0x296280,16, +0x296800,19, +0x296850,10, +0x296880,19, +0x2968d0,10, +0x296900,19, +0x296950,10, +0x296980,19, +0x2969d0,10, +0x296a00,19, +0x296a50,10, +0x296a80,19, +0x296ad0,10, +0x296b00,19, +0x296b50,10, +0x296b80,19, +0x296bd0,10, +0x296c00,19, +0x296c60,6, +0x296c84,1, +0x296c94,8, +0x296cb8,9, +0x296ce0,4, +0x297000,6, +0x297020,3, +0x297040,7, +0x297060,6, +0x297100,5, +0x297138,1, +0x297144,1, +0x297150,2, +0x298000,6, +0x298020,3, +0x298030,9, +0x298100,6, +0x298120,10, +0x298150,8, +0x298400,1, +0x298428,1, +0x298450,1, +0x298478,1, +0x2984a0,8, +0x2985ac,1, +0x2985d8,4, +0x298600,6, +0x298620,6, +0x298640,3, +0x298800,6, +0x298820,3, +0x298830,4, +0x298858,2, +0x298864,1, +0x298874,3, +0x298898,2, +0x2988a4,1, +0x2988b4,3, +0x299000,6, +0x299020,6, +0x299040,3, +0x299080,14, +0x2990bc,1, +0x2990c4,13, +0x2990fc,1, +0x299200,20, +0x29925c,30, +0x299300,24, +0x299380,2, +0x2993a0,1, +0x2993c0,11, +0x299404,3, +0x299420,11, +0x299460,3, +0x299480,6, +0x299500,6, +0x299520,6, +0x299540,1, +0x299558,2, +0x299600,17, +0x299800,410, +0x29a000,6, +0x29a020,6, +0x29a040,3, +0x29a080,14, +0x29a0bc,1, +0x29a0c4,13, +0x29a0fc,1, +0x29a200,20, +0x29a25c,30, +0x29a300,24, +0x29a380,2, +0x29a3a0,1, +0x29a3c0,11, +0x29a404,3, +0x29a420,11, +0x29a460,3, +0x29a480,6, +0x29a500,6, +0x29a520,6, +0x29a540,1, +0x29a558,2, +0x29a600,17, +0x29a800,410, +0x29b000,4, +0x29b020,25, +0x29b088,8, +0x29b100,4, +0x29b120,25, +0x29b188,8, +0x29b200,34, +0x29b300,37, +0x29b400,16, +0x29b464,1, +0x29b474,3, +0x29b500,6, +0x29b520,2, +0x29b530,9, +0x29b570,10, +0x29b5a0,2, +0x29b5b0,9, +0x29b5f0,4, +0x29b620,7, +0x29b640,16, +0x29b700,6, +0x29b720,6, +0x29b740,6, +0x29b760,6, +0x29b780,3, +0x29b800,5, +0x29b818,1, +0x29b854,6, +0x29b880,2, +0x29b8a4,1, +0x29b8ac,2, +0x29ba00,28, +0x29ba7c,13, +0x29bab4,1, +0x29babc,10, +0x29bb04,1, +0x29bb0c,5, +0x29bb24,1, +0x29bb34,9, +0x29bb60,6, +0x29bb80,22, +0x29bbe0,3, +0x29bbf0,2, +0x29bc00,5, +0x29bc18,1, +0x29bc54,6, +0x29bc80,2, +0x29bca4,1, +0x29bcac,2, +0x29be00,28, +0x29be7c,13, +0x29beb4,1, +0x29bebc,10, +0x29bf04,1, +0x29bf0c,5, +0x29bf24,1, +0x29bf34,9, +0x29bf60,6, +0x29bf80,22, +0x29bfe0,3, +0x29bff0,2, +0x29c008,2, +0x29c014,11, +0x29c044,1, +0x29c04c,3, +0x29c05c,1, +0x29c064,1, +0x29c07c,1, +0x29c500,2, +0x29c518,1, +0x29c520,3, +0x29c540,6, +0x29c580,10, +0x29c808,2, +0x29c814,11, +0x29c844,1, +0x29c84c,3, +0x29c85c,1, +0x29c864,1, +0x29c87c,1, +0x29cd00,2, +0x29cd18,1, +0x29cd20,3, +0x29cd40,6, +0x29cd80,10, +0x29d800,2, +0x29d828,2, +0x29d850,2, +0x29d878,2, +0x29d8a0,6, +0x29d9ac,1, +0x29d9d8,4, +0x29da00,6, +0x29da20,6, +0x29da40,6, +0x29da60,6, +0x29da80,3, +0x29dc00,6, +0x29dc20,3, +0x29dc40,2, +0x29dc60,1, +0x2a0000,5, +0x2a0020,4, +0x2a0034,17, +0x2a0080,1, +0x2a00a0,6, +0x2a0100,5, +0x2a0120,4, +0x2a0134,17, +0x2a0180,1, +0x2a01a0,6, +0x2a0200,5, +0x2a0220,4, +0x2a0234,17, +0x2a0280,1, +0x2a02a0,6, +0x2a0300,5, +0x2a0320,4, +0x2a0334,17, +0x2a0380,1, +0x2a03a0,6, +0x2a0500,6, +0x2a051c,7, +0x2a0540,1, +0x2a0c00,13, +0x2a0c40,12, +0x2a0c80,13, +0x2a0cc0,12, +0x2a0d00,6, +0x2a0d20,6, +0x2a0d80,14, +0x2a0dc0,2, +0x2a0e40,11, +0x2a0e80,6, +0x2a0ea0,6, +0x2a1000,2, +0x2a1010,5, +0x2a1060,32, +0x2a1100,8, +0x2a1180,3, +0x2a1190,2, +0x2a119c,5, +0x2a1218,9, +0x2a1240,3, +0x2a1250,6, +0x2a1280,1, +0x2a1288,6, +0x2a12a4,1, +0x2a1400,8, +0x2a1424,2, +0x2a1500,5, +0x2a1520,4, +0x2a1540,5, +0x2a1560,4, +0x2a1800,24, +0x2a1864,5, +0x2a1880,8, +0x2a1900,13, +0x2a1980,4, +0x2a19a0,6, +0x2a1a40,1, +0x2a1a60,1, +0x2a1a68,23, +0x2a1ac8,6, +0x2a1b00,17, +0x2a1b48,6, +0x2a1b80,12, +0x2a1c00,6, +0x2a1c20,6, +0x2a1c40,6, +0x2a1c60,3, +0x2a1d00,6, +0x2a1d20,6, +0x2a1d40,3, +0x2a2000,5, +0x2a2020,4, +0x2a2034,17, +0x2a2080,1, +0x2a20a0,6, +0x2a2100,5, +0x2a2120,4, +0x2a2134,17, +0x2a2180,1, +0x2a21a0,6, +0x2a2200,5, +0x2a2220,4, +0x2a2234,17, +0x2a2280,1, +0x2a22a0,6, +0x2a2300,5, +0x2a2320,4, +0x2a2334,17, +0x2a2380,1, +0x2a23a0,6, +0x2a2500,6, +0x2a251c,7, +0x2a2540,1, +0x2a2c00,13, +0x2a2c40,12, +0x2a2c80,13, +0x2a2cc0,12, +0x2a2d00,6, +0x2a2d20,6, +0x2a2d80,14, +0x2a2dc0,2, +0x2a2e40,11, +0x2a2e80,6, +0x2a2ea0,6, +0x2a3000,2, +0x2a3010,5, +0x2a3060,32, +0x2a3100,8, +0x2a3180,3, +0x2a3190,2, +0x2a319c,5, +0x2a3218,9, +0x2a3240,3, +0x2a3250,6, +0x2a3280,1, +0x2a3288,6, +0x2a32a4,1, +0x2a3400,8, +0x2a3424,2, +0x2a3500,5, +0x2a3520,4, +0x2a3540,5, +0x2a3560,4, +0x2a3800,24, +0x2a3864,5, +0x2a3880,8, +0x2a3900,13, +0x2a3980,4, +0x2a39a0,6, +0x2a3a40,1, +0x2a3a60,1, +0x2a3a68,23, +0x2a3ac8,6, +0x2a3b00,17, +0x2a3b48,6, +0x2a3b80,12, +0x2a3c00,6, +0x2a3c20,6, +0x2a3c40,6, +0x2a3c60,3, +0x2a3d00,6, +0x2a3d20,6, +0x2a3d40,3, +0x2a4000,29, +0x2a4078,4, +0x2a4090,2, +0x2a40a0,7, +0x2a40c0,11, +0x2a4100,14, +0x2a4140,14, +0x2a4180,61, +0x2a4278,4, +0x2a4290,2, +0x2a42a0,7, +0x2a42c0,11, +0x2a4300,14, +0x2a4340,14, +0x2a4380,61, +0x2a4478,4, +0x2a4490,2, +0x2a44a0,7, +0x2a44c0,11, +0x2a4500,14, +0x2a4540,14, +0x2a4580,61, +0x2a4678,4, +0x2a4690,2, +0x2a46a0,7, +0x2a46c0,11, +0x2a4700,14, +0x2a4740,14, +0x2a4780,67, +0x2a4890,1, +0x2a4a00,8, +0x2a4a24,15, +0x2a4a64,30, +0x2a4b00,4, +0x2a4b20,2, +0x2a4c00,6, +0x2a4c40,14, +0x2a4c80,9, +0x2a4d00,9, +0x2a4d2c,1, +0x2a4d40,3, +0x2a4d60,1, +0x2a4d80,3, +0x2a4e00,2, +0x2a4e0c,1, +0x2a4e14,5, +0x2a4e2c,1, +0x2a4e34,5, +0x2a4e4c,1, +0x2a4e54,5, +0x2a4e6c,1, +0x2a4e74,5, +0x2a4e8c,1, +0x2a4e94,5, +0x2a4eac,1, +0x2a4eb4,3, +0x2a5000,29, +0x2a5078,4, +0x2a5090,2, +0x2a50a0,7, +0x2a50c0,11, +0x2a5100,14, +0x2a5140,14, +0x2a5180,61, +0x2a5278,4, +0x2a5290,2, +0x2a52a0,7, +0x2a52c0,11, +0x2a5300,14, +0x2a5340,14, +0x2a5380,61, +0x2a5478,4, +0x2a5490,2, +0x2a54a0,7, +0x2a54c0,11, +0x2a5500,14, +0x2a5540,14, +0x2a5580,61, +0x2a5678,4, +0x2a5690,2, +0x2a56a0,7, +0x2a56c0,11, +0x2a5700,14, +0x2a5740,14, +0x2a5780,67, +0x2a5890,1, +0x2a5a00,8, +0x2a5a24,15, +0x2a5a64,30, +0x2a5b00,4, +0x2a5b20,2, +0x2a5c00,6, +0x2a5c40,14, +0x2a5c80,9, +0x2a5d00,9, +0x2a5d2c,1, +0x2a5d40,3, +0x2a5d60,1, +0x2a5d80,3, +0x2a5e00,2, +0x2a5e0c,1, +0x2a5e14,5, +0x2a5e2c,1, +0x2a5e34,5, +0x2a5e4c,1, +0x2a5e54,5, +0x2a5e6c,1, +0x2a5e74,5, +0x2a5e8c,1, +0x2a5e94,5, +0x2a5eac,1, +0x2a5eb4,3, +0x2a6000,14, +0x2a6070,3, +0x2a6080,6, +0x2a6100,9, +0x2a6204,1, +0x2a620c,6, +0x2a6240,13, +0x2a6280,16, +0x2a6800,19, +0x2a6850,10, +0x2a6880,19, +0x2a68d0,10, +0x2a6900,19, +0x2a6950,10, +0x2a6980,19, +0x2a69d0,10, +0x2a6a00,19, +0x2a6a50,10, +0x2a6a80,19, +0x2a6ad0,10, +0x2a6b00,19, +0x2a6b50,10, +0x2a6b80,19, +0x2a6bd0,10, +0x2a6c00,19, +0x2a6c60,6, +0x2a6c84,1, +0x2a6c94,8, +0x2a6cb8,9, +0x2a6ce0,4, +0x2a7000,6, +0x2a7020,3, +0x2a7040,7, +0x2a7060,6, +0x2a7100,5, +0x2a7138,1, +0x2a7144,1, +0x2a7150,2, +0x2a8000,6, +0x2a8020,3, +0x2a8030,9, +0x2a8100,6, +0x2a8120,10, +0x2a8150,8, +0x2a8400,1, +0x2a8428,1, +0x2a8450,1, +0x2a8478,1, +0x2a84a0,8, +0x2a85ac,1, +0x2a85d8,4, +0x2a8600,6, +0x2a8620,6, +0x2a8640,3, +0x2a8800,6, +0x2a8820,3, +0x2a8830,4, +0x2a8858,2, +0x2a8864,1, +0x2a8874,3, +0x2a8898,2, +0x2a88a4,1, +0x2a88b4,3, +0x2a9000,6, +0x2a9020,6, +0x2a9040,3, +0x2a9080,14, +0x2a90bc,1, +0x2a90c4,13, +0x2a90fc,1, +0x2a9200,20, +0x2a925c,30, +0x2a9300,24, +0x2a9380,2, +0x2a93a0,1, +0x2a93c0,11, +0x2a9404,3, +0x2a9420,11, +0x2a9460,3, +0x2a9480,6, +0x2a9500,6, +0x2a9520,6, +0x2a9540,1, +0x2a9558,2, +0x2a9600,17, +0x2a9800,410, +0x2aa000,6, +0x2aa020,6, +0x2aa040,3, +0x2aa080,14, +0x2aa0bc,1, +0x2aa0c4,13, +0x2aa0fc,1, +0x2aa200,20, +0x2aa25c,30, +0x2aa300,24, +0x2aa380,2, +0x2aa3a0,1, +0x2aa3c0,11, +0x2aa404,3, +0x2aa420,11, +0x2aa460,3, +0x2aa480,6, +0x2aa500,6, +0x2aa520,6, +0x2aa540,1, +0x2aa558,2, +0x2aa600,17, +0x2aa800,410, +0x2ab000,4, +0x2ab020,25, +0x2ab088,8, +0x2ab100,4, +0x2ab120,25, +0x2ab188,8, +0x2ab200,34, +0x2ab300,37, +0x2ab400,16, +0x2ab464,1, +0x2ab474,3, +0x2ab500,6, +0x2ab520,2, +0x2ab530,9, +0x2ab570,10, +0x2ab5a0,2, +0x2ab5b0,9, +0x2ab5f0,4, +0x2ab620,7, +0x2ab640,16, +0x2ab700,6, +0x2ab720,6, +0x2ab740,6, +0x2ab760,6, +0x2ab780,3, +0x2ab800,5, +0x2ab818,1, +0x2ab854,6, +0x2ab880,2, +0x2ab8a4,1, +0x2ab8ac,2, +0x2aba00,28, +0x2aba7c,13, +0x2abab4,1, +0x2ababc,10, +0x2abb04,1, +0x2abb0c,5, +0x2abb24,1, +0x2abb34,9, +0x2abb60,6, +0x2abb80,22, +0x2abbe0,3, +0x2abbf0,2, +0x2abc00,5, +0x2abc18,1, +0x2abc54,6, +0x2abc80,2, +0x2abca4,1, +0x2abcac,2, +0x2abe00,28, +0x2abe7c,13, +0x2abeb4,1, +0x2abebc,10, +0x2abf04,1, +0x2abf0c,5, +0x2abf24,1, +0x2abf34,9, +0x2abf60,6, +0x2abf80,22, +0x2abfe0,3, +0x2abff0,2, +0x2ac008,2, +0x2ac014,11, +0x2ac044,1, +0x2ac04c,3, +0x2ac05c,1, +0x2ac064,1, +0x2ac07c,1, +0x2ac500,2, +0x2ac518,1, +0x2ac520,3, +0x2ac540,6, +0x2ac580,10, +0x2ac808,2, +0x2ac814,11, +0x2ac844,1, +0x2ac84c,3, +0x2ac85c,1, +0x2ac864,1, +0x2ac87c,1, +0x2acd00,2, +0x2acd18,1, +0x2acd20,3, +0x2acd40,6, +0x2acd80,10, +0x2ad800,2, +0x2ad828,2, +0x2ad850,2, +0x2ad878,2, +0x2ad8a0,6, +0x2ad9ac,1, +0x2ad9d8,4, +0x2ada00,6, +0x2ada20,6, +0x2ada40,6, +0x2ada60,6, +0x2ada80,3, +0x2adc00,6, +0x2adc20,3, +0x2adc40,2, +0x2adc60,1, +0x2b0000,5, +0x2b0020,4, +0x2b0034,17, +0x2b0080,1, +0x2b00a0,6, +0x2b0100,5, +0x2b0120,4, +0x2b0134,17, +0x2b0180,1, +0x2b01a0,6, +0x2b0200,5, +0x2b0220,4, +0x2b0234,17, +0x2b0280,1, +0x2b02a0,6, +0x2b0300,5, +0x2b0320,4, +0x2b0334,17, +0x2b0380,1, +0x2b03a0,6, +0x2b0500,6, +0x2b051c,7, +0x2b0540,1, +0x2b0c00,13, +0x2b0c40,12, +0x2b0c80,13, +0x2b0cc0,12, +0x2b0d00,6, +0x2b0d20,6, +0x2b0d80,14, +0x2b0dc0,2, +0x2b0e40,11, +0x2b0e80,6, +0x2b0ea0,6, +0x2b1000,2, +0x2b1010,5, +0x2b1060,32, +0x2b1100,8, +0x2b1180,3, +0x2b1190,2, +0x2b119c,5, +0x2b1218,9, +0x2b1240,3, +0x2b1250,6, +0x2b1280,1, +0x2b1288,6, +0x2b12a4,1, +0x2b1400,8, +0x2b1424,2, +0x2b1500,5, +0x2b1520,4, +0x2b1540,5, +0x2b1560,4, +0x2b1800,24, +0x2b1864,5, +0x2b1880,8, +0x2b1900,13, +0x2b1980,4, +0x2b19a0,6, +0x2b1a40,1, +0x2b1a60,1, +0x2b1a68,23, +0x2b1ac8,6, +0x2b1b00,17, +0x2b1b48,6, +0x2b1b80,12, +0x2b1c00,6, +0x2b1c20,6, +0x2b1c40,6, +0x2b1c60,3, +0x2b1d00,6, +0x2b1d20,6, +0x2b1d40,3, +0x2b2000,5, +0x2b2020,4, +0x2b2034,17, +0x2b2080,1, +0x2b20a0,6, +0x2b2100,5, +0x2b2120,4, +0x2b2134,17, +0x2b2180,1, +0x2b21a0,6, +0x2b2200,5, +0x2b2220,4, +0x2b2234,17, +0x2b2280,1, +0x2b22a0,6, +0x2b2300,5, +0x2b2320,4, +0x2b2334,17, +0x2b2380,1, +0x2b23a0,6, +0x2b2500,6, +0x2b251c,7, +0x2b2540,1, +0x2b2c00,13, +0x2b2c40,12, +0x2b2c80,13, +0x2b2cc0,12, +0x2b2d00,6, +0x2b2d20,6, +0x2b2d80,14, +0x2b2dc0,2, +0x2b2e40,11, +0x2b2e80,6, +0x2b2ea0,6, +0x2b3000,2, +0x2b3010,5, +0x2b3060,32, +0x2b3100,8, +0x2b3180,3, +0x2b3190,2, +0x2b319c,5, +0x2b3218,9, +0x2b3240,3, +0x2b3250,6, +0x2b3280,1, +0x2b3288,6, +0x2b32a4,1, +0x2b3400,8, +0x2b3424,2, +0x2b3500,5, +0x2b3520,4, +0x2b3540,5, +0x2b3560,4, +0x2b3800,24, +0x2b3864,5, +0x2b3880,8, +0x2b3900,13, +0x2b3980,4, +0x2b39a0,6, +0x2b3a40,1, +0x2b3a60,1, +0x2b3a68,23, +0x2b3ac8,6, +0x2b3b00,17, +0x2b3b48,6, +0x2b3b80,12, +0x2b3c00,6, +0x2b3c20,6, +0x2b3c40,6, +0x2b3c60,3, +0x2b3d00,6, +0x2b3d20,6, +0x2b3d40,3, +0x2b4000,29, +0x2b4078,4, +0x2b4090,2, +0x2b40a0,7, +0x2b40c0,11, +0x2b4100,14, +0x2b4140,14, +0x2b4180,61, +0x2b4278,4, +0x2b4290,2, +0x2b42a0,7, +0x2b42c0,11, +0x2b4300,14, +0x2b4340,14, +0x2b4380,61, +0x2b4478,4, +0x2b4490,2, +0x2b44a0,7, +0x2b44c0,11, +0x2b4500,14, +0x2b4540,14, +0x2b4580,61, +0x2b4678,4, +0x2b4690,2, +0x2b46a0,7, +0x2b46c0,11, +0x2b4700,14, +0x2b4740,14, +0x2b4780,67, +0x2b4890,1, +0x2b4a00,8, +0x2b4a24,15, +0x2b4a64,30, +0x2b4b00,4, +0x2b4b20,2, +0x2b4c00,6, +0x2b4c40,14, +0x2b4c80,9, +0x2b4d00,9, +0x2b4d2c,1, +0x2b4d40,3, +0x2b4d60,1, +0x2b4d80,3, +0x2b4e00,2, +0x2b4e0c,1, +0x2b4e14,5, +0x2b4e2c,1, +0x2b4e34,5, +0x2b4e4c,1, +0x2b4e54,5, +0x2b4e6c,1, +0x2b4e74,5, +0x2b4e8c,1, +0x2b4e94,5, +0x2b4eac,1, +0x2b4eb4,3, +0x2b5000,29, +0x2b5078,4, +0x2b5090,2, +0x2b50a0,7, +0x2b50c0,11, +0x2b5100,14, +0x2b5140,14, +0x2b5180,61, +0x2b5278,4, +0x2b5290,2, +0x2b52a0,7, +0x2b52c0,11, +0x2b5300,14, +0x2b5340,14, +0x2b5380,61, +0x2b5478,4, +0x2b5490,2, +0x2b54a0,7, +0x2b54c0,11, +0x2b5500,14, +0x2b5540,14, +0x2b5580,61, +0x2b5678,4, +0x2b5690,2, +0x2b56a0,7, +0x2b56c0,11, +0x2b5700,14, +0x2b5740,14, +0x2b5780,67, +0x2b5890,1, +0x2b5a00,8, +0x2b5a24,15, +0x2b5a64,30, +0x2b5b00,4, +0x2b5b20,2, +0x2b5c00,6, +0x2b5c40,14, +0x2b5c80,9, +0x2b5d00,9, +0x2b5d2c,1, +0x2b5d40,3, +0x2b5d60,1, +0x2b5d80,3, +0x2b5e00,2, +0x2b5e0c,1, +0x2b5e14,5, +0x2b5e2c,1, +0x2b5e34,5, +0x2b5e4c,1, +0x2b5e54,5, +0x2b5e6c,1, +0x2b5e74,5, +0x2b5e8c,1, +0x2b5e94,5, +0x2b5eac,1, +0x2b5eb4,3, +0x2b6000,14, +0x2b6070,3, +0x2b6080,6, +0x2b6100,9, +0x2b6204,1, +0x2b620c,6, +0x2b6240,13, +0x2b6280,16, +0x2b6800,19, +0x2b6850,10, +0x2b6880,19, +0x2b68d0,10, +0x2b6900,19, +0x2b6950,10, +0x2b6980,19, +0x2b69d0,10, +0x2b6a00,19, +0x2b6a50,10, +0x2b6a80,19, +0x2b6ad0,10, +0x2b6b00,19, +0x2b6b50,10, +0x2b6b80,19, +0x2b6bd0,10, +0x2b6c00,19, +0x2b6c60,6, +0x2b6c84,1, +0x2b6c94,8, +0x2b6cb8,9, +0x2b6ce0,4, +0x2b7000,6, +0x2b7020,3, +0x2b7040,7, +0x2b7060,6, +0x2b7100,5, +0x2b7138,1, +0x2b7144,1, +0x2b7150,2, +0x2b8000,6, +0x2b8020,3, +0x2b8030,9, +0x2b8100,6, +0x2b8120,10, +0x2b8150,8, +0x2b8400,1, +0x2b8428,1, +0x2b8450,1, +0x2b8478,1, +0x2b84a0,8, +0x2b85ac,1, +0x2b85d8,4, +0x2b8600,6, +0x2b8620,6, +0x2b8640,3, +0x2b8800,6, +0x2b8820,3, +0x2b8830,4, +0x2b8858,2, +0x2b8864,1, +0x2b8874,3, +0x2b8898,2, +0x2b88a4,1, +0x2b88b4,3, +0x2b9000,6, +0x2b9020,6, +0x2b9040,3, +0x2b9080,14, +0x2b90bc,1, +0x2b90c4,13, +0x2b90fc,1, +0x2b9200,20, +0x2b925c,30, +0x2b9300,24, +0x2b9380,2, +0x2b93a0,1, +0x2b93c0,11, +0x2b9404,3, +0x2b9420,11, +0x2b9460,3, +0x2b9480,6, +0x2b9500,6, +0x2b9520,6, +0x2b9540,1, +0x2b9558,2, +0x2b9600,17, +0x2b9800,410, +0x2ba000,6, +0x2ba020,6, +0x2ba040,3, +0x2ba080,14, +0x2ba0bc,1, +0x2ba0c4,13, +0x2ba0fc,1, +0x2ba200,20, +0x2ba25c,30, +0x2ba300,24, +0x2ba380,2, +0x2ba3a0,1, +0x2ba3c0,11, +0x2ba404,3, +0x2ba420,11, +0x2ba460,3, +0x2ba480,6, +0x2ba500,6, +0x2ba520,6, +0x2ba540,1, +0x2ba558,2, +0x2ba600,17, +0x2ba800,410, +0x2bb000,4, +0x2bb020,25, +0x2bb088,8, +0x2bb100,4, +0x2bb120,25, +0x2bb188,8, +0x2bb200,34, +0x2bb300,37, +0x2bb400,16, +0x2bb464,1, +0x2bb474,3, +0x2bb500,6, +0x2bb520,2, +0x2bb530,9, +0x2bb570,10, +0x2bb5a0,2, +0x2bb5b0,9, +0x2bb5f0,4, +0x2bb620,7, +0x2bb640,16, +0x2bb700,6, +0x2bb720,6, +0x2bb740,6, +0x2bb760,6, +0x2bb780,3, +0x2bb800,5, +0x2bb818,1, +0x2bb854,6, +0x2bb880,2, +0x2bb8a4,1, +0x2bb8ac,2, +0x2bba00,28, +0x2bba7c,13, +0x2bbab4,1, +0x2bbabc,10, +0x2bbb04,1, +0x2bbb0c,5, +0x2bbb24,1, +0x2bbb34,9, +0x2bbb60,6, +0x2bbb80,22, +0x2bbbe0,3, +0x2bbbf0,2, +0x2bbc00,5, +0x2bbc18,1, +0x2bbc54,6, +0x2bbc80,2, +0x2bbca4,1, +0x2bbcac,2, +0x2bbe00,28, +0x2bbe7c,13, +0x2bbeb4,1, +0x2bbebc,10, +0x2bbf04,1, +0x2bbf0c,5, +0x2bbf24,1, +0x2bbf34,9, +0x2bbf60,6, +0x2bbf80,22, +0x2bbfe0,3, +0x2bbff0,2, +0x2bc008,2, +0x2bc014,11, +0x2bc044,1, +0x2bc04c,3, +0x2bc05c,1, +0x2bc064,1, +0x2bc07c,1, +0x2bc500,2, +0x2bc518,1, +0x2bc520,3, +0x2bc540,6, +0x2bc580,10, +0x2bc808,2, +0x2bc814,11, +0x2bc844,1, +0x2bc84c,3, +0x2bc85c,1, +0x2bc864,1, +0x2bc87c,1, +0x2bcd00,2, +0x2bcd18,1, +0x2bcd20,3, +0x2bcd40,6, +0x2bcd80,10, +0x2bd800,2, +0x2bd828,2, +0x2bd850,2, +0x2bd878,2, +0x2bd8a0,6, +0x2bd9ac,1, +0x2bd9d8,4, +0x2bda00,6, +0x2bda20,6, +0x2bda40,6, +0x2bda60,6, +0x2bda80,3, +0x2bdc00,6, +0x2bdc20,3, +0x2bdc40,2, +0x2bdc60,1, +0x2c0000,5, +0x2c0020,4, +0x2c0034,17, +0x2c0080,1, +0x2c00a0,6, +0x2c0100,5, +0x2c0120,4, +0x2c0134,17, +0x2c0180,1, +0x2c01a0,6, +0x2c0200,5, +0x2c0220,4, +0x2c0234,17, +0x2c0280,1, +0x2c02a0,6, +0x2c0300,5, +0x2c0320,4, +0x2c0334,17, +0x2c0380,1, +0x2c03a0,6, +0x2c0500,6, +0x2c051c,7, +0x2c0540,1, +0x2c0c00,13, +0x2c0c40,12, +0x2c0c80,13, +0x2c0cc0,12, +0x2c0d00,6, +0x2c0d20,6, +0x2c0d80,14, +0x2c0dc0,2, +0x2c0e40,11, +0x2c0e80,6, +0x2c0ea0,6, +0x2c1000,2, +0x2c1010,5, +0x2c1060,32, +0x2c1100,8, +0x2c1180,3, +0x2c1190,2, +0x2c119c,5, +0x2c1218,9, +0x2c1240,3, +0x2c1250,6, +0x2c1280,1, +0x2c1288,6, +0x2c12a4,1, +0x2c1400,8, +0x2c1424,2, +0x2c1500,5, +0x2c1520,4, +0x2c1540,5, +0x2c1560,4, +0x2c1800,24, +0x2c1864,5, +0x2c1880,8, +0x2c1900,13, +0x2c1980,4, +0x2c19a0,6, +0x2c1a40,1, +0x2c1a60,1, +0x2c1a68,23, +0x2c1ac8,6, +0x2c1b00,17, +0x2c1b48,6, +0x2c1b80,12, +0x2c1c00,6, +0x2c1c20,6, +0x2c1c40,6, +0x2c1c60,3, +0x2c1d00,6, +0x2c1d20,6, +0x2c1d40,3, +0x2c2000,5, +0x2c2020,4, +0x2c2034,17, +0x2c2080,1, +0x2c20a0,6, +0x2c2100,5, +0x2c2120,4, +0x2c2134,17, +0x2c2180,1, +0x2c21a0,6, +0x2c2200,5, +0x2c2220,4, +0x2c2234,17, +0x2c2280,1, +0x2c22a0,6, +0x2c2300,5, +0x2c2320,4, +0x2c2334,17, +0x2c2380,1, +0x2c23a0,6, +0x2c2500,6, +0x2c251c,7, +0x2c2540,1, +0x2c2c00,13, +0x2c2c40,12, +0x2c2c80,13, +0x2c2cc0,12, +0x2c2d00,6, +0x2c2d20,6, +0x2c2d80,14, +0x2c2dc0,2, +0x2c2e40,11, +0x2c2e80,6, +0x2c2ea0,6, +0x2c3000,2, +0x2c3010,5, +0x2c3060,32, +0x2c3100,8, +0x2c3180,3, +0x2c3190,2, +0x2c319c,5, +0x2c3218,9, +0x2c3240,3, +0x2c3250,6, +0x2c3280,1, +0x2c3288,6, +0x2c32a4,1, +0x2c3400,8, +0x2c3424,2, +0x2c3500,5, +0x2c3520,4, +0x2c3540,5, +0x2c3560,4, +0x2c3800,24, +0x2c3864,5, +0x2c3880,8, +0x2c3900,13, +0x2c3980,4, +0x2c39a0,6, +0x2c3a40,1, +0x2c3a60,1, +0x2c3a68,23, +0x2c3ac8,6, +0x2c3b00,17, +0x2c3b48,6, +0x2c3b80,12, +0x2c3c00,6, +0x2c3c20,6, +0x2c3c40,6, +0x2c3c60,3, +0x2c3d00,6, +0x2c3d20,6, +0x2c3d40,3, +0x2c4000,29, +0x2c4078,4, +0x2c4090,2, +0x2c40a0,7, +0x2c40c0,11, +0x2c4100,14, +0x2c4140,14, +0x2c4180,61, +0x2c4278,4, +0x2c4290,2, +0x2c42a0,7, +0x2c42c0,11, +0x2c4300,14, +0x2c4340,14, +0x2c4380,61, +0x2c4478,4, +0x2c4490,2, +0x2c44a0,7, +0x2c44c0,11, +0x2c4500,14, +0x2c4540,14, +0x2c4580,61, +0x2c4678,4, +0x2c4690,2, +0x2c46a0,7, +0x2c46c0,11, +0x2c4700,14, +0x2c4740,14, +0x2c4780,67, +0x2c4890,1, +0x2c4a00,8, +0x2c4a24,15, +0x2c4a64,30, +0x2c4b00,4, +0x2c4b20,2, +0x2c4c00,6, +0x2c4c40,14, +0x2c4c80,9, +0x2c4d00,9, +0x2c4d2c,1, +0x2c4d40,3, +0x2c4d60,1, +0x2c4d80,3, +0x2c4e00,2, +0x2c4e0c,1, +0x2c4e14,5, +0x2c4e2c,1, +0x2c4e34,5, +0x2c4e4c,1, +0x2c4e54,5, +0x2c4e6c,1, +0x2c4e74,5, +0x2c4e8c,1, +0x2c4e94,5, +0x2c4eac,1, +0x2c4eb4,3, +0x2c5000,29, +0x2c5078,4, +0x2c5090,2, +0x2c50a0,7, +0x2c50c0,11, +0x2c5100,14, +0x2c5140,14, +0x2c5180,61, +0x2c5278,4, +0x2c5290,2, +0x2c52a0,7, +0x2c52c0,11, +0x2c5300,14, +0x2c5340,14, +0x2c5380,61, +0x2c5478,4, +0x2c5490,2, +0x2c54a0,7, +0x2c54c0,11, +0x2c5500,14, +0x2c5540,14, +0x2c5580,61, +0x2c5678,4, +0x2c5690,2, +0x2c56a0,7, +0x2c56c0,11, +0x2c5700,14, +0x2c5740,14, +0x2c5780,67, +0x2c5890,1, +0x2c5a00,8, +0x2c5a24,15, +0x2c5a64,30, +0x2c5b00,4, +0x2c5b20,2, +0x2c5c00,6, +0x2c5c40,14, +0x2c5c80,9, +0x2c5d00,9, +0x2c5d2c,1, +0x2c5d40,3, +0x2c5d60,1, +0x2c5d80,3, +0x2c5e00,2, +0x2c5e0c,1, +0x2c5e14,5, +0x2c5e2c,1, +0x2c5e34,5, +0x2c5e4c,1, +0x2c5e54,5, +0x2c5e6c,1, +0x2c5e74,5, +0x2c5e8c,1, +0x2c5e94,5, +0x2c5eac,1, +0x2c5eb4,3, +0x2c6000,14, +0x2c6070,3, +0x2c6080,6, +0x2c6100,9, +0x2c6204,1, +0x2c620c,6, +0x2c6240,13, +0x2c6280,16, +0x2c6800,19, +0x2c6850,10, +0x2c6880,19, +0x2c68d0,10, +0x2c6900,19, +0x2c6950,10, +0x2c6980,19, +0x2c69d0,10, +0x2c6a00,19, +0x2c6a50,10, +0x2c6a80,19, +0x2c6ad0,10, +0x2c6b00,19, +0x2c6b50,10, +0x2c6b80,19, +0x2c6bd0,10, +0x2c6c00,19, +0x2c6c60,6, +0x2c6c84,1, +0x2c6c94,8, +0x2c6cb8,9, +0x2c6ce0,4, +0x2c7000,6, +0x2c7020,3, +0x2c7040,7, +0x2c7060,6, +0x2c7100,5, +0x2c7138,1, +0x2c7144,1, +0x2c7150,2, +0x2c8000,6, +0x2c8020,3, +0x2c8030,9, +0x2c8100,6, +0x2c8120,10, +0x2c8150,8, +0x2c8400,1, +0x2c8428,1, +0x2c8450,1, +0x2c8478,1, +0x2c84a0,8, +0x2c85ac,1, +0x2c85d8,4, +0x2c8600,6, +0x2c8620,6, +0x2c8640,3, +0x2c8800,6, +0x2c8820,3, +0x2c8830,4, +0x2c8858,2, +0x2c8864,1, +0x2c8874,3, +0x2c8898,2, +0x2c88a4,1, +0x2c88b4,3, +0x2c9000,6, +0x2c9020,6, +0x2c9040,3, +0x2c9080,14, +0x2c90bc,1, +0x2c90c4,13, +0x2c90fc,1, +0x2c9200,20, +0x2c925c,30, +0x2c9300,24, +0x2c9380,2, +0x2c93a0,1, +0x2c93c0,11, +0x2c9404,3, +0x2c9420,11, +0x2c9460,3, +0x2c9480,6, +0x2c9500,6, +0x2c9520,6, +0x2c9540,1, +0x2c9558,2, +0x2c9600,17, +0x2c9800,410, +0x2ca000,6, +0x2ca020,6, +0x2ca040,3, +0x2ca080,14, +0x2ca0bc,1, +0x2ca0c4,13, +0x2ca0fc,1, +0x2ca200,20, +0x2ca25c,30, +0x2ca300,24, +0x2ca380,2, +0x2ca3a0,1, +0x2ca3c0,11, +0x2ca404,3, +0x2ca420,11, +0x2ca460,3, +0x2ca480,6, +0x2ca500,6, +0x2ca520,6, +0x2ca540,1, +0x2ca558,2, +0x2ca600,17, +0x2ca800,410, +0x2cb000,4, +0x2cb020,25, +0x2cb088,8, +0x2cb100,4, +0x2cb120,25, +0x2cb188,8, +0x2cb200,34, +0x2cb300,37, +0x2cb400,16, +0x2cb464,1, +0x2cb474,3, +0x2cb500,6, +0x2cb520,2, +0x2cb530,9, +0x2cb570,10, +0x2cb5a0,2, +0x2cb5b0,9, +0x2cb5f0,4, +0x2cb620,7, +0x2cb640,16, +0x2cb700,6, +0x2cb720,6, +0x2cb740,6, +0x2cb760,6, +0x2cb780,3, +0x2cb800,5, +0x2cb818,1, +0x2cb854,6, +0x2cb880,2, +0x2cb8a4,1, +0x2cb8ac,2, +0x2cba00,28, +0x2cba7c,13, +0x2cbab4,1, +0x2cbabc,10, +0x2cbb04,1, +0x2cbb0c,5, +0x2cbb24,1, +0x2cbb34,9, +0x2cbb60,6, +0x2cbb80,22, +0x2cbbe0,3, +0x2cbbf0,2, +0x2cbc00,5, +0x2cbc18,1, +0x2cbc54,6, +0x2cbc80,2, +0x2cbca4,1, +0x2cbcac,2, +0x2cbe00,28, +0x2cbe7c,13, +0x2cbeb4,1, +0x2cbebc,10, +0x2cbf04,1, +0x2cbf0c,5, +0x2cbf24,1, +0x2cbf34,9, +0x2cbf60,6, +0x2cbf80,22, +0x2cbfe0,3, +0x2cbff0,2, +0x2cc008,2, +0x2cc014,11, +0x2cc044,1, +0x2cc04c,3, +0x2cc05c,1, +0x2cc064,1, +0x2cc07c,1, +0x2cc500,2, +0x2cc518,1, +0x2cc520,3, +0x2cc540,6, +0x2cc580,10, +0x2cc808,2, +0x2cc814,11, +0x2cc844,1, +0x2cc84c,3, +0x2cc85c,1, +0x2cc864,1, +0x2cc87c,1, +0x2ccd00,2, +0x2ccd18,1, +0x2ccd20,3, +0x2ccd40,6, +0x2ccd80,10, +0x2cd800,2, +0x2cd828,2, +0x2cd850,2, +0x2cd878,2, +0x2cd8a0,6, +0x2cd9ac,1, +0x2cd9d8,4, +0x2cda00,6, +0x2cda20,6, +0x2cda40,6, +0x2cda60,6, +0x2cda80,3, +0x2cdc00,6, +0x2cdc20,3, +0x2cdc40,2, +0x2cdc60,1, +0x2d0000,5, +0x2d0020,4, +0x2d0034,17, +0x2d0080,1, +0x2d00a0,6, +0x2d0100,5, +0x2d0120,4, +0x2d0134,17, +0x2d0180,1, +0x2d01a0,6, +0x2d0200,5, +0x2d0220,4, +0x2d0234,17, +0x2d0280,1, +0x2d02a0,6, +0x2d0300,5, +0x2d0320,4, +0x2d0334,17, +0x2d0380,1, +0x2d03a0,6, +0x2d0500,6, +0x2d051c,7, +0x2d0540,1, +0x2d0c00,13, +0x2d0c40,12, +0x2d0c80,13, +0x2d0cc0,12, +0x2d0d00,6, +0x2d0d20,6, +0x2d0d80,14, +0x2d0dc0,2, +0x2d0e40,11, +0x2d0e80,6, +0x2d0ea0,6, +0x2d1000,2, +0x2d1010,5, +0x2d1060,32, +0x2d1100,8, +0x2d1180,3, +0x2d1190,2, +0x2d119c,5, +0x2d1218,9, +0x2d1240,3, +0x2d1250,6, +0x2d1280,1, +0x2d1288,6, +0x2d12a4,1, +0x2d1400,8, +0x2d1424,2, +0x2d1500,5, +0x2d1520,4, +0x2d1540,5, +0x2d1560,4, +0x2d1800,24, +0x2d1864,5, +0x2d1880,8, +0x2d1900,13, +0x2d1980,4, +0x2d19a0,6, +0x2d1a40,1, +0x2d1a60,1, +0x2d1a68,23, +0x2d1ac8,6, +0x2d1b00,17, +0x2d1b48,6, +0x2d1b80,12, +0x2d1c00,6, +0x2d1c20,6, +0x2d1c40,6, +0x2d1c60,3, +0x2d1d00,6, +0x2d1d20,6, +0x2d1d40,3, +0x2d2000,5, +0x2d2020,4, +0x2d2034,17, +0x2d2080,1, +0x2d20a0,6, +0x2d2100,5, +0x2d2120,4, +0x2d2134,17, +0x2d2180,1, +0x2d21a0,6, +0x2d2200,5, +0x2d2220,4, +0x2d2234,17, +0x2d2280,1, +0x2d22a0,6, +0x2d2300,5, +0x2d2320,4, +0x2d2334,17, +0x2d2380,1, +0x2d23a0,6, +0x2d2500,6, +0x2d251c,7, +0x2d2540,1, +0x2d2c00,13, +0x2d2c40,12, +0x2d2c80,13, +0x2d2cc0,12, +0x2d2d00,6, +0x2d2d20,6, +0x2d2d80,14, +0x2d2dc0,2, +0x2d2e40,11, +0x2d2e80,6, +0x2d2ea0,6, +0x2d3000,2, +0x2d3010,5, +0x2d3060,32, +0x2d3100,8, +0x2d3180,3, +0x2d3190,2, +0x2d319c,5, +0x2d3218,9, +0x2d3240,3, +0x2d3250,6, +0x2d3280,1, +0x2d3288,6, +0x2d32a4,1, +0x2d3400,8, +0x2d3424,2, +0x2d3500,5, +0x2d3520,4, +0x2d3540,5, +0x2d3560,4, +0x2d3800,24, +0x2d3864,5, +0x2d3880,8, +0x2d3900,13, +0x2d3980,4, +0x2d39a0,6, +0x2d3a40,1, +0x2d3a60,1, +0x2d3a68,23, +0x2d3ac8,6, +0x2d3b00,17, +0x2d3b48,6, +0x2d3b80,12, +0x2d3c00,6, +0x2d3c20,6, +0x2d3c40,6, +0x2d3c60,3, +0x2d3d00,6, +0x2d3d20,6, +0x2d3d40,3, +0x2d4000,29, +0x2d4078,4, +0x2d4090,2, +0x2d40a0,7, +0x2d40c0,11, +0x2d4100,14, +0x2d4140,14, +0x2d4180,61, +0x2d4278,4, +0x2d4290,2, +0x2d42a0,7, +0x2d42c0,11, +0x2d4300,14, +0x2d4340,14, +0x2d4380,61, +0x2d4478,4, +0x2d4490,2, +0x2d44a0,7, +0x2d44c0,11, +0x2d4500,14, +0x2d4540,14, +0x2d4580,61, +0x2d4678,4, +0x2d4690,2, +0x2d46a0,7, +0x2d46c0,11, +0x2d4700,14, +0x2d4740,14, +0x2d4780,67, +0x2d4890,1, +0x2d4a00,8, +0x2d4a24,15, +0x2d4a64,30, +0x2d4b00,4, +0x2d4b20,2, +0x2d4c00,6, +0x2d4c40,14, +0x2d4c80,9, +0x2d4d00,9, +0x2d4d2c,1, +0x2d4d40,3, +0x2d4d60,1, +0x2d4d80,3, +0x2d4e00,2, +0x2d4e0c,1, +0x2d4e14,5, +0x2d4e2c,1, +0x2d4e34,5, +0x2d4e4c,1, +0x2d4e54,5, +0x2d4e6c,1, +0x2d4e74,5, +0x2d4e8c,1, +0x2d4e94,5, +0x2d4eac,1, +0x2d4eb4,3, +0x2d5000,29, +0x2d5078,4, +0x2d5090,2, +0x2d50a0,7, +0x2d50c0,11, +0x2d5100,14, +0x2d5140,14, +0x2d5180,61, +0x2d5278,4, +0x2d5290,2, +0x2d52a0,7, +0x2d52c0,11, +0x2d5300,14, +0x2d5340,14, +0x2d5380,61, +0x2d5478,4, +0x2d5490,2, +0x2d54a0,7, +0x2d54c0,11, +0x2d5500,14, +0x2d5540,14, +0x2d5580,61, +0x2d5678,4, +0x2d5690,2, +0x2d56a0,7, +0x2d56c0,11, +0x2d5700,14, +0x2d5740,14, +0x2d5780,67, +0x2d5890,1, +0x2d5a00,8, +0x2d5a24,15, +0x2d5a64,30, +0x2d5b00,4, +0x2d5b20,2, +0x2d5c00,6, +0x2d5c40,14, +0x2d5c80,9, +0x2d5d00,9, +0x2d5d2c,1, +0x2d5d40,3, +0x2d5d60,1, +0x2d5d80,3, +0x2d5e00,2, +0x2d5e0c,1, +0x2d5e14,5, +0x2d5e2c,1, +0x2d5e34,5, +0x2d5e4c,1, +0x2d5e54,5, +0x2d5e6c,1, +0x2d5e74,5, +0x2d5e8c,1, +0x2d5e94,5, +0x2d5eac,1, +0x2d5eb4,3, +0x2d6000,14, +0x2d6070,3, +0x2d6080,6, +0x2d6100,9, +0x2d6204,1, +0x2d620c,6, +0x2d6240,13, +0x2d6280,16, +0x2d6400,8, +0x2d6424,15, +0x2d6464,15, +0x2d64a4,15, +0x2d64e4,30, +0x2d6580,10, +0x2d65ac,1, +0x2d65b4,5, +0x2d65cc,1, +0x2d65d4,5, +0x2d65ec,1, +0x2d65f4,13, +0x2d6680,4, +0x2d6694,2, +0x2d66a0,5, +0x2d66c0,5, +0x2d66e0,4, +0x2d6800,19, +0x2d6850,10, +0x2d6880,19, +0x2d68d0,10, +0x2d6900,19, +0x2d6950,10, +0x2d6980,19, +0x2d69d0,10, +0x2d6a00,19, +0x2d6a50,10, +0x2d6a80,19, +0x2d6ad0,10, +0x2d6b00,19, +0x2d6b50,10, +0x2d6b80,19, +0x2d6bd0,10, +0x2d6c00,19, +0x2d6c60,6, +0x2d6c84,1, +0x2d6c94,8, +0x2d6cb8,9, +0x2d6ce0,4, +0x2d7000,6, +0x2d7020,3, +0x2d7040,7, +0x2d7060,6, +0x2d7100,5, +0x2d7138,1, +0x2d7144,1, +0x2d7150,2, +0x2d8000,6, +0x2d8020,3, +0x2d8030,9, +0x2d8100,6, +0x2d8120,10, +0x2d8150,8, +0x2d8400,1, +0x2d8428,1, +0x2d8450,1, +0x2d8478,1, +0x2d84a0,8, +0x2d85ac,1, +0x2d85d8,4, +0x2d8600,6, +0x2d8620,6, +0x2d8640,3, +0x2d8800,6, +0x2d8820,3, +0x2d8830,4, +0x2d8858,2, +0x2d8864,1, +0x2d8874,3, +0x2d8898,2, +0x2d88a4,1, +0x2d88b4,3, +0x2d9000,6, +0x2d9020,6, +0x2d9040,3, +0x2d9080,14, +0x2d90bc,1, +0x2d90c4,13, +0x2d90fc,1, +0x2d9200,20, +0x2d925c,30, +0x2d9300,24, +0x2d9380,2, +0x2d93a0,1, +0x2d93c0,11, +0x2d9404,3, +0x2d9420,11, +0x2d9460,3, +0x2d9480,6, +0x2d9500,6, +0x2d9520,6, +0x2d9540,1, +0x2d9558,2, +0x2d9600,17, +0x2d9800,410, +0x2da000,6, +0x2da020,6, +0x2da040,3, +0x2da080,14, +0x2da0bc,1, +0x2da0c4,13, +0x2da0fc,1, +0x2da200,20, +0x2da25c,30, +0x2da300,24, +0x2da380,2, +0x2da3a0,1, +0x2da3c0,11, +0x2da404,3, +0x2da420,11, +0x2da460,3, +0x2da480,6, +0x2da500,6, +0x2da520,6, +0x2da540,1, +0x2da558,2, +0x2da600,17, +0x2da800,410, +0x2db000,4, +0x2db020,25, +0x2db088,8, +0x2db100,4, +0x2db120,25, +0x2db188,8, +0x2db200,34, +0x2db300,37, +0x2db400,16, +0x2db464,1, +0x2db474,3, +0x2db500,6, +0x2db520,2, +0x2db530,9, +0x2db570,10, +0x2db5a0,2, +0x2db5b0,9, +0x2db5f0,4, +0x2db620,7, +0x2db640,16, +0x2db700,6, +0x2db720,6, +0x2db740,6, +0x2db760,6, +0x2db780,3, +0x2db800,5, +0x2db818,1, +0x2db854,6, +0x2db880,2, +0x2db8a4,1, +0x2db8ac,2, +0x2dba00,28, +0x2dba7c,13, +0x2dbab4,1, +0x2dbabc,10, +0x2dbb04,1, +0x2dbb0c,5, +0x2dbb24,1, +0x2dbb34,9, +0x2dbb60,6, +0x2dbb80,22, +0x2dbbe0,3, +0x2dbbf0,2, +0x2dbc00,5, +0x2dbc18,1, +0x2dbc54,6, +0x2dbc80,2, +0x2dbca4,1, +0x2dbcac,2, +0x2dbe00,28, +0x2dbe7c,13, +0x2dbeb4,1, +0x2dbebc,10, +0x2dbf04,1, +0x2dbf0c,5, +0x2dbf24,1, +0x2dbf34,9, +0x2dbf60,6, +0x2dbf80,22, +0x2dbfe0,3, +0x2dbff0,2, +0x2dc008,2, +0x2dc014,11, +0x2dc044,1, +0x2dc04c,3, +0x2dc05c,1, +0x2dc064,1, +0x2dc07c,1, +0x2dc500,2, +0x2dc518,1, +0x2dc520,3, +0x2dc540,6, +0x2dc580,10, +0x2dc808,2, +0x2dc814,11, +0x2dc844,1, +0x2dc84c,3, +0x2dc85c,1, +0x2dc864,1, +0x2dc87c,1, +0x2dcd00,2, +0x2dcd18,1, +0x2dcd20,3, +0x2dcd40,6, +0x2dcd80,10, +0x2dd800,2, +0x2dd828,2, +0x2dd850,2, +0x2dd878,2, +0x2dd8a0,6, +0x2dd9ac,1, +0x2dd9d8,4, +0x2dda00,6, +0x2dda20,6, +0x2dda40,6, +0x2dda60,6, +0x2dda80,3, +0x2ddc00,6, +0x2ddc20,3, +0x2ddc40,2, +0x2ddc60,1, +0x2e0000,5, +0x2e0020,4, +0x2e0034,17, +0x2e0080,1, +0x2e00a0,6, +0x2e0100,5, +0x2e0120,4, +0x2e0134,17, +0x2e0180,1, +0x2e01a0,6, +0x2e0200,5, +0x2e0220,4, +0x2e0234,17, +0x2e0280,1, +0x2e02a0,6, +0x2e0300,5, +0x2e0320,4, +0x2e0334,17, +0x2e0380,1, +0x2e03a0,6, +0x2e0500,6, +0x2e051c,7, +0x2e0540,1, +0x2e0c00,13, +0x2e0c40,12, +0x2e0c80,13, +0x2e0cc0,12, +0x2e0d00,6, +0x2e0d20,6, +0x2e0d80,14, +0x2e0dc0,2, +0x2e0e40,11, +0x2e0e80,6, +0x2e0ea0,6, +0x2e1000,2, +0x2e1010,5, +0x2e1060,32, +0x2e1100,8, +0x2e1180,3, +0x2e1190,2, +0x2e119c,5, +0x2e1218,9, +0x2e1240,3, +0x2e1250,6, +0x2e1280,1, +0x2e1288,6, +0x2e12a4,1, +0x2e1400,8, +0x2e1424,2, +0x2e1500,5, +0x2e1520,4, +0x2e1540,5, +0x2e1560,4, +0x2e1800,24, +0x2e1864,5, +0x2e1880,8, +0x2e1900,13, +0x2e1980,4, +0x2e19a0,6, +0x2e1a40,1, +0x2e1a60,1, +0x2e1a68,23, +0x2e1ac8,6, +0x2e1b00,17, +0x2e1b48,6, +0x2e1b80,12, +0x2e1c00,6, +0x2e1c20,6, +0x2e1c40,6, +0x2e1c60,3, +0x2e1d00,6, +0x2e1d20,6, +0x2e1d40,3, +0x2e2000,5, +0x2e2020,4, +0x2e2034,17, +0x2e2080,1, +0x2e20a0,6, +0x2e2100,5, +0x2e2120,4, +0x2e2134,17, +0x2e2180,1, +0x2e21a0,6, +0x2e2200,5, +0x2e2220,4, +0x2e2234,17, +0x2e2280,1, +0x2e22a0,6, +0x2e2300,5, +0x2e2320,4, +0x2e2334,17, +0x2e2380,1, +0x2e23a0,6, +0x2e2500,6, +0x2e251c,7, +0x2e2540,1, +0x2e2c00,13, +0x2e2c40,12, +0x2e2c80,13, +0x2e2cc0,12, +0x2e2d00,6, +0x2e2d20,6, +0x2e2d80,14, +0x2e2dc0,2, +0x2e2e40,11, +0x2e2e80,6, +0x2e2ea0,6, +0x2e3000,2, +0x2e3010,5, +0x2e3060,32, +0x2e3100,8, +0x2e3180,3, +0x2e3190,2, +0x2e319c,5, +0x2e3218,9, +0x2e3240,3, +0x2e3250,6, +0x2e3280,1, +0x2e3288,6, +0x2e32a4,1, +0x2e3400,8, +0x2e3424,2, +0x2e3500,5, +0x2e3520,4, +0x2e3540,5, +0x2e3560,4, +0x2e3800,24, +0x2e3864,5, +0x2e3880,8, +0x2e3900,13, +0x2e3980,4, +0x2e39a0,6, +0x2e3a40,1, +0x2e3a60,1, +0x2e3a68,23, +0x2e3ac8,6, +0x2e3b00,17, +0x2e3b48,6, +0x2e3b80,12, +0x2e3c00,6, +0x2e3c20,6, +0x2e3c40,6, +0x2e3c60,3, +0x2e3d00,6, +0x2e3d20,6, +0x2e3d40,3, +0x2e4000,29, +0x2e4078,4, +0x2e4090,2, +0x2e40a0,7, +0x2e40c0,11, +0x2e4100,14, +0x2e4140,14, +0x2e4180,61, +0x2e4278,4, +0x2e4290,2, +0x2e42a0,7, +0x2e42c0,11, +0x2e4300,14, +0x2e4340,14, +0x2e4380,61, +0x2e4478,4, +0x2e4490,2, +0x2e44a0,7, +0x2e44c0,11, +0x2e4500,14, +0x2e4540,14, +0x2e4580,61, +0x2e4678,4, +0x2e4690,2, +0x2e46a0,7, +0x2e46c0,11, +0x2e4700,14, +0x2e4740,14, +0x2e4780,67, +0x2e4890,1, +0x2e4a00,8, +0x2e4a24,15, +0x2e4a64,30, +0x2e4b00,4, +0x2e4b20,2, +0x2e4c00,6, +0x2e4c40,14, +0x2e4c80,9, +0x2e4d00,9, +0x2e4d2c,1, +0x2e4d40,3, +0x2e4d60,1, +0x2e4d80,3, +0x2e4e00,2, +0x2e4e0c,1, +0x2e4e14,5, +0x2e4e2c,1, +0x2e4e34,5, +0x2e4e4c,1, +0x2e4e54,5, +0x2e4e6c,1, +0x2e4e74,5, +0x2e4e8c,1, +0x2e4e94,5, +0x2e4eac,1, +0x2e4eb4,3, +0x2e5000,29, +0x2e5078,4, +0x2e5090,2, +0x2e50a0,7, +0x2e50c0,11, +0x2e5100,14, +0x2e5140,14, +0x2e5180,61, +0x2e5278,4, +0x2e5290,2, +0x2e52a0,7, +0x2e52c0,11, +0x2e5300,14, +0x2e5340,14, +0x2e5380,61, +0x2e5478,4, +0x2e5490,2, +0x2e54a0,7, +0x2e54c0,11, +0x2e5500,14, +0x2e5540,14, +0x2e5580,61, +0x2e5678,4, +0x2e5690,2, +0x2e56a0,7, +0x2e56c0,11, +0x2e5700,14, +0x2e5740,14, +0x2e5780,67, +0x2e5890,1, +0x2e5a00,8, +0x2e5a24,15, +0x2e5a64,30, +0x2e5b00,4, +0x2e5b20,2, +0x2e5c00,6, +0x2e5c40,14, +0x2e5c80,9, +0x2e5d00,9, +0x2e5d2c,1, +0x2e5d40,3, +0x2e5d60,1, +0x2e5d80,3, +0x2e5e00,2, +0x2e5e0c,1, +0x2e5e14,5, +0x2e5e2c,1, +0x2e5e34,5, +0x2e5e4c,1, +0x2e5e54,5, +0x2e5e6c,1, +0x2e5e74,5, +0x2e5e8c,1, +0x2e5e94,5, +0x2e5eac,1, +0x2e5eb4,3, +0x2e6000,14, +0x2e6070,3, +0x2e6080,6, +0x2e6100,9, +0x2e6204,1, +0x2e620c,6, +0x2e6240,13, +0x2e6280,16, +0x2e6800,19, +0x2e6850,10, +0x2e6880,19, +0x2e68d0,10, +0x2e6900,19, +0x2e6950,10, +0x2e6980,19, +0x2e69d0,10, +0x2e6a00,19, +0x2e6a50,10, +0x2e6a80,19, +0x2e6ad0,10, +0x2e6b00,19, +0x2e6b50,10, +0x2e6b80,19, +0x2e6bd0,10, +0x2e6c00,19, +0x2e6c60,6, +0x2e6c84,1, +0x2e6c94,8, +0x2e6cb8,9, +0x2e6ce0,4, +0x2e7000,6, +0x2e7020,3, +0x2e7040,7, +0x2e7060,6, +0x2e7100,5, +0x2e7138,1, +0x2e7144,1, +0x2e7150,2, +0x2e8000,6, +0x2e8020,3, +0x2e8030,9, +0x2e8100,6, +0x2e8120,10, +0x2e8150,8, +0x2e8400,1, +0x2e8428,1, +0x2e8450,1, +0x2e8478,1, +0x2e84a0,8, +0x2e85ac,1, +0x2e85d8,4, +0x2e8600,6, +0x2e8620,6, +0x2e8640,3, +0x2e8800,6, +0x2e8820,3, +0x2e8830,4, +0x2e8858,2, +0x2e8864,1, +0x2e8874,3, +0x2e8898,2, +0x2e88a4,1, +0x2e88b4,3, +0x2e9000,6, +0x2e9020,6, +0x2e9040,3, +0x2e9080,14, +0x2e90bc,1, +0x2e90c4,13, +0x2e90fc,1, +0x2e9200,20, +0x2e925c,30, +0x2e9300,24, +0x2e9380,2, +0x2e93a0,1, +0x2e93c0,11, +0x2e9404,3, +0x2e9420,11, +0x2e9460,3, +0x2e9480,6, +0x2e9500,6, +0x2e9520,6, +0x2e9540,1, +0x2e9558,2, +0x2e9600,17, +0x2e9800,410, +0x2ea000,6, +0x2ea020,6, +0x2ea040,3, +0x2ea080,14, +0x2ea0bc,1, +0x2ea0c4,13, +0x2ea0fc,1, +0x2ea200,20, +0x2ea25c,30, +0x2ea300,24, +0x2ea380,2, +0x2ea3a0,1, +0x2ea3c0,11, +0x2ea404,3, +0x2ea420,11, +0x2ea460,3, +0x2ea480,6, +0x2ea500,6, +0x2ea520,6, +0x2ea540,1, +0x2ea558,2, +0x2ea600,17, +0x2ea800,410, +0x2eb000,4, +0x2eb020,25, +0x2eb088,8, +0x2eb100,4, +0x2eb120,25, +0x2eb188,8, +0x2eb200,34, +0x2eb300,37, +0x2eb400,16, +0x2eb464,1, +0x2eb474,3, +0x2eb500,6, +0x2eb520,2, +0x2eb530,9, +0x2eb570,10, +0x2eb5a0,2, +0x2eb5b0,9, +0x2eb5f0,4, +0x2eb620,7, +0x2eb640,16, +0x2eb700,6, +0x2eb720,6, +0x2eb740,6, +0x2eb760,6, +0x2eb780,3, +0x2eb800,5, +0x2eb818,1, +0x2eb854,6, +0x2eb880,2, +0x2eb8a4,1, +0x2eb8ac,2, +0x2eba00,28, +0x2eba7c,13, +0x2ebab4,1, +0x2ebabc,10, +0x2ebb04,1, +0x2ebb0c,5, +0x2ebb24,1, +0x2ebb34,9, +0x2ebb60,6, +0x2ebb80,22, +0x2ebbe0,3, +0x2ebbf0,2, +0x2ebc00,5, +0x2ebc18,1, +0x2ebc54,6, +0x2ebc80,2, +0x2ebca4,1, +0x2ebcac,2, +0x2ebe00,28, +0x2ebe7c,13, +0x2ebeb4,1, +0x2ebebc,10, +0x2ebf04,1, +0x2ebf0c,5, +0x2ebf24,1, +0x2ebf34,9, +0x2ebf60,6, +0x2ebf80,22, +0x2ebfe0,3, +0x2ebff0,2, +0x2ec008,2, +0x2ec014,11, +0x2ec044,1, +0x2ec04c,3, +0x2ec05c,1, +0x2ec064,1, +0x2ec07c,1, +0x2ec500,2, +0x2ec518,1, +0x2ec520,3, +0x2ec540,6, +0x2ec580,10, +0x2ec808,2, +0x2ec814,11, +0x2ec844,1, +0x2ec84c,3, +0x2ec85c,1, +0x2ec864,1, +0x2ec87c,1, +0x2ecd00,2, +0x2ecd18,1, +0x2ecd20,3, +0x2ecd40,6, +0x2ecd80,10, +0x2ed800,2, +0x2ed828,2, +0x2ed850,2, +0x2ed878,2, +0x2ed8a0,6, +0x2ed9ac,1, +0x2ed9d8,4, +0x2eda00,6, +0x2eda20,6, +0x2eda40,6, +0x2eda60,6, +0x2eda80,3, +0x2edc00,6, +0x2edc20,3, +0x2edc40,2, +0x2edc60,1, +0x2f0000,5, +0x2f0020,4, +0x2f0034,17, +0x2f0080,1, +0x2f00a0,6, +0x2f0100,5, +0x2f0120,4, +0x2f0134,17, +0x2f0180,1, +0x2f01a0,6, +0x2f0200,5, +0x2f0220,4, +0x2f0234,17, +0x2f0280,1, +0x2f02a0,6, +0x2f0300,5, +0x2f0320,4, +0x2f0334,17, +0x2f0380,1, +0x2f03a0,6, +0x2f0500,6, +0x2f051c,7, +0x2f0540,1, +0x2f0c00,13, +0x2f0c40,12, +0x2f0c80,13, +0x2f0cc0,12, +0x2f0d00,6, +0x2f0d20,6, +0x2f0d80,14, +0x2f0dc0,2, +0x2f0e40,11, +0x2f0e80,6, +0x2f0ea0,6, +0x2f1000,2, +0x2f1010,5, +0x2f1060,32, +0x2f1100,8, +0x2f1180,3, +0x2f1190,2, +0x2f119c,5, +0x2f1218,9, +0x2f1240,3, +0x2f1250,6, +0x2f1280,1, +0x2f1288,6, +0x2f12a4,1, +0x2f1400,8, +0x2f1424,2, +0x2f1500,5, +0x2f1520,4, +0x2f1540,5, +0x2f1560,4, +0x2f1800,24, +0x2f1864,5, +0x2f1880,8, +0x2f1900,13, +0x2f1980,4, +0x2f19a0,6, +0x2f1a40,1, +0x2f1a60,1, +0x2f1a68,23, +0x2f1ac8,6, +0x2f1b00,17, +0x2f1b48,6, +0x2f1b80,12, +0x2f1c00,6, +0x2f1c20,6, +0x2f1c40,6, +0x2f1c60,3, +0x2f1d00,6, +0x2f1d20,6, +0x2f1d40,3, +0x2f2000,5, +0x2f2020,4, +0x2f2034,17, +0x2f2080,1, +0x2f20a0,6, +0x2f2100,5, +0x2f2120,4, +0x2f2134,17, +0x2f2180,1, +0x2f21a0,6, +0x2f2200,5, +0x2f2220,4, +0x2f2234,17, +0x2f2280,1, +0x2f22a0,6, +0x2f2300,5, +0x2f2320,4, +0x2f2334,17, +0x2f2380,1, +0x2f23a0,6, +0x2f2500,6, +0x2f251c,7, +0x2f2540,1, +0x2f2c00,13, +0x2f2c40,12, +0x2f2c80,13, +0x2f2cc0,12, +0x2f2d00,6, +0x2f2d20,6, +0x2f2d80,14, +0x2f2dc0,2, +0x2f2e40,11, +0x2f2e80,6, +0x2f2ea0,6, +0x2f3000,2, +0x2f3010,5, +0x2f3060,32, +0x2f3100,8, +0x2f3180,3, +0x2f3190,2, +0x2f319c,5, +0x2f3218,9, +0x2f3240,3, +0x2f3250,6, +0x2f3280,1, +0x2f3288,6, +0x2f32a4,1, +0x2f3400,8, +0x2f3424,2, +0x2f3500,5, +0x2f3520,4, +0x2f3540,5, +0x2f3560,4, +0x2f3800,24, +0x2f3864,5, +0x2f3880,8, +0x2f3900,13, +0x2f3980,4, +0x2f39a0,6, +0x2f3a40,1, +0x2f3a60,1, +0x2f3a68,23, +0x2f3ac8,6, +0x2f3b00,17, +0x2f3b48,6, +0x2f3b80,12, +0x2f3c00,6, +0x2f3c20,6, +0x2f3c40,6, +0x2f3c60,3, +0x2f3d00,6, +0x2f3d20,6, +0x2f3d40,3, +0x2f4000,29, +0x2f4078,4, +0x2f4090,2, +0x2f40a0,7, +0x2f40c0,11, +0x2f4100,14, +0x2f4140,14, +0x2f4180,61, +0x2f4278,4, +0x2f4290,2, +0x2f42a0,7, +0x2f42c0,11, +0x2f4300,14, +0x2f4340,14, +0x2f4380,61, +0x2f4478,4, +0x2f4490,2, +0x2f44a0,7, +0x2f44c0,11, +0x2f4500,14, +0x2f4540,14, +0x2f4580,61, +0x2f4678,4, +0x2f4690,2, +0x2f46a0,7, +0x2f46c0,11, +0x2f4700,14, +0x2f4740,14, +0x2f4780,67, +0x2f4890,1, +0x2f4a00,8, +0x2f4a24,15, +0x2f4a64,30, +0x2f4b00,4, +0x2f4b20,2, +0x2f4c00,6, +0x2f4c40,14, +0x2f4c80,9, +0x2f4d00,9, +0x2f4d2c,1, +0x2f4d40,3, +0x2f4d60,1, +0x2f4d80,3, +0x2f4e00,2, +0x2f4e0c,1, +0x2f4e14,5, +0x2f4e2c,1, +0x2f4e34,5, +0x2f4e4c,1, +0x2f4e54,5, +0x2f4e6c,1, +0x2f4e74,5, +0x2f4e8c,1, +0x2f4e94,5, +0x2f4eac,1, +0x2f4eb4,3, +0x2f5000,29, +0x2f5078,4, +0x2f5090,2, +0x2f50a0,7, +0x2f50c0,11, +0x2f5100,14, +0x2f5140,14, +0x2f5180,61, +0x2f5278,4, +0x2f5290,2, +0x2f52a0,7, +0x2f52c0,11, +0x2f5300,14, +0x2f5340,14, +0x2f5380,61, +0x2f5478,4, +0x2f5490,2, +0x2f54a0,7, +0x2f54c0,11, +0x2f5500,14, +0x2f5540,14, +0x2f5580,61, +0x2f5678,4, +0x2f5690,2, +0x2f56a0,7, +0x2f56c0,11, +0x2f5700,14, +0x2f5740,14, +0x2f5780,67, +0x2f5890,1, +0x2f5a00,8, +0x2f5a24,15, +0x2f5a64,30, +0x2f5b00,4, +0x2f5b20,2, +0x2f5c00,6, +0x2f5c40,14, +0x2f5c80,9, +0x2f5d00,9, +0x2f5d2c,1, +0x2f5d40,3, +0x2f5d60,1, +0x2f5d80,3, +0x2f5e00,2, +0x2f5e0c,1, +0x2f5e14,5, +0x2f5e2c,1, +0x2f5e34,5, +0x2f5e4c,1, +0x2f5e54,5, +0x2f5e6c,1, +0x2f5e74,5, +0x2f5e8c,1, +0x2f5e94,5, +0x2f5eac,1, +0x2f5eb4,3, +0x2f6000,14, +0x2f6070,3, +0x2f6080,6, +0x2f6100,9, +0x2f6204,1, +0x2f620c,6, +0x2f6240,13, +0x2f6280,16, +0x2f6800,19, +0x2f6850,10, +0x2f6880,19, +0x2f68d0,10, +0x2f6900,19, +0x2f6950,10, +0x2f6980,19, +0x2f69d0,10, +0x2f6a00,19, +0x2f6a50,10, +0x2f6a80,19, +0x2f6ad0,10, +0x2f6b00,19, +0x2f6b50,10, +0x2f6b80,19, +0x2f6bd0,10, +0x2f6c00,19, +0x2f6c60,6, +0x2f6c84,1, +0x2f6c94,8, +0x2f6cb8,9, +0x2f6ce0,4, +0x2f7000,6, +0x2f7020,3, +0x2f7040,7, +0x2f7060,6, +0x2f7100,5, +0x2f7138,1, +0x2f7144,1, +0x2f7150,2, +0x2f8000,6, +0x2f8020,3, +0x2f8030,9, +0x2f8100,6, +0x2f8120,10, +0x2f8150,8, +0x2f8400,1, +0x2f8428,1, +0x2f8450,1, +0x2f8478,1, +0x2f84a0,8, +0x2f85ac,1, +0x2f85d8,4, +0x2f8600,6, +0x2f8620,6, +0x2f8640,3, +0x2f8800,6, +0x2f8820,3, +0x2f8830,4, +0x2f8858,2, +0x2f8864,1, +0x2f8874,3, +0x2f8898,2, +0x2f88a4,1, +0x2f88b4,3, +0x2f9000,6, +0x2f9020,6, +0x2f9040,3, +0x2f9080,14, +0x2f90bc,1, +0x2f90c4,13, +0x2f90fc,1, +0x2f9200,20, +0x2f925c,30, +0x2f9300,24, +0x2f9380,2, +0x2f93a0,1, +0x2f93c0,11, +0x2f9404,3, +0x2f9420,11, +0x2f9460,3, +0x2f9480,6, +0x2f9500,6, +0x2f9520,6, +0x2f9540,1, +0x2f9558,2, +0x2f9600,17, +0x2f9800,410, +0x2fa000,6, +0x2fa020,6, +0x2fa040,3, +0x2fa080,14, +0x2fa0bc,1, +0x2fa0c4,13, +0x2fa0fc,1, +0x2fa200,20, +0x2fa25c,30, +0x2fa300,24, +0x2fa380,2, +0x2fa3a0,1, +0x2fa3c0,11, +0x2fa404,3, +0x2fa420,11, +0x2fa460,3, +0x2fa480,6, +0x2fa500,6, +0x2fa520,6, +0x2fa540,1, +0x2fa558,2, +0x2fa600,17, +0x2fa800,410, +0x2fb000,4, +0x2fb020,25, +0x2fb088,8, +0x2fb100,4, +0x2fb120,25, +0x2fb188,8, +0x2fb200,34, +0x2fb300,37, +0x2fb400,16, +0x2fb464,1, +0x2fb474,3, +0x2fb500,6, +0x2fb520,2, +0x2fb530,9, +0x2fb570,10, +0x2fb5a0,2, +0x2fb5b0,9, +0x2fb5f0,4, +0x2fb620,7, +0x2fb640,16, +0x2fb700,6, +0x2fb720,6, +0x2fb740,6, +0x2fb760,6, +0x2fb780,3, +0x2fb800,5, +0x2fb818,1, +0x2fb854,6, +0x2fb880,2, +0x2fb8a4,1, +0x2fb8ac,2, +0x2fba00,28, +0x2fba7c,13, +0x2fbab4,1, +0x2fbabc,10, +0x2fbb04,1, +0x2fbb0c,5, +0x2fbb24,1, +0x2fbb34,9, +0x2fbb60,6, +0x2fbb80,22, +0x2fbbe0,3, +0x2fbbf0,2, +0x2fbc00,5, +0x2fbc18,1, +0x2fbc54,6, +0x2fbc80,2, +0x2fbca4,1, +0x2fbcac,2, +0x2fbe00,28, +0x2fbe7c,13, +0x2fbeb4,1, +0x2fbebc,10, +0x2fbf04,1, +0x2fbf0c,5, +0x2fbf24,1, +0x2fbf34,9, +0x2fbf60,6, +0x2fbf80,22, +0x2fbfe0,3, +0x2fbff0,2, +0x2fc008,2, +0x2fc014,11, +0x2fc044,1, +0x2fc04c,3, +0x2fc05c,1, +0x2fc064,1, +0x2fc07c,1, +0x2fc500,2, +0x2fc518,1, +0x2fc520,3, +0x2fc540,6, +0x2fc580,10, +0x2fc808,2, +0x2fc814,11, +0x2fc844,1, +0x2fc84c,3, +0x2fc85c,1, +0x2fc864,1, +0x2fc87c,1, +0x2fcd00,2, +0x2fcd18,1, +0x2fcd20,3, +0x2fcd40,6, +0x2fcd80,10, +0x2fd800,2, +0x2fd828,2, +0x2fd850,2, +0x2fd878,2, +0x2fd8a0,6, +0x2fd9ac,1, +0x2fd9d8,4, +0x2fda00,6, +0x2fda20,6, +0x2fda40,6, +0x2fda60,6, +0x2fda80,3, +0x2fdc00,6, +0x2fdc20,3, +0x2fdc40,2, +0x2fdc60,1, +0x300000,5, +0x300020,4, +0x300034,17, +0x300080,1, +0x3000a0,6, +0x300100,5, +0x300120,4, +0x300134,17, +0x300180,1, +0x3001a0,6, +0x300200,5, +0x300220,4, +0x300234,17, +0x300280,1, +0x3002a0,6, +0x300300,5, +0x300320,4, +0x300334,17, +0x300380,1, +0x3003a0,6, +0x300500,6, +0x30051c,7, +0x300540,1, +0x300c00,13, +0x300c40,12, +0x300c80,13, +0x300cc0,12, +0x300d00,6, +0x300d20,6, +0x300d80,14, +0x300dc0,2, +0x300e40,11, +0x300e80,6, +0x300ea0,6, +0x301000,2, +0x301010,5, +0x301060,32, +0x301100,8, +0x301180,3, +0x301190,2, +0x30119c,5, +0x301218,9, +0x301240,3, +0x301250,6, +0x301280,1, +0x301288,6, +0x3012a4,1, +0x301400,8, +0x301424,2, +0x301500,5, +0x301520,4, +0x301540,5, +0x301560,4, +0x301800,24, +0x301864,5, +0x301880,8, +0x301900,13, +0x301980,4, +0x3019a0,6, +0x301a40,1, +0x301a60,1, +0x301a68,23, +0x301ac8,6, +0x301b00,17, +0x301b48,6, +0x301b80,12, +0x301c00,6, +0x301c20,6, +0x301c40,6, +0x301c60,3, +0x301d00,6, +0x301d20,6, +0x301d40,3, +0x302000,5, +0x302020,4, +0x302034,17, +0x302080,1, +0x3020a0,6, +0x302100,5, +0x302120,4, +0x302134,17, +0x302180,1, +0x3021a0,6, +0x302200,5, +0x302220,4, +0x302234,17, +0x302280,1, +0x3022a0,6, +0x302300,5, +0x302320,4, +0x302334,17, +0x302380,1, +0x3023a0,6, +0x302500,6, +0x30251c,7, +0x302540,1, +0x302c00,13, +0x302c40,12, +0x302c80,13, +0x302cc0,12, +0x302d00,6, +0x302d20,6, +0x302d80,14, +0x302dc0,2, +0x302e40,11, +0x302e80,6, +0x302ea0,6, +0x303000,2, +0x303010,5, +0x303060,32, +0x303100,8, +0x303180,3, +0x303190,2, +0x30319c,5, +0x303218,9, +0x303240,3, +0x303250,6, +0x303280,1, +0x303288,6, +0x3032a4,1, +0x303400,8, +0x303424,2, +0x303500,5, +0x303520,4, +0x303540,5, +0x303560,4, +0x303800,24, +0x303864,5, +0x303880,8, +0x303900,13, +0x303980,4, +0x3039a0,6, +0x303a40,1, +0x303a60,1, +0x303a68,23, +0x303ac8,6, +0x303b00,17, +0x303b48,6, +0x303b80,12, +0x303c00,6, +0x303c20,6, +0x303c40,6, +0x303c60,3, +0x303d00,6, +0x303d20,6, +0x303d40,3, +0x304000,29, +0x304078,4, +0x304090,2, +0x3040a0,7, +0x3040c0,11, +0x304100,14, +0x304140,14, +0x304180,61, +0x304278,4, +0x304290,2, +0x3042a0,7, +0x3042c0,11, +0x304300,14, +0x304340,14, +0x304380,61, +0x304478,4, +0x304490,2, +0x3044a0,7, +0x3044c0,11, +0x304500,14, +0x304540,14, +0x304580,61, +0x304678,4, +0x304690,2, +0x3046a0,7, +0x3046c0,11, +0x304700,14, +0x304740,14, +0x304780,67, +0x304890,1, +0x304a00,8, +0x304a24,15, +0x304a64,30, +0x304b00,4, +0x304b20,2, +0x304c00,6, +0x304c40,14, +0x304c80,9, +0x304d00,9, +0x304d2c,1, +0x304d40,3, +0x304d60,1, +0x304d80,3, +0x304e00,2, +0x304e0c,1, +0x304e14,5, +0x304e2c,1, +0x304e34,5, +0x304e4c,1, +0x304e54,5, +0x304e6c,1, +0x304e74,5, +0x304e8c,1, +0x304e94,5, +0x304eac,1, +0x304eb4,3, +0x305000,29, +0x305078,4, +0x305090,2, +0x3050a0,7, +0x3050c0,11, +0x305100,14, +0x305140,14, +0x305180,61, +0x305278,4, +0x305290,2, +0x3052a0,7, +0x3052c0,11, +0x305300,14, +0x305340,14, +0x305380,61, +0x305478,4, +0x305490,2, +0x3054a0,7, +0x3054c0,11, +0x305500,14, +0x305540,14, +0x305580,61, +0x305678,4, +0x305690,2, +0x3056a0,7, +0x3056c0,11, +0x305700,14, +0x305740,14, +0x305780,67, +0x305890,1, +0x305a00,8, +0x305a24,15, +0x305a64,30, +0x305b00,4, +0x305b20,2, +0x305c00,6, +0x305c40,14, +0x305c80,9, +0x305d00,9, +0x305d2c,1, +0x305d40,3, +0x305d60,1, +0x305d80,3, +0x305e00,2, +0x305e0c,1, +0x305e14,5, +0x305e2c,1, +0x305e34,5, +0x305e4c,1, +0x305e54,5, +0x305e6c,1, +0x305e74,5, +0x305e8c,1, +0x305e94,5, +0x305eac,1, +0x305eb4,3, +0x306000,14, +0x306070,3, +0x306080,6, +0x306100,9, +0x306204,1, +0x30620c,6, +0x306240,13, +0x306280,16, +0x306800,19, +0x306850,10, +0x306880,19, +0x3068d0,10, +0x306900,19, +0x306950,10, +0x306980,19, +0x3069d0,10, +0x306a00,19, +0x306a50,10, +0x306a80,19, +0x306ad0,10, +0x306b00,19, +0x306b50,10, +0x306b80,19, +0x306bd0,10, +0x306c00,19, +0x306c60,6, +0x306c84,1, +0x306c94,8, +0x306cb8,9, +0x306ce0,4, +0x307000,6, +0x307020,3, +0x307040,7, +0x307060,6, +0x307100,5, +0x307138,1, +0x307144,1, +0x307150,2, +0x308000,6, +0x308020,3, +0x308030,9, +0x308100,6, +0x308120,10, +0x308150,8, +0x308400,1, +0x308428,1, +0x308450,1, +0x308478,1, +0x3084a0,8, +0x3085ac,1, +0x3085d8,4, +0x308600,6, +0x308620,6, +0x308640,3, +0x308800,6, +0x308820,3, +0x308830,4, +0x308858,2, +0x308864,1, +0x308874,3, +0x308898,2, +0x3088a4,1, +0x3088b4,3, +0x309000,6, +0x309020,6, +0x309040,3, +0x309080,14, +0x3090bc,1, +0x3090c4,13, +0x3090fc,1, +0x309200,20, +0x30925c,30, +0x309300,24, +0x309380,2, +0x3093a0,1, +0x3093c0,11, +0x309404,3, +0x309420,11, +0x309460,3, +0x309480,6, +0x309500,6, +0x309520,6, +0x309540,1, +0x309558,2, +0x309600,17, +0x309800,410, +0x30a000,6, +0x30a020,6, +0x30a040,3, +0x30a080,14, +0x30a0bc,1, +0x30a0c4,13, +0x30a0fc,1, +0x30a200,20, +0x30a25c,30, +0x30a300,24, +0x30a380,2, +0x30a3a0,1, +0x30a3c0,11, +0x30a404,3, +0x30a420,11, +0x30a460,3, +0x30a480,6, +0x30a500,6, +0x30a520,6, +0x30a540,1, +0x30a558,2, +0x30a600,17, +0x30a800,410, +0x30b000,4, +0x30b020,25, +0x30b088,8, +0x30b100,4, +0x30b120,25, +0x30b188,8, +0x30b200,34, +0x30b300,37, +0x30b400,16, +0x30b464,1, +0x30b474,3, +0x30b500,6, +0x30b520,2, +0x30b530,9, +0x30b570,10, +0x30b5a0,2, +0x30b5b0,9, +0x30b5f0,4, +0x30b620,7, +0x30b640,16, +0x30b700,6, +0x30b720,6, +0x30b740,6, +0x30b760,6, +0x30b780,3, +0x30b800,5, +0x30b818,1, +0x30b854,6, +0x30b880,2, +0x30b8a4,1, +0x30b8ac,2, +0x30ba00,28, +0x30ba7c,13, +0x30bab4,1, +0x30babc,10, +0x30bb04,1, +0x30bb0c,5, +0x30bb24,1, +0x30bb34,9, +0x30bb60,6, +0x30bb80,22, +0x30bbe0,3, +0x30bbf0,2, +0x30bc00,5, +0x30bc18,1, +0x30bc54,6, +0x30bc80,2, +0x30bca4,1, +0x30bcac,2, +0x30be00,28, +0x30be7c,13, +0x30beb4,1, +0x30bebc,10, +0x30bf04,1, +0x30bf0c,5, +0x30bf24,1, +0x30bf34,9, +0x30bf60,6, +0x30bf80,22, +0x30bfe0,3, +0x30bff0,2, +0x30c008,2, +0x30c014,11, +0x30c044,1, +0x30c04c,3, +0x30c05c,1, +0x30c064,1, +0x30c07c,1, +0x30c500,2, +0x30c518,1, +0x30c520,3, +0x30c540,6, +0x30c580,10, +0x30c808,2, +0x30c814,11, +0x30c844,1, +0x30c84c,3, +0x30c85c,1, +0x30c864,1, +0x30c87c,1, +0x30cd00,2, +0x30cd18,1, +0x30cd20,3, +0x30cd40,6, +0x30cd80,10, +0x30d800,2, +0x30d828,2, +0x30d850,2, +0x30d878,2, +0x30d8a0,6, +0x30d9ac,1, +0x30d9d8,4, +0x30da00,6, +0x30da20,6, +0x30da40,6, +0x30da60,6, +0x30da80,3, +0x30dc00,6, +0x30dc20,3, +0x30dc40,2, +0x30dc60,1, +0x310000,5, +0x310020,4, +0x310034,17, +0x310080,1, +0x3100a0,6, +0x310100,5, +0x310120,4, +0x310134,17, +0x310180,1, +0x3101a0,6, +0x310200,5, +0x310220,4, +0x310234,17, +0x310280,1, +0x3102a0,6, +0x310300,5, +0x310320,4, +0x310334,17, +0x310380,1, +0x3103a0,6, +0x310500,6, +0x31051c,7, +0x310540,1, +0x310c00,13, +0x310c40,12, +0x310c80,13, +0x310cc0,12, +0x310d00,6, +0x310d20,6, +0x310d80,14, +0x310dc0,2, +0x310e40,11, +0x310e80,6, +0x310ea0,6, +0x311000,2, +0x311010,5, +0x311060,32, +0x311100,8, +0x311180,3, +0x311190,2, +0x31119c,5, +0x311218,9, +0x311240,3, +0x311250,6, +0x311280,1, +0x311288,6, +0x3112a4,1, +0x311400,8, +0x311424,2, +0x311500,5, +0x311520,4, +0x311540,5, +0x311560,4, +0x311800,24, +0x311864,5, +0x311880,8, +0x311900,13, +0x311980,4, +0x3119a0,6, +0x311a40,1, +0x311a60,1, +0x311a68,23, +0x311ac8,6, +0x311b00,17, +0x311b48,6, +0x311b80,12, +0x311c00,6, +0x311c20,6, +0x311c40,6, +0x311c60,3, +0x311d00,6, +0x311d20,6, +0x311d40,3, +0x312000,5, +0x312020,4, +0x312034,17, +0x312080,1, +0x3120a0,6, +0x312100,5, +0x312120,4, +0x312134,17, +0x312180,1, +0x3121a0,6, +0x312200,5, +0x312220,4, +0x312234,17, +0x312280,1, +0x3122a0,6, +0x312300,5, +0x312320,4, +0x312334,17, +0x312380,1, +0x3123a0,6, +0x312500,6, +0x31251c,7, +0x312540,1, +0x312c00,13, +0x312c40,12, +0x312c80,13, +0x312cc0,12, +0x312d00,6, +0x312d20,6, +0x312d80,14, +0x312dc0,2, +0x312e40,11, +0x312e80,6, +0x312ea0,6, +0x313000,2, +0x313010,5, +0x313060,32, +0x313100,8, +0x313180,3, +0x313190,2, +0x31319c,5, +0x313218,9, +0x313240,3, +0x313250,6, +0x313280,1, +0x313288,6, +0x3132a4,1, +0x313400,8, +0x313424,2, +0x313500,5, +0x313520,4, +0x313540,5, +0x313560,4, +0x313800,24, +0x313864,5, +0x313880,8, +0x313900,13, +0x313980,4, +0x3139a0,6, +0x313a40,1, +0x313a60,1, +0x313a68,23, +0x313ac8,6, +0x313b00,17, +0x313b48,6, +0x313b80,12, +0x313c00,6, +0x313c20,6, +0x313c40,6, +0x313c60,3, +0x313d00,6, +0x313d20,6, +0x313d40,3, +0x314000,29, +0x314078,4, +0x314090,2, +0x3140a0,7, +0x3140c0,11, +0x314100,14, +0x314140,14, +0x314180,61, +0x314278,4, +0x314290,2, +0x3142a0,7, +0x3142c0,11, +0x314300,14, +0x314340,14, +0x314380,61, +0x314478,4, +0x314490,2, +0x3144a0,7, +0x3144c0,11, +0x314500,14, +0x314540,14, +0x314580,61, +0x314678,4, +0x314690,2, +0x3146a0,7, +0x3146c0,11, +0x314700,14, +0x314740,14, +0x314780,67, +0x314890,1, +0x314a00,8, +0x314a24,15, +0x314a64,30, +0x314b00,4, +0x314b20,2, +0x314c00,6, +0x314c40,14, +0x314c80,9, +0x314d00,9, +0x314d2c,1, +0x314d40,3, +0x314d60,1, +0x314d80,3, +0x314e00,2, +0x314e0c,1, +0x314e14,5, +0x314e2c,1, +0x314e34,5, +0x314e4c,1, +0x314e54,5, +0x314e6c,1, +0x314e74,5, +0x314e8c,1, +0x314e94,5, +0x314eac,1, +0x314eb4,3, +0x315000,29, +0x315078,4, +0x315090,2, +0x3150a0,7, +0x3150c0,11, +0x315100,14, +0x315140,14, +0x315180,61, +0x315278,4, +0x315290,2, +0x3152a0,7, +0x3152c0,11, +0x315300,14, +0x315340,14, +0x315380,61, +0x315478,4, +0x315490,2, +0x3154a0,7, +0x3154c0,11, +0x315500,14, +0x315540,14, +0x315580,61, +0x315678,4, +0x315690,2, +0x3156a0,7, +0x3156c0,11, +0x315700,14, +0x315740,14, +0x315780,67, +0x315890,1, +0x315a00,8, +0x315a24,15, +0x315a64,30, +0x315b00,4, +0x315b20,2, +0x315c00,6, +0x315c40,14, +0x315c80,9, +0x315d00,9, +0x315d2c,1, +0x315d40,3, +0x315d60,1, +0x315d80,3, +0x315e00,2, +0x315e0c,1, +0x315e14,5, +0x315e2c,1, +0x315e34,5, +0x315e4c,1, +0x315e54,5, +0x315e6c,1, +0x315e74,5, +0x315e8c,1, +0x315e94,5, +0x315eac,1, +0x315eb4,3, +0x316000,14, +0x316070,3, +0x316080,6, +0x316100,9, +0x316204,1, +0x31620c,6, +0x316240,13, +0x316280,16, +0x316800,19, +0x316850,10, +0x316880,19, +0x3168d0,10, +0x316900,19, +0x316950,10, +0x316980,19, +0x3169d0,10, +0x316a00,19, +0x316a50,10, +0x316a80,19, +0x316ad0,10, +0x316b00,19, +0x316b50,10, +0x316b80,19, +0x316bd0,10, +0x316c00,19, +0x316c60,6, +0x316c84,1, +0x316c94,8, +0x316cb8,9, +0x316ce0,4, +0x317000,6, +0x317020,3, +0x317040,7, +0x317060,6, +0x317100,5, +0x317138,1, +0x317144,1, +0x317150,2, +0x318000,6, +0x318020,3, +0x318030,9, +0x318100,6, +0x318120,10, +0x318150,8, +0x318400,1, +0x318428,1, +0x318450,1, +0x318478,1, +0x3184a0,8, +0x3185ac,1, +0x3185d8,4, +0x318600,6, +0x318620,6, +0x318640,3, +0x318800,6, +0x318820,3, +0x318830,4, +0x318858,2, +0x318864,1, +0x318874,3, +0x318898,2, +0x3188a4,1, +0x3188b4,3, +0x319000,6, +0x319020,6, +0x319040,3, +0x319080,14, +0x3190bc,1, +0x3190c4,13, +0x3190fc,1, +0x319200,20, +0x31925c,30, +0x319300,24, +0x319380,2, +0x3193a0,1, +0x3193c0,11, +0x319404,3, +0x319420,11, +0x319460,3, +0x319480,6, +0x319500,6, +0x319520,6, +0x319540,1, +0x319558,2, +0x319600,17, +0x319800,410, +0x31a000,6, +0x31a020,6, +0x31a040,3, +0x31a080,14, +0x31a0bc,1, +0x31a0c4,13, +0x31a0fc,1, +0x31a200,20, +0x31a25c,30, +0x31a300,24, +0x31a380,2, +0x31a3a0,1, +0x31a3c0,11, +0x31a404,3, +0x31a420,11, +0x31a460,3, +0x31a480,6, +0x31a500,6, +0x31a520,6, +0x31a540,1, +0x31a558,2, +0x31a600,17, +0x31a800,410, +0x31b000,4, +0x31b020,25, +0x31b088,8, +0x31b100,4, +0x31b120,25, +0x31b188,8, +0x31b200,34, +0x31b300,37, +0x31b400,16, +0x31b464,1, +0x31b474,3, +0x31b500,6, +0x31b520,2, +0x31b530,9, +0x31b570,10, +0x31b5a0,2, +0x31b5b0,9, +0x31b5f0,4, +0x31b620,7, +0x31b640,16, +0x31b700,6, +0x31b720,6, +0x31b740,6, +0x31b760,6, +0x31b780,3, +0x31b800,5, +0x31b818,1, +0x31b854,6, +0x31b880,2, +0x31b8a4,1, +0x31b8ac,2, +0x31ba00,28, +0x31ba7c,13, +0x31bab4,1, +0x31babc,10, +0x31bb04,1, +0x31bb0c,5, +0x31bb24,1, +0x31bb34,9, +0x31bb60,6, +0x31bb80,22, +0x31bbe0,3, +0x31bbf0,2, +0x31bc00,5, +0x31bc18,1, +0x31bc54,6, +0x31bc80,2, +0x31bca4,1, +0x31bcac,2, +0x31be00,28, +0x31be7c,13, +0x31beb4,1, +0x31bebc,10, +0x31bf04,1, +0x31bf0c,5, +0x31bf24,1, +0x31bf34,9, +0x31bf60,6, +0x31bf80,22, +0x31bfe0,3, +0x31bff0,2, +0x31c008,2, +0x31c014,11, +0x31c044,1, +0x31c04c,3, +0x31c05c,1, +0x31c064,1, +0x31c07c,1, +0x31c500,2, +0x31c518,1, +0x31c520,3, +0x31c540,6, +0x31c580,10, +0x31c808,2, +0x31c814,11, +0x31c844,1, +0x31c84c,3, +0x31c85c,1, +0x31c864,1, +0x31c87c,1, +0x31cd00,2, +0x31cd18,1, +0x31cd20,3, +0x31cd40,6, +0x31cd80,10, +0x31d800,2, +0x31d828,2, +0x31d850,2, +0x31d878,2, +0x31d8a0,6, +0x31d9ac,1, +0x31d9d8,4, +0x31da00,6, +0x31da20,6, +0x31da40,6, +0x31da60,6, +0x31da80,3, +0x31dc00,6, +0x31dc20,3, +0x31dc40,2, +0x31dc60,1, diff --git a/mstflint.spec.in b/mstflint.spec.in index a9d0ff3..ca9f883 100644 --- a/mstflint.spec.in +++ b/mstflint.spec.in @@ -1,6 +1,6 @@ %{!?ibmadlib: %define ibmadlib libibmad-devel} %{!?name: %define name mstflint} -%{!?version: %define version 4.1.0} +%{!?version: %define version 4.3.0} %{!?release: %define release 1} %{!?buildtype: %define buildtype "native"} %{!?noinband: %define noinband 0} @@ -84,6 +84,9 @@ rm -rf $RPM_BUILD_ROOT %{_mandir}/man1/* %changelog +* Mon Jan 11 2016 Adrian Chiris + MFT 4.3.0 Updates + * Wed Aug 26 2015 Adrian Chiris MFT 4.1.0 Updates diff --git a/mtcr_ul/Makefile.am b/mtcr_ul/Makefile.am index dd1b68d..f72a2e6 100644 --- a/mtcr_ul/Makefile.am +++ b/mtcr_ul/Makefile.am @@ -36,6 +36,7 @@ INCLUDES = -I$(top_srcdir)/include/mtcr_ul -I$(top_srcdir)/common lib_LIBRARIES = libmtcr_ul.a libmtcr_ul_a_SOURCES = mtcr_ul.c mtcr_ib.h mtcr_int_defs.h\ + mtcr_ib_res_mgt.h mtcr_ib_res_mgt.c\ mtcr_tools_cif.c mtcr_tools_cif.h\ mtcr_ul_icmd_cif.c mtcr_icmd_cif.h\ packets_common.c packets_common.h\ diff --git a/mtcr_ul/mtcr_ib_ofed.c b/mtcr_ul/mtcr_ib_ofed.c index 31f0a1e..b49acbf 100644 --- a/mtcr_ul/mtcr_ib_ofed.c +++ b/mtcr_ul/mtcr_ib_ofed.c @@ -584,7 +584,7 @@ int mib_open(const char *name, mfile *mf, int mad_init) ib_portid_t *sm_id = 0; int ca_port = 0; int dest_type = IB_DEST_LID; - ibvs_mad *ivm; + ibvs_mad *ivm = NULL; char *nbuf = NULL; char *path_str, *p; int rc = -1; @@ -594,6 +594,11 @@ int mib_open(const char *name, mfile *mf, int mad_init) char* first_comma; char* second_comma; //ibdebug = 1; + if (!mf || !name) { + IBERROR(("Bad(null) device argument for inband access")); + errno = EINVAL; + goto end; + } if (!(ivm=(ibvs_mad*)malloc(sizeof(ibvs_mad)))) { IBERROR(("can't allocate ibvsmad_mfile")); @@ -759,15 +764,17 @@ end: int mib_close(mfile *mf) { - if (mf->ctx) { - // TODO: free the ddl handlers - ibvs_mad* h = (ibvs_mad*)(mf->ctx); - h->mad_rpc_close_port(h->srcport); -#ifndef IBVSMAD_DLOPEN - free_dll_handle(mf); -#endif - free(mf->ctx); - mf->ctx = NULL; + if (mf) { + if (mf->ctx) { + // TODO: free the ddl handlers + ibvs_mad* h = (ibvs_mad*)(mf->ctx); + h->mad_rpc_close_port(h->srcport); + #ifndef IBVSMAD_DLOPEN + free_dll_handle(mf); + #endif + free(mf->ctx); + mf->ctx = NULL; + } } return 0; } @@ -782,6 +789,10 @@ mib_close(mfile *mf) int mib_get_chunk_size(mfile *mf) { + if (!mf || !mf->ctx) { + IBERROR(("get chunk size failed. Null Param.")); + return -1; + } ibvs_mad* h = (ibvs_mad*)(mf->ctx); if (h->use_smp) { return MAX_IB_SMP_DATA_SIZE; @@ -797,6 +808,10 @@ int mib_get_chunk_size(mfile *mf) int mib_read4(mfile *mf, u_int32_t memory_address, u_int32_t *data) { + if (!mf || !mf->ctx || !data) { + IBERROR(("cr access read failed. Null Param.")); + return -1; + } ibvs_mad* h = (ibvs_mad*)(mf->ctx); DEBUG(("mread4 of 0x%08x", memory_address)); @@ -807,10 +822,6 @@ mib_read4(mfile *mf, u_int32_t memory_address, u_int32_t *data) return 4; } - - - - /******************************************************** ** * Write an IS3 CR-Space 32 bit register @@ -819,6 +830,10 @@ mib_read4(mfile *mf, u_int32_t memory_address, u_int32_t *data) int mib_write4(mfile *mf, u_int32_t memory_address, u_int32_t _data) { + if (!mf || !mf->ctx) { + IBERROR(("cr access write failed. Null Param.")); + return -1; + } ibvs_mad* h = (ibvs_mad*)(mf->ctx); u_int32_t data = _data; @@ -833,6 +848,10 @@ mib_write4(mfile *mf, u_int32_t memory_address, u_int32_t _data) MTCR_API int mib_readblock(mfile *mf, unsigned int offset, u_int32_t *data, int length) { + if (!mf || !mf->ctx || !data) { + IBERROR(("cr access read failed. Null Param.")); + return -1; + } ibvs_mad* h = (ibvs_mad*)(mf->ctx); CHECK_ALLIGN(length); @@ -846,6 +865,10 @@ MTCR_API int mib_readblock(mfile *mf, unsigned int offset, u_int32_t *data, int } MTCR_API int mib_writeblock(mfile *mf, unsigned int offset, u_int32_t *data, int length) { + if (!mf || !mf->ctx || !data) { + IBERROR(("cr access write failed. Null Param.")); + return -1; + } ibvs_mad* h = (ibvs_mad*)(mf->ctx); CHECK_ALLIGN(length); @@ -883,6 +906,12 @@ int is_node_managed(ibvs_mad* h) int mib_swreset(mfile *mf) { + if (!mf || !mf->ctx) { + errno = EINVAL; + IBERROR(("swreset write failed. Null Param.")); + return -1; + } + u_int32_t swreset_timer = 15; char* ep; char* swreset_env; @@ -951,6 +980,10 @@ static int mib_status_translate(int status) int mib_acces_reg_mad(mfile *mf, u_int8_t *data) { + if (!mf || !mf->ctx || !data) { + IBERROR(("mib_acces_reg_mad failed. Null Param.")); + return ME_BAD_PARAMS; + } u_int8_t* p; ibvs_mad* h = (ibvs_mad*)(mf->ctx); int status = -1; @@ -974,6 +1007,10 @@ int mib_acces_reg_mad(mfile *mf, u_int8_t *data) int mib_smp_set(mfile* mf, u_int8_t* data, u_int16_t attr_id, u_int32_t attr_mod) { + if (!mf || !mf->ctx || !data) { + IBERROR(("mib_smp_set failed. Null Param.")); + return ME_BAD_PARAMS; + } u_int8_t* p; int status = -1; ibvs_mad* h = (ibvs_mad*)(mf->ctx); @@ -996,6 +1033,10 @@ int mib_smp_set(mfile* mf, u_int8_t* data, u_int16_t attr_id, u_int32_t attr_mod int mib_smp_get(mfile* mf, u_int8_t* data, u_int16_t attr_id, u_int32_t attr_mod) { + if (!mf || !mf->ctx || !data) { + IBERROR(("mib_smp_get failed. Null Param.")); + return ME_BAD_PARAMS; + } u_int8_t* p; int status = -1; ibvs_mad* h = (ibvs_mad*)(mf->ctx); diff --git a/mtcr_ul/mtcr_ib_res_mgt.c b/mtcr_ul/mtcr_ib_res_mgt.c new file mode 100644 index 0000000..4d316dd --- /dev/null +++ b/mtcr_ul/mtcr_ib_res_mgt.c @@ -0,0 +1,176 @@ +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include + +#include "mtcr_ib_res_mgt.h" +#include "mtcr_ib.h" +#include "packets_common.h" + +#define IB_SMP_DATA_SIZE 48 +#define SMP_SEMAPHOE_LOCK_CMD 0xff53 + +#define DBG_PRINTF(...) do { if (getenv("MFT_DEBUG") != NULL) { fprintf(stderr, __VA_ARGS__); } } while (0) + +/* Description - */ +/* Size in bytes - 12 */ +struct semaphore_lock_cmd { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - The maximal Semaphore Address supported by the device. */ + /* 0.0 - 0.7 */ + u_int8_t semaphore_max_addr; + /* Description - The lease time for a lock is 50msec *2^LeaseTimeExponent */ + /* 0.16 - 0.23 */ + u_int8_t lease_time_exponent; + /* Description - Should be used to extend a lock. When a lock owner application wish to extend the lock it should set this bit to 1 and fill the Key field with key obtained by the GetResp() to successful acquiring of a lock. */ + /* 0.31 - 4.31 */ + u_int8_t is_lease; +/*---------------- DWORD[1] (Offset 0x4) ----------------*/ + /* Description - The specific Semaphore being queried or requested a lock for */ + /* 4.0 - 4.15 */ + u_int16_t semaphore_addr; + /* Description - 1 = Lock, 2 = Extend, 3 = Release */ + /* 4.16 - 4.17 */ + u_int8_t op; +/*---------------- DWORD[2] (Offset 0x8) ----------------*/ + /* Description - This field is provided by the device on a successful lock. It should be used by the user in order to either extend or release of the lock. */ + /* 8.0 - 12.31 */ + u_int32_t lock_key; +}; + + +void semaphore_lock_cmd_pack(const struct semaphore_lock_cmd *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=24; + push_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->semaphore_max_addr); + + offset=8; + push_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->lease_time_exponent); + + offset=0; + push_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->is_lease); + + offset=48; + push_to_buff(ptr_buff, offset, 16, (u_int32_t)ptr_struct->semaphore_addr); + + offset=46; + push_to_buff(ptr_buff, offset, 2, (u_int32_t)ptr_struct->op); + + offset=64; + push_to_buff_64(ptr_buff, offset, (u_int64_t)ptr_struct->lock_key); + +} + +void semaphore_lock_cmd_unpack(struct semaphore_lock_cmd *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + u_int8_t val=0; + (void)val; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=24; + ptr_struct->semaphore_max_addr = (u_int8_t)pop_from_buff(ptr_buff, offset, 8); + + offset=8; + ptr_struct->lease_time_exponent = (u_int8_t)pop_from_buff(ptr_buff, offset, 8); + + offset=0; + ptr_struct->is_lease = (u_int8_t)pop_from_buff(ptr_buff, offset, 1); + + offset=48; + ptr_struct->semaphore_addr = (u_int16_t)pop_from_buff(ptr_buff, offset, 16); + + offset=46; + ptr_struct->op = (u_int8_t)pop_from_buff(ptr_buff, offset, 2); + + offset=64; + ptr_struct->lock_key = (u_int32_t)pop_from_buff_64(ptr_buff, offset); + +} + +int mib_semaphore_lock_vs_mad( + mfile* mf, + sem_op_t op, + u_int32_t sem_addr, + u_int32_t lock_key, + u_int32_t* res, + int* is_leaseable, + u_int8_t* lease_time_exp, + sem_lock_method_t method) +{ + u_int8_t mad_data[IB_SMP_DATA_SIZE] = {0}; + int rc = ME_OK; + struct semaphore_lock_cmd cmd; + memset(&cmd, 0, sizeof(cmd)); + cmd.semaphore_addr = sem_addr; + cmd.op = op; + cmd.lock_key = lock_key; + DBG_PRINTF("#######BFORE#####\n# SEM_ADDR: 0x%x\n# OP: %d\n# Lock_Key: 0x%x\n#################\n", + cmd.semaphore_addr, cmd.op, cmd.lock_key); + semaphore_lock_cmd_pack(&cmd, mad_data); + if (method == SEM_LOCK_SET) { + rc = mib_smp_set(mf, mad_data, SMP_SEMAPHOE_LOCK_CMD, 0); + } else { + rc = mib_smp_get(mf, mad_data, SMP_SEMAPHOE_LOCK_CMD, 0); + } + semaphore_lock_cmd_unpack(&cmd, mad_data); + DBG_PRINTF("#######AFTER#####\n# SEM_ADDR: 0x%x\n# OP: %d\n# Lock_Key: 0x%x\n#################\n", + cmd.semaphore_addr, cmd.op, cmd.lock_key); + *res = cmd.lock_key; + *is_leaseable = (int)cmd.is_lease; + *lease_time_exp = cmd.lease_time_exponent; + return rc; +} + +int mib_semaphore_lock_is_supported(mfile* mf) +{ + u_int8_t mad_data[IB_SMP_DATA_SIZE] = {0}; + struct semaphore_lock_cmd cmd; + memset(&cmd, 0, sizeof(cmd)); + mib_smp_get(mf, mad_data, SMP_SEMAPHOE_LOCK_CMD, 0); + semaphore_lock_cmd_unpack(&cmd, mad_data); + DBG_PRINTF("###### QUERY #####\n# MAX_SEM_ADDR: 0x%x\n#################\n", cmd.semaphore_max_addr); + if (cmd.semaphore_max_addr > 0) { + return 1; + } else { + return 0; + } +} diff --git a/mtcr_ul/mtcr_ib_res_mgt.h b/mtcr_ul/mtcr_ib_res_mgt.h new file mode 100644 index 0000000..c60d1d5 --- /dev/null +++ b/mtcr_ul/mtcr_ib_res_mgt.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef _MTCR_IB_RES_MGT_H_ +#define _MTCR_IB_RES_MGT_H_ + +#include + +typedef enum { + SMP_SEM_LOCK = 1, + SMP_SEM_EXTEND, + SMP_SEM_RELEASE +} sem_op_t; + +typedef enum { + SEM_LOCK_GET = 0x0, + SEM_LOCK_SET = 0x1 +} sem_lock_method_t; + +int mib_semaphore_lock_vs_mad( + mfile* mf, + sem_op_t op, + u_int32_t sem_addr, + u_int32_t lock_key, + u_int32_t* res, + int* is_leaseable, + u_int8_t* lease_time_exp, + sem_lock_method_t method); + +int mib_semaphore_lock_is_supported(mfile* mf); + +#endif diff --git a/mtcr_ul/mtcr_int_defs.h b/mtcr_ul/mtcr_int_defs.h index ea03cfa..48de0b5 100644 --- a/mtcr_ul/mtcr_int_defs.h +++ b/mtcr_ul/mtcr_int_defs.h @@ -52,6 +52,8 @@ typedef struct icmd_params_t { int semaphore_addr; int static_cfg_not_done_addr; int static_cfg_not_done_offs; + u_int32_t lock_key; + int ib_semaphore_lock_supported; }icmd_params; typedef struct tools_hcr_params_t { diff --git a/mtcr_ul/mtcr_ul.c b/mtcr_ul/mtcr_ul.c index b97d310..aadeac6 100644 --- a/mtcr_ul/mtcr_ul.c +++ b/mtcr_ul/mtcr_ul.c @@ -781,6 +781,10 @@ int pci_find_capability(mfile* mf, int cap_id) } offset = data[1]; + + if (offset > PCI_EXT_SPACE_ADDR) { + return 0; + } if (visited[offset]) { return 0; } @@ -1034,8 +1038,7 @@ int mtcr_pciconf_mclose(mfile *mf) struct pciconf_context *ctx = mf->ctx; unsigned int word; if (ctx) { - //TODO: apparently this read is useless here , need to check - // what happens if we remove it , (maybe something to do with ConnectX WA ??) + // Adrianc: set address in PCI configuration space to be non-semaphore. mread4(mf, 0xf0014, &word); if (ctx->fd != -1) { close(ctx->fd); @@ -1132,8 +1135,14 @@ int mtcr_inband_open(mfile* mf, const char* name) mf->mwrite4_block = mib_writeblock; mf->maccess_reg = mib_acces_reg_mad; mf->mclose = mib_close; - - return mib_open(name,mf,0); + char* p; + if ((p = strstr(name, "ibdr-")) != 0 || + (p = strstr(name, "iblid-")) != 0 || + (p = strstr(name, "lid-")) != 0) { + return mib_open(p, mf, 0); + } else { + return -1; + } #else (void) name; @@ -1244,7 +1253,6 @@ name_parsed: *force = 0; #ifdef __aarch64__ // on ARM processors MMAP not supported - (void)force_config; // avoid warrnings return MTCR_ACCESS_CONFIG; #else if (force_config) { @@ -1288,32 +1296,49 @@ int mhca_reset(mfile *mf) return -1; } +static long supported_dev_ids[] = { + 0x1003, //Connect-X3 + 0x1007, //Connect-X3Pro + 0x1011, //Connect-IB + 0x1013, //Connect-X4 + 0x1015, //Connect-X4Lx + 0x1017, //Connect-X5 + 0xc738, //SwitchX + 0xcb20, //Switch-IB + 0xcb84, //Spectrum + -1 +}; + +int is_supported_devid(long devid) +{ + int i = 0; + int ret_val = 0; + while (supported_dev_ids[i] != -1) { + if (devid == supported_dev_ids[i]) { + ret_val = 1; + break; + } + i++; + } + return ret_val; +} + int is_supported_device(char* devname) { - static char* unsupported_dev_ids[] = { - "0x0600", //FPGA - "-1" - }; + char fname[64]; - char devid[64]; + char inbuf[64]; FILE* f; - int ret_val = 1; - int i = 0; + int ret_val = 0; sprintf(fname, "/sys/bus/pci/devices/%s/device", devname); f = fopen(fname, "r"); if (f == NULL) { //printf("-D- Could not open file: %s\n", fname); return 1; } - if (fgets(devid, sizeof(devid), f)) { - while (strcmp(unsupported_dev_ids[i], "-1")) { - if (!strncmp(devid, unsupported_dev_ids[i], strlen(unsupported_dev_ids[i]))) { - //printf("-D- device: %s, with devid: %s is unsupported\n", devname, devid); - ret_val = 0; - break; - } - i++; - } + if (fgets(inbuf, sizeof(inbuf), f)) { + long devid = strtol(inbuf, NULL, 0); + ret_val = is_supported_devid(devid); } fclose(f); return ret_val; @@ -1323,7 +1348,7 @@ int mdevices(char *buf, int len, int mask) { #define MDEVS_TAVOR_CR 0x20 -#define MLNX_PCI_VENDOR_ID "0x15b3" +#define MLNX_PCI_VENDOR_ID 0x15b3 FILE* f; DIR* d; @@ -1369,8 +1394,8 @@ int mdevices(char *buf, int len, int mask) goto cleanup_dir_opened; } if (fgets(inbuf, sizeof(inbuf), f)) { - if(!strncmp(inbuf, MLNX_PCI_VENDOR_ID, strlen(MLNX_PCI_VENDOR_ID)) && - is_supported_device(dir->d_name)) { + long venid = strtoul(inbuf, NULL, 0); + if(venid == MLNX_PCI_VENDOR_ID && is_supported_device(dir->d_name)) { rsz = sz + 1; //dev name size + place for Null char if ((pos + rsz) > len) { ndevs = -1; @@ -1401,7 +1426,7 @@ int read_pci_config_header(u_int16_t domain, u_int8_t bus, u_int8_t dev, u_int8_ sprintf(proc_dev, "/sys/bus/pci/devices/%04x:%02x:%02x.%d/config", domain, bus, dev, func); FILE* f = fopen(proc_dev, "r"); if (!f) { - fprintf(stderr, "Failed to open (%s) for reading: %s\n", proc_dev, strerror(errno)); + //fprintf(stderr, "Failed to open (%s) for reading: %s\n", proc_dev, strerror(errno)); return 1; } setvbuf(f, NULL, _IONBF, 0); @@ -1531,7 +1556,7 @@ mfile *mopen(const char *name) char cbuf[] = "/sys/bus/pci/devices/XXXX:XX:XX.X/config"; char pdbuf[] = "/proc/bus/pci/XXXX:XX/XX.X"; char pbuf[] = "/proc/bus/pci/XX/XX.X"; - char errbuf[4048]=""; + char pcidev[] = "XXXX:XX:XX.X"; int err; int rc; @@ -1563,6 +1588,12 @@ mfile *mopen(const char *name) if (_create_lock(mf, domain, bus, dev, func , access)) { goto open_failed; } + + sprintf(pcidev, "%4.4x:%2.2x:%2.2x.%1.1x", domain, bus, dev, func); + if (!is_supported_device(pcidev)) { + errno = ENOTSUP; + goto open_failed; + } } sprintf(cbuf, "/sys/bus/pci/devices/%4.4x:%2.2x:%2.2x.%1.1x/config", @@ -1585,9 +1616,8 @@ mfile *mopen(const char *name) if (0 == rc) { return mf; - } else { - goto open_failed; } + goto open_failed; } if (access == MTCR_ACCESS_CONFIG) @@ -1608,7 +1638,7 @@ mfile *mopen(const char *name) if (offset == -1 && !domain) offset = mtcr_procfs_get_offset(bus, dev, func); if (offset == -1) - goto access_config; + goto access_config_forced; sprintf(pdbuf, "/proc/bus/pci/%4.4x:%2.2x/%2.2x.%1.1x", domain, bus, dev, func); @@ -1616,7 +1646,7 @@ mfile *mopen(const char *name) if (rc == 0) { return mf; } else if (rc == 1) { - goto access_config; + goto access_config_forced; } if (!domain) { @@ -1626,7 +1656,7 @@ mfile *mopen(const char *name) if (rc == 0) { return mf; } else if (rc == 1) { - goto access_config; + goto access_config_forced; } } @@ -1636,14 +1666,6 @@ mfile *mopen(const char *name) return mf; #endif -access_config: -#if CONFIG_ENABLE_PCICONF && CONFIG_ENABLE_PCICONF - strerror_r(errno, errbuf, sizeof errbuf); - fprintf(stderr, - "Warning: memory access to device %s failed: %s. Switching to PCI config access.\n", - name, errbuf); -#endif - access_config_forced: sprintf(cbuf, "/sys/bus/pci/devices/%4.4x:%2.2x:%2.2x.%1.1x/config", @@ -2151,7 +2173,6 @@ static int mreg_send_raw(mfile *mf, u_int16_t reg_id, maccess_reg_method_t metho #define CONNECTX3_PRO_HW_ID 0x1f7 #define CONNECTX3_HW_ID 0x1f5 #define SWITCHX_HW_ID 0x245 -#define INFINISCALE4_HW_ID 0x1b3 #define HW_ID_ADDR 0xf0014 @@ -2165,7 +2186,6 @@ static int supports_icmd(mfile* mf) { switch (dev_id & 0xffff) { // that the hw device id case CONNECTX3_HW_ID : case CONNECTX3_PRO_HW_ID : - case INFINISCALE4_HW_ID : case SWITCHX_HW_ID : return 0; default: diff --git a/mtcr_ul/mtcr_ul_icmd_cif.c b/mtcr_ul/mtcr_ul_icmd_cif.c index f44f5a2..544f98d 100644 --- a/mtcr_ul/mtcr_ul_icmd_cif.c +++ b/mtcr_ul/mtcr_ul_icmd_cif.c @@ -28,7 +28,6 @@ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. - * */ #include @@ -40,6 +39,7 @@ #include #include #include "mtcr_icmd_cif.h" +#include "mtcr_ib_res_mgt.h" //#define _DEBUG_MODE // un-comment this to enable debug prints @@ -50,8 +50,8 @@ #define STAT_CFG_NOT_DONE_ADDR_CIB 0xb0004 #define STAT_CFG_NOT_DONE_ADDR_CX4 0xb0004 #define STAT_CFG_NOT_DONE_ADDR_SW_IB 0x80010 -#define STAT_CFG_NOT_DONE_BITOFF_CIB 31 -#define STAT_CFG_NOT_DONE_BITOFF_CX4 31 +#define STAT_CFG_NOT_DONE_BITOFF_CIB 31 +#define STAT_CFG_NOT_DONE_BITOFF_CX4 31 #define STAT_CFG_NOT_DONE_BITOFF_SW_IB 0 #define BUSY_BITOFF 0 #define BUSY_BITLEN 1 @@ -59,7 +59,6 @@ #define OPCODE_BITLEN 16 #define STATUS_BITOFF 8 #define STATUS_BITLEN 8 - #define VCR_CTRL_ADDR 0x0 #define VCR_SEMAPHORE62 0x0 // semaphore Domain #define VCR_CMD_ADDR 0x100000 // mailbox addr @@ -87,19 +86,19 @@ */ #define SET_SPACE_FOR_ICMD_ACCESS(mf) \ if (mf->vsec_supp) { \ - mf->address_space = AS_ICMD; \ + mset_addr_space(mf, AS_ICMD); \ } #define SET_SPACE_FOR_SEMAPHORE_ACCESS(mf) \ if (mf->vsec_supp) { \ - mf->address_space = AS_SEMAPHORE; \ + mset_addr_space(mf, AS_SEMAPHORE); \ } -#define RESTORE_SPACE(mf) mf->address_space = AS_CR_SPACE +#define RESTORE_SPACE(mf) mset_addr_space(mf, AS_CR_SPACE) #define MWRITE4_ICMD(mf, offset, value, action_on_fail)\ do {\ SET_SPACE_FOR_ICMD_ACCESS(mf);\ if (mwrite4(mf, offset, value) != 4) {\ - mf->address_space = AS_CR_SPACE;\ + mset_addr_space(mf, AS_CR_SPACE);\ action_on_fail;\ }\ RESTORE_SPACE(mf);\ @@ -160,7 +159,6 @@ }while(0) - #ifdef _DEBUG_MODE #define DBG_PRINTF(...) fprintf(stderr, __VA_ARGS__) #else @@ -182,8 +180,10 @@ enum { #define CIB_HW_ID 511 #define CX4_HW_ID 521 #define CX4LX_HW_ID 523 +#define CX5_HW_ID 525 #define SW_IB_HW_ID 583 #define SW_EN_HW_ID 585 +#define SW_IB2_HW_ID 587 #define GET_ADDR(mf, addr_cib, addr_cx4, addr_sw_ib, addr)\ do {\ @@ -192,10 +192,12 @@ enum { switch (_hw_id & 0xffff) {\ case (CX4_HW_ID):\ case (CX4LX_HW_ID):\ + case (CX5_HW_ID):\ addr = addr_cx4;\ break;\ case (SW_IB_HW_ID):\ case (SW_EN_HW_ID):\ + case (SW_IB2_HW_ID):\ addr = addr_sw_ib;\ break;\ default:\ @@ -316,17 +318,19 @@ static int icmd_is_cmd_ifc_ready(mfile *mf) { return (bit_val == expected_val) ? ME_OK: ME_ICMD_STATUS_ICMD_NOT_READY; } +#define SMP_ICMD_SEM_ADDR 0x0 + /* * icmd_clear_semaphore */ -int icmd_clear_semaphore(mfile *mf) { +int icmd_clear_semaphore(mfile *mf) +{ DBG_PRINTF("Clearing semaphore\n"); // open icmd interface by demand - int ret; - if ((ret = icmd_open(mf))) { - return ret; - } - + int ret; + if ((ret = icmd_open(mf))) { + return ret; + } MWRITE4_SEMAPHORE(mf, mf->icmd.semaphore_addr, 0, return ME_ICMD_STATUS_CR_FAIL); mf->icmd.took_semaphore = 0; return ME_OK; @@ -335,20 +339,18 @@ int icmd_clear_semaphore(mfile *mf) { /* * icmd_take_semaphore */ -/* - * icmd_take_semaphore - */ + static int icmd_take_semaphore_com(mfile *mf, u_int32_t expected_read_val) { u_int32_t read_val; unsigned retries = 0; DBG_PRINTF("Taking semaphore...\n"); - do { // loop while the semaphore is taken by someone else if (++retries > 256) { return ME_ICMD_STATUS_SEMAPHORE_TO; } + if (mf->vsec_supp) { //write expected val before reading it MWRITE4_SEMAPHORE(mf, mf->icmd.semaphore_addr, expected_read_val, return ME_ICMD_STATUS_CR_FAIL); @@ -450,13 +452,6 @@ cleanup: return ret; } - -static int icmd_init_cr(mfile *mf) -{ - (void)mf; - return ME_NOT_IMPLEMENTED; -} - static int icmd_init_vcr(mfile* mf) { mf->icmd.cmd_addr = VCR_CMD_ADDR; @@ -486,13 +481,12 @@ int icmd_open(mfile *mf) } mf->icmd.took_semaphore = 0; + mf->icmd.ib_semaphore_lock_supported = 0; // attempt to open via CR-Space #if defined(MST_UL) && !defined(MST_UL_ICMD) if (mf->vsec_supp) { return icmd_init_vcr(mf); } - // ugly hack avoid compiler warrnings - if (0) icmd_init_cr(mf); return ME_ICMD_NOT_SUPPORTED; #else if (mf->vsec_supp) { diff --git a/reg_access/Makefile.am b/reg_access/Makefile.am index 3e56406..7f78060 100644 --- a/reg_access/Makefile.am +++ b/reg_access/Makefile.am @@ -42,7 +42,7 @@ AM_CFLAGS = -W -Wall -Werror -g -MP -MD $(COMPILER_FPIC) noinst_LIBRARIES = libreg_access.a -libreg_access_a_SOURCES = reg_access.c +libreg_access_a_SOURCES = reg_access.c reg_access.h libreg_access_a_DEPENDENCIES = $(USER_DIR)/tools_layouts/libtools_layouts.a libreg_access_a_LIBADD = $(libreg_access_a_DEPENDENCIES) diff --git a/reg_access/reg_access.c b/reg_access/reg_access.c index 727cb4c..6f584b7 100644 --- a/reg_access/reg_access.c +++ b/reg_access/reg_access.c @@ -41,8 +41,10 @@ #define REG_ID_MNVA 0x9024 #define REG_ID_MNVI 0x9025 #define REG_ID_MNVIA 0x9029 // 4th gen +#define REG_ID_MVTS 0x902c #define REG_ID_NVQC 0x9030 #define REG_ID_NVIA 0x9033 // 5th gen +#define REG_ID_NVQGC 0x9034 // TODO: get correct register ID for mfrl mfai #define REG_ID_MFRL 0x9028 @@ -249,6 +251,26 @@ reg_access_status_t reg_access_nvqc (mfile* mf, reg_access_method_t method, stru } REG_ACCCESS(mf, method, REG_ID_NVQC, nvqc, nvqc, tools_open); } + +/************************************ + * Function: reg_access_nvqgc + ************************************/ +reg_access_status_t reg_access_nvqgc (mfile* mf, reg_access_method_t method, struct tools_open_nvqgc* nvqgc) +{ + if (method != REG_ACCESS_METHOD_GET ) { // this register supports only get method + return ME_REG_ACCESS_BAD_METHOD; + } + REG_ACCCESS(mf, method, REG_ID_NVQGC, nvqgc, nvqgc, tools_open); +} + +/************************************ + * Function: reg_access_mvts + ************************************/ +reg_access_status_t reg_access_mvts (mfile* mf, reg_access_method_t method, struct tools_open_mvts* mvts) +{ + REG_ACCCESS(mf, method, REG_ID_MVTS, mvts, mvts, tools_open); +} + /************************************ * Function: reg_access_err2str ************************************/ diff --git a/reg_access/reg_access.h b/reg_access/reg_access.h index ce8db97..6a746a2 100644 --- a/reg_access/reg_access.h +++ b/reg_access/reg_access.h @@ -71,6 +71,8 @@ reg_access_status_t reg_access_nvda (mfile* mf, reg_access_method_t method, stru reg_access_status_t reg_access_nvdi (mfile* mf, reg_access_method_t method, struct tools_open_nvdi* nvdi); reg_access_status_t reg_access_nvia (mfile* mf, reg_access_method_t method, struct tools_open_nvia* nvdia); reg_access_status_t reg_access_nvqc (mfile* mf, reg_access_method_t method, struct tools_open_nvqc* nvqc); +reg_access_status_t reg_access_nvqgc (mfile* mf, reg_access_method_t method, struct tools_open_nvqgc* nvqgc); +reg_access_status_t reg_access_mvts (mfile* mf, reg_access_method_t method, struct tools_open_mvts* mvts); #ifdef __cplusplus } diff --git a/tools_layouts/Makefile.am b/tools_layouts/Makefile.am index f085849..bc18f9b 100644 --- a/tools_layouts/Makefile.am +++ b/tools_layouts/Makefile.am @@ -40,4 +40,5 @@ libtools_layouts_a_SOURCES = adb_to_c_utils.c adb_to_c_utils.h \ register_access_open_layouts.h register_access_open_layouts.c \ tools_open_layouts.c tools_open_layouts.h\ register_access_sib_layouts.h register_access_sib_layouts.c \ - cx4fw_layouts.c cx4fw_layouts.h + cx4fw_layouts.c cx4fw_layouts.h\ + connectib_layouts.c connectib_layouts.h diff --git a/tools_layouts/adb_to_c_utils.c b/tools_layouts/adb_to_c_utils.c index cd39ab9..5b2b2c0 100644 --- a/tools_layouts/adb_to_c_utils.c +++ b/tools_layouts/adb_to_c_utils.c @@ -31,7 +31,7 @@ */ /*** - *** This file was generated at "2015-06-17 12:05:46" + *** This file was generated at "2016-04-22 14:35:59" *** by: *** > /mswg/release/eat_me/last_release/adabe_plugins/adb2c/adb2pack.py --input adb/tools_open/tools_open.adb --file-prefix tools_open --prefix tools_open_ ***/ @@ -48,12 +48,12 @@ u_int32_t adb2c_calc_array_field_address(u_int32_t start_bit_offset, u_int32_t a { u_int32_t offs; - if (arr_elemnt_size > 32) - { - assert(!(arr_elemnt_size % 32)); - start_bit_offset += arr_elemnt_size*(u_int32_t)arr_idx; - return start_bit_offset; - } + if (arr_elemnt_size > 32) + { + assert(!(arr_elemnt_size % 32)); + start_bit_offset += arr_elemnt_size*(u_int32_t)arr_idx; + return start_bit_offset; + } if (is_big_endian_arr) { diff --git a/tools_layouts/adb_to_c_utils.h b/tools_layouts/adb_to_c_utils.h index c0e22f1..ebbe933 100644 --- a/tools_layouts/adb_to_c_utils.h +++ b/tools_layouts/adb_to_c_utils.h @@ -31,7 +31,7 @@ */ /*** - *** This file was generated at "2015-06-17 12:05:46" + *** This file was generated at "2016-04-22 14:35:59" *** by: *** > /mswg/release/eat_me/last_release/adabe_plugins/adb2c/adb2pack.py --input adb/tools_open/tools_open.adb --file-prefix tools_open --prefix tools_open_ ***/ diff --git a/tools_layouts/connectib_layouts.c b/tools_layouts/connectib_layouts.c new file mode 100644 index 0000000..9b72bb4 --- /dev/null +++ b/tools_layouts/connectib_layouts.c @@ -0,0 +1,214 @@ +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "connectib_layouts.h" + +void connectib_FW_VERSION_pack(const struct connectib_FW_VERSION *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=0; + adb2c_push_bits_to_buff(ptr_buff, offset, 16, (u_int32_t)ptr_struct->MAJOR); + + offset=48; + adb2c_push_bits_to_buff(ptr_buff, offset, 16, (u_int32_t)ptr_struct->SUBMINOR); + + offset=32; + adb2c_push_bits_to_buff(ptr_buff, offset, 16, (u_int32_t)ptr_struct->MINOR); + + offset=80; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->Hour); + + offset=72; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->Minutes); + + offset=64; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->Seconds); + + offset=120; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->Day); + + offset=112; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->Month); + + offset=96; + adb2c_push_bits_to_buff(ptr_buff, offset, 16, (u_int32_t)ptr_struct->Year); + +} + +void connectib_FW_VERSION_unpack(struct connectib_FW_VERSION *ptr_struct, const u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + u_int8_t val=0; + (void)val; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=0; + ptr_struct->MAJOR = (u_int16_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 16); + + offset=48; + ptr_struct->SUBMINOR = (u_int16_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 16); + + offset=32; + ptr_struct->MINOR = (u_int16_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 16); + + offset=80; + ptr_struct->Hour = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + offset=72; + ptr_struct->Minutes = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + offset=64; + ptr_struct->Seconds = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + offset=120; + ptr_struct->Day = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + offset=112; + ptr_struct->Month = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + offset=96; + ptr_struct->Year = (u_int16_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 16); + +} + +void connectib_FW_VERSION_print(const struct connectib_FW_VERSION *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== connectib_FW_VERSION ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + adb2c_add_indentation(file, indent_level); + fprintf(file, "MAJOR : "UH_FMT"\n", ptr_struct->MAJOR); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "SUBMINOR : "UH_FMT"\n", ptr_struct->SUBMINOR); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "MINOR : "UH_FMT"\n", ptr_struct->MINOR); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "Hour : "UH_FMT"\n", ptr_struct->Hour); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "Minutes : "UH_FMT"\n", ptr_struct->Minutes); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "Seconds : "UH_FMT"\n", ptr_struct->Seconds); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "Day : "UH_FMT"\n", ptr_struct->Day); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "Month : "UH_FMT"\n", ptr_struct->Month); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "Year : "UH_FMT"\n", ptr_struct->Year); + +} + +int connectib_FW_VERSION_size(void){ + return 16; +} + +void connectib_FW_VERSION_dump(const struct connectib_FW_VERSION *ptr_struct, FILE* file) { + connectib_FW_VERSION_print(ptr_struct, file, 0); +} + +void connectib_icmd_get_fw_info_pack(const struct connectib_icmd_get_fw_info *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=0; + connectib_FW_VERSION_pack(&(ptr_struct->fw_version), ptr_buff + offset/8); + + offset=144; + adb2c_push_bits_to_buff(ptr_buff, offset, 16, (u_int32_t)ptr_struct->hash_signature); + +} + +void connectib_icmd_get_fw_info_unpack(struct connectib_icmd_get_fw_info *ptr_struct, const u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + u_int8_t val=0; + (void)val; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=0; + connectib_FW_VERSION_unpack(&(ptr_struct->fw_version), ptr_buff + offset/8); + + offset=144; + ptr_struct->hash_signature = (u_int16_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 16); + +} + +void connectib_icmd_get_fw_info_print(const struct connectib_icmd_get_fw_info *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== connectib_icmd_get_fw_info ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + adb2c_add_indentation(file, indent_level); + fprintf(file, "fw_version:\n"); + connectib_FW_VERSION_print(&(ptr_struct->fw_version), file, indent_level + 1); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "hash_signature : "UH_FMT"\n", ptr_struct->hash_signature); + +} + +int connectib_icmd_get_fw_info_size(void){ + return 32; +} + +void connectib_icmd_get_fw_info_dump(const struct connectib_icmd_get_fw_info *ptr_struct, FILE* file) { + connectib_icmd_get_fw_info_print(ptr_struct, file, 0); +} + diff --git a/tools_layouts/connectib_layouts.h b/tools_layouts/connectib_layouts.h new file mode 100644 index 0000000..3681455 --- /dev/null +++ b/tools_layouts/connectib_layouts.h @@ -0,0 +1,108 @@ +/* + * Copyright (C) Jan 2013 Mellanox Technologies Ltd. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef CONNECTIB_LAYOUTS_H +#define CONNECTIB_LAYOUTS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "adb_to_c_utils.h" + +/* Description - */ +/* Size in bytes - 16 */ +struct connectib_FW_VERSION { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - */ + /* 0.16 - 4.31 */ + u_int16_t MAJOR; +/*---------------- DWORD[1] (Offset 0x4) ----------------*/ + /* Description - */ + /* 4.0 - 4.15 */ + u_int16_t SUBMINOR; + /* Description - */ + /* 4.16 - 8.31 */ + u_int16_t MINOR; +/*---------------- DWORD[2] (Offset 0x8) ----------------*/ + /* Description - */ + /* 8.8 - 8.15 */ + u_int8_t Hour; + /* Description - */ + /* 8.16 - 8.23 */ + u_int8_t Minutes; + /* Description - */ + /* 8.24 - 12.31 */ + u_int8_t Seconds; +/*---------------- DWORD[3] (Offset 0xc) ----------------*/ + /* Description - */ + /* 12.0 - 12.7 */ + u_int8_t Day; + /* Description - */ + /* 12.8 - 12.15 */ + u_int8_t Month; + /* Description - */ + /* 12.16 - 16.31 */ + u_int16_t Year; +}; + +/* Description - */ +/* Size in bytes - 32 */ +struct connectib_icmd_get_fw_info { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - */ + /* 0.0 - 16.31 */ + struct connectib_FW_VERSION fw_version; +/*---------------- DWORD[4] (Offset 0x10) ----------------*/ + /* Description - Hash gen file signature */ + /* 16.0 - 16.15 */ + u_int16_t hash_signature; +}; + +/* FW_VERSION */ +void connectib_FW_VERSION_pack(const struct connectib_FW_VERSION *ptr_struct, u_int8_t* ptr_buff); +void connectib_FW_VERSION_unpack(struct connectib_FW_VERSION *ptr_struct, const u_int8_t* ptr_buff); +void connectib_FW_VERSION_print(const struct connectib_FW_VERSION *ptr_struct, FILE* file, int indent_level); +int connectib_FW_VERSION_size(void); +#define CONNECTIB_FW_VERSION_SIZE (0x10) +/* icmd_get_fw_info */ +void connectib_icmd_get_fw_info_pack(const struct connectib_icmd_get_fw_info *ptr_struct, u_int8_t* ptr_buff); +void connectib_icmd_get_fw_info_unpack(struct connectib_icmd_get_fw_info *ptr_struct, const u_int8_t* ptr_buff); +void connectib_icmd_get_fw_info_print(const struct connectib_icmd_get_fw_info *ptr_struct, FILE* file, int indent_level); +int connectib_icmd_get_fw_info_size(void); +#define CONNECTIB_ICMD_GET_FW_INFO_SIZE (0x20) + +#ifdef __cplusplus +} +#endif + +#endif // CONNECTIB_LAYOUTS_H diff --git a/tools_layouts/cx4fw_layouts.c b/tools_layouts/cx4fw_layouts.c index d723ac7..2eeb44d 100644 --- a/tools_layouts/cx4fw_layouts.c +++ b/tools_layouts/cx4fw_layouts.c @@ -29,7 +29,6 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - /*** *** This file was generated at "2015-04-20 13:45:40" diff --git a/tools_layouts/register_access_open_layouts.c b/tools_layouts/register_access_open_layouts.c index 7387ba7..d9c0c8a 100644 --- a/tools_layouts/register_access_open_layouts.c +++ b/tools_layouts/register_access_open_layouts.c @@ -31,7 +31,7 @@ */ /*** - *** This file was generated at "2015-02-05 17:01:35" + *** This file was generated at "2016-02-23 00:12:07" *** by: *** > /mswg/release/eat_me/last_release/adabe_plugins/adb2c/adb2pack.py --input adb/register_access_open/register_access_open.adb --file-prefix register_access_open --prefix register_access_ ***/ @@ -148,6 +148,9 @@ void register_access_mfpa_pack(const struct register_access_mfpa *ptr_struct, u_ offset=156; adb2c_push_bits_to_buff(ptr_buff, offset, 4, (u_int32_t)ptr_struct->flash_num); + offset=130; + adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->bulk_64kb_erase_en); + offset=168; adb2c_push_bits_to_buff(ptr_buff, offset, 24, (u_int32_t)ptr_struct->jedec_id); @@ -184,6 +187,9 @@ void register_access_mfpa_unpack(struct register_access_mfpa *ptr_struct, const offset=156; ptr_struct->flash_num = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 4); + offset=130; + ptr_struct->bulk_64kb_erase_en = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); + offset=168; ptr_struct->jedec_id = (u_int32_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 24); @@ -218,6 +224,9 @@ void register_access_mfpa_print(const struct register_access_mfpa *ptr_struct, F adb2c_add_indentation(file, indent_level); fprintf(file, "flash_num : "UH_FMT"\n", ptr_struct->flash_num); + adb2c_add_indentation(file, indent_level); + fprintf(file, "bulk_64kb_erase_en : "UH_FMT"\n", ptr_struct->bulk_64kb_erase_en); + adb2c_add_indentation(file, indent_level); fprintf(file, "jedec_id : "UH_FMT"\n", ptr_struct->jedec_id); @@ -254,6 +263,9 @@ void register_access_mfbe_pack(const struct register_access_mfbe *ptr_struct, u_ offset=23; adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->p); + offset=2; + adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->bulk_64kb_erase); + offset=72; adb2c_push_bits_to_buff(ptr_buff, offset, 24, (u_int32_t)ptr_struct->address); @@ -275,6 +287,9 @@ void register_access_mfbe_unpack(struct register_access_mfbe *ptr_struct, const offset=23; ptr_struct->p = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); + offset=2; + ptr_struct->bulk_64kb_erase = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); + offset=72; ptr_struct->address = (u_int32_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 24); @@ -294,6 +309,9 @@ void register_access_mfbe_print(const struct register_access_mfbe *ptr_struct, F adb2c_add_indentation(file, indent_level); fprintf(file, "p : "UH_FMT"\n", ptr_struct->p); + adb2c_add_indentation(file, indent_level); + fprintf(file, "bulk_64kb_erase : "UH_FMT"\n", ptr_struct->bulk_64kb_erase); + adb2c_add_indentation(file, indent_level); fprintf(file, "address : "UH_FMT"\n", ptr_struct->address); diff --git a/tools_layouts/register_access_open_layouts.h b/tools_layouts/register_access_open_layouts.h index 8ca4e39..a6b3aa2 100644 --- a/tools_layouts/register_access_open_layouts.h +++ b/tools_layouts/register_access_open_layouts.h @@ -31,7 +31,7 @@ */ /*** - *** This file was generated at "2015-06-17 12:05:44" + *** This file was generated at "2016-02-23 00:12:07" *** by: *** > /mswg/release/eat_me/last_release/adabe_plugins/adb2c/adb2pack.py --input adb/register_access_open/register_access_open.adb --file-prefix register_access_open --prefix register_access_ ***/ @@ -85,6 +85,9 @@ struct register_access_mfpa { /* Description - number of flash devices connected */ /* 16.0 - 16.3 */ u_int8_t flash_num; + /* Description - */ + /* 16.29 - 16.29 */ + u_int8_t bulk_64kb_erase_en; /*---------------- DWORD[5] (Offset 0x14) ----------------*/ /* Description - Flash JEDEC ID */ /* 20.0 - 20.23 */ @@ -112,6 +115,9 @@ struct register_access_mfbe { /* Description - Parallel */ /* 0.8 - 0.8 */ u_int8_t p; + /* Description - erase 64KB flash area */ + /* 0.29 - 0.29 */ + u_int8_t bulk_64kb_erase; /*---------------- DWORD[2] (Offset 0x8) ----------------*/ /* Description - address in bytes */ /* 8.0 - 8.23 */ diff --git a/tools_layouts/tools_open_layouts.c b/tools_layouts/tools_open_layouts.c index fa3945a..1cb0428 100644 --- a/tools_layouts/tools_open_layouts.c +++ b/tools_layouts/tools_open_layouts.c @@ -31,7 +31,7 @@ */ /*** - *** This file was generated at "2015-08-31 18:48:47" + *** This file was generated at "2016-05-04 19:06:49" *** by: *** > /mswg/release/eat_me/last_release/adabe_plugins/adb2c/adb2pack.py --input adb/tools_open/tools_open.adb --file-prefix tools_open --prefix tools_open_ ***/ @@ -439,6 +439,167 @@ void tools_open_global_type_dump(const struct tools_open_global_type *ptr_struct tools_open_global_type_print(ptr_struct, file, 0); } +void tools_open_ts_entry_pack(const struct tools_open_ts_entry *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=24; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->ts_day); + + offset=16; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->ts_month); + + offset=0; + adb2c_push_bits_to_buff(ptr_buff, offset, 16, (u_int32_t)ptr_struct->ts_year); + + offset=48; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->ts_seconds); + + offset=40; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->ts_minutes); + + offset=32; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->ts_hour); + +} + +void tools_open_ts_entry_unpack(struct tools_open_ts_entry *ptr_struct, const u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + u_int8_t val=0; + (void)val; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=24; + ptr_struct->ts_day = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + offset=16; + ptr_struct->ts_month = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + offset=0; + ptr_struct->ts_year = (u_int16_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 16); + + offset=48; + ptr_struct->ts_seconds = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + offset=40; + ptr_struct->ts_minutes = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + offset=32; + ptr_struct->ts_hour = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + +} + +void tools_open_ts_entry_print(const struct tools_open_ts_entry *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== tools_open_ts_entry ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + adb2c_add_indentation(file, indent_level); + fprintf(file, "ts_day : "UH_FMT"\n", ptr_struct->ts_day); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "ts_month : "UH_FMT"\n", ptr_struct->ts_month); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "ts_year : "UH_FMT"\n", ptr_struct->ts_year); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "ts_seconds : "UH_FMT"\n", ptr_struct->ts_seconds); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "ts_minutes : "UH_FMT"\n", ptr_struct->ts_minutes); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "ts_hour : "UH_FMT"\n", ptr_struct->ts_hour); + +} + +int tools_open_ts_entry_size(void){ + return 8; +} + +void tools_open_ts_entry_dump(const struct tools_open_ts_entry *ptr_struct, FILE* file) { + tools_open_ts_entry_print(ptr_struct, file, 0); +} + +void tools_open_fw_version_pack(const struct tools_open_fw_version *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=0; + adb2c_push_bits_to_buff(ptr_buff, offset, 16, (u_int32_t)ptr_struct->fw_ver_major); + + offset=48; + adb2c_push_bits_to_buff(ptr_buff, offset, 16, (u_int32_t)ptr_struct->fw_ver_subminor); + + offset=32; + adb2c_push_bits_to_buff(ptr_buff, offset, 16, (u_int32_t)ptr_struct->fw_ver_minor); + +} + +void tools_open_fw_version_unpack(struct tools_open_fw_version *ptr_struct, const u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + u_int8_t val=0; + (void)val; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=0; + ptr_struct->fw_ver_major = (u_int16_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 16); + + offset=48; + ptr_struct->fw_ver_subminor = (u_int16_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 16); + + offset=32; + ptr_struct->fw_ver_minor = (u_int16_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 16); + +} + +void tools_open_fw_version_print(const struct tools_open_fw_version *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== tools_open_fw_version ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + adb2c_add_indentation(file, indent_level); + fprintf(file, "fw_ver_major : "UH_FMT"\n", ptr_struct->fw_ver_major); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "fw_ver_subminor : "UH_FMT"\n", ptr_struct->fw_ver_subminor); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "fw_ver_minor : "UH_FMT"\n", ptr_struct->fw_ver_minor); + +} + +int tools_open_fw_version_size(void){ + return 8; +} + +void tools_open_fw_version_dump(const struct tools_open_fw_version *ptr_struct, FILE* file) { + tools_open_fw_version_print(ptr_struct, file, 0); +} + void tools_open_tlv_type_pack(const union tools_open_tlv_type *ptr_struct, u_int8_t* ptr_buff) { tools_open_tlv_type_dw_pack(&(ptr_struct->tlv_type_dw), ptr_buff); @@ -549,6 +710,66 @@ void tools_open_pmdio_addr_data_dump(const struct tools_open_pmdio_addr_data *pt tools_open_pmdio_addr_data_print(ptr_struct, file, 0); } +void tools_open_timestamp_pack(const struct tools_open_timestamp *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=0; + tools_open_fw_version_pack(&(ptr_struct->fw_version), ptr_buff + offset/8); + + offset=64; + tools_open_ts_entry_pack(&(ptr_struct->ts_entry), ptr_buff + offset/8); + +} + +void tools_open_timestamp_unpack(struct tools_open_timestamp *ptr_struct, const u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + u_int8_t val=0; + (void)val; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=0; + tools_open_fw_version_unpack(&(ptr_struct->fw_version), ptr_buff + offset/8); + + offset=64; + tools_open_ts_entry_unpack(&(ptr_struct->ts_entry), ptr_buff + offset/8); + +} + +void tools_open_timestamp_print(const struct tools_open_timestamp *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== tools_open_timestamp ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + adb2c_add_indentation(file, indent_level); + fprintf(file, "fw_version:\n"); + tools_open_fw_version_print(&(ptr_struct->fw_version), file, indent_level + 1); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "ts_entry:\n"); + tools_open_ts_entry_print(&(ptr_struct->ts_entry), file, indent_level + 1); + +} + +int tools_open_timestamp_size(void){ + return 16; +} + +void tools_open_timestamp_dump(const struct tools_open_timestamp *ptr_struct, FILE* file) { + tools_open_timestamp_print(ptr_struct, file, 0); +} + void tools_open_nv_hdr_fifth_gen_pack(const struct tools_open_nv_hdr_fifth_gen *ptr_struct, u_int8_t* ptr_buff){ u_int32_t offset; int i=0; @@ -566,15 +787,18 @@ void tools_open_nv_hdr_fifth_gen_pack(const struct tools_open_nv_hdr_fifth_gen * offset=16; adb2c_push_bits_to_buff(ptr_buff, offset, 4, (u_int32_t)ptr_struct->version); + offset=9; + adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->default_supported); + + offset=8; + adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->default_); + offset=7; adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->rd_en); offset=6; adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->over_en); - offset=3; - adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->default_); - offset=32; tools_open_tlv_type_pack(&(ptr_struct->type), ptr_buff + offset/8); @@ -599,15 +823,18 @@ void tools_open_nv_hdr_fifth_gen_unpack(struct tools_open_nv_hdr_fifth_gen *ptr_ offset=16; ptr_struct->version = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 4); + offset=9; + ptr_struct->default_supported = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); + + offset=8; + ptr_struct->default_ = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); + offset=7; ptr_struct->rd_en = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); offset=6; ptr_struct->over_en = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); - offset=3; - ptr_struct->default_ = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); - offset=32; tools_open_tlv_type_unpack(&(ptr_struct->type), ptr_buff + offset/8); @@ -631,13 +858,16 @@ void tools_open_nv_hdr_fifth_gen_print(const struct tools_open_nv_hdr_fifth_gen fprintf(file, "version : "UH_FMT"\n", ptr_struct->version); adb2c_add_indentation(file, indent_level); - fprintf(file, "rd_en : "UH_FMT"\n", ptr_struct->rd_en); + fprintf(file, "default_supported : "UH_FMT"\n", ptr_struct->default_supported); adb2c_add_indentation(file, indent_level); - fprintf(file, "over_en : "UH_FMT"\n", ptr_struct->over_en); + fprintf(file, "default_ : "UH_FMT"\n", ptr_struct->default_); adb2c_add_indentation(file, indent_level); - fprintf(file, "default_ : "UH_FMT"\n", ptr_struct->default_); + fprintf(file, "rd_en : "UH_FMT"\n", ptr_struct->rd_en); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "over_en : "UH_FMT"\n", ptr_struct->over_en); adb2c_add_indentation(file, indent_level); fprintf(file, "type:\n"); @@ -747,6 +977,118 @@ void tools_open_nv_hdr_dump(const struct tools_open_nv_hdr *ptr_struct, FILE* fi tools_open_nv_hdr_print(ptr_struct, file, 0); } +void tools_open_aux_tlv_header_pack(const struct tools_open_aux_tlv_header *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=24; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->minor_version); + + offset=16; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->major_version); + + offset=8; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->type); + + offset=0; + adb2c_push_bits_to_buff(ptr_buff, offset, 4, (u_int32_t)ptr_struct->header_type); + + offset=32; + adb2c_push_integer_to_buff(ptr_buff, offset, 4, (u_int64_t)ptr_struct->length); + + offset=80; + adb2c_push_bits_to_buff(ptr_buff, offset, 16, (u_int32_t)ptr_struct->crc); + + offset=96; + adb2c_push_integer_to_buff(ptr_buff, offset, 4, (u_int64_t)ptr_struct->reserved0); + + offset=128; + adb2c_push_integer_to_buff(ptr_buff, offset, 4, (u_int64_t)ptr_struct->reserved1); + +} + +void tools_open_aux_tlv_header_unpack(struct tools_open_aux_tlv_header *ptr_struct, const u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + u_int8_t val=0; + (void)val; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=24; + ptr_struct->minor_version = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + offset=16; + ptr_struct->major_version = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + offset=8; + ptr_struct->type = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + offset=0; + ptr_struct->header_type = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 4); + + offset=32; + ptr_struct->length = (u_int32_t)adb2c_pop_integer_from_buff(ptr_buff, offset, 4); + + offset=80; + ptr_struct->crc = (u_int16_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 16); + + offset=96; + ptr_struct->reserved0 = (u_int32_t)adb2c_pop_integer_from_buff(ptr_buff, offset, 4); + + offset=128; + ptr_struct->reserved1 = (u_int32_t)adb2c_pop_integer_from_buff(ptr_buff, offset, 4); + +} + +void tools_open_aux_tlv_header_print(const struct tools_open_aux_tlv_header *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== tools_open_aux_tlv_header ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + adb2c_add_indentation(file, indent_level); + fprintf(file, "minor_version : "UH_FMT"\n", ptr_struct->minor_version); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "major_version : "UH_FMT"\n", ptr_struct->major_version); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "type : "UH_FMT"\n", ptr_struct->type); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "header_type : "UH_FMT"\n", ptr_struct->header_type); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "length : "U32H_FMT"\n", ptr_struct->length); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "crc : "UH_FMT"\n", ptr_struct->crc); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "reserved0 : "U32H_FMT"\n", ptr_struct->reserved0); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "reserved1 : "U32H_FMT"\n", ptr_struct->reserved1); + +} + +int tools_open_aux_tlv_header_size(void){ + return 20; +} + +void tools_open_aux_tlv_header_dump(const struct tools_open_aux_tlv_header *ptr_struct, FILE* file) { + tools_open_aux_tlv_header_print(ptr_struct, file, 0); +} + void tools_open_pmdio_pack(const struct tools_open_pmdio *ptr_struct, u_int8_t* ptr_buff){ u_int32_t offset; int i=0; @@ -913,42 +1255,168 @@ void tools_open_pmdic_unpack(struct tools_open_pmdic *ptr_struct, const u_int8_t offset=32; ptr_struct->mdio_preset = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 2); - offset=88; - ptr_struct->misc_cap = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + offset=88; + ptr_struct->misc_cap = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + +} + +void tools_open_pmdic_print(const struct tools_open_pmdic *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== tools_open_pmdic ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + adb2c_add_indentation(file, indent_level); + fprintf(file, "local_port : "UH_FMT"\n", ptr_struct->local_port); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "operation_cap : "UH_FMT"\n", ptr_struct->operation_cap); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "clause : "UH_FMT"\n", ptr_struct->clause); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "mdio_preset : "UH_FMT"\n", ptr_struct->mdio_preset); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "misc_cap : "UH_FMT"\n", ptr_struct->misc_cap); + +} + +int tools_open_pmdic_size(void){ + return 12; +} + +void tools_open_pmdic_dump(const struct tools_open_pmdic *ptr_struct, FILE* file) { + tools_open_pmdic_print(ptr_struct, file, 0); +} + +void tools_open_mvts_pack(const struct tools_open_mvts *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=2; + adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->check_timestamp_flag); + + offset=1; + adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->running_flag); + + offset=0; + adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->clear_all_ts_flag); + + offset=32; + tools_open_timestamp_pack(&(ptr_struct->timestamp), ptr_buff + offset/8); + +} + +void tools_open_mvts_unpack(struct tools_open_mvts *ptr_struct, const u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + u_int8_t val=0; + (void)val; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=2; + ptr_struct->check_timestamp_flag = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); + + offset=1; + ptr_struct->running_flag = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); + + offset=0; + ptr_struct->clear_all_ts_flag = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); + + offset=32; + tools_open_timestamp_unpack(&(ptr_struct->timestamp), ptr_buff + offset/8); + +} + +void tools_open_mvts_print(const struct tools_open_mvts *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== tools_open_mvts ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + adb2c_add_indentation(file, indent_level); + fprintf(file, "check_timestamp_flag : "UH_FMT"\n", ptr_struct->check_timestamp_flag); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "running_flag : "UH_FMT"\n", ptr_struct->running_flag); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "clear_all_ts_flag : "UH_FMT"\n", ptr_struct->clear_all_ts_flag); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "timestamp:\n"); + tools_open_timestamp_print(&(ptr_struct->timestamp), file, indent_level + 1); + +} + +int tools_open_mvts_size(void){ + return 20; +} + +void tools_open_mvts_dump(const struct tools_open_mvts *ptr_struct, FILE* file) { + tools_open_mvts_print(ptr_struct, file, 0); +} + +void tools_open_nvqgc_pack(const struct tools_open_nvqgc *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=31; + adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->read_factory_settings_support); + +} + +void tools_open_nvqgc_unpack(struct tools_open_nvqgc *ptr_struct, const u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + u_int8_t val=0; + (void)val; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=31; + ptr_struct->read_factory_settings_support = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); } -void tools_open_pmdic_print(const struct tools_open_pmdic *ptr_struct, FILE* file, int indent_level){ +void tools_open_nvqgc_print(const struct tools_open_nvqgc *ptr_struct, FILE* file, int indent_level){ adb2c_add_indentation(file, indent_level); - fprintf(file, "======== tools_open_pmdic ========\n"); + fprintf(file, "======== tools_open_nvqgc ========\n"); int i=0; (void)i;(void)ptr_struct; (void)file; (void)indent_level; adb2c_add_indentation(file, indent_level); - fprintf(file, "local_port : "UH_FMT"\n", ptr_struct->local_port); - - adb2c_add_indentation(file, indent_level); - fprintf(file, "operation_cap : "UH_FMT"\n", ptr_struct->operation_cap); - - adb2c_add_indentation(file, indent_level); - fprintf(file, "clause : "UH_FMT"\n", ptr_struct->clause); - - adb2c_add_indentation(file, indent_level); - fprintf(file, "mdio_preset : "UH_FMT"\n", ptr_struct->mdio_preset); - - adb2c_add_indentation(file, indent_level); - fprintf(file, "misc_cap : "UH_FMT"\n", ptr_struct->misc_cap); + fprintf(file, "read_factory_settings_support : "UH_FMT"\n", ptr_struct->read_factory_settings_support); } -int tools_open_pmdic_size(void){ - return 12; +int tools_open_nvqgc_size(void){ + return 16; } -void tools_open_pmdic_dump(const struct tools_open_pmdic *ptr_struct, FILE* file) { - tools_open_pmdic_print(ptr_struct, file, 0); +void tools_open_nvqgc_dump(const struct tools_open_nvqgc *ptr_struct, FILE* file) { + tools_open_nvqgc_print(ptr_struct, file, 0); } void tools_open_nvdi_pack(const struct tools_open_nvdi *ptr_struct, u_int8_t* ptr_buff){ @@ -1313,14 +1781,336 @@ void tools_open_mnva_pack(const struct tools_open_mnva *ptr_struct, u_int8_t* pt offset=0; tools_open_nv_hdr_pack(&(ptr_struct->nv_hdr), ptr_buff + offset/8); - for (i=0; i < 128; i++) { - offset=adb2c_calc_array_field_address(88, 8, i, 2048, 1); - adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->data[i]); - } + for (i=0; i < 128; i++) { + offset=adb2c_calc_array_field_address(88, 8, i, 2048, 1); + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->data[i]); + } + +} + +void tools_open_mnva_unpack(struct tools_open_mnva *ptr_struct, const u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + u_int8_t val=0; + (void)val; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=0; + tools_open_nv_hdr_unpack(&(ptr_struct->nv_hdr), ptr_buff + offset/8); + + for (i=0; i < 128; i++) { + offset=adb2c_calc_array_field_address(88, 8, i, 2048, 1); + ptr_struct->data[i] = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + } + +} + +void tools_open_mnva_print(const struct tools_open_mnva *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== tools_open_mnva ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + adb2c_add_indentation(file, indent_level); + fprintf(file, "nv_hdr:\n"); + tools_open_nv_hdr_print(&(ptr_struct->nv_hdr), file, indent_level + 1); + + for (i=0; i < 128; i++) { + adb2c_add_indentation(file, indent_level); + fprintf(file, "data_%03d : "UH_FMT"\n", i, ptr_struct->data[i]); + } + +} + +int tools_open_mnva_size(void){ + return 256; +} + +void tools_open_mnva_dump(const struct tools_open_mnva *ptr_struct, FILE* file) { + tools_open_mnva_print(ptr_struct, file, 0); +} + +void tools_open_mfg_info_pack(const struct tools_open_mfg_info *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + for (i=0; i < 16; i++) { + offset=adb2c_calc_array_field_address(24, 8, i, 2560, 1); + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->psid[i]); + } + + offset=232; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->minor_version); + + offset=224; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->major_version); + + for (i=0; i < 96; i++) { + offset=adb2c_calc_array_field_address(792, 8, i, 2560, 1); + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->orig_prs_name[i]); + } + +} + +void tools_open_mfg_info_unpack(struct tools_open_mfg_info *ptr_struct, const u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + u_int8_t val=0; + (void)val; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + for (i=0; i < 16; i++) { + offset=adb2c_calc_array_field_address(24, 8, i, 2560, 1); + ptr_struct->psid[i] = (char)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + } + + ptr_struct->psid[16] = '\0'; + offset=232; + ptr_struct->minor_version = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + offset=224; + ptr_struct->major_version = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + for (i=0; i < 96; i++) { + offset=adb2c_calc_array_field_address(792, 8, i, 2560, 1); + ptr_struct->orig_prs_name[i] = (char)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + } + + ptr_struct->orig_prs_name[96] = '\0'; +} + +void tools_open_mfg_info_print(const struct tools_open_mfg_info *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== tools_open_mfg_info ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + fprintf(file, "psid : \"%s\"\n", ptr_struct->psid); + adb2c_add_indentation(file, indent_level); + fprintf(file, "minor_version : "UH_FMT"\n", ptr_struct->minor_version); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "major_version : "UH_FMT"\n", ptr_struct->major_version); + + fprintf(file, "orig_prs_name : \"%s\"\n", ptr_struct->orig_prs_name); +} + +int tools_open_mfg_info_size(void){ + return 320; +} + +void tools_open_mfg_info_dump(const struct tools_open_mfg_info *ptr_struct, FILE* file) { + tools_open_mfg_info_print(ptr_struct, file, 0); +} + +void tools_open_image_info_pack(const struct tools_open_image_info *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=8; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->minor_version); + + offset=0; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->major_version); + + for (i=0; i < 16; i++) { + offset=adb2c_calc_array_field_address(312, 8, i, 8192, 1); + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->psid[i]); + } + + for (i=0; i < 256; i++) { + offset=adb2c_calc_array_field_address(3736, 8, i, 8192, 1); + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->description[i]); + } + + for (i=0; i < 64; i++) { + offset=adb2c_calc_array_field_address(6680, 8, i, 8192, 1); + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->name[i]); + } + + for (i=0; i < 96; i++) { + offset=adb2c_calc_array_field_address(7192, 8, i, 8192, 1); + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->prs_name[i]); + } + +} + +void tools_open_image_info_unpack(struct tools_open_image_info *ptr_struct, const u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + u_int8_t val=0; + (void)val; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=8; + ptr_struct->minor_version = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + offset=0; + ptr_struct->major_version = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + for (i=0; i < 16; i++) { + offset=adb2c_calc_array_field_address(312, 8, i, 8192, 1); + ptr_struct->psid[i] = (char)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + } + + ptr_struct->psid[16] = '\0'; + for (i=0; i < 256; i++) { + offset=adb2c_calc_array_field_address(3736, 8, i, 8192, 1); + ptr_struct->description[i] = (char)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + } + + ptr_struct->description[256] = '\0'; + for (i=0; i < 64; i++) { + offset=adb2c_calc_array_field_address(6680, 8, i, 8192, 1); + ptr_struct->name[i] = (char)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + } + + ptr_struct->name[64] = '\0'; + for (i=0; i < 96; i++) { + offset=adb2c_calc_array_field_address(7192, 8, i, 8192, 1); + ptr_struct->prs_name[i] = (char)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + } + + ptr_struct->prs_name[96] = '\0'; +} + +void tools_open_image_info_print(const struct tools_open_image_info *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== tools_open_image_info ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + adb2c_add_indentation(file, indent_level); + fprintf(file, "minor_version : "UH_FMT"\n", ptr_struct->minor_version); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "major_version : "UH_FMT"\n", ptr_struct->major_version); + + fprintf(file, "psid : \"%s\"\n", ptr_struct->psid); + fprintf(file, "description : \"%s\"\n", ptr_struct->description); + fprintf(file, "name : \"%s\"\n", ptr_struct->name); + fprintf(file, "prs_name : \"%s\"\n", ptr_struct->prs_name); +} + +int tools_open_image_info_size(void){ + return 1024; +} + +void tools_open_image_info_dump(const struct tools_open_image_info *ptr_struct, FILE* file) { + tools_open_image_info_print(ptr_struct, file, 0); +} + +void tools_open_aux_tlv_pack(const struct tools_open_aux_tlv *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=0; + tools_open_aux_tlv_header_pack(&(ptr_struct->aux_tlv_header), ptr_buff + offset/8); + + for (i=0; i < 128; i++) { + offset=adb2c_calc_array_field_address(184, 8, i, 2048, 1); + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->data[i]); + } + +} + +void tools_open_aux_tlv_unpack(struct tools_open_aux_tlv *ptr_struct, const u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + u_int8_t val=0; + (void)val; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=0; + tools_open_aux_tlv_header_unpack(&(ptr_struct->aux_tlv_header), ptr_buff + offset/8); + + for (i=0; i < 128; i++) { + offset=adb2c_calc_array_field_address(184, 8, i, 2048, 1); + ptr_struct->data[i] = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + } + +} + +void tools_open_aux_tlv_print(const struct tools_open_aux_tlv *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== tools_open_aux_tlv ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + adb2c_add_indentation(file, indent_level); + fprintf(file, "aux_tlv_header:\n"); + tools_open_aux_tlv_header_print(&(ptr_struct->aux_tlv_header), file, indent_level + 1); + + for (i=0; i < 128; i++) { + adb2c_add_indentation(file, indent_level); + fprintf(file, "data_%03d : "UH_FMT"\n", i, ptr_struct->data[i]); + } + +} + +int tools_open_aux_tlv_size(void){ + return 256; +} + +void tools_open_aux_tlv_dump(const struct tools_open_aux_tlv *ptr_struct, FILE* file) { + tools_open_aux_tlv_print(ptr_struct, file, 0); +} + +void tools_open_aux_data_hdr_pack(const struct tools_open_aux_data_hdr *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=0; + adb2c_push_integer_to_buff(ptr_buff, offset, 4, (u_int64_t)ptr_struct->signature0); + + offset=32; + adb2c_push_integer_to_buff(ptr_buff, offset, 4, (u_int64_t)ptr_struct->signature1); + + offset=64; + adb2c_push_integer_to_buff(ptr_buff, offset, 4, (u_int64_t)ptr_struct->signature2); + + offset=96; + adb2c_push_integer_to_buff(ptr_buff, offset, 4, (u_int64_t)ptr_struct->signature3); } -void tools_open_mnva_unpack(struct tools_open_mnva *ptr_struct, const u_int8_t* ptr_buff){ +void tools_open_aux_data_hdr_unpack(struct tools_open_aux_data_hdr *ptr_struct, const u_int8_t* ptr_buff){ u_int32_t offset; int i=0; u_int8_t val=0; @@ -1331,40 +2121,47 @@ void tools_open_mnva_unpack(struct tools_open_mnva *ptr_struct, const u_int8_t* (void)ptr_buff; offset=0; - tools_open_nv_hdr_unpack(&(ptr_struct->nv_hdr), ptr_buff + offset/8); + ptr_struct->signature0 = (u_int32_t)adb2c_pop_integer_from_buff(ptr_buff, offset, 4); - for (i=0; i < 128; i++) { - offset=adb2c_calc_array_field_address(88, 8, i, 2048, 1); - ptr_struct->data[i] = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); - } + offset=32; + ptr_struct->signature1 = (u_int32_t)adb2c_pop_integer_from_buff(ptr_buff, offset, 4); + + offset=64; + ptr_struct->signature2 = (u_int32_t)adb2c_pop_integer_from_buff(ptr_buff, offset, 4); + + offset=96; + ptr_struct->signature3 = (u_int32_t)adb2c_pop_integer_from_buff(ptr_buff, offset, 4); } -void tools_open_mnva_print(const struct tools_open_mnva *ptr_struct, FILE* file, int indent_level){ +void tools_open_aux_data_hdr_print(const struct tools_open_aux_data_hdr *ptr_struct, FILE* file, int indent_level){ adb2c_add_indentation(file, indent_level); - fprintf(file, "======== tools_open_mnva ========\n"); + fprintf(file, "======== tools_open_aux_data_hdr ========\n"); int i=0; (void)i;(void)ptr_struct; (void)file; (void)indent_level; adb2c_add_indentation(file, indent_level); - fprintf(file, "nv_hdr:\n"); - tools_open_nv_hdr_print(&(ptr_struct->nv_hdr), file, indent_level + 1); + fprintf(file, "signature0 : "U32H_FMT"\n", ptr_struct->signature0); - for (i=0; i < 128; i++) { adb2c_add_indentation(file, indent_level); - fprintf(file, "data_%03d : "UH_FMT"\n", i, ptr_struct->data[i]); - } + fprintf(file, "signature1 : "U32H_FMT"\n", ptr_struct->signature1); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "signature2 : "U32H_FMT"\n", ptr_struct->signature2); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "signature3 : "U32H_FMT"\n", ptr_struct->signature3); } -int tools_open_mnva_size(void){ - return 256; +int tools_open_aux_data_hdr_size(void){ + return 16; } -void tools_open_mnva_dump(const struct tools_open_mnva *ptr_struct, FILE* file) { - tools_open_mnva_print(ptr_struct, file, 0); +void tools_open_aux_data_hdr_dump(const struct tools_open_aux_data_hdr *ptr_struct, FILE* file) { + tools_open_aux_data_hdr_print(ptr_struct, file, 0); } void tools_open_query_def_params_per_port_pack(const struct tools_open_query_def_params_per_port *ptr_struct, u_int8_t* ptr_buff){ @@ -1414,6 +2211,9 @@ void tools_open_query_def_params_per_port_pack(const struct tools_open_query_def offset=80; adb2c_push_bits_to_buff(ptr_buff, offset, 16, (u_int32_t)ptr_struct->default_boot_pkey); + offset=70; + adb2c_push_bits_to_buff(ptr_buff, offset, 2, (u_int32_t)ptr_struct->boot_ip_ver); + offset=68; adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->nv_config_infiniband_dhcp_settings); @@ -1513,6 +2313,9 @@ void tools_open_query_def_params_per_port_unpack(struct tools_open_query_def_par offset=80; ptr_struct->default_boot_pkey = (u_int16_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 16); + offset=70; + ptr_struct->boot_ip_ver = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 2); + offset=68; ptr_struct->nv_config_infiniband_dhcp_settings = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); @@ -1610,6 +2413,9 @@ void tools_open_query_def_params_per_port_print(const struct tools_open_query_de adb2c_add_indentation(file, indent_level); fprintf(file, "default_boot_pkey : "UH_FMT"\n", ptr_struct->default_boot_pkey); + adb2c_add_indentation(file, indent_level); + fprintf(file, "boot_ip_ver : "UH_FMT"\n", ptr_struct->boot_ip_ver); + adb2c_add_indentation(file, indent_level); fprintf(file, "nv_config_infiniband_dhcp_settings : "UH_FMT"\n", ptr_struct->nv_config_infiniband_dhcp_settings); @@ -1688,6 +2494,9 @@ void tools_open_query_def_params_global_pack(const struct tools_open_query_def_p offset=48; adb2c_push_bits_to_buff(ptr_buff, offset, 4, (u_int32_t)ptr_struct->max_uar_bar_size); + offset=42; + adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->boot_ip_ver); + offset=32; adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->sriov_en); @@ -1715,6 +2524,9 @@ void tools_open_query_def_params_global_unpack(struct tools_open_query_def_param offset=48; ptr_struct->max_uar_bar_size = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 4); + offset=42; + ptr_struct->boot_ip_ver = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); + offset=32; ptr_struct->sriov_en = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); @@ -1740,6 +2552,9 @@ void tools_open_query_def_params_global_print(const struct tools_open_query_def_ adb2c_add_indentation(file, indent_level); fprintf(file, "max_uar_bar_size : "UH_FMT"\n", ptr_struct->max_uar_bar_size); + adb2c_add_indentation(file, indent_level); + fprintf(file, "boot_ip_ver : "UH_FMT"\n", ptr_struct->boot_ip_ver); + adb2c_add_indentation(file, indent_level); fprintf(file, "sriov_en : "UH_FMT"\n", ptr_struct->sriov_en); @@ -1791,12 +2606,12 @@ void tools_open_phy_reg_dump(const union tools_open_phy_reg *ptr_struct, FILE* f void tools_open_mnv_cfg_pack(const union tools_open_mnv_cfg *ptr_struct, u_int8_t* ptr_buff) { - tools_open_nvdi_pack(&(ptr_struct->nvdi), ptr_buff); + tools_open_mvts_pack(&(ptr_struct->mvts), ptr_buff); } void tools_open_mnv_cfg_unpack(union tools_open_mnv_cfg *ptr_struct, const u_int8_t* ptr_buff) { - tools_open_nvdi_unpack(&(ptr_struct->nvdi), ptr_buff); + tools_open_mvts_unpack(&(ptr_struct->mvts), ptr_buff); } void tools_open_mnv_cfg_print(const union tools_open_mnv_cfg *ptr_struct, FILE* file, int indent_level){ @@ -1835,6 +2650,14 @@ void tools_open_mnv_cfg_print(const union tools_open_mnv_cfg *ptr_struct, FILE* fprintf(file, "nvdi:\n"); tools_open_nvdi_print(&(ptr_struct->nvdi), file, indent_level + 1); + adb2c_add_indentation(file, indent_level); + fprintf(file, "nvqgc:\n"); + tools_open_nvqgc_print(&(ptr_struct->nvqgc), file, indent_level + 1); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "mvts:\n"); + tools_open_mvts_print(&(ptr_struct->mvts), file, indent_level + 1); + } int tools_open_mnv_cfg_size(void){ @@ -1845,6 +2668,162 @@ void tools_open_mnv_cfg_dump(const union tools_open_mnv_cfg *ptr_struct, FILE* f tools_open_mnv_cfg_print(ptr_struct, file, 0); } +void tools_open_option_rom_capability_pack(const struct tools_open_option_rom_capability *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=0; + adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->ip_ver); + +} + +void tools_open_option_rom_capability_unpack(struct tools_open_option_rom_capability *ptr_struct, const u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + u_int8_t val=0; + (void)val; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=0; + ptr_struct->ip_ver = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); + +} + +void tools_open_option_rom_capability_print(const struct tools_open_option_rom_capability *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== tools_open_option_rom_capability ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + adb2c_add_indentation(file, indent_level); + fprintf(file, "ip_ver : "UH_FMT"\n", ptr_struct->ip_ver); + +} + +int tools_open_option_rom_capability_size(void){ + return 4; +} + +void tools_open_option_rom_capability_dump(const struct tools_open_option_rom_capability *ptr_struct, FILE* file) { + tools_open_option_rom_capability_print(ptr_struct, file, 0); +} + +void tools_open_boot_settings_ext_pack(const struct tools_open_boot_settings_ext *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=22; + adb2c_push_bits_to_buff(ptr_buff, offset, 2, (u_int32_t)ptr_struct->ip_ver); + +} + +void tools_open_boot_settings_ext_unpack(struct tools_open_boot_settings_ext *ptr_struct, const u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + u_int8_t val=0; + (void)val; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=22; + ptr_struct->ip_ver = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 2); + +} + +void tools_open_boot_settings_ext_print(const struct tools_open_boot_settings_ext *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== tools_open_boot_settings_ext ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + adb2c_add_indentation(file, indent_level); + fprintf(file, "ip_ver : "UH_FMT"\n", ptr_struct->ip_ver); + +} + +int tools_open_boot_settings_ext_size(void){ + return 4; +} + +void tools_open_boot_settings_ext_dump(const struct tools_open_boot_settings_ext *ptr_struct, FILE* file) { + tools_open_boot_settings_ext_print(ptr_struct, file, 0); +} + +void tools_open_external_port_pack(const struct tools_open_external_port *ptr_struct, u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=31; + adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->port_owner); + + offset=30; + adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->allow_rd_counters); + +} + +void tools_open_external_port_unpack(struct tools_open_external_port *ptr_struct, const u_int8_t* ptr_buff){ + u_int32_t offset; + int i=0; + u_int8_t val=0; + (void)val; + (void)offset; + (void)i; + (void)ptr_struct; + (void)ptr_buff; + + offset=31; + ptr_struct->port_owner = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); + + offset=30; + ptr_struct->allow_rd_counters = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); + +} + +void tools_open_external_port_print(const struct tools_open_external_port *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== tools_open_external_port ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + adb2c_add_indentation(file, indent_level); + fprintf(file, "port_owner : "UH_FMT"\n", ptr_struct->port_owner); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "allow_rd_counters : "UH_FMT"\n", ptr_struct->allow_rd_counters); + +} + +int tools_open_external_port_size(void){ + return 8; +} + +void tools_open_external_port_dump(const struct tools_open_external_port *ptr_struct, FILE* file) { + tools_open_external_port_print(ptr_struct, file, 0); +} + void tools_open_lldp_nb_capability_pack(const struct tools_open_lldp_nb_capability *ptr_struct, u_int8_t* ptr_buff){ u_int32_t offset; int i=0; @@ -2943,8 +3922,17 @@ void tools_open_port_boot_state_pack(const struct tools_open_port_boot_state *pt (void)ptr_struct; (void)ptr_buff; - offset=30; - adb2c_push_bits_to_buff(ptr_buff, offset, 2, (u_int32_t)ptr_struct->port_boot_state); + offset=24; + adb2c_push_bits_to_buff(ptr_buff, offset, 8, (u_int32_t)ptr_struct->aux_power_indication_gpio); + + offset=2; + adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->aux_power_indication_gpio_en); + + offset=1; + adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->standby_on_aux); + + offset=0; + adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->power_up_on_aux); } @@ -2958,8 +3946,17 @@ void tools_open_port_boot_state_unpack(struct tools_open_port_boot_state *ptr_st (void)ptr_struct; (void)ptr_buff; - offset=30; - ptr_struct->port_boot_state = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 2); + offset=24; + ptr_struct->aux_power_indication_gpio = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 8); + + offset=2; + ptr_struct->aux_power_indication_gpio_en = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); + + offset=1; + ptr_struct->standby_on_aux = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); + + offset=0; + ptr_struct->power_up_on_aux = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); } @@ -2972,7 +3969,16 @@ void tools_open_port_boot_state_print(const struct tools_open_port_boot_state *p (void)indent_level; adb2c_add_indentation(file, indent_level); - fprintf(file, "port_boot_state : "UH_FMT"\n", ptr_struct->port_boot_state); + fprintf(file, "aux_power_indication_gpio : "UH_FMT"\n", ptr_struct->aux_power_indication_gpio); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "aux_power_indication_gpio_en : "UH_FMT"\n", ptr_struct->aux_power_indication_gpio_en); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "standby_on_aux : "UH_FMT"\n", ptr_struct->standby_on_aux); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "power_up_on_aux : "UH_FMT"\n", ptr_struct->power_up_on_aux); } @@ -3032,10 +4038,10 @@ void tools_open_pci_configuration_pack(const struct tools_open_pci_configuration adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->sriov_en); offset=90; - adb2c_push_bits_to_buff(ptr_buff, offset, 6, (u_int32_t)ptr_struct->log_vf_uar_bar_size); + adb2c_push_bits_to_buff(ptr_buff, offset, 6, (u_int32_t)ptr_struct->log_pf_uar_bar_size); offset=84; - adb2c_push_bits_to_buff(ptr_buff, offset, 6, (u_int32_t)ptr_struct->log_pf_uar_bar_size); + adb2c_push_bits_to_buff(ptr_buff, offset, 6, (u_int32_t)ptr_struct->log_vf_uar_bar_size); offset=74; adb2c_push_bits_to_buff(ptr_buff, offset, 10, (u_int32_t)ptr_struct->num_pf_msix); @@ -3095,10 +4101,10 @@ void tools_open_pci_configuration_unpack(struct tools_open_pci_configuration *pt ptr_struct->sriov_en = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); offset=90; - ptr_struct->log_vf_uar_bar_size = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 6); + ptr_struct->log_pf_uar_bar_size = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 6); offset=84; - ptr_struct->log_pf_uar_bar_size = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 6); + ptr_struct->log_vf_uar_bar_size = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 6); offset=74; ptr_struct->num_pf_msix = (u_int16_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 10); @@ -3156,10 +4162,10 @@ void tools_open_pci_configuration_print(const struct tools_open_pci_configuratio fprintf(file, "sriov_en : "UH_FMT"\n", ptr_struct->sriov_en); adb2c_add_indentation(file, indent_level); - fprintf(file, "log_vf_uar_bar_size : "UH_FMT"\n", ptr_struct->log_vf_uar_bar_size); + fprintf(file, "log_pf_uar_bar_size : "UH_FMT"\n", ptr_struct->log_pf_uar_bar_size); adb2c_add_indentation(file, indent_level); - fprintf(file, "log_pf_uar_bar_size : "UH_FMT"\n", ptr_struct->log_pf_uar_bar_size); + fprintf(file, "log_vf_uar_bar_size : "UH_FMT"\n", ptr_struct->log_vf_uar_bar_size); adb2c_add_indentation(file, indent_level); fprintf(file, "num_pf_msix : "UH_FMT"\n", ptr_struct->num_pf_msix); @@ -3201,7 +4207,7 @@ void tools_open_pci_capabilities_pack(const struct tools_open_pci_capabilities * adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->num_pfs_supported); offset=2; - adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->log_max_total_bar_valid); + adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->max_total_bar_valid); offset=1; adb2c_push_bits_to_buff(ptr_buff, offset, 1, (u_int32_t)ptr_struct->max_total_msix_valid); @@ -3240,7 +4246,7 @@ void tools_open_pci_capabilities_pack(const struct tools_open_pci_capabilities * adb2c_push_integer_to_buff(ptr_buff, offset, 4, (u_int64_t)ptr_struct->max_total_msix); offset=128; - adb2c_push_integer_to_buff(ptr_buff, offset, 4, (u_int64_t)ptr_struct->log_max_total_bar); + adb2c_push_integer_to_buff(ptr_buff, offset, 4, (u_int64_t)ptr_struct->max_total_bar); } @@ -3270,7 +4276,7 @@ void tools_open_pci_capabilities_unpack(struct tools_open_pci_capabilities *ptr_ ptr_struct->num_pfs_supported = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); offset=2; - ptr_struct->log_max_total_bar_valid = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); + ptr_struct->max_total_bar_valid = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); offset=1; ptr_struct->max_total_msix_valid = (u_int8_t)adb2c_pop_bits_from_buff(ptr_buff, offset, 1); @@ -3309,7 +4315,7 @@ void tools_open_pci_capabilities_unpack(struct tools_open_pci_capabilities *ptr_ ptr_struct->max_total_msix = (u_int32_t)adb2c_pop_integer_from_buff(ptr_buff, offset, 4); offset=128; - ptr_struct->log_max_total_bar = (u_int32_t)adb2c_pop_integer_from_buff(ptr_buff, offset, 4); + ptr_struct->max_total_bar = (u_int32_t)adb2c_pop_integer_from_buff(ptr_buff, offset, 4); } @@ -3337,7 +4343,7 @@ void tools_open_pci_capabilities_print(const struct tools_open_pci_capabilities fprintf(file, "num_pfs_supported : "UH_FMT"\n", ptr_struct->num_pfs_supported); adb2c_add_indentation(file, indent_level); - fprintf(file, "log_max_total_bar_valid : "UH_FMT"\n", ptr_struct->log_max_total_bar_valid); + fprintf(file, "max_total_bar_valid : "UH_FMT"\n", ptr_struct->max_total_bar_valid); adb2c_add_indentation(file, indent_level); fprintf(file, "max_total_msix_valid : "UH_FMT"\n", ptr_struct->max_total_msix_valid); @@ -3376,7 +4382,7 @@ void tools_open_pci_capabilities_print(const struct tools_open_pci_capabilities fprintf(file, "max_total_msix : "U32H_FMT"\n", ptr_struct->max_total_msix); adb2c_add_indentation(file, indent_level); - fprintf(file, "log_max_total_bar : "U32H_FMT"\n", ptr_struct->log_max_total_bar); + fprintf(file, "max_total_bar : "U32H_FMT"\n", ptr_struct->max_total_bar); } @@ -3723,6 +4729,78 @@ void tools_open_wol_dump(const struct tools_open_wol *ptr_struct, FILE* file) { tools_open_wol_print(ptr_struct, file, 0); } +void tools_open_misc_structs_pack(const union tools_open_misc_structs *ptr_struct, u_int8_t* ptr_buff) +{ + tools_open_mfg_info_pack(&(ptr_struct->mfg_info), ptr_buff); +} + +void tools_open_misc_structs_unpack(union tools_open_misc_structs *ptr_struct, const u_int8_t* ptr_buff) +{ + tools_open_mfg_info_unpack(&(ptr_struct->mfg_info), ptr_buff); +} + +void tools_open_misc_structs_print(const union tools_open_misc_structs *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== tools_open_misc_structs ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + adb2c_add_indentation(file, indent_level); + fprintf(file, "image_info:\n"); + tools_open_image_info_print(&(ptr_struct->image_info), file, indent_level + 1); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "mfg_info:\n"); + tools_open_mfg_info_print(&(ptr_struct->mfg_info), file, indent_level + 1); + +} + +int tools_open_misc_structs_size(void){ + return 1024; +} + +void tools_open_misc_structs_dump(const union tools_open_misc_structs *ptr_struct, FILE* file) { + tools_open_misc_structs_print(ptr_struct, file, 0); +} + +void tools_open_aux_img_data_pack(const union tools_open_aux_img_data *ptr_struct, u_int8_t* ptr_buff) +{ + tools_open_aux_tlv_pack(&(ptr_struct->aux_tlv), ptr_buff); +} + +void tools_open_aux_img_data_unpack(union tools_open_aux_img_data *ptr_struct, const u_int8_t* ptr_buff) +{ + tools_open_aux_tlv_unpack(&(ptr_struct->aux_tlv), ptr_buff); +} + +void tools_open_aux_img_data_print(const union tools_open_aux_img_data *ptr_struct, FILE* file, int indent_level){ + adb2c_add_indentation(file, indent_level); + fprintf(file, "======== tools_open_aux_img_data ========\n"); + int i=0; + (void)i;(void)ptr_struct; + (void)file; + (void)indent_level; + + adb2c_add_indentation(file, indent_level); + fprintf(file, "aux_data_hdr:\n"); + tools_open_aux_data_hdr_print(&(ptr_struct->aux_data_hdr), file, indent_level + 1); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "aux_tlv:\n"); + tools_open_aux_tlv_print(&(ptr_struct->aux_tlv), file, indent_level + 1); + +} + +int tools_open_aux_img_data_size(void){ + return 256; +} + +void tools_open_aux_img_data_dump(const union tools_open_aux_img_data *ptr_struct, FILE* file) { + tools_open_aux_img_data_print(ptr_struct, file, 0); +} + void tools_open_hcr_cmds_pack(const union tools_open_hcr_cmds *ptr_struct, u_int8_t* ptr_buff) { tools_open_query_def_params_per_port_pack(&(ptr_struct->query_def_params_per_port), ptr_buff); @@ -3797,12 +4875,12 @@ void tools_open_access_registers_dump(const union tools_open_access_registers *p void tools_open_nv_cfg_pack(const union tools_open_nv_cfg *ptr_struct, u_int8_t* ptr_buff) { - tools_open_lldp_nb_capability_pack(&(ptr_struct->lldp_nb_capability), ptr_buff); + tools_open_option_rom_capability_pack(&(ptr_struct->option_rom_capability), ptr_buff); } void tools_open_nv_cfg_unpack(union tools_open_nv_cfg *ptr_struct, const u_int8_t* ptr_buff) { - tools_open_lldp_nb_capability_unpack(&(ptr_struct->lldp_nb_capability), ptr_buff); + tools_open_option_rom_capability_unpack(&(ptr_struct->option_rom_capability), ptr_buff); } void tools_open_nv_cfg_print(const union tools_open_nv_cfg *ptr_struct, FILE* file, int indent_level){ @@ -3897,6 +4975,18 @@ void tools_open_nv_cfg_print(const union tools_open_nv_cfg *ptr_struct, FILE* fi fprintf(file, "lldp_nb_capability:\n"); tools_open_lldp_nb_capability_print(&(ptr_struct->lldp_nb_capability), file, indent_level + 1); + adb2c_add_indentation(file, indent_level); + fprintf(file, "external_port:\n"); + tools_open_external_port_print(&(ptr_struct->external_port), file, indent_level + 1); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "boot_settings_ext:\n"); + tools_open_boot_settings_ext_print(&(ptr_struct->boot_settings_ext), file, indent_level + 1); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "option_rom_capability:\n"); + tools_open_option_rom_capability_print(&(ptr_struct->option_rom_capability), file, indent_level + 1); + } int tools_open_nv_cfg_size(void){ @@ -3909,12 +4999,12 @@ void tools_open_nv_cfg_dump(const union tools_open_nv_cfg *ptr_struct, FILE* fil void tools_open_tools_open_pack(const union tools_open_tools_open *ptr_struct, u_int8_t* ptr_buff) { - tools_open_hcr_cmds_pack(&(ptr_struct->HcrCmds), ptr_buff); + tools_open_misc_structs_pack(&(ptr_struct->MiscStructs), ptr_buff); } void tools_open_tools_open_unpack(union tools_open_tools_open *ptr_struct, const u_int8_t* ptr_buff) { - tools_open_hcr_cmds_unpack(&(ptr_struct->HcrCmds), ptr_buff); + tools_open_misc_structs_unpack(&(ptr_struct->MiscStructs), ptr_buff); } void tools_open_tools_open_print(const union tools_open_tools_open *ptr_struct, FILE* file, int indent_level){ @@ -3937,6 +5027,14 @@ void tools_open_tools_open_print(const union tools_open_tools_open *ptr_struct, fprintf(file, "HcrCmds:\n"); tools_open_hcr_cmds_print(&(ptr_struct->HcrCmds), file, indent_level + 1); + adb2c_add_indentation(file, indent_level); + fprintf(file, "AuxImgData:\n"); + tools_open_aux_img_data_print(&(ptr_struct->AuxImgData), file, indent_level + 1); + + adb2c_add_indentation(file, indent_level); + fprintf(file, "MiscStructs:\n"); + tools_open_misc_structs_print(&(ptr_struct->MiscStructs), file, indent_level + 1); + } int tools_open_tools_open_size(void){ diff --git a/tools_layouts/tools_open_layouts.h b/tools_layouts/tools_open_layouts.h index 1d7afd7..3bacbe4 100644 --- a/tools_layouts/tools_open_layouts.h +++ b/tools_layouts/tools_open_layouts.h @@ -31,7 +31,7 @@ */ /*** - *** This file was generated at "2015-08-31 18:48:47" + *** This file was generated at "2016-05-04 19:06:49" *** by: *** > /mswg/release/eat_me/last_release/adabe_plugins/adb2c/adb2pack.py --input adb/tools_open/tools_open.adb --file-prefix tools_open --prefix tools_open_ ***/ @@ -133,6 +133,47 @@ struct tools_open_global_type { u_int8_t param_class; }; +/* Description - */ +/* Size in bytes - 8 */ +struct tools_open_ts_entry { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - Timestamp day - 2 packed BCD */ + /* 0.0 - 0.7 */ + u_int8_t ts_day; + /* Description - Timestamp month - 2 packed BCD */ + /* 0.8 - 0.15 */ + u_int8_t ts_month; + /* Description - Timestamp year - 4 packed BCD */ + /* 0.16 - 4.31 */ + u_int16_t ts_year; +/*---------------- DWORD[1] (Offset 0x4) ----------------*/ + /* Description - Timestamp seconds - 2 packed BCD */ + /* 4.8 - 4.15 */ + u_int8_t ts_seconds; + /* Description - Timestamp minotes - 2 packed BCD */ + /* 4.16 - 4.23 */ + u_int8_t ts_minutes; + /* Description - Timestamp hour - 2 packed BCD */ + /* 4.24 - 8.31 */ + u_int8_t ts_hour; +}; + +/* Description - */ +/* Size in bytes - 8 */ +struct tools_open_fw_version { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - fw_version_major */ + /* 0.16 - 4.31 */ + u_int16_t fw_ver_major; +/*---------------- DWORD[1] (Offset 0x4) ----------------*/ + /* Description - fw version subminor */ + /* 4.0 - 4.15 */ + u_int16_t fw_ver_subminor; + /* Description - fw_version_minor */ + /* 4.16 - 8.31 */ + u_int16_t fw_ver_minor; +}; + /* Description - */ /* Size in bytes - 4 */ union tools_open_tlv_type { @@ -171,6 +212,19 @@ This field is only valid for Address + Read and Address + Write operations, prov u_int16_t addr; }; +/* Description - */ +/* Size in bytes - 16 */ +struct tools_open_timestamp { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - fw_version */ + /* 0.0 - 8.31 */ + struct tools_open_fw_version fw_version; +/*---------------- DWORD[2] (Offset 0x8) ----------------*/ + /* Description - Timestamp */ + /* 8.0 - 16.31 */ + struct tools_open_ts_entry ts_entry; +}; + /* Description - */ /* Size in bytes - 12 */ struct tools_open_nv_hdr_fifth_gen { @@ -185,6 +239,12 @@ struct tools_open_nv_hdr_fifth_gen { /* Description - Configuration item version */ /* 0.12 - 0.15 */ u_int8_t version; + /* Description - when set, the default field is supported. */ + /* 0.22 - 0.22 */ + u_int8_t default_supported; + /* Description - when set in query , will display the default configuration */ + /* 0.23 - 0.23 */ + u_int8_t default_; /* Description - enables reading the TLV by lower priorities 0 - TLV can be read by the subsequent lifecycle priorities. 1 - TLV cannot be read by the subsequent lifecycle priorities. @@ -198,9 +258,6 @@ struct tools_open_nv_hdr_fifth_gen { */ /* 0.25 - 0.25 */ u_int8_t over_en; - /* Description - when set in query , will display the default configuration */ - /* 0.28 - 0.28 */ - u_int8_t default_; /*---------------- DWORD[1] (Offset 0x4) ----------------*/ /* Description - */ /* 4.0 - 8.31 */ @@ -232,6 +289,40 @@ struct tools_open_nv_hdr { u_int8_t version; }; +/* Description - */ +/* Size in bytes - 20 */ +struct tools_open_aux_tlv_header { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - */ + /* 0.0 - 0.7 */ + u_int8_t minor_version; + /* Description - */ + /* 0.8 - 0.15 */ + u_int8_t major_version; + /* Description - */ + /* 0.16 - 0.23 */ + u_int8_t type; + /* Description - */ + /* 0.28 - 4.31 */ + u_int8_t header_type; +/*---------------- DWORD[1] (Offset 0x4) ----------------*/ + /* Description - */ + /* 4.0 - 8.31 */ + u_int32_t length; +/*---------------- DWORD[2] (Offset 0x8) ----------------*/ + /* Description - */ + /* 8.0 - 8.15 */ + u_int16_t crc; +/*---------------- DWORD[3] (Offset 0xc) ----------------*/ + /* Description - */ + /* 12.0 - 16.31 */ + u_int32_t reserved0; +/*---------------- DWORD[4] (Offset 0x10) ----------------*/ + /* Description - */ + /* 16.0 - 20.31 */ + u_int32_t reserved1; +}; + /* Description - */ /* Size in bytes - 264 */ struct tools_open_pmdio { @@ -320,6 +411,34 @@ Used for external Phy FW burning. When set, the MDIO I/F is used for an external u_int8_t misc_cap; }; +/* Description - */ +/* Size in bytes - 20 */ +struct tools_open_mvts { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - A SET operation with this flag set will only check if the new timestamp can be configured without upda ting NVRAM */ + /* 0.29 - 0.29 */ + u_int8_t check_timestamp_flag; + /* Description - A GET operation with this flag set, will return the running FW version instead */ + /* 0.30 - 0.30 */ + u_int8_t running_flag; + /* Description - A SET operation with this flag on will clear the running and other bank timestamps */ + /* 0.31 - 4.31 */ + u_int8_t clear_all_ts_flag; +/*---------------- DWORD[1] (Offset 0x4) ----------------*/ + /* Description - Timestamp entry */ + /* 4.0 - 20.31 */ + struct tools_open_timestamp timestamp; +}; + +/* Description - */ +/* Size in bytes - 16 */ +struct tools_open_nvqgc { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - NVDA read factory settings. 0: Unsupported. 1: Supported. */ + /* 0.0 - 0.0 */ + u_int8_t read_factory_settings_support; +}; + /* Description - */ /* Size in bytes - 12 */ struct tools_open_nvdi { @@ -408,6 +527,89 @@ struct tools_open_mnva { u_int8_t data[128]; }; +/* Description - */ +/* Size in bytes - 320 */ +struct tools_open_mfg_info { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - */ + /* 0.24 - 16.23 */ + char psid[17]; +/*---------------- DWORD[7] (Offset 0x1c) ----------------*/ + /* Description - MFG_INFO section minor version */ + /* 28.16 - 28.23 */ + u_int8_t minor_version; + /* Description - MFG_INFO section major version */ + /* 28.24 - 32.31 */ + u_int8_t major_version; +/*---------------- DWORD[24] (Offset 0x60) ----------------*/ + /* Description - original PRS used to generate the FW binary */ + /* 96.24 - 192.23 */ + char orig_prs_name[97]; +}; + +/* Description - */ +/* Size in bytes - 1024 */ +struct tools_open_image_info { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - IMAGE_INFO section minor version */ + /* 0.16 - 0.23 */ + u_int8_t minor_version; + /* Description - IMAGE_INFO section major version */ + /* 0.24 - 4.31 */ + u_int8_t major_version; +/*---------------- DWORD[9] (Offset 0x24) ----------------*/ + /* Description - */ + /* 36.24 - 52.23 */ + char psid[17]; +/*---------------- DWORD[116] (Offset 0x1d0) ----------------*/ + /* Description - Product description */ + /* 464.24 - 720.23 */ + char description[257]; +/*---------------- DWORD[208] (Offset 0x340) ----------------*/ + /* Description - Product name */ + /* 832.24 - 896.23 */ + char name[65]; +/*---------------- DWORD[224] (Offset 0x380) ----------------*/ + /* Description - PRS used to generate the FW binary */ + /* 896.24 - 992.23 */ + char prs_name[97]; +}; + +/* Description - */ +/* Size in bytes - 256 */ +struct tools_open_aux_tlv { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - */ + /* 0.0 - 20.31 */ + struct tools_open_aux_tlv_header aux_tlv_header; +/*---------------- DWORD[5] (Offset 0x14) ----------------*/ + /* Description - tlv data */ + /* 20.24 - 148.23 */ + u_int8_t data[128]; +}; + +/* Description - */ +/* Size in bytes - 16 */ +struct tools_open_aux_data_hdr { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - 0x544c563a : ascii for "TLV:" + */ + /* 0.0 - 4.31 */ + u_int32_t signature0; +/*---------------- DWORD[1] (Offset 0x4) ----------------*/ + /* Description - 0x6548bc86 */ + /* 4.0 - 8.31 */ + u_int32_t signature1; +/*---------------- DWORD[2] (Offset 0x8) ----------------*/ + /* Description - 0x01020305 */ + /* 8.0 - 12.31 */ + u_int32_t signature2; +/*---------------- DWORD[3] (Offset 0xc) ----------------*/ + /* Description - 0x080d1522 */ + /* 12.0 - 16.31 */ + u_int32_t signature3; +}; + /* Description - */ /* Size in bytes - 28 */ struct tools_open_query_def_params_per_port { @@ -453,6 +655,9 @@ struct tools_open_query_def_params_per_port { /* Description - */ /* 8.0 - 8.15 */ u_int16_t default_boot_pkey; + /* Description - */ + /* 8.24 - 8.25 */ + u_int8_t boot_ip_ver; /* Description - Legacy option ROM supports NV config setting 0x2023. */ /* 8.27 - 8.27 */ u_int8_t nv_config_infiniband_dhcp_settings; @@ -522,6 +727,9 @@ struct tools_open_query_def_params_global { /* Description - maximum value allowed for the uar bar size (log2 base) */ /* 4.12 - 4.15 */ u_int8_t max_uar_bar_size; + /* Description - */ + /* 4.21 - 4.21 */ + u_int8_t boot_ip_ver; /* Description - default value of sriov (enabled or disabled) */ /* 4.31 - 8.31 */ u_int8_t sriov_en; @@ -564,6 +772,42 @@ union tools_open_mnv_cfg { /* Description - */ /* 0.0 - 12.31 */ struct tools_open_nvdi nvdi; + /* Description - */ + /* 0.0 - 16.31 */ + struct tools_open_nvqgc nvqgc; + /* Description - */ + /* 0.0 - 20.31 */ + struct tools_open_mvts mvts; +}; + +/* Description - */ +/* Size in bytes - 4 */ +struct tools_open_option_rom_capability { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - flexboot supports configuration of PXE boot IP version defined in boot settings ext parameter */ + /* 0.31 - 4.31 */ + u_int8_t ip_ver; +}; + +/* Description - */ +/* Size in bytes - 4 */ +struct tools_open_boot_settings_ext { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - Select which IP protocol version will be used by flexboot */ + /* 0.8 - 0.9 */ + u_int8_t ip_ver; +}; + +/* Description - */ +/* Size in bytes - 8 */ +struct tools_open_external_port { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - */ + /* 0.0 - 0.0 */ + u_int8_t port_owner; + /* Description - */ + /* 0.1 - 0.1 */ + u_int8_t allow_rd_counters; }; /* Description - */ @@ -967,13 +1211,24 @@ struct tools_open_iscsi_settings { /* Size in bytes - 4 */ struct tools_open_port_boot_state { /*---------------- DWORD[0] (Offset 0x0) ----------------*/ - /* Description - 0 Normal operation -1 SFP power off -2 SERDES power off -3 admin linkDown - */ - /* 0.0 - 0.1 */ - u_int8_t port_boot_state; + /* Description - The number of the GPIO that is connected to the AUX power setting circuitry */ + /* 0.0 - 0.7 */ + u_int8_t aux_power_indication_gpio; + /* Description - 0 not present + 1 present + if the NIC has a circuitry that can indicate when the device is working on AUX power. */ + /* 0.29 - 0.29 */ + u_int8_t aux_power_indication_gpio_en; + /* Description - 0 disabled + 1 enabled + When enabled, the device will response to standby indication from PCI or GPIO (if configured) and reduce power consumption while keeping the SMBUS on. To meet the power requirement, the NIC will disable the network ports and cage power on standby mode (indicate with PCIe L2/L3 message sequence of with the GPIO */ + /* 0.30 - 0.30 */ + u_int8_t standby_on_aux; + /* Description - 0 Normal (admin-on) + 1 low power + When set to low-power the device will boot with minimal power until the GPIO detects that the PCIe power rails are active. The low power mode is effective ONLY when there is a circuitry to detect AUX power condition (with GPIO indication) */ + /* 0.31 - 4.31 */ + u_int8_t power_up_on_aux; }; /* Description - */ @@ -1023,12 +1278,12 @@ struct tools_open_pci_configuration { /* 4.31 - 8.31 */ u_int8_t sriov_en; /*---------------- DWORD[2] (Offset 0x8) ----------------*/ - /* Description - Log 2 of the size of a VF's UAR BAR */ - /* 8.0 - 8.5 */ - u_int8_t log_vf_uar_bar_size; /* Description - Log 2 of the size of a PF's UAR BAR */ - /* 8.6 - 8.11 */ + /* 8.0 - 8.5 */ u_int8_t log_pf_uar_bar_size; + /* Description - Log 2 of the size of a VF's UAR BAR */ + /* 8.6 - 8.11 */ + u_int8_t log_vf_uar_bar_size; /* Description - Number of MSI-X vectors and EQs per PF */ /* 8.12 - 8.21 */ u_int16_t num_pf_msix; @@ -1056,9 +1311,9 @@ struct tools_open_pci_capabilities { /* Description - 1 when the num_pfs field is configurable and max_num_pfs is valid */ /* 0.28 - 0.28 */ u_int8_t num_pfs_supported; - /* Description - 1 when the log_max_total_bar field is valid */ + /* Description - 1 when the max_total_bar field is valid */ /* 0.29 - 0.29 */ - u_int8_t log_max_total_bar_valid; + u_int8_t max_total_bar_valid; /* Description - 1 when the total_msix field is valid */ /* 0.30 - 0.30 */ u_int8_t max_total_msix_valid; @@ -1099,9 +1354,9 @@ struct tools_open_pci_capabilities { /* 12.0 - 16.31 */ u_int32_t max_total_msix; /*---------------- DWORD[4] (Offset 0x10) ----------------*/ - /* Description - Log 2 of the maximum total of the MMIO space for all PFs and VFs combined */ + /* Description - Maximum total of the MMIO space for all PFs and VFs combined, in megabytes. */ /* 16.0 - 20.31 */ - u_int32_t log_max_total_bar; + u_int32_t max_total_bar; }; /* Description - */ @@ -1189,6 +1444,30 @@ struct tools_open_wol { u_int8_t en_wol_phy; }; +/* Description - */ +/* Size in bytes - 1024 */ +union tools_open_misc_structs { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - */ + /* 0.0 - 1024.31 */ + struct tools_open_image_info image_info; + /* Description - */ + /* 0.0 - 320.31 */ + struct tools_open_mfg_info mfg_info; +}; + +/* Description - */ +/* Size in bytes - 256 */ +union tools_open_aux_img_data { +/*---------------- DWORD[0] (Offset 0x0) ----------------*/ + /* Description - image aux data section header */ + /* 0.0 - 16.31 */ + struct tools_open_aux_data_hdr aux_data_hdr; + /* Description - image tlv entry */ + /* 0.0 - 256.31 */ + struct tools_open_aux_tlv aux_tlv; +}; + /* Description - */ /* Size in bytes - 264 */ union tools_open_hcr_cmds { @@ -1280,6 +1559,15 @@ union tools_open_nv_cfg { /* Description - */ /* 0.0 - 24.31 */ struct tools_open_lldp_nb_capability lldp_nb_capability; + /* Description - */ + /* 0.0 - 8.31 */ + struct tools_open_external_port external_port; + /* Description - */ + /* 0.0 - 4.31 */ + struct tools_open_boot_settings_ext boot_settings_ext; + /* Description - */ + /* 0.0 - 4.31 */ + struct tools_open_option_rom_capability option_rom_capability; }; /* Description - */ @@ -1295,6 +1583,12 @@ union tools_open_tools_open { /* Description - Tools HCR commands structs */ /* 0.0 - 264.31 */ union tools_open_hcr_cmds HcrCmds; + /* Description - aux image data layout */ + /* 0.0 - 256.31 */ + union tools_open_aux_img_data AuxImgData; + /* Description - Misc structs needed for integration on new FW features */ + /* 0.0 - 1024.31 */ + union tools_open_misc_structs MiscStructs; }; /* Description - */ @@ -1354,6 +1648,20 @@ void tools_open_global_type_print(const struct tools_open_global_type *ptr_struc int tools_open_global_type_size(void); #define TOOLS_OPEN_GLOBAL_TYPE_SIZE (0x4) void tools_open_global_type_dump(const struct tools_open_global_type *ptr_struct, FILE* file); +/* ts_entry */ +void tools_open_ts_entry_pack(const struct tools_open_ts_entry *ptr_struct, u_int8_t* ptr_buff); +void tools_open_ts_entry_unpack(struct tools_open_ts_entry *ptr_struct, const u_int8_t* ptr_buff); +void tools_open_ts_entry_print(const struct tools_open_ts_entry *ptr_struct, FILE* file, int indent_level); +int tools_open_ts_entry_size(void); +#define TOOLS_OPEN_TS_ENTRY_SIZE (0x8) +void tools_open_ts_entry_dump(const struct tools_open_ts_entry *ptr_struct, FILE* file); +/* fw_version */ +void tools_open_fw_version_pack(const struct tools_open_fw_version *ptr_struct, u_int8_t* ptr_buff); +void tools_open_fw_version_unpack(struct tools_open_fw_version *ptr_struct, const u_int8_t* ptr_buff); +void tools_open_fw_version_print(const struct tools_open_fw_version *ptr_struct, FILE* file, int indent_level); +int tools_open_fw_version_size(void); +#define TOOLS_OPEN_FW_VERSION_SIZE (0x8) +void tools_open_fw_version_dump(const struct tools_open_fw_version *ptr_struct, FILE* file); /* tlv_type */ void tools_open_tlv_type_pack(const union tools_open_tlv_type *ptr_struct, u_int8_t* ptr_buff); void tools_open_tlv_type_unpack(union tools_open_tlv_type *ptr_struct, const u_int8_t* ptr_buff); @@ -1368,6 +1676,13 @@ void tools_open_pmdio_addr_data_print(const struct tools_open_pmdio_addr_data *p int tools_open_pmdio_addr_data_size(void); #define TOOLS_OPEN_PMDIO_ADDR_DATA_SIZE (0x4) void tools_open_pmdio_addr_data_dump(const struct tools_open_pmdio_addr_data *ptr_struct, FILE* file); +/* timestamp */ +void tools_open_timestamp_pack(const struct tools_open_timestamp *ptr_struct, u_int8_t* ptr_buff); +void tools_open_timestamp_unpack(struct tools_open_timestamp *ptr_struct, const u_int8_t* ptr_buff); +void tools_open_timestamp_print(const struct tools_open_timestamp *ptr_struct, FILE* file, int indent_level); +int tools_open_timestamp_size(void); +#define TOOLS_OPEN_TIMESTAMP_SIZE (0x10) +void tools_open_timestamp_dump(const struct tools_open_timestamp *ptr_struct, FILE* file); /* nv_hdr_fifth_gen */ void tools_open_nv_hdr_fifth_gen_pack(const struct tools_open_nv_hdr_fifth_gen *ptr_struct, u_int8_t* ptr_buff); void tools_open_nv_hdr_fifth_gen_unpack(struct tools_open_nv_hdr_fifth_gen *ptr_struct, const u_int8_t* ptr_buff); @@ -1382,6 +1697,13 @@ void tools_open_nv_hdr_print(const struct tools_open_nv_hdr *ptr_struct, FILE* f int tools_open_nv_hdr_size(void); #define TOOLS_OPEN_NV_HDR_SIZE (0x8) void tools_open_nv_hdr_dump(const struct tools_open_nv_hdr *ptr_struct, FILE* file); +/* aux_tlv_header */ +void tools_open_aux_tlv_header_pack(const struct tools_open_aux_tlv_header *ptr_struct, u_int8_t* ptr_buff); +void tools_open_aux_tlv_header_unpack(struct tools_open_aux_tlv_header *ptr_struct, const u_int8_t* ptr_buff); +void tools_open_aux_tlv_header_print(const struct tools_open_aux_tlv_header *ptr_struct, FILE* file, int indent_level); +int tools_open_aux_tlv_header_size(void); +#define TOOLS_OPEN_AUX_TLV_HEADER_SIZE (0x14) +void tools_open_aux_tlv_header_dump(const struct tools_open_aux_tlv_header *ptr_struct, FILE* file); /* pmdio */ void tools_open_pmdio_pack(const struct tools_open_pmdio *ptr_struct, u_int8_t* ptr_buff); void tools_open_pmdio_unpack(struct tools_open_pmdio *ptr_struct, const u_int8_t* ptr_buff); @@ -1396,6 +1718,20 @@ void tools_open_pmdic_print(const struct tools_open_pmdic *ptr_struct, FILE* fil int tools_open_pmdic_size(void); #define TOOLS_OPEN_PMDIC_SIZE (0xc) void tools_open_pmdic_dump(const struct tools_open_pmdic *ptr_struct, FILE* file); +/* mvts */ +void tools_open_mvts_pack(const struct tools_open_mvts *ptr_struct, u_int8_t* ptr_buff); +void tools_open_mvts_unpack(struct tools_open_mvts *ptr_struct, const u_int8_t* ptr_buff); +void tools_open_mvts_print(const struct tools_open_mvts *ptr_struct, FILE* file, int indent_level); +int tools_open_mvts_size(void); +#define TOOLS_OPEN_MVTS_SIZE (0x14) +void tools_open_mvts_dump(const struct tools_open_mvts *ptr_struct, FILE* file); +/* nvqgc */ +void tools_open_nvqgc_pack(const struct tools_open_nvqgc *ptr_struct, u_int8_t* ptr_buff); +void tools_open_nvqgc_unpack(struct tools_open_nvqgc *ptr_struct, const u_int8_t* ptr_buff); +void tools_open_nvqgc_print(const struct tools_open_nvqgc *ptr_struct, FILE* file, int indent_level); +int tools_open_nvqgc_size(void); +#define TOOLS_OPEN_NVQGC_SIZE (0x10) +void tools_open_nvqgc_dump(const struct tools_open_nvqgc *ptr_struct, FILE* file); /* nvdi */ void tools_open_nvdi_pack(const struct tools_open_nvdi *ptr_struct, u_int8_t* ptr_buff); void tools_open_nvdi_unpack(struct tools_open_nvdi *ptr_struct, const u_int8_t* ptr_buff); @@ -1445,6 +1781,34 @@ void tools_open_mnva_print(const struct tools_open_mnva *ptr_struct, FILE* file, int tools_open_mnva_size(void); #define TOOLS_OPEN_MNVA_SIZE (0x100) void tools_open_mnva_dump(const struct tools_open_mnva *ptr_struct, FILE* file); +/* mfg_info */ +void tools_open_mfg_info_pack(const struct tools_open_mfg_info *ptr_struct, u_int8_t* ptr_buff); +void tools_open_mfg_info_unpack(struct tools_open_mfg_info *ptr_struct, const u_int8_t* ptr_buff); +void tools_open_mfg_info_print(const struct tools_open_mfg_info *ptr_struct, FILE* file, int indent_level); +int tools_open_mfg_info_size(void); +#define TOOLS_OPEN_MFG_INFO_SIZE (0x140) +void tools_open_mfg_info_dump(const struct tools_open_mfg_info *ptr_struct, FILE* file); +/* image_info */ +void tools_open_image_info_pack(const struct tools_open_image_info *ptr_struct, u_int8_t* ptr_buff); +void tools_open_image_info_unpack(struct tools_open_image_info *ptr_struct, const u_int8_t* ptr_buff); +void tools_open_image_info_print(const struct tools_open_image_info *ptr_struct, FILE* file, int indent_level); +int tools_open_image_info_size(void); +#define TOOLS_OPEN_IMAGE_INFO_SIZE (0x400) +void tools_open_image_info_dump(const struct tools_open_image_info *ptr_struct, FILE* file); +/* aux_tlv */ +void tools_open_aux_tlv_pack(const struct tools_open_aux_tlv *ptr_struct, u_int8_t* ptr_buff); +void tools_open_aux_tlv_unpack(struct tools_open_aux_tlv *ptr_struct, const u_int8_t* ptr_buff); +void tools_open_aux_tlv_print(const struct tools_open_aux_tlv *ptr_struct, FILE* file, int indent_level); +int tools_open_aux_tlv_size(void); +#define TOOLS_OPEN_AUX_TLV_SIZE (0x100) +void tools_open_aux_tlv_dump(const struct tools_open_aux_tlv *ptr_struct, FILE* file); +/* aux_data_hdr */ +void tools_open_aux_data_hdr_pack(const struct tools_open_aux_data_hdr *ptr_struct, u_int8_t* ptr_buff); +void tools_open_aux_data_hdr_unpack(struct tools_open_aux_data_hdr *ptr_struct, const u_int8_t* ptr_buff); +void tools_open_aux_data_hdr_print(const struct tools_open_aux_data_hdr *ptr_struct, FILE* file, int indent_level); +int tools_open_aux_data_hdr_size(void); +#define TOOLS_OPEN_AUX_DATA_HDR_SIZE (0x10) +void tools_open_aux_data_hdr_dump(const struct tools_open_aux_data_hdr *ptr_struct, FILE* file); /* query_def_params_per_port */ void tools_open_query_def_params_per_port_pack(const struct tools_open_query_def_params_per_port *ptr_struct, u_int8_t* ptr_buff); void tools_open_query_def_params_per_port_unpack(struct tools_open_query_def_params_per_port *ptr_struct, const u_int8_t* ptr_buff); @@ -1473,6 +1837,27 @@ void tools_open_mnv_cfg_print(const union tools_open_mnv_cfg *ptr_struct, FILE* int tools_open_mnv_cfg_size(void); #define TOOLS_OPEN_MNV_CFG_SIZE (0x100) void tools_open_mnv_cfg_dump(const union tools_open_mnv_cfg *ptr_struct, FILE* file); +/* option_rom_capability */ +void tools_open_option_rom_capability_pack(const struct tools_open_option_rom_capability *ptr_struct, u_int8_t* ptr_buff); +void tools_open_option_rom_capability_unpack(struct tools_open_option_rom_capability *ptr_struct, const u_int8_t* ptr_buff); +void tools_open_option_rom_capability_print(const struct tools_open_option_rom_capability *ptr_struct, FILE* file, int indent_level); +int tools_open_option_rom_capability_size(void); +#define TOOLS_OPEN_OPTION_ROM_CAPABILITY_SIZE (0x4) +void tools_open_option_rom_capability_dump(const struct tools_open_option_rom_capability *ptr_struct, FILE* file); +/* boot_settings_ext */ +void tools_open_boot_settings_ext_pack(const struct tools_open_boot_settings_ext *ptr_struct, u_int8_t* ptr_buff); +void tools_open_boot_settings_ext_unpack(struct tools_open_boot_settings_ext *ptr_struct, const u_int8_t* ptr_buff); +void tools_open_boot_settings_ext_print(const struct tools_open_boot_settings_ext *ptr_struct, FILE* file, int indent_level); +int tools_open_boot_settings_ext_size(void); +#define TOOLS_OPEN_BOOT_SETTINGS_EXT_SIZE (0x4) +void tools_open_boot_settings_ext_dump(const struct tools_open_boot_settings_ext *ptr_struct, FILE* file); +/* external_port */ +void tools_open_external_port_pack(const struct tools_open_external_port *ptr_struct, u_int8_t* ptr_buff); +void tools_open_external_port_unpack(struct tools_open_external_port *ptr_struct, const u_int8_t* ptr_buff); +void tools_open_external_port_print(const struct tools_open_external_port *ptr_struct, FILE* file, int indent_level); +int tools_open_external_port_size(void); +#define TOOLS_OPEN_EXTERNAL_PORT_SIZE (0x8) +void tools_open_external_port_dump(const struct tools_open_external_port *ptr_struct, FILE* file); /* lldp_nb_capability */ void tools_open_lldp_nb_capability_pack(const struct tools_open_lldp_nb_capability *ptr_struct, u_int8_t* ptr_buff); void tools_open_lldp_nb_capability_unpack(struct tools_open_lldp_nb_capability *ptr_struct, const u_int8_t* ptr_buff); @@ -1620,6 +2005,20 @@ void tools_open_wol_print(const struct tools_open_wol *ptr_struct, FILE* file, i int tools_open_wol_size(void); #define TOOLS_OPEN_WOL_SIZE (0x8) void tools_open_wol_dump(const struct tools_open_wol *ptr_struct, FILE* file); +/* misc_structs */ +void tools_open_misc_structs_pack(const union tools_open_misc_structs *ptr_struct, u_int8_t* ptr_buff); +void tools_open_misc_structs_unpack(union tools_open_misc_structs *ptr_struct, const u_int8_t* ptr_buff); +void tools_open_misc_structs_print(const union tools_open_misc_structs *ptr_struct, FILE* file, int indent_level); +int tools_open_misc_structs_size(void); +#define TOOLS_OPEN_MISC_STRUCTS_SIZE (0x400) +void tools_open_misc_structs_dump(const union tools_open_misc_structs *ptr_struct, FILE* file); +/* aux_img_data */ +void tools_open_aux_img_data_pack(const union tools_open_aux_img_data *ptr_struct, u_int8_t* ptr_buff); +void tools_open_aux_img_data_unpack(union tools_open_aux_img_data *ptr_struct, const u_int8_t* ptr_buff); +void tools_open_aux_img_data_print(const union tools_open_aux_img_data *ptr_struct, FILE* file, int indent_level); +int tools_open_aux_img_data_size(void); +#define TOOLS_OPEN_AUX_IMG_DATA_SIZE (0x100) +void tools_open_aux_img_data_dump(const union tools_open_aux_img_data *ptr_struct, FILE* file); /* hcr_cmds */ void tools_open_hcr_cmds_pack(const union tools_open_hcr_cmds *ptr_struct, u_int8_t* ptr_buff); void tools_open_hcr_cmds_unpack(union tools_open_hcr_cmds *ptr_struct, const u_int8_t* ptr_buff); diff --git a/tools_res_mgmt/Makefile.am b/tools_res_mgmt/Makefile.am index e155ed4..cf9819f 100644 --- a/tools_res_mgmt/Makefile.am +++ b/tools_res_mgmt/Makefile.am @@ -38,5 +38,5 @@ INCLUDES = -I. -I../common -I$(MTCR_DIR) -I.. -I$(USER_DIR)/mtcr_ul AM_CFLAGS = -W -Wall -Werror -g -MP -MD $(COMPILER_FPIC) noinst_LIBRARIES = libtools_res_mgmt.a -libtools_res_mgmt_a_SOURCES = tools_res_mgmt.c +libtools_res_mgmt_a_SOURCES = tools_res_mgmt.c tools_time.c diff --git a/tools_res_mgmt/tools_res_mgmt.c b/tools_res_mgmt/tools_res_mgmt.c index 08ee072..625da96 100644 --- a/tools_res_mgmt/tools_res_mgmt.c +++ b/tools_res_mgmt/tools_res_mgmt.c @@ -31,18 +31,25 @@ */ #include +#include #include #include #include #include -#include "tools_res_mgmt.h" + +#if !defined(__FreeBSD__) && !defined(UEFI_BUILD) +#include +#endif #ifdef __WIN__ #include #define getpid() _getpid() #endif +#include "tools_res_mgmt.h" +#include "tools_time.h" + #define VSEC_SEM_NUM 10 #define HW_SEM_NUM VSEC_SEM_NUM @@ -90,7 +97,8 @@ static const char* status_to_str[] = "Tools resource management interface not available", "Device not supported", "Resource not supported", - "CR-Space access error" + "CR-Space access error", + "Memory allocation failed" }; struct device_sem_info @@ -105,16 +113,6 @@ static u_int32_t g_vsec_sem_addr[VSEC_SEM_NUM] = {0x0, 0x10}; #define HW_SEM_ADDR_MASK 0xf static struct device_sem_info g_dev_sem_info_db[] = { - { - DeviceConnectX, // dev_id - {0xf03bc}, // hw_sem_addr - 0, // vsec_sem_supported - }, - { - DeviceConnectX2, // dev_id - {0xf03bc}, // hw_sem_addr - 0, // vsec_sem_supported - }, { DeviceConnectX3, // dev_id {0xf03bc, 0xf03a0}, // hw_sem_addr @@ -125,11 +123,6 @@ static struct device_sem_info g_dev_sem_info_db[] = { {0xf03bc, 0xf03a0}, // hw_sem_addr 0, // vsec_sem_supported }, - { - DeviceInfiniScaleIV, // dev_id - {0}, // hw_sem_addr - 0, // vsec_sem_supported - }, { DeviceSwitchX, // dev_id {0}, // hw_sem_addr @@ -160,6 +153,26 @@ static struct device_sem_info g_dev_sem_info_db[] = { {0xe250c}, // hw_sem_addr 1, // vsec_sem_supported }, + { + DeviceSwitchIB2, // dev_id + {0xa24f8}, // hw_sem_addr + 0, // vsec_sem_supported + }, +}; + +#define MAX_SEMAPHORE_ADDRES 8 + +struct mad_lock_info { + u_int32_t lock_key; + u_int32_t lease_time_ms; + tt_ctx_t start_time; +}; + +struct trm_t { + mfile* mf; + const struct device_sem_info* dev_sem_info; + struct mad_lock_info mad_lock[MAX_SEMAPHORE_ADDRES]; + int ib_semaphore_lock_is_supported; }; /************************************ @@ -232,6 +245,107 @@ static trm_sts unlock_vsec_semaphore(mfile* mf, u_int32_t addr) return TRM_STS_OK; } +#if !defined(__FreeBSD__) && !defined(UEFI_BUILD) +/************************************ + * Function: release_vs_mad_semaphore() + ************************************/ +#define GET_LEASE_TIME_MS(is_leaseable, lease_time_exp) ((is_leaseable) ? (50 * (1 << (lease_time_exp))) : 0) + +static trm_sts release_vs_mad_semaphore(trm_ctx trm, trm_resourse resource) +{ + u_int32_t lock_key; + u_int8_t new_lease_exponent; + int is_leaseable = 0; + + int rc = TRM_STS_OK; + if (!trm->mad_lock[resource].lock_key) { + return TRM_STS_OK; + } + if (trm->ib_semaphore_lock_is_supported == 0) { + return TRM_STS_RES_NOT_SUPPORTED; + } + rc = mib_semaphore_lock_vs_mad(trm->mf, SMP_SEM_RELEASE, g_vsec_sem_addr[resource], + trm->mad_lock[resource].lock_key, &lock_key, &is_leaseable, &new_lease_exponent, SEM_LOCK_SET); + if (rc == ME_MAD_BUSY) { + return TRM_STS_RES_BUSY; + } else if (rc) { + return TRM_STS_RES_NOT_SUPPORTED; + } else if (lock_key != 0) { + return TRM_STS_CR_ACCESS_ERR; + } + trm->mad_lock[resource].lock_key = 0; + trm->mad_lock[resource].lease_time_ms = 0; + return TRM_STS_OK; +} + +/************************************ + * Function: lock_vs_mad_semaphore() + ************************************/ + + +static trm_sts lock_vs_mad_semaphore(trm_ctx trm, trm_resourse resource, unsigned int max_retries) +{ + u_int32_t new_lock_key; + u_int8_t new_lease_exponent; + int is_leaseable = 0; + tt_ctx_t curr_time; + int rc = TRM_STS_OK; + unsigned int cnt = 0; + + if (trm->ib_semaphore_lock_is_supported == 0) { + return TRM_STS_RES_NOT_SUPPORTED; + } + + // check if we got lock_key + if (trm->mad_lock[resource].lock_key) { + // TODO: use threads to extend lock every ~20 seconds untill releasing the lock + // check if extension is needed + if (trm->mad_lock[resource].lease_time_ms == 0) { + // no need to extend lease is untill device reboot + return TRM_STS_OK; + } + + tt_get_time(&curr_time); + double diff = tt_diff_in_ms(trm->mad_lock[resource].start_time, curr_time); + if ( diff <= trm->mad_lock[resource].lease_time_ms * 0.6) { + return TRM_STS_OK; + } + // extension needed try to extend + rc = mib_semaphore_lock_vs_mad(trm->mf, SMP_SEM_EXTEND, g_vsec_sem_addr[resource], + trm->mad_lock[resource].lock_key, &new_lock_key, &is_leaseable, &new_lease_exponent, SEM_LOCK_SET); + if (rc == ME_OK && new_lock_key == trm->mad_lock[resource].lock_key) { + // extend OK + trm->mad_lock[resource].lease_time_ms = GET_LEASE_TIME_MS(is_leaseable, new_lease_exponent); + trm->mad_lock[resource].start_time = curr_time; + return TRM_STS_OK; + } else { + // extend failed try to re-lock the semaphore + trm->mad_lock[resource].lock_key = 0; + trm->mad_lock[resource].lease_time_ms = 0; + new_lock_key = 0; + } + } + // if not or extend failed try to lock + do { + if (cnt++ > max_retries) { + return TRM_STS_RES_BUSY; + } + rc = mib_semaphore_lock_vs_mad(trm->mf, SMP_SEM_LOCK, g_vsec_sem_addr[resource], + 0, &new_lock_key, &is_leaseable, &new_lease_exponent, SEM_LOCK_SET); + if (rc == ME_MAD_BUSY || new_lock_key == 0) { + msleep(((rand() % 5) + 1)); + } + } while (rc == ME_MAD_BUSY || new_lock_key == 0) ; + + if (rc) { + return TRM_STS_RES_NOT_SUPPORTED; + } + trm->mad_lock[resource].lock_key = new_lock_key; + trm->mad_lock[resource].lease_time_ms = GET_LEASE_TIME_MS(is_leaseable, new_lease_exponent); + tt_get_time(&(trm->mad_lock[resource].start_time)); + return TRM_STS_OK; +} +#endif /************************************ * Function: get_device_sem_info ************************************/ @@ -248,48 +362,97 @@ static struct device_sem_info* get_device_sem_info(dm_dev_id_t dev_id) } /************************************ - * Function: trm_lock + * Function: trm_create ************************************/ -trm_sts trm_lock(mfile* mf, trm_resourse res, unsigned int max_retries) +trm_sts trm_create(trm_ctx* trm_p, mfile* mf) { - dm_dev_id_t dev_id; + dm_dev_id_t dev_id = DeviceStartMarker; u_int32_t hw_dev_id; u_int32_t chip_rev; - struct device_sem_info* dev_sem_info; - if (dm_get_device_id(mf, &dev_id, &hw_dev_id, &chip_rev)) { - return TRM_STS_CR_ACCESS_ERR; + *trm_p = (trm_ctx) malloc (sizeof(struct trm_t)); + if (! (*trm_p)) { + return TRM_STS_MEM_ERROR; + } + memset((*trm_p), 0, sizeof(struct trm_t)); + (*trm_p)->mf = mf; + +#if !defined(__FreeBSD__) && !defined(UEFI_BUILD) + u_int32_t dev_flags = 0; + if (!mget_mdevs_flags(mf, &dev_flags)) { + if ((dev_flags & MDEVS_IB) && mib_semaphore_lock_is_supported(mf) == 1) { + (*trm_p)->ib_semaphore_lock_is_supported = 1; + } + } +#endif + + if (dm_get_device_id((*trm_p)->mf, &dev_id, &hw_dev_id, &chip_rev)) { + free(*trm_p); + *trm_p = (trm_ctx)NULL; + return dev_id == DeviceUnknown ? TRM_STS_DEV_NOT_SUPPORTED : TRM_STS_CR_ACCESS_ERR; } - dev_sem_info = get_device_sem_info(dev_id); + (*trm_p)->dev_sem_info = get_device_sem_info(dev_id); // Not supported device - if (!dev_sem_info) { + if (!((*trm_p)->dev_sem_info)) { + free(*trm_p); + *trm_p = (trm_ctx)NULL; return TRM_STS_DEV_NOT_SUPPORTED; } + return TRM_STS_OK; +} + +/************************************ + * Function: trm_destroy + ************************************/ +trm_sts trm_destroy(trm_ctx trm) +{ + if (trm) { + free(trm); + } + return TRM_STS_OK; +} + +/************************************ + * Function: trm_lock + ************************************/ +trm_sts trm_lock(trm_ctx trm, trm_resourse res, unsigned int max_retries) +{ + u_int32_t dev_type = 0; + mget_mdevs_flags(trm->mf, &dev_type); + // lock resource on appropriate ifc if supported switch ((int)res) { case TRM_RES_ICMD: - if (dev_sem_info->vsec_sem_supported && mget_vsec_supp(mf)) { - return lock_vsec_semaphore(mf, g_vsec_sem_addr[TRM_RES_ICMD], max_retries); - } else if (dev_sem_info->hw_sem_addr[TRM_RES_MAIN_SEM & HW_SEM_ADDR_MASK]){ // lock hw semaphore - return lock_hw_semaphore(mf, dev_sem_info->hw_sem_addr[TRM_RES_MAIN_SEM & HW_SEM_ADDR_MASK], max_retries); + if (trm->dev_sem_info->vsec_sem_supported && mget_vsec_supp(trm->mf)) { + return lock_vsec_semaphore(trm->mf, g_vsec_sem_addr[TRM_RES_ICMD], max_retries); +#if !defined(__FreeBSD__) && !defined(UEFI_BUILD) + } else if (trm->dev_sem_info->vsec_sem_supported && (dev_type & MDEVS_IB)) { + return lock_vs_mad_semaphore(trm, TRM_RES_ICMD, max_retries); +#endif + } else if (trm->dev_sem_info->hw_sem_addr[TRM_RES_MAIN_SEM & HW_SEM_ADDR_MASK]) { // lock hw semaphore + return lock_hw_semaphore(trm->mf, trm->dev_sem_info->hw_sem_addr[TRM_RES_MAIN_SEM & HW_SEM_ADDR_MASK], max_retries); } break; case TRM_RES_FLASH_PROGRAMING: - if (dev_sem_info->vsec_sem_supported && mget_vsec_supp(mf)) { - return lock_vsec_semaphore(mf, g_vsec_sem_addr[TRM_RES_FLASH_PROGRAMING], max_retries); + if (trm->dev_sem_info->vsec_sem_supported && mget_vsec_supp(trm->mf)) { + return lock_vsec_semaphore(trm->mf, g_vsec_sem_addr[TRM_RES_FLASH_PROGRAMING], max_retries); +#if !defined(__FreeBSD__) && !defined(UEFI_BUILD) + } else if (trm->dev_sem_info->vsec_sem_supported && (dev_type & MDEVS_IB)) { + return lock_vs_mad_semaphore(trm, TRM_RES_FLASH_PROGRAMING, max_retries); +#endif } break; case TRM_RES_HCR_FLASH_PROGRAMING: - if (dev_sem_info->hw_sem_addr[TRM_RES_HCR_FLASH_PROGRAMING & HW_SEM_ADDR_MASK]){ // lock hw semaphore - return lock_hw_semaphore(mf, dev_sem_info->hw_sem_addr[TRM_RES_HCR_FLASH_PROGRAMING & HW_SEM_ADDR_MASK], max_retries); + if (trm->dev_sem_info->hw_sem_addr[TRM_RES_HCR_FLASH_PROGRAMING & HW_SEM_ADDR_MASK]){ // lock hw semaphore + return lock_hw_semaphore(trm->mf, trm->dev_sem_info->hw_sem_addr[TRM_RES_HCR_FLASH_PROGRAMING & HW_SEM_ADDR_MASK], max_retries); } break; case TRM_RES_HW_TRACER: - if (dev_sem_info->hw_sem_addr[TRM_RES_HW_TRACER & HW_SEM_ADDR_MASK]){ // lock hw semaphore - return lock_hw_semaphore(mf, dev_sem_info->hw_sem_addr[TRM_RES_HW_TRACER & HW_SEM_ADDR_MASK], max_retries); + if (trm->dev_sem_info->hw_sem_addr[TRM_RES_HW_TRACER & HW_SEM_ADDR_MASK]){ // lock hw semaphore + return lock_hw_semaphore(trm->mf, trm->dev_sem_info->hw_sem_addr[TRM_RES_HW_TRACER & HW_SEM_ADDR_MASK], max_retries); } break; default: @@ -301,54 +464,49 @@ trm_sts trm_lock(mfile* mf, trm_resourse res, unsigned int max_retries) /************************************ * Function: trm_try_lock ************************************/ -trm_sts trm_try_lock(mfile* mf, trm_resourse res) +trm_sts trm_try_lock(trm_ctx trm, trm_resourse res) { - return trm_lock(mf, res, 1); + return trm_lock(trm, res, 1); } /************************************ * Function: trm_unlock ************************************/ -trm_sts trm_unlock(mfile* mf, trm_resourse res) +trm_sts trm_unlock(trm_ctx trm, trm_resourse res) { - dm_dev_id_t dev_id; - u_int32_t hw_dev_id; - u_int32_t chip_rev; - struct device_sem_info* dev_sem_info; - - if (dm_get_device_id(mf, &dev_id, &hw_dev_id, &chip_rev)) { - return TRM_STS_CR_ACCESS_ERR; - } - - dev_sem_info = get_device_sem_info(dev_id); - - // Not supported device - if (!dev_sem_info) { - return TRM_STS_DEV_NOT_SUPPORTED; - } + u_int32_t dev_type = 0; + mget_mdevs_flags(trm->mf, &dev_type); // lock resource on appropriate ifc if supported switch ((int)res) { case TRM_RES_ICMD: - if (dev_sem_info->vsec_sem_supported && mget_vsec_supp(mf)) { - return unlock_vsec_semaphore(mf, g_vsec_sem_addr[TRM_RES_ICMD]); - } else if (dev_sem_info->hw_sem_addr[TRM_RES_MAIN_SEM & HW_SEM_ADDR_MASK]){ // lock hw semaphore - return unlock_hw_semaphore(mf, dev_sem_info->hw_sem_addr[TRM_RES_MAIN_SEM & HW_SEM_ADDR_MASK]); + if (trm->dev_sem_info->vsec_sem_supported && mget_vsec_supp(trm->mf)) { + return unlock_vsec_semaphore(trm->mf, g_vsec_sem_addr[TRM_RES_ICMD]); +#if !defined(__FreeBSD__) && !defined(UEFI_BUILD) + } else if (trm->dev_sem_info->vsec_sem_supported && (dev_type & MDEVS_IB)) { + return release_vs_mad_semaphore(trm, TRM_RES_ICMD); +#endif + } else if (trm->dev_sem_info->hw_sem_addr[TRM_RES_MAIN_SEM & HW_SEM_ADDR_MASK]){ // lock hw semaphore + return unlock_hw_semaphore(trm->mf, trm->dev_sem_info->hw_sem_addr[TRM_RES_MAIN_SEM & HW_SEM_ADDR_MASK]); } break; case TRM_RES_FLASH_PROGRAMING: - if (dev_sem_info->vsec_sem_supported && mget_vsec_supp(mf)) { - return unlock_vsec_semaphore(mf, g_vsec_sem_addr[TRM_RES_FLASH_PROGRAMING]); + if (trm->dev_sem_info->vsec_sem_supported && mget_vsec_supp(trm->mf)) { + return unlock_vsec_semaphore(trm->mf, g_vsec_sem_addr[TRM_RES_FLASH_PROGRAMING]); +#if !defined(__FreeBSD__) && !defined(UEFI_BUILD) + } else if (trm->dev_sem_info->vsec_sem_supported && (dev_type & MDEVS_IB)) { + return release_vs_mad_semaphore(trm, TRM_RES_FLASH_PROGRAMING); +#endif } break; case TRM_RES_HCR_FLASH_PROGRAMING: - if (dev_sem_info->hw_sem_addr[TRM_RES_HCR_FLASH_PROGRAMING & HW_SEM_ADDR_MASK]){ // lock hw semaphore - return unlock_hw_semaphore(mf, dev_sem_info->hw_sem_addr[TRM_RES_HCR_FLASH_PROGRAMING & HW_SEM_ADDR_MASK]); + if (trm->dev_sem_info->hw_sem_addr[TRM_RES_HCR_FLASH_PROGRAMING & HW_SEM_ADDR_MASK]){ // lock hw semaphore + return unlock_hw_semaphore(trm->mf, trm->dev_sem_info->hw_sem_addr[TRM_RES_HCR_FLASH_PROGRAMING & HW_SEM_ADDR_MASK]); } break; case TRM_RES_HW_TRACER: - if (dev_sem_info->hw_sem_addr[TRM_RES_HW_TRACER & HW_SEM_ADDR_MASK]){ // lock hw semaphore - return unlock_hw_semaphore(mf, dev_sem_info->hw_sem_addr[TRM_RES_HW_TRACER & HW_SEM_ADDR_MASK]); + if (trm->dev_sem_info->hw_sem_addr[TRM_RES_HW_TRACER & HW_SEM_ADDR_MASK]){ // lock hw semaphore + return unlock_hw_semaphore(trm->mf, trm->dev_sem_info->hw_sem_addr[TRM_RES_HW_TRACER & HW_SEM_ADDR_MASK]); } break; default: diff --git a/tools_res_mgmt/tools_res_mgmt.h b/tools_res_mgmt/tools_res_mgmt.h index caed2b7..e4335cd 100644 --- a/tools_res_mgmt/tools_res_mgmt.h +++ b/tools_res_mgmt/tools_res_mgmt.h @@ -44,7 +44,8 @@ typedef enum { TRM_STS_IFC_NA, TRM_STS_DEV_NOT_SUPPORTED, TRM_STS_RES_NOT_SUPPORTED, - TRM_STS_CR_ACCESS_ERR + TRM_STS_CR_ACCESS_ERR, + TRM_STS_MEM_ERROR } trm_sts; typedef enum { @@ -59,6 +60,25 @@ typedef enum { TRM_RES_ALL = 0xffff, } trm_resourse; +typedef struct trm_t* trm_ctx; + + +/* + * Create tools resource context + * trm_p: trm_ctx pointer to be allocated + * Parameter (mf) - an opened mst device handler + * Return TOOLS_STS_OK on success of creating the context, otherwise any other error code. + */ +trm_sts trm_create(trm_ctx* trm_p, mfile* mf); + + +/* + * Destroy the context + * trm: trm_ctx to be destroyed + * Return TOOLS_STS_OK on success of destroying the context, otherwise any other error code. + */ +trm_sts trm_destroy(trm_ctx trm); + /* * Lock tools resource * Parameter (mf) - an opened mst device handler @@ -66,7 +86,7 @@ typedef enum { * Parameter (max_retry) - max retry count before declaring resource busy. * Return TOOLS_STS_OK on success of locking all the desired resources, otherwise any other error code. */ -trm_sts trm_lock(mfile* mf, trm_resourse res, unsigned int max_retry); +trm_sts trm_lock(trm_ctx trm, trm_resourse res, unsigned int max_retry); /* * Try to lock tools resource (returns immediately if resource busy) @@ -74,7 +94,7 @@ trm_sts trm_lock(mfile* mf, trm_resourse res, unsigned int max_retry); * Parameter (res) - resource to acquire. * Return TOOLS_STS_OK on success of locking all the desired resources, otherwise any other error code. */ -trm_sts trm_try_lock(mfile* mf, trm_resourse res); +trm_sts trm_try_lock(trm_ctx trm, trm_resourse res); /* * Unlock tools resource @@ -82,7 +102,7 @@ trm_sts trm_try_lock(mfile* mf, trm_resourse res); * Parameter (res) - resource to release. * Return TOOLS_STS_OK if all given resources were unlocked successfully. */ -trm_sts trm_unlock(mfile* mf, trm_resourse res); +trm_sts trm_unlock(trm_ctx trm, trm_resourse res); /* * Translate tools_sem_mgmt_sts status code to a human readable string. diff --git a/tools_res_mgmt/tools_time.c b/tools_res_mgmt/tools_time.c new file mode 100644 index 0000000..3f53709 --- /dev/null +++ b/tools_res_mgmt/tools_time.c @@ -0,0 +1,37 @@ +/* - Mellanox Confidential and Proprietary - + * + * Copyright (C) Jan 2013, Mellanox Technologies Ltd. ALL RIGHTS RESERVED. + * + * Except as specifically permitted herein, no portion of the information, + * including but not limited to object code and source code, may be reproduced, + * modified, distributed, republished or otherwise exploited in any form or by + * any means for any purpose without the prior written permission of Mellanox + * Technologies Ltd. Use of software subject to the terms and conditions + * detailed in the file "LICENSE.txt". + * + */ + +#include +#include +#include + +#include "tools_time.h" + + + +void tt_get_time(tt_ctx_t* tt) +{ + if (!tt) { + return; + } + time(&(tt->now)); + return; +} + +double tt_diff_in_ms(tt_ctx_t t1, tt_ctx_t t2) +{ + return difftime(t2.now, t1.now) * 1000; +} + + + diff --git a/tools_res_mgmt/tools_time.h b/tools_res_mgmt/tools_time.h new file mode 100644 index 0000000..7f63ea1 --- /dev/null +++ b/tools_res_mgmt/tools_time.h @@ -0,0 +1,31 @@ +/* - Mellanox Confidential and Proprietary - + * + * Copyright (C) Jan 2013, Mellanox Technologies Ltd. ALL RIGHTS RESERVED. + * + * Except as specifically permitted herein, no portion of the information, + * including but not limited to object code and source code, may be reproduced, + * modified, distributed, republished or otherwise exploited in any form or by + * any means for any purpose without the prior written permission of Mellanox + * Technologies Ltd. Use of software subject to the terms and conditions + * detailed in the file "LICENSE.txt". + * + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +typedef struct tt_ctx { + time_t now; +} tt_ctx_t; + +// update context with the current time +void tt_get_time(tt_ctx_t* tt); +// get diff in ms between the time t1 was created and t2 +double tt_diff_in_ms(tt_ctx_t t1, tt_ctx_t t2); + +#ifdef __cplusplus +} +#endif -- 2.41.0