summaryrefslogtreecommitdiffstats
path: root/sys/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib')
-rw-r--r--sys/contrib/dev/acpica/Subsystem/Hardware/hwcpu32.c837
-rw-r--r--sys/contrib/dev/acpica/Subsystem/Hardware/hwxface.c737
-rw-r--r--sys/contrib/dev/acpica/Subsystem/Include/acconfig.h3
-rw-r--r--sys/contrib/dev/acpica/Subsystem/Include/acfreebsd.h66
-rw-r--r--sys/contrib/dev/acpica/Subsystem/Include/acgcc.h4
-rw-r--r--sys/contrib/dev/acpica/Subsystem/Include/acpixf.h3
-rw-r--r--sys/contrib/dev/acpica/Subsystem/Parser/psparse.c19
-rw-r--r--sys/contrib/dev/acpica/acconfig.h14
-rw-r--r--sys/contrib/dev/acpica/acfreebsd.h29
-rw-r--r--sys/contrib/dev/acpica/acgcc.h7
-rw-r--r--sys/contrib/dev/acpica/acpixf.h49
-rw-r--r--sys/contrib/dev/acpica/exfldio.c1064
-rw-r--r--sys/contrib/dev/acpica/psparse.c150
-rw-r--r--sys/contrib/dev/fla/COPYRIGHT102
-rw-r--r--sys/contrib/dev/fla/README198
-rw-r--r--sys/contrib/dev/fla/fla.c344
-rw-r--r--sys/contrib/dev/fla/i386/msysosak.o.uu823
-rw-r--r--sys/contrib/dev/fla/msysosak.h135
-rw-r--r--sys/contrib/dev/fla/patch.0023
-rw-r--r--sys/contrib/dev/fla/prep.fla.sh45
-rw-r--r--sys/contrib/dev/oltr/COPYRIGHT62
-rw-r--r--sys/contrib/dev/oltr/i386-elf.trlld.o.uu1850
-rw-r--r--sys/contrib/dev/oltr/if_oltr.c1586
-rw-r--r--sys/contrib/dev/oltr/trlld.h902
-rw-r--r--sys/contrib/dev/oltr/trlldbm.c2690
-rw-r--r--sys/contrib/dev/oltr/trlldhm.c2519
-rw-r--r--sys/contrib/dev/oltr/trlldmac.c2641
-rw-r--r--sys/contrib/ipfilter/netinet/fil.c2132
-rw-r--r--sys/contrib/ipfilter/netinet/ip_auth.c543
-rw-r--r--sys/contrib/ipfilter/netinet/ip_auth.h63
-rw-r--r--sys/contrib/ipfilter/netinet/ip_compat.h1013
-rw-r--r--sys/contrib/ipfilter/netinet/ip_fil.c1763
-rw-r--r--sys/contrib/ipfilter/netinet/ip_fil.h634
-rw-r--r--sys/contrib/ipfilter/netinet/ip_frag.c576
-rw-r--r--sys/contrib/ipfilter/netinet/ip_frag.h69
-rw-r--r--sys/contrib/ipfilter/netinet/ip_ftp_pxy.c786
-rw-r--r--sys/contrib/ipfilter/netinet/ip_log.c507
-rw-r--r--sys/contrib/ipfilter/netinet/ip_nat.c2739
-rw-r--r--sys/contrib/ipfilter/netinet/ip_nat.h309
-rw-r--r--sys/contrib/ipfilter/netinet/ip_proxy.c452
-rw-r--r--sys/contrib/ipfilter/netinet/ip_proxy.h157
-rw-r--r--sys/contrib/ipfilter/netinet/ip_raudio_pxy.c308
-rw-r--r--sys/contrib/ipfilter/netinet/ip_rcmd_pxy.c174
-rw-r--r--sys/contrib/ipfilter/netinet/ip_state.c1901
-rw-r--r--sys/contrib/ipfilter/netinet/ip_state.h196
-rw-r--r--sys/contrib/ipfilter/netinet/ipl.h17
-rw-r--r--sys/contrib/ipfilter/netinet/mlfk_ipl.c196
47 files changed, 29108 insertions, 2329 deletions
diff --git a/sys/contrib/dev/acpica/Subsystem/Hardware/hwcpu32.c b/sys/contrib/dev/acpica/Subsystem/Hardware/hwcpu32.c
deleted file mode 100644
index 8401061..0000000
--- a/sys/contrib/dev/acpica/Subsystem/Hardware/hwcpu32.c
+++ /dev/null
@@ -1,837 +0,0 @@
-/******************************************************************************
- *
- * Name: hwcpu32.c - CPU support for IA32 (Throttling, CxStates)
- * $Revision: 40 $
- *
- *****************************************************************************/
-
-/******************************************************************************
- *
- * 1. Copyright Notice
- *
- * Some or all of this work - Copyright (c) 1999, 2000, Intel Corp.
- * All rights reserved.
- *
- * 2. License
- *
- * 2.1. This is your license from Intel Corp. under its intellectual property
- * rights. You may have additional license terms from the party that provided
- * you this software, covering your right to use that party's intellectual
- * property rights.
- *
- * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
- * copy of the source code appearing in this file ("Covered Code") an
- * irrevocable, perpetual, worldwide license under Intel's copyrights in the
- * base code distributed originally by Intel ("Original Intel Code") to copy,
- * make derivatives, distribute, use and display any portion of the Covered
- * Code in any form, with the right to sublicense such rights; and
- *
- * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
- * license (with the right to sublicense), under only those claims of Intel
- * patents that are infringed by the Original Intel Code, to make, use, sell,
- * offer to sell, and import the Covered Code and derivative works thereof
- * solely to the minimum extent necessary to exercise the above copyright
- * license, and in no event shall the patent license extend to any additions
- * to or modifications of the Original Intel Code. No other license or right
- * is granted directly or by implication, estoppel or otherwise;
- *
- * The above copyright and patent license is granted only if the following
- * conditions are met:
- *
- * 3. Conditions
- *
- * 3.1. Redistribution of Source with Rights to Further Distribute Source.
- * Redistribution of source code of any substantial portion of the Covered
- * Code or modification with rights to further distribute source must include
- * the above Copyright Notice, the above License, this list of Conditions,
- * and the following Disclaimer and Export Compliance provision. In addition,
- * Licensee must cause all Covered Code to which Licensee contributes to
- * contain a file documenting the changes Licensee made to create that Covered
- * Code and the date of any change. Licensee must include in that file the
- * documentation of any changes made by any predecessor Licensee. Licensee
- * must include a prominent statement that the modification is derived,
- * directly or indirectly, from Original Intel Code.
- *
- * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
- * Redistribution of source code of any substantial portion of the Covered
- * Code or modification without rights to further distribute source must
- * include the following Disclaimer and Export Compliance provision in the
- * documentation and/or other materials provided with distribution. In
- * addition, Licensee may not authorize further sublicense of source of any
- * portion of the Covered Code, and must include terms to the effect that the
- * license from Licensee to its licensee is limited to the intellectual
- * property embodied in the software Licensee provides to its licensee, and
- * not to intellectual property embodied in modifications its licensee may
- * make.
- *
- * 3.3. Redistribution of Executable. Redistribution in executable form of any
- * substantial portion of the Covered Code or modification must reproduce the
- * above Copyright Notice, and the following Disclaimer and Export Compliance
- * provision in the documentation and/or other materials provided with the
- * distribution.
- *
- * 3.4. Intel retains all right, title, and interest in and to the Original
- * Intel Code.
- *
- * 3.5. Neither the name Intel nor any other trademark owned or controlled by
- * Intel shall be used in advertising or otherwise to promote the sale, use or
- * other dealings in products derived from or relating to the Covered Code
- * without prior written authorization from Intel.
- *
- * 4. Disclaimer and Export Compliance
- *
- * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
- * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
- * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
- * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
- * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
- * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
- * PARTICULAR PURPOSE.
- *
- * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
- * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
- * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
- * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
- * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
- * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
- * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
- * LIMITED REMEDY.
- *
- * 4.3. Licensee shall not export, either directly or indirectly, any of this
- * software or system incorporating such software without first obtaining any
- * required license or other approval from the U. S. Department of Commerce or
- * any other agency or department of the United States Government. In the
- * event Licensee exports any such software from the United States or
- * re-exports any such software from a foreign destination, Licensee shall
- * ensure that the distribution and export/re-export of the software is in
- * compliance with all laws, regulations, orders, or other restrictions of the
- * U.S. Export Administration Regulations. Licensee agrees that neither it nor
- * any of its subsidiaries will export/re-export any technical data, process,
- * software, or service, directly or indirectly, to any country for which the
- * United States government or any agency thereof requires an export license,
- * other governmental approval, or letter of assurance, without first obtaining
- * such license, approval or letter.
- *
- *****************************************************************************/
-
-#include "acpi.h"
-#include "acnamesp.h"
-#include "achware.h"
-
-#define _COMPONENT HARDWARE
- MODULE_NAME ("Hwcpu32")
-
-
-#define BIT_4 0x10 /* TBD: [investigate] is this correct? */
-
-
-/****************************************************************************
- *
- * FUNCTION: AcpiHwEnterC1
- *
- * PARAMETERS: PblkAddress - Address of the processor control block
- * PmTimerTicks - Number of PM timer ticks elapsed while asleep
- *
- * RETURN: Function status.
- *
- * DESCRIPTION: Set C1 state on IA32 processor (halt)
- *
- ****************************************************************************/
-
-ACPI_STATUS
-AcpiHwEnterC1(
- ACPI_IO_ADDRESS PblkAddress,
- UINT32 *PmTimerTicks)
-{
- UINT32 Timer = 0;
-
-
- if (!PmTimerTicks)
- {
- /*
- * Enter C1:
- * ---------
- */
- enable();
- halt();
- *PmTimerTicks = ACPI_UINT32_MAX;
- }
- else
- {
- Timer = AcpiHwPmtTicks ();
-
- /*
- * Enter C1:
- * ---------
- */
- enable ();
- halt ();
-
- /*
- * Compute Time in C1:
- * -------------------
- */
- Timer = AcpiHwPmtTicks () - Timer;
-
- *PmTimerTicks = Timer;
- }
-
- return (AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION: AcpiHwEnterC2
- *
- * PARAMETERS: PblkAddress - Address of the processor control block
- * PmTimerTicks - Number of PM timer ticks elapsed while asleep
- *
- * RETURN: <none>
- *
- * DESCRIPTION: Set C2 state on IA32 processor
- *
- ****************************************************************************/
-
-ACPI_STATUS
-AcpiHwEnterC2(
- ACPI_IO_ADDRESS PblkAddress,
- UINT32 *PmTimerTicks)
-{
- UINT32 Timer = 0;
-
-
- if (!PblkAddress || !PmTimerTicks)
- {
- return (AE_BAD_PARAMETER);
- }
-
- /*
- * Disable interrupts before all C2/C3 transitions.
- */
- disable ();
-
- Timer = AcpiHwPmtTicks ();
-
- /*
- * Enter C2:
- * ---------
- * Read from the P_LVL2 (P_BLK+4) register to invoke a C2 transition.
- */
- AcpiOsIn8 ((ACPI_IO_ADDRESS) (PblkAddress + 4));
-
- /*
- * Perform Dummy Op:
- * -----------------
- * We have to do something useless after reading LVL2 because chipsets
- * cannot guarantee that STPCLK# gets asserted in time to freeze execution.
- */
- AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK, PM2_CONTROL);
-
- /*
- * Compute Time in C2:
- * -------------------
- */
- Timer = AcpiHwPmtTicks () - Timer;
-
- *PmTimerTicks = Timer;
-
- /*
- * Re-enable interrupts after coming out of C2/C3.
- */
- enable ();
-
- return (AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION: AcpiHwEnterC3
- *
- * PARAMETERS: PblkAddress - Address of the processor control block
- * PmTimerTicks - Number of PM timer ticks elapsed while asleep
- *
- * RETURN: Status of function
- *
- * DESCRIPTION: Set C3 state on IA32 processor (UP only, cache coherency via
- * disabling bus mastering)
- *
- ****************************************************************************/
-
-ACPI_STATUS
-AcpiHwEnterC3(
- ACPI_IO_ADDRESS PblkAddress,
- UINT32 *PmTimerTicks)
-{
- UINT32 Timer = 0;
- UINT32 BusMasterStatus = 0;
-
-
- if (!PblkAddress || !PmTimerTicks)
- {
- return (AE_BAD_PARAMETER);
- }
-
- /*
- * Check the BM_STS bit, if it is set, do not enter C3
- * but clear the bit (with a write) and exit, telling
- * the calling module that we spent zero time in C3.
- * If bus mastering continues, this action should
- * eventually cause a demotion to C2
- */
- if (1 == (BusMasterStatus =
- AcpiHwRegisterBitAccess (ACPI_READ, ACPI_MTX_LOCK, BM_STS)))
- {
- /*
- * Clear the BM_STS bit by setting it.
- */
- AcpiHwRegisterBitAccess (ACPI_WRITE, ACPI_MTX_LOCK, BM_STS, 1);
- *PmTimerTicks = 0;
- return (AE_OK);
- }
-
- /*
- * Disable interrupts before all C2/C3 transitions.
- */
- disable();
-
- /*
- * Disable Bus Mastering:
- * ----------------------
- * Set the PM2_CNT.ARB_DIS bit (bit #0), preserving all other bits.
- */
- AcpiHwRegisterBitAccess(ACPI_WRITE, ACPI_MTX_LOCK, ARB_DIS, 1);
-
- /*
- * Get the timer base before entering C state
- */
- Timer = AcpiHwPmtTicks ();
-
- /*
- * Enter C3:
- * ---------
- * Read from the P_LVL3 (P_BLK+5) register to invoke a C3 transition.
- */
- AcpiOsIn8 ((ACPI_IO_ADDRESS)(PblkAddress + 5));
-
- /*
- * Perform Dummy Op:
- * -----------------
- * We have to do something useless after reading LVL3 because chipsets
- * cannot guarantee that STPCLK# gets asserted in time to freeze execution.
- */
- AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK, PM2_CONTROL);
- /*
- * Immediately compute the time in the C state
- */
- Timer = AcpiHwPmtTicks() - Timer;
-
- /*
- * Re-Enable Bus Mastering:
- * ------------------------
- * Clear the PM2_CNT.ARB_DIS bit (bit #0), preserving all other bits.
- */
- AcpiHwRegisterBitAccess(ACPI_WRITE, ACPI_MTX_LOCK, ARB_DIS, 0);
-
- /* TBD: [Unhandled]: Support 24-bit timers (this algorithm assumes 32-bit) */
-
- *PmTimerTicks = Timer;
-
- /*
- * Re-enable interrupts after coming out of C2/C3.
- */
- enable();
-
- return (AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION: AcpiHwEnterCx
- *
- * PARAMETERS: ProcessorHandle - handle of the processor
- *
- * RETURN: Status of function
- *
- * DESCRIPTION: Invoke the currently active processor Cx handler to put this
- * processor to sleep.
- *
- ****************************************************************************/
-
-ACPI_STATUS
-AcpiHwEnterCx (
- ACPI_IO_ADDRESS PblkAddress,
- UINT32 *PmTimerTicks)
-{
-
- if (!AcpiHwCxHandlers[AcpiHwActiveCxState])
- {
- return (AE_SUPPORT);
- }
-
- return (AcpiHwCxHandlers[AcpiHwActiveCxState] (PblkAddress, PmTimerTicks));
-}
-
-
-/****************************************************************************
- *
- * FUNCTION: AcpiHwSetCx
- *
- * PARAMETERS: State - value (1-3) of the Cx state to 'make active'
- *
- * RETURN: Function status.
- *
- * DESCRIPTION: Sets the state to use during calls to AcpiHwEnterCx().
- *
- ****************************************************************************/
-
-ACPI_STATUS
-AcpiHwSetCx (
- UINT32 CxState)
-{
- /*
- * Supported State?
- * ----------------
- */
- if ((CxState < 1) || (CxState > 3))
- {
- return (AE_BAD_PARAMETER);
- }
-
- if (!AcpiHwCxHandlers[CxState])
- {
- return (AE_SUPPORT);
- }
-
- /*
- * New Cx State?
- * -------------
- * We only care when moving from one state to another...
- */
- if (AcpiHwActiveCxState == CxState)
- {
- return (AE_OK);
- }
-
- /*
- * Prepare to Use New State:
- * -------------------------
- * If the new CxState is C3, the BM_RLD bit must be set to allow
- * the generation of a bus master requets to cause the processor
- * in the C3 state to transition to the C0 state.
- */
- switch (CxState)
- {
- case 3:
- AcpiHwRegisterBitAccess (ACPI_WRITE, ACPI_MTX_LOCK, BM_RLD, 1);
- break;
- }
-
- /*
- * Clean up from Old State:
- * ------------------------
- * If the old CxState was C3, the BM_RLD bit is reset. When the
- * bit is reset, the generation of a bus master request does not
- * effect any processor in the C3 state.
- */
- switch (AcpiHwActiveCxState)
- {
- case 3:
- AcpiHwRegisterBitAccess (ACPI_WRITE, ACPI_MTX_LOCK, BM_RLD, 0);
- break;
- }
-
- /*
- * Enable:
- * -------
- */
- AcpiHwActiveCxState = CxState;
-
- return (AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION: AcpiHwGetCxInfo
- *
- * PARAMETERS: CxStates - Information (latencies) on all Cx states
- *
- * RETURN: Status of function
- *
- * DESCRIPTION: This function is called both to initialize Cx handling
- * and retrieve the current Cx information (latency values).
- *
- ****************************************************************************/
-
-ACPI_STATUS
-AcpiHwGetCxInfo (
- UINT32 CxStates[])
-{
- BOOLEAN SMP_system = FALSE;
-
-
- FUNCTION_TRACE("HwGetCxInfo");
-
-
- if (!CxStates)
- {
- return_ACPI_STATUS(AE_BAD_PARAMETER);
- }
-
- /*
- * TBD: [Unhandled] need to init SMP_system using info from the MAPIC
- * table.
- */
-
- /*
- * Set Defaults:
- * -------------
- * C0 and C1 support is implied (but what about that PROC_C1 register
- * in the FADT?!?!). Set C2/C3 to max. latency (not supported until
- * proven otherwise).
- */
- CxStates[0] = 0;
- CxStates[1] = 0;
- CxStates[2] = MAX_CX_STATE_LATENCY;
- CxStates[3] = MAX_CX_STATE_LATENCY;
-
- /*
- * C2 Supported?
- * -------------
- * We're only supporting C2 when the latency is <= 100 microseconds,
- * and on SMP systems when P_LVL2_UP (which indicates C2 only on UP)
- * is not set.
- */
- if (AcpiGbl_FADT->Plvl2Lat <= 100)
- {
- if (!SMP_system)
- {
- AcpiHwCxHandlers[2] = AcpiHwEnterC2;
- CxStates[2] = AcpiGbl_FADT->Plvl2Lat;
- }
-
- else if (!AcpiGbl_FADT->Plvl2Up)
- {
- AcpiHwCxHandlers[2] = AcpiHwEnterC2;
- CxStates[2] = AcpiGbl_FADT->Plvl2Lat;
- }
- }
-
- /*
- * C3 Supported?
- * -------------
- * We're only supporting C3 on UP systems when the latency is
- * <= 1000 microseconds and that include the ability to disable
- * Bus Mastering while in C3 (ARB_DIS) but allows Bus Mastering
- * requests to wake the system from C3 (BM_RLD). Note his method
- * of maintaining cache coherency (disabling of bus mastering)
- * cannot be used on SMP systems, and flushing caches (e.g. WBINVD)
- * is simply too costly (at this time).
- */
- if (AcpiGbl_FADT->Plvl3Lat <= 1000)
- {
- if (!SMP_system && (AcpiGbl_FADT->XPm2CntBlk.Address &&
- AcpiGbl_FADT->Pm2CntLen))
- {
- AcpiHwCxHandlers[3] = AcpiHwEnterC3;
- CxStates[3] = AcpiGbl_FADT->Plvl3Lat;
- }
- }
-
- return_ACPI_STATUS(AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION: AcpiHwGetCxHandler
- *
- * PARAMETERS: State - the Cx state
- * Handler - pointer to location for the returned handler
- *
- * RETURN: Status of function
- *
- * DESCRIPTION: This function is called to get an installed Cx state handler.
- *
- ****************************************************************************/
-
-ACPI_STATUS
-AcpiHwGetCxHandler (
- UINT32 CxState,
- ACPI_C_STATE_HANDLER *Handler)
-{
- FUNCTION_TRACE ("HwGetCxHandler");
-
-
- if ((CxState == 0) || (CxState >= MAX_CX_STATES) || !Handler)
- {
- return_ACPI_STATUS(AE_BAD_PARAMETER);
- }
-
- *Handler = AcpiHwCxHandlers[CxState];
-
- return_ACPI_STATUS(AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION: AcpiHwSetCxHandler
- *
- * PARAMETERS: CxState - the Cx state
- * Handler - new Cx state handler
- *
- * RETURN: Status of function
- *
- * DESCRIPTION: This function is called to install a new Cx state handler.
- *
- ****************************************************************************/
-
-ACPI_STATUS
-AcpiHwSetCxHandler (
- UINT32 CxState,
- ACPI_C_STATE_HANDLER Handler)
-{
- FUNCTION_TRACE ("HwSetCxHandler");
-
-
- if ((CxState == 0) || (CxState >= MAX_CX_STATES) || !Handler)
- {
- return_ACPI_STATUS(AE_BAD_PARAMETER);
- }
-
- AcpiHwCxHandlers[CxState] = Handler;
-
- return_ACPI_STATUS(AE_OK);
-}
-
-
-/**************************************************************************
- *
- * FUNCTION: AcpiHwLocalPow
- *
- * PARAMETERS: x,y operands
- *
- * RETURN: result
- *
- * DESCRIPTION: Compute x ^ y
- *
- *************************************************************************/
-
-NATIVE_UINT
-AcpiHwLocalPow (
- NATIVE_UINT x,
- NATIVE_UINT y)
-{
- NATIVE_UINT i;
- NATIVE_UINT Result = 1;
-
-
- for (i = 0; i < y; i++)
- {
- Result = Result * x;
- }
-
- return (Result);
-}
-
-
-/**************************************************************************
- *
- * FUNCTION: AcpiHwEnableThrottling
- *
- * PARAMETERS: PblkAddress - Address of Pcnt (Processor Control)
- * register
- *
- * RETURN: none
- *
- * DESCRIPTION: Enable throttling by setting the THT_EN bit.
- *
- *************************************************************************/
-
-void
-AcpiHwEnableThrottling (
- ACPI_IO_ADDRESS PblkAddress)
-{
- UINT32 PblkValue;
-
-
- FUNCTION_TRACE ("EnableThrottling");
-
-
- PblkValue = AcpiOsIn32 (PblkAddress);
- PblkValue = PblkValue | BIT_4;
- AcpiOsOut32 (PblkAddress, PblkValue);
-
- return_VOID;
-}
-
-
-/**************************************************************************
- *
- * FUNCTION: AcpiHwDisableThrottling
- *
- * PARAMETERS: PblkAddress - Address of Pcnt (Processor Control)
- * register
- *
- * RETURN: none
- *
- * DESCRIPTION:Disable throttling by clearing the THT_EN bit
- *
- *************************************************************************/
-
-void
-AcpiHwDisableThrottling (
- ACPI_IO_ADDRESS PblkAddress)
-{
- UINT32 PblkValue;
-
-
- FUNCTION_TRACE ("DisableThrottling");
-
-
- PblkValue = AcpiOsIn32 (PblkAddress);
- PblkValue = PblkValue & (~(UINT32)BIT_4);
- AcpiOsOut32 (PblkAddress, PblkValue);
-
- return_VOID;
-}
-
-
-/**************************************************************************
- *
- * FUNCTION: AcpiHwGetDutyCycle
- *
- * PARAMETERS: DutyOffset Pcnt register duty cycle field offset
- * PblkAddress Pcnt register address in chipset
- * NumThrottleStates # of CPU throttle states this system
- * supports
- *
- * RETURN: none
- *
- * DESCRIPTION: Get the duty cycle from the chipset
- *
- *************************************************************************/
-
-UINT32
-AcpiHwGetDutyCycle (
- UINT8 DutyOffset,
- ACPI_IO_ADDRESS PblkAddress,
- UINT32 NumThrottleStates)
-{
- NATIVE_UINT Index;
- UINT32 Duty32Value;
- UINT32 PcntMaskOffDutyField;
-
-
- FUNCTION_TRACE ("GetDutyCycle");
-
-
- /*
- * Use NumThrottleStates - 1 as mask [ex. 8 - 1 = 7 (Fh)]
- * and then shift it into the right position
- */
- PcntMaskOffDutyField = NumThrottleStates - 1;
-
- /*
- * Read in the current value from the port
- */
- Duty32Value = AcpiOsIn32 ((ACPI_IO_ADDRESS) PblkAddress);
-
- /*
- * Shift the the value to LSB
- */
- for (Index = 0; Index < (NATIVE_UINT) DutyOffset; Index++)
- {
- Duty32Value = Duty32Value >> 1;
- }
-
- /*
- * Get the duty field only
- */
- Duty32Value = Duty32Value & PcntMaskOffDutyField;
-
- return_VALUE ((UINT32) Duty32Value);
-}
-
-
-/**************************************************************************
- *
- * FUNCTION: AcpiHwProgramDutyCycle
- *
- * PARAMETERS: DutyOffset Pcnt register duty cycle field offset
- * DutyCycle duty cycle to program into chipset
- * PblkAddress Pcnt register address in chipset
- * NumThrottleStates # of CPU throttle states this system
- * supports
- *
- * RETURN: none
- *
- * DESCRIPTION: Program chipset with specified duty cycle by bit-shifting the
- * duty cycle bits to the appropriate offset, reading the duty
- * cycle register, OR-ing in the duty cycle, and writing it to
- * the Pcnt register.
- *
- *************************************************************************/
-
-void
-AcpiHwProgramDutyCycle (
- UINT8 DutyOffset,
- UINT32 DutyCycle,
- ACPI_IO_ADDRESS PblkAddress,
- UINT32 NumThrottleStates)
-{
- NATIVE_UINT Index;
- UINT32 Duty32Value;
- UINT32 PcntMaskOffDutyField;
- UINT32 PortValue;
-
-
- FUNCTION_TRACE ("HwProgramDutyCycle");
-
-
- /*
- * valid DutyCycle passed
- */
- Duty32Value = DutyCycle;
-
- /*
- * use NumThrottleStates - 1 as mask [ex. 8 - 1 = 7 (Fh)]
- * and then shift it into the right position
- */
- PcntMaskOffDutyField = NumThrottleStates - 1;
-
- /*
- * Shift the mask
- */
- for (Index = 0; Index < (NATIVE_UINT) DutyOffset; Index++)
- {
- PcntMaskOffDutyField = PcntMaskOffDutyField << 1;
- Duty32Value = Duty32Value << 1;
- }
-
- /*
- * Read in the current value from the port
- */
- PortValue = AcpiOsIn32 ((ACPI_IO_ADDRESS) PblkAddress);
-
- /*
- * Mask off the duty field so we don't OR in junk!
- */
- PortValue = PortValue & (~PcntMaskOffDutyField);
-
- /*
- * OR in the bits we want to write out to the port
- */
- PortValue = (PortValue | Duty32Value) & (~(UINT32)BIT_4);
-
- /*
- * write it to the port
- */
- AcpiOsOut32 ((ACPI_IO_ADDRESS) PblkAddress, PortValue);
-
- return_VOID;
-}
diff --git a/sys/contrib/dev/acpica/Subsystem/Hardware/hwxface.c b/sys/contrib/dev/acpica/Subsystem/Hardware/hwxface.c
deleted file mode 100644
index 3bece9a..0000000
--- a/sys/contrib/dev/acpica/Subsystem/Hardware/hwxface.c
+++ /dev/null
@@ -1,737 +0,0 @@
-
-/******************************************************************************
- *
- * Name: hwxface.c - Hardware access external interfaces
- * $Revision: 37 $
- *
- *****************************************************************************/
-
-/******************************************************************************
- *
- * 1. Copyright Notice
- *
- * Some or all of this work - Copyright (c) 1999, 2000, Intel Corp.
- * All rights reserved.
- *
- * 2. License
- *
- * 2.1. This is your license from Intel Corp. under its intellectual property
- * rights. You may have additional license terms from the party that provided
- * you this software, covering your right to use that party's intellectual
- * property rights.
- *
- * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
- * copy of the source code appearing in this file ("Covered Code") an
- * irrevocable, perpetual, worldwide license under Intel's copyrights in the
- * base code distributed originally by Intel ("Original Intel Code") to copy,
- * make derivatives, distribute, use and display any portion of the Covered
- * Code in any form, with the right to sublicense such rights; and
- *
- * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
- * license (with the right to sublicense), under only those claims of Intel
- * patents that are infringed by the Original Intel Code, to make, use, sell,
- * offer to sell, and import the Covered Code and derivative works thereof
- * solely to the minimum extent necessary to exercise the above copyright
- * license, and in no event shall the patent license extend to any additions
- * to or modifications of the Original Intel Code. No other license or right
- * is granted directly or by implication, estoppel or otherwise;
- *
- * The above copyright and patent license is granted only if the following
- * conditions are met:
- *
- * 3. Conditions
- *
- * 3.1. Redistribution of Source with Rights to Further Distribute Source.
- * Redistribution of source code of any substantial portion of the Covered
- * Code or modification with rights to further distribute source must include
- * the above Copyright Notice, the above License, this list of Conditions,
- * and the following Disclaimer and Export Compliance provision. In addition,
- * Licensee must cause all Covered Code to which Licensee contributes to
- * contain a file documenting the changes Licensee made to create that Covered
- * Code and the date of any change. Licensee must include in that file the
- * documentation of any changes made by any predecessor Licensee. Licensee
- * must include a prominent statement that the modification is derived,
- * directly or indirectly, from Original Intel Code.
- *
- * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
- * Redistribution of source code of any substantial portion of the Covered
- * Code or modification without rights to further distribute source must
- * include the following Disclaimer and Export Compliance provision in the
- * documentation and/or other materials provided with distribution. In
- * addition, Licensee may not authorize further sublicense of source of any
- * portion of the Covered Code, and must include terms to the effect that the
- * license from Licensee to its licensee is limited to the intellectual
- * property embodied in the software Licensee provides to its licensee, and
- * not to intellectual property embodied in modifications its licensee may
- * make.
- *
- * 3.3. Redistribution of Executable. Redistribution in executable form of any
- * substantial portion of the Covered Code or modification must reproduce the
- * above Copyright Notice, and the following Disclaimer and Export Compliance
- * provision in the documentation and/or other materials provided with the
- * distribution.
- *
- * 3.4. Intel retains all right, title, and interest in and to the Original
- * Intel Code.
- *
- * 3.5. Neither the name Intel nor any other trademark owned or controlled by
- * Intel shall be used in advertising or otherwise to promote the sale, use or
- * other dealings in products derived from or relating to the Covered Code
- * without prior written authorization from Intel.
- *
- * 4. Disclaimer and Export Compliance
- *
- * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
- * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
- * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
- * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
- * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
- * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
- * PARTICULAR PURPOSE.
- *
- * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
- * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
- * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
- * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
- * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
- * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
- * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
- * LIMITED REMEDY.
- *
- * 4.3. Licensee shall not export, either directly or indirectly, any of this
- * software or system incorporating such software without first obtaining any
- * required license or other approval from the U. S. Department of Commerce or
- * any other agency or department of the United States Government. In the
- * event Licensee exports any such software from the United States or
- * re-exports any such software from a foreign destination, Licensee shall
- * ensure that the distribution and export/re-export of the software is in
- * compliance with all laws, regulations, orders, or other restrictions of the
- * U.S. Export Administration Regulations. Licensee agrees that neither it nor
- * any of its subsidiaries will export/re-export any technical data, process,
- * software, or service, directly or indirectly, to any country for which the
- * United States government or any agency thereof requires an export license,
- * other governmental approval, or letter of assurance, without first obtaining
- * such license, approval or letter.
- *
- *****************************************************************************/
-
-#include "acpi.h"
-#include "acnamesp.h"
-#include "achware.h"
-
-#define _COMPONENT HARDWARE
- MODULE_NAME ("hwxface")
-
-
-/******************************************************************************
- *
- * Hardware globals
- *
- ******************************************************************************/
-
-
-ACPI_C_STATE_HANDLER AcpiHwCxHandlers[MAX_CX_STATES] =
- {NULL, AcpiHwEnterC1, NULL, NULL};
-
-UINT32 AcpiHwActiveCxState = 1;
-
-
-/****************************************************************************
- *
- * FUNCTION: AcpiGetProcessorThrottlingInfo
- *
- * PARAMETERS: ProcessorHandle - handle for the cpu to get info about
- * UserBuffer - caller supplied buffer
- *
- * RETURN: Status of function
- *
- * DESCRIPTION: Get throttling capabilities for the processor, this routine
- * builds the data directly into the callers buffer
- *
- ****************************************************************************/
-
-ACPI_STATUS
-AcpiGetProcessorThrottlingInfo (
- ACPI_HANDLE ProcessorHandle,
- ACPI_BUFFER *UserBuffer)
-{
- NATIVE_UINT PercentStep;
- NATIVE_UINT NextPercent;
- NATIVE_UINT NumThrottleStates;
- NATIVE_UINT BufferSpaceNeeded;
- NATIVE_UINT i;
- UINT8 DutyWidth;
- ACPI_NAMESPACE_NODE *CpuNode;
- ACPI_OPERAND_OBJECT *CpuObj;
- ACPI_CPU_THROTTLING_STATE *StatePtr;
-
-
- FUNCTION_TRACE ("AcpiGetProcessorThrottlingInfo");
-
-
- /*
- * Have to at least have a buffer to return info in
- */
- if (!UserBuffer)
- {
- return_ACPI_STATUS(AE_BAD_PARAMETER);
- }
-
- /*
- * Convert and validate the device handle
- */
-
- CpuNode = AcpiNsConvertHandleToEntry (ProcessorHandle);
- if (!CpuNode)
- {
- return_ACPI_STATUS (AE_BAD_PARAMETER);
- }
-
- /*
- * Check for an existing internal object
- */
-
- CpuObj = AcpiNsGetAttachedObject ((ACPI_HANDLE) CpuNode);
- if (!CpuObj)
- {
- return_ACPI_STATUS (AE_NOT_FOUND);
- }
-
- /*
- * (Duty Width on IA-64 is zero)
- */
- DutyWidth = AcpiGbl_FADT->DutyWidth;
-
- /*
- * P0 must always have a P_BLK all others may be null
- * in either case, we can't throttle a processor that has no P_BLK
- *
- * Also if no Duty width, one state and it is 100%
- *
- */
- if (!CpuObj->Processor.Length || !DutyWidth ||
- (ACPI_UINT16_MAX < CpuObj->Processor.Address))
- {
- /*
- * AcpiEven though we can't throttle, we still have one state (100%)
- */
- NumThrottleStates = 1;
- }
-
- else
- {
- NumThrottleStates = (int) AcpiHwLocalPow (2,DutyWidth);
- }
-
- BufferSpaceNeeded = NumThrottleStates * sizeof (ACPI_CPU_THROTTLING_STATE);
-
- if ((UserBuffer->Length < BufferSpaceNeeded) || !UserBuffer->Pointer)
- {
- UserBuffer->Length = BufferSpaceNeeded;
- return_ACPI_STATUS (AE_BUFFER_OVERFLOW);
- }
-
- UserBuffer->Length = BufferSpaceNeeded;
- StatePtr = (ACPI_CPU_THROTTLING_STATE *) UserBuffer->Pointer;
- PercentStep = 1000 / NumThrottleStates;
-
- /*
- * Build each entry in the buffer. Note that we're using the value
- * 1000 and dividing each state by 10 to better avoid round-off
- * accumulation. Also note that the throttling STATES are ordered
- * sequentially from 100% (state 0) on down (e.g. 87.5% = state 1),
- * which is exactly opposite from duty cycle values (12.5% = state 1).
- */
- for (i = 0, NextPercent = 1000; i < NumThrottleStates; i++)
- {
- StatePtr[i].StateNumber = i;
- StatePtr[i].PercentOfClock = NextPercent / 10;
- NextPercent -= PercentStep;
- }
-
- return_ACPI_STATUS(AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION: AcpiGetProcessorThrottlingState
- *
- * PARAMETERS: ProcessorHandle - handle for the cpu to throttle
- * ThrottleState - throttling state to enter
- *
- * RETURN: Status of function
- *
- * DESCRIPTION: Get current hardware throttling state
- *
- ****************************************************************************/
-
-ACPI_STATUS
-AcpiGetProcessorThrottlingState (
- ACPI_HANDLE ProcessorHandle,
- UINT32 *ThrottleState)
-{
- ACPI_NAMESPACE_NODE *CpuNode;
- ACPI_OPERAND_OBJECT *CpuObj;
- UINT32 NumThrottleStates;
- UINT32 DutyCycle;
- UINT8 DutyOffset;
- UINT8 DutyWidth;
-
-
- FUNCTION_TRACE ("AcpiGetProcessorThrottlingState");
-
-
- /* Convert and validate the device handle */
-
- CpuNode = AcpiNsConvertHandleToEntry (ProcessorHandle);
- if (!CpuNode || !ThrottleState)
- {
- return_ACPI_STATUS (AE_BAD_PARAMETER);
- }
-
- /* Check for an existing internal object */
-
- CpuObj = AcpiNsGetAttachedObject ((ACPI_HANDLE) CpuNode);
- if (!CpuObj)
- {
- return_ACPI_STATUS (AE_NOT_FOUND);
- }
-
- /*
- * No Duty fields in IA64 tables
- */
- DutyOffset = AcpiGbl_FADT->DutyOffset;
- DutyWidth = AcpiGbl_FADT->DutyWidth;
-
- /*
- * Must have a valid P_BLK P0 must have a P_BLK all others may be null
- * in either case, we can't thottle a processor that has no P_BLK
- * that means we are in the only supported state (0 - 100%)
- *
- * also, if DutyWidth is zero there are no additional states
- */
- if (!CpuObj->Processor.Length || !DutyWidth ||
- (ACPI_UINT16_MAX < CpuObj->Processor.Address))
- {
- *ThrottleState = 0;
- return_ACPI_STATUS(AE_OK);
- }
-
- NumThrottleStates = (UINT32) AcpiHwLocalPow (2,DutyWidth);
-
- /*
- * Get the current duty cycle value.
- */
- DutyCycle = AcpiHwGetDutyCycle (DutyOffset,
- CpuObj->Processor.Address,
- NumThrottleStates);
-
- /*
- * Convert duty cycle to throttling state (invert).
- */
- if (DutyCycle == 0)
- {
- *ThrottleState = 0;
- }
-
- else
- {
- *ThrottleState = NumThrottleStates - DutyCycle;
- }
-
- return_ACPI_STATUS(AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION: AcpiSetProcessorThrottlingState
- *
- * PARAMETERS: ProcessorHandle - handle for the cpu to throttle
- * ThrottleState - throttling state to enter
- *
- * RETURN: Status of function
- *
- * DESCRIPTION: Set hardware into requested throttling state, the handle
- * passed in must have a valid P_BLK
- *
- ****************************************************************************/
-
-ACPI_STATUS
-AcpiSetProcessorThrottlingState (
- ACPI_HANDLE ProcessorHandle,
- UINT32 ThrottleState)
-{
- ACPI_NAMESPACE_NODE *CpuNode;
- ACPI_OPERAND_OBJECT *CpuObj;
- UINT32 NumThrottleStates = 0;
- UINT8 DutyOffset;
- UINT8 DutyWidth;
- UINT32 DutyCycle = 0;
-
-
- FUNCTION_TRACE ("AcpiSetProcessorThrottlingState");
-
-
- /* Convert and validate the device handle */
-
- CpuNode = AcpiNsConvertHandleToEntry (ProcessorHandle);
- if (!CpuNode)
- {
- return_ACPI_STATUS (AE_BAD_PARAMETER);
- }
-
- /* Check for an existing internal object */
-
- CpuObj = AcpiNsGetAttachedObject ((ACPI_HANDLE) CpuNode);
- if (!CpuObj)
- {
- return_ACPI_STATUS (AE_NOT_FOUND);
- }
-
- /*
- * No Duty fields in IA64 tables
- */
- DutyOffset = AcpiGbl_FADT->DutyOffset;
- DutyWidth = AcpiGbl_FADT->DutyWidth;
-
- /*
- * Must have a valid P_BLK P0 must have a P_BLK all others may be null
- * in either case, we can't thottle a processor that has no P_BLK
- * that means we are in the only supported state (0 - 100%)
- *
- * also, if DutyWidth is zero there are no additional states
- */
- if (!CpuObj->Processor.Length || !DutyWidth ||
- (ACPI_UINT16_MAX < CpuObj->Processor.Address))
- {
- /*
- * If caller wants to set the state to the only state we handle
- * we're done.
- */
- if (ThrottleState == 0)
- {
- return_ACPI_STATUS (AE_OK);
- }
-
- /*
- * Can't set this state
- */
- return_ACPI_STATUS (AE_SUPPORT);
- }
-
- NumThrottleStates = (UINT32) AcpiHwLocalPow (2,DutyWidth);
-
- /*
- * Convert throttling state to duty cycle (invert).
- */
- if (ThrottleState > 0)
- {
- DutyCycle = NumThrottleStates - ThrottleState;
- }
-
- /*
- * Turn off throttling (don't muck with the h/w while throttling).
- */
- AcpiHwDisableThrottling (CpuObj->Processor.Address);
-
- /*
- * Program the throttling state.
- */
- AcpiHwProgramDutyCycle (DutyOffset, DutyCycle,
- CpuObj->Processor.Address, NumThrottleStates);
-
- /*
- * Only enable throttling for non-zero states (0 - 100%)
- */
- if (ThrottleState)
- {
- AcpiHwEnableThrottling (CpuObj->Processor.Address);
- }
-
- return_ACPI_STATUS(AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION: AcpiGetProcessorCxInfo
- *
- * PARAMETERS: ProcessorHandle - handle for the cpu return info about
- * UserBuffer - caller supplied buffer
- *
- * RETURN: Status of function
- *
- * DESCRIPTION: Get Cx state latencies, this routine
- * builds the data directly into the callers buffer
- *
- *
- ****************************************************************************/
-
-ACPI_STATUS
-AcpiGetProcessorCxInfo (
- ACPI_HANDLE ProcessorHandle,
- ACPI_BUFFER *UserBuffer)
-{
- ACPI_STATUS Status = AE_OK;
- UINT32 CxStateLatencies[4] = {0, 0, 0, 0};
- NATIVE_UINT BufferSpaceNeeded = 0;
- ACPI_CX_STATE *StatePtr = NULL;
- NATIVE_UINT i = 0;
-
-
- FUNCTION_TRACE ("AcpiGetProcessorCxInfo");
-
-
- /*
- * Have to at least have a buffer to return info in
- */
- if (!UserBuffer)
- {
- return_ACPI_STATUS (AE_BAD_PARAMETER);
- }
-
- Status = AcpiHwGetCxInfo (CxStateLatencies);
- if (ACPI_FAILURE (Status))
- {
- return_ACPI_STATUS (Status);
- }
-
- BufferSpaceNeeded = 4 * sizeof (ACPI_CX_STATE);
-
- if ((UserBuffer->Length < BufferSpaceNeeded) || !UserBuffer->Pointer)
- {
- UserBuffer->Length = BufferSpaceNeeded;
- return_ACPI_STATUS (AE_BUFFER_OVERFLOW);
- }
-
- UserBuffer->Length = BufferSpaceNeeded;
-
- StatePtr = (ACPI_CX_STATE *) UserBuffer->Pointer;
-
- for (i = 0; i < 4; i++)
- {
- StatePtr[i].StateNumber = i;
- StatePtr[i].Latency = CxStateLatencies[i];
- }
-
- return_ACPI_STATUS (AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION: AcpiSetProcessorSleepState
- *
- * PARAMETERS: ProcessorHandle - handle for the cpu return info about
- * CxState - the Cx sleeping state (C1-C3) to make
- * 'active'
- *
- * RETURN: Status of function
- *
- * DESCRIPTION: Sets which Cx state will be used during calls to
- * AcpiProcessorSleep ()
- *
- ****************************************************************************/
-
-ACPI_STATUS
-AcpiSetProcessorSleepState (
- ACPI_HANDLE ProcessorHandle,
- UINT32 CxState)
-{
- ACPI_STATUS Status;
-
-
- FUNCTION_TRACE ("AcpiSetProcessorSleepState");
-
-
- Status = AcpiHwSetCx (CxState);
-
- return_ACPI_STATUS (Status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION: AcpiProcessorSleep
- *
- * PARAMETERS: ProcessorHandle - handle for the cpu to put to sleep (Cx)
- * TimeSleeping - time (in microseconds) elapsed while
- * sleeping
- *
- * RETURN: Status of function
- *
- * DESCRIPTION: Puts the processor into the currently active sleep state (Cx)
- *
- ****************************************************************************/
-
-ACPI_STATUS
-AcpiProcessorSleep (
- ACPI_HANDLE ProcessorHandle,
- UINT32 *PmTimerTicks)
-{
- ACPI_NAMESPACE_NODE *CpuNode = NULL;
- ACPI_OPERAND_OBJECT *CpuObj = NULL;
- ACPI_IO_ADDRESS Address = 0;
-
-
- /*
- * Convert ProcessorHandle to PblkAddres...
- */
-
- /* Convert and validate the device handle */
-
- CpuNode = AcpiNsConvertHandleToEntry (ProcessorHandle);
- if (!CpuNode)
- {
- return (AE_BAD_PARAMETER);
- }
-
- /* Check for an existing internal object */
-
- CpuObj = AcpiNsGetAttachedObject ((ACPI_HANDLE) CpuNode);
- if (!CpuObj)
- {
- return (AE_NOT_FOUND);
- }
-
- /* Get the processor register block (P_BLK) address */
-
- Address = CpuObj->Processor.Address;
- if (!CpuObj->Processor.Length)
- {
- /* Ensure a NULL addresss (note that P_BLK isn't required for C1) */
-
- Address = 0;
- }
-
- /*
- * Enter the currently active Cx sleep state.
- */
- return (AcpiHwEnterCx (Address, PmTimerTicks));
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: AcpiGetTimer
- *
- * PARAMETERS: none
- *
- * RETURN: Current value of the ACPI PMT (timer)
- *
- * DESCRIPTION: Obtains current value of ACPI PMT
- *
- ******************************************************************************/
-
-ACPI_STATUS
-AcpiGetTimer (
- UINT32 *OutTicks)
-{
- FUNCTION_TRACE ("AcpiGetTimer");
-
-
- if (!OutTicks)
- {
- return_ACPI_STATUS (AE_BAD_PARAMETER);
- }
-
- *OutTicks = AcpiHwPmtTicks ();
-
- return_ACPI_STATUS (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: AcpiSetFirmwareWakingVector
- *
- * PARAMETERS: PhysicalAddress - Physical address of ACPI real mode
- * entry point.
- *
- * RETURN: AE_OK or AE_ERROR
- *
- * DESCRIPTION: Access function for dFirmwareWakingVector field in FACS
- *
- ******************************************************************************/
-
-ACPI_STATUS
-AcpiSetFirmwareWakingVector (
- ACPI_PHYSICAL_ADDRESS PhysicalAddress)
-{
-
- FUNCTION_TRACE ("AcpiSetFirmwareWakingVector");
-
-
- /* Make sure that we have an FACS */
-
- if (!AcpiGbl_FACS)
- {
- return_ACPI_STATUS (AE_NO_ACPI_TABLES);
- }
-
- /* Set the vector */
-
- if (AcpiGbl_FACS->VectorWidth == 32)
- {
- * (UINT32 *) AcpiGbl_FACS->FirmwareWakingVector = (UINT32) PhysicalAddress;
- }
- else
- {
- *AcpiGbl_FACS->FirmwareWakingVector = PhysicalAddress;
- }
-
- return_ACPI_STATUS (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: AcpiGetFirmwareWakingVector
- *
- * PARAMETERS: *PhysicalAddress - Output buffer where contents of
- * the FirmwareWakingVector field of
- * the FACS will be stored.
- *
- * RETURN: Status
- *
- * DESCRIPTION: Access function for dFirmwareWakingVector field in FACS
- *
- ******************************************************************************/
-
-ACPI_STATUS
-AcpiGetFirmwareWakingVector (
- ACPI_PHYSICAL_ADDRESS *PhysicalAddress)
-{
-
- FUNCTION_TRACE ("AcpiGetFirmwareWakingVector");
-
-
- if (!PhysicalAddress)
- {
- return_ACPI_STATUS (AE_BAD_PARAMETER);
- }
-
- /* Make sure that we have an FACS */
-
- if (!AcpiGbl_FACS)
- {
- return_ACPI_STATUS (AE_NO_ACPI_TABLES);
- }
-
- /* Get the vector */
-
- if (AcpiGbl_FACS->VectorWidth == 32)
- {
- *PhysicalAddress = * (UINT32 *) AcpiGbl_FACS->FirmwareWakingVector;
- }
- else
- {
- *PhysicalAddress = *AcpiGbl_FACS->FirmwareWakingVector;
- }
-
- return_ACPI_STATUS (AE_OK);
-}
-
-
diff --git a/sys/contrib/dev/acpica/Subsystem/Include/acconfig.h b/sys/contrib/dev/acpica/Subsystem/Include/acconfig.h
index b3c7ed6..0721500 100644
--- a/sys/contrib/dev/acpica/Subsystem/Include/acconfig.h
+++ b/sys/contrib/dev/acpica/Subsystem/Include/acconfig.h
@@ -189,13 +189,14 @@
#define DEBUGGER_SINGLE_THREADED 0
#define DEBUGGER_MULTI_THREADED 1
+#ifndef DEBUGGER_THREADING
#ifdef ACPI_APPLICATION
#define DEBUGGER_THREADING DEBUGGER_SINGLE_THREADED
#else
#define DEBUGGER_THREADING DEBUGGER_MULTI_THREADED
#endif
-
+#endif
/******************************************************************************
*
diff --git a/sys/contrib/dev/acpica/Subsystem/Include/acfreebsd.h b/sys/contrib/dev/acpica/Subsystem/Include/acfreebsd.h
index ca6c799..2d42e83 100644
--- a/sys/contrib/dev/acpica/Subsystem/Include/acfreebsd.h
+++ b/sys/contrib/dev/acpica/Subsystem/Include/acfreebsd.h
@@ -117,18 +117,82 @@
#ifndef __ACFREEBSD_H__
#define __ACFREEBSD_H__
+/*
+ * XXX this is technically correct, but will cause problems with some ASL
+ * which only works if the string names a Microsoft operating system.
+ */
#define ACPI_OS_NAME "FreeBSD"
+/* FreeBSD uses GCC */
+
+#include "acgcc.h"
+
#ifdef _KERNEL
+#include "opt_acpi.h" /* collect build-time options here */
+
#include <sys/ctype.h>
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/libkern.h>
-#include <stdarg.h>
+#include <machine/stdarg.h>
#define asm __asm
#define __cli() disable_intr()
#define __sti() enable_intr()
+#ifdef ACPI_DEBUG
+#ifdef DEBUGGER_THREADING
+#undef DEBUGGER_THREADING
+#endif /* DEBUGGER_THREADING */
+#define DEBUGGER_THREADING 0 /* integrated with DDB */
+#include "opt_ddb.h"
+#ifdef DDB
+#define ENABLE_DEBUGGER
+#endif /* DDB */
+#endif /* ACPI_DEBUG */
+
+#else /* _KERNEL */
+
+/* Not building kernel code, so use libc */
+#define ACPI_USE_STANDARD_HEADERS
+
+#endif /* _KERNEL */
+
+/* Always use FreeBSD code over our local versions */
+#define ACPI_USE_SYSTEM_CLIBRARY
+
+/* FreeBSD doesn't have strupr, should be fixed. (move to libkern) */
+static __inline char *
+strupr(char *str)
+{
+ char *c = str;
+ while(*c) {
+ *c = toupper(*c);
+ c++;
+ }
+ return(str);
+}
+
+#ifdef _KERNEL
+/* Or strstr (used in debugging mode, also move to libkern) */
+static __inline char *
+strstr(char *s, char *find)
+{
+ char c, sc;
+ size_t len;
+
+ if ((c = *find++) != 0) {
+ len = strlen(find);
+ do {
+ do {
+ if ((sc = *s++) == 0)
+ return (NULL);
+ } while (sc != c);
+ } while (strncmp(s, find, len) != 0);
+ s--;
+ }
+ return ((char *)s);
+}
+#endif /* _KERNEL */
#endif /* __ACFREEBSD_H__ */
diff --git a/sys/contrib/dev/acpica/Subsystem/Include/acgcc.h b/sys/contrib/dev/acpica/Subsystem/Include/acgcc.h
index eb2f4ce..e486315 100644
--- a/sys/contrib/dev/acpica/Subsystem/Include/acgcc.h
+++ b/sys/contrib/dev/acpica/Subsystem/Include/acgcc.h
@@ -131,7 +131,9 @@
#define BREAKPOINT3
#define disable() __cli()
#define enable() __sti()
+#ifndef __FreeBSD__ /* XXX conflicts with inline in cpufunc.h */
#define wbinvd()
+#endif
/*! [Begin] no source code translation */
@@ -193,7 +195,9 @@
#define disable() __cli()
#define enable() __sti()
#define halt() __asm__ __volatile__ ("sti; hlt":::"memory")
+#ifndef __FreeBSD__ /* XXX conflicts with inline in cpufunc.h */
#define wbinvd()
+#endif
/*! [Begin] no source code translation
*
diff --git a/sys/contrib/dev/acpica/Subsystem/Include/acpixf.h b/sys/contrib/dev/acpica/Subsystem/Include/acpixf.h
index c33ca3f..5dd9c30 100644
--- a/sys/contrib/dev/acpica/Subsystem/Include/acpixf.h
+++ b/sys/contrib/dev/acpica/Subsystem/Include/acpixf.h
@@ -409,5 +409,8 @@ AcpiProcessorSleep (
ACPI_HANDLE ProcessorHandle,
UINT32 *PmTimerTicks);
+ACPI_STATUS
+AcpiSetSystemSleepState (
+ UINT8 SleepState);
#endif /* __ACXFACE_H__ */
diff --git a/sys/contrib/dev/acpica/Subsystem/Parser/psparse.c b/sys/contrib/dev/acpica/Subsystem/Parser/psparse.c
index 78443bc..1d44bd8 100644
--- a/sys/contrib/dev/acpica/Subsystem/Parser/psparse.c
+++ b/sys/contrib/dev/acpica/Subsystem/Parser/psparse.c
@@ -1235,6 +1235,7 @@ AcpiPsParseAml (
ACPI_NAMESPACE_NODE *Node = NULL;
ACPI_WALK_LIST *PrevWalkList = AcpiGbl_CurrentWalkList;
ACPI_OPERAND_OBJECT *ReturnDesc;
+ ACPI_OPERAND_OBJECT *EffectiveReturnDesc = NULL;
ACPI_OPERAND_OBJECT *MthDesc = NULL;
@@ -1376,6 +1377,14 @@ AcpiPsParseAml (
ReturnDesc = WalkState->ReturnDesc;
+ /* Save the last effective return value */
+
+ if (CallerReturnDesc && ReturnDesc)
+ {
+ EffectiveReturnDesc = ReturnDesc;
+ AcpiCmAddReference (EffectiveReturnDesc);
+ }
+
DEBUG_PRINT (TRACE_PARSE,
("PsParseAml: ReturnValue=%p, State=%p\n",
WalkState->ReturnDesc, WalkState));
@@ -1424,6 +1433,16 @@ AcpiPsParseAml (
else if (CallerReturnDesc)
{
+ /*
+ * Some AML code expects return value w/o ReturnOp.
+ * Return the saved effective return value instead.
+ */
+
+ if (ReturnDesc == NULL && EffectiveReturnDesc != NULL)
+ {
+ AcpiCmRemoveReference (ReturnDesc);
+ ReturnDesc = EffectiveReturnDesc;
+ }
*CallerReturnDesc = ReturnDesc; /* NULL if no return value */
}
diff --git a/sys/contrib/dev/acpica/acconfig.h b/sys/contrib/dev/acpica/acconfig.h
index 8683e86e..0721500 100644
--- a/sys/contrib/dev/acpica/acconfig.h
+++ b/sys/contrib/dev/acpica/acconfig.h
@@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: acconfig.h - Global configuration constants
- * $Revision: 64 $
+ * $Revision: 55 $
*
*****************************************************************************/
@@ -144,7 +144,7 @@
/* Version string */
-#define ACPI_CA_VERSION 0x20010518
+#define ACPI_CA_VERSION 0x20010208
/* Maximum objects in the various object caches */
@@ -180,7 +180,7 @@
/*
* Debugger threading model
* Use single threaded if the entire subsystem is contained in an application
- * Use multiple threaded when the subsystem is running in the kernel.
+ * Use multiple threaded when the the subsystem is running in the kernel.
*
* By default the model is single threaded if ACPI_APPLICATION is set,
* multi-threaded if ACPI_APPLICATION is not set.
@@ -189,13 +189,14 @@
#define DEBUGGER_SINGLE_THREADED 0
#define DEBUGGER_MULTI_THREADED 1
+#ifndef DEBUGGER_THREADING
#ifdef ACPI_APPLICATION
#define DEBUGGER_THREADING DEBUGGER_SINGLE_THREADED
#else
#define DEBUGGER_THREADING DEBUGGER_MULTI_THREADED
#endif
-
+#endif
/******************************************************************************
*
@@ -239,11 +240,6 @@
#define HI_RSDP_WINDOW_SIZE 0x20000
#define RSDP_SCAN_STEP 16
-/* Maximum SpaceIds for Operation Regions */
-
-#define ACPI_MAX_ADDRESS_SPACE 255
-#define ACPI_NUM_ADDRESS_SPACES 256
-
#endif /* _ACCONFIG_H */
diff --git a/sys/contrib/dev/acpica/acfreebsd.h b/sys/contrib/dev/acpica/acfreebsd.h
index 894af50..2d42e83 100644
--- a/sys/contrib/dev/acpica/acfreebsd.h
+++ b/sys/contrib/dev/acpica/acfreebsd.h
@@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: acfreebsd.h - OS specific defines, etc.
- * $Revision: 6 $
+ * $Revision: 4 $
*
*****************************************************************************/
@@ -128,6 +128,8 @@
#include "acgcc.h"
#ifdef _KERNEL
+#include "opt_acpi.h" /* collect build-time options here */
+
#include <sys/ctype.h>
#include <sys/param.h>
#include <sys/systm.h>
@@ -142,7 +144,7 @@
#ifdef DEBUGGER_THREADING
#undef DEBUGGER_THREADING
#endif /* DEBUGGER_THREADING */
-#define DEBUGGER_THREADING 0 /* integrated with DDB */
+#define DEBUGGER_THREADING 0 /* integrated with DDB */
#include "opt_ddb.h"
#ifdef DDB
#define ENABLE_DEBUGGER
@@ -154,9 +156,6 @@
/* Not building kernel code, so use libc */
#define ACPI_USE_STANDARD_HEADERS
-#define __cli()
-#define __sti()
-
#endif /* _KERNEL */
/* Always use FreeBSD code over our local versions */
@@ -168,8 +167,8 @@ strupr(char *str)
{
char *c = str;
while(*c) {
- *c = toupper(*c);
- c++;
+ *c = toupper(*c);
+ c++;
}
return(str);
}
@@ -183,14 +182,14 @@ strstr(char *s, char *find)
size_t len;
if ((c = *find++) != 0) {
- len = strlen(find);
- do {
- do {
- if ((sc = *s++) == 0)
- return (NULL);
- } while (sc != c);
- } while (strncmp(s, find, len) != 0);
- s--;
+ len = strlen(find);
+ do {
+ do {
+ if ((sc = *s++) == 0)
+ return (NULL);
+ } while (sc != c);
+ } while (strncmp(s, find, len) != 0);
+ s--;
}
return ((char *)s);
}
diff --git a/sys/contrib/dev/acpica/acgcc.h b/sys/contrib/dev/acpica/acgcc.h
index c426663..e486315 100644
--- a/sys/contrib/dev/acpica/acgcc.h
+++ b/sys/contrib/dev/acpica/acgcc.h
@@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: acgcc.h - GCC specific defines, etc.
- * $Revision: 6 $
+ * $Revision: 5 $
*
*****************************************************************************/
@@ -118,6 +118,7 @@
#define __ACGCC_H__
+
#ifdef __ia64__
#define _IA64
@@ -130,7 +131,9 @@
#define BREAKPOINT3
#define disable() __cli()
#define enable() __sti()
+#ifndef __FreeBSD__ /* XXX conflicts with inline in cpufunc.h */
#define wbinvd()
+#endif
/*! [Begin] no source code translation */
@@ -192,7 +195,9 @@
#define disable() __cli()
#define enable() __sti()
#define halt() __asm__ __volatile__ ("sti; hlt":::"memory")
+#ifndef __FreeBSD__ /* XXX conflicts with inline in cpufunc.h */
#define wbinvd()
+#endif
/*! [Begin] no source code translation
*
diff --git a/sys/contrib/dev/acpica/acpixf.h b/sys/contrib/dev/acpica/acpixf.h
index 84ec9a2..5dd9c30 100644
--- a/sys/contrib/dev/acpica/acpixf.h
+++ b/sys/contrib/dev/acpica/acpixf.h
@@ -121,7 +121,6 @@
#include "actypes.h"
#include "actbl.h"
-
/*
* Global interfaces
*/
@@ -157,23 +156,6 @@ AcpiFormatException (
/*
- * ACPI Memory manager
- */
-
-void *
-AcpiAllocate (
- UINT32 Size);
-
-void *
-AcpiCallocate (
- UINT32 Size);
-
-void
-AcpiFree (
- void *Address);
-
-
-/*
* ACPI table manipulation interfaces
*/
@@ -215,14 +197,14 @@ AcpiWalkNamespace (
ACPI_OBJECT_TYPE Type,
ACPI_HANDLE StartObject,
UINT32 MaxDepth,
- ACPI_WALK_CALLBACK UserFunction,
+ WALK_CALLBACK UserFunction,
void *Context,
void * *ReturnValue);
ACPI_STATUS
AcpiGetDevices (
NATIVE_CHAR *HID,
- ACPI_WALK_CALLBACK UserFunction,
+ WALK_CALLBACK UserFunction,
void *Context,
void **ReturnValue);
@@ -274,52 +256,52 @@ AcpiGetParent (
/*
- * Event handler interfaces
+ * AcpiEvent handler interfaces
*/
ACPI_STATUS
AcpiInstallFixedEventHandler (
UINT32 AcpiEvent,
- ACPI_EVENT_HANDLER Handler,
+ FIXED_EVENT_HANDLER Handler,
void *Context);
ACPI_STATUS
AcpiRemoveFixedEventHandler (
UINT32 AcpiEvent,
- ACPI_EVENT_HANDLER Handler);
+ FIXED_EVENT_HANDLER Handler);
ACPI_STATUS
AcpiInstallNotifyHandler (
ACPI_HANDLE Device,
UINT32 HandlerType,
- ACPI_NOTIFY_HANDLER Handler,
+ NOTIFY_HANDLER Handler,
void *Context);
ACPI_STATUS
AcpiRemoveNotifyHandler (
ACPI_HANDLE Device,
UINT32 HandlerType,
- ACPI_NOTIFY_HANDLER Handler);
+ NOTIFY_HANDLER Handler);
ACPI_STATUS
AcpiInstallAddressSpaceHandler (
ACPI_HANDLE Device,
- ACPI_ADR_SPACE_TYPE SpaceId,
- ACPI_ADR_SPACE_HANDLER Handler,
- ACPI_ADR_SPACE_SETUP Setup,
+ ACPI_ADDRESS_SPACE_TYPE SpaceId,
+ ADDRESS_SPACE_HANDLER Handler,
+ ADDRESS_SPACE_SETUP Setup,
void *Context);
ACPI_STATUS
AcpiRemoveAddressSpaceHandler (
ACPI_HANDLE Device,
- ACPI_ADR_SPACE_TYPE SpaceId,
- ACPI_ADR_SPACE_HANDLER Handler);
+ ACPI_ADDRESS_SPACE_TYPE SpaceId,
+ ADDRESS_SPACE_HANDLER Handler);
ACPI_STATUS
AcpiInstallGpeHandler (
UINT32 GpeNumber,
UINT32 Type,
- ACPI_GPE_HANDLER Handler,
+ GPE_HANDLER Handler,
void *Context);
ACPI_STATUS
@@ -333,7 +315,7 @@ AcpiReleaseGlobalLock (
ACPI_STATUS
AcpiRemoveGpeHandler (
UINT32 GpeNumber,
- ACPI_GPE_HANDLER Handler);
+ GPE_HANDLER Handler);
ACPI_STATUS
AcpiEnableEvent (
@@ -427,5 +409,8 @@ AcpiProcessorSleep (
ACPI_HANDLE ProcessorHandle,
UINT32 *PmTimerTicks);
+ACPI_STATUS
+AcpiSetSystemSleepState (
+ UINT8 SleepState);
#endif /* __ACXFACE_H__ */
diff --git a/sys/contrib/dev/acpica/exfldio.c b/sys/contrib/dev/acpica/exfldio.c
index 96f3227..24c9a2a 100644
--- a/sys/contrib/dev/acpica/exfldio.c
+++ b/sys/contrib/dev/acpica/exfldio.c
@@ -1,7 +1,7 @@
/******************************************************************************
*
- * Module Name: exfldio - Aml Field I/O
- * $Revision: 57 $
+ * Module Name: amfldio - Aml Field I/O
+ * $Revision: 39 $
*
*****************************************************************************/
@@ -115,7 +115,7 @@
*****************************************************************************/
-#define __EXFLDIO_C__
+#define __AMFLDIO_C__
#include "acpi.h"
#include "acinterp.h"
@@ -123,324 +123,116 @@
#include "acnamesp.h"
#include "achware.h"
#include "acevents.h"
-#include "acdispat.h"
-#define _COMPONENT ACPI_EXECUTER
- MODULE_NAME ("exfldio")
+#define _COMPONENT INTERPRETER
+ MODULE_NAME ("amfldio")
/*******************************************************************************
*
- * FUNCTION: AcpiExSetupField
+ * FUNCTION: AcpiAmlReadFieldData
*
- * PARAMETERS: *ObjDesc - Field to be read or written
- * FieldDatumByteOffset - Current offset into the field
+ * PARAMETERS: *ObjDesc - Field to be read
+ * *Value - Where to store value
+ * FieldBitWidth - Field Width in bits (8, 16, or 32)
*
* RETURN: Status
*
- * DESCRIPTION: Common processing for AcpiExExtractFromField and
- * AcpiExInsertIntoField
+ * DESCRIPTION: Retrieve the value of the given field
*
******************************************************************************/
ACPI_STATUS
-AcpiExSetupField (
+AcpiAmlReadFieldData (
ACPI_OPERAND_OBJECT *ObjDesc,
- UINT32 FieldDatumByteOffset)
+ UINT32 FieldByteOffset,
+ UINT32 FieldBitWidth,
+ UINT32 *Value)
{
- ACPI_STATUS Status = AE_OK;
- ACPI_OPERAND_OBJECT *RgnDesc;
-
-
- FUNCTION_TRACE ("ExSetupField");
-
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *RgnDesc = NULL;
+ ACPI_PHYSICAL_ADDRESS Address;
+ UINT32 LocalValue = 0;
+ UINT32 FieldByteWidth;
- /* Parameter validation */
- RgnDesc = ObjDesc->CommonField.RegionObj;
- if (!ObjDesc || !RgnDesc)
- {
- DEBUG_PRINTP (ACPI_ERROR, ("Internal error - null handle\n"));
- return_ACPI_STATUS (AE_AML_NO_OPERAND);
- }
+ FUNCTION_TRACE ("AmlReadFieldData");
- if (ACPI_TYPE_REGION != RgnDesc->Common.Type)
- {
- DEBUG_PRINTP (ACPI_ERROR, ("Needed Region, found type %x %s\n",
- RgnDesc->Common.Type, AcpiUtGetTypeName (RgnDesc->Common.Type)));
- return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
- }
+ /* ObjDesc is validated by callers */
- /*
- * If the Region Address and Length have not been previously evaluated,
- * evaluate them now and save the results.
- */
- if (!(RgnDesc->Region.Flags & AOPOBJ_DATA_VALID))
+ if (ObjDesc)
{
-
- Status = AcpiDsGetRegionArguments (RgnDesc);
- if (ACPI_FAILURE (Status))
- {
- return_ACPI_STATUS (Status);
- }
+ RgnDesc = ObjDesc->Field.Container;
}
- /*
- * Validate the request. The entire request from the byte offset for a
- * length of one field datum (access width) must fit within the region.
- * (Region length is specified in bytes)
- */
- if (RgnDesc->Region.Length < (ObjDesc->CommonField.BaseByteOffset +
- FieldDatumByteOffset +
- ObjDesc->CommonField.AccessByteWidth))
+ FieldByteWidth = DIV_8 (FieldBitWidth);
+ Status = AcpiAmlSetupField (ObjDesc, RgnDesc, FieldBitWidth);
+ if (ACPI_FAILURE (Status))
{
- if (RgnDesc->Region.Length < ObjDesc->CommonField.AccessByteWidth)
- {
- /*
- * This is the case where the AccessType (AccWord, etc.) is wider
- * than the region itself. For example, a region of length one
- * byte, and a field with Dword access specified.
- */
- DEBUG_PRINTP (ACPI_ERROR,
- ("Field access width (%d bytes) too large for region size (%X)\n",
- ObjDesc->CommonField.AccessByteWidth, RgnDesc->Region.Length));
- }
-
- /*
- * Offset rounded up to next multiple of field width
- * exceeds region length, indicate an error
- */
- DEBUG_PRINTP (ACPI_ERROR,
- ("Field base+offset+width %X+%X+%X exceeds region size (%X bytes) field=%p region=%p\n",
- ObjDesc->CommonField.BaseByteOffset, FieldDatumByteOffset,
- ObjDesc->CommonField.AccessByteWidth,
- RgnDesc->Region.Length, ObjDesc, RgnDesc));
-
- return_ACPI_STATUS (AE_AML_REGION_LIMIT);
+ return_ACPI_STATUS (Status);
}
- return_ACPI_STATUS (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION: AcpiExReadFieldDatum
- *
- * PARAMETERS: *ObjDesc - Field to be read
- * *Value - Where to store value (must be 32 bits)
- *
- * RETURN: Status
- *
- * DESCRIPTION: Retrieve the value of the given field
- *
- ******************************************************************************/
-
-ACPI_STATUS
-AcpiExReadFieldDatum (
- ACPI_OPERAND_OBJECT *ObjDesc,
- UINT32 FieldDatumByteOffset,
- UINT32 *Value)
-{
- ACPI_STATUS Status;
- ACPI_OPERAND_OBJECT *RgnDesc;
- ACPI_PHYSICAL_ADDRESS Address;
- UINT32 LocalValue;
-
-
- FUNCTION_TRACE_U32 ("ExReadFieldDatum", FieldDatumByteOffset);
-
+ /* SetupField validated RgnDesc and FieldBitWidth */
if (!Value)
{
- LocalValue = 0;
Value = &LocalValue; /* support reads without saving value */
}
- /* Clear the entire return buffer first, [Very Important!] */
-
- *Value = 0;
-
/*
- * BufferFields - Read from a Buffer
- * Other Fields - Read from a Operation Region.
+ * Set offset to next multiple of field width,
+ * add region base address and offset within the field
*/
- switch (ObjDesc->Common.Type)
- {
- case ACPI_TYPE_BUFFER_FIELD:
-
- /*
- * For BufferFields, we only need to copy the data from the
- * source buffer. Length is the field width in bytes.
- */
- MEMCPY (Value, (ObjDesc->BufferField.BufferObj)->Buffer.Pointer
- + ObjDesc->BufferField.BaseByteOffset + FieldDatumByteOffset,
- ObjDesc->CommonField.AccessByteWidth);
- Status = AE_OK;
- break;
-
-
- case INTERNAL_TYPE_REGION_FIELD:
- case INTERNAL_TYPE_BANK_FIELD:
+ Address = RgnDesc->Region.Address +
+ (ObjDesc->Field.Offset * FieldByteWidth) +
+ FieldByteOffset;
- /*
- * For other fields, we need to go through an Operation Region
- * (Only types that will get here are RegionFields and BankFields)
- */
- Status = AcpiExSetupField (ObjDesc, FieldDatumByteOffset);
- if (ACPI_FAILURE (Status))
- {
- return_ACPI_STATUS (Status);
- }
+ DEBUG_PRINT (TRACE_OPREGION,
+ ("AmlReadFieldData: Region %s(%X) at %08lx width %X\n",
+ AcpiCmGetRegionName (RgnDesc->Region.SpaceId),
+ RgnDesc->Region.SpaceId, Address,
+ FieldBitWidth));
- /*
- * The physical address of this field datum is:
- *
- * 1) The base of the region, plus
- * 2) The base offset of the field, plus
- * 3) The current offset into the field
- */
- RgnDesc = ObjDesc->CommonField.RegionObj;
- Address = RgnDesc->Region.Address + ObjDesc->CommonField.BaseByteOffset +
- FieldDatumByteOffset;
-
- DEBUG_PRINTP (TRACE_BFIELD, ("Region %s(%X) width %X base:off %X:%X at %08lX\n",
- AcpiUtGetRegionName (RgnDesc->Region.SpaceId),
- RgnDesc->Region.SpaceId, ObjDesc->CommonField.AccessBitWidth,
- ObjDesc->CommonField.BaseByteOffset, FieldDatumByteOffset,
- Address));
-
+ /* Invoke the appropriate AddressSpace/OpRegion handler */
- /* Invoke the appropriate AddressSpace/OpRegion handler */
+ Status = AcpiEvAddressSpaceDispatch (RgnDesc, ADDRESS_SPACE_READ,
+ Address, FieldBitWidth, Value);
- Status = AcpiEvAddressSpaceDispatch (RgnDesc, ACPI_READ_ADR_SPACE,
- Address, ObjDesc->CommonField.AccessBitWidth, Value);
- if (Status == AE_NOT_IMPLEMENTED)
- {
- DEBUG_PRINTP (ACPI_ERROR, ("Region %s(%X) not implemented\n",
- AcpiUtGetRegionName (RgnDesc->Region.SpaceId),
- RgnDesc->Region.SpaceId));
- }
-
- else if (Status == AE_NOT_EXIST)
- {
- DEBUG_PRINTP (ACPI_ERROR, ("Region %s(%X) has no handler\n",
- AcpiUtGetRegionName (RgnDesc->Region.SpaceId),
- RgnDesc->Region.SpaceId));
- }
- break;
-
-
- default:
-
- DEBUG_PRINTP (ACPI_ERROR, ("%p, wrong source type - %s\n",
- ObjDesc, AcpiUtGetTypeName (ObjDesc->Common.Type)));
- Status = AE_AML_INTERNAL;
- break;
- }
-
-
- DEBUG_PRINTP (TRACE_BFIELD, ("Returned value=%08lX \n", *Value));
-
- return_ACPI_STATUS (Status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION: AcpiExGetBufferDatum
- *
- * PARAMETERS: MergedDatum - Value to store
- * Buffer - Receiving buffer
- * ByteGranularity - 1/2/4 Granularity of the field
- * (aka Datum Size)
- * Offset - Datum offset into the buffer
- *
- * RETURN: none
- *
- * DESCRIPTION: Store the merged datum to the buffer according to the
- * byte granularity
- *
- ******************************************************************************/
-
-static void
-AcpiExGetBufferDatum(
- UINT32 *Datum,
- void *Buffer,
- UINT32 ByteGranularity,
- UINT32 Offset)
-{
-
- switch (ByteGranularity)
+ if (Status == AE_NOT_IMPLEMENTED)
{
- case ACPI_FIELD_BYTE_GRANULARITY:
- *Datum = ((UINT8 *) Buffer) [Offset];
- break;
-
- case ACPI_FIELD_WORD_GRANULARITY:
- MOVE_UNALIGNED16_TO_32 (Datum, &(((UINT16 *) Buffer) [Offset]));
- break;
-
- case ACPI_FIELD_DWORD_GRANULARITY:
- MOVE_UNALIGNED32_TO_32 (Datum, &(((UINT32 *) Buffer) [Offset]));
- break;
+ DEBUG_PRINT (ACPI_ERROR,
+ ("AmlReadFieldData: **** Region %s(%X) not implemented\n",
+ AcpiCmGetRegionName (RgnDesc->Region.SpaceId),
+ RgnDesc->Region.SpaceId));
}
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION: AcpiExSetBufferDatum
- *
- * PARAMETERS: MergedDatum - Value to store
- * Buffer - Receiving buffer
- * ByteGranularity - 1/2/4 Granularity of the field
- * (aka Datum Size)
- * Offset - Datum offset into the buffer
- *
- * RETURN: none
- *
- * DESCRIPTION: Store the merged datum to the buffer according to the
- * byte granularity
- *
- ******************************************************************************/
-static void
-AcpiExSetBufferDatum (
- UINT32 MergedDatum,
- void *Buffer,
- UINT32 ByteGranularity,
- UINT32 Offset)
-{
-
- switch (ByteGranularity)
+ else if (Status == AE_NOT_EXIST)
{
- case ACPI_FIELD_BYTE_GRANULARITY:
- ((UINT8 *) Buffer) [Offset] = (UINT8) MergedDatum;
- break;
+ DEBUG_PRINT (ACPI_ERROR,
+ ("AmlReadFieldData: **** Region %s(%X) has no handler\n",
+ AcpiCmGetRegionName (RgnDesc->Region.SpaceId),
+ RgnDesc->Region.SpaceId));
+ }
- case ACPI_FIELD_WORD_GRANULARITY:
- MOVE_UNALIGNED16_TO_16 (&(((UINT16 *) Buffer)[Offset]), &MergedDatum);
- break;
+ DEBUG_PRINT (TRACE_OPREGION,
+ ("AmlReadField: Returned value=%08lx \n", *Value));
- case ACPI_FIELD_DWORD_GRANULARITY:
- MOVE_UNALIGNED32_TO_32 (&(((UINT32 *) Buffer)[Offset]), &MergedDatum);
- break;
- }
+ return_ACPI_STATUS (Status);
}
/*******************************************************************************
*
- * FUNCTION: AcpiExExtractFromField
+ * FUNCTION: AcpiAmlReadField
*
* PARAMETERS: *ObjDesc - Field to be read
* *Value - Where to store value
+ * FieldBitWidth - Field Width in bits (8, 16, or 32)
*
* RETURN: Status
*
@@ -449,186 +241,218 @@ AcpiExSetBufferDatum (
******************************************************************************/
ACPI_STATUS
-AcpiExExtractFromField (
+AcpiAmlReadField (
ACPI_OPERAND_OBJECT *ObjDesc,
void *Buffer,
- UINT32 BufferLength)
+ UINT32 BufferLength,
+ UINT32 ByteLength,
+ UINT32 DatumLength,
+ UINT32 BitGranularity,
+ UINT32 ByteGranularity)
{
ACPI_STATUS Status;
- UINT32 FieldDatumByteOffset;
- UINT32 DatumOffset;
+ UINT32 ThisFieldByteOffset;
+ UINT32 ThisFieldDatumOffset;
UINT32 PreviousRawDatum;
UINT32 ThisRawDatum = 0;
+ UINT32 ValidFieldBits;
+ UINT32 Mask;
UINT32 MergedDatum = 0;
- UINT32 ByteFieldLength;
- UINT32 DatumCount;
-
- FUNCTION_TRACE ("ExExtractFromField");
-
-
- /*
- * The field must fit within the caller's buffer
- */
- ByteFieldLength = ROUND_BITS_UP_TO_BYTES (ObjDesc->CommonField.BitLength);
- if (ByteFieldLength > BufferLength)
- {
- DEBUG_PRINTP (ACPI_INFO, ("Field size %X (bytes) too large for buffer (%X)\n",
- ByteFieldLength, BufferLength));
-
- return_ACPI_STATUS (AE_BUFFER_OVERFLOW);
- }
-
- /* Convert field byte count to datum count, round up if necessary */
-
- DatumCount = ROUND_UP_TO (ByteFieldLength, ObjDesc->CommonField.AccessByteWidth);
-
- DEBUG_PRINT (ACPI_INFO,
- ("ByteLen=%x, DatumLen=%x, BitGran=%x, ByteGran=%x\n",
- ByteFieldLength, DatumCount, ObjDesc->CommonField.AccessBitWidth,
- ObjDesc->CommonField.AccessByteWidth));
+ FUNCTION_TRACE ("AmlReadField");
/*
* Clear the caller's buffer (the whole buffer length as given)
* This is very important, especially in the cases where a byte is read,
* but the buffer is really a UINT32 (4 bytes).
*/
+
MEMSET (Buffer, 0, BufferLength);
/* Read the first raw datum to prime the loop */
- FieldDatumByteOffset = 0;
- DatumOffset= 0;
+ ThisFieldByteOffset = 0;
+ ThisFieldDatumOffset= 0;
- Status = AcpiExReadFieldDatum (ObjDesc, FieldDatumByteOffset, &PreviousRawDatum);
+ Status = AcpiAmlReadFieldData (ObjDesc, ThisFieldByteOffset, BitGranularity,
+ &PreviousRawDatum);
if (ACPI_FAILURE (Status))
{
- return_ACPI_STATUS (Status);
+ goto Cleanup;
}
-
/* We might actually be done if the request fits in one datum */
- if ((DatumCount == 1) &&
- (ObjDesc->CommonField.AccessFlags & AFIELD_SINGLE_DATUM))
+ if ((DatumLength == 1) &&
+ ((ObjDesc->Field.BitOffset + ObjDesc->FieldUnit.Length) <=
+ (UINT16) BitGranularity))
{
- /* 1) Shift the valid data bits down to start at bit 0 */
-
- MergedDatum = (PreviousRawDatum >> ObjDesc->CommonField.StartFieldBitOffset);
+ MergedDatum = PreviousRawDatum;
- /* 2) Mask off any upper unused bits (bits not part of the field) */
+ MergedDatum = (MergedDatum >> ObjDesc->Field.BitOffset);
- if (ObjDesc->CommonField.EndBufferValidBits)
+ ValidFieldBits = ObjDesc->FieldUnit.Length % BitGranularity;
+ if (ValidFieldBits)
{
- MergedDatum &= MASK_BITS_ABOVE (ObjDesc->CommonField.EndBufferValidBits);
+ Mask = (((UINT32) 1 << ValidFieldBits) - (UINT32) 1);
+ MergedDatum &= Mask;
}
- /* Store the datum to the caller buffer */
- AcpiExSetBufferDatum (MergedDatum, Buffer, ObjDesc->CommonField.AccessByteWidth,
- DatumOffset);
+ /*
+ * Place the MergedDatum into the proper format and return buffer
+ * field
+ */
- return_ACPI_STATUS (AE_OK);
- }
+ switch (ByteGranularity)
+ {
+ case 1:
+ ((UINT8 *) Buffer) [ThisFieldDatumOffset] = (UINT8) MergedDatum;
+ break;
+
+ case 2:
+ MOVE_UNALIGNED16_TO_16 (&(((UINT16 *) Buffer)[ThisFieldDatumOffset]), &MergedDatum);
+ break;
+ case 4:
+ MOVE_UNALIGNED32_TO_32 (&(((UINT32 *) Buffer)[ThisFieldDatumOffset]), &MergedDatum);
+ break;
+ }
- /* We need to get more raw data to complete one or more field data */
+ ThisFieldByteOffset = 1;
+ ThisFieldDatumOffset = 1;
+ }
- while (DatumOffset < DatumCount)
+ else
{
- FieldDatumByteOffset += ObjDesc->CommonField.AccessByteWidth;
+ /* We need to get more raw data to complete one or more field data */
- /*
- * If the field is aligned on a byte boundary, we don't want
- * to perform a final read, since this would potentially read
- * past the end of the region.
- *
- * TBD: [Investigate] It may make more sense to just split the aligned
- * and non-aligned cases since the aligned case is so very simple,
- */
- if ((ObjDesc->CommonField.StartFieldBitOffset != 0) ||
- ((ObjDesc->CommonField.StartFieldBitOffset == 0) &&
- (DatumOffset < (DatumCount -1))))
+ while (ThisFieldDatumOffset < DatumLength)
{
/*
- * Get the next raw datum, it contains some or all bits
- * of the current field datum
+ * If the field is aligned on a byte boundary, we don't want
+ * to perform a final read, since this would potentially read
+ * past the end of the region.
+ *
+ * TBD: [Investigate] It may make more sense to just split the aligned
+ * and non-aligned cases since the aligned case is so very simple,
*/
- Status = AcpiExReadFieldDatum (ObjDesc, FieldDatumByteOffset, &ThisRawDatum);
- if (ACPI_FAILURE (Status))
+ if ((ObjDesc->Field.BitOffset != 0) ||
+ ((ObjDesc->Field.BitOffset == 0) &&
+ (ThisFieldDatumOffset < (DatumLength -1))))
{
- return_ACPI_STATUS (Status);
+ /*
+ * Get the next raw datum, it contains some or all bits
+ * of the current field datum
+ */
+
+ Status = AcpiAmlReadFieldData (ObjDesc,
+ ThisFieldByteOffset + ByteGranularity,
+ BitGranularity, &ThisRawDatum);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ /* Before merging the data, make sure the unused bits are clear */
+
+ switch (ByteGranularity)
+ {
+ case 1:
+ ThisRawDatum &= 0x000000FF;
+ PreviousRawDatum &= 0x000000FF;
+ break;
+
+ case 2:
+ ThisRawDatum &= 0x0000FFFF;
+ PreviousRawDatum &= 0x0000FFFF;
+ break;
+ }
}
- }
- /*
- * Create the (possibly) merged datum to be stored to the caller buffer
- */
- if (ObjDesc->CommonField.StartFieldBitOffset == 0)
- {
- /* Field is not skewed and we can just copy the datum */
- MergedDatum = PreviousRawDatum;
- }
+ /*
+ * Put together bits of the two raw data to make a complete
+ * field datum
+ */
+
+
+ if (ObjDesc->Field.BitOffset != 0)
+ {
+ MergedDatum =
+ (PreviousRawDatum >> ObjDesc->Field.BitOffset) |
+ (ThisRawDatum << (BitGranularity - ObjDesc->Field.BitOffset));
+ }
+
+ else
+ {
+ MergedDatum = PreviousRawDatum;
+ }
- else
- {
/*
- * Put together the appropriate bits of the two raw data to make a
- * single complete field datum
- *
- * 1) Normalize the first datum down to bit 0
+ * Prepare the merged datum for storing into the caller's
+ * buffer. It is possible to have a 32-bit buffer
+ * (ByteGranularity == 4), but a ObjDesc->Field.Length
+ * of 8 or 16, meaning that the upper bytes of merged data
+ * are undesired. This section fixes that.
*/
- MergedDatum = (PreviousRawDatum >> ObjDesc->CommonField.StartFieldBitOffset);
+ switch (ObjDesc->Field.Length)
+ {
+ case 8:
+ MergedDatum &= 0x000000FF;
+ break;
- /* 2) Insert the second datum "above" the first datum */
+ case 16:
+ MergedDatum &= 0x0000FFFF;
+ break;
+ }
- MergedDatum |= (ThisRawDatum << ObjDesc->CommonField.DatumValidBits);
-
- if ((DatumOffset >= (DatumCount -1)))
+ /*
+ * Now store the datum in the caller's buffer, according to
+ * the data type
+ */
+ switch (ByteGranularity)
{
- /*
- * This is the last iteration of the loop. We need to clear
- * any unused bits (bits that are not part of this field) that
- * came from the last raw datum before we store the final
- * merged datum into the caller buffer.
- */
- if (ObjDesc->CommonField.EndBufferValidBits)
- {
- MergedDatum &=
- MASK_BITS_ABOVE (ObjDesc->CommonField.EndBufferValidBits);
- }
+ case 1:
+ ((UINT8 *) Buffer) [ThisFieldDatumOffset] = (UINT8) MergedDatum;
+ break;
+
+ case 2:
+ MOVE_UNALIGNED16_TO_16 (&(((UINT16 *) Buffer) [ThisFieldDatumOffset]), &MergedDatum);
+ break;
+
+ case 4:
+ MOVE_UNALIGNED32_TO_32 (&(((UINT32 *) Buffer) [ThisFieldDatumOffset]), &MergedDatum);
+ break;
}
- }
+ /*
+ * Save the most recent datum since it contains bits of
+ * the *next* field datum
+ */
- /*
- * Store the merged field datum in the caller's buffer, according to
- * the granularity of the field (size of each datum).
- */
- AcpiExSetBufferDatum (MergedDatum, Buffer, ObjDesc->CommonField.AccessByteWidth,
- DatumOffset);
+ PreviousRawDatum = ThisRawDatum;
- /*
- * Save the raw datum that was just acquired since it may contain bits
- * of the *next* field datum. Update offsets
- */
- PreviousRawDatum = ThisRawDatum;
- DatumOffset++;
+ ThisFieldByteOffset += ByteGranularity;
+ ThisFieldDatumOffset++;
+
+ } /* while */
}
+Cleanup:
- return_ACPI_STATUS (AE_OK);
+ return_ACPI_STATUS (Status);
}
/*******************************************************************************
*
- * FUNCTION: AcpiExWriteFieldDatum
+ * FUNCTION: AcpiAmlWriteFieldData
*
* PARAMETERS: *ObjDesc - Field to be set
* Value - Value to store
+ * FieldBitWidth - Field Width in bits (8, 16, or 32)
*
* RETURN: Status
*
@@ -637,418 +461,400 @@ AcpiExExtractFromField (
******************************************************************************/
static ACPI_STATUS
-AcpiExWriteFieldDatum (
+AcpiAmlWriteFieldData (
ACPI_OPERAND_OBJECT *ObjDesc,
- UINT32 FieldDatumByteOffset,
+ UINT32 FieldByteOffset,
+ UINT32 FieldBitWidth,
UINT32 Value)
{
ACPI_STATUS Status = AE_OK;
ACPI_OPERAND_OBJECT *RgnDesc = NULL;
ACPI_PHYSICAL_ADDRESS Address;
+ UINT32 FieldByteWidth;
- FUNCTION_TRACE_U32 ("ExWriteFieldDatum", FieldDatumByteOffset);
+ FUNCTION_TRACE ("AmlWriteFieldData");
+ /* ObjDesc is validated by callers */
- /*
- * BufferFields - Read from a Buffer
- * Other Fields - Read from a Operation Region.
- */
- switch (ObjDesc->Common.Type)
+ if (ObjDesc)
{
- case ACPI_TYPE_BUFFER_FIELD:
-
- /*
- * For BufferFields, we only need to copy the data to the
- * target buffer. Length is the field width in bytes.
- */
- MEMCPY ((ObjDesc->BufferField.BufferObj)->Buffer.Pointer
- + ObjDesc->BufferField.BaseByteOffset + FieldDatumByteOffset,
- &Value, ObjDesc->CommonField.AccessByteWidth);
- Status = AE_OK;
- break;
-
-
- case INTERNAL_TYPE_REGION_FIELD:
- case INTERNAL_TYPE_BANK_FIELD:
-
- /*
- * For other fields, we need to go through an Operation Region
- * (Only types that will get here are RegionFields and BankFields)
- */
- Status = AcpiExSetupField (ObjDesc, FieldDatumByteOffset);
- if (ACPI_FAILURE (Status))
- {
- return_ACPI_STATUS (Status);
- }
-
- /*
- * The physical address of this field datum is:
- *
- * 1) The base of the region, plus
- * 2) The base offset of the field, plus
- * 3) The current offset into the field
- */
- RgnDesc = ObjDesc->CommonField.RegionObj;
- Address = RgnDesc->Region.Address +
- ObjDesc->CommonField.BaseByteOffset +
- FieldDatumByteOffset;
-
- DEBUG_PRINTP (TRACE_BFIELD,
- ("Store %X in Region %s(%X) at %p width %X\n",
- Value, AcpiUtGetRegionName (RgnDesc->Region.SpaceId),
- RgnDesc->Region.SpaceId, Address, ObjDesc->CommonField.AccessBitWidth));
-
- /* Invoke the appropriate AddressSpace/OpRegion handler */
+ RgnDesc = ObjDesc->Field.Container;
+ }
- Status = AcpiEvAddressSpaceDispatch (RgnDesc, ACPI_WRITE_ADR_SPACE,
- Address, ObjDesc->CommonField.AccessBitWidth, &Value);
+ FieldByteWidth = DIV_8 (FieldBitWidth);
+ Status = AcpiAmlSetupField (ObjDesc, RgnDesc, FieldBitWidth);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
- if (Status == AE_NOT_IMPLEMENTED)
- {
- DEBUG_PRINTP (ACPI_ERROR,
- ("**** Region type %s(%X) not implemented\n",
- AcpiUtGetRegionName (RgnDesc->Region.SpaceId),
- RgnDesc->Region.SpaceId));
- }
- else if (Status == AE_NOT_EXIST)
- {
- DEBUG_PRINTP (ACPI_ERROR,
- ("**** Region type %s(%X) does not have a handler\n",
- AcpiUtGetRegionName (RgnDesc->Region.SpaceId),
- RgnDesc->Region.SpaceId));
- }
+ /*
+ * Set offset to next multiple of field width,
+ * add region base address and offset within the field
+ */
+ Address = RgnDesc->Region.Address +
+ (ObjDesc->Field.Offset * FieldByteWidth) +
+ FieldByteOffset;
- break;
+ DEBUG_PRINT (TRACE_OPREGION,
+ ("AmlWriteField: Store %lx in Region %s(%X) at %p width %X\n",
+ Value, AcpiCmGetRegionName (RgnDesc->Region.SpaceId),
+ RgnDesc->Region.SpaceId, Address,
+ FieldBitWidth));
+ /* Invoke the appropriate AddressSpace/OpRegion handler */
- default:
+ Status = AcpiEvAddressSpaceDispatch (RgnDesc, ADDRESS_SPACE_WRITE,
+ Address, FieldBitWidth, &Value);
- DEBUG_PRINTP (ACPI_ERROR, ("%p, wrong source type - %s\n",
- ObjDesc, AcpiUtGetTypeName (ObjDesc->Common.Type)));
- Status = AE_AML_INTERNAL;
- break;
+ if (Status == AE_NOT_IMPLEMENTED)
+ {
+ DEBUG_PRINT (ACPI_ERROR,
+ ("AmlWriteField: **** Region type %s(%X) not implemented\n",
+ AcpiCmGetRegionName (RgnDesc->Region.SpaceId),
+ RgnDesc->Region.SpaceId));
}
+ else if (Status == AE_NOT_EXIST)
+ {
+ DEBUG_PRINT (ACPI_ERROR,
+ ("AmlWriteField: **** Region type %s(%X) does not have a handler\n",
+ AcpiCmGetRegionName (RgnDesc->Region.SpaceId),
+ RgnDesc->Region.SpaceId));
+ }
- DEBUG_PRINTP (TRACE_BFIELD, ("Value written=%08lX \n", Value));
return_ACPI_STATUS (Status);
}
-/*******************************************************************************
+/*****************************************************************************
*
- * FUNCTION: AcpiExWriteFieldDatumWithUpdateRule
+ * FUNCTION: AcpiAmlWriteFieldDataWithUpdateRule
*
* PARAMETERS: *ObjDesc - Field to be set
* Value - Value to store
+ * FieldBitWidth - Field Width in bits (8, 16, or 32)
*
* RETURN: Status
*
* DESCRIPTION: Apply the field update rule to a field write
*
- ******************************************************************************/
+ ****************************************************************************/
static ACPI_STATUS
-AcpiExWriteFieldDatumWithUpdateRule (
+AcpiAmlWriteFieldDataWithUpdateRule (
ACPI_OPERAND_OBJECT *ObjDesc,
UINT32 Mask,
UINT32 FieldValue,
- UINT32 FieldDatumByteOffset)
+ UINT32 ThisFieldByteOffset,
+ UINT32 BitGranularity)
{
ACPI_STATUS Status = AE_OK;
UINT32 MergedValue;
UINT32 CurrentValue;
- FUNCTION_TRACE ("ExWriteFieldDatumWithUpdateRule");
-
-
/* Start with the new bits */
MergedValue = FieldValue;
- /* If the mask is all ones, we don't need to worry about the update rule */
- if (Mask != ACPI_UINT32_MAX)
+ /* Decode the update rule */
+
+ switch (ObjDesc->Field.UpdateRule)
{
- /* Decode the update rule */
- switch (ObjDesc->CommonField.UpdateRule)
- {
+ case UPDATE_PRESERVE:
- case UPDATE_PRESERVE:
+ /* Check if update rule needs to be applied (not if mask is all ones) */
- /*
- * Check if update rule needs to be applied (not if mask is all
- * ones) The left shift drops the bits we want to ignore.
+ /* The left shift drops the bits we want to ignore. */
+ if ((~Mask << (sizeof(Mask)*8 - BitGranularity)) != 0)
+ {
+ /*
+ * Read the current contents of the byte/word/dword containing
+ * the field, and merge with the new field value.
*/
- if ((~Mask << (sizeof (Mask) * 8 -
- ObjDesc->CommonField.AccessBitWidth)) != 0)
- {
- /*
- * Read the current contents of the byte/word/dword containing
- * the field, and merge with the new field value.
- */
- Status = AcpiExReadFieldDatum (ObjDesc, FieldDatumByteOffset,
- &CurrentValue);
- MergedValue |= (CurrentValue & ~Mask);
- }
- break;
+ Status = AcpiAmlReadFieldData (ObjDesc, ThisFieldByteOffset,
+ BitGranularity, &CurrentValue);
+ MergedValue |= (CurrentValue & ~Mask);
+ }
+ break;
- case UPDATE_WRITE_AS_ONES:
+ case UPDATE_WRITE_AS_ONES:
- /* Set positions outside the field to all ones */
+ /* Set positions outside the field to all ones */
- MergedValue |= ~Mask;
- break;
+ MergedValue |= ~Mask;
+ break;
- case UPDATE_WRITE_AS_ZEROS:
+ case UPDATE_WRITE_AS_ZEROS:
- /* Set positions outside the field to all zeros */
+ /* Set positions outside the field to all zeros */
- MergedValue &= Mask;
- break;
+ MergedValue &= Mask;
+ break;
- default:
- DEBUG_PRINT (ACPI_ERROR,
- ("WriteWithUpdateRule: Unknown UpdateRule setting: %x\n",
- ObjDesc->CommonField.UpdateRule));
- return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
- break;
- }
+ default:
+ DEBUG_PRINT (ACPI_ERROR,
+ ("WriteFieldDataWithUpdateRule: Unknown UpdateRule setting: %x\n",
+ ObjDesc->Field.UpdateRule));
+ Status = AE_AML_OPERAND_VALUE;
}
/* Write the merged value */
- Status = AcpiExWriteFieldDatum (ObjDesc, FieldDatumByteOffset,
- MergedValue);
-
- DEBUG_PRINTP (TRACE_BFIELD, ("Mask %X DatumOffset %X Value %X, MergedValue %X\n",
- Mask, FieldDatumByteOffset, FieldValue, MergedValue));
+ if (ACPI_SUCCESS (Status))
+ {
+ Status = AcpiAmlWriteFieldData (ObjDesc, ThisFieldByteOffset,
+ BitGranularity, MergedValue);
+ }
- return_ACPI_STATUS (Status);
+ return (Status);
}
-/*******************************************************************************
+/*****************************************************************************
*
- * FUNCTION: AcpiExInsertIntoField
+ * FUNCTION: AcpiAmlWriteField
*
* PARAMETERS: *ObjDesc - Field to be set
- * Buffer - Value to store
+ * Value - Value to store
+ * FieldBitWidth - Field Width in bits (8, 16, or 32)
*
* RETURN: Status
*
* DESCRIPTION: Store the value into the given field
*
- ******************************************************************************/
+ ****************************************************************************/
ACPI_STATUS
-AcpiExInsertIntoField (
+AcpiAmlWriteField (
ACPI_OPERAND_OBJECT *ObjDesc,
void *Buffer,
- UINT32 BufferLength)
+ UINT32 BufferLength,
+ UINT32 ByteLength,
+ UINT32 DatumLength,
+ UINT32 BitGranularity,
+ UINT32 ByteGranularity)
{
ACPI_STATUS Status;
- UINT32 FieldDatumByteOffset;
- UINT32 DatumOffset;
+ UINT32 ThisFieldByteOffset;
+ UINT32 ThisFieldDatumOffset;
UINT32 Mask;
UINT32 MergedDatum;
UINT32 PreviousRawDatum;
UINT32 ThisRawDatum;
- UINT32 ByteFieldLength;
- UINT32 DatumCount;
+ UINT32 FieldValue;
+ UINT32 ValidFieldBits;
- FUNCTION_TRACE ("ExInsertIntoField");
+ FUNCTION_TRACE ("AmlWriteField");
/*
- * Incoming buffer must be at least as long as the field, we do not
- * allow "partial" field writes. We do not care if the buffer is
- * larger than the field, this typically happens when an integer is
- * written to a field that is actually smaller than an integer.
+ * Break the request into up to three parts:
+ * non-aligned part at start, aligned part in middle, non-aligned part
+ * at end --- Just like an I/O request ---
*/
- ByteFieldLength = ROUND_BITS_UP_TO_BYTES (ObjDesc->CommonField.BitLength);
- if (BufferLength < ByteFieldLength)
- {
- DEBUG_PRINTP (ACPI_INFO, ("Buffer length %X too small for field %X\n",
- BufferLength, ByteFieldLength));
- /* TBD: Need a better error code */
+ ThisFieldByteOffset = 0;
+ ThisFieldDatumOffset= 0;
- return_ACPI_STATUS (AE_BUFFER_OVERFLOW);
- }
-
- /* Convert byte count to datum count, round up if necessary */
-
- DatumCount = ROUND_UP_TO (ByteFieldLength, ObjDesc->CommonField.AccessByteWidth);
+ /* Get a datum */
- DEBUG_PRINT (ACPI_INFO,
- ("ByteLen=%x, DatumLen=%x, BitGran=%x, ByteGran=%x\n",
- ByteFieldLength, DatumCount, ObjDesc->CommonField.AccessBitWidth,
- ObjDesc->CommonField.AccessByteWidth));
+ switch (ByteGranularity)
+ {
+ case 1:
+ PreviousRawDatum = ((UINT8 *) Buffer) [ThisFieldDatumOffset];
+ break;
+ case 2:
+ MOVE_UNALIGNED16_TO_32 (&PreviousRawDatum, &(((UINT16 *) Buffer) [ThisFieldDatumOffset]));
+ break;
- /*
- * Break the request into up to three parts (similar to an I/O request):
- * 1) non-aligned part at start
- * 2) aligned part in middle
- * 3) non-aligned part at the end
- */
- FieldDatumByteOffset = 0;
- DatumOffset= 0;
+ case 4:
+ MOVE_UNALIGNED32_TO_32 (&PreviousRawDatum, &(((UINT32 *) Buffer) [ThisFieldDatumOffset]));
+ break;
- /* Get a single datum from the caller's buffer */
+ default:
+ DEBUG_PRINT (ACPI_ERROR, ("AmlWriteField: Invalid granularity: %x\n",
+ ByteGranularity));
+ Status = AE_AML_OPERAND_VALUE;
+ goto Cleanup;
+ }
- AcpiExGetBufferDatum (&PreviousRawDatum, Buffer,
- ObjDesc->CommonField.AccessByteWidth, DatumOffset);
/*
- * Part1:
* Write a partial field datum if field does not begin on a datum boundary
- * Note: The code in this section also handles the aligned case
*
* Construct Mask with 1 bits where the field is, 0 bits elsewhere
- * (Only the bottom 5 bits of BitLength are valid for a shift operation)
*
- * Mask off bits that are "below" the field (if any)
+ * 1) Bits above the field
*/
- Mask = MASK_BITS_BELOW (ObjDesc->CommonField.StartFieldBitOffset);
- /* If the field fits in one datum, may need to mask upper bits */
+ Mask = (((UINT32)(-1)) << (UINT32)ObjDesc->Field.BitOffset);
+
+ /* 2) Only the bottom 5 bits are valid for a shift operation. */
- if ((ObjDesc->CommonField.AccessFlags & AFIELD_SINGLE_DATUM) &&
- ObjDesc->CommonField.EndFieldValidBits)
+ if ((ObjDesc->Field.BitOffset + ObjDesc->FieldUnit.Length) < 32)
{
- /* There are bits above the field, mask them off also */
+ /* Bits above the field */
- Mask &= MASK_BITS_ABOVE (ObjDesc->CommonField.EndFieldValidBits);
+ Mask &= (~(((UINT32)(-1)) << ((UINT32)ObjDesc->Field.BitOffset +
+ (UINT32)ObjDesc->FieldUnit.Length)));
}
- /* Shift and mask the value into the field position */
-
- MergedDatum = (PreviousRawDatum << ObjDesc->CommonField.StartFieldBitOffset);
- MergedDatum &= Mask;
+ /* 3) Shift and mask the value into the field position */
- /* Apply the update rule (if necessary) and write the datum to the field */
+ FieldValue = (PreviousRawDatum << ObjDesc->Field.BitOffset) & Mask;
- Status = AcpiExWriteFieldDatumWithUpdateRule (ObjDesc, Mask, MergedDatum,
- FieldDatumByteOffset);
+ Status = AcpiAmlWriteFieldDataWithUpdateRule (ObjDesc, Mask, FieldValue,
+ ThisFieldByteOffset,
+ BitGranularity);
if (ACPI_FAILURE (Status))
{
- return_ACPI_STATUS (Status);
+ goto Cleanup;
}
- /* If the entire field fits within one datum, we are done. */
- if ((DatumCount == 1) &&
- (ObjDesc->CommonField.AccessFlags & AFIELD_SINGLE_DATUM))
+ /* If the field fits within one datum, we are done. */
+
+ if ((DatumLength == 1) &&
+ ((ObjDesc->Field.BitOffset + ObjDesc->FieldUnit.Length) <=
+ (UINT16) BitGranularity))
{
- return_ACPI_STATUS (AE_OK);
+ goto Cleanup;
}
/*
- * Part2:
- * Write the aligned data.
- *
* We don't need to worry about the update rule for these data, because
- * all of the bits in each datum are part of the field.
+ * all of the bits are part of the field.
*
- * The last datum must be special cased because it might contain bits
- * that are not part of the field -- therefore the "update rule" must be
- * applied in Part3 below.
+ * Can't write the last datum, however, because it might contain bits that
+ * are not part of the field -- the update rule must be applied.
*/
- while (DatumOffset < DatumCount)
+
+ while (ThisFieldDatumOffset < (DatumLength - 1))
{
- DatumOffset++;
- FieldDatumByteOffset += ObjDesc->CommonField.AccessByteWidth;
+ ThisFieldDatumOffset++;
- /*
- * Get the next raw buffer datum. It may contain bits of the previous
- * field datum
- */
- AcpiExGetBufferDatum (&ThisRawDatum, Buffer,
- ObjDesc->CommonField.AccessByteWidth, DatumOffset);
+ /* Get the next raw datum, it contains bits of the current field datum... */
+
+ switch (ByteGranularity)
+ {
+ case 1:
+ ThisRawDatum = ((UINT8 *) Buffer) [ThisFieldDatumOffset];
+ break;
+
+ case 2:
+ MOVE_UNALIGNED16_TO_32 (&ThisRawDatum, &(((UINT16 *) Buffer) [ThisFieldDatumOffset]));
+ break;
+
+ case 4:
+ MOVE_UNALIGNED32_TO_32 (&ThisRawDatum, &(((UINT32 *) Buffer) [ThisFieldDatumOffset]));
+ break;
- /* Create the field datum based on the field alignment */
+ default:
+ DEBUG_PRINT (ACPI_ERROR, ("AmlWriteField: Invalid Byte Granularity: %x\n",
+ ByteGranularity));
+ Status = AE_AML_OPERAND_VALUE;
+ goto Cleanup;
+ }
+
+ /*
+ * Put together bits of the two raw data to make a complete field
+ * datum
+ */
- if (ObjDesc->CommonField.StartFieldBitOffset != 0)
+ if (ObjDesc->Field.BitOffset != 0)
{
- /*
- * Put together appropriate bits of the two raw buffer data to make
- * a single complete field datum
- */
- MergedDatum =
- (PreviousRawDatum >> ObjDesc->CommonField.DatumValidBits) |
- (ThisRawDatum << ObjDesc->CommonField.StartFieldBitOffset);
+ MergedDatum =
+ (PreviousRawDatum >> (BitGranularity - ObjDesc->Field.BitOffset)) |
+ (ThisRawDatum << ObjDesc->Field.BitOffset);
}
else
{
- /* Field began aligned on datum boundary */
-
MergedDatum = ThisRawDatum;
}
+ /* Now write the completed datum */
+
+
+ Status = AcpiAmlWriteFieldData (ObjDesc,
+ ThisFieldByteOffset + ByteGranularity,
+ BitGranularity, MergedDatum);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
/*
- * Special handling for the last datum if the field does NOT end on
- * a datum boundary. Update Rule must be applied to the bits outside
- * the field.
+ * Save the most recent datum since it contains bits of
+ * the *next* field datum
*/
- if ((DatumOffset == DatumCount) &&
- ObjDesc->CommonField.EndFieldValidBits)
- {
- /*
- * Part3:
- * This is the last datum and the field does not end on a datum boundary.
- * Build the partial datum and write with the update rule.
- */
- /* Mask off the unused bits above (after) the end-of-field */
+ PreviousRawDatum = ThisRawDatum;
- Mask = MASK_BITS_ABOVE (ObjDesc->CommonField.EndFieldValidBits);
- MergedDatum &= Mask;
+ ThisFieldByteOffset += ByteGranularity;
- /* Write the last datum with the update rule */
+ } /* while */
- Status = AcpiExWriteFieldDatumWithUpdateRule (ObjDesc, Mask,
- MergedDatum, FieldDatumByteOffset);
- if (ACPI_FAILURE (Status))
- {
- return_ACPI_STATUS (Status);
- }
- }
- else
+ /* Write a partial field datum if field does not end on a datum boundary */
+
+ if ((ObjDesc->FieldUnit.Length + ObjDesc->FieldUnit.BitOffset) %
+ BitGranularity)
+ {
+ switch (ByteGranularity)
{
- /* Normal case -- write the completed datum */
+ case 1:
+ ThisRawDatum = ((UINT8 *) Buffer) [ThisFieldDatumOffset];
+ break;
- Status = AcpiExWriteFieldDatum (ObjDesc,
- FieldDatumByteOffset, MergedDatum);
- if (ACPI_FAILURE (Status))
- {
- return_ACPI_STATUS (Status);
- }
+ case 2:
+ MOVE_UNALIGNED16_TO_32 (&ThisRawDatum, &(((UINT16 *) Buffer) [ThisFieldDatumOffset]));
+ break;
+
+ case 4:
+ MOVE_UNALIGNED32_TO_32 (&ThisRawDatum, &(((UINT32 *) Buffer) [ThisFieldDatumOffset]));
+ break;
}
- /*
- * Save the most recent datum since it may contain bits of the *next*
- * field datum. Update current byte offset.
- */
- PreviousRawDatum = ThisRawDatum;
+ /* Construct Mask with 1 bits where the field is, 0 bits elsewhere */
+
+ ValidFieldBits = ((ObjDesc->FieldUnit.Length % BitGranularity) +
+ ObjDesc->Field.BitOffset);
+
+ Mask = (((UINT32) 1 << ValidFieldBits) - (UINT32) 1);
+
+ /* Shift and mask the value into the field position */
+
+ FieldValue = (PreviousRawDatum >>
+ (BitGranularity - ObjDesc->Field.BitOffset)) & Mask;
+
+ Status = AcpiAmlWriteFieldDataWithUpdateRule (ObjDesc, Mask, FieldValue,
+ ThisFieldByteOffset + ByteGranularity,
+ BitGranularity);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
}
+Cleanup:
+
return_ACPI_STATUS (Status);
}
diff --git a/sys/contrib/dev/acpica/psparse.c b/sys/contrib/dev/acpica/psparse.c
index fc68ef4..1d44bd8 100644
--- a/sys/contrib/dev/acpica/psparse.c
+++ b/sys/contrib/dev/acpica/psparse.c
@@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: psparse - Parser top level AML parse routines
- * $Revision: 85 $
+ * $Revision: 74 $
*
*****************************************************************************/
@@ -130,9 +130,8 @@
#include "amlcode.h"
#include "acnamesp.h"
#include "acdebug.h"
-#include "acinterp.h"
-#define _COMPONENT ACPI_PARSER
+#define _COMPONENT PARSER
MODULE_NAME ("psparse")
@@ -204,9 +203,9 @@ AcpiPsPeekOpcode (
*
* if (Opcode == AML_EXTOP
* || (Opcode == AML_LNOT
- * && (GET8 (Aml) == AML_LEQUAL
- * || GET8 (Aml) == AML_LGREATER
- * || GET8 (Aml) == AML_LLESS)))
+ * && (GET8 (AcpiAml) == AML_LEQUAL
+ * || GET8 (AcpiAml) == AML_LGREATER
+ * || GET8 (AcpiAml) == AML_LLESS)))
*
* extended Opcode, !=, <=, or >=
*/
@@ -229,8 +228,8 @@ AcpiPsPeekOpcode (
*
* FUNCTION: AcpiPsCreateState
*
- * PARAMETERS: Aml - Aml code pointer
- * AmlSize - Length of AML code
+ * PARAMETERS: AcpiAml - AcpiAml code pointer
+ * AcpiAmlSize - Length of AML code
*
* RETURN: A new parser state object
*
@@ -249,10 +248,10 @@ AcpiPsCreateState (
FUNCTION_TRACE ("PsCreateState");
- ParserState = AcpiUtCallocate (sizeof (ACPI_PARSE_STATE));
+ ParserState = AcpiCmCallocate (sizeof (ACPI_PARSE_STATE));
if (!ParserState)
{
- return_PTR (NULL);
+ return_VALUE (NULL);
}
ParserState->Aml = Aml;
@@ -363,7 +362,7 @@ AcpiPsCompleteThisOp (
(OpcodeClass != OPTYPE_LOCAL_VARIABLE) &&
(OpcodeClass != OPTYPE_METHOD_ARGUMENT) &&
(OpcodeClass != OPTYPE_DATA_TERM) &&
- (Op->Opcode != AML_INT_NAMEPATH_OP))
+ (Op->Opcode != AML_NAMEPATH_OP))
{
/* Make sure that we only delete this subtree */
@@ -388,15 +387,15 @@ AcpiPsCompleteThisOp (
* op must be replace by a placeholder return op
*/
- if ((Op->Parent->Opcode == AML_REGION_OP) ||
- (Op->Parent->Opcode == AML_CREATE_FIELD_OP) ||
- (Op->Parent->Opcode == AML_CREATE_BIT_FIELD_OP) ||
- (Op->Parent->Opcode == AML_CREATE_BYTE_FIELD_OP) ||
- (Op->Parent->Opcode == AML_CREATE_WORD_FIELD_OP) ||
- (Op->Parent->Opcode == AML_CREATE_DWORD_FIELD_OP) ||
- (Op->Parent->Opcode == AML_CREATE_QWORD_FIELD_OP))
+ if ((Op->Parent->Opcode == AML_REGION_OP) ||
+ (Op->Parent->Opcode == AML_CREATE_FIELD_OP) ||
+ (Op->Parent->Opcode == AML_BIT_FIELD_OP) ||
+ (Op->Parent->Opcode == AML_BYTE_FIELD_OP) ||
+ (Op->Parent->Opcode == AML_WORD_FIELD_OP) ||
+ (Op->Parent->Opcode == AML_DWORD_FIELD_OP) ||
+ (Op->Parent->Opcode == AML_QWORD_FIELD_OP))
{
- ReplacementOp = AcpiPsAllocOp (AML_INT_RETURN_VALUE_OP);
+ ReplacementOp = AcpiPsAllocOp (AML_RETURN_VALUE_OP);
if (!ReplacementOp)
{
return_VALUE (FALSE);
@@ -406,7 +405,7 @@ AcpiPsCompleteThisOp (
break;
default:
- ReplacementOp = AcpiPsAllocOp (AML_INT_RETURN_VALUE_OP);
+ ReplacementOp = AcpiPsAllocOp (AML_RETURN_VALUE_OP);
if (!ReplacementOp)
{
return_VALUE (FALSE);
@@ -622,7 +621,7 @@ AcpiPsParseLoop (
ACPI_PARSE2_OBJECT *DeferredOp;
UINT32 ArgCount; /* push for fixed or var args */
UINT32 ArgTypes = 0;
- UINT32 AmlOffset;
+ ACPI_PTRDIFF AmlOffset;
UINT16 Opcode;
ACPI_PARSE_OBJECT PreOp;
ACPI_PARSE_STATE *ParserState;
@@ -664,13 +663,14 @@ AcpiPsParseLoop (
{
if (Status == AE_AML_NO_RETURN_VALUE)
{
- DEBUG_PRINTP (ACPI_ERROR,
- ("Invoked method did not return a value, %s\n",
- AcpiUtFormatException (Status)));
+ DEBUG_PRINT (ACPI_ERROR,
+ ("PsParseLoop: Invoked method did not return a value, %s\n",
+ AcpiCmFormatException (Status)));
}
- DEBUG_PRINTP (ACPI_ERROR, ("GetPredicate Failed, %s\n",
- AcpiUtFormatException (Status)));
+ DEBUG_PRINT (ACPI_ERROR,
+ ("PsParseLoop: GetPredicate Failed, %s\n",
+ AcpiCmFormatException (Status)));
return_ACPI_STATUS (Status);
}
@@ -678,7 +678,7 @@ AcpiPsParseLoop (
}
AcpiPsPopScope (ParserState, &Op, &ArgTypes, &ArgCount);
- DEBUG_PRINTP (TRACE_PARSE, ("Popped scope, Op=%p\n", Op));
+ DEBUG_PRINT (TRACE_PARSE, ("ParseLoop: Popped scope, Op=%p\n", Op));
}
else if (WalkState->PrevOp)
@@ -729,7 +729,7 @@ AcpiPsParseLoop (
* string. Convert the bare name string to a namepath.
*/
- Opcode = AML_INT_NAMEPATH_OP;
+ Opcode = AML_NAMEPATH_OP;
ArgTypes = ARGP_NAMESTRING;
break;
@@ -737,8 +737,8 @@ AcpiPsParseLoop (
/* The opcode is unrecognized. Just skip unknown opcodes */
- DEBUG_PRINTP (ACPI_ERROR,
- ("Found unknown opcode %lX at AML offset %X, ignoring\n",
+ DEBUG_PRINT (ACPI_ERROR,
+ ("ParseLoop: Found unknown opcode %lX at AML offset %X, ignoring\n",
Opcode, AmlOffset));
DUMP_BUFFER (ParserState->Aml, 128);
@@ -835,12 +835,11 @@ AcpiPsParseLoop (
}
- if ((Op->Opcode == AML_CREATE_FIELD_OP) ||
- (Op->Opcode == AML_CREATE_BIT_FIELD_OP) ||
- (Op->Opcode == AML_CREATE_BYTE_FIELD_OP) ||
- (Op->Opcode == AML_CREATE_WORD_FIELD_OP) ||
- (Op->Opcode == AML_CREATE_DWORD_FIELD_OP) ||
- (Op->Opcode == AML_CREATE_QWORD_FIELD_OP))
+ if ((Op->Opcode == AML_CREATE_FIELD_OP) ||
+ (Op->Opcode == AML_BIT_FIELD_OP) ||
+ (Op->Opcode == AML_BYTE_FIELD_OP) ||
+ (Op->Opcode == AML_WORD_FIELD_OP) ||
+ (Op->Opcode == AML_DWORD_FIELD_OP))
{
/*
* Backup to beginning of CreateXXXfield declaration
@@ -879,8 +878,8 @@ AcpiPsParseLoop (
if (OpInfo)
{
- DEBUG_PRINTP (TRACE_PARSE,
- ("Op=%p Opcode=%4.4lX Aml %p Oft=%5.5lX\n",
+ DEBUG_PRINT (TRACE_PARSE,
+ ("ParseLoop: Op=%p Opcode=%4.4lX Aml %p Oft=%5.5lX\n",
Op, Op->Opcode, ParserState->Aml, Op->AmlOffset));
}
}
@@ -908,7 +907,7 @@ AcpiPsParseLoop (
GET_CURRENT_ARG_TYPE (ArgTypes), Op);
break;
- case AML_INT_NAMEPATH_OP: /* AML_NAMESTRING_ARG */
+ case AML_NAMEPATH_OP: /* AML_NAMESTRING_ARG */
AcpiPsGetNextNamepath (ParserState, Op, &ArgCount, 1);
ArgTypes = 0;
@@ -949,8 +948,8 @@ AcpiPsParseLoop (
*/
DeferredOp->Data = ParserState->Aml;
- DeferredOp->Length = (UINT32) (ParserState->PkgEnd -
- ParserState->Aml);
+ DeferredOp->Length = ParserState->PkgEnd -
+ ParserState->Aml;
/*
* Skip body of method. For OpRegions, we must continue
@@ -995,18 +994,18 @@ AcpiPsParseLoop (
* know the length.
*/
- DeferredOp->Length = (UINT32) (ParserState->Aml -
- DeferredOp->Data);
+ DeferredOp->Length = ParserState->Aml -
+ DeferredOp->Data;
}
}
}
- if ((Op->Opcode == AML_CREATE_FIELD_OP) ||
- (Op->Opcode == AML_CREATE_BIT_FIELD_OP) ||
- (Op->Opcode == AML_CREATE_BYTE_FIELD_OP) ||
- (Op->Opcode == AML_CREATE_WORD_FIELD_OP) ||
- (Op->Opcode == AML_CREATE_DWORD_FIELD_OP) ||
- (Op->Opcode == AML_CREATE_QWORD_FIELD_OP))
+ if ((Op->Opcode == AML_CREATE_FIELD_OP) ||
+ (Op->Opcode == AML_BIT_FIELD_OP) ||
+ (Op->Opcode == AML_BYTE_FIELD_OP) ||
+ (Op->Opcode == AML_WORD_FIELD_OP) ||
+ (Op->Opcode == AML_DWORD_FIELD_OP) ||
+ (Op->Opcode == AML_QWORD_FIELD_OP))
{
/*
* Backup to beginning of CreateXXXfield declaration (1 for
@@ -1015,8 +1014,7 @@ AcpiPsParseLoop (
* BodyLength is unknown until we parse the body
*/
DeferredOp = (ACPI_PARSE2_OBJECT *) Op;
- DeferredOp->Length = (UINT32) (ParserState->Aml -
- DeferredOp->Data);
+ DeferredOp->Length = ParserState->Aml - DeferredOp->Data;
}
/* This op complete, notify the dispatcher */
@@ -1120,7 +1118,7 @@ CloseThisOp:
if (AcpiPsHasCompletedScope (ParserState))
{
AcpiPsPopScope (ParserState, &Op, &ArgTypes, &ArgCount);
- DEBUG_PRINTP (TRACE_PARSE, ("Popped scope, Op=%p\n", Op));
+ DEBUG_PRINT (TRACE_PARSE, ("ParseLoop: Popped scope, Op=%p\n", Op));
}
else
@@ -1151,7 +1149,7 @@ CloseThisOp:
* sequential closing braces). We want to terminate each one cleanly.
*/
- DEBUG_PRINTP (TRACE_PARSE, ("Package complete at Op %p\n", Op));
+ DEBUG_PRINT (TRACE_PARSE, ("PsParseLoop: Package complete at Op %p\n", Op));
do
{
if (Op)
@@ -1237,12 +1235,14 @@ AcpiPsParseAml (
ACPI_NAMESPACE_NODE *Node = NULL;
ACPI_WALK_LIST *PrevWalkList = AcpiGbl_CurrentWalkList;
ACPI_OPERAND_OBJECT *ReturnDesc;
+ ACPI_OPERAND_OBJECT *EffectiveReturnDesc = NULL;
ACPI_OPERAND_OBJECT *MthDesc = NULL;
FUNCTION_TRACE ("PsParseAml");
- DEBUG_PRINTP (TRACE_PARSE, ("Entered with Scope=%p Aml=%p size=%lX\n",
+ DEBUG_PRINT (TRACE_PARSE,
+ ("PsParseAml: Entered with Scope=%p Aml=%p size=%lX\n",
StartScope, Aml, AmlSize));
@@ -1264,11 +1264,8 @@ AcpiPsParseAml (
/* Create and initialize a new walk list */
WalkList.WalkState = NULL;
- WalkList.AcquiredMutexList.Prev = NULL;
- WalkList.AcquiredMutexList.Next = NULL;
- WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, ParserState->StartOp,
- MthDesc, &WalkList);
+ WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, ParserState->StartOp, MthDesc, &WalkList);
if (!WalkState)
{
Status = AE_NO_MEMORY;
@@ -1334,7 +1331,8 @@ AcpiPsParseAml (
* handles nested control method invocations without recursion.
*/
- DEBUG_PRINTP (TRACE_PARSE, ("State=%p\n", WalkState));
+ DEBUG_PRINT (TRACE_PARSE, ("PsParseAml: State=%p\n",
+ WalkState));
while (WalkState)
{
@@ -1343,8 +1341,9 @@ AcpiPsParseAml (
Status = AcpiPsParseLoop (WalkState);
}
- DEBUG_PRINTP (TRACE_PARSE,
- ("Completed one call to walk loop, State=%p\n", WalkState));
+ DEBUG_PRINT (TRACE_PARSE,
+ ("PsParseAml: Completed one call to walk loop, State=%p\n",
+ WalkState));
if (Status == AE_CTRL_TRANSFER)
{
@@ -1378,7 +1377,16 @@ AcpiPsParseAml (
ReturnDesc = WalkState->ReturnDesc;
- DEBUG_PRINTP (TRACE_PARSE, ("ReturnValue=%p, State=%p\n",
+ /* Save the last effective return value */
+
+ if (CallerReturnDesc && ReturnDesc)
+ {
+ EffectiveReturnDesc = ReturnDesc;
+ AcpiCmAddReference (EffectiveReturnDesc);
+ }
+
+ DEBUG_PRINT (TRACE_PARSE,
+ ("PsParseAml: ReturnValue=%p, State=%p\n",
WalkState->ReturnDesc, WalkState));
/* Reset the current scope to the beginning of scope stack */
@@ -1398,7 +1406,7 @@ AcpiPsParseAml (
/* Delete this walk state and all linked control states */
AcpiPsCleanupScope (WalkState->ParserState);
- AcpiUtFree (WalkState->ParserState);
+ AcpiCmFree (WalkState->ParserState);
AcpiDsDeleteWalkState (WalkState);
/* Check if we have restarted a preempted walk */
@@ -1425,6 +1433,16 @@ AcpiPsParseAml (
else if (CallerReturnDesc)
{
+ /*
+ * Some AML code expects return value w/o ReturnOp.
+ * Return the saved effective return value instead.
+ */
+
+ if (ReturnDesc == NULL && EffectiveReturnDesc != NULL)
+ {
+ AcpiCmRemoveReference (ReturnDesc);
+ ReturnDesc = EffectiveReturnDesc;
+ }
*CallerReturnDesc = ReturnDesc; /* NULL if no return value */
}
@@ -1432,14 +1450,13 @@ AcpiPsParseAml (
{
/* Caller doesn't want it, must delete it */
- AcpiUtRemoveReference (ReturnDesc);
+ AcpiCmRemoveReference (ReturnDesc);
}
}
/* Normal exit */
- AcpiExReleaseAllMutexes ((ACPI_OPERAND_OBJECT *) &WalkList.AcquiredMutexList);
AcpiGbl_CurrentWalkList = PrevWalkList;
return_ACPI_STATUS (Status);
@@ -1450,9 +1467,8 @@ Cleanup:
AcpiDsDeleteWalkState (WalkState);
AcpiPsCleanupScope (ParserState);
- AcpiUtFree (ParserState);
+ AcpiCmFree (ParserState);
- AcpiExReleaseAllMutexes ((ACPI_OPERAND_OBJECT *)&WalkList.AcquiredMutexList);
AcpiGbl_CurrentWalkList = PrevWalkList;
return_ACPI_STATUS (Status);
diff --git a/sys/contrib/dev/fla/COPYRIGHT b/sys/contrib/dev/fla/COPYRIGHT
new file mode 100644
index 0000000..9618a67
--- /dev/null
+++ b/sys/contrib/dev/fla/COPYRIGHT
@@ -0,0 +1,102 @@
+
+SOFTWARE LICENSE AGREEMENT
+
+IMPORTANT! READ CAREFULLY:
+THIS SOFTWARE LICENSE AGREEMENT (the ``Agreement'') is a legal
+agreement between you (either an individual or a single entity) and
+M-Systems Flash Disk Pioneers Ltd. ("M-Systems").
+This Agreement relates to the M-Systems' software accompanying this
+Agreement, which includes computer software and may include associated
+media, printed materials, and ``online'' or electronic documentation
+(the ``Licensed Software'').
+By downloading, installing, copying, or otherwise using the Licensed
+Software, you agree to be bound by the terms of this Agreement.
+If you do not agree to the terms of this Agreement, do not install,
+copy or use the Licensed Software.
+
+The Licensed Software is protected by copyright laws and international
+copyright treaties, as well as other intellectual property laws and
+treaties. The Licensed Software is licensed, not sold.
+The Licensed Software is being provided solely for use with M-Systems'
+DiskOnChip® product lines.
+1. License Grant.
+(a) Grant of License. Subject to the terms and conditions of this
+ Agreement, M-Systems hereby grants you a nonexclusive,
+ royalty-free, worldwide license (including the right to
+ sublicense) to use, copy and distribute the Licensed Software
+ with M-Systems DiskOnChip® products.
+(b) Restrictions on Use. The Licensed Software is licensed solely
+ for use with and to support M-Systems' DiskOnChip® products.
+ Use of this Licensed Software with, or to support, any other
+ flash disk, flash card, resident flash array or solid state
+ disk of any kind is expressly prohibited, and constitutes an
+ illegal infringement of M-Systems' patent, copyright and other
+ rights in and to the Licensed Software.
+2. Limitations on Reverse Engineering, Decompilation, and
+ Disassembly. You may not reverse engineer, decompile, or
+ disassemble the Licensed Software, except and only to the
+ extent that such activity is expressly permitted by applicable
+ law notwithstanding this limitation.
+3. Termination. Without prejudice to any other rights, M-Systems
+ may terminate this Agreement if you fail to comply with the
+ terms and conditions of this Agreement. In such event, you must
+ destroy all copies of the Licensed Software and all of its
+ component parts.
+4. Intellectual Property Rights. Title to the Licensed Software,
+ and all rights with respect to the Software not specifically
+ granted under this Agreement, including without limitation
+ all rights of modification, disassembly and decompilation and
+ all copyright, patent, trademark, trade secret and other
+ proprietary rights and interests are reserved to M-Systems.
+ You may not remove or alter the "README" or "COPYRIGHT" files
+ or copyright notices in the Licensed Software.
+5. DISCLAIMER OF WARRANTIES. To the maximum extent permitted by
+ applicable law, M-Systems and its suppliers provide the Product
+ and any (if any) support services related to the Product
+ ("Support Services") AS IS AND WITH ALL FAULTS, and hereby
+ disclaim all warranties and conditions, either express,
+ implied or statutory, including, but not limited to, any
+ (if any) implied warranties or conditions of merchantability,
+ of fitness for a particular purpose, of lack of viruses, of
+ accuracy or completeness of responses, of results, and of lack
+ of negligence or lack of workmanlike effort, all with regard
+ to the Product, and the provision of or failure to provide
+ Support Services. ALSO, THERE IS NO WARRANTY OR CONDITION OF
+ TITLE, QUIET ENJOYMENT, QUIET POSSESSION, CORRESPONDENCE TO
+ DESCRIPTION OR NON-INFRINGEMENT, WITH REGARD TO THE PRODUCT.
+ THE ENTIRE RISK AS TO THE QUALITY OF OR ARISING OUT OF USE OR
+ PERFORMANCE OF THE PRODUCT AND SUPPORT SERVICES, IF ANY,
+ REMAINS WITH YOU.
+6. EXCLUSION OF INCIDENTAL, CONSEQUENTIAL AND CERTAIN OTHER
+ DAMAGES. To the maximum extent permitted by applicable law,
+ in no event shall M-Systems or its suppliers be liable for
+ any special, incidental, indirect, or consequential damages
+ whatsoever (including, but not limited to, damages for loss
+ of profits or confidential or other information, for business
+ interruption, for personal injury, for loss of privacy, for
+ failure to meet any duty including of good faith or of
+ reasonable care, for negligence, and for any other pecuniary
+ or other loss whatsoever) arising out of or in any way related
+ to the use of or inability to use the Product, the provision
+ of or failure to provide Support Services, or otherwise under
+ or in connection with any provision of Agreement, even in the
+ event of the fault, tort (including negligence), strict
+ liability, breach of contract or breach of warranty of
+ M-Systems or any supplier, and even if M-Systems or any
+ supplier has been advised of the possibility of such damages.
+7. LIMITATION OF LIABILITY AND REMEDIES. Notwithstanding any
+ damages that you might incur for any reason whatsoever
+ (including, without limitation, all damages referenced above
+ and all direct or general damages), the entire liability of
+ M-Systems and any of its suppliers under any provision of this
+ Agreement and your exclusive remedy for all of the foregoing
+ shall be limited to the greater of the amount actually paid by
+ you for the Product or U.S.$5.00. The foregoing limitations,
+ exclusions and disclaimers shall apply to the maximum extent
+ permitted by applicable law, even if any remedy fails its
+ essential purpose.
+8. Miscellaneous
+ The laws of the State of California, United States of America,
+ exclusive of conflict-of-laws provisions, shall govern this
+ Agreement in all respects.
+
diff --git a/sys/contrib/dev/fla/README b/sys/contrib/dev/fla/README
new file mode 100644
index 0000000..78433de
--- /dev/null
+++ b/sys/contrib/dev/fla/README
@@ -0,0 +1,198 @@
+ README and FAQ for the fla driver.
+ ==================================
+
+
+[0] COPYRIGHT & LICENSE
+
+ Please read the COPYRIGHT file carefully. If you cannot
+ agree to be bound by the terms of this license, please
+ contact M-systems and make arrangements with them.
+
+[1] What does this driver do ?
+
+ This driver supports up to eight M-systems DiskOnChip
+ devices.
+
+ The driver has been tested with the following devices:
+
+ DiskOnChip2000 (8, 12, 24, 32, 40, 72, 144 MB)
+ DiskOnChipMillenium (8 MB)
+ DiskOnChipMillenium TSOP (8 MB)
+
+ You can find full details, specs etc on M-systems homepage:
+ http://www.m-sys.com
+
+[2] Which firmware version ?
+
+ The driver has only been tested with version 1.21.
+
+[3] How many devices ?
+
+ The driver supports up to 8 devices but have been tested only
+ with 5 due to hardware limitations in my test setup.
+
+[4] Which FreeBSD versions ?
+
+ The driver is tested for 4.0-CURRENT and 3.3-RELEASE.
+
+ Porting to earlier versions of FreeBSD should be a simple
+ matter of modifying the fla.c file. [patches are welcome]
+
+[5] Can I install FreeBSD with sysinstall ?
+
+ Yes, it has been tested in FreeBSD-4.0-CURRENT and it works.
+ You will need to build a kernel with the fla driver since
+ the default "GENERIC" kernel doesn't contain the fla driver.
+
+[6] How to boot from a fla device ?
+
+ FreeBSD 4.0 and forward find their root device by reading
+ the /etc/fstab, so the DiskOnChip devices will work just
+ like any other device.
+
+ Earlier FreeBSD kernels recognizes the root device using
+ various hacks. These hacks doesn't recognize the fla device
+ so some "real" hacks are needed to boot from your fla
+ device.
+
+ In pre 4.0 versions specifying the boot device in the kernel
+ config file this way is the easiest way to do it:
+
+ config kernel root on major 28 minor 65538
+
+[7] How to disklabel a fla device ?
+
+ Look at the script in prep.fla.sh, it will do the job for you.
+
+[8] Who to contact ?
+
+ doc2k@phk.freebsd.dk will offer limited best-effort help
+ to the extent time permits. Further support for special
+ projects or configurations available at reasonable hourly
+ rates.
+
+[9] Getting detailed
+
+ The DiskOnChip product gets out in some odd corners of the
+ PC-architecture, and chances are that things don't do what
+ you expect. Here are some hints and random observations
+ I've made during my work with these devices.
+
+[9a] Choosing an address for the DOC
+
+ Each DOC needs a 8K memory window starting on an 8K boundary.
+ The lowest possible address is C000:0, the highest is DE00:0
+
+ If your hardware puts the DOC another place, you will need
+ to modify the doc2k_probe() call in fla.c.
+
+ It is important that you set the BIOS to not do "fancy things"
+ with this window, in particular no kind of cache or shadowing
+ can be enabled.
+
+ Be aware that some hardware will decode a 32k memory window
+ for the DOC device.
+
+ If everything is OK, the DOC will print a message during
+ the BIOS startup.
+
+ For large devices it can take some time to check the flash
+ data structures, but if it takes more than 3 minutes
+ something is wrong.
+
+ If you boot a MSDOS floppy and run FDISK you should be able
+ to see the DOC device.
+
+ If it doesnt work:
+
+ If you machine never gets to the point where it will boot,
+ but just hangs it could be because you have a BIOS which
+ need the "slightly special" DOC firmware. Obviously you
+ will need to put the DOC in another machine to load this
+ firmware. You can download the firmware and utilities
+ from M-systems website http://www.m-sys.com
+
+ If the machine boots, but the device isn't visible it can
+ be because some other device uses the same memory window,
+ or because the BIOS prevents it from being used. If you
+ boot MSDOS and enter DEBUG, you should be able to find a
+ BIOS extension signature at the address using the 'd'
+ command, for instance 'd d800:0'.
+
+ A special case is when the DOC prints the BIOS message
+ but disappears afterwards, this can happen because another
+ card (NCR SCSI controllers for instance) steal the memory
+ window later in the boot process. In such a case the
+ above check with DEBUG will not show the BIOS signature.
+
+[9b] So just who is drive 'C' here anyway ?
+
+ Using the DUPDATE program you can choose to have the DOC
+ add itself at the front or the back of the device list.
+
+ This is, unfortunately not the only thing affecting the
+ drive order, the above mentioned NCR SCSI controllers also
+ have some builtin AI, and the result can be very confusing
+ because the DOC will come before even the floppy as a result.
+
+ There is no simple solution for this case, only variuos
+ work-arounds. But chances are good that most users will
+ not use both a DOC and a SCSI in the same system, except
+ maybe for initial programming.
+
+[9c] MBR/fdisk
+
+ The boot firmware in the DOC and/or the FreeBSD bootblocks
+ mandate that the first MBR slice/(partition in FDISK lingo)
+ start exactly at "sector #1, head #1, cylinder #0." You
+ will have problems booting from the fla if you don't get this
+ right. The prep.fla.sh script will do this for you.
+
+ DO NOT WRITE JUNK IN THE MBR! The DOC firmware relies on
+ various fields and can get utterly confused if they don't
+ make sense.
+
+[9d] Getting the FreeBSD kernel to use the fla as root
+
+ Please see above under item 6.
+
+[9e] I turned the machine off while it was running and now my
+ DOC hangs during boot/panics the machine/does weird things.
+
+ If a write operation to the DOC gets interrupted by reset
+ or power-failure, it can happen that the flash data structures
+ are left in a state the sofware cannot cope with.
+
+ Your best chance is to DUPDATE, DFORMAT the device again.
+
+ If it hangs during boot, you can use this particular dirty
+ trick ENTIRELY AT YOUR OWN RISK! DO NOT COMPLAIN IF THIS
+ DOESN'T WORK FOR YOU OR IF YOU DESTROY YOUR COMPUTER OR
+ DOC DEVICE DOING IT!
+
+ Jumper the DOC for an address which will not work, but which
+ will not interfere with the system either, C000:0 seems to
+ work pretty universally for this.
+
+ Boot MSDOS and rejumper the DOC for its real (working) address.
+
+ Run DUPDATE and use the /win:xxxx argument to point it at the
+ DOC device.
+
+[9f] Apart from that...
+
+ ...the DOC is just like any other disk, but it is silent,
+ has better MTBF and doesn't take up a lot of space.
+
+
+[10] History
+
+ The fla driver was written by Poul-Henning Kamp <phk@FreeBSD.org>
+ under contract for M-systems, and using their "OSAK"
+ development kit.
+
+Good Luck,
+
+Poul-Henning
+
+$FreeBSD$
diff --git a/sys/contrib/dev/fla/fla.c b/sys/contrib/dev/fla/fla.c
new file mode 100644
index 0000000..6f758de
--- /dev/null
+++ b/sys/contrib/dev/fla/fla.c
@@ -0,0 +1,344 @@
+/*
+ * ----------------------------------------------------------------------------
+ * "THE BEER-WARE LICENSE" (Revision 42):
+ * <phk@FreeBSD.ORG> wrote this file. As long as you retain this notice you
+ * can do whatever you want with this stuff. If we meet some day, and you think
+ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
+ * ----------------------------------------------------------------------------
+ *
+ * $FreeBSD$
+ *
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/sysctl.h>
+#include <sys/kernel.h>
+#include <sys/bio.h>
+#include <sys/malloc.h>
+#include <sys/conf.h>
+#include <sys/disk.h>
+#include <sys/devicestat.h>
+#include <sys/module.h>
+#include <machine/resource.h>
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+#include <vm/vm_param.h>
+
+#include <sys/bus.h>
+
+#define LEAVE()
+#define ENTER()
+
+#include <contrib/dev/fla/msysosak.h>
+
+static MALLOC_DEFINE(M_FLA, "fla driver", "fla driver storage");
+
+static int fla_debug = 0;
+SYSCTL_INT(_debug, OID_AUTO, fladebug, CTLFLAG_RW, &fla_debug, 0, "");
+
+#define CDEV_MAJOR 102
+
+static d_strategy_t flastrategy;
+static d_open_t flaopen;
+static d_close_t flaclose;
+static d_ioctl_t flaioctl;
+
+static struct cdevsw fla_cdevsw = {
+ /* open */ flaopen,
+ /* close */ flaclose,
+ /* read */ physread,
+ /* write */ physwrite,
+ /* ioctl */ flaioctl,
+ /* poll */ nopoll,
+ /* mmap */ nommap,
+ /* strategy */ flastrategy,
+ /* name */ "fla",
+ /* maj */ CDEV_MAJOR,
+ /* dump */ nodump,
+ /* psize */ nopsize,
+ /* flags */ D_DISK | D_CANFREE,
+};
+static struct cdevsw fladisk_cdevsw;
+
+void *
+doc2k_malloc(int bytes)
+{
+ return malloc(bytes, M_FLA, M_WAITOK);
+}
+
+void
+doc2k_free(void *ptr)
+{
+ free(ptr, M_FLA);
+}
+
+void
+doc2k_delay(unsigned msec)
+{
+ DELAY(1000 * msec);
+}
+
+void
+doc2k_memcpy(void *dst, const void *src, unsigned len)
+{
+ bcopy(src, dst, len);
+}
+
+int
+doc2k_memcmp(const void *dst, const void *src, unsigned len)
+{
+ return (bcmp(src, dst, len));
+}
+
+void
+doc2k_memset(void *dst, int c, unsigned len)
+{
+ u_char *p = dst;
+ while (len--)
+ *p++ = c;
+}
+
+static struct fla_s {
+ int busy;
+ int unit;
+ unsigned nsect;
+ struct doc2k_stat ds;
+ struct bio_queue_head bio_queue;
+ struct devstat stats;
+ struct disk disk;
+ dev_t dev;
+} softc[8];
+
+static int
+flaopen(dev_t dev, int flag, int fmt, struct proc *p)
+{
+ struct fla_s *sc;
+ int error;
+ struct disklabel *dl;
+
+ if (fla_debug)
+ printf("flaopen(%s %x %x %p)\n",
+ devtoname(dev), flag, fmt, p);
+
+ sc = dev->si_drv1;
+
+ error = doc2k_open(sc->unit);
+
+ if (error) {
+ printf("doc2k_open(%d) -> err %d\n", sc->unit, error);
+ return (EIO);
+ }
+
+ dl = &sc->disk.d_label;
+ bzero(dl, sizeof(*dl));
+ error = doc2k_size(sc->unit, &dl->d_secperunit,
+ &dl->d_ncylinders, &dl->d_ntracks, &dl->d_nsectors);
+ dl->d_secsize = DEV_BSIZE;
+ dl->d_secpercyl = dl->d_ntracks * dl->d_nsectors; /* XXX */
+
+ return (0);
+}
+
+static int
+flaclose(dev_t dev, int flags, int fmt, struct proc *p)
+{
+ int error;
+ struct fla_s *sc;
+
+ if (fla_debug)
+ printf("flaclose(%s %x %x %p)\n",
+ devtoname(dev), flags, fmt, p);
+
+ sc = dev->si_drv1;
+
+ error = doc2k_close(sc->unit);
+ if (error) {
+ printf("doc2k_close(%d) -> err %d\n", sc->unit, error);
+ return (EIO);
+ }
+ return (0);
+}
+
+static int
+flaioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
+{
+
+ if (fla_debug)
+ printf("flaioctl(%s %lx %p %x %p)\n",
+ devtoname(dev), cmd, addr, flags, p);
+
+ return (ENOIOCTL);
+}
+
+static void
+flastrategy(struct bio *bp)
+{
+ int unit, error;
+ int s;
+ struct fla_s *sc;
+ enum doc2k_work what;
+
+ if (fla_debug > 1)
+ printf("flastrategy(%p) %s %x, %d, %ld, %p)\n",
+ bp, devtoname(bp->bio_dev), bp->bio_flags, bp->bio_blkno,
+ bp->bio_bcount / DEV_BSIZE, bp->bio_data);
+
+ sc = bp->bio_dev->si_drv1;
+
+ s = splbio();
+
+ bioqdisksort(&sc->bio_queue, bp);
+
+ if (sc->busy) {
+ splx(s);
+ return;
+ }
+
+ sc->busy++;
+
+ while (1) {
+ bp = bioq_first(&sc->bio_queue);
+ if (bp)
+ bioq_remove(&sc->bio_queue, bp);
+ splx(s);
+ if (!bp)
+ break;
+
+ devstat_start_transaction(&sc->stats);
+ bp->bio_resid = bp->bio_bcount;
+ unit = dkunit(bp->bio_dev);
+
+ if (bp->bio_cmd == BIO_DELETE)
+ what = DOC2K_ERASE;
+ else if (bp->bio_cmd == BIO_READ)
+ what = DOC2K_READ;
+ else
+ what = DOC2K_WRITE;
+
+ LEAVE();
+
+ error = doc2k_rwe( unit, what, bp->bio_pblkno,
+ bp->bio_bcount / DEV_BSIZE, bp->bio_data);
+
+ ENTER();
+
+ if (fla_debug > 1 || error) {
+ printf("fla%d: %d = rwe(%p, %d, %d, %d, %ld, %p)\n",
+ unit, error, bp, unit, what, bp->bio_pblkno,
+ bp->bio_bcount / DEV_BSIZE, bp->bio_data);
+ }
+ if (error) {
+ bp->bio_error = EIO;
+ bp->bio_flags |= BIO_ERROR;
+ } else {
+ bp->bio_resid = 0;
+ }
+ biofinish(bp, &sc->stats, 0);
+
+ s = splbio();
+ }
+ sc->busy = 0;
+ return;
+}
+
+static int
+flaprobe (device_t dev)
+{
+ int unit;
+ struct fla_s *sc;
+ int i;
+
+ unit = device_get_unit(dev);
+ if (unit >= 8)
+ return (ENXIO);
+ sc = &softc[unit];
+
+ /* This is slightly ugly */
+ i = doc2k_probe(unit, KERNBASE + 0xc0000, KERNBASE + 0xe0000);
+ if (i)
+ return (ENXIO);
+
+ i = doc2k_info(unit, &sc->ds);
+ if (i)
+ return (ENXIO);
+
+ bus_set_resource(dev, SYS_RES_MEMORY, 0,
+ sc->ds.window - KERNBASE, 8192);
+
+ return (0);
+}
+
+static int
+flaattach (device_t dev)
+{
+ int unit;
+ int i, j, k, l, m, error;
+ struct fla_s *sc;
+
+ unit = device_get_unit(dev);
+ sc = &softc[unit];
+
+ error = doc2k_open(unit);
+ if (error) {
+ printf("doc2k_open(%d) -> err %d\n", unit, error);
+ return (EIO);
+ }
+
+ error = doc2k_size(unit, &sc->nsect, &i, &j, &k );
+ if (error) {
+ printf("doc2k_size(%d) -> err %d\n", unit, error);
+ return (EIO);
+ }
+
+ printf("fla%d: <%s %s>\n", unit, sc->ds.product, sc->ds.model);
+
+ error = doc2k_close(unit);
+ if (error) {
+ printf("doc2k_close(%d) -> err %d\n", unit, error);
+ return (EIO);
+ }
+
+ m = 1024L * 1024L / DEV_BSIZE;
+ l = (sc->nsect * 10 + m/2) / m;
+ printf("fla%d: %d.%01dMB (%u sectors),"
+ " %d cyls, %d heads, %d S/T, 512 B/S\n",
+ unit, l / 10, l % 10, sc->nsect, i, j, k);
+
+ if (bootverbose)
+ printf("fla%d: JEDEC=0x%x unitsize=%ld mediasize=%ld"
+ " chipsize=%ld interleave=%d window=%lx\n",
+ unit, sc->ds.type, sc->ds.unitSize, sc->ds.mediaSize,
+ sc->ds.chipSize, sc->ds.interleaving, sc->ds.window);
+
+ bioq_init(&sc->bio_queue);
+
+ devstat_add_entry(&softc[unit].stats, "fla", unit, DEV_BSIZE,
+ DEVSTAT_NO_ORDERED_TAGS,
+ DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_OTHER,
+ DEVSTAT_PRIORITY_DISK);
+
+ sc->dev = disk_create(unit, &sc->disk, 0, &fla_cdevsw, &fladisk_cdevsw);
+ sc->dev->si_drv1 = sc;
+ sc->unit = unit;
+
+ return (0);
+}
+
+static device_method_t fla_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, flaprobe),
+ DEVMETHOD(device_attach, flaattach),
+ {0, 0}
+};
+
+static driver_t fladriver = {
+ "fla",
+ fla_methods,
+ sizeof(struct fla_s),
+};
+
+static devclass_t fla_devclass;
+
+DRIVER_MODULE(fla, isa, fladriver, fla_devclass, 0, 0);
diff --git a/sys/contrib/dev/fla/i386/msysosak.o.uu b/sys/contrib/dev/fla/i386/msysosak.o.uu
new file mode 100644
index 0000000..0654caf
--- /dev/null
+++ b/sys/contrib/dev/fla/i386/msysosak.o.uu
@@ -0,0 +1,823 @@
+
+$FreeBSD$
+
+SOFTWARE LICENSE AGREEMENT
+
+IMPORTANT! READ CAREFULLY:
+THIS SOFTWARE LICENSE AGREEMENT (the ``Agreement'') is a legal
+agreement between you (either an individual or a single entity) and
+M-Systems Flash Disk Pioneers Ltd. ("M-Systems").
+This Agreement relates to the M-Systems' software accompanying this
+Agreement, which includes computer software and may include associated
+media, printed materials, and ``online'' or electronic documentation
+(the ``Licensed Software'').
+By downloading, installing, copying, or otherwise using the Licensed
+Software, you agree to be bound by the terms of this Agreement.
+If you do not agree to the terms of this Agreement, do not install,
+copy or use the Licensed Software.
+
+The Licensed Software is protected by copyright laws and international
+copyright treaties, as well as other intellectual property laws and
+treaties. The Licensed Software is licensed, not sold.
+The Licensed Software is being provided solely for use with M-Systems'
+DiskOnChip® product lines.
+1. License Grant.
+(a) Grant of License. Subject to the terms and conditions of this
+ Agreement, M-Systems hereby grants you a nonexclusive,
+ royalty-free, worldwide license (including the right to
+ sublicense) to use, copy and distribute the Licensed Software
+ with M-Systems DiskOnChip® products.
+(b) Restrictions on Use. The Licensed Software is licensed solely
+ for use with and to support M-Systems' DiskOnChip® products.
+ Use of this Licensed Software with, or to support, any other
+ flash disk, flash card, resident flash array or solid state
+ disk of any kind is expressly prohibited, and constitutes an
+ illegal infringement of M-Systems' patent, copyright and other
+ rights in and to the Licensed Software.
+2. Limitations on Reverse Engineering, Decompilation, and
+ Disassembly. You may not reverse engineer, decompile, or
+ disassemble the Licensed Software, except and only to the
+ extent that such activity is expressly permitted by applicable
+ law notwithstanding this limitation.
+3. Termination. Without prejudice to any other rights, M-Systems
+ may terminate this Agreement if you fail to comply with the
+ terms and conditions of this Agreement. In such event, you must
+ destroy all copies of the Licensed Software and all of its
+ component parts.
+4. Intellectual Property Rights. Title to the Licensed Software,
+ and all rights with respect to the Software not specifically
+ granted under this Agreement, including without limitation
+ all rights of modification, disassembly and decompilation and
+ all copyright, patent, trademark, trade secret and other
+ proprietary rights and interests are reserved to M-Systems.
+ You may not remove or alter the "README" or "COPYRIGHT" files
+ or copyright notices in the Licensed Software.
+5. DISCLAIMER OF WARRANTIES. To the maximum extent permitted by
+ applicable law, M-Systems and its suppliers provide the Product
+ and any (if any) support services related to the Product
+ ("Support Services") AS IS AND WITH ALL FAULTS, and hereby
+ disclaim all warranties and conditions, either express,
+ implied or statutory, including, but not limited to, any
+ (if any) implied warranties or conditions of merchantability,
+ of fitness for a particular purpose, of lack of viruses, of
+ accuracy or completeness of responses, of results, and of lack
+ of negligence or lack of workmanlike effort, all with regard
+ to the Product, and the provision of or failure to provide
+ Support Services. ALSO, THERE IS NO WARRANTY OR CONDITION OF
+ TITLE, QUIET ENJOYMENT, QUIET POSSESSION, CORRESPONDENCE TO
+ DESCRIPTION OR NON-INFRINGEMENT, WITH REGARD TO THE PRODUCT.
+ THE ENTIRE RISK AS TO THE QUALITY OF OR ARISING OUT OF USE OR
+ PERFORMANCE OF THE PRODUCT AND SUPPORT SERVICES, IF ANY,
+ REMAINS WITH YOU.
+6. EXCLUSION OF INCIDENTAL, CONSEQUENTIAL AND CERTAIN OTHER
+ DAMAGES. To the maximum extent permitted by applicable law,
+ in no event shall M-Systems or its suppliers be liable for
+ any special, incidental, indirect, or consequential damages
+ whatsoever (including, but not limited to, damages for loss
+ of profits or confidential or other information, for business
+ interruption, for personal injury, for loss of privacy, for
+ failure to meet any duty including of good faith or of
+ reasonable care, for negligence, and for any other pecuniary
+ or other loss whatsoever) arising out of or in any way related
+ to the use of or inability to use the Product, the provision
+ of or failure to provide Support Services, or otherwise under
+ or in connection with any provision of Agreement, even in the
+ event of the fault, tort (including negligence), strict
+ liability, breach of contract or breach of warranty of
+ M-Systems or any supplier, and even if M-Systems or any
+ supplier has been advised of the possibility of such damages.
+7. LIMITATION OF LIABILITY AND REMEDIES. Notwithstanding any
+ damages that you might incur for any reason whatsoever
+ (including, without limitation, all damages referenced above
+ and all direct or general damages), the entire liability of
+ M-Systems and any of its suppliers under any provision of this
+ Agreement and your exclusive remedy for all of the foregoing
+ shall be limited to the greater of the amount actually paid by
+ you for the Product or U.S.$5.00. The foregoing limitations,
+ exclusions and disclaimers shall apply to the maximum extent
+ permitted by applicable law, even if any remedy fails its
+ essential purpose.
+8. Miscellaneous
+ The laws of the State of California, United States of America,
+ exclusive of conflict-of-laws provisions, shall govern this
+ Agreement in all respects.
+
+begin 664 msysosak.o
+M?T5,1@$!`0E&<F5E0E-$``$``P`!```````````````0:````````#0`````
+M`"@`#``)`%6)Y8/L"(/$^/\U`````/\U`````.C\____@\00A<!U#.C\____
+MZ/S___\QP,G#D%6)Y8/L"(M%#(M5$*,`````B14`````_P4`````@ST`````
+M`74)Z/S___^%P'46BT4(.P4`````<P8QP.L'B?:X``$``,G#D%6)Y8/L+%=6
+M4XM="(M]#(/$_&I$:@!7Z/S___^)7>B)??2#Q/B-1>A0:@KH_/___XE%Y(M/
+M"(7)?0:!P?__#P")SL'^%(U?',='&`````"#_F-^';H?A>M1B=#W[L'Z!8G(
+MP?@?*,*(T`0PB$<<C5\=@_X)?C6_9V9F9HGP]^^)T8G(P?@"B?'!^1\IR(G!
+M]^^)T,'X`HG*P?H?*="-!(`!P"C!B,@$,(@#0[IG9F9FB=#W[HG0P?@"B?+!
+M^A\IT(T$@`'`B?(HPHC0!#"(`T/&`TU#Q@-"QD,!`(M%Y(UER%M>7\G#B?95
+MB>6#[#Q75E.+10B+70R+?12+=1B)1>B#Q/B-1>A0:@_H_/___XG!BT7XB0.+
+M11#'```$``#'!Q````"+$,'B!(E5W(L#B478,=+W==R)!HL3B=`QTO=UW(72
+M=$'_!HM5$(L"#Z\&B47<BQ.)5=B)T#'2]W7<B0>+$XG0,=+W==R%TG09_P>+
+M/P^O/HE]W(L3B=`QTO?WB<.+51")&HG(C66X6UY?R<-5B>6#["B+10B)1>B#
+MQ/B-1>A0:@3H_/___\G#58GE@^PHBT4(B47H@\3XC47H4&H!Z/S____)PU6)
+MY8/L(%93BUT(BW4,BT40BU44BTT8B5WHB47XB57\B4WT@_X!=!QR"H/^`G0E
+MZS.-=@"#Q/B-1>A0:@7H_/___^LE@\3XC47H4&H&Z/S____K%8/$^(U%Z%!J
+M".C\____ZP6X$"<``(UEV%M>R<-5B>6#[`B#Q/3_=0CH_/___\G#D%6)Y<G#
+MC78`58GEN`$```#)PXGV58GER<.-=@!5B>6+10C'```````QP,G#58GER<.0
+MD)!5B>6+10@/MU4,BT@@T^*)T,G#D%6)Y8/L'%=64XMU"(M]#(-^-``/A(,`
+M```/M]^+1C1F@3R8K=YU4F:!?)@"K=YU28/$]&H$:@B-1?A0@\3X4U;HI___
+M_X/$$(/`"%"-1EQ0BX:`````_]"+5C2-1?B+3?AF"T@$9HD,FHM6-`^W2`)F
+M"T@&9HE,F@(/M]>+1C0/MP20BTT09HD!BT8T#[=$D`*+511FB0+K3(UV`(/$
+M]&H$:@B-1?A0@\3X#[?'4%;H./___X/$$(/`"%"-1EQ0BX:`````_]"-1?B+
+M5?AF"U`$BTT09HD1#[=0`F8+4`:+311FB1&-9=A;7E_)PXUV`%6)Y8/L'%=6
+M4XM="(MU#(M]$(M%%&:)1?!F.?!U"K@?````Z:(```!FB7WXC57X9HEZ!(M-
+M\,'A$(M%^"7__P``B47X"4WXBT($)?__``")0@0)2@2#Q/1J!&H(4H/$^`^W
+MQE!3Z)+^__^#Q!"#P`A0C4-<4(N#A````/_0@\0@A<!U1H-[-`!T%@^WQHM3
+M-&;'!(*MWHM3-&;'1(("K=Z-1?90C47T4`^WQE!3Z%[^__]F.WWT=0F+1?!F
+M.T7V=`>X'0```.L",<"-9=A;7E_)PXGV58GE@^P8BTT(#[=5#(M!+(`\`@!]
+M%HU%_E"-1?Q04E'H%_[__P^W1?[K!I"X__\``,G#D%6)Y8M%"(M5#(G1P>D+
+MBT`X#[8$`<'J"(G1@^$'T_B#X`,/MH``````R<.058GE5U93BWT(BW4,BET0
+M@W\X``^$C````(GRP>H+BT<XB@P"#[;#@_A5=!1_!H7`=!;K&#W_````=`GK
+M#XUV`+("ZPJR`^L&L@#K`K(!B?#!Z`B#X`>#^`)T'7<'A<!T#^LWD(/X!'0;
+M@_@&="+K*H#A_`C1ZR.0@.'SC025`````.L4@.'/B-#`X`3K"HGV@.$_B-#`
+MX`8(P8GRP>H+BT<XB`P"6UY?R<.)]E6)Y8/L#%=64XMU"(M]#(-^.`!T&X/$
+M^%=6Z`G___^(1?Z#Q!`\$70'#[9%_NM#D(/$]&H$:@*-1?Y0C4<&4(U&7%"+
+MAH````#_T(/$((/$_(U=_HI%_@I#`27_````4%=6Z.W^__^*1?X*0P$E_P``
+M`(UEZ%M>7\G#B?95B>6#[!Q75E.+?0B+10PQTO=W&,'B"8E5_,=%^/____]F
+MQT7V```/M]"+1S`/MQQ09H/[_W1:D(/$^`^WPU!7Z%O\__^+5?R--`*#Q/A6
+M5^@O____@\0@//]T-3P1=`['1?C_____A,!T`XEU^&;_1?:#Q/@/M\-05^CY
+M_?__B<.#Q!!F@_O_=`=F@WWV)W:GBT7XC6786UY?R<-5B>6#[!13BUT(@\3T
+M:@1J!(U%_%"#Q/@/MT4,4%/HX?O__X/$$`4(!```4(U#7%"+@X````#_T(M%
+M_&8+1?XE__\``(M=Z,G#C78`58GE@^P<5U93BUT(BW40BWT4@\3T:@1J"(U%
+M^%"#Q/@/MT4,4%/HC?O__X/$$`4(`@``4(U#7%"+@X````#_T(M%_&8+1?YF
+MB0:+1?B)!XUEV%M>7\G#D%6)Y8/L'%=64XMU"(M-$(M]%(M=#(U5^&:)2@3!
+MX1"+0@0E__\``(E"!`E*!(E]^(/$]&H$:@A2@\3X#[?;4U;H&_O__X/$$`4(
+M`@``4(U&7%"+AH0```#_T(UEV%M>7\G#B?95B>6#[`Q75E.+10R[`0```(M5
+M"&;'@I0```#_`&;'@I8```#__X7`=`;V0!0"=0RX&@```.D#`0``B?:+?0B#
+MQUR)QORY#0```/.EBT4(QT`L`````,=`,`````#'0#0`````QT`X`````,=`
+M#``````[6&!]%HM5"(M"#(M28$`!VSG3?/F+30B)00R+=0B+3@R)3B"+1F@/
+MKT9DT_AFB48<#[=6'('"``(``+@!````T^`YPG8WOP$```")RP^W1AQFB47^
+MD$-FP6W^`0^W1?X%``(``(GZB=G3XCG0=^</MT7^BW4(9HE&'(E>((M5"&:!
+M>AS_+W8.@WH@#G<(_T(@9L%J'`&+30C'`0$```#'03S_____@\3T@\3T_W%X
+MZ/S___]0Z/S___^+=0B)AI````!FQT8J```QP(UEZ%M>7\G#C78`58GE@^P4
+M4XM="(/$]`^W0QQ0Z/S___^)0RR#Q/0/MT,0`<!0Z/S___^)0S"#>RP`=`2%
+MP'4*N#\```#K!8UV`#'`BUWHR<.058GE@^P05E.+=0@/MUT,BT8LQ@0#:XU%
+M_%"-1?I04U;HC_W___]U_&H`4U;HV_W__XUEZ%M>R<-5B>6#[!Q75E.+=0B+
+M?0P/M]>+1BR`/`+_="&*!`(D?SQ`=@RX'0```.D'`0``B?8/M]>+1BR`/`+_
+M=01F_TX(#[??BT8L@"0#@(M&+(`,`VJ-1?Q0C47Z4%-6Z!S]__^#Q!"#?C0`
+M=!.+1C1FQP28K=Z+1C1FQT28`JW>#[??BTX@T^,/M\=`T^`YPW,N#[?'0(E%
+M](UV`(/$_&C_````4U;HQ?K__X/$$('#``(``(M.((M%]-/@.<-RW(/$_(M&
+M#(M.("G!N`$```#3X%`/M\>)1?#3X%"-1EQ0BX:(````_]")PX/$$(7;=!.#
+MQ/B+1?!05NC._O__B=CK-XGV_X:8````_T7\=0?'1?P!````_W7\:&D\```/
+MM]]35NBP_/__A<!U#8M&+,8$`_]F_T8(,<"-9=A;7E_)PXUV`%6)Y8/L'%=6
+M4XM="(MU#(/$]/]U%&@``@``_W405HU[7%>+@X0```#_T(E%^(/$((/X'74[
+M#[=%_K0`9HE%_H!-_Q'&1?X1@\3\:A%64^C9^?__@\3T:@1J`HU%_E"-1@90
+M5XN#A````/_0ZP^-=@"#Q/QJ5593Z+#Y__^+1?B-9=A;7E_)PY!5B>6#[!Q7
+M5E.+=0B_`@```(M&>,=`'`$```"#Q/1J`F@``@``_[:0````BT4,4(U>7%.+
+MAH````#_T(/$((/X&759@\3T:@1J"(U%^%"+10Q04XN&@````/_0@\0@@\3T
+M:@1J"(U%^%"+11!04XN&A````/_0@\0@A<!U,(I%_PI%_H/$_"7_````4(M%
+M$%!6Z`[Y__^#Y_V#Q!!7_[:0````BT404%;HR_[__XUEV%M>7\G#C78`58GE
+M@^P<5U93BW4(BWT,9L=%]@``C47^4(U%_%`/M\=05NBA]O__#[==_H/$$&8[
+M7AQS30^WTXM&+(`\`O]T"8H$`B1_/$!W.(U%^E"-1?A0#[?#4%;H;?;__XM%
+M_(#,@(/$$&8Y1?AU%XG?#[==^F;_1?9F.UX<<P=F@WWV)W:S#[?'C6786UY?
+MR<-5B>6#[!Q75E.+?0B+31"+10QFB47Z9HE-^`^W5?B+1S`/MQ109HE5]HG*
+M9H-]]O]T`X#.@`^W=?J+1RS&!`8`9O]/"&C__P``#[?"4%97Z-CV__^)PX/$
+M$(7;=!.#Q/A65^A5_/__B=CI_P```(GV9H-]]O\/A.$````/MU7VBT<L@#P"
+M_W0-B@0")'\\0`^'U@```(/$^`^W1?905^C1_O__B<:-1?Y0C47\4`^WQE!7
+MZ(7U__^#Q"!F@WW^_W0'NQT```#K+`^W3?IFB4W^#[?6BT<L@`P"@`^W1?Y0
+M#[=%_%!25^A!]O__B<.#Q!"%VW0D@\3X#[=%^E!7Z/+[__\/MU7VBT<L@"0"
+M@(M'+(`,`FJ)V.M5BT7X9CE'*G9*9CEU]G1$#[==]HM/+(H$"R1_#[;0#[?&
+MB@0()'^(1?4/MD7U`<*#^D!_"(I%]0`$"^L7N!\```#K$I`/MU7XBT<P#[=-
+M^F:)#%`QP(UEV%M>7\G#C78`58GE@^P,5U93BWT(BW4,#[?6BT<L@"0"@(UV
+M`(/$^`^WQE!7Z-/]__^)PX/$^`^WPU!7Z$3[__^#Q""%P'4%9CGS==@QP(UE
+MZ%M>7\G#B?95B>6#[!!64XM="`^W@Y8```!F.T,0<U(QR0^WDY8```"+0S`/
+MMQ10ZRZ)]F;_@Y8````/MX.6````9CM#$'()9L>#E@``````#[>3E@```(M#
+M,`^W%%!!9H/Z_W469CM+$'+(9H/Z_W4*,<#IC0```(UV``^WLY8```!F_X.6
+M````#[>#E@```&8[0Q!R"6;'@Y8```````^WRHM#+(`\`?]T&(H$`21_/$!V
+M#X/$^`^WQE!3Z$X```#K0@^WTHM#+(`\`@!]$(/$^`^WQE!3Z#,```#K)Y"#
+MQ/B-1?Y04^C+`P``@\00A<!U$H/$_`^WQE`/MT7^4%/H.OW__XUEZ%M>R<.-
+M=@!5B>6#["Q75E.+?0B+10QFB47R#[?0BT<P#[<44&:)5?#_1U@/MU7PBT<L
+M@#P"_W1#B@0")'\\0'8Z@\3XC47^4%?H80,``(/$$(7`#X6Z`0``@\3\#[=%
+M\E`/MT7^4%?HR_S__X/$$(7`=#?IFP$``(UV`(M-\&:)3?XQVXUV`(/$^`^W
+M1?Y05^BB]/__@\009H/X_W0,9HE%_F9#9H/[)W;=QT7X555558/$]&H$:@2-
+M1?A0@\3X#[==\%-7Z)7R__^#Q!`%"`0``%"-1UQ0BX>$````_]"+1RR`)`.`
+MBT<L@`P#:@^W=?(/KW<8@\0@@\3X#[=%_E!7Z%GR__^)P\=%[`````#'1>@`
+M````@\00BT7L.T<8<T:)]H/$^%97Z)+U__^#Q!"#^/]T(/]%[#G8=!F#Q/Q3
+M4%?HK/K__X/$$(7`#X7!````_T=4_T7H1H'#``(``(M-Z#M/&'*\@WWL`'1*
+M:/__```/MT7R4`^W1?Y05^CA\O__@\00A<`/A88````/MTWRBU<P#[=%_F:)
+M!$H/MU7^BT<L@"0"@`^W5?Z+1RR*3>P(#`+K3Y"+1?!F.T7^=#C'1?01$1$1
+M@\3T:@1J!(U%]%"#Q/@/MT7P4%?H?_'__X/$$`4(!```4(U'7%"+AX0```#_
+MT(/$(`^W5?*+1S!FQP10__^#Q/@/MT7P4%?HG/S__XUER%M>7\G#58GE@^P,
+M5U93BUT(#[=-#(M#,`^W!$AFB47^9H/X_W14#[=5_HM#+(`D`H")S@^O<Q@Q
+M_SM[&',\C78`@\3X5E/H7O3__X/$$(/X_W0@BTL@T^B)P0^WT8M#+(`\`@!]
+M!`^W3?X/M]&+0RS^!`)'1CM[&'+'C67H6UY?R<.-=@!5B>6#[!Q75E.+?0B+
+M1QA`B47\QT7X`````&;'1?8``&;'1?0```^W1?9F.T<0#X.I````BT7T9CE'
+M*G<9@\3X#[=%]%!7Z#7___^+1?1`9HE'*H/$$`^W5?2+1S!F@SQ0_W1H#[<4
+M4(M'+(H$`HG#@^-_.5W\<E2$P'P$A=MU3(7;=#HQ]H/$^`^W1?2+5S`/MP1"
+MZPN)]D:#Q/@E__\``%!7Z/3Q__^#Q!!F@_C_=><Y7?QU!3EU^',1B77XB5W\
+MBT7T9HE%]H7;=!%F_T7TBT7T9CM'$`^"5____XM%_#M'&'<?#[=-]HM',`^W
+M%$B+10QFB1"#Q/A15^AL_/__ZP>)]K@_````C6786UY?R<.-=@!5B>6#[!Q7
+M5E.+70B+=0P/MWLH9H-["`!T;(GV9O]#*`^W0RAF.T,<<@@/MT,>9HE#*`^W
+M4RB+0RR`/`+_=4&-1?Q0C47Z4`^W0RA04^BF\___@\009H%]^FD\=!6#Q/@/
+MMT,H4%/H$?;__X/$$(7`=0X/MT,H9HD&,<#K$XUV`&8Y>RAUEH/$^%93Z%S^
+M__^-9=A;7E_)PU6)Y8/L#%=64XM="(MU#(M]$#MS/'4)BT-X@W@<`'1<.W,D
+M<T.#Q/A64^A)\O__B<*)4T2#Q!"#^O]T+(N#D````(E#0(/$]&H":``"``!0
+M4HU#7%"+@X````#_T(7`=`ZX`````.L@QT-``````(ES/(M#>,=`'`````"%
+M_W0%BT-$B0>+0T"-9>A;7E_)PU6)Y8/L'%=64XMU$(M%#&:)1?@/M]B)WXM5
+M"`-Z+(U%_E"-1?Q04U+H;^[__U:-1?I04XM-"%'HE/+__X/$(&:#??S_=`AF
+M@7WZ:3QT"L8'_^D/`0``B?:`)Q`/MT7^BW4(9CM&'',M@`^`#[=-_HM6+(`\
+M$?]T#XH$$21_/$!V!H`\$0!]#@^W5?Z+30B+02R`)`+O9H-]_``/C,4```"+
+M1?R+=0AF.T80#X.;````@\3X#[=U^%:+10A0Z,/Q__^)PP^W5?R+30B+03`/
+MMPQ0@\009H'[$1%U$8/$^%:+=0A6Z/#X___K>XGV9H/Y_W08#[?1BW4(BT8L
+M@#P"_W1#B@0")'\\0'8Z#[=5_(MU"(M&,(MU^&:)-%"`)^]F@?M5574&@">`
+M@`]J9H/Y_W0T@\3X#[?!4(M%"%#HE_C__^LBD&:!^U55=`FX%P```.L5B?:#
+MQ/@/MT7X4(M5"%+H<_C__S'`C6786UY?R<.058GE@^P<5U93BT4,BUT(,=+W
+M<QAFB47\#[?(BT,P#[<T2,'B"8E5^+\!````QT7T`````&:#_O]T-0^WUHM#
+M+(`\`O]T*8H$`B1_/$!V((/$^%%3Z&?Y__^#Q!"%P`^%BP$```^W5?R+0S`/
+MMS109HEU_F:#_O]T68/_)W=4B?:#Q/B#Q/@/MT7^4%/HA^S__P-%^%!3Z&'O
+M__^#Q"`\_W0P/!%T"SQ5#Y3`#[;0B57T@\3X#[=%_E!3Z#'N__]FB47^1X/$
+M$&:#^/]T!8/_)W:N@_\H=09FQT7^__]F@WW^_W5?@_\3=AF#Q/@/MT7\4%/H
+MR?C__X/$$(7`#X7M````@\3XC47^4%/H6?S__X/$$(7`#X75````@\3\#[=%
+M_%`/MT7^4%/HP_7__X/$$(7`#X6W````#[=5_(M#,`^W-%`/MU7^BT,L@#P"
+M_W0-B@0")'\\0`^'@````&H"_W40@\3X#[=%_E!3Z*CK__^#Q!`#1?A04^BG
+M\___A<!U;HM%_&8Y0RIV8V8Y=?YT.`^W5?Z+0RR`/`(`?"N*!`(D?SP_=S</
+MMU7^BT,L_@0"@WWT`'0W#[?&BTLL]@0(?W0;_@P(ZR:0@WWT`'4?#[?&BU,L
+MB@00)'\\/W8'N!\```#K"P^WUHM#+/X$`C'`C6786UY?R<.058GE@^P,5U93
+MBUT(OQT```"#.P!T"K@7````Z8(```"+10P[0R1R"+@;````ZW.09H.[E@``
+M`/]T*V;_@Y0```!F@;N4````_@!V&6;'@Y0``````(/$]%/H_/___X/$$(7`
+M=3W_0TPQ]H/_'74QD(M%##E#/'4'QT,\_____X/$_(M%$%"+10Q04^AX_?__
+MB<>#Q!!&@_X#?P6#_QUTT(GXC67H6UY?R<.)]E6)Y8/L'%=64XM="(M]#(,[
+M`'0,N!<```#I'0$``(GVBU40C00Z.T,D=AFX&P```.D&`0``C78`N!\```#I
+M^0```(GVQT7X`````.G=````@\3X5U/H>NW__XG&@\00@_[_#X2^````B?@Q
+MTO=S&&:)1?8/M\B+0S`/MQ1(BT,L@#P"_W0MB@0")'\\0'8D@\3X45/H@_;_
+M_X/$$(7`#X67````@\3X5U/H)NW__XG&@\00#[=%_K0`9HE%_L9%_@"#Q/QJ
+M`%93Z-_K__^#Q/1J!&H"C47^4(U&!E"-0UQ0BX.$````_]"+2R#3[HGQ#[?1
+MBT,L@\0P@#P"`'T+#[=5]HM#,`^W#%`/MU7V9CE3*G83#[?1BT,L]@0"?P^$
+M%?____X,`O]%^$?_0U"+11`Y1?@/@A?___\QP(UEV%M>7\G#D%6)Y3'`R<.0
+M58GEBT4(BT`DR<.058GE@^P44XM="(-[+`!T#H/$]/]S+.C\____@\00@WLP
+M`'0.@\3T_W,PZ/S___^#Q!#'0RP`````QT,P`````(-[-`!T#H/$]/]S-.C\
+M____@\00@WLX`'0+@\3T_W,XZ/S____'0S0`````QT,X`````(M=Z,G#58GE
+MBU4(C022P>`#*="-!(4@````R<.058GE4XM5"(M=#(M")(D##[="'HM*(-/@
+MB4,$BX*8````B4,(,<!;R<.-=@!5B>6#[#Q75E.+50B+71"-!)+!X`,IT(TT
+MA2````#'1=@`````@\3\:@YJ`(U%\%#H_/___X/$^%-6Z"7M__^#Q""%P`^%
+ML00``(M%%(U67(D0QX:8`````````&;'1@0``(U=\.L%D&;_1@0/MT8$9CM&
+M''-*@\3T:@!J#E.#Q/@/MT8$4%;HU.?__X/$$%"-1EQ0BX:`````_]"#Q""#
+MQ/QJ!F@8````4^C\____@\00A<!UL@^W1@1F.T8<<@RX&@```.DQ!```B?8/
+MMUX$0V:)7@:-7>#K!HGV9O]&!@^W1@9F.T8<<TJ#Q/1J`&H.4X/$^`^W1@90
+M5NA@Y___@\004(U&7%"+AH````#_T(/$((/$_&H&:!@```!3Z/S___^#Q!"%
+MP'6R#[=&!F8[1AQR!F;'1@;__P^W1?9FB48<BT7X9HE&'H/$](U%^E#H_/__
+M_XG"P>H)B58D#[=&'F8!1AR[`0```(M.((G8T^!(B484@\'WB=C3X(E&&(U$
+M$/\QTO=V&&:)1A"+1B33Z(G!#[?)#[=&'`^W5AXIT(/$$#G!?GEF@WX&_W1H
+M#[=%YF:)1AR+1>AFB48>@\3TC47J4.C\____B<+!Z@F)5B0/MT8>9@%&'(M.
+M((G8T^!(B484@\'WB=C3X(E&&(U$$/\QTO=V&&:)1A"+5B33ZHG1#[?)#[=&
+M'`^W5AXIT(/$$#G!?@JX%P```.G;`@``@\3T5NB#[/__@\00A<`/A<<"``#'
+M!@````"#Q/1J`@^W1AQ0_W8L@\3X#[=&!%!6Z`OF__^#Q!`%``(``%"-7EQ3
+MBX:`````_]")QX/$((7_=$UF@WX&_W0_@\3T:@(/MT8<4/]V+(/$^`^W1@90
+M5NC+Y?__@\00!0`"``!04XN&@````/_0B<>#Q""%_W00@\3T5NB+_/__B?CI
+M.P(``#';9CM>$',4#[?3BT8P9L<$4/__9D-F.UX0<NPQVV8[7AQS0F8[7AYR
+M&&8[7@1T$F8[7@9T#`^WTXM&+(`\`O]T'`^WTXM&+(`\`O]T!L8$`FOK"@^W
+MTXM&+,8$`FIF0V8[7AQROC';9CM>''-`B?8/M].+1BR*!`($ECP!=B>#Q/R-
+M1=Q04E;HB_;__XG'@\00A?\/A5;___^+1=P!1=@!AI@```!F0V8[7AQRPF;'
+M1@@```^W7AYF.UX<<S:)]@^WPP-&+(`X$'0%@#B0=12#Q/@/M\-05N@3\/__
+M@\00ZPJ)]H`X[W4#Q@#_9D-F.UX<<LQFQT8(```/MUX>9CM>'',9BU8LD`^W
+MPX`\$/]U!&;_1@AF0V8[7AQRZP^W1AYFB48HQT90`````,=&3`````#'1D@`
+M````QT98`````,=&5`````"+70R),\=#!.`3``#'0PC8%P``QT,4A!@``,=#
+M(-`9``#'0R1L&@``QT,8R!D``,=#'-P9``#'0PP`````QT,0`````(/$]`^W
+M1AS!X`)0Z/S___^)1C2#Q!"%P'0H,=MF.UX<<R")]@^WPXM6-&;'!(*MWHM6
+M-&;'1(("K=YF0V8[7AQRX@^W7AR+3B"#P?73XX/$]%/H_/___XE&.(7`=!6Q
+M53'2.=IS#8GVBT8XB`P"0CG:<O6+1=CW)2````#!Z@>)T,'@""G0BU78*<*)
+MT"7_````9HF&E`````^W5A"+1=B)TS'2]_-FB9:6````,<"-9;A;7E_)PY!5
+MB>575E.#/0`````"?@FX9@```.MIB?:A`````,'@`\>``````)@:``#'@`0`
+M````````_P4`````,=*_3````+Y0````NU0```"Y6````(T$DL'@`RG0P>`"
+MQP0X`````,<$,`````#'!!@`````QP0(`````$*#^@=VTS'`6UY?R<-5B>6X
+M`0```,G#B?95B>7)PXUV`%6)Y<G#C78`58GE,<#)PY!5B>7)PXUV`%6)Y3'`
+MR<.058GER<.-=@!5B>7)PXUV`%6)Y3'`R<.058GE,<#)PY!5B>7)PXUV`%6)
+MY8/L#%=64XM]#(,]``````=V"[AF````Z<8```"0,?:#/0`````'#X>G````
+MD(/$]/\U`````.C\____B<.A`````(D#@\3X:@)3Z/S___^#Q""#Q/Q7BT4(
+M4/\SZ/S___^)0RB#Q!"%P'1HQT-`("```,=#1"P@``#'0T@T(```QT-,/"``
+M`,=#4$0@``#'0U1,(```QT-85"```,=#7%P@``#'0V!D(```QT-D;"```,=#
+M:`````#'0VQT(```1O\%`````(,]``````</AEK___^%]G0&,<#K!XGVN#P`
+M``"-9>A;7E_)PY"0D%6)Y8M5"(M"&(M`*,:`!A````"+0AB+0"C&@`80```*
+MR<.)]E6)Y8M5"(M"&(M`*,:`!A````"+0AB+0"C&@`80```JR<.)]E6)Y8M%
+M"(M`&(M`*,:`!A````+)PXUV`%6)Y8/L$%93BW4(QD7_`(M&&/9`'`AT+#')
+MB<.+0RB*5?^*@`80````PHA5_T&#^0%^Z8M&&(M`*(J`!A```.LNC78`,<F+
+M7AB-=@"+0RB*5?^*@`<0````PHA5_T&#^0%^Z8M&&(M`*(J`!Q```"2`)?\`
+M``!;7LG#B?95B>575E.+70B+=0R+31"+?13V0Q4!=33WQP0```!T)(L1@>+_
+M`0``QP90````@_H'=PF!`0`!``#K:Y"#`?CK98UV`,<&`````.M:BT,8#[<1
+M9B-0"(G0#[?0*1'WQP0```!T!H'"``(``(M#&`^W0`HYPG,*QP8`````ZQR)
+M]HM#&`^W0`8YPG,)QP8!````ZP>0QP90````BT,8#[=`"D@AP@$16UY?R<.0
+M58GE@^P05E.+=0C&1?\`,<F+7AB+0RB*5?^*@"`0````PHA5_T&#^0-^Z8M&
+M&(M`*(J`!!```(A%_C')BUX8D(M#*(I5_XJ`(!````#"B%7_08/Y`7[IBD7^
+MP.@'-`$E_P```%M>R<-5B>6#[!!64XMU"#';C78`@\3T5NA_____@\00A<!U
+M"+@!````ZPR00X'[+W4``'[?,<"-9>A;7LG#B?95B>6#[`Q75E.+?0B+30PQ
+MV[IG9F9FB=#WZ8G0P?@"B<K!^A\IT#G#?3^Z9V9F9HG0]^G!^@*)R,'X'XG6
+M*<:0@\3T:@KH_/___X/$]%?H"?___X/$((7`=0JX`0```.L*C78`0SGS?-<Q
+MP(UEZ%M>7\G#D%6)Y8/L%%.+30B+50S&1?\`BT$8BT`HB)`$$```,=N+21B)
+M]HM!*(I5_XJ`(!````#"B%7_0X/[`7[I6\G#B?95B>6+10B+50R+0!B+0"B(
+MD`40``#)PY!5B>6+30B+01B+4"B*@@$0``"$P'4;QH("$```A8M!&(M`*,:`
+M`A```(6+01C&0!4`R<.058GE@^P44XM%"(M=#(/$^&H`_W`<Z/S___^(F`(0
+M``"(F`(0``"+7>C)PY!5B>6#[!B+50R*@@`0```\,'45BH(&$```B$7_BD7_
+MBI(&$```ZQ.0BH('$```B$7_BD7_BI('$```,-"(1?Z*1?ZH!'0&,<#K!XGV
+MN`$```#)PY!5B>6#[`B+50S&@@(0``"$QH("$```A,:"`A```(7&@@(0``"%
+MBH(`$```/"!T"HJ"`!```#PP=1>#Q/A2_W4(Z&?___^%P'4'N`$```#K`C'`
+MR<-5B>6#[!Q75E.+=0R+?1#'1?@`````A?9U"KX`@`P`OP``#P`Y-00```!S
+M.(DU!````#G^=RB)]HL=!````,:#`A```(3&@P(0``"$@04$`````"```#D]
+M!````';:B34$````.3T$````#X?E````BQT$````Z:H```"0@WWX`'5"@\3X
+M4XM%"%#HR?[__X/$$(7`=7J*@P`0``"$P'0,QH,;$```&NL*C78`QH,%$```
+M&L=%^`$```"+-00```#K3HGVBH,`$```/"!T"HJ#`!```#PP=7V#Q/A3BT4(
+M4.AS_O__@\00A<!U:8J#`!```#PP=0J*@QL0``#K"(GVBH,%$```B$7_BD7_
+M/!IU1:$$````!0`@``"C!````#GX=S*)P\:#`A```(7&@P(0``"%BH,`$```
+M/"`/A#O___^*@P`0```\,`^$+?___X-]^`%UNX-]^`!T"8GPP>@,ZP2)]C'`
+MC6786UY?R<.)]E6)Y8/L$%93BW4(BT8(#Z]&$$B+70PAP_9&%0%T#XG8P>@)
+MP>`(#[;3B<,)TX/$^&H55NCX_/__BT88BU`HBT`DB!P0BT88BT@HBU`DB=C!
+MZ`B(!`J+1AB+2"B+4"2)V,'H$(@$"H/$$/9&%01T$8M&&(M(*(M0)(G8P>@8
+MB`0*BT88]D`<"'0*BT`HQH`>$````(/$^&HQ5NB2_/__C67H6U[)PXUV`%6)
+MY8/L%%.+70R#Q/AJ$XM%"%#H</S__XM5"(M"&(M0*(M`)(@<$(M5"(M"&/9`
+M'`AT"8M`*(B8'A```(M=Z,G#C78`58GE5U93BW4(BWT,BTX8@'D4`78FBP<Q
+MTO=Q&(G#B-J(616+1AB+0"B(F`,0```/ML*+5A@/KT(8*0=;7E_)PU6)Y8/L
+M$%93BUT(BW4,@\3X:@#_<QSH_/___XG"BT,8B5`H@\3X5E/HD____X/$((/$
+M^(M+"`^O2Q"+%HG0,=+W\8G!#[;!4%/H]OO__XUEZ%M>R<.-=@!5B>6#[`Q7
+M5E.+?0B+=1#&1?\`BT<8]D`<"'0XBT`HBE7_BH`=$````,*(5?].B?.!_@`!
+M``!^!;L``0``4XM%#%"+1QC_<"17Z/S___^#Q!#K`Y`QVSG>?A>)\"G84(M%
+M#`'84(M'&/]P)%?H_/___XM'&/9`'`AT#XM`*(J`'Q```(M5#(@$%HUEZ%M>
+M7\G#C78`58GE@^P44XM="(/$_/]U$/]U#%/H_/___XM#&/9`'`AT"HM`*,:`
+M'A````"+7>C)PXUV`%6)Y8/L%%.+70B#Q/P/MD4,4/]U$%/H_/___XM#&/9`
+M'`AT"HM`*,:`'A````"+7>C)PY!5B>6#[!13BUT(QD7_`(M#&(M0*(M`),8$
+M$'"+0QCV0!P(=`J+0"C&@!X0``!P@\3X:AE3Z'?Z__^+2QB+42B*1?^*D@T0
+M````T(A%_XM1*(M!)(H$$"7_````BUWHR<-5B>6#[!!64XM="(MU$(/$^`^V
+M10Q04^BL_?__@\3X5E/H^OS__X/$((/$]%/H;OG__XUEZ%M>R<.-=@!5B>6#
+M[!!64XM="(MU#/9#%0)T0(/$^&C_````4^AJ_?__@\3T4^@Y^?__@\0@A?9T
+M-HM#&(M0*(M`)(GQB`P0BT,8]D`<"'0?BT`HB(@>$```ZQ2#Q/B)\"7_````
+M4%/H)_W__X/$$(M#&(M0*(M`),8$$("+0QCV0!P(=`J+0"C&@!X0``"`@\3X
+M_W404^A0_/__@\3T4^C'^/__C67H6U[)PU6)Y8/L%%.+70B#Q/AJ$%/HT_S_
+M_X/$]%/HHOC__X/$((/$]%/HEO[__Z@!=08QP.L'B?:X'0```(M=Z,G#B?95
+MB>6#[!Q75E.+=0B+?12+11")1?#'1?0`````@\3T_W8<Z/S___^#Q!"%P'0*
+MN!,```#I!P(``(/$^(U%#%!6Z.?\__^+11A0C44,4(U%]%!6Z!7W__^#Q"#V
+M1A4"=$"#??0!=3J+1AB+70QF(U@(#[?;@\,"@\3\#[=`"@-%#"G84&H`5NB1
+M_O__@\3\4VC_````5NBR_?__@\0@ZQ.0@\3\_W4,_W7T5NAM_O__@\00BT48
+MJ`)T#(/$]%;H\O7__X/$$/9&%0$/A:D```"+11BH!'06BT4,@^`')?__``"Z
+M"````(G3*</K#0^V50RX``$``(G#*=,Y^WX"B?LIWX/$_%.+1?!05N@)_?__
+M@\00A?]^<X7;?A2#Q/16Z)W^__^#Q!"%P`^%$0$``(M%&*@$=!F+50R!P@#_
+M__^+10R#X`<E__\``"G"B54,@\3\B=@#10Q0_W7T5NB\_?__@\3\5XM%\`'8
+M4%;HJ/S__X/$(.L4C78`@\3\5XM%\%!6Z)+\__^#Q!"+11BH`@^$C@```(/$
+M^&HA5NB1]___BT88@\00]D`<"'0=,=*-=@"+1AB+0"C&@"`0````0H/Z`G[M
+MZQ.-=@"#Q/QJ`VH`5NAW_/__@\00@\3X:C%6Z$WW__]J!HU=^%-H$!```%;H
+M_/___X/$((/$]%;HV/3__X/$_&H&4U;H#/S__X/$((/$_&H":`@```!6Z/G[
+M__^#Q!"#Q/16Z)7]__^#Q!"%P'4-@\3X:AA6Z//V__\QP(UEV%M>7\G#D%6)
+MY8/L'%=64XMU%(M]&(M%$(E%_,=%^``"``#WQP0```!T!\=%^`@````/MT4,
+MBU7X2B'0BUWX*<.#Q/2+10A0Z/KV__^#Q!"%]GY"C78`.?-^`HGS@\3T@?L`
+M`@``=`.#Y_V)^%!3BT7\4(M%#%"+10A0Z#_]__^#Q""%P'41*=X!70P!7?R+
+M7?B%]G_!,<"-9=A;7E_)PXUV`%6)Y8/L+%=64XMU",=%Y`````#'1>@`````
+MBT4,B47L@\3XC47L4%;H&_K__XM%&%"-1>Q0C47H4%;H2?3__X/$((/$_/]U
+M[/]UZ%;HJ_O__X/$$(M%&*@"=`R#Q/16Z$CS__^#Q!#V1A4!#X67````BT48
+MJ`1T&(M%[(/@!R7__P``N@@```")TRG#ZP^)]@^V5>RX``$``(G#*=,[711^
+M`XM=%(M]%"G?@\3\4XM%$%!6Z.CY__^#Q!"%_WY=BT48J`1T&8M5[('"`/__
+M_XM%[(/@!R7__P``*<*)5>R#Q/R)V`-%[%#_=>A6Z`O[__^#Q/Q7BT40`=A0
+M5NB?^?__@\0@ZQ:)]H/$_(M%%%"+11!05NB'^?__@\00BT48J`(/A)L```"#
+MQ/QJ!HU%^%!6Z&KY__^#Q/16Z,WR__^#Q""%P'1P9H-]&`!\(X/$](M%&(#,
+M@%"+1110BT404(M%#%!6Z)?^___IC````(GV:@:-7?!3:!`0``!6Z/S___^*
+M5?"*1?2(1?"(5?2*5?&*1?6(1?&(5?6#Q/QJ`5.+11!0Z/S___^#Q""%P'0'
+MQT7D&0```(/$]%;H-?+__X/$$(/$^&H85NA_]/__@\00BT48J`1T(`^W1>R+
+M5A@/MTH,C5'_(=`#110YR'4)@\3T5NBE\___BT7DC67(6UY?R<.)]E6)Y8/L
+M'%=64XMU%(M]&(M%$(E%_,=%^``"``#WQP0```!T!\=%^`@```"#Q/2+10A0
+MZ&GT__\/MT4,BU7X2B'0BUWX*<.#Q!"%]GY"C78`.?-^`HGS@\3T@?L``@``
+M=`.#Y_V)^%!3BT7\4(M%#%"+10A0Z(/]__^#Q""%P'41*=X!70P!7?R+7?B%
+M]G_!,<"-9=A;7E_)PXUV`%6)Y8/L'%=64XMU"(M]#,=%^`````")^P^O7@2)
+M7?R#Q/3_=ASH_/___X/$$(7`=`NX$P```.G%`0``D(M%$(T4.(M&&`^W0`X/
+MKT8,.<)^"[@=````Z:4!``"0@\3T5NB?\___B=B+3A@QTO=Q&(G#B-H/MMI#
+M#Z]9&(G8F?=^!(G#BU40C00Z@\00.=A^38/$_(G8*?@IPHG04%-6Z%W___^#
+MQ!"%P'0NZ5$!``"0QT7X'0```(/$^&C_````5NA?]O__@\3T5N@N\O__@\0@
+MZ1P!``")]BG[B5T0@\3XC47\4%;HOO;__\=%]`````"#Q!"+31`Y3?0/C?(`
+M``"+1A@/MT`2B?L/K]B#Q/AH_P```%;H"O;__X/$^&H15NB'\O__@\0@@\3T
+M5NC+\?__@\3X:F!6Z.CU__^#Q""#Q/AJ%5;H8O+__XM&&(M0*(M`)(@<$(M&
+M&(M(*(M0)(G8P>@(B`0*@\00]D85!'01BT88BT@HBU`DB=C!Z!"(!`J+1ACV
+M0!P(=`J+0"C&@!X0````@\3X:A%6Z`WR__^#Q/AHT````%;H=_7__X/$((/$
+M^&H>5NA]\?__@\00A<!U#(/$]%;H,?'__X/$$(/$]%;H)??__X/$$*@!#X7.
+M_O___T7T1XM%$#E%]`^,#O___X/$^&H85NBO\?__BT7XC6786UY?R<-5B>6+
+M10B-%("-%%"-!)4`!0``R<.-=@!5B>6#[!13BUT(@\3T:@#_=1"+0QC_<"#_
+M=0Q3Z"/]__^+0QS'0!P!````BT,8BT`@BUWHR<.)]E6)Y8/L%%.+30B*70R*
+M11"(1?^+41B`>A4`#X5L`@``@WT4``^%8@(``&8/ML-FB0*+41AF#[9%_V:)
+M0@*+01AFQT`2$``/ML,]F`````^$*`$``#WL````#X5-`@``#[9%_X/X=@^$
+MY````'\F@_AS#X2A````?PN#^&1T0.DI`@``D(/X=0^$IP```.D:`@``B?8]
+MY0```'0]?P\]XP```'0TZ0,"``"-=@`]Y@```'1%/>H````/A>X!``!FQP%D
+M[(M!&&;'0`0``<=!"```(`#IRP$``&;'`>7LBT$89L=`!``"QT$(``!``(!)
+M%0'IK0$``(GV9L<!YNR+01AFQT`$``+'00@``(``@$D5`>F-`0``B?9FQP%S
+M[(M!&&;'0`0``L=!"`````&`214!ZS:09L<!=>R+01AFQT`$``+'00@````"
+M@$D5`>L:D&;'`7;LBT$89L=`!``"QT$(````!(!)%06+01@/MU`2`=)FB5`2
+MZ2@!``"0#[9%_X/X=0^$NP```'\A@_AK=&!_"H/X9'0_Z1`!``"#^',/A(,`
+M``#I`@$``(GV/>4```!T/7\/@_AV#X2B````Z>D```"0/>8```!T03WJ````
+M#X76````9L<!9)B+01AFQT`$``''00@``"``Z98```!FQP'EF(!)%0&+01AF
+MQT`$``+'00@``$``ZWN09L<!YIB`214!BT$89L=`!``"QT$(``"``.M?D&;'
+M`7.8BT$89L=`!``"QT$(`````8!)%0'K-I!FQP%UF(M!&&;'0`0``L=!"```
+M``*`214!ZQJ09L<!=IB+01AFQT`$``+'00@````$@$D5!8M!&`^W4!(!TF:)
+M4!*`214"ZQ=F#[;#BU$89CL"=11F#[9%_V8[0@)U";@!````ZP2)]C'`6\G#
+MC78`58GE@^P,5U93BUT(BWT,QD7_`(/$^&B0````4^CW\?__@\3X:AU3Z'3N
+M__^+0QB+4"B+0"3&!!``BT,8@\0@]D`<"'0*BT`HQH`>$````(/$^&H94^A&
+M[O__@\3T:@KH_/___XM#&(M0*(I%_XJ2#1````#0B$7_,<F#Q""+<QB+1BB*
+M5?^*@"`0````PHA5_T&#^0%^Z8M#&(M0*(M`)(H4$(A5_H/$]&H*Z/S___^+
+M0QB+4"B*1?^*D@T0````T(A%_S')@\00BW,8BT8HBE7_BH`@$````,*(5?]!
+M@_D!?NF+0QB+4"B+0"2*!!!7)?\```!0#[9%_E!3Z$O\__^#Q!"#^`%T!S'`
+MZ84```#_0PR#Q/AJ$%/H@NW__XM#&(!X%0!U:87_=65FQT`*``&+4Q@/MT($
+M9HE"!O9#%0%T#HM#&&;'0`P0`.L,C78`BT,89L=`#`@`BT,8#[=0!DIFB5`(
+MBTL8#[=!$@^W408/K\*)0P2+0PB9]WL$9HE!#HM#&`^W4`QF`U`&9HE0$+@!
+M````C67H6UY?R<.-=@!5B>6#[!Q75E.+=0C'1?@`````QD7S`(/$]/]V'.C\
+M____B<*-!)*-!$*-!(4`!0``B488@\3T@\3T_W8<Z/S___]0Z/S___^)PHM&
+M&(E0((/$,(/$^&B%````5N@K[?__@\3X:A#_=ASH_/___X/$((/$^&IX_W8<
+MZ/S___^+1AC'0!@!````BT88QD`4!(M&&,9`%03'1@P`````QT8(```@`,=&
+M$`$```"#Q/AJ`/]V'.C\____B<*+1AB)4"B+5AB+0BB#Q""*@``0```\,'45
+M@$H<"(M&&,=`)``(``#&1@("ZP^0BT88QT`D`!@``,9&`@&#Q/B-1?A05NCY
+M[___BU88@\00]D(<"'0=BT(HBH`&$```B$7_BU(HBD7_BI(&$```ZQZ-=@"+
+M5AB+0BB*@`<0``"(1?^+4BB*1?^*D@<0```PT(A%_HI%_J@$#X2-`0``BT88
+MBT`HBH``$```OQ`````\,'4%OP(```"+1AC&0!4`BT88B<*`>!4#=T>0B="+
+M4"B*0!6(@@,0```QVSG[?2.#Q/@/ML-05NB;Z___@\3X:/\```!6Z,7N__^#
+MQ"!#.?M\W8M&&/Y`%8M6&(!Z%0-VNHM&&,9`%0"+1AB+4"B*0!6(@@,0``"#
+MQ/AJ&%;H%>O__\9%\@"#Q!")]C';.?M]=8GVBT7XB47T@\3XC47T4%;H[>[_
+M_X/$^%-6Z/S___^#Q""#^`%U)XI%\O[`B$7S@'WR`'4-BT88BU8(#Z]6$`%0
+M&(M&"`^O1A`!1?CK(H!]\@!U%HG?BU88B=@/KT8(#Z]&$(E"&.L(B?:)^\9%
+M\@1#.?M\C?Y%\H!]\@,/AGC___^+1AC&0!4`BT88BU`HBD`5B((#$```@WX,
+M`'1,QT7X`````(/$^(U%^%!6Z%#N__^+1AB*5?.(4!2#Q/16Z.KG___'1B@D
+M+0``QT8L8#```,=&),0O``#'1B"`,@``@$X4`C'`ZP>)]K@:````C6786UY?
+MR<.-=@!5B>6#/0`````$?QRA`````,'@`L>```````PW``#_!0`````QP.L%
+MN&8```#)PY!5B>6#[!13BUT(]@,(=":#Q/3_LY@```#H_/___X/$$(7`=`/&
+M`P"#Q/3_<VR+@X@```#_T,8#`#'`BUWHR<.058GE@^P05E.+70@Q]H-]#`%U
+M68/$](U#-%#H_/___X/$$(7`=0JX"0```.F%````@\3X:@'_LY@```#H_/__
+M_X/$]/^SF````.C\____@\0@]@,(=%V#Q/AJ`?]S;(N#A````/_0B<;K28GV
+M]@,(=!6#Q/AJ`/]S;(N#A````/_0B<:#Q!"#Q/3_LY@```#H_/___X/$^&H`
+M_[.8````Z/S___^#Q""#Q/2-0S10Z/S___^)\(UEZ%M>R<-5B>6#[`B+10B#
+MQ/QJ`/]U#/]P;(M`</_0R<.058GE@^P44XM="(/$]%/H_/___X/$$(7`=3V#
+MQ/QJ`8U#;%")V"T`````:<"7;_F6P?@"4.C\____A<!U&L=#$`````#'0Q@`
+M````QT,4`````(`+"#'`BUWHR<-5B>6#["Q75E.+?0C'1>``````QT7<`0``
+M`(/$]%?H@?___X/$$(7`#X5;`@``QT7H`````,=%Y`````#I]P```(UV`,=%
+MW`````"#Q/B+1>105^C\____B<.#Q!"%VP^$[P$``('[``````^$^P$``&:!
+MN_X!``!5J@^%R````,=%[`````"#?>``#X6>````@WW<``^%E````(UU^(GV
+MBU7LP>($BX0:O@$``(E%\(N$&L(!``")1?2+A!K&`0``B47XBX0:R@$``(E%
+M_(I%]#P$=!-_"3P!=`WK.8UV`#P%=!P\!G4NQT7@`0```(/$]%;H_/___XE'
+M$.L6C78`QT7<`0```(/$]%;H_/___XE%Y(/$$/]%[(-][`-W$(-]X`!U"H-]
+MW``/A''_____1>B#?>@'=Q"#?>``=0J#?=P!#X3\_O__@\3X_W<05^C\____
+MB<.#Q!"%VW4+N!L```#I(@$``)"!^P````!U#+@9````Z0\!``")]H`[Z70;
+MBP,E_P#_`#WK`)``=`VX"@```.GP````C78`@\3TC4,+4.C\____@\009CT`
+M`@^%SP````^V0PV)1P0/MD,0B4<<#[=#%HE'(`^W2PX#3Q")3Q0/MT,6`<B)
+M1Q@/MD,0#[=3%@^OP@'(B4<D@\3TC4,14.C\____)?__``#!X`5(P>@)0(E'
+M*`-')(E'+(/$](U#$U#H_/___R7__P``A<!U`XM#(`-'$"M'+#'2]W<$0(E'
+M"#WT#P``=D>+1P3!X`F)1PS'1S`"````@`\",<#K-8/$]/]W;(N'B````/_0
+MN!L```#K((UV`(/$]/]W;(N'B````/_0N!D```#K"(UV`+@+````C67(6UY?
+MR<.-=@!5B>6#[!!64XM="(MU#(/$]/]S;(N#C````/_0.T,0=@LK0Q")1A`Q
+MP.L-D,=&$`````"X'P```(UEZ%M>R<.058GE@^P,5U93BWT,BW<,BT<0BU4(
+MBUH0`<.+1Q2)1?S'1Q0`````.4<4#X.%````@\3X4XM5"%+H_/___X/$$(7`
+M="0]`````'4)N!D```#K98GV@\3\:``"``!05NC\____ZS>-=@"#Q/2+10C_
+M<&R)PHN"C````/_0@\00.=AW"K@;````ZRZ-=@"#Q/QH``(``&H`5NC\____
+M@\00_T<40X'&``(``(M%_#E'%`^">____S'`C67H6UY?R<.058GE@^P,5U93
+MBWT(@\3XBT4,4%?H_/___XG"@\00A=)T"('Z`````'4&,<#K:(GVBT4,*T<4
+MP>`(C5C^#Z]?!`-?+#'VC78`BTT0#[<$#F:#/!8`=!YFA<!U&8/$_/]W!%/_
+M=VR+AX````#_T(/$$(7`=2*#Q/B+10Q05^C\____B<*#Q!`#7P2#Q@*!_O\!
+M``!VM#'`C67H6UY?R<.)]E6)Y8/L#%=64XM%#(MP#(M`$(M5"(M:$`'#BT4,
+MBT`4B47\.UH8<TD!V#M"%'9",?\[??QS*HGVBU4(.UH4<A,[6AAS#H/$_%93
+M4NC\____@\001T.!Q@`"```[??QRV(M%#(MP#(M`$(M5"(M:$`'#BT4,QT`4
+M`````.LIC78`@\3\5E.+10C_<&R)PHM"=/_0@\00A<!U%XM%#/]`%$.!Q@`"
+M``"+5?PY4!1RTC'`C67H6UY?R<-5B>6#[!13BT4(BUT,@\3\C57\4O]S$/]P
+M;(M`</_0A<!T'3T`````=0JX&0```.L4C78`BT7\B4,4,<#K!XGVN!L```"+
+M7>C)PXGV58GE@^P(BU4(BTT,BT$0`T(0@\3\_W$44/]R;(N"@````/_0R<.)
+M]E6)Y8/L$%=6BU4(BT4,BW`,@\3X_W(04NC\____A<!U![@;````ZQT]````
+M`'01B?>)QORY"0```/.E,<#K!I"X&0```(UEZ%Y?R<-5B>6#[!!64XM="(/$
+M^(US.%;_LY@```#H_/___X/$$(7`=0Z#Q/16BT-H_]"`"P$QP(UEZ%M>R<.-
+M=@!5B>6+10B`(/[)PY!5B>6+50B+10R+2`P/MT(X9HD!BT(\B4$$BT)`#Z]"
+M1(E!"(M"0(E!#(M"2(E!$(I".CP!=!I_"(3`=`SK'HGV/`)T%.L6B?;&00(`
+MZPZ)]L9!`@'K!HGVQD$"`C'`R<-5B>6#[!13BUT(BTT,BT$4`T$0BU-`#Z]3
+M1#G0?Q&+01"9]WL\BT,\*=`Y011^";@S````ZR")]H/$]/]Q!/]Q%/]Q#/]Q
+M$(U#.%"+0US_T(7`=0(QP(M=Z,G#D%6)Y8/L%%.+70B+30R+010#01"+4T`/
+MKU-$.=!_$8M!$)GW>SR+0SPIT#E!%'X)N#,```#K((GV@\3T_W$$_W$4_W$,
+M_W$0C4,X4(M#8/_0A<!U`C'`BUWHR<.058GE@^P,5U93BUT(BTT,BT$4B<<#
+M>1"+<T`/KW-$B?"9]WL\.<=^"+@S````ZQF0@\3\_W$4_W$0C4,X4(M#9/_0
+MA<!U`C'`C67H6UY?R<-5B>6+10B+50R+@)@```"+0"C!X`R)`C'`R<.058GE
+M@^P,5U93BWT,BW40BUT4QP<`!```QP80````BP_!X02+10@QTO?QB=&)`X7)
+M="C_`XL/#Z\+BT4(,=+W\8G1B0:%R702_P:+#@^O"XM%"#'2]_&)P8D/6UY?
+MR<.058GE@^Q,5U93BW4(BT4,BU@,QD7'`8L`B47H]@8!=1B#Q/16Z*O]__^#
+MQ!"%P`^%"0$``,9%QP"-1=2)1?2#Q/B-1>A05NC1_?__@\00A<`/A><```"+
+M1=1FB4,,BT789HE#%(M%W(E#$(I%UHA#%H/$_&H(:"0```"-0QA0Z/S___^#
+MQ/QJ!&@L````C4,B4.C\____@\0@@\3XC4,(4%;HWO[__X/$$(7`#X6,````
+M@\3XC47(4/]V;(N&D````/_0@\00A<!U<XM%R(D#BT7,B4,$C4,T4(U#,%"-
+M0RQ0_W7(Z/S___^#Q!"_0$(/`(!]U@!U!;^@A@$`BT7<F?=]V(G!#Z_/BU70
+MB=`QTO?QB<'W)3````")T,'H`XT$@`'`*<&)R/[`B$,7@'W'`'4)@\3T5NC\
+M____,<"-9:A;7E_)PXUV`%6)Y8/L#%=64XM]#(,]``````!U#>C\____A<`/
+MA1L"``"+!SL%`````'(,N!0```#I!P(``(GVBQ>-!)+!X`,IT(TTA0````"#
+MQ/AJ`5;H_/___X/$$(7`#X7>`0``@WT($'=WBT4(_R2%-````)#V!@$/A*\`
+M``"#Q/16Z/S___^#Q!#IG@```(GV]@8(=`N['P```.F5`0``D/8&`708@\3T
+M_[:8````Z/S___^)PX/$$(/[(G4.@\3T5NC*^___B<.#Q!"%VW1=@\3T5NC\
+M____@\00Z4$!``#V!@AT/(/$]/^VF````.C\____@\00A<!T#(/$]%;H_/__
+M_X/$$/8&"'06BT4(2(/X$7<(_R2%>````)#V!@)U"[LW````Z0D!``"0@WT(
+M$@^'Y@```(M%"/\DA<````"#Q/16Z)OU___IQ````(GV@\3T5NC\____Z;0`
+M``")]H/$^/]W#(/$]/\WZ/S___^#Q!!0Z/S____IE````(GV@\3X5U;H[O?_
+M_^F#````D(/$]%;H[_3__^MWD(/$^%=6Z!+X___K:H/$^%=6Z&;Y___K7H/$
+M^%=6Z!+Z___K4H/$^%=6Z%+Z___K1H/$^%=6Z&[Z___K.H/$^%=6Z/;Z___K
+M+H/$^%=6Z$K[___K(H/$^%=6Z)K[___K%H/$^%=6Z.K[___K"H/$^%=6Z*K\
+M__^)PX/$$.L(C78`NP$```"%VW4/@\3X:@!6Z/S___^)P^L+@\3X:@!6Z/S_
+M__^)V(UEZ%M>7\G#C78`58GE@^P05E.#/0``````#X61````O@`````QVX/$
+M]%/H_/___XF&F````(D8Q@8`@\000X'&G````(/[!W;=QP4``````0```.C\
+M____QP4``````````.C\____A<!U1^C\____A<!T"NL\N!\```#K-9`QV[X`
+M````.QT`````<R.0@\3TC48T4.C\____@\00A<!UU4.!QIP````['0````!R
+MWC'`C67H6U[)PY!5B>6#[`Q75E.^`````#'_.ST`````<U^#Q/AJ`5;H_/__
+M_X/$$(7`=3Z#Q/16Z/S___^#Q/16Z/S___^#Q""#Q/3_MI@```#H_/___X/$
+M](U>-%/H_/___X/$((/$]%/H_/___X/$$$>!QIP````[/0````!RH<<%````
+M``````"-9>A;7E_)PY"0D%6)Y5.+30B+70QF#[81BD$!)`/!X`@)PF:)$P^^
+M40&!XOP```#!^@**00(D#V:8P>`&"=!FB4,"#[Y1`H'B\````,'Z!(I!`R0_
+M9IC!X`0)T&:)0P0/OE$#@>+`````P?H&9@^V003!X`()T&:)0P9;R<.058GE
+M5E.+30B+70P/O\,!P`-%$(/`_C'29CG:?1F-=@")SH/F`6:),(/`_F;!^0%F
+M0F8YVGSJ6U[)PXGV58GE5U93BU4,B=$/O\&-!$7^____BUT(`<,Q_[X!````
+M9DEFA=)^&`^W`X/#_F:%P'0""?<!]HG(9DEFA<!_Z`^_QUM>7\G#58GE@^P(
+M@\3T@\3T#[]%"%#HL@$``(G"N/\#```IT)A0Z&H!``"8R<.-=@!5B>6#[!!6
+M4XM%"(M5#(G!B=9FA<!T!6:%TG4$,<#K-H/$]`^_P5#H<`$``(G#@\3T#[_&
+M4.AB`0``C008@\0@9CW_`WX%!0'\__^#Q/284.@/`0``F(UEZ%M>R<.-=@!5
+MB>6#[!13BUT(@\3X@\3T#[]%#%#H6O___YA0#[_;4^A[____F(M=Z,G#D%6)
+MY8/L'%=64V;'1?X``&;'1?C^`8UV`(M%"`^W.(/$]`^_1?A0Z*T```")PV:)
+M7?R+1?@!P(/$$&8]_@-^!04!_/__9@'`9CW^`WX%!0'\__^#Q/284.A\````
+M9HE%^KX!````@\00@\3X#[_;4P^_QHM5"`^_!$)0Z/7^__\QQX/$^%,/OT7\
+M4.CE_O__B<.#Q"!F1F:#_@-^S(/$^`^_1?I0#[_'4.@G____B<(/OT7^BTT,
+M9HD408/$$&;_1?YF_T7X9H-]_@,/CDC___^-9=A;7E_)PU6)Y8M-"#'2N`$`
+M``!F.<I](HGV9@'`9CW_`WX0J`AT!P7Y^___ZP4%"?S__V9"9CG*?."8R<.0
+M58GEBT4(B<%FA<!U"[C_____ZSB8ZS60,<"Z`0```)!F.<IT[V8!TF:!^O\#
+M?A/VP@AT"('"^?O__^L&@<()_/__9D!F/?\#?M8QP,G#B?95B>6#[!Q75E.+
+M11!FB47^9L=%_```9L=%\@``9CE%_`^-(@$``(GV#[]%_(M5#`^W%$)FB57T
+MBTT(#[\$08T$@`'`@\#ZB<=FP?\#C13]`````"G09D=F@_@'=6,/OT7RB?I"
+MBUT49HD40V;_1?*+3?3VP0%T#8M=&&;'!$.``.L+B?:+51AFQP1"``!FP7WT
+M`0^_1?*+311FB3Q!BU7TM@"+71AFB11#9O]%\@^_1?*+5?1FP>H(9HD40^MT
+MB?:Z"````"G"9HE5^K@*````*=`/OUWRBTT49HD\60^_\(M5]&8C%'44````
+M#[_2N`@```")P2GQT^*+11AFB1189O]%\@^_1?2)\=/X9HE%]`^_1?)/BUT4
+M9HD\0P^_5?J+7?1F(QQ5%````(M-&&:)'$%F_T7R9O]%_`^W1?YF.47\#XS@
+M_O__9L=%_```OO____\/MU7R9CE5_'U?C78`#[]-_(M=&&:#/$L`=$`/O]:+
+M710/MP1+9CL$4W429H7V?`V+11@/MPQ(9@D,4.L>1@^_W@^_5?R+310/MP11
+M9HD$68M-&`^W!%%FB0199O]%_`^W7?)F.5W\?*2-1@&86UY?R<.-=@!5B>6#
+M[`B#Q/0/OT4(4.C5_?__,<F#Q!")PL'J"8/B`0'`@.0#"=!F06:#^0A^Z8/$
+M])A0Z'?]__^8R<-5B>6#[#Q75E,QR3'2C78`#[_"BUT(9H,\0P!T`4%F0F:#
+M^@-^ZF:%R74),<#I2`0``(GV9H/Y`P^.U@```(/$^(M5"`^_`E`/OT("4.@>
+M_/__9HE%U(/$^(M-"`^_00)0#[]!!%#H!?S__XG&@\0@@\3XBUT(#[]#!%`/
+MOT,&4.CK^___@\009CEUU`^%@@```&8YQG5]@\3T#[_>4^@)_?__@\009CV>
+M`7]HBU4,9HD"@\3T4^@I^___B<(QVX/$$(GV@\3X#[_"4%#H/_O__XG"@\00
+M0X/["'[H@\3XBTT(#[]!`E"#Q/@/OT744`^_PE#H&/O__X/$$)A0Z`[[__^+
+M71!FB0.X`0```.EH`P``B?:#Q/B+50@/OT($4`^_`E#HZ/K__XG#@\3XBTT(
+M#[]!`E`/OT$"4.C1^O__B=XQQH/$(&:%]@^$T@(``(/$^(M="`^_0P90#[]#
+M`E#HK/K__XG#@\3XBU4(#[]"!%`/OT($4.B5^O__B=HQPH/$(&:%T@^$E@(`
+M`(/$^`^_QE`/O\)0Z-7Z__^)QX/$^(M-"`^_0010#[]!`E#H7OK__XG#@\0@
+M@\3XBU4(#[]"!E`/OP)0Z$7Z__^)VC'"@\009H72#X1&`@``@\3X#[_&4`^_
+MPE#HA?K__XG#@\3X@\3X#[_#4%#H$_K__YA0#[_'4.AH^O__B<*#Q#"#Q/R-
+M1=A0:@H/O\)0Z$'Y__^#Q!!F@WW<``^%]`$```^W1>IFB47TBTW89C--VF:)
+M3?:+1>1F,T7J9HE%^(M5X&8S5>IFB57R#[=%WC-%X#-%Y&:)1>Z+3=@QP6:)
+M3>R+1>@QR&:)1?P/MT7F,=`S1?QFB47Z#[=%XF8S1?IF,T7V,<AFB47P9L=%
+M_@``@\3X:@J-1>Q0Z//X__^)QXGZ@\H!9HE5UH/$^`^_QU`/O]M3Z$SY__^)
+MQX/$((/$^`^_1=904^@Y^?__9HE%UH/$]`^_QU#HQ?K__V:)1=*#Q""#Q/0/
+MOT764.BQ^O__9HE%T(/$$&:!?=*>`0^/$P$``&8]G@$/CPD!```/MTW6,?EF
+MB4W4@\3T#[_?4^B6_/__B<:#Q/A34^C6^/__B<*#Q""#Q/@/O\)0#[_&4.@A
+M^?__B<:#Q/@/OT744`^_QE#HKOC__XG#@\0@9H7;#X2Q````@\3X#[]%UE"+
+M50@/OP)0Z(SX__^)PHM-"&8S40*#Q!!FA=(/A(@```"#Q/@/O\-0#[_"4.C'
+M^/__BUT09HD#@\3T#[]=UE/H"/S__XG&@\0@@\3X4U/H1?C__XG"@\3X#[_"
+M4`^_QE#HD_C__XG&@\0@@\3X#[]%U%`/O\90Z!WX__^)PX/$$&:%VW0D@\3X
+M#[_'4(M5"`^_`E#H`/C__XG"BTT(9C-1`H/$$&:%TG4'N/_____K4H/$^`^_
+MPU`/O\)0Z#CX__^+71!FB4,"BT709CE%TGX<BU4,9HD"#[=-TF:)2@(/MQ,/
+MMT,"9HD#ZP^)]@^W1=*+70QFB0.+5=!FB5,"N`(```"-9;A;7E_)PXGV58GE
+M@^PL5U93BUT(BWT,@\3XC47X4%/H3/;__V8/MD,%9HE%YH/$^(U%\%"-1?A0
+MZ./W__^#Q""#Q/R-1>Q0C47H4(U%\%#H,/O__XG!@\009H7)=08QP.M[B?9F
+MA<E\;S'2#[_!B<,YPGT6C47HD+Z>`0``9BLT4&:)-%!".=I\[H/$](M%%%"+
+M71!3#[_!4(U%[%"-1>A0Z-KX__^(!S'`,=*`/P!^&@^^#XMU$&:!/%8``G\'
+MBUT49C,$4T(YRGSI9CM%YG4'N`$```#K!;@"````C67(6UY?R<.-=@!5B>6#
+M["Q75E.-1>A0C47T4(U%YU#_=0SH_/___X/X`74Z,<F`?><`?C"-1?2)1>"-
+M=>@/OEWGD(T4"8M]X`^_!#HS11`]_P$``'\)BA0RBWT(,!0X03G9?-XQP(UE
+MR%M>7\G#58GE@^Q,5U93QT7(`````(/$](M%"%#H_/___XG"OQH```"#Q/B-
+M1<Q04NC\____B<:#Q""%]G0)@_X:#X7$````BU4,QT(H`````,="#`````#'
+M0A``````,=L['0````!]1X7_=$>#/-T$`````'0LC13=`````+D`````C47(
+M4#'`A?9U`XU%S%"+10Q0BT4(4(L$"O_0B<>#Q!!#.QT`````?02%_W6]A?]U
+M58-]R`!T#X/$](M%R%"+0##_T(/$$(-]$`!T.C';ZP.)]D,['0````!]*XT$
+MW0````"#N`0`````=>=J`&H`BU4,4HM5"%*+@`````#_T(/$$(7`=<R)^(UE
+MJ%M>7\G#B?95B>4QP,G#D%6)Y8/L"(M%"(/$^/]U#/]P'.C\____R<.-=@!5
+MB>6#[!13BU4(BUT0BT44@\3\4(/$_%#_=0Q2BT(@_]"#Q!!04^C\____,<"+
+M7>C)PXGV58GEN!,```#)PXGV58GEN!,```#)PXGV58GE@^P(BT4(@\3\:@!J
+M`/]P'.C\____R<.)]E6)Y8/L'%=64XM]",9%_`"#Q/B+11!0_W<<Z/S___^)
+MP\9%^P"#Q!#&1?K_@WT,`'0$QD7Z\#'VBD7ZB`0>B`0>A?9U!8H#B$7[@WT,
+M`'084VB0````BT40`?!05XM%#/_0@\00ZP60Q@0>D(7V=0B*`XA%_.LMD(H$
+M'CI%_'4'B@,X1?MT'8I%_,'@"(H4'F8/MM()T&:)!XI%^H@$'NL/C78`BD7Z
+MB`0>1H/^#GZ(C4;_A<9T"6;'!P``ZP6)]HEW$(UEV%M>7\G#D%6)Y8/L#%=6
+M4XM]",9%__^#?0P`=`3&1?_P@\3\:@"+11!05XM'(/_0B<:#Q!"#?0P`=!16
+M:)````!J`%>+10S_T(/$$.L$D,8&D,='#`````")]H/$_&H`BT<,#Z]'"`-%
+M$%!7BT<@_]")QH/$$(-_#`!^&8H&B<+!X@B+1Q"*!#`E_P````G"9CL7='6#
+M?PP`#Y3`#[;8.U\0?5.-=@"#?0P`=!Y6:)````"+1PP/KT<(`T40`=A05XM%
+M#/_0@\00ZP3&!#.0B@0SB<+!X@B)V`-'$(H$,"7_````"<)F.Q=U'XI%_X@$
+M,T,[7Q!\L(M'$`%'#(%_#,\'```/CE'___^#Q/QJ`(M%$%!7BT<@_]")QHI%
+M_X@&,<"#?PP`=06X&@```(UEZ%M>7\G#B?95B>6#[!13BT4(@\3X:@#_<!SH
+M_/___XG!B@&(1?NS`(3`=0*S_\=%_`````"+1?R('`B+1?R*!`@/MM`/OL,Y
+MPG0%,<#K#Y"+1?R*5?N(%`BX`0```(M=Z,G#D%6)Y8/L#%=64XM%"(MU#+\:
+M````B48<@\3T4.C\____@\3T_W8<Z/S___^#Q""%P`^%GP```(/$]%;H9?__
+M_X/$$(7`#X6&````9L<&``#&1@(`QT84`````,=&(#Q4``#'1B185```QT8H
+MC%0``,=&+)A4``#'1C"D5```,=L['0````!])(7_="20@\3T5HL$G0````#_
+MT(G'@\000SL=`````'T$A?]UX87_=04QP.LBD,=&"```$`#'1@0`$```QT8,
+M`0```,=&$`$```"X&@```(UEZ%M>7\G#D)"058GEBTT(BU4,B=!FP>@(B$$!
+MB!')PXGV58GEBT4(9@^V4`'!X@AF#[8``<(/M\+)PXUV`%6)Y8/L$%93BW4(
+MBUT,@\3X#[?#4%;H_/___X/$^,'K$%.#Q@)6Z/S___^-9>A;7LG#B?95B>6#
+M[!!64XM="(/$]%/H_/___XG&@\3T@\,"4^C\____#[?6P>`0`<*)T(UEZ%M>
+MR<.058GE@^P(BT4(@\3\_W44BT`8BT`H`T4,4/]U$.C\____R<.058GE@^P(
+MBT4(@\3\_W40_W4,BU`8BT(D`T(H4.C\____R<.058GE@^P(BU4(@\3\_W4,
+M#[9%$%"+4AB+0B0#0BA0Z/S____)PY"0D%6)Y8M%"(L`R<.)]E6)Y8M%",'@
+M`RM%",'@!`5@!@``R<.)]E6)Y8M%",'@`HN`X`D``,G#C78`58GE@^P(BT4(
+M@\3T4(M`9/_0R<-5B>6#[!13BUT(@WM@`'0)@\3T4XM#8/_0QT,(`````(M=
+MZ,G#C78`58GE@^P44XM="(/$]%.+0T#_T(/$$(7`=0['0P@!````N!4```#K
+M)X-[8`!T%(/$]%.+0V#_T(7`=`?'0P@!````,<"#>P@`=`6X(@```(M=Z,G#
+M58GE@^P05E.[8`8``#'V.S4`````#X.B````D(/$^&CZ````4^C\____@\3X
+M:A!3Z/S___^#Q""#Q/AJ`E/H_/___\=#"`````"#Q/1H$`(``.C\____B02U
+MX`D``(/$((7`=0>X/P```.M3@\3T4XM#5/_0@\00A<!U0X/$]%.+0U#_T,=#
+M&`````#'0Q``````@\3T4XM#2/_0QT,4`````,=##`````"#Q"!&@\-P.S4`
+M````#X)?____,<"-9>A;7LG#B?95B>6+10B+0"S)PY!5B>6#[`Q75E.+=0B+
+M?0R!?BS_?P``=0R#Q/16BT98_]"#Q!"+1C3WV(G[(</!ZPPY7BQT%(/$^%-6
+MBT9<_]")7BS'1AP!````BT8T2"'X`T8PC67H6UY?R<.)]E6)Y8M5"(M%#(E"
+M/,="+/]_``#)PXUV`%6)Y8M5"(M%#(E".,="+/]_``#)PXUV`%6)Y8M%"(M5
+M#,'B#(E0-(M0*,'B#(E0,,=`+/]_``#)PXUV`%6)Y8/L"(M%"(-]#`!U#8/$
+M]%#H_/___^L0B?;'0"S_?P``QT`<`0```,G#58GE@^P44XM="/]##(-[%`!U
+M'8/$]%.+0T3_T(/$$(-[(`!T"X/$]/]S)(M#(/_0QT,4`@```(M=Z,G#58GE
+MBT4(@W@,`'X#_T@,R<.-=@!5B>6#[!13BUT(_T,0@WL8`'4-@\3T4XM#3/_0
+MA<!U"<=#&`(````QP(M=Z,G#B?95B>6+10B#>!``?@/_2!#)PXUV`%6)Y8M%
+M"(M5#(M-$(E0((E(),G#58GE@^P44XM="(-[8`!U'8-["`!U%X/$]%.+0T#_
+MT(/$$(7`=0?'0P@!````@WL0`'57@WL8`G4+QT,8`0```.L;B?:#>Q@!=1/'
+M0Q@`````@\3T4XM#4/_0@\00@WL,`'4G@WL4`G4+QT,4`0```.L8B?:#>Q0!
+M=1#'0Q0`````@\3T4XM#2/_0BUWHR<.058GE@^P(BT4(@WAH`'0,@\3X_W4,
+M4(M`:/_0,<#)PY!5B>6#[!13BUT(@\3X:@!3Z/S___^#Q/13Z/S___^#Q""#
+MQ/AJ`%/H_/___X/$]%.+0VS_T(/$((/$](L#P>`"_[#@"0``Z/S___^+7>C)
+MPTTM4WES=&5M<R!$:7-K3VY#:&EP`````$%.04Y$````@8"`@$9R965"4T0`
+M-"XQ`,W,S,PT10``H$4``*!%``"@10``-$4``*!%``"@10``H$4``*!%``"@
+M10``4$4``%!%``!010``4$4``.Q%``"@10``-$4``.Q%``#L10``[$4``-Q%
+M``#L10``[$4``-Q%``#L10``W$4``-Q%``#<10``W$4``-Q%``#<10``[$4`
+M`-Q%``#<10``[$4```!&```01@``Y48``-Q&``!01@``7$8``&A&``!T1@``
+M@$8``(Q&``"81@``I$8``+!&``"\1@``($8``$!&``#<1@``W$8``,A&````
+M`````````````````````````````````````!%5_P````!550``````````
+M``````$``P`'``\`'P`_`'\`_P``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````6T%335]&24Q%7T5.1%U'0T,Z("AC*2`R+CDU+C,@,C`P,3`S
+M,34@*')E;&5A<V4I``!;05--7T9)3$5?14Y$74=#0SH@*&,I(#(N.34N,R`R
+M,#`Q,#,Q-2`H<F5L96%S92D``%M!4TU?1DE,15]%3D1=1T-#.B`H8RD@,BXY
+M-2XS(#(P,#$P,S$U("AR96QE87-E*0``6T%335]&24Q%7T5.1%U'0T,Z("AC
+M*2`R+CDU+C,@,C`P,3`S,34@*')E;&5A<V4I``!;05--7T9)3$5?14Y$74=#
+M0SH@*&,I(#(N.34N,R`R,#`Q,#,Q-2`H<F5L96%S92D``%M!4TU?1DE,15]%
+M3D1=1T-#.B`H8RD@,BXY-2XS(#(P,#$P,S$U("AR96QE87-E*0``6T%335]&
+M24Q%7T5.1%U'0T,Z("AC*2`R+CDU+C,@,C`P,3`S,34@*')E;&5A<V4I``!;
+M05--7T9)3$5?14Y$74=#0SH@*&,I(#(N.34N,R`R,#`Q,#,Q-2`H<F5L96%S
+M92D``%M!4TU?1DE,15]%3D1=1T-#.B`H8RD@,BXY-2XS(#(P,#$P,S$U("AR
+M96QE87-E*0``6T%335]&24Q%7T5.1%U'0T,Z("AC*2`R+CDU+C,@,C`P,3`S
+M,34@*')E;&5A<V4I``!;05--7T9)3$5?14Y$74=#0SH@*&,I(#(N.34N,R`R
+M,#`Q,#,Q-2`H<F5L96%S92D``%M!4TU?1DE,15]%3D1=1T-#.B`H8RD@,BXY
+M-2XS(#(P,#$P,S$U("AR96QE87-E*0``6T%335]&24Q%7T5.1%U'0T,Z("AC
+M*2`R+CDU+C,@,C`P,3`S,34@*')E;&5A<V4I``!;05--7T9)3$5?14Y$74=#
+M0SH@*&,I(#(N.34N,R`R,#`Q,#,Q-2`H<F5L96%S92D`"``````````!````
+M,#$N,#$````(``````````$````P,2XP,0````@``````````0```#`Q+C`Q
+M````"``````````!````,#$N,#$````(``````````$````P,2XP,0````@`
+M`````````0```#`Q+C`Q````"``````````!````,#$N,#$````(````````
+M``$````P,2XP,0````@``````````0```#`Q+C`Q````"``````````!````
+M,#$N,#$````(``````````$````P,2XP,0````@``````````0```#`Q+C`Q
+M````"``````````!````,#$N,#$````(``````````$````P,2XP,0`````N
+M<WEM=&%B`"YS=')T86(`+G-H<W1R=&%B`"YT97AT`"YR96PN=&5X=``N<F]D
+M871A`"YR96PN<F]D871A`"YD871A`"YB<W,`+F-O;6UE;G0`+FYO=&4`````
+M`````````````````````````````````````````````````````!L````!
+M````!@`````````T````)%T`````````````!``````````A````"0``````
+M````````$'0``/`'```*`````0````0````(````*P````$````"````````
+M`%A=```,`0`````````````$`````````#,````)````````````````?```
+ML`$```H````#````!`````@````_`````0````,`````````@%X``&`%````
+M`````````"``````````10````@````#`````````.!C````"@``````````
+M```@`````````$H````!``````````````#@8P``O`(``````````````0``
+M``````!3````!P``````````````G&8``!@!``````````````$`````````
+M$0````,``````````````+1G``!9```````````````!``````````$````"
+M``````````````#P:0``\`4```L```!2````!````!`````)`````P``````
+M````````X&\``"X$``````````````$`````````````````````````````
+M``````````````````,``0`````````````````#``(`````````````````
+M`P`#``````````````````,`!``````````````````#``4`````````````
+M`````P`&``````````````````,`!P`````````````````#``@`````````
+M`````````P`)``````````````````,`"@`````````````````#``L``0``
+M`+1<```?`````@`!`!@````\60``%`````(``0`I````H%H``%H````"``$`
+M+P```"P[```;`````@`!`#H```!@6```,P````(``0!'````+%@``#(````"
+M``$`4@```$0````4`````0`%`%L```#<6```)0````(``0!B````7`````0`
+M```!``4`<````"A9```1`````@`!`'L````0````!`````$`!0"$````4%L`
+M`"P````"``$`E````+A8```C`````@`!`)T````X/P``G@````(``0"N````
+M!%D```H````"``$`NP```(Q!```+`````@`!`,P````D4P``#@$```(``0#4
+M````_%H``!4````"``$`Z````,!4``#+`````@`!`/@````07```%`````(`
+M`0`-`0``S%D``,8````"``$`&P$``,P"```*`````@`!`"<!``!@````!```
+M``$`!0`O`0``G!\``(0````"``$`/@$``-1<``!0`````@`!`$L!``!4&@``
+M%P````(``0!7`0``6`````0````!``4`9@$``'Q;```\`````@`!`'`!``"X
+M6P``$0````(``0!^`0``P%(``&0````"``$`CP$``!!9```6`````@`!`)H!
+M```,1P``KP````(``0"A`0``;"4``&X!```"``$`N`$``"P````$`````0`%
+M`,,!```P.@``/P````(``0#2`0``%%L``!4````"``$`XP$``+Q'``")````
+M`@`!`.H!```D7```CP````(``0#\`0``$%@``!D````"``$`!0(``)18```C
+M`````@`!``T"```,````!`````$`!0`;`@``_%L``!$````"``$`*0(``&PU
+M``"=`0```@`!`#4"``!060``)0````(``0!(`@``?"```.T````"``$`60(`
+M`"Q;```A`````@`!`&D"``#$1```10(```(``0!P`@``Q`(```4````"``$`
+M?`(``!Q#``!?`````@`!`(P"``#X5P``%@````(``0"3`@``&%<``-T````"
+M``$`HP(``&0````8`````0`%`*L"``!P.@``O`````(``0"S`@``0`````0`
+M```!``4`PP(``(````#@!````0`%`,@"``#@40``W0````(``0#4`@``X`(`
+M`!`````"``$`X@(``/`"```%`````@`!`.\"````.@``+P````(``0`!`P``
+MS%L``"X````"``$`"P,``(Q5```N`0```@`!`!<#``!X60``5`````(``0`D
+M`P```````"\````"``$`.0,``)1:```+`````@`!`$T#``!H,@``%0````(`
+M`0!;`P``V`(```4````"``$`:0,``!@E``!4`````@`!`'@#```H````!```
+M``$`!0"!`P``F`X```4!```"``$`BP,``#14```'`````@`!`)0#````````
+M`````!````"A`P`````````````0````K`,`````````````$````+D#``!`
+M`@``<````!(``0##`P`````````````0````T`,```@"```<````$@`!`-L#
+M``!@`0``J````!(``0#F`P``L`(``!,````2``$`\@,``"0"```<````$@`!
+M`/X#`````````````!`````+!``````````````0````%P0``'@```#F````
+M$@`!`"($```P````1P```!(``0``=7!D871E4V]C:V5T4&%R86UE=&5R<P!F
+M;%=R:71E4')O=&5C=&5D`&9L36%P`&9I;F1396-T;W(`9G)O;55.04Q,3TY'
+M`'1O54Y!3$Q/3D<`;71D5&%B;&4`9&]C<V5T`&UY7VQO=V%D9')E<W,`9FQ"
+M=69F97)/9@!I;FET1&]N90!F;%-O8VME=%-E=$)U<WD`9&]C=W)I=&4`<F5P
+M;&%C949!5'-E8W1O<@!F;%-O8VME=$YO3V8`9&ES;6]U;G1,;W=,979E;`!F
+M;$UO=6YT`&9L4V5T5VEN9&]W0G5S5VED=&@`9FQ);G1E;$ED96YT:69Y`&9L
+M4V5T4&]W97)/;D-A;&QB86-K`&9L26YI=%-O8VME=',`9FQ486ME375T97@`
+M;F]/9E1,<P!F;%)E9VES=&5R3D943`!F;$5X:713;V-K970`9V5T06YA;F12
+M96,`;7E?:&EG:&%D9')E<W,`9FQ.965D5F-C`&9L1&]N=$YE96168V,`9FQ#
+M:&5C:T%N9$9I>$5$0P!F;%-O8VME=$]F`&9L26YI=`!F;$1O8U=I;F1O=T)A
+M<V5!9&1R97-S`&YO3V9$<FEV97,`9&ES;6]U;G16;VQU;64`9FQ39717:6YD
+M;W=3<&5E9`!F;$5X:70`9FQ);G1E<G9A;%)O=71I;F4`9G)O;55.04P`9&]C
+M<F5A9`!F;$US96-#;W5N=&5R`&9L1&]N=$YE9616<'``<F5A9$9L87-H240`
+M9FQ297-E=$-A<F1#:&%N9V5D`&9L4F5G:7-T97)$3T-33T,`9FQ39717:6YD
+M;W=3:7IE`&)D0V%L;`!F;$9R965-=71E>`!F;$)U:6QD1V5O;65T<GD`=&]5
+M3D%,`&9L261E;G1I9GE&;&%S:`!T;%1A8FQE`'-E=$)U<WD`9&%T845R<F]R
+M3V)J96-T`'9O;',`9FQ$96-O9&5%1$,`9FQ#<F5A=&5-=71E>`!F;%-Y<V9U
+M;DEN:70`9FQ296=I<W1E<D1/0S(P,#``9FQ.965D5G!P`&9L26YT96Q3:7IE
+M`&9L365D:6%#:&5C:P!F;%)E9VES=&5R0V]M<&]N96YT<P!F;$=E=$UA<'!I
+M;F=#;VYT97AT`&=E=$Y&1$,R,59A<G,`9FQ$96QE=&5-=71E>`!C:&5C:U=I
+M;D9O<D1/0P!N;T]F351$<P!S=V%P56YI=',`;F]&;W)M870`9&]C,FM?;65M
+M<V5T`&1O8S)K7V9R964`9&]C,FM?;65M8W!Y`&1O8S)K7W)W90!D;V,R:U]M
+M86QL;V,`9&]C,FM?;W!E;@!D;V,R:U]S:7IE`&1O8S)K7W-L965P`&1O8S)K
+M7V-L;W-E`&1O8S)K7VUE;6-M<`!D;V,R:U]D96QA>0!D;V,R:U]I;F9O`&1O
+M8S)K7W!R;V)E````"P````$F```1`````10``!8````".```(@````)&```G
+M`````B,``#T````!%```0P````$F``!)`````08``$\````!!@``5P````(K
+M``!D`````2T``)`````"4@``I`````(Z``##`````0,``((!```".@``'@(`
+M``(Z```Z`@```CH``'X"```".@``C@(```(Z``">`@```CH``+T"```"7```
+M*04```$%```>"0```AH``"0)```"%0``5PD```)6``!I"0```E8``$(4```!
+M00``,A@```)0``#S&0```E,```<:```"4P``*1H```)3```]&@```E,``&4:
+M```!!@``LAH```$&``#)&@```E(``#T;```!`P``0QL```);``"Q&P```0,`
+M`+<;```"6P``Z1L```(0``!='````A```*@>```!`0``KQX```$!``"V'@``
+M`0$``+T>```!`0``Q!X```$!``#+'@```0$``-(>```!`0``\!X```)6```W
+M'P```E8``%P?```!`P``I!\```$B``"U'P```2(``+X?```!/P``PA\```$!
+M``#('P```3\``,P?```!40``TA\```$B``#9'P```08``-X?```!!@``XQ\`
+M``$&``#H'P```08``(H@```!+0``H"````$M``"Q(````2T``+8@```"*@``
+MO2````$M``#*(````CD``-P@```"+```[2````$!``#T(````0$``/L@```!
+M`0```B$```$!```)(0```0$``!`A```!`0``%R$```$!```>(0```0$``"4A
+M```!`0``+"$```$!```Z(0```0$``$$A```!+0``1R$```$M``#>(P```ED`
+M`*XD```"#@``DB4```$%``":)0```04``*8E```!!0``NB4```$%``#$)0``
+M`04``,PE```!!0``TB4```$%``#>)0```04``"@F```!!0``?28```$%``"'
+M)@```04``!\H```"#@``JB@```(S``#-*````C,```DI```"&```/RD```(3
+M``#_*@```@T``,PL```",P``\2P```$%```]+P```C,``&0O```"*0``AC``
+M``(-``!W,@```08``,PU```"7```&#8```)<```J-P```AH``#DW```!!@``
+M2C<```(:``!0-P```A4``'8W```"'0``AC<```(O``#`-P```@X``"$Y```"
+M-@``S3D```$!``#4.0```0$``-LY```!`0``XCD```$!```%.@```4\```TZ
+M```!3P``%CH```$2```:.@```0$``"`Z```!3P``23H```))``"+.@```B$`
+M`*PZ```"%P``NCH```(G````.P```B@``!`[```"%P``'SL```([``!7.P``
+M`BX``&X[```!0@``?3L```(<``#X.P```@\```L\```!00``F#P```(0``"P
+M/````A```/0\```"#P``#CT```%!``!(/0```C(``)D]```",@``NST```(R
+M``"Q/@```@\``+T^```!00``USX```)4```0/P```E(``$T_```"#P``7#\`
+M``%!``"U/P```@\``"1````"&0``M$````%!```=00```@\``"U!```!00``
+M:4$```(^``#R0P```0,``/M#```"5```!40```$#```.1````E0``&%$```"
+M/```D40```$#``"S1````AL``-)$```!%@``VD0```(K``#J1````2T```E%
+M```!0@``%$4```)````O10```0,``$)%```"&P``;T4```))``"410```AL`
+M`*]%```"20``OT4```(N``#710```0,``/Q%```!`P``%48```(N```L1@``
+M`BH``#5&```"#```[$8```)```#[1@```D```!9'```!%@``(D<```%"```M
+M1P```BH``$U'```!%@``5D<```)%``!<1P```2(``&5'```"2@``;D<```(@
+M``"#1P```4(``(E'```!+0``F$<```)$``"L1P```2T``,9'```!0@``SD<`
+M``$M``#;1P```D```.M'```"+@``]$<```(;```%2````B0``!%(```".P``
+M'4@```)-```M2````2T``#5(```!%@``/TP```$%``!_3````04``-E2```"
+M0P``/%,```(J``!04P```CX``()3```!(@``CU,```$_``">4P```3\``,53
+M```!(@``]U,```$B```&5````3\``!M4```!/P``3U0```(.``!_5````E0`
+M`+A4```"'P``VU0```(.``#/5@```@X``#17```"-P``/U<```))``!U5P``
+M`0$``'Q7```!`0``@U<```$!``"*5P```0$``)%7```!`0``F5<```%/``"K
+M5P```1(``+E7```!3P``0U@```(]``!36````CT``'!8```",@``?E@```(R
+M``"Q6````E0``-58```"5```^U@```)2```@60```08``#-9```!!@``U5D`
+M``$&``#=60```2T``/)9```"+P``_5D```(=```+6@```CD``!]:```"5@``
+M)EH```$&``!_6@```2T``&1;```",0``Y5P```(.``#N7````B@``/Q<```"
+M%P``%ET```$&```;70```E,``#0````!`0``.`````$!```\`````0$``$``
+M```!`0``1`````$!``!(`````0$``$P````!`0``4`````$!``!4`````0$`
+M`%@````!`0``7`````$!``!@`````0$``&0````!`0``:`````$!``!L````
+M`0$``'`````!`0``=`````$!``!X`````0$``'P````!`0``@`````$!``"$
+M`````0$``(@````!`0``C`````$!``"0`````0$``)0````!`0``F`````$!
+M``"<`````0$``*`````!`0``I`````$!``"H`````0$``*P````!`0``L```
+M``$!``"T`````0$``+@````!`0``O`````$!``#``````0$``,0````!`0``
+MR`````$!``#,`````0$``-`````!`0``U`````$!``#8`````0$``-P````!
+M`0``X`````$!``#D`````0$``.@````!`0``[`````$!``#P`````0$``/0`
+M```!`0``^`````$!``#\`````0$````!```!`0``!`$```$!```(`0```0$`
+!```!
+`
+end
diff --git a/sys/contrib/dev/fla/msysosak.h b/sys/contrib/dev/fla/msysosak.h
new file mode 100644
index 0000000..11d4c51
--- /dev/null
+++ b/sys/contrib/dev/fla/msysosak.h
@@ -0,0 +1,135 @@
+/*-
+SOFTWARE LICENSE AGREEMENT
+
+IMPORTANT! READ CAREFULLY:
+THIS SOFTWARE LICENSE AGREEMENT (the ``Agreement'') is a legal
+agreement between you (either an individual or a single entity) and
+M-Systems Flash Disk Pioneers Ltd. ("M-Systems").
+This Agreement relates to the M-Systems' software accompanying this
+Agreement, which includes computer software and may include associated
+media, printed materials, and ``online'' or electronic documentation
+(the ``Licensed Software'').
+By downloading, installing, copying, or otherwise using the Licensed
+Software, you agree to be bound by the terms of this Agreement.
+If you do not agree to the terms of this Agreement, do not install,
+copy or use the Licensed Software.
+
+The Licensed Software is protected by copyright laws and international
+copyright treaties, as well as other intellectual property laws and
+treaties. The Licensed Software is licensed, not sold.
+The Licensed Software is being provided solely for use with M-Systems'
+DiskOnChip® product lines.
+1. License Grant.
+(a) Grant of License. Subject to the terms and conditions of this
+ Agreement, M-Systems hereby grants you a nonexclusive,
+ royalty-free, worldwide license (including the right to
+ sublicense) to use, copy and distribute the Licensed Software
+ with M-Systems DiskOnChip® products.
+(b) Restrictions on Use. The Licensed Software is licensed solely
+ for use with and to support M-Systems' DiskOnChip® products.
+ Use of this Licensed Software with, or to support, any other
+ flash disk, flash card, resident flash array or solid state
+ disk of any kind is expressly prohibited, and constitutes an
+ illegal infringement of M-Systems' patent, copyright and other
+ rights in and to the Licensed Software.
+2. Limitations on Reverse Engineering, Decompilation, and
+ Disassembly. You may not reverse engineer, decompile, or
+ disassemble the Licensed Software, except and only to the
+ extent that such activity is expressly permitted by applicable
+ law notwithstanding this limitation.
+3. Termination. Without prejudice to any other rights, M-Systems
+ may terminate this Agreement if you fail to comply with the
+ terms and conditions of this Agreement. In such event, you must
+ destroy all copies of the Licensed Software and all of its
+ component parts.
+4. Intellectual Property Rights. Title to the Licensed Software,
+ and all rights with respect to the Software not specifically
+ granted under this Agreement, including without limitation
+ all rights of modification, disassembly and decompilation and
+ all copyright, patent, trademark, trade secret and other
+ proprietary rights and interests are reserved to M-Systems.
+ You may not remove or alter the "README" or "COPYRIGHT" files
+ or copyright notices in the Licensed Software.
+5. DISCLAIMER OF WARRANTIES. To the maximum extent permitted by
+ applicable law, M-Systems and its suppliers provide the Product
+ and any (if any) support services related to the Product
+ ("Support Services") AS IS AND WITH ALL FAULTS, and hereby
+ disclaim all warranties and conditions, either express,
+ implied or statutory, including, but not limited to, any
+ (if any) implied warranties or conditions of merchantability,
+ of fitness for a particular purpose, of lack of viruses, of
+ accuracy or completeness of responses, of results, and of lack
+ of negligence or lack of workmanlike effort, all with regard
+ to the Product, and the provision of or failure to provide
+ Support Services. ALSO, THERE IS NO WARRANTY OR CONDITION OF
+ TITLE, QUIET ENJOYMENT, QUIET POSSESSION, CORRESPONDENCE TO
+ DESCRIPTION OR NON-INFRINGEMENT, WITH REGARD TO THE PRODUCT.
+ THE ENTIRE RISK AS TO THE QUALITY OF OR ARISING OUT OF USE OR
+ PERFORMANCE OF THE PRODUCT AND SUPPORT SERVICES, IF ANY,
+ REMAINS WITH YOU.
+6. EXCLUSION OF INCIDENTAL, CONSEQUENTIAL AND CERTAIN OTHER
+ DAMAGES. To the maximum extent permitted by applicable law,
+ in no event shall M-Systems or its suppliers be liable for
+ any special, incidental, indirect, or consequential damages
+ whatsoever (including, but not limited to, damages for loss
+ of profits or confidential or other information, for business
+ interruption, for personal injury, for loss of privacy, for
+ failure to meet any duty including of good faith or of
+ reasonable care, for negligence, and for any other pecuniary
+ or other loss whatsoever) arising out of or in any way related
+ to the use of or inability to use the Product, the provision
+ of or failure to provide Support Services, or otherwise under
+ or in connection with any provision of Agreement, even in the
+ event of the fault, tort (including negligence), strict
+ liability, breach of contract or breach of warranty of
+ M-Systems or any supplier, and even if M-Systems or any
+ supplier has been advised of the possibility of such damages.
+7. LIMITATION OF LIABILITY AND REMEDIES. Notwithstanding any
+ damages that you might incur for any reason whatsoever
+ (including, without limitation, all damages referenced above
+ and all direct or general damages), the entire liability of
+ M-Systems and any of its suppliers under any provision of this
+ Agreement and your exclusive remedy for all of the foregoing
+ shall be limited to the greater of the amount actually paid by
+ you for the Product or U.S.$5.00. The foregoing limitations,
+ exclusions and disclaimers shall apply to the maximum extent
+ permitted by applicable law, even if any remedy fails its
+ essential purpose.
+8. Miscellaneous
+ The laws of the State of California, United States of America,
+ exclusive of conflict-of-laws provisions, shall govern this
+ Agreement in all respects.
+*/
+
+#ifndef MSYSOSAK_H
+#define MSYSOSAK_H 1
+
+struct doc2k_stat {
+ unsigned short type;
+ long unitSize;
+ long mediaSize;
+ long chipSize;
+ int interleaving;
+ unsigned long window;
+
+ /* Non-OSAK members Below this point */
+ char *product;
+ char model[40];
+};
+
+enum doc2k_work { DOC2K_READ, DOC2K_WRITE, DOC2K_ERASE };
+
+int doc2k_probe(int drive, unsigned lowaddr, unsigned highaddr);
+int doc2k_info(int drive, struct doc2k_stat *info);
+int doc2k_size(int drive, unsigned *capacity, unsigned *ncyl, unsigned *nhead, unsigned *nsect);
+int doc2k_open(int drive);
+int doc2k_close(int drive);
+int doc2k_rwe(int drive, enum doc2k_work what, unsigned block, unsigned len, void *ptr);
+void doc2k_memcpy(void *dst, const void *src, unsigned len);
+void doc2k_memset(void *dst, int c, unsigned len);
+int doc2k_memcmp(const void *dst, const void *src, unsigned len);
+void *doc2k_malloc(int bytes);
+void doc2k_free(void *ptr);
+void doc2k_delay(unsigned usec);
+
+#endif
diff --git a/sys/contrib/dev/fla/patch.00 b/sys/contrib/dev/fla/patch.00
new file mode 100644
index 0000000..90841e6
--- /dev/null
+++ b/sys/contrib/dev/fla/patch.00
@@ -0,0 +1,23 @@
+Index: files.i386
+===================================================================
+RCS file: /home/ncvs/src/sys/i386/conf/files.i386,v
+retrieving revision 1.220.2.8
+diff -u -r1.220.2.8 files.i386
+--- files.i386 1999/05/27 03:06:33 1.220.2.8
++++ files.i386 1999/08/01 12:44:00
+@@ -34,6 +34,13 @@
+ no-obj no-implicit-rule before-depend \
+ clean "ukbdmap.h"
+ #
++contrib/dev/fla/fla.c optional fla
++msysosak.o optional fla \
++ dependency "$S/contrib/dev/fla/i386/msysosak.o.uu" \
++ compile-with "uudecode < $S/contrib/dev/fla/i386/msysosak.o.uu" \
++ no-implicit-rule
++
++#
+ dev/fb/fb.c optional fb device-driver
+ dev/fb/fb.c optional vga device-driver
+ dev/fb/splash.c optional splash
+
+
diff --git a/sys/contrib/dev/fla/prep.fla.sh b/sys/contrib/dev/fla/prep.fla.sh
new file mode 100644
index 0000000..5d27717
--- /dev/null
+++ b/sys/contrib/dev/fla/prep.fla.sh
@@ -0,0 +1,45 @@
+#!/bin/sh
+# $FreeBSD$
+
+dev=fla0
+
+grep "$dev.*sectors" /var/run/dmesg.boot | tr -d '(:)' | awk '
+ {
+ v = $3
+ c = $5
+ h = $7
+ s = $9
+ ss = c * h * s - s
+
+ print "#",$0 > "_"
+ print "g c"c" h"h" s"s > "_"
+ print "p 1 165",s,ss > "_"
+ print "a 1" > "_"
+
+ print "#",$0 > "__"
+ print "type: ESDI" > "__"
+ print "disk:", $1 > "__"
+ print "label:" > "__"
+ print "flags:" > "__"
+ print "bytes/sector: 512" > "__"
+ print "sectors/track:", s > "__"
+ print "tracks/cylinder:", h > "__"
+ print "sectors/cylinder:", s * h > "__"
+ print "cylinders:", c > "__"
+ print "sectors/unit:", ss > "__"
+ print "rpm: 3600" > "__"
+ print "interleave: 1" > "__"
+ print "trackskew: 0" > "__"
+ print "cylinderskew: 0" > "__"
+ print "headswitch: 0 # milliseconds" > "__"
+ print "track-to-track seek: 0 # milliseconds" > "__"
+ print "drivedata: 0 " > "__"
+ print "8 partitions:" > "__"
+ print "# size offset fstype [fsize bsize bps/cpg]" > "__"
+ print "a:",ss,"0 4.2BSD 512 4096 " > "__"
+ print "c:",ss,"0 unused 0 0" > "__"
+ }
+'
+fdisk -f _ -i -v $dev
+disklabel -BrR ${dev} __
+newfs /dev/r${dev}a
diff --git a/sys/contrib/dev/oltr/COPYRIGHT b/sys/contrib/dev/oltr/COPYRIGHT
new file mode 100644
index 0000000..668a641
--- /dev/null
+++ b/sys/contrib/dev/oltr/COPYRIGHT
@@ -0,0 +1,62 @@
+The oltr driver uses objects and microcode from Olicom's
+OC-3300 PowerMACH Works Kit.
+
+As the Linux driver says..
+==================================================================
+*
+* This driver uses the Token Ring Low Level Driver (TRlld,
+* PowerMach Works) as the lower level driver. The PMW kit is
+* (C) Olicom. The executable object may be distributed along
+* with this driver for the purpose of linking this driver.
+*
+=================================================================
+The low level driver is combined with a FreeBSD specific driver
+supplied in source, which provides all OS dependent functions.
+
+files from olicom are:
+
+trlld.o - Olicom low-level driver interface
+
+trlldmac.o - TMS 380 Microcode for Olicom TMS380 based cards
+trlldbm.o - "bullseye" Microcode for Olicom "bullseye" based cards
+trlldhm.o - "hawkeye" Microcode for Olicom "hawkeye" based cards
+
+The file trlld.o is stored in uuencode format as trlld.o.uu
+It represents a state machine of some kind that has no OS dependencies
+and communicates with the firmware on the cards via a proprietary interface.
+All communication with this module is achieved via functions supplied in
+the FreeBSD specific driver.
+
+The other 3 files have been encoded using file2c(1)
+and represent only microcode to be loaded into the appropriate board
+when found.
+
+Here is the release notice from Olicom regarding these files:
+-------------------------------------------------------------------------------
+OC-3300 PowerMach Works and its components are wholly owned products of
+Olicom A/S
+Nybrovej 114
+2800 Lyngby
+Denmark
+(45) 45 27 00 00
+and are used and distributed with permission. (#SS022499)
+-------------------------------------------------------------------------------
+
+A supporting email is also included.
+---------- Forwarded message ----------
+Date: Wed, 24 Feb 1999 17:07:14 +0100
+From: Starla Scott <sscott@olicom.com>
+To: 'Larry Lile' <lile@stdio.com>
+Subject: RE: FreeBSD Token-ring driver
+
+Larry,
+
+You may freely distribute the driver and/or kit. However, we do request that
+you include an acknowledgement of Olicom's copyright and ownership as
+related to your driver.
+
+Thanks,
+Starla
+Olicom Tech Support
+------------------------------------------------------------------------------
+
diff --git a/sys/contrib/dev/oltr/i386-elf.trlld.o.uu b/sys/contrib/dev/oltr/i386-elf.trlld.o.uu
new file mode 100644
index 0000000..02fabcd
--- /dev/null
+++ b/sys/contrib/dev/oltr/i386-elf.trlld.o.uu
@@ -0,0 +1,1850 @@
+begin 644 trlld.o
+M?T5,1@$!`0````````````$``P`!``````````````#<0@$``````#0`````
+M`"@`"P`'`````````````````(/L%%>+?"0<5E-5BT0D+"7__P``@\`$B]@E
+M__\``%#_5QR+\('C__\``$.!X___``!3_U<<P>`(@\0(9@OP@>;__P``9O?&
+M`0!FB70D(`^%>`(``(M$)"PE__\``%#_5QR(1"0G@\0$BT0D+"7__P``@\`"
+MB]@E__\``%#_5QR+\('C__\``$.!X___``!3_U<<BU0D*(/$",'@"('B__\`
+M`&8+\(M$)"`E__\``('F__\``(/``H/""HOH)?__```[P@^-\0```(M$)"PE
+M__\``(/`!&:+\(M$)"`E__\``(/`"HE$)!B+QB7__P``4/]7'(O8B\8E__\`
+M`$`E__\``%#_5QS!X`B#Q`AF"]B+Q8'C__\``"7__P``.\,/A:@!``"+1"0L
+M)?__``"#P`HE__\``%!7Z!1N``"#Q`B+U8'B__\``#O0#X5]`0``BT0D+"7_
+M_P``4/]7'(A$)"=J8?]7'(M$)#0E__\``(/``B7__P``4/]7'#/2@\0,BE0D
+M(SO0#X5!`0``BT0D+"7__P``@\`#)?__``!0_U<<BU0D'(/$!&:#Q0*+Q27_
+M_P``.\(/C"[___]F,_:-7QR)?"00BVPD+('E__\``(M$)"R#Q00E__\``(/`
+M"F:)1"0<C4<$B_B+QB7_````4(O%)?__``!0_Q=J8?\3BT0D*"7__P``4/\3
+MBM`SP(K"]]`E_P```%"+1"0P)?__``!0_Q=J8?\3B\4E__\``%#_$XK0,\"*
+MPHO6-?X```"#Q"`E__\``('B__\``#O"=7R#Q@)F@?X``7*-BW0D+(M\)!"+
+M1"0@@>;__P``)?\```"#Q@10B\8E__\``%#_5P2+1"0H@>;__P``)?__``!&
+MP?@(@>;__P``)?\```!05O]7!#/`@\00BD0D(U"+1"0P)?__``!0_U<$N`$`
+M``"#Q`A=6UY?@\04PSO_75M>,\!?@\04PSO_._^!_P````"#[%!7BWPD6%93
+M56:+AW(+``!FJ1``=$0SP&:+1Q:#P`PE__\``%"+AUP+``#_4!R+\#/`9HM'
+M%H/`#27__P``4(N'7`L``/]0','@"&8+\('F__\``(/$".LDD#/`9HM'%H/`
+M#"7__P``4(N'7`L``/]0((OP@>;__P``@\0$9HN'<@L``&:I$`!FB70D7G1#
+M,\!FBT<6@\`*)?__``!0BX=<"P``_U`<B_`SP&:+1Q:#P`LE__\``%"+AUP+
+M``#_4!S!X`AF"_"!YO__``"#Q`CK(S/`9HM'%H/`"B7__P``4(N'7`L``/]0
+M((OP@>;__P``@\0$9HN'<@L``&:I$`!FB70D7'0[:@$SP&:+1Q:#P`PE__\`
+M`%"+AUP+``#_4`1J`#/`9HM'%H/`#27__P``4(N'7`L``/]0!(/$$.L?._]J
+M`3/`9HM'%H/`#"7__P``4(N'7`L``/]0"(/$"&:+=S2+QH'F__\``,'F""7_
+M_P``P?@(@>8`_P``)?\````+QHOP9HN'<@L``('F__\``&:I$`!T3HO&)?\`
+M``!0,\!FBT<6@\`*)?__``!0BX=<"P``_U`$@>;__P``,\#!_@B!YO\```!6
+M9HM'%H/`"R7__P``4(N'7`L``/]0!(/$$.LCD('F__\``#/`5F:+1Q:#P`HE
+M__\``%"+AUP+``#_4`B#Q`AJ"HN'7`L``/]0-+Z\____@\0$O1````!FA:]R
+M"P``=$4SP&:+1Q:#P`(E__\``%"+AUP+``#_4!R+V#/`9HM'%H/``R7__P``
+M4(N'7`L``/]0','@"&8+V('C__\``(/$".LE._\SP&:+1Q:#P`(E__\``%"+
+MAUP+``#_4""+V('C__\``(/$!(O#@>/__P``P>,()?__``#!^`B!XP#_```E
+M_P````O#9HE$-%2#Q@(/C&'___]FBX=R"P``OD0```!FJ1``=$TSP(I$)%Y0
+M,\!FBT<6@\`,)?__``!0BX=<"P``_U`$,\!FBT0D9L'X""7_````4#/`9HM'
+M%H/`#27__P``4(N'7`L``/]0!(/$$.LDD#/`9HM$)%Y0,\!FBT<6@\`,)?__
+M``!0BX=<"P``_U`(@\0(9HN'<@L``&:I$`!T5(M$)%PE_P```%`SP&:+1Q:#
+MP`HE__\``%"+AUP+``#_4`2+1"1D)?__``#!^`@E_P```%`SP&:+1Q:#P`LE
+M__\``%"+AUP+``#_4`2#Q!#K*(/'`(M$)%PE__\``%`SP&:+1Q:#P`HE__\`
+M`%"+AUP+``#_4`B#Q`B+1"04B(?<$```BD0D%8B'W1```(I$)!:(A]X0``"*
+M1"07B(??$```BT0D&(B'X!```(I$)!F(A^$0``"+1"0\9HF'XA```&:+1"0V
+M9JD`0'11BD0D1HB'Y!```(I$)$>(A^40``"+1"1(B(?F$```BD0D28B'YQ``
+M`(I$)$J(A^@0``"*1"1+B(?I$```9HM$)#9FB8>."P``75M>7X/$4,.0,\F(
+MC^00``"(C^40``"(C^80``"(C^<0``"(C^@0``"(C^D0``#KPX'_`````('_
+M`````(/L&%>+?"0@9HN'H`L``&:I(``/A(\```!FQT<0``G'1V@`````9B7?
+M_V:)AZ`+``"+AY0+``")1Q(SP&B0````9HM'%H/`!R7__P``4(N'7`L``/]0
+M!(/$"%^#Q!C#D&;'1Q``",=':`````!F);__9HF'H`L``(N'D`L``(E'$C/`
+M:)````!FBT<6@\`')?__``!0BX=<"P``_U`$@\0(7X/$&,,[_V:+AZ`+``!F
+MJ4``=:MFBX>@"P``9JF``'1F9B5__V:)AZ`+``!FBX=R"P``9JD`@'0&C4=8
+MZPJ0BX=D"P``@\!84.AA9P``9L='$``*B4<2,\"Z`````(/$!(E7:&B0````
+M9HM'%H/`!R7__P``4(N'7`L``/]0!(/$"%^#Q!C#9HN'H`L``&:I`(!T;V8E
+M_W]FB8>@"P``9HN'F@L``&:I`@!T"S/`9HN'F`L``.L.,\!FBX>8"P``#0``
+M`(!0Z.1F``!FQT<0``;'1V@`````B4<2,\"#Q`1HD````&:+1Q:#P`<E__\`
+M`%"+AUP+``#_4`2#Q`A?@\08PV:+AZ`+``!FJ0`!#X3L_O__9B7__C/)9HF'
+MH`L``&:+AW(+``!FJ0$`=01FN1``,\"*AWT+``")1"04J0$```!T!&:#R0*+
+M1"04J0(```!T!&:#R01FBX>:"P``9JD$`'4.9H/)0&:I"`!T!&:#R2!FQT<0
+M``W'1V@`````B\&!X?__``#!X0@E__\``,'X"('A`/\``"7_````"\$E__\`
+M`(E'$C/`:)````!FBT<6@\`')?__``!0BX=<"P``_U`$@\0(7X/$&,,[_X/L
+M"%>+?"009HM'"F8]@`!T8F:+1P)F/4,`=%@SP&:+1PQ0,\!FBT<*4#/`9HM'
+M"%!J!&H!:@97Z)-<``"#Q!Q?@\0(PX/&`,=';`````!HB````#/`9HM'%H/`
+M!R7__P``4(N'7`L``/]0!(/$"%^#Q`C#BT=HA<!T#<=':`````!7_]"#Q`1F
+MBX>@"P``9H7`=-MFBT<"9CU0`'+19HM'$&:%P'6A5^CC_/__@\0$7X/$",.#
+MQP`[_X'_`````(/L$%>+?"085E-59HN'<@L``&:I$`!T/&H!,\!FBT<6@\`,
+M)?__``!0BX=<"P``_U`$:@`SP&:+1Q:#P`TE__\``%"+AUP+``#_4`2#Q!#K
+M((/'`&H!,\!FBT<6@\`,)?__``!0BX=<"P``_U`(@\0(9HN'<@L``&:I$`!T
+M/FC@````,\!FBT<6@\`*)?__``!0BX=<"P``_U`$:@4SP&:+1Q:#P`LE__\`
+M`%"+AUP+``#_4`2#Q!#K(CO_:.`%```SP&:+1Q:#P`HE__\``%"+AUP+``#_
+M4`B#Q`B^^/___[T0````9H6O<@L``'1%,\!FBT<6@\`")?__``!0BX=<"P``
+M_U`<B]@SP&:+1Q:#P`,E__\``%"+AUP+``#_4!S!X`AF"]B!X___``"#Q`CK
+M)3O_,\!FBT<6@\`")?__``!0BX=<"P``_U`@B]B!X___``"#Q`1FB5PT&(/&
+M`GR%,\"^"````&:+1"064(M$)!@E__\``%`SP&:+1"0:4(M$)!PE__\``%!J
+M`6H$5^A\6@``@\0<75M>7X/$$,.0@^PX5XM\)$!64U5FBX=R"P``9JD0`'0\
+M:(`````SP&:+1Q:#P`HE__\``%"+AUP+``#_4`1J$#/`9HM'%H/`"R7__P``
+M4(N'7`L``/]0!(/$$.L@:(`0```SP&:+1Q:#P`HE__\``%"+AUP+``#_4`B#
+MQ`AFBX=R"P``9JD0`'0W,\!FBT<6@\`")?__``!0BX=<"P``_U`<,\!FBT<6
+M@\`#)?__``!0BX=<"P``_U`<@\0(ZQT[_S/`9HM'%H/``B7__P``4(N'7`L`
+M`/]0((/$!&:+AW(+``!FJ1``=$0SP&:+1Q:#P`(E__\``%"+AUP+``#_4!R+
+M\#/`9HM'%H/``R7__P``4(N'7`L``/]0','@"&8+\('F__\``(/$".LDD#/`
+M9HM'%H/``B7__P``4(N'7`L``/]0((OP@>;__P``@\0$B\:(1"1&9HN'<@L`
+M`&:I$`!T1C/`9HM'%H/``B7__P``4(N'7`L``/]0'(OP,\!FBT<6@\`#)?__
+M``!0BX=<"P``_U`<P>`(9@OP@>;__P``@\0(ZR:#QP`SP&:+1Q:#P`(E__\`
+M`%"+AUP+``#_4""+\('F__\``(/$!(O&B$0D16:+AYH+``!FJ0$`='MFBX=R
+M"P``9JD0`'1%,\!FBT<6@\`")?__``!0BX=<"P``_U`<B_`SP&:+1Q:#P`,E
+M__\``%"+AUP+``#_4!S!X`AF"_"!YO__``"#Q`CK)3O_,\!FBT<6@\`")?__
+M``!0BX=<"P``_U`@B_"!YO__``"#Q`2+QHA$)$3&1"1#`3/`,]**1"1&BI>Z
+M"P``.\(/A%X#``"+[XV%F@L``(V]MPL``(E$)"R-A;H+``")1"0TB40D*(V%
+MF`L``(E$)#"+1"0TNA\```"*""+1BD0D0XORA,!U"(7V#X6.````C02UJ!``
+M`&:+\&:+A7(+``!FJ1``=%"+QB7_````4#/`9HM%%H/`"B7__P``4(N%7`L`
+M`/]0!('F__\``#/`P?X(@>;_````5F:+11:#P`LE__\``%"+A5P+``#_4`2#
+MQ!#K)8/'`('F__\``#/`5F:+11:#P`HE__\``%"+A5P+``#_4`B#Q`C&1"1#
+M`(M$)"C^`+H?````(A>-%%+!X@.-A!6\"P``B40D'&:+A7(+``!FJ1``=$8S
+MP&:+11:#P`(E__\``%"+A5P+``#_4!R+V#/`9HM%%H/``R7__P``4(N%7`L`
+M`/]0','@"&8+V('C__\``(/$".LF@\<`,\!FBT46@\`")?__``!0BX5<"P``
+M_U`@B]B!X___``"#Q`2+1"0<9HE8"F:+A7(+``!FJ1``=$0SP&:+11:#P`(E
+M__\``%"+A5P+``#_4!R+V#/`9HM%%H/``R7__P``4(N%7`L``/]0','@"&8+
+MV('C__\``(/$".LDD#/`9HM%%H/``B7__P``4(N%7`L``/]0((O8@>/__P``
+M@\0$9O?#`/YU"HM$)!S&0`X`ZR"*A7T+``"H!'0*N`(```#K"(/'`+@!````
+MBU0D'(A"#HM$)!R+5"0P9HM`"F:+$B7__P``@>+__P``.\)^#HM$)!S&0`X#
+M_X7$$```9O?#`!YU#6;WPP!`=`;_A<@0``!F]\,`$'0&_X7,$```N@,```"+
+M1"0<9B/3B%`/BT0D+&;W``(`=11F]\,`_G0NBT0D'&:+0`IFA<!U(8J5MPL`
+M`(M$)!S^PHB5MPL``,=`$`$```#ID0```(/'`#/2BT0D',=`$`````"+1"0P
+M9HL0BT0D'&:+2`J!X?__``"+PCO(?P*+P8O(BT0D'(E$)#B%R7Y&C9VW"P``
+MC7`0BT0D.+H?````9HM`""7__P``*\B*`_[`B`.*!R+0C112P>(#C805O`L`
+M`(E$)#B+1"0<BT`00(7)B09_PXM$)!QFBU`*9H/J!&:)4`HSP(M4)#2*1"1&
+MBA*!XO\````[P@^%SOS__XO]9HN'F@L``&:I`0`/A!D"``"*AYP+```\`G5S
+M,]*+1"1$)?\```"*E\,.```[PG14B^^-G<,.``"-O<,.``"-M;X.``"*"[@?
+M````(L&-%$"*A<,.``#!X@+^P(@'C8P5Q`X``&;'008``(H6BD$$`L(STH@&
+MBT0D1"7_````BA,[PG7`75M>7X/$.,,[_\9$)$,!,]*+1"1$)?\```"*E\,.
+M```[PG3<B^^-A<,.``"-G<,.``")1"0TC446C;V^#@``B40D+(H3N!\````B
+MPHOPC11VP>("C805Q`X``(E$)"2*1"1#A,!U"(7V#X6*````C8:($```9HOP
+M9HN%<@L``&:I$`!T38O&)?\```!0,\!FBT46@\`*)?__``!0BX5<"P``_U`$
+M@>;__P``,\#!_@B!YO\```!69HM%%H/`"R7__P``4(N%7`L``/]0!(/$$.LB
+M@>;__P``,\!69HM%%H/`"B7__P``4(N%7`L``/]0"(/$",9$)$,`BI7##@``
+MBT0D-/["B!"+1"0L9HL`)?__``"#P`(E__\``%"+A5P+``#_4!R#Q`0EB```
+M`#V(````=`Z+1"0D9L=`!@(`ZSP[_XM$)"QFBP`E__\``(/``B7__P``4(N%
+M7`L``/]0'(/$!(/@1(/X1'0'N`,```#K`C/`BU0D)&:)0@8STHM$)"2*#XI`
+M!`+!B`>+1"1$)?\```"*$SO"#X6E_O__75M>7X/$.,.*E\,.``"X'P```"+"
+M,]**E\`.``"-!$#!X`*-G`?$#@``,\"*1"1%.\(/A"K^__^+ZXV?O@X``(E\
+M)#"-M\`.``"!Q\`.```SP(I5!?["BL*(504STHI5!#O"=2AFQT4&``"+;"0P
+MN1\```#^A<,.```BC<,.``"-#$G!X0*-K`W$#@``,]*+1"0PBH"^#@``_L"(
+M`XM$)#"*@,`.``#^P(@',\"*1"1%BA8[PG6975M>7X/$.,.0C70F`%=6BW0D
+M#&:+?@J+QX'G__\``,'G""7__P``P?@(@><`_P``)?\````+QXOX@>?__P``
+M9O?'``5T7VH`:@!J`('G__\``%=J`&H#5NAP40``5N@J4```9L=&`D4`:@!6
+MBX9L"P``_U`$9L=&!`,`@\0H7E_#5N@&4```9L=&`D4`:@!6BX9L"P``_U`$
+M9L=&!`,`@\0,7E_#:@!J`&H`B\<E__\``%!J`&H#5N@040``@\0<9O?'``AU
+MNL:&CQ````!>7\.!_P````"!_P````"#[!0SP%>+?"0<5E/&1QH`QT0D%`$`
+M``!FBT<6@\`&)?__``!0BX=<"P``_U`<@\0$BMCVPX!U##/`6UY?@\04PX/'
+M`+A_````(L,E_P```%`SP&:+1Q:#P`8E__\``%"+AUP+``#_4`1FBX=R"P``
+M@\0(9JD"``^$F@$``&:I$`!T23/`9HM'%H/`""7__P``4(N'7`L``/]0'(OP
+M,\!FBT<6@\`))?__``!0BX=<"P``_U`<P>`(9@OP@>;__P``B70D&(/$".LF
+M._\SP&:+1Q:#P`@E__\``%"+AUP+``#_4"`E__\``(E$)!2#Q`2+1"009HE$
+M)!XE__\```T`"```9HE$)!IFBX=R"P``9JD0`'1/,\"*1"0:4#/`9HM'%H/`
+M""7__P``4(N'7`L``/]0!#/`9HM$)"+!^`@E_P```%`SP&:+1Q:#P`DE__\`
+M`%"+AUP+``#_4`2#Q!#K)H/'`#/`9HM$)!I0,\!FBT<6@\`()?__``!0BX=<
+M"P``_U`(@\0(,\!FBT0D'@T``0``9HE$)!IFBX=R"P``9JD0`'1/,\"*1"0:
+M4#/`9HM'%H/`""7__P``4(N'7`L``/]0!#/`9HM$)"+!^`@E_P```%`SP&:+
+M1Q:#P`DE__\``%"+AUP+``#_4`2#Q!#K)H/'`#/`9HM$)!I0,\!FBT<6@\`(
+M)?__``!0BX=<"P``_U`(@\0(N`\````BPX/X#'=V_R2%D````#O_5^BN\O__
+M@\0$ZV*05^A"]/__:@$SP&:+1Q:#P`<E__\``%"+AUP+``#_4`17Z"+T___'
+M1"0D`@```(/$$.LND%?HKO'__X/$!.LBD(M';(7`=!K'1VP`````5__0@\0$
+MZPL[_U?HFOS__X/$!&H@,\!FBT<6@\`')?__``!0BX=<"P``_U`$,\!FBT<6
+M@\`')?__``!0BX=<"P``_U`<@\0,J00```!U(&B$````,\!FBT<6@\`')?__
+M``!0BX=<"P``_U`$@\0(6UZ+1"0,7X/$%,.#["Q7BWPD-%:+="0\4XM<)$15
+MBH=Z"P``/`1U#XN':`L``&:+0!#K#8/&`(N':`L``&:+0!)FB4<8,\!H@```
+M`&:+1Q:#P`@E__\``%"+AUP+``#_4`1J#XN'7`L``/]0-#/`9HM'%H/`""7_
+M_P``4(N'7`L``/]0'(/@9(/$$(/(`8A$)#MFBX=R"P``9JD!`'4+BE0D.X#*
+M`HA4)#LSP(I$)#M0,\!FBT<6@\`()?__``!0BX=<"P``_U`$:AZ+AUP+``#_
+M4#1J`#/`9HM'%H/`"27__P``4(N'7`L``/]0!&H>BX=<"P``_U`T9L=$)%``
+MP&:+AW(+``"#Q!AFJ0`$="-FJ0`(=21F@4PD.``(9HM'!F8]"P!T$V:!3"0X
+M``SK"H/'`&:!3"0X`!"+ZXU<)#:-0P%05?_6@\0(A<!U"U-5_]:#Q`B%P'0*
+MQT0D(`$```#K",=$)"``````BT0D((7`#X3<````Z=\#``"#QP"-;"0VN`$`
+M```#Q5!3_]:#Q`B%P'4+55/_UH/$"(7`=`>]`0```.L",^V%[0^$<@(``.FE
+M`P``D(M$)#!F_TPD,&:%P`^$6@(``(OKC5PD-K@!`````\-05?_6@\0(A<!U
+M"U-5_]:#Q`B%P'0'NP$```#K`C/;A=L/A5X#``"+1"0P9O],)#!FA<!UP.M&
+M._]FBT0D+F:%P'2>Z6'___^0:B8SP&:+1Q:#P`@E__\``%"+AUP+``#_4`1F
+MQT<"(@!FQT<$```SP(/$"%U;7E^#Q"S#D(O=Z<D!``"0C6PD-K@!`````\50
+M4__6@\0(A<!U"U53_]:#Q`B%P'0'O0$```#K`C/MA>T/A<X"``"+1"0P9O],
+M)#!FA<`/A(0!``")="00OA````!FA;=R"P``B^MFBUPD-G1+,\"*PU`SP&:+
+M1Q:#P`(E__\``%"+AUP+``#_4`2!X___```SP,'["('C_P```%-FBT<6@\`#
+M)?__``!0BX=<"P``_U`$@\00ZR.0@>/__P``,\!39HM'%H/``B7__P``4(N'
+M7`L``/]0"(/$"(M$)#"+W6;_3"0P9H7`#X5O____BW0D$.GA````D(M$)#!F
+M_TPD,&:%P`^$S@```(OKC5PD-K@!`````\-05?_6@\0(A<!U"U-5_]:#Q`B%
+MP'0'NP$```#K`C/;A=L/A=(!``!FBX=R"P``9JD0`&:+7"0V=$PSP(K#4#/`
+M9HM'%H/``B7__P``4(N'7`L``/]0!('C__\``#/`P?L(@>/_````4V:+1Q:#
+MP`,E__\``%"+AUP+``#_4`2#Q!#K)#O_@>/__P``,\!39HM'%H/``B7__P``
+M4(N'7`L``/]0"(/$"(M$)#!F_TPD,&:%P`^%//___^DS_O__@\<`C6PD,K@!
+M`````\504__6@\0(A<!U"U53_]:#Q`B%P'0'O0$```#K`C/MA>T/A08!``"-
+M;"0TN`$````#Q5!3_]:#Q`B%P'4+55/_UH/$"(7`=`F]`0```.L$._\S[87M
+M#X72````C6PD,+@!`````\504__6@\0(A<!U"U53_]:#Q`B%P'0)O0$```#K
+M!#O_,^V%[0^%G@```+@!````9B-$)#!FB40D+HM$)#`E__\``,'X`6:)1"0P
+M9H7`#X0Y_?__BT0D.&:%1"0R#X4:_?__9HM$)#)FB40D*F:+AW(+``!FJ1``
+M=%\SP(I$)"I0,\!FBT<6@\`,)?__``!0BX=<"P``_U`$,\!FBT0D,L'X""7_
+M````4#/`9HM'%H/`#27__P``4(N'7`L``/]0!(/$$.LV@\<`75M>N`$```!?
+M@\0LPX/'`#/`9HM$)"I0,\!FBT<6@\`,)?__``!0BX=<"P``_U`(@\0(BT0D
+M-&:)1"0J9HN'<@L``&:I$`!T3S/`BD0D*E`SP&:+1Q:#P`HE__\``%"+AUP+
+M``#_4`0SP&:+1"0RP?@()?\```!0,\!FBT<6@\`+)?__``!0BX=<"P``_U`$
+M@\00ZR:#QP`SP&:+1"0J4#/`9HM'%H/`"B7__P``4(N'7`L``/]0"(/$"&:+
+M1"0N9H7`#X0?_?__Z3+\__\[_X/L(%>+1"0LQT0D$`````!6BW0D+%-5QD0D
+M+P%FBP`S_V:%P`^$Q`,``(V&F@L``(E$)!2+1"0XC5@$9HM#"&:%P`^$C@,`
+M`+@?````BHZ_#@``(L&+5"0<9HE$)"R*1"0O0H3`B50D'`^$P0```(M$)!1F
+M]P`0`'0*BT,$N@@```#K!8M#!#/2B!"+1"0L)?__``"-!,4`$@``9HE$)"AF
+MBX9R"P``9JD0`'13BT0D*"7_````4#/`9HM&%H/`!"7__P``4(N&7`L``/]0
+M!(M$)#`E__\``,'X""7_````4#/`9HM&%H/`!27__P``4(N&7`L``/]0!(/$
+M$.LG._^+1"0H)?__``!0,\!FBT86@\`$)?__``!0BX9<"P``_U`(@\0(QD0D
+M+P#IV0```)!FBX9R"P``9JD0`'0[:@`SP&:+1A:#P`(E__\``%"+AEP+``#_
+M4`1J$#/`9HM&%H/``R7__P``4(N&7`L``/]0!(/$$.LB._]H`!```#/`9HM&
+M%H/``B7__P``4(N&7`L``/]0"(/$"(M$)"QFA<!U9V:+AG(+``!FJ1``=#IJ
+M`#/`9HM&%H/`!"7__P``4(N&7`L``/]0!&H2,\!FBT86@\`%)?__``!0BX9<
+M"P``_U`$@\00ZR&0:``2```SP&:+1A:#P`0E__\``%"+AEP+``#_4`B#Q`@S
+MR6:+CG(+``#WP2((``!T!XMK!.L$._^+*XO%P>@0]\$0````9HE$)"AT5(M$
+M)"@E_P```%`SP&:+1A:#P`(E__\``%"+AEP+``#_4`2+1"0P)?__``#!^`@E
+M_P```%`SP&:+1A:#P`,E__\``%"+AEP+``#_4`2#Q!#K*(/'`(M$)"@E__\`
+M`%`SP&:+1A:#P`(E__\``%"+AEP+``#_4`B#Q`AFBX9R"P``9JD0`&:);"0H
+M=%&+1"0H)?\```!0,\!FBT86@\`")?__``!0BX9<"P``_U`$@>7__P``,\#!
+M_0B!Y?\```!59HM&%H/``R7__P``4(N&7`L``/]0!(/$$.LG._^+1"0H)?__
+M``!0,\!FBT86@\`")?__``!0BX9<"P``_U`(@\0(9HM#"&:)1"0H9HN&<@L`
+M`&:I$`!T48M$)"@E_P```%`SP&:+1A:#P`(E__\``%"+AEP+``#_4`2+1"0P
+M)?__``#!^`@E_P```%`SP&:+1A:#P`,E__\``%"+AEP+``#_4`2#Q!#K)8M$
+M)"@E__\``%`SP&:+1A:#P`(E__\``%"+AEP+``#_4`B#Q`AF_XZ\#@``BH:_
+M#@``_L"(AK\.``"#PPR+1"0X1V:+`"7__P``._@/C$W\__]FBX::"P``9JD!
+M`'0)9K\`<.L'@\<`9K\`T&:+AG(+``!FJ1``=%>+QR7_````4#/`9HM&%H/`
+M`B7__P``4(N&7`L``/]0!('G__\``#/`P?\(@>?_````5V:+1A:#P`,E__\`
+M`%"+AEP+``#_4`2#Q!!=6UZ+1"007X/$(,.!Y___```SP%=FBT86@\`")?__
+M``!0BX9<"P``_U`(@\0(Z]"#[!2X'P```%>+?"0<5E.*E[D+``"+7"0H(L(#
+MP(T$0`4H$0``9HOP9HN'<@L``&:I$`!T3XO&)?\```!0,\!FBT<6@\`$)?__
+M``!0BX=<"P``_U`$@>;__P``,\#!_@B!YO\```!69HM'%H/`!27__P``4(N'
+M7`L``/]0!(/$$.LD._^!YO__```SP%9FBT<6@\`$)?__``!0BX=<"P``_U`(
+M@\0(_H>Y"P``,\!FBX=R"P``B40D%*D""```=`2+,^L#BW,$B\;!Z!!FB40D
+M'(M$)!2I$````'14BT0D'"7_````4#/`9HM'%H/``B7__P``4(N'7`L``/]0
+M!(M$)"0E__\``,'X""7_````4#/`9HM'%H/``R7__P``4(N'7`L``/]0!(/$
+M$.LH@\<`BT0D'"7__P``4#/`9HM'%H/``B7__P``4(N'7`L``/]0"(/$"&:+
+MAW(+``!FJ1``=$Z+QB7_````4#/`9HM'%H/``B7__P``4(N'7`L``/]0!(O&
+M)?__``#!^`@E_P```%`SP&:+1Q:#P`,E__\``%"+AUP+``#_4`2#Q!#K))"+
+MQB7__P``4#/`9HM'%H/``B7__P``4(N'7`L``/]0"(/$"&:+AW(+``!FJ1``
+M9HMS"'10B\8E_P```%`SP&:+1Q:#P`(E__\``%"+AUP+``#_4`2+QB7__P``
+MP?@()?\```!0,\!FBT<6@\`#)?__``!0BX=<"P``_U`$@\00ZR:#QP"+QB7_
+M_P``4#/`9HM'%H/``B7__P``4(N'7`L``/]0"(/$"&:+1P)F/5``#X6*````
+M:@$SP&:+1Q:#P`<E__\``%"+AUP+``#_4`1FB[>@"P``@\0(B\9F#0"`9H7V
+M9HF'H`L``'5.9HM'`F8]4`!R1,:'NPL```!FBT<09H7`="O'1VP`````:(@`
+M```SP&:+1Q:#P`<E__\``%"+AUP+``#_4`2#Q`CK"SO_5^@:X?__@\0$9L='
+M`F``6UY?@\04PSO_._^!_P````"#[!!7BWPD&%939HN'<@L``&:I$`!T.6H!
+M,\!FBT<6@\`,)?__``!0BX=<"P``_U`$:@`SP&:+1Q:#P`TE__\``%"+AUP+
+M``#_4`2#Q!#K'6H!,\!FBT<6@\`,)?__``!0BX=<"P``_U`(@\0(9HN'<@L`
+M`&:I$`!T.FH`,\!FBT<6@\`*)?__``!0BX=<"P``_U`$:@HSP&:+1Q:#P`LE
+M__\``%"+AUP+``#_4`2#Q!#K(9!H``H``#/`9HM'%H/`"B7__P``4(N'7`L`
+M`/]0"(/$"&:+AW(+``!FJ1``=#]J`#/`9HM'%H/``B7__P``4(N'7`L``/]0
+M!&B?````,\!FBT<6@\`#)?__``!0BX=<"P``_U`$@\00ZR.#QP!H`)\``#/`
+M9HM'%H/``B7__P``4(N'7`L``/]0"(/$"&:+AW(+``!FJ1``=#MJ`#/`9HM'
+M%H/``B7__P``4(N'7`L``/]0!&H`,\!FBT<6@\`#)?__``!0BX=<"P``_U`$
+M@\00ZQ\[_VH`,\!FBT<6@\`")?__``!0BX=<"P``_U`(@\0(9HN'<@L``&:I
+M$`!T.FH`,\!FBT<6@\`")?__``!0BX=<"P``_U`$:@`SP&:+1Q:#P`,E__\`
+M`%"+AUP+``#_4`2#Q!#K'I!J`#/`9HM'%H/``B7__P``4(N'7`L``/]0"(/$
+M"&:+AW(+``!FJ1``=#IJ`#/`9HM'%H/``B7__P``4(N'7`L``/]0!&H`,\!F
+MBT<6@\`#)?__``!0BX=<"P``_U`$@\00ZQZ0:@`SP&:+1Q:#P`(E__\``%"+
+MAUP+``#_4`B#Q`AFBX=R"P``9JD0`&:+=QAT3HO&)?\```!0,\!FBT<6@\`"
+M)?__``!0BX=<"P``_U`$B\8E__\``,'X""7_````4#/`9HM'%H/``R7__P``
+M4(N'7`L``/]0!(/$$.LDD(O&)?__``!0,\!FBT<6@\`")?__``!0BX=<"P``
+M_U`(@\0(9HN'<@L``&:I$`!FBW<8=%"+QB7_````4#/`9HM'%H/``B7__P``
+M4(N'7`L``/]0!('F__\``#/`P?X(@>;_````5F:+1Q:#P`,E__\``%"+AUP+
+M``#_4`2#Q!#K)8/'`('F__\``#/`5F:+1Q:#P`(E__\``%"+AUP+``#_4`B#
+MQ`AFBX=R"P``9JD0`'0Y:@4SP&:+1Q:#P`(E__\``%"+AUP+``#_4`1J!3/`
+M9HM'%H/``R7__P``4(N'7`L``/]0!(/$$.L@:`4%```SP&:+1Q:#P`(E__\`
+M`%"+AUP+``#_4`B#Q`@STF:+EW(+``#WP@"```!T"XUW$(U?".L/@\8`BX=D
+M"P``C7`0C5@(B\;!Z!#WPA````!FB40D&'12BT0D&"7_````4#/`9HM'%H/`
+M`B7__P``4(N'7`L``/]0!(M$)"`E__\``,'X""7_````4#/`9HM'%H/``R7_
+M_P``4(N'7`L``/]0!(/$$.LFD(M$)!@E__\``%`SP&:+1Q:#P`(E__\``%"+
+MAUP+``#_4`B#Q`AFBX=R"P``9JD0`'1.B\8E_P```%`SP&:+1Q:#P`(E__\`
+M`%"+AUP+``#_4`2+QB7__P``P?@()?\```!0,\!FBT<6@\`#)?__``!0BX=<
+M"P``_U`$@\00ZR20B\8E__\``%`SP&:+1Q:#P`(E__\``%"+AUP+``#_4`B#
+MQ`B+P\'H$&:+\&:+AW(+``!FJ1``=%"+QB7_````4#/`9HM'%H/``B7__P``
+M4(N'7`L``/]0!(O&)?__``#!^`@E_P```%`SP&:+1Q:#P`,E__\``%"+AUP+
+M``#_4`2#Q!#K)H/'`(O&)?__``!0,\!FBT<6@\`")?__``!0BX=<"P``_U`(
+M@\0(9HN'<@L``&:I$`!FB_-T38O&)?\```!0,\!FBT<6@\`")?__``!0BX=<
+M"P``_U`$@>;__P``,\#!_@B!YO\```!69HM'%H/``R7__P``4(N'7`L``/]0
+M!(/$$.LB@>;__P``,\!69HM'%H/``B7__P``4(N'7`L``/]0"(/$"&:+AW(+
+M``!FJ1``=$5H@````#/`9HM'%H/`!B7__P``4(N'7`L``/]0!&B0````,\!F
+MBT<6@\`')?__``!0BX=<"P``_U`$@\006UY?@\00PY!H@)```#/`9HM'%H/`
+M!B7__P``4(N'7`L``/]0"(/$"%M>7X/$$,.0._^!_P````"#[`Q7BWPD%%93
+M9HN'<@L``&:I$`!T13/`9HM'%H/`#"7__P``4(N'7`L``/]0'(OP,\!FBT<6
+M@\`-)?__``!0BX=<"P``_U`<P>`(9@OP@>;__P``@\0(ZR4[_S/`9HM'%H/`
+M#"7__P``4(N'7`L``/]0((OP@>;__P``@\0$9HN'<@L``&:I$`!T1#/`9HM'
+M%H/`"B7__P``4(N'7`L``/]0'(O8,\!FBT<6@\`+)?__``!0BX=<"P``_U`<
+MP>`(9@O8@>/__P``@\0(ZR20,\!FBT<6@\`*)?__``!0BX=<"P``_U`@B]B!
+MX___``"#Q`1FBX=R"P``9JD0`&:)7"06=#MJ`3/`9HM'%H/`#"7__P``4(N'
+M7`L``/]0!&H`,\!FBT<6@\`-)?__``!0BX=<"P``_U`$@\00ZQ\[_VH!,\!F
+MBT<6@\`,)?__``!0BX=<"P``_U`(@\0(9HN'<@L``&:I$`!T/FCN````,\!F
+MBT<6@\`*)?__``!0BX=<"P``_U`$:@4SP&:+1Q:#P`LE__\``%"+AUP+``#_
+M4`2#Q!#K(CO_:.X%```SP&:+1Q:#P`HE__\``%"+AUP+``#_4`B#Q`AJ"HN'
+M7`L``/]0-&:+AW(+``"#Q`1FJ1``=#DSP&:+1Q90BX=<"P``_U`<B]@SP&:+
+M1Q9`)?__``!0BX=<"P``_U`<P>`(9@O8@>/__P``@\0(ZQLSP&:+1Q90BX=<
+M"P``_U`@B]B!X___``"#Q`1FBX=R"P``9JD0`'10B\8E_P```%`SP&:+1Q:#
+MP`PE__\``%"+AUP+``#_4`2!YO__```SP,'^"('F_P```%9FBT<6@\`-)?__
+M``!0BX=<"P``_U`$@\00ZR6#QP"!YO__```SP%9FBT<6@\`,)?__``!0BX=<
+M"P``_U`(@\0(9HN'<@L``&:I$`!T63/`BD0D%E`SP&:+1Q:#P`HE__\``%"+
+MAUP+``#_4`0SP&:+1"0>P?@()?\```!0,\!FBT<6@\`+)?__``!0BX=<"P``
+M_U`$@\00B\-;7B7__P``7X/$#,.0,\!FBT0D%E`SP&:+1Q:#P`HE__\``%"+
+MAUP+``#_4`B#Q`CKS(/'`('_`````('_`````(/L#%>+?"045E-59HN'H`L`
+M`&:%P'0^9HM'$&:%P'0LQT=L`````&B(````,\!FBT<6@\`')?__``!0BX=<
+M"P``_U`$@\0(ZPR#QP!7Z,[6__^#Q`1FBX>T"P``9H7`#X3/````,^VX'P``
+M`"*'M@L``(OP9HN'M`L``&:%P'XIC9^T"P``C01VP>`#C80'O`L``%!7Z(;R
+M__]&@\0(@^8?10^_`SOH?-UJ`3/`9HM'%H/`!R7__P``4(N'7`L``/]0!&;'
+M1P)@`&:+MZ`+``"#Q`B+QF8-`(!FA?9FB8>@"P``=55FBT<"9CU0`')+QH>[
+M"P```&:+1Q!FA<!T*<=';`````!HB````#/`9HM'%H/`!R7__P``4(N'7`L`
+M`/]0!(/$".L25^CRU?__@\0$ZP>09L='`E``5^A`T?__9HNWC@L``(/$!(O&
+M@>;__P``P>8(:@`E__\``('F`/\``,'X""7_````"\:+\#/`@>;__P``BH><
+M"P``4&:+AW(+``!FJ0$`=`JX$````.L(@\<`N`0````E__\``%"+QB7__P``
+M4&H`:@!7Z*\T``"#Q!R*AWT+``"H`W1J5^CL^O__9HF'D!```(/$!&:+MZ`+
+M``"+QF8-``%FA?9FB8>@"P``=4%FBT<"9CU0`'(WQH>["P```&:+1Q!FA<!T
+M+\=';`````!HB````#/`9HM'%H/`!R7__P``4(N'7`L``/]0!(/$"%U;7E^#
+MQ`S#5^CJU/__@\0$75M>7X/$#,.#QP"!_P````"!_P````!0BU0D"(M$)`QF
+MBXJ@"P``9@O!9H7)9HF"H`L``'5!9HM"`F8]4`!R-\:"NPL```!FBT(09H7`
+M="O'0FP`````:(@````SP&:+0A:#P`<E__\``%"+@EP+``#_4`2#Q`B#Q`3#
+M4NAFU/__@\0$@\0$PX/'`('_`````('_`````(/L%+C_````5XM\)!Q39B-'
+M"HK8,\"*PSV`````#X2!````@_@"="1J`&H`:@`-``8``"7__P``4&H!:@)7
+MZ$TS``"#Q!Q;7X/$%,-J`&H`:@`SP&:+1PK!^`@-``<``"7__P``4&H`:@)7
+MZ"`S``!H_P```#/`9HM'%H/`!R7__P``4(N'7`L``/]0!&;'1P)%`&;'1P0%
+M`(/$)%M?@\04PSO_9HM'"F:I`(!T"L:'G`L```+K")#&AYP+```!9HN'<@L`
+M`&:I`@AT!#/`ZP6X`$```(E$)`AFBX>:"P``9JD!`'0*N`"```#K!8/'`#/`
+M9L='$``$QT=H``````M$)`B+R"7__P``P?@(@>'__P``P>$()?\```"!X0#_
+M```+P8E'$C/`:)````!FBT<6@\`')?__``!0BX=<"P``_U`$@\0(,\#'1VP`
+M````9L='!`$`9L='`D0`:(@```!FBT<6@\`')?__``!0BX=<"P``_U`$@\0(
+M6U^#Q!3#D(/L#%>+?"045E-FBX=R"P``9JD!`'0)9L='.```ZP>09L='.``0
+M9HN'F@L``&:I!`!U(F:+1SAF#0!`9HN7F@L``&;WP@@`9HE'.'0(9@T`(&:)
+M1SAFB[>8"P``N0`:``!FB4](BH>("P``9HE/2KD9````B$<ZBH>)"P``B$<[
+MBH>*"P``B$<\BH>+"P``B$<]BH>,"P``B$<^BH>-"P``B$<_BX>0"P``B4=`
+MBX>4"P``B4=$B\8E__\``('F__\``,'X"(A/4L'F""7_````@>8`_P``B$]3
+M"\8SR6:)1TR^`@```&:)3TYFB4]0H`````"(1QR@`0```(A''8J&`````(A$
+M-QR*A@$```"(1#<=BH8"````B$0W'HJ&`P```(/&!(/^$HA$-QM\T&:+AW(+
+M``!FJ0"`#X28````C7<<B]:+QL'J",'H&('B`/\```O"B];!X@C!YAB!X@``
+M_P`+P@O&C7<XB4=49L='$``#9L='!#P`9L='`D,`B]:+QL'H&+L`````P>H(
+MB5]H@>(`_P``"\*+UL'B",'F&('B``#_``O""\:)1Q(SP&B0````9HM'%H/`
+M!R7__P``4(N'7`L``/]0!(/$"%M>7X/$#,.#Q@"+AV0+``"^'`````/PB]:+
+MQL'J",'H&('B`/\```O"B];!X@C!YAB!X@``_P`+P@O&B4=4BX=D"P``C7`X
+MZ5/___\[_XUT)@"#[!@SP%>+?"0@5E-59HM'`H/X0P^$@00```^/6`0``(/X
+M)'1O#X\M`0``@_@B#X2(````#X^>````@_@A#X6=!P``,\!FBT<6@\`&)?__
+M``!0BX=<"P``_U`<BMBX<````(/$!"+#@_AP#X1D`@``5^@Z,```9L='!```
+M9L='`B0`N.@#``"#Q`1=6UY?@\08PSO_9HM'!&;_1P1F/0(`=@QFQT<$``!F
+MQT<")0!=6UZXZ`,``%^#Q!C#D&:+1P1F_T<$9CT"`';D9L='!```9L='`B,`
+MZ]:#^",/A?\&``!FBT<$9O]'!&8]'@`/AXL````SP&:+1Q:#P`8E__\``%"+
+MAUP+``#_4!R*V+@P````@\0$(L.#^#`/A+4```"X?P```"+#@_A`#X6D`0``
+M9L='`C``:@!J`&H`:@!J`&H!5^BH+@``@\0<N.@#``!=6UY?@\08PX/X00^$
+MYP````^/V0(``(/X)0^%<`8``&:+1P1F_T<$9CT>`'8N9L='`A``:@!J`&H`
+M:``"``!J`&H!5^A7+@``@\0<N.@#``!=6UY?@\08PX/'`#/`9HM'%H/`!B7_
+M_P``4(N'7`L``/]0'(K8N#````"#Q`0BPX/X,'4[9L='`A``:@!J`&H`N!\`
+M```BPPT``0``)?__``!0:@!J`5?H\RT``(/$'+CH`P``75M>7X/$&,.#QP"X
+M?P```"+#@_A`#X6T````9L='`C``BY=@"P``4HN'7`L``/]0/(/$!+CH`P``
+M75M>7X/$&,,[_S/`9HM'%H/`!B7__P``4(N'7`L``/]0'(/$!(K8]L,0=#)J
+M`&H`:@"X#P```"+##0`!```E__\``%!J`6H"5^AD+0``@\0<N.@#``!=6UY?
+M@\08P_;#8'1#9HM'!&;_1P1F/60`=B5J`&H`:@!H``(``&H!:@)7Z"PM``"#
+MQ!RXZ`,``%U;7E^#Q!C#75M>N&0```!?@\08PX/&`&:+1Q!FA<!U/HM'$CW!
+MXM2+=30SP&:+1P@]__\``'4G,\!FBT<*/='7``!U&C/`9HM'##W%V0``=0TS
+MP&:+1PX]P]0``'1%:@!J`&H`9HN'<@L``&:I`(!T"K@`!```ZPB#QP"X``,`
+M`"7__P``4&H!:@)7Z),L``"#Q!RXZ`,``%U;7E^#Q!C#@\<`:B`SP&:+1Q:#
+MP`<E__\``%"+AUP+``#_4`1HA````#/`9HM'%H/`!R7__P``4(N'7`L``/]0
+M!&;'1RX`"F;'1S`*`&:+AW(+``"#Q!!FJ0"`=`6-1R[K"8N'9`L``(/`+F;'
+M1Q``"V;'1P0"`&;'1P)"`(O(P>@8B]'!Z@B!X@#_```+PHO1P>((P>$8@>(`
+M`/\`"\*Z``````O!B5=HB4<2,\!HD````&:+1Q:#P`<E__\``%"+AUP+``#_
+M4`2#Q`BXZ`,``%U;7E^#Q!C#D(/X0@^%EP,``&:+1P1F_T\$9H7`#X54_/__
+M:@!J`&H`:``$``!J`6H"5^B!*P``@\0<Z3?\__^0@_A0#X30`0``#X_!`0``
+M@_A%='P/CTX#``"#^$0/A44#``!FBT<$9O]/!&:%P`^%`OS__V:+AW(+``!F
+MJ1``#X3'````,\!FBT<6@\`()?__``!0BX=<"P``_U`<B_`SP&:+1Q:#P`DE
+M__\``%"+AUP+``#_4!S!X`AF"_"!YO__``")="0@@\0(Z:$```"09HM'!&;_
+M3P1FA<`/A97[__]FBT<&9CT+`'4\,\!FBT<6@\`()?__``!0BX=<"P``_U`<
+M@\@()?\```!0,\!FBT<6@\`()?__``!0BX=<"P``_U`$@\0,5^A+ZO__9L='
+M!```9L='`D$`@\0$N&0```!=6UY?@\08PX/'`#/`9HM'%H/`""7__P``4(N'
+M7`L``/]0("7__P``B40D'(/$!&:+AW(+``!FJ1``=$,SP&:+1Q:#P`8E__\`
+M`%"+AUP+``#_4!R+Z#/`9HM'%H/`!R7__P``4(N'7`L``/]0','@"&8+Z('E
+M__\``(/$".LC,\!FBT<6@\`&)?__``!0BX=<"P``_U`@B^B!Y?__``"#Q`2!
+MY?__``"+1"08527__P``4&H`:``%``!J`6H"5^BS*0``@\0<Z6GZ__^#QP"#
+M^&`/A8\!``!FBX>@"P``9H7`#X0_`0``BH>["P``BLC^P3P"B(^["P``#XXG
+M`0``9HN'<@L``&:I$`!T2C/`9HM'%H/`""7__P``4(N'7`L``/]0'(OP,\!F
+MBT<6@\`))?__``!0BX=<"P``_U`<P>`(9@OP@>;__P``B70D((/$".LG@\<`
+M,\!FBT<6@\`()?__``!0BX=<"P``_U`@)?__``")1"0<@\0$9HN'<@L``&:I
+M$`!T0S/`9HM'%H/`!B7__P``4(N'7`L``/]0'(OH,\!FBT<6@\`')?__``!0
+MBX=<"P``_U`<P>`(9@OH@>7__P``@\0(ZR,SP&:+1Q:#P`8E__\``%"+AUP+
+M``#_4""+Z('E__\``(/$!('E__\``(M$)!A5)?__``!0,\!FBX>@"P``4&H!
+M:@%J!U?H8B@``(/$'+CH`P``75M>7X/$&,,[_XI'&X3`#X0#^?__BD<:BM#^
+MPCP"B%<:#X[Q^/__:@!J`&H`:@-J`6H'5^@A*```@\0<N.@#``!=6UY?@\08
+MPY!=6UXSP%^#Q!C#._^-="8`@^P85XM\)"!6BW0D*%-5B\8E__\``%#_5QPS
+MTB7^````BA4`````"\(E^P```(K8,\"*PU"+QB7__P``4/]7!+@!````@\0,
+M(L.B`````(O&)?__``!0_U<<,](E_@```(H5``````O")?T```"*V#/`BL-0
+MB\8E__\``%#_5P2X`0```(/$#"+#H@````"+QB7__P``4/]7'#/2)?X```"*
+M%0`````+PB7^````BM@SP(K#4(O&)?__``!0_U<$N`$```"#Q`PBPZ(`````
+MB\8E__\``%#_5QPSTB7^````BA4`````"\(E[P```(K8,\"*PU"+QB7__P``
+M4/]7!+@!````@\0,(L.B`````(O&)?__``!0_U<<B\:#Q`0E__\``%#_5QR+
+MQH/$!"7__P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\``%#_5QPSTB7^
+M````BA4`````"\*#R!"*V#/`BL-0B\8E__\``%#_5P2X`0```(/$#"+#H@``
+M``"+QB7__P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\``%#_5QR+QH/$
+M!"7__P``4/]7'(O&@\0$)?__``!0_U<<,](E_@```(H5``````O"@\@"BM@S
+MP(K#4(O&)?__``!0_U<$N`$```"#Q`PBPZ(`````B\8E__\``%#_5QR+QH/$
+M!"7__P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\``%#_5QR+7"0X@\0$
+M@>/_````QT0D'`$```#!XPB!RX````!FA=L/A'<!``"+1"0<A<!T(8O&B^LE
+M__\``%#_5QPSTB7^````BA4`````"\*#R`'K(8O&B^LE__\``%#_5QPSTB7^
+M````BA4`````"\(E_@```(K8,\"*PU"+QB7__P``4/]7!+@!````@\0,(L.B
+M`````(O&)?__``!0_U<<,](E_@```(H5``````O")?T```"*V#/`BL-0B\8E
+M__\``%#_5P2X`0```(/$#"+#H@````"+QB7__P``4/]7'(O&@\0$)?__``!0
+M_U<<B\:#Q`0E__\``%#_5QR+QH/$!"7__P``4/]7'(O&@\0$)?__``!0_U<<
+M,](E_@```(H5``````O"@\@"BM@SP(K#4(O&)?__``!0_U<$N`$```"#Q`PB
+MPZ(`````B\8E__\``%#_5QR+QH/$!"7__P``4/]7'(O&@\0$)?__``!0_U<<
+MB\:#Q`0E__\``%#_5QR+Q8'E__\``"4`@```@\0$C5PM`(E$)!QFA=L/A8G^
+M__]=6UY?@\08PSO_._^!_P````"#[!17BWPD'%:+="0D4U6+QB7__P``4/]7
+M'(A$)"<E_P```(/(("7_````4(O&)?__``!0_U<$Q@4``````(M4)#RX/P``
+M`"+"#8`````E_P```%"+QB7__P``4%?HOOO__XM$)$R#Q!B%P(U0_XE4)#0/
+MA$P!```S[8EL)!B+QB7__P``4/]7'#/2)?X```"*%0`````+PB7]````BM@S
+MP(K#4(O&)?__``!0_U<$N`$```"#Q`PBPZ(`````B\8E__\``%#_5QR+QH/$
+M!"7__P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\``%#_5QR+QH/$!"7_
+M_P``4/]7'#/2)?X```"*%0`````+PH/(`HK8,\"*PU"+QB7__P``4/]7!+@!
+M````@\0,(L.B`````(O&)?__``!0_U<<B\:#Q`0E__\``%#_5QR+QH/$!"7_
+M_P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\``('E__\``%#_5QP#[8/@
+M`3/;@\0$BMB%VW0$9H/-`8M,)!A!B4PD&(/Y$`^,V_[__XM$)#AFB2B-2`*+
+M1"0TB4PD.(7`C5#_B50D-`^%M/[__XO&)?__``!0_U<<,](E_@```(H5````
+M``O")>\```"*V#/`BL-0B\8E__\``%#_5P2X`0```(/$#"+#H@````"+QB7_
+M_P``4/]7'#/2)?X```"*%0`````+PB7[````BM@SP(K#4(O&)?__``!0_U<$
+MN`$```"#Q`PBPX'F__\``*(`````,\"*1"0C4%;_5P2#Q`A=6UY?@\04PX/L
+M#%>+?"045HMT)!R+QB7__P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\`
+M`%#_5QR#Q`2!YO__``!6_U<<@\0$7E^#Q`S#._^-="8`@^P(5U93BUPD&&8S
+M_X/#`HO/@\,"@\,"9HMS^HO&@>;__P``P>8()?__``#!^`B!Y@#_```E_P``
+M``O&B_!FBT/Z@>;__P``9@/^9@O(9HMS_(O&@>;__P``P>8()?__``#!^`B!
+MY@#_```E_P````O&B_!FBT/\@>;__P``9@/^9@O(9HMS_HO&@>;__P``P>8(
+M)?__``#!^`B!Y@#_```E_P````O&B_!FBT/^@>;__P``9@/^9@O(@>?__P``
+M9HLSB\:!YO__``#!Y@@E__\``,'X"('F`/\``"7_````"\:+\('F__\``#O^
+M=`DSP%M>7X/$",,STHO!9HL36R7__P``7@O"7X/$",.#QP"#["17BWPD+%93
+M58ML)$"+1"0\)?__``!0_U<<B$0D-X/$!(M$)#PE__\``(/`#&:)1"0JB]@E
+M__\``%#_5QR+\('C__\``$.!X___``!3_U<<P>`(@\0(9@OPBT0D/('F__\`
+M`&:)="0P)?__``"#P`IFB40D+(O8)?__``!0_U<<B_"!X___``!#@>/__P``
+M4_]7','@"(/$"&8+\&H`@>;__P``9HET)#)FBW0D+HO&)?__``!0_U<$:@"!
+MYO__``!&@>;__P``5O]7!(MT)#R#Q!"+QFH`)?__``!0_U<$:@"!YO__``!&
+M@>;__P``5O]7!(M$)$R#Q!`E__\``#/V@\`"C5\<9HO0BT0D/(EL)!`E__\`
+M`(E\)!2+^HUH`XO')?__``!0_Q.+Q27__P``4/\3B$0T((/$"$:#_@A\WV:+
+M="0JBWPD%(M$)#"+;"00)?\```!0B\8E__\``%#_5P2+1"0X@>;__P``)?__
+M``!&P?@(@>;__P``)?\```!05O]7!(MT)#R#Q!`SP(I$)"Y0B\8E__\``%#_
+M5P0SP('F__\``&:+1"0V1L'X"('F__\``"7_````4%;_5P0SP(/$$(I$)#-0
+MBT0D0"7__P``4/]7!(U$)"!0Z`W]__^#Q`R%P'0^B\5%BU0D&(@0B\5%BE0D
+M&8@0B\5%BE0D&H@0B\6*5"0;18@018M4)!R(5?^*5"0=B%4`75M>7X/$),.#
+MQP"X!@```(O]O@4```"%P'3EB\9.Q@<`1X7`=?5=6UY?@\0DPY"-="8`@^P<
+M,\E7BWPD+%9358M$)#1FBV@0BT0D-,9'`03&1S`!9L='$B``9HE/%H'E_/\`
+M`&:);Q!FB4\4BT`4@^#PB4<8A<!T#F;'1QP`(,9''F#K##O_9L=''```QD<>
+M(,9''P"-1"04B]U0:@1J/('C__\``(/#$8M4)#R!X___``"-=R)34NAF^?__
+MC40D*%#H#/S__X/$&(7`=#5&C5PD%$-&0T9#1D-#1HI#^XA&^XI#_(A&_(I#
+M_8A&_8I#_HA&_HI#_XA&_XH#B`;K'(/'`+@&````NP4```"%P'0+B\-+Q@8`
+M1H7`=?6+Q27__P``@\`0)?__``!0BT0D-/]0'(/$!*F`````=`;&1RP0ZP3&
+M1RP$B@^`^0IU)<9'(01=6UXSP%^#Q!S#@\8`QD<?`<9'(00SP%U;7E^#Q!S#
+M._^-1"0F@>7__P``4(M$)#1J`6H&@\41@>7__P``55#HC?C__S/`@\049HM$
+M)":I``$``'0<J0`"``!U#HM$)#1FBT`$9JD$`'4'N`$```#K`C/`A<!UEL9'
+M'P#&1R'_BD<>#`*(1QZ+1"0T9HM`!&:I!`!U$%U;7K@"````7X/$',.#QP!=
+M6UXSP%^#Q!S#._^#[`Q7BWPD((U$)`2+5"044(M$)"!J!"7_````4(M$)"0E
+M__\``%!2Z//W__^-1"084.B9^O__@\08A<!T-D>-3"0$04=!1T%'04%'BD'[
+MB$?[BD'\B$?\BD']B$?]BD'^B$?^BD'_B$?_B@&(!U^#Q`S#D+@&````N04`
+M``"%P'3LB\%)Q@<`1X7`=?5?@\0,PSO_@?\`````@?\`````@^P(5S/_5HMT
+M)!135<9&&P!J"%;HQR0``(/$"*D`"```#X2L````O1````"+QT<]Z`,``'XB
+M:@!J`&H`:@%J`6H&5NA8&P``N`$```"#Q!Q=6UY?@\0(PV:%KG(+``!T0S/`
+M9HM&%H/`""7__P``4(N&7`L``/]0'(O8,\!FBT86@\`))?__``!0BX9<"P``
+M_U`<P>`(9@O8@>/__P``@\0(ZR,SP&:+1A:#P`@E__\``%"+AEP+``#_4""+
+MV('C__\``(/$!/?#``@```^%6?___UU;7C/`7X/$",.#QP"#[`A7BWPD$%9F
+MBX=R"P``9JD0`'1&,\!FBT<6@\`&)?__``!0BX=<"P``_U`<B_`SP&:+1Q:#
+MP`<E__\``%"+AUP+``#_4!S!X`AF"_"+_H'G__\``(/$".LDD#/`9HM'%H/`
+M!B7__P``4(N'7`L``/]0((OX@>?__P``@\0$]\>`````7K@`````#Y7`7X/$
+M",.0@?\`````@?\`````@^P(5XM\)!!69HN'<@L``&:I$`!T1C/`9HM'%H/`
+M""7__P``4(N'7`L``/]0'(OP,\!FBT<6@\`))?__``!0BX=<"P``_U`<P>`(
+M9@OP@>;__P``@\0(ZR:#QP`SP&:+1Q:#P`@E__\``%"+AUP+``#_4""+\('F
+M__\``(/$!(O&@^#W9HOP9HN'<@L``&:I$`!T4(O&)?\```!0,\!FBT<6@\`(
+M)?__``!0BX=<"P``_U`$@>;__P``,\#!_@B!YO\```!69HM'%H/`"27__P``
+M4(N'7`L``/]0!(/$$.LE@\<`@>;__P``,\!69HM'%H/`""7__P``4(N'7`L`
+M`/]0"(/$"&:+AW(+``!FJ1``=$4SP&:+1Q:#P`8E__\``%"+AUP+``#_4!R+
+M\#/`9HM'%H/`!R7__P``4(N'7`L``/]0','@"&8+\(O^@>?__P``@\0(ZR,S
+MP&:+1Q:#P`8E__\``%"+AUP+``#_4""+^('G__\``(/$!/?'@````%ZX````
+M``^5P%^#Q`C#D(/L"%>+?"005F:+AW(+``!FJ1``=$8SP&:+1Q:#P`@E__\`
+M`%"+AUP+``#_4!R+\#/`9HM'%H/`"27__P``4(N'7`L``/]0','@"&8+\('F
+M__\``(/$".LF@\<`,\!FBT<6@\`()?__``!0BX=<"P``_U`@B_"!YO__``"#
+MQ`2+QH/("&:+\&:+AW(+``!FJ1``=%2+QB7_````4#/`9HM'%H/`""7__P``
+M4(N'7`L``/]0!('F__\``#/`P?X(@>;_````5F:+1Q:#P`DE__\``%"+AUP+
+M``#_4`2#Q!!>7X/$",.#QP"!YO__```SP%9FBT<6@\`()?__``!0BX=<"P``
+M_U`(@\0(7E^#Q`C#@^P,5XM\)!16BD<;A,`/A9@```!FBX=R"P``9JD0`'1'
+M,\!FBT<6@\`()?__``!0BX=<"P``_U`<B_`SP&:+1Q:#P`DE__\``%"+AUP+
+M``#_4!S!X`AF"_"!YO__``")="04@\0(ZR0SP&:+1Q:#P`@E__\``%"+AUP+
+M``#_4"`E__\``(E$)!"#Q`2+1"0,)0`+```]``,``'4<N`$```"(1QM>7X/$
+M#,,[_[@!````7E^#Q`S#D&:+AW(+``!FJ1``=$<SP&:+1Q:#P`8E__\``%"+
+MAUP+``#_4!R+\#/`9HM'%H/`!R7__P``4(N'7`L``/]0','@"&8+\(O^@>?_
+M_P``@\0(ZR4[_S/`9HM'%H/`!B7__P``4(N'7`L``/]0((OX@>?__P``@\0$
+M]\>`````#X5Q____7C/`7X/$#,.0@?\`````@?\`````@^P85XM\)"!64U5F
+MBX=R"P``9JD0`'1$,\!FBT<6@\`()?__``!0BX=<"P``_U`<B_`SP&:+1Q:#
+MP`DE__\``%"+AUP+``#_4!S!X`AF"_"!YO__``"#Q`CK))`SP&:+1Q:#P`@E
+M__\``%"+AUP+``#_4""+\('F__\``(/$!+@``P``9B/&/0`#```/A6P#``!F
+MBX=R"P``B]Z!X_?_``"!RP`(``!FJ1``=$LSP(K#4#/`9HM'%H/`""7__P``
+M4(N'7`L``/]0!('C__\``#/`P?L(@>/_````4V:+1Q:#P`DE__\``%"+AUP+
+M``#_4`2#Q!#K(Y"!X___```SP%-FBT<6@\`()?__``!0BX=<"P``_U`(@\0(
+M9HN'<@L``&:I$`!T13/`9HM'%H/`#B7__P``4(N'7`L``/]0'(OH,\!FBT<6
+M@\`/)?__``!0BX=<"P``_U`<P>`(9@OH@>7__P``@\0(ZR4[_S/`9HM'%H/`
+M#B7__P``4(N'7`L``/]0((OH@>7__P``@\0$9HEL)"9FA>T/A$\!``!FBX=R
+M"P``9JD0`'1&,\!FBT<6@\`&)?__``!0BX=<"P``_U`<B^@SP&:+1Q:#P`<E
+M__\``%"+AUP+``#_4!S!X`AF"^B!Y?__``"#Q`CK)H/'`#/`9HM'%H/`!B7_
+M_P``4(N'7`L``/]0((OH@>7__P``@\0$9HN'<@L``&:I$`!FB6PD)'1#,\!F
+MBT<6@\`$)?__``!0BX=<"P``_U`<B^@SP&:+1Q:#P`4E__\``%"+AUP+``#_
+M4!S!X`AF"^B!Y?__``"#Q`CK(S/`9HM'%H/`!"7__P``4(N'7`L``/]0((OH
+M@>7__P``@\0$@>7__P``BT0D)"7__P``P>`0"\5F]\8`!(E$)!AT(C/`BU0D
+M&&:+1"0F4#/`4F:+1Q90BX=<"P``_U`H@\0,ZR`SP(M,)!AFBT0D)E`SP%%F
+MBT<64(N'7`L``/]0$(/$#%?HGO?__X/$!(7`=`LSP%U;7E^#Q!C#D&:+AW(+
+M``!FJ1``=$,SP&:+1Q:#P`@E__\``%"+AUP+``#_4!R+\#/`9HM'%H/`"27_
+M_P``4(N'7`L``/]0','@"&8+\('F__\``(/$".LC,\!FBT<6@\`()?__``!0
+MBX=<"P``_U`@B_"!YO__``"#Q`2+QH/("&:+\&:+AW(+``!FJ1``=%"+QB7_
+M````4#/`9HM'%H/`""7__P``4(N'7`L``/]0!('F__\``#/`P?X(@>;_````
+M5F:+1Q:#P`DE__\``%"+AUP+``#_4`2#Q!#K)8/'`('F__\``#/`5F:+1Q:#
+MP`@E__\``%"+AUP+``#_4`B#Q`A7Z#S!__^#Q`2#R`%=6UY?@\08PSO_@?\`
+M````@?\`````@^P(5XM\)!!69HN'H`L``&:%P`^$[@(``#/`9HN'/@L``(/`
+M!`T```"`4#/`9HN'<`L``(/`%"7__P``4(N'7`L``/]0#&:+AZ`+``"#Q`AF
+MJ0(`=!YFQX>B"P```@!7Z(LT``"^`0```(/$!.DJ`@``._]FBX>@"P``9JD$
+M`'039L>'H@L```0`O@(```#I"`(``&:+AZ`+``!FJ0@`=!]FQX>B"P``"`!7
+MZ&`U``"^`P```(/$!.G?`0``@\8`9HN'H`L``&:I(`!T'V;'AZ(+```@`%?H
+MY#8``+X%````@\0$Z;,!``"#Q@!FBX>@"P``9JE``'0?9L>'H@L``$``5^@(
+M-P``O@8```"#Q`3IAP$``(/&`&:+AZ`+``!FJ8``=$=FQX>B"P``@`!J$C/`
+M9HN'<`L``(/`&"7__P``4(N'7`L``/]0#(/$"+X'````9HN'H`L``&8-`0!F
+MB8>@"P``Z3(!```[_V:+AZ`+``!FJ0`!=!]FQX>B"P````%7Z(@X``"^"```
+M`(/$!.D'`0``@\8`9HN'H`L``&:I$`!T,V;'AZ(+```0`&H(,\!FBX=P"P``
+M@\`8)?__``!0BX=<"P``_U`,@\0(O@0```#IQ````&:+AZ`+``!FJ0!`=#-F
+MQX>B"P```$!J"#/`9HN'<`L``(/`&"7__P``4(N'7`L``/]0#(/$"+X.````
+MZ80```!FBX>@"P``9JD!`'0O9L>'H@L```$`:@@SP&:+AW`+``"#P!@E__\`
+M`%"+AUP+``#_4`R#Q`@S]NM*._]J`VH`,\!FBX>@"P``4&H%:@!J!E?HH@\`
+M`(/$'#/`9L>'H@L```$`:@AFBX=P"P``@\`8)?__``!0BX=<"P``_U`,@\0(
+M,_8SP&:+ASX+``!0,\!FBX=P"P``@\`4)?__``!0BX=<"P``_U`,5C/`9HN'
+M<`L``(/`&"7__P``4(N'7`L``/]0##/`,\EFBX>B"P``B(^["P``]]!F(X>@
+M"P``@\009HF'H`L``(B/3`L``%Y?@\0(PX/'`(/L"#/`BTPD#&:+00*#^$%T
+M=H/X0G1]@_A##X2`````@_A$#X2#````@_A%#X2&````@_A&#X2)````@_A0
+M=`6#^&!U/F;'00(S`&:+D:`+``!F@\H09HN!H@L``&:)D:`+``!FA<!U&F:+
+M00)F/3``<A#&@;L+````4>AP_/__@\0$@\0(PY!FQT$",0"#Q`C#._]FQT$"
+M,@"#Q`C#._]FQT$",P"#Q`C#._]FQT$"-`"#Q`C#._]FQT$"-0"#Q`C#._]F
+MQT$"-@"#Q`C#._^#[!0SP%>+?"0<4V:+1P*#^$0/A(P````/C]("``"#^#8/
+MA.$!```/CY\"``"#^#1T<@^/6`(``(/X(0^%MP0``&:+1P1F_T<$9CT*``^&
+MI00``#/`9HN'<`L``(/`,B7__P``4(N'7`L``/]0((/(#R7__P``4%>+AVP+
+M``#_4#1FQT<"$`!J`&H`:@!H``(``&H`:@%7Z)0-``"#Q"CI5`0``#/`9HN'
+M<`L``(/`,B7__P``4(N'7`L``/]0((/$!(O09O?"`@`/A?$```"*A[L+``"*
+MR/[!/`.(C[L+```/CA$$``!FQT<"$`!7Z/T-``"+AV`+``!0BX=<"P``_U`\
+M@\0(,\!J!&H`9HM'`E!J!6H`:@97Z!,-```SP&:+ASX+``!0,\!FBX=P"P``
+M@\`4)?__``!0BX=<"P``_U`,,\!FBX=`"P``4#/`9HN'<`L``(/`%"7__P``
+M4(N'7`L``/]0#(/$+&H/5XN';`L``/]0-&H`,\!FBX=P"P``@\`()?__``!0
+MBX=<"P``_U`,@\005^A4#0``BY=@"P``4HN'7`L``/]0/,>'4`L```````"#
+MQ`CI.@,``#O_@>+__P``@\H!@>+__P``4E>+AVP+``#_4#1F_T<",\EFB4\$
+MB8]0"P``5XN';`L``/]0+&;'1P0``&;_1P*#Q`SI\@(``#O_9HM'!&;_1P1F
+M/0H`#X;>`@``,\!FBX=P"P``@\`R)?__``!0BX=<"P``_U`@@\@!)?__``!0
+M5XN';`L``/]0-,>'4`L```````!FQT<"$`!J`&H`:@!H``(``&H`:@%7Z,,+
+M``"#Q"A7Z'H,``"+CV`+``!1BX=<"P``_U`\@\0(Z6H"```[_X/X-0^%7P(`
+M`&:+1P1F_T<$9CT!``^&30(``%>+AVP+``#_4"QFQT<"-@!FQT<$``"#Q`3I
+M+P(``(/'`(/X0G0/#X\A`@``@_A!#X48`@``9HM'!&;_1P3I"P(``(/'`(/X
+M4`^$-P$``'\U@_A%#X7T`0``9HM'!&;_1P1F/04`#X;B`0``5XN';`L``/]0
+M+&;'1P)&`(/$!.G*`0``._^#^&`/A;\!``!FBX=R"P``BI=,"P``_L)FJ2``
+MB)=,"P``#X38````9HN'M`L``&:%P`^$R````(J'3@L``*@!#X2Z````:@$S
+MP&:+AW`+``"#P"XE__\``%"+AUP+``#_4`0SP&:+AW`+``"#P!HE__\``%"+
+MAUP+``#_4"!J`"4`#P``B]@SP&:+AW`+``"#P"XE__\``%"+AUP+``#_4`2#
+MQ!1F@?L``7949L='`D,`_X?8$```9HN'H`L``&8-$`!FB8>@"P``9HN'H@L`
+M`&:%P`^%[@```&:+1P)F/3``#X+@````QH>["P```%?H^_?__X/$!.G+````
+M@\8`9HN'H`L``&:%P'1$BH>["P``BM#^PCP>B)>["P``?C!J`#/`9HN'H@L`
+M`%`SP&:+AZ`+``!0:@%J`6H'5^B^"0``N.@#``"#Q!Q;7X/$%,,SP#/2BH?!
+M#@``BI?"#@``.\)T!OZ'30L``(N'1`L``*D!````C5`!B9=$"P``=$AH%`,`
+M`#/`9HN'<`L``(/`%"7__P``4(N'7`L``/]0#(N'1`L``,'H`5`SP&:+AW`+
+M``"#P!@E__\``%"+AUP+``#_4`R#Q!!;N.@#``!?@\04PY"!_P````"!_P``
+M``"#[`A7BWPD$&H/5XN';`L``/]0-(M$)!R#Q`B%P'0Y:@`SP&:+AW`+``"#
+MP`@E__\``%"+AUP+``#_4`R#Q`A7Z)L)``"+EV`+``!2BX=<"P``_U`\@\0(
+MQX=0"P```````%^#Q`C#D#O_@?\`````@^PT5XM\)#Q64U5FBT<"9CTA`'5R
+M:``#`(`SP&:+AW`+``"#P!0E__\``%"+AUP+``#_4`QJ!8U$)"!0,\!FBX=P
+M"P``@\`8)?__``!0BX=<"P``_U`PBT0D+&:)ASP+``!FBT0D+F:)ASX+``"+
+M1"0P9HF'0`L``(M$)#AFB8=""P``@\04,\!FBX=`"P``#0```(!0,\!FBX=P
+M"P``@\`4)?__``!0BX=<"P``_U`,,\!FBX=P"P``@\`8)?__``!0BX=<"P``
+M_U`DB_"X_P```&8CQH/$#$B#^`9W;_\DA<0````[_S/`9HN'<`L``(/`&"7_
+M_P``4(N'7`L``/]0)(/$!(O0@_H(#X2;````9L='`A``:@`E__\``,'J$%"!
+MXO__``!2:``!``!J`&H!5^AX!P``@\0<ZQ&#QP"#^$9U"5?H93@``(/$!#/`
+M9HN'0`L``%`SP&:+AW`+``"#P!0E__\``%"+AUP+``#_4`R!YO__```SP('.
+M`(```('F__\``%9FBX=P"P``@\`8)?__``!0BX=<"P``_U`(@\0075M>7X/$
+M-,,SP&:+1P*#^"%T*8/X-G6$9L='`C``5^BH!P``BY=@"P``4HN'7`L``/]0
+M/(/$".EN____9L='`C``:@!J`&H`:@!J`&H!5^BX!@``@\0<Z4[___\SP&:+
+MAW`+``"#P!@E__\``%"+AUP+``#_4"3!Z!!FB40D1#/`9HM'`H/$!(/X,G0[
+M@_A"#X2"````@_A0=`F#^&`/A3`#``"+1"1`9JD`@`^$(@,``&:I``@/A!P"
+M``#&AY\+``!DZ2\"``"+1"1`9JD`@'0X9HN'H`L``&8-$`!FB8>@"P``9HN'
+MH@L``&:%P'4:9HM'`F8],`!R$,:'NPL```!7Z/7S__^#Q`1FQT<",P#IE?[_
+M_X/'`(M$)$!FJ0"`#X0J`0``9JD`"'0,QH>?"P``9.LB@\<`BT0D0&:I``%T
+M"K@0````ZPB#QP"X!````(B'GPL``(M$)$!FJ0`"=`O&AYP+```"ZPD[_\:'
+MG`L```%FQT<"4`#'AT0+````````BX<H"P``C8\H"P``B8<P"P``,]*)ARP+
+M``"*A[8+``"(A[<+``"+GR@+``!FB5,$BP&+6R@[V'7S9HN'M`L``&:%P'1/
+M,]NX'P```"*'M@L``(OH9HN'M`L``&:%P'XTB70D$(V'M`L``(OPC41M`,'@
+M`XV$![P+``!05^AX-```18/$"(/E'T,/OP8[V'S<BW0D$%?HKR8``&H`,\"*
+MAYP+``!0,\"*AY\+``!0,\!FBX>."P``4&H`:@!7Z,<$``"#Q"#I7?W__X/&
+M`&;'1P)#`+@/````9B-$)$"#^`UU,XJ'G@L``(B'GPL``(J'G@L``(3`=5%J
+M`&H`:@!H``@``&H`:@)7Z'P$``"#Q!SK-X/&`(J'G0L``(B'GPL``&H`:@!J
+M`+C_````9B-$)$P-``<``"7__P``4&H`:@)7Z$,$``"#Q!QFQT<$``#IT_S_
+M_Y"+1"1`9JD``70*N!````#K"(/'`+@$````B(>?"P``BT0D0&:I``)T"\:'
+MG`L```+K"3O_QH><"P```6H`,\"*AYP+``!0,\"*AY\+``!0,\!FBX>."P``
+M4&H`:@!7Z-$#``"#Q!SI9_S__Y`SP&:+1P*#^#-T.8/X0W0B@_A0=`6#^&!U
+M=FH`:@!J`&@`"```:@!J`U?HF0,``(/$'&;'1P)$`%?H2@(``(/$!.L'D&;'
+M1P(T`&:+AZ`+``!F#0!`9HF'H`L``&:+AZ(+``!FA<`/A?K[__]FBT<"9CTP
+M``^"[/O__\:'NPL```!7Z#'Q__^#Q`3IU_O__Y!J`(O&)?__``!0,\!FBT<"
+M4&H%:@!J!E?H&P,``(/$'.FQ^___@\<`,\!FBX=P"P``@\`8)?__``!0BX=<
+M"P``_U`D:@!J`,'H$&H`B]@E__\``%!J`&H#5^C:`@``9HM'`H/$(&8]4``/
+M@F?[__]F]\,+#W0.9L='`D,`Z57[__^#Q@#&AX\0````Z4;[___&ATP+````
+MZ3K[__^!_P````"!_P````"#[`@SP%>+?"005E-FBX<^"P``#0```(!0,\!F
+MBX=P"P``@\`4)?__``!0BX=<"P``_U`,,\!FBX=P"P``@\`8)?__``!0BX=<
+M"P``_U`DB_`SP&:+AW`+``"#P!@E__\``%"+AUP+``#_4"0STH/$$&:+EZ(+
+M``"+SH/A?[@!````T^"+V"7__P``.\)T'VH!,\!FB\)0B\,E__\``%!J!6H`
+M:@97Z.4!``"#Q!QFQX>B"P````!FBT<"9CTQ`'539L='`C``5^B#`@``BY=@
+M"P``4HN'7`L``/]0/(/$"%M>7X/$",.0B\:#X'^#^`=U"5?HZ"<``(/$!(/F
+M?X/^#G0)5^AW[___@\0$6UY?@\0(PY"+QL'H$*D`(```=<AJ`H'C__\``,'N
+M$('F__\``%93:@5J`&H&5^A1`0``@\0<6UY?@\0(PX/'`(UT)@"#[!0STC/)
+M5XM\)!Q64U6*E\$.``"*A[8+``"(C[D+``"(A[<+```SP(J'P@X``(B/N@L`
+M`#O"#X2)````B^^-A6`+``"-M<(.``")1"0<C87"#@``C;W!#@``B40D&(V=
+MO`X``(J5P@X``+D?````(LIJ`8T,2<'A`HV$#<0.``")1"08BPB+1"0@48L`
+M4(N%7`L``/]01(M$)"2#Q`R*E<(.``#^PH@0,]*+1"049@^V0`1F`P-FB0,S
+MP(H&BA<[PG6AB_UFBY>\#@``BH?"#@``9H/Z((B'PPX``'0D)?\```!0,\"*
+MA\$.``!0,\!FB\)0:@)J`6H&5^A`````@\0<9L>'O`X``"``,\F(C[X.``"(
+MC[\.``"(C\`.``"(C\$.``"(C\,.``"(C\(.``!=6UY?@\04PSO_C70F`(/L
+M$%>+1"0<5HMT)!QFB40D"(M$)"0S_XA$)`IFBX:8"P``9HE$)`R+1"0H9HE$
+M)!"+1"0L9HE$)!*+1"0P9HE$)!2+1"0T9HE$)!:+1"0DA,!T+L:&G`L```!F
+MBT8"9L=&`C``9CU``+@`````#Y?`:@"+^%:+AFP+``#_4`2#Q`B*AIP+``"(
+M1"0+C40D"%"+EF`+``!2BX9<"P``_U`X@\0(A?]T"5;H$@```(/$!%Y?@\00
+MPY`[_X'_`````(/L%#/`,])7BWPD'%9358J7N`L``(J'M@L``#O"#X2'````
+MB^^-A;8+``"-G;8+``")1"0<C86T"P``C;6X"P``C;U@"P``B40D&(J5M@L`
+M`+D?````(LIJ`8T,2<'A`XV$#;P+``"+2!11:@%J`(L'4(N%7`L``/]02(M$
+M)#"#Q!2*E;8+``#^PH@0BT0D&&:+E;0+``!F2F:)$#/2,\"*%HH#.\)UHXO]
+M9HN'M`L``&:%P'0K,\"*A[H+``!0,\"*A[<+``!0,\!FBX>T"P``4&H#:@%J
+M!E?H8O[__X/$'#/)9HF/M`L``(B/M@L``(B/MPL``(B/N`L``%?H_OS__X/$
+M!%U;7E^#Q!3#@\<`5U:+="0,N!\```"+3"00(H;!#@``C01`P>`"C;P&Q`X`
+M`(M$)!2)!XI$)!C&1P4`B$<(BH;!#@``_L"(AL$.``!15HN&;`L``/]0((A'
+M!(/$"%Y?PX/'`#O_@?\`````QP7\`P``````_X/L#%>_@````%93QT0D%```
+M``!5B_>!YH"`@(`S_HO6P>H/`_\S^O?&@````'0&@?<$P1VWBTPD&+X!````
+MT^:[``$``"O>@?L``0``#XVC````B\.+#)T`````*\:+US/10XD4A0````"!
+M^_T```!]78O#BPR=`````"O&B]<ST8D4A0````"+UXO#@\,$*\:-+(4`````
+MBP2=]/___S/0B94$````B]<S%)WX____B94(````B]>+#)W\____,]&!^_T`
+M``")E0P```!\HX'[``$``'T?B\.+#)T`````*\:+US/10XD4A0````"!^P`!
+M``!\X8M4)!A"B50D&(/Z"`^,#/___UU;7E^#Q`S#._^-="8`5U93BT0D&%6+
+M="08BUPD%(/^$(LX#XR2````]\,#````="2+QS/2P>@(BA.!Y_\```!.,]=#
+M,P25`````/?#`P```(OX==R+QL'X`H7`C6C_=%>#PP0S>_R+QX'G_P```,'H
+M"#,$O0````"+^,'H"('G_P```#,$O0````"+^,'H"('G_P```#,$O0````"+
+M^,'H"('G_P```#,$O0````"+^(O%387`=:F#Y@.+QDZ%P'0BB\<STL'H"(H3
+M@>?_````0S/7,P25`````(OXB\9.A<!UWHM$)!R).%U;7E_#@\<`@?\`````
+M@?\`````4(M$)!3'!"0`````5[\!````5HUP_U-5BVPD((7`=%.+5"0<BUPD
+M&(U$)!"-2@&#XA^)3"0<C1124,'B`X7VC9P3O`L``'0(,\!FBT,(ZP*+Q2O'
+M4(L+`_E7Z+'^__\SP(/$#&:+0P@S_ROHB\9.A<!UK5U;7HM$)`0]./LBA+@`
+M````#Y7`7X/$!,.-="8`5U93BT0D%(M,)!"+.(I`#Z@!#X2'````BD<(J(!T
+M#;L?````BE<.(MKK`Y`SVXM$)!2-4Q5FBT`*)?__```[PG5=OOK___\SP#/2
+MBH0QB`L``(I4-P@[PG5"1GSJ,\"-?!\.O@8```"*!R7O````/>0```!U*3/`
+MBD<!)>\````]Y````'48BD<"/`-U$8M'`ST`!)`'=!#K!3O_@\8&,\!;7E_#
+M@\<`6UZX`0```%_#@\<`@?\`````@?\`````5XM\)`Q6BW0D#&:+1PAF/34`
+M<S**AGT+```D_(B&?0L``&@``0``5HN&;`L``/]0'&H`:@!J`&H#:@!J!5;H
+M+?K__X/$)#/`BQ>*0@$EP````(/X0'595U;HXO[__X/$"(7`=#**AGT+```D
+M_(B&?0L``&@``0``5HN&;`L``/]0'&H`:@!J`&H!:@!J!5;HW/G__X/$)(J&
+M?0L``*@!=0N*1P^H`W4$QD<.`5Y?PY"*AGT+``"H`G7RZ^R-="8`@^P8,\`S
+MTE>+?"0@5E-5BI?##@``BH?"#@``.\(/A((```")?"0@B\<%P@X``(E$)"2+
+M;"0@C3"->`&-6/J*E<(.``"Y'P```"+*C0Q)P>$"C8P-Q`X``&8/MD$$9@,#
+M9HD#BT0D)(J5P@X``/["B!"*00B$P'4=,\!FBT$&4(L)48N%8`L``%"+A5P+
+M``#_4$2#Q`PSP#/2B@:*%SO"=9V+?"0@,\`STHJ'M@L``(J7MPL``#O"#X0B
+M`0``B7PD$(V'8`L``(E$)""-A[<+``")1"0<C8=R"P``B40D&(O'C9^V"P``
+MC;A]"P``C;"T"P``NA\```"+;"00B@N+1"08(M&-%%+!X@-F]P"``(VL%;P+
+M``!T7(I%#H3`=56+31`SP%%FBT4*4(M$)!B*@+8+```E_P```%"+1"0<4.BL
+M_/__@\00A<!T'8M$)!#_@,@0``"*%_;"!'0(QD4.`NL&.__&10X!9HM5"F:#
+MZ@1FB54*BD40B@L"P8@#9HL&9BM%$&:)!HH'J`-T#E6+5"044NBH_?__@\0(
+M,\"*10Y0BTT448M%$%`SP&:+10I0BT0D,(L0BT0D(%*+@%P+``#_4$B+5"0P
+M@\04,\"*$HH#@>+_````.\(/A13___]=6UY?@\08PY`[_X'_`````(M$)`B+
+M5"0$A<"-2/]T"XO!2<8"`$*%P'7UPY"-="8`9HM,)`2+P8'A__\``,'A""7_
+M_P``P?@(@>$`_P``)?\````+P27__P``PY"-="8`5S/`9HM$)`Q0BT0D#/]0
+M'(OX,\!FBT0D$$`E__\``%"+1"00_U`<P>`(9@OXB\<E__\``(/$"%_#@\<`
+MC70F`#/`BD0D#%`SP&:+1"0,4(M$)`S_4`0SP&:+1"04P?@()?\```!0,\!F
+MBT0D%$`E__\``%"+1"04_U`$@\00PY"+3"0$B]&+P<'J",'H&('B`/\```O"
+MB]'!X@C!X1B!X@``_P`+P@O!PX/'`(UT)@!7BWPD"%9FBX=R"P``9JD0`'15
+M,\`STF:+1Q9FBU0D$`/")?__``!0BX=<"P``_U`<B_`SP&:+1Q8STF:+5"04
+MC400`27__P``4(N'7`L``/]0','@"&8+\(O&)?__``"#Q`A>7\,[_S/`,])F
+MBT<69HM4)!`#PB7__P``4(N'7`L``/]0("7__P``@\0$7E_#@\<`@?\`````
+M@?\`````5XM\)`AFBX=R"P``9JD0`'1:,\`STF:+5"0,BD0D$%`SP&:+1Q8#
+MPB7__P``4(N'7`L``/]0!#/`,])FBT0D&,'X"&:+5"04)?\```!0,\!FBT<6
+MC40"`27__P``4(N'7`L``/]0!(/$$%_#,\`STF:+1"004#/`9HM'%F:+5"00
+M`\(E__\``%"+AUP+``#_4`B#Q`A?PY`[_X'_`````%>+?"0(:/\````SP&:+
+M1Q:#P`<E__\``%"+AUP+``#_4`2+1"04@\0(A<!T7C/`9HM'!H/X`G18@_@#
+M=4YH_@```#/`9HN'<`L``(/`'27__P``4(N'7`L``/]0!&B`````,\!FBX=P
+M"P``@\`?)?__``!0BX=<"P``_U`$:C*+AUP+``#_4#2#Q!1?PX/'`&H',\!F
+MBX=P"P``@\`")?__``!0BX=<"P``_U`$:(`````SP&:+AW`+``"#P`,E__\`
+M`%"+AUP+``#_4`1J,HN'7`L``/]0-(/$%%_#@\<`BU0D!#/`9HM"%E"+DEP+
+M``!2Z,F-__^#Q`C#D(UT)@!7BWPD"%?HE9#__S/`@\0$BY>4$```BD=8`\*+
+MEZ`0``")AY00```SP(N/G!```(I'6@/!BX^L$```B8><$```,\"*1UL#PHN7
+MJ!```(F'H!```#/`BD=>`\*+E[`0``")AZ@0```SP(I'7P/!BX^\$```B8>L
+M$```,\"*1V`#PHN7N!```(F'L!```#/`BD=B`\*+E\`0``")A[@0```SP(I'
+M9`/!B8>\$```,\"*1V4#PHF'P!```(J'?@L``(3`="'&AWX+````C8>4$```
+M4(N78`L``%*+AUP+``#_4$"#Q`A?PSO_._^!_P````!FBTPD"(M4)`2+P8'A
+M__\``,'A""7__P``P?@(@>$`_P``)?\````+P6:)0A"+1"0,B4(2BT0D$(E"
+M:#/`:)````!FBT(6@\`')?__``!0BX)<"P``_U`$@\0(PXUT)@"+5"0$9HM"
+M$&:%P'0KQT)L`````&B(````,\!FBT(6@\`')?__``!0BX)<"P``_U`$@\0(
+MPX/'`%+HLI/__X/$!,,[_X'_`````('_`````%"+5"0(BT)LA<!T#<=";```
+M``!2_]"#Q`2#Q`3#@\<`BT0D#(M4)`A`4%+_5"0,@\0(A<!U%8M,)`R+1"0(
+M45#_5"0,@\0(A<!T";@!````PX/'`#/`PY`[_X'_`````%>+?"0(,\`SR6:+
+M1Q:)3VAFB8^@"P``@\`(B4]L)?__``!0BX=<"P``_U`<@\@()?\```!0,\!F
+MBT<6@\`()?__``!0BX=<"P``_U`$9HN'<@L``(/$#&:I`@!T/#/`9HM'%H/`
+M"27__P``4(N'7`L``/]0'(/(`27_````4#/`9HM'%H/`"27__P``4(N'7`L`
+M`/]0!(/$#%?HH;'__V;'1P)!`&;'1P0``(/$!%_#BU0D"(M,)`124>A!_/__
+MBT0D#&;'0`(A`(/$",.#QP!0BT0D"%=64XU8'%6+;"0<9C/_,_:+Q27__P``
+M4/\3P?@$@>?__P``P><$@\0$"_A&@_X$?-^^_/___XM,)""+QXO1)?__``"!
+MXO__```[PG0NB\>!Y___``#!_P0E__\``,'@#`O'1HOX?-.^!````#/`75M>
+M7X/$!,.0ZP4[_X/&!%U;7K@!````7X/$!,-3,\!FBT0D#%"+1"0,_U`<,](E
+M_@```(H5``````O",]**5"04"\**V#/`BL-0,\!FBT0D%%"+1"04_U`$N`$`
+M```BPX/$#*(`````6\,[_U,SP&:+1"0,4(M$)`S_4!PSTB7^````BA4`````
+M"\(STHI4)!3WTH'B_P```"/"BM@SP(K#4#/`9HM$)!10BT0D%/]0!+@!````
+M(L.#Q`RB`````%O#._\[_X'_`````#/`9HM$)`A0BT0D"/]0'(/@`8/$!,,[
+M_SO_@?\`````@^P85U9356@VE```BT0D-"7__P``BU0D,(/`'B7__P``4%+H
+M>/[__X/$#(7`=!U=6UZX`P```%^#Q!C#N`(```!=6UY?@\08PX/'`&A&D@``
+MBT0D-"7__P``BTPD,(/``B7__P``4%'H,_[__X/$#(7`=<B+1"0P)?__``"#
+MP`-FB40D("7__P``4(M$)##_4!S&1"0I!XK8B$0D*XM$)#"+="0D@\`$B40D
+M'(UX&#/`BL.#X+^)1"08@\0$,\`STHI4)"6*PS/")?\```!0B\8E__\``%"+
+M1"0@_Q!J8?\7B\8E__\``%#_%S/2@\00BE0D)3/"BU0D%(K8,\"*PX/@OSO0
+M=3'^3"0E=;`SP(I$)"=0BT0D)"7__P``4(M$)#3_4`2#Q`BX`0```%U;7E^#
+MQ!C#@\<`,\"*1"0G4(M$)"0E__\``%"+1"0T_U`$BT0D."7__P``@\`")?__
+M``!0BT0D./]0'(K8,\"(7"0SN3\````BV8A,)#&(7"0RBL-0BT0D0"7__P``
+M@\`")?__``!0BT0D0/]0!(M\)$2+1"1`@>?__P``@\<"C7`<@\`$B40D+(/$
+M%#/`,]**5"0EBL,SPB7_````4(O')?__``!0BT0D(/\0:F'_%HO')?__``!0
+M_Q8STH/$$(I4)"4SPC/2BM@SP(I$)":*TSO"#X6I````_DPD)76M,\"*1"0G
+M4(M$)#0E__\``(/``B7__P``4(M$)#3_4`2+1"0H)?__``!0BT0D./]0'(K0
+MBT0D.+_V____@\0,C7`<B5PD$(O:BVPD((O%)?__``!0_Q8STH/$!(K3.\)U
+M,D=\Z(M<)!"_"@```/;#!G4-75M>N`D```!?@\08P_;#!'1"75M>,\!?@\08
+MPY#K!3O_@\<*75M>N&,```!?@\08PS/`BD0D)U"+1"0T)?__``"#P`(E__\`
+M`%"+1"0T_U`$@\0(BT0D,"7__P``0&:)1"0B)?__``!0BT0D,/]0',9$)"D'
+MBMB+1"0P9HML)":(7"0KC7@<C7`$,\"*PX/@OXE$)!R#Q`0SP#/2BE0D)8K#
+M,\(E_P```%"+Q27__P``4/\6:F'_%XO%)?__``!0_Q>*5"0U@\00BMB+PS+"
+MBU0D&(K8,\"*PX/@OSO0#X7I````_DPD)76N,\"*1"0G4#/`9HM$)"90BT0D
+M-/]0!+_X____BT0D-&:+;"0JBEPD+XA<)"Z-<!R#P`2)1"0@@\0(BD0D)C1`
+MB$0D)C/`BL.#\$`E_P```%"+Q27__P``4(M$)"#_$&IA_Q:+Q27__P``4/\6
+MBMB#Q!`SP#/2BD0D)HK3.\)U-$=\MS/`OP@```"*1"0G4#/`9HM$)"90BT0D
+M-/]0!(/$"+@'````75M>7X/$&,,[_^L%._^#QP@SP(I$)"<EOP```%`SP&:+
+M1"0F4(M$)#3_4`2#Q`BX!0```%U;7E^#Q!C#._\SP(I$)"=0,\!FBT0D)E"+
+M1"0T_U`$@\0(N&,```!=6UY?@\08PSO_@?\`````@?\`````@^P(,\!75HMT
+M)!1FBT86@\`()?__``!0BX9<"P``_U`@@\0$B_AF]\=``0^%%@$``&B`````
+M,\!FBT86@\`()?__``!0BX9<"P``_U`$:"P!``"+AEP+``#_4#0SP&:+1A:#
+MP`@E__\``%"+AEP+``#_4!RZ`P```(/@9&8CUPO0,\"*PE`SP&:+1A:#P`@E
+M__\``%"+AEP+``#_4`0SP&:+1A:#P!4E__\``%"+AEP+``#_4!PE_P```%`S
+MP&:+1A:#P!4E__\``%"+AEP+``#_4`0SP&:+1A:#P!`E__\``%"+AEP+``#_
+M4""#Q"@E"`$``#T(`0``=4R_Z/___S/`9HM&%H/`'"7__P``4(N&7`L``/]0
+M)#/`9HM&%H/`$"7__P``4(N&7`L``/]0((/$"*D``0``=`I'?,._&````.L#
+M@\<8,\!FBX9P"P``@\`2)?__``!0BX9<"P``_U`<@^`_4#/`9HN&<`L``(/`
+M$B7__P``4(N&7`L``/]0!(/$#%Y?@\0(PSO_C70F`(/L%#/`5XM\)!Q64U5F
+MBT<6@\`5)?__``!0BX=<"P``_U`<@\0$BMCVPT`/A6<!```SP&:+1Q:#P!`E
+M__\``%"+AUP+``#_4""#Q`2+\&:I``$/A#,!```SP&:+1Q:#P!@E__\``%"+
+MAUP+``#_4"0SP&:+1Q:#P!@E__\``%"+AUP+``#_4"0SP&:+1Q:#P!@E__\`
+M`%"+AUP+``#_4"0SP&:+1Q:#P!@E__\``%"+AUP+``#_4"0SP&:+1Q:#P!@E
+M__\``%"+AUP+``#_4"0SP&:+1Q:#P!@E__\``%"+AUP+``#_4"2#Q!B+Z&;W
+MQ@@`=72^XO___S/`9HM'%H/`$"7__P``4(N'7`L``/]0)(/$!"4(`0``/0`!
+M``!U:#/`9HM'%H/`&"7__P``4(N'7`L``/]0)(/$!#O%=4E&?+<SP+X>````
+M9HM'%H/`%27__P``4(N'7`L``/]0'(K8@\0$ZS([_V:+AW(+``!FJ0`(=2,[
+M_7<2C8?L$```.\5S%>L&@\<`@\8>,\!=6UY?@\04PX/'`#/`BL-0,\!FBT<6
+M@\`5)?__``!0BX=<"P``_U`$@\0(N`$```!=6UY?@\04PX/'`#O_@?\`````
+M@^PD,\!7BWPD+%935<9'&P!FBT<6@\`0)?__``!0BX=<"P``_U`<B$0D-S/`
+M9HM'%H/`#B7__P``4(N'7`L``/]0((OP,\!FBT<6@\`8)?__``!0BX=<"P``
+M_U`DB]B#Q`R*1"0SJ`@/A7H!```SP(I$)#/!^`2#X`.(1"0QBH=X"P``BE0D
+M,830#X00`0``@\,$BT/\B40D)#/`BL+WV(/@`V:)1"0J)?__``"#^`%T:H/X
+M`@^$E0```(/X`P^%NP```#/`,])FBT<6BE0D,8U$$!\E__\``%"+AUP+``#_
+M4!R*R(M$)"C!Z`@STHK1P>(8"\(STE`SP&:+1Q:*5"0YC400'"7__P``4(N'
+M7`L``/]0#(/$#.ME._^+1"0D,]+!Z!@E_P```%`SP&:+1Q:*5"0UC400'"7_
+M_P``4(N'7`L``/]0!(/$".LR@\<`BT0D)#/2P>@0)?__``!0,\!FBT<6BE0D
+M-8U$$!PE__\``%"+AUP+``#_4`B#Q`@STHO&9HM4)"HE__\``#O"?`=F*_+K
+M!3O_9C/VQD0D,0`SP(I$)#&#P`-F`_!F]\;\_W0L@>;__P``,\#!_@*!YO__
+M``!64V:+1Q:#P!PE__\``%"+AUP+``#_4!B#Q`Q=6UY?@\0DPY`SP(I$)#/!
+M^`2#X`,+V&:%]G4-9L=$)"@!`.G=````D&;'1"0H``"+TXO&@>+__P``)?__
+M``#WVH/B`X/"7#O"#X^V````:F&+AUP+``#_4!QJ88N'7`L``/]0'#/`9HM'
+M%H/`#B7__P``4(N'7`L``/]0((O()?__``"#Q`R+UH'B__\``#O"='*)7"00
+MB]F]^/___V:%VW16:F&+AUP+``#_4!QJ88N'7`L``/]0'&IABX=<"P``_U`<
+M:F&+AUP+``#_4!PSP&:+1Q:#P`XE__\``%"+AUP+``#_4""#Q!1%B]A\K[T(
+M````ZP:#QP"#Q0AF_T0D*(M<)!"+1"0H9H7`#X2"````,\!FBT<6@\`$)?__
+M``!0BX=<"P``_U`@B^@SP&@0`0``9HM'%H/`!"7__P``4(N'7`L``/]0"#/`
+M9HM'%E"+AUP+``#_4""+R(O#]]AF`\@SP('E__\``+K_````58'F`/\``&:+
+M1Q9F(]&#P`0+\B7__P``4(N'7`L``/]0"(/$&/?#`P```'1-,\!FBT<6@\`<
+M)?__``!0BX=<"P``_U`DB40D*(/$!(O#N@,```"#X`.-;"0D9B/3`^B#^@1T
+M%KD$````14-F3HI%_XA#_W0%0CO1=>]F]\;\_W0LB\8E__\``,'X`B7__P``
+M4#/`4V:+1Q:#P!PE__\``%"+AUP+``#_4#"#Q`R+QB7\_P```]AF]\8#``^$
+MT/W__S/`9HM'%H/`'"7__P``4(N'7`L``/]0)(E$)"B#Q`0STF;WQ@,`C40D
+M)`^.H/W__XUH`;\#````9B/^0HH`B50D'(UW_8@#0SO6?2NY!````(I%`$6(
+M`T.*10!%B`-#BD4`18@#0XI%``/118@#0SO6?-Z)5"0<BU0D'#O7#XU-_?__
+MBTPD'(I%`$5!B`.)3"0<0SO/?.Q=6UY?@\0DPSO_:,`````SP(M4)`AFBT(6
+M@\`4)?__``!0BX)<"P``_U`$@\0(PX/'`#O_@?\`````5XM\)`A6BH=\"P``
+MA,!U'6H`,\!FBT<6@\`4)?__``!0BX=<"P``_U`$@\0(,\`S]F:+1Q:#P`8E
+M__\``%"+AUP+``#_4""#Q`2I@````'035^A)DO__@\@!@\0$B_#K)8/&`(I'
+M&X3`=0U7Z-_X__^#Q`2%P'0.5^BB^O__O@$```"#Q`2*AWP+``"$P'4@:,``
+M```SP&:+1Q:#P!0E__\``%"+AUP+``#_4`2#Q`B+QEY?PX/'`#O_@?\`````
+M:,`````SP(M4)`AFBT(6@\`4)?__``!0BX)<"P``_U`$@\0(PX/'`#O_@?\`
+M````5XM\)`AJ`#/`9HN'<`L``(/`+B7__P``4(N'7`L``/]0!&@```"`,\!F
+MBX=P"P``@\`4)?__``!0BX=<"P``_U`,,\!FBX=P"P``@\`8)?__``!0BX=<
+M"P``_U`D,\!FBX=P"P``@\`4)?__``!0BX=<"P``_U`D@\08/00``("X````
+M``^4P%_#._^-="8`5XM\)!!6,_93BUPD$%6+;"08B\='4%7_TX/$"(7`=`RX
+M`0```%U;7E_#._]&@_X$?.!=6UXSP%_#@\<`C70F`(/L)%=64U6+1"0XBI!.
+M"P``@.+(B)!."P``9HN0<@L``&;WPH``=$"+@!0+```STHE$)##WV(/@!XE$
+M)"2+1"0XBTPD)(N`$`L``(E$)"R+1"0XBX`8"P``*\&Y+````/?QB40D(.LM
+MQT0D("````"+1"0XBX!D"P``@\`(B40D,/?8@^`'B40D)(M$)#B#P`B)1"0L
+MBU0D,#/VBWPD)`/7B50D,(M4)"`[U@^.X````(E\)!"+1"0XC7K_BU0D,(ET
+M)!2-L'(+``"+;"0DBTPD+`/I,]N-7!,0BTPD$(M$)"P#R&;W!H``=!EFQT$&
+M``!FQT$$`(!FQP$0`(E9".L3@\<`,])FB5$&9HD1B5$(9HE1!(M4)!"+1"04
+M@\(L.\>)5"00=15FQT$"``"+5"0PB6DH@\H#B5$,ZSV+5"040HT$4HT4U0``
+M```#T,'B`HM$)#`#T(E1#&;W!H``=0:#R@.)40QFQT$"``"+5"00BT0D+`/0
+MB5$H@\,LBTPD%$&+1"0@B4PD%#O(#XQ)____BUPD)(M$)#B+5"0L,_8#VHM,
+M)"")F"@+```[SHM#*(M`*(M`*(M`*(MX*'YZB5\@BT,HBV\H1HE8)(UY_8M;
+M*#OW?4.)72"+;2B+0RB#Q@0[]XE8)(M;*(E=((MM*(M#*(E8)(M;*(E=((MM
+M*(M#*(E8)(M;*(E=((M#*(MM*(E8)(M;*'R]BT0D(#OP?1B)72"+0RB+;2A&
+MB5@DBU0D((M;*#OR?.B+1"0XBU0D,(F0-`L``&:+@'(+``!FJ8``=`4S_^L&
+MD+^`!0``,_:+1"0XBXAD"P``BT0D.(U,.0@#^(O9]]F#X0<#V8U\#PB)?"0H
+M,_^)7"0P,\F#QRR+5"0H@_X?C6PZU&:)30*)30AFB4T`B5T<9HE-!'469HE-
+M!HM4)#"#R@.)50R+5"0HZQH[_V:)30:+1"0PC10XBT0D*(/*`XE5#(T4.(/#
+M+$:)52B#_B!\I(M<)"B+1"0XON#___^)F!P+``"+0RB+0"B+0"B+0"B+>"B)
+M7R"+?RB+0RB#Q@2)6"2+6RB)7R"+?RB+0RB)6"2+6RB)7R"+?RB+0RB)6"2+
+M6RB)7R"+0RB+?RB)6"2+6RA\OXM$)#B^(````(M4)#")D#@+``"*D$X+``"`
+MR@B+B!P+``")B"0+``")B"`+``"(D$X+``!=6UY?@\0DPY`[_X'_`````(/L
+M2#/`5XM\)%!FBX<\"P``#0```(!0,\!FBX=P"P``@\`4)?__``!0BX=<"P``
+M_U`,:A&-1"004#/`9HN'<`L``(/`&"7__P``4(N'7`L``/]0,(M$)!R#Q!2(
+MA]P0``"*1"0)B(?=$```BD0D"HB'WA```(I$)`N(A]\0``"+1"0,B(?@$```
+MBD0D#8B'X1```(M$)#!FB8?B$```9HM$)"IFJ0!`=$^*1"0ZB(?D$```BD0D
+M.XB'Y1```(M$)#R(A^80``"*1"0]B(?G$```BD0D/HB'Z!```(I$)#^(A^D0
+M``!FBT0D*F:)AXX+``!?@\1(PSO_,\F(C^00``"(C^40``"(C^80``"(C^<0
+M``"(C^@0``"(C^D0``#KQ5>+?"0(:APSP&:+AW`+``"#P!@E__\``%"+AUP+
+M``#_4`PSP&:+1P90,\!FBX>:"P``4#/`BH>?"P``4(N';`L``/]0,%`SP&:+
+MAW`+``"#P!@E__\``%"+AUP+``#_4`R+EX(+```SP%)FBX=P"P``@\`8)?__
+M``!0BX=<"P``_U`,,](SP&:+EY@+``!FBX>&"P``@\($P>(0"\)0,\!FBX=P
+M"P``@\`8)?__``!0BX=<"P``_U`,:```#P`SP&:+AW`+``"#P!@E__\``%"+
+MAUP+``#_4`PSP&:+AW`+``"#P"@E__\``%"+AUP+``#_4"`E\/```%`SP&:+
+MAW`+``"#P!@E__\``%"+AUP+``#_4`R#Q$!?PSO_C70F`(/L"#/`5XM\)!!6
+M4VHJ9HN'<`L``(/`&"7__P``4(N'7`L``/]0##/V@\0(9HNWB`L``(J'GPL`
+M`,'F$#P$=`.#SA`SVXJ??0L``/?#`@```'0#@\X$]\,!````=`.#S@(SVV:+
+MGYH+``#WPT````!T!H'.``0``/?#(````'0&@<X`@```5C/`9HN'<`L``(/`
+M&"7__P``4(N'7`L``/]0#(N7B@L``#/`4F:+AW`+``"#P!@E__\``%"+AUP+
+M``#_4`R+CY`+```SP%%FBX=P"P``@\`8)?__``!0BX=<"P``_U`,BX>4"P``
+M4#/`9HN'<`L``(/`&"7__P``4(N'7`L``/]0##/V@\0@BY8`````,\!29HN'
+M<`L``(/`&"7__P``4(N'7`L``/]0#(/$"(/&!(/^$GS39L='`D(`6UY?@\0(
+MPY`[_X'_`````&H(,\"+5"0(9HN"<`L``(/`&"7__P``4(N"7`L``/]0#(/$
+M",.#QP`[_X'_`````&H(,\"+5"0(9HN"<`L``(/`&"7__P``4(N"7`L``/]0
+M#(/$",.#QP`[_X'_`````%>+?"0(:@HSP&:+AW`+``"#P!@E__\``%"+AUP+
+M``#_4`R+EY0+```SP%)FBX=P"P``@\`8)?__``!0BX=<"P``_U`,@\007\.#
+MQP"-="8`5XM\)`AJ"C/`9HN'<`L``(/`&"7__P``4(N'7`L``/]0#(N7D`L`
+M`#/`4F:+AW`+``"#P!@E__\``%"+AUP+``#_4`R#Q!!?PX/'`(UT)@!75HMT
+M)`PSP&:+AG`+``"#P!@E__\``%"+AEP+``#_4"2+^"7_````BY:4$```BXZ8
+M$````\*+EIP0``")AI00``"+Q\'H""7_`````\&)AI@0``"+Q\'H$,'O&"7_
+M`````\*+EJ`0``")AIP0```SP&:+AG`+``"!Y_\````#^H/`&(F^H!```"7_
+M_P``4(N&7`L``/]0)(OX)?\```"+CJ00``"+EJ@0```#P8N.L!```(F&I!``
+M`(O'P>@()?\````#PHN6K!```(F&J!```(O'P>@0P>\8)?\````#PH'G_P``
+M`(F&K!```#/`9HN&<`L```/Y@\`8B;ZP$```)?__``!0BX9<"P``_U`DB_@E
+M_P```,'O"(N6M!````/"BY:X$```@>?_````B8:T$````_J)OK@0``!6Z"_Z
+M__^#Q!"*AGX+``"$P'0AQH9^"P```(V&E!```%"+CF`+``!1BX9<"P``_U!`
+M@\0(7E_#._^!_P````"!_P````!J$C/`BU0D"&:+@G`+``"#P!@E__\``%"+
+M@EP+``#_4`R#Q`C#@\<`._^!_P````!7BWPD"&H*,\!FBX=P"P``@\`8)?__
+M``!0BX=<"P``_U`,@\0(BH>?"P``N@`!```\!'0$9H/*$#/)BH]]"P``]\$"
+M````=`1F@\H$]\$!````=`1F@\H"@>+__P``,\!29HN'<`L``(/`&"7__P``
+M4(N'7`L``/]0"(/$"%_#D&H(,\"+5"0(9HN"<`L``(/`&"7__P``4(N"7`L`
+M`/]0#(/$",.#QP`[_X'_`````&:+1"0(BU0D!&8+@J`+``!FB8*@"P``9HN"
+MH@L``&:%P'4:9HM"`F8],`!R$,:"NPL```!2Z`;%__^#Q`3#._]7BWPD"%?H
+MQ=?__XN78`L``%*+AUP+``#_4#R#Q`A?PU>+?"0(4S+;#[Z'3@L``*F`````
+M="NI!````'03BH=."P``#""(ATX+``#K%(/&`(J'3@L``"1?@,L$B(=."P``
+MBH=."P``J$!T-*@"=`T,$(B'3@L``.LF@\8`BH=."P``)*^(ATX+``"*AW@+
+M``"H`G0(@,L!ZP:#QP"`RP*$VW0C,\"*PU`SP&:+AW`+``"#P"@E__\``%"+
+MAUP+``#_4`2#Q`@SP(J73PL``(K#]]`BPHB'3PL``%M?PX/'`(/L(%=64U5F
+MQT0D+@@`QT0D*``````S]HM$)#2+N"0+``"+1"0XB7PD)&:+`&:%P`^$S@``
+M`(M$)#@SR8U8!&:+0PB)7"0<9H7`#X28````,\!!9HM#"(/`!F8!1"0NBT0D
+M%(E$)!"+1"08B40D%(E<)!AFBT,(9HD'BP.)1PAFBT<&9B4``6:)1P:+1"0D
+MB4<8._AU.F:+1P9F#0`$9HE'!HM$)#1FBX":"P``9JD0`'0,9HM'!F8-`$!F
+MB4<&9HM'!F8-`#AFB4<&ZQ:#Q@!FQT<$`("+1R2#P`R+$(/B_(D0B^^+?RB#
+MPPR+1"0X1F:+`"7__P``._`/C#____^)3"0H,]LSP&:+70!FBT4(`\.#X`-F
+MB_"+QB7__P``.\-^`V:+\S/`BU0D-&:+1"0NBY)4"P``P>(".\(/AOX"``!F
+M@_X##X/T`@``9H7V#X3K`@``@_L$?F)FBU4`BT0D&&:#Z@1FB54`BU4,@^+\
+MB54,BU0D&(OO9L<'!`"+0`1FBU((@>+__P``BT00_&;'1P0`@(E'%(M$)"2)
+M1QB+5"0H9HM'!F8E``%"9HE'!HE4)"CI?@(``(/'`(/[`GY/BT0D&&:+0`AF
+M/0,`=2V+3"08BU0D&(M)!(M2!&:+$HI)`H'A_P```('B__\``,'A$`O1B544
+MZ3L"``"+5"08BU($BQ*)513I*@(``(/'`(M%)&:+,(O6@>+__P```]J+^X/_
+M!'YMC5;^9HD0BT0D&&:+50"#P@)FB54`9HM`"&8]`0!U$HM$)!B+0`2*`"7_
+M````ZQ$[_XM$)!B+0`1FBP`E__\``(M,)!2+5"04P>`09HM)"(M2!('A__\`
+M`&:+5`K^@>+__P``"]")513IHP$``(/_`@^.QP```(O]BVTDBTPD*(M$)!A)
+MBU4,@\H#B4PD*(E5#&:+0`AF/0$`=1:+1"08BT`$B@B!X?\```"+\>L/@\<`
+MBT0D&#/VBT`$9HLPBT0D%&:+0`AF/0$`=1K!Y@B+5"04BU($BA*!XO\````+
+MUHE5%.M'D(M$)!1FBT`(9CT"`'4:P>80BU0D%(M2!&:+$H'B__\```O6B544
+MZQXSR8M$)!3!YA@STHM`!&:+$(I(`L'A$`O1"]:)511FBP]F`TT`9HE-`.G5
+M````._^+1"04BU0D&(MM)(M`!(M2!(H(BA*!X?\```"+1"0H@>+_````2(E$
+M)"B+123!X@B+\0ORBU4,@\H#B54,9H,X`G8]BTPD$(M4)!#!YA"+121FBTD(
+MBU($@>'__P``9HM4"OZ!XO__```+\HEU%&:+$&:#Z@)FB1!FQT4`!`#K4XM4
+M)"B+;21*B50D*(M5#(/*`V:#?0`!B54,=13!Y@B+3"00BTD$B@F!X?\```#K
+M$\'F$(M,)!"+201FBPF!X?__``!FBU4`"_&#P@*)=11FB54`BU4<@\(4B54(
+MQD40`(M$)#1FBX!R"P``9JF``'17BU4,BTPD*(/B_(E5#&:+509F@<H``F:)
+M50:+;2B+5"0<9L=%``$`BQ)FQT4$`(")50AFBU4&9H'B``%FB54&9H'*@$9!
+M9HE5!HM4)"2)51B)3"0HZPZ09HM5!F:!RH`"9HE5!HM5*(M$)#2)D"0+``"+
+M1"0D9L=`!`"`BU4,@\H#B54,BT`D@\`,BQ"#XOR)$(M$)#2*D$X+``#VP@AT
+M=X#B]XB03@L``(N0.`L``%**@'@+``"H`G0)N#@```#K!SO_N#0```"+5"0X
+M9HN2<`L``('B__\```/0BT0D.('B__\``%*+@%P+``#_4`R#Q`B+1"0T9HN0
+MO`X``&8K5"0H9HF0O`X``%U;7HM$)!Q?@\0@PSO_BT0D-(J03@L``(#*0(B0
+M3@L``(M$)"2+0"!FBT`$9JD`@'6WBTPD-%'HIOG__X/$!.NHD%>+?"0,5HMT
+M)`PSR5-FB4\*B4\0B$\.9HN&<@L``&:I@`!T*&;'1PP``&:+1@)F/5``#X6$
+M````BYXH"P``C;XH"P``Z8D```"#Q@!FBT<(BYXP"P``9HD#BT<$9L=#!`"`
+MB4,(BT,,@\@#B4,,BT,D@\`,BQ"#XOR)$(M#*(F&,`L``&:+1@)F/5``=&UF
+MBT8"9CU@`'4DBH9."P``#("(ADX+``"+0R!FBT`$9JD`@'4)5NCG^/__@\0$
+M6UY?PV;'0P(``(M##(/@_(E##(M;*&;'0P8``&;'0P0`@&;'`Q``BU,HBP<[
+MT'749L=#`@``BT,,@\@#B4,,BXXT"P``,\!19HN&<`L``(/`/"7__P``4(N&
+M7`L``/]0#&;'1@)@`(J&3@L```P$@\0(B(9."P``6UY?PSO_@?\`````5XM\
+M)`@SP&:+AT(+``!0,\!FBX=P"P``@\`4)?__``!0BX=<"P``_U`,,\!FBX=P
+M"P``@\`8)?__``!0BX=<"P``_U`D)?__``"#Q`Q?PY!7BWPD"#/)9L='`D$`
+M9HF/H@L``(J'G0L``(B'GPL``#/`9L>'H`L```X`9HE/!%%FBX=P"P``@\`N
+M)?__``!0BX=<"P``_U`$5^BAO/__@\0,7\.!_P````"!_P````"#["`STE>+
+M?"0H5E-5B50D&`^_A[0+``")5"00B40D'(7`=#F*C[<+``"!X?\```"+P8/@
+M'XT$0,'@`XVL![P+```#31")3"0@@^$?C01)P>`#C80'O`L``(E$)"B+MRP+
+M``!FBT8$9JD`0`^$Y`(``(V?3@L``(M$)!R%P`^$7`$``(M4)"B+1"0H,\EF
+MBU(,9HM`"('B__\``&:+#B7__P```]$[P@^-]P```&:+AYH+``!FJ0(`=$J+
+M1"0HBU0D*,9%#@-FBT`(9HM2#"7__P``@>+__P``*\(/A/,```!0BT0D+#/2
+M9HM0#(L(`]&-1A!24.C\____@\0,Z=(````[_XM$)!R+51!"2(E$)!R%P(E5
+M$'\,QD4.`>FS````@\<`BT0D*(M4)"AFBT`(9HM2#"7__P``@>+__P``*\)0
+MB40D*(M$)"R+"`/1C4804E#H_/___XM$)"R+3"0P0#/2B40D+(/@'V:+%BO1
+MC01`P>`#C4P.$(V$![P+``")1"0T9HE0#('B__\``%*+1"0XBP!04>C\____
+M@\08ZS.#QP`SP#/29HL&4(M$)"QFBU`,BP@#T8U&$%)0Z/S___]FBPZ+1"0T
+M9@-(#(/$#&:)2`QFBPYF`TT*9HE-"HH#)/Z(`V:+1@1FJ8`9=$V+1"0<A<!T
+M%8J'?0L``*@$=`?&10X"ZP60QD4.`6:+1@1FJ8``=`;_A\P0``!FBT8$9JD`
+M`70&_X?($```9HM&!&:I`!!T!O^'Q!```&:+1@1FJ0`"#X2S````BTPD$(M$
+M)!Q!A<")3"00#X2>````,])FBU8&@>(`\```P?H(B%4/9HM&!F:I``)T!H#*
+M`HA5#V:+1@9FJ0#P=`F*50^`R@&(50]FBT8&9JD0`'0)BE4/@,H$B%4/BU40
+MBT0D'$)(B540B40D'(I%$(J7MPL```+"B(>W"P``N!\````BA[<+``"-!$#!
+MX`.-K`>\"P``BT0D($")1"0@@^`?C01`P>`#C80'O`L``(E$)"AFQT8$`(!F
+MQP80`(M&#(/(`XE&#(M&)(/`#(L0@^+\B1"+1B!FBT`$9JD`@'0$_T0D&(H3
+MBW8H]L($=`Z`XOOVPB"($W0$_T0D&&:+1@1FJ0!`#X4B_?__BT0D&(FW+`L`
+M`(7`=`E7Z$?T__^#Q`1=6UZ+1"0$7X/$(,,[_X'_`````(/L#+@?````5U93
+MBUPD',=$)!0`````58NS+`L``"*#MPL``(T$0,'@`XV\`[P+``!FBT8$9JD`
+M0`^$00$``(ONC;.W"P``B5PD%('#3@L``/]'$(H#)/Z(`V:+101FJ8`9=%2+
+M1"04BH!]"P``J`1T!L9'#@+K!,9'#@%FBT4$9JF``'0*BT0D%/^`S!```&:+
+M101FJ0`!=`J+1"04_X#($```9HM%!&:I`!!T"HM$)!3_@,00``!FBT4`9@-'
+M"F:)1PIFBT4$9JD``G1SBA:*1Q`"PHM,)!B(!C/`9HM%!D$E`/```(E,)!C!
+M^`B(1P]FBU4&9O?"``)T!0P"B$</9HM%!F:I`/!T"(I'#PP!B$</9HM%!F:I
+M$`!T"(I'#PP$B$</BWPD%+D?````(H^W"P``C0Q)P>$#C;P/O`L``&:+501F
+M@>+_OV:)502*`Z@$BVTH=!4D^Z@@B`-T#8M4)!12Z,?R__^#Q`1FBT4$9JD`
+M0`^%U_[__XOUBUPD%(FS+`L``%U;7HM$)`Q?@\0,PSO_@?\`````@?\`````
+M@^PPN!\```!7BWPD.%9358NO(`L``,=$)#P`````(H?##@``C01`P>`"C80'
+MQ`X``(E$)#AFBT4$9JD`0'4-BT4H9HM`!&:I`$!T"+@!````ZP.0,\"%P`^$
+M;`$``(V'3@L``(V?(`L``(VW30L``(E$)!R+AR`+``!FBT`$9JD`0'4&_X?4
+M$```Q@8`BX<@"P``9HM`!&:I`"`/A#<!``#_A]`0``"+1"0XQD`%`(N'(`L`
+M`(MP&(DSBT8<,]N)1"0T,\!FBX=P"P``@\`I)?__``!0BX=<"P``_U`<B^B*
+MAW@+``"#Q`2H`G0'N`$```#K!;@"````A>AU8(V/<`L``(V'>`L``(ET)!2+
+M\8E\)!"-EUP+``")1"0HB_HSP$-FBP:#P"DE__\``%"+!_]0'(OHBT0D+(/$
+M!(H(]L$"=`FX`0```.L'._^X`@```(7H=,J+="04BWPD$#/;BT0D.(I`!(3`
+M=!R+3"0XN@"```"#P01FB58$,\!#B@&+=B@[V'SPBT0D-%"*AW@+``"H`G0'
+MN#@```#K!;@T````,])FBY=P"P```]"!XO__``!2BX=<"P``_U`,BT0D)(H0
+M@,H"@\0(B!!=6UZ+1"0P7X/$,,,[_XM$)!R*$/;"`G03@.+]]L(0B!!T"5?H
+MG?#__X/$!(M$)#B*4`7^PHA0!3/`BL*+5"0XBE($@>+_````.\)U*_Z'PPX`
+M`+@?````(H?##@``C01`P>`"C80'Q`X``(E$)#B+1"0\0(E$)#R+AR`+``!F
+MQT`$``"+AR`+``"+0"B)`XNO(`L``&:+101FJ0!`=1>+12AFBT`$9JD`0+@`
+M````#Y3`ZP0[_S/`A<`/A.K]___I.____Y"#[`A7BWPD$%93QT0D$``````S
+MVV8YGT@+``!T$V:+MT@+``!FB9]("P``ZR.#QP`SP&:+AW`+``"#P!`E__\`
+M`%"+AUP+``#_4""+\(/$!&;WQO]N=15;7C/`7X/$",.X`@```%M>7X/$",-F
+MBT<"9CU@`'4E9HN'<@L``&:I@`!T#5?HQ_?__XO8@\0$ZPM7Z#K[__^+V(/$
+M!&;WQ@@`=`E7Z+C#__^#Q`1F]\8@`'0SBH=X"P``J`)T"+@!````ZP:0N`(`
+M``"#R`2(AT\+``"*ATX+``"HP'0)5^@>[___@\0$9HM'`F8]4`!R#5?H>_S_
+M_XE$)!2#Q`1F]\8`('0)5^@WO?__@\0$9O?&`0!T?0^_A[0+```[PWX89HM'
+M`F8]8`!U#HJ'3@L```P!B(=."P``:@$SP&:+AW`+``"#P"XE__\``%"+AUP+
+M``#_4`1J`#/`9HN'<`L``(/`&B7__P``4(N'7`L``/]0"&H`,\!FBX=P"P``
+M@\`N)?__``!0BX=<"P``_U`$@\08A=L/A<C^__^+1"00A<`/A;S^__];7E^X
+M`0```(/$",-7BWPD"&:+AT@+``!FA<!U*C/`9HN'<`L``(/`$"7__P``4(N'
+M7`L``/]0((/$!&:%P&:)AT@+``!T";@!````7\,[_S/`7\,[_X'_`````&H`
+M,\"+5"0(9HN"<`L``(/`""7__P``4(N"7`L``/]0##/`@\0(PY`[_X'_````
+M`(/L#%>+?"045E.*1P2H"'0C,\"+-XI'!(/@]XA'!(K8,\"*PU`SP&:+1@10
+MBP;_4`2#Q`B+%U+H1!@``(L/4>@\&```BS<SP(/$"&:+1@10BP;_4!PE_P``
+M`(/$!(I?!(A$)!<SP(#+`8LWB%\$BL-0,\!FBT8$4(L&_U`$BP>#Q`A0Z/@7
+M``"+%U+H\!<``(L/@\0(4>CE%P``,\"+-XI?!(/$!(#C_HA?!(K#4#/`9HM&
+M!%"+!O]0!(L'@\0(4.B[%P``BQ=2Z+,7``"*1"0?@\0(J(!T"+@!````ZP.0
+M,\!;7B7_````7X/$#,,[_X/L&%>+?"0@5E/&1"0C`(M$)"R+-R7_````P?@(
+MBM@SP(I'!(/@]XA'!(K0,\"*PE`SP&:+1@10BP;_4`0SP(LWBE<$@\0(@,H!
+MB%<$BL)0,\!FBT8$4(L&_U`$BQ>#Q`A2Z"D7``"+#U'H(1<``(L'@\0(4.@6
+M%P``,\"+-XI'!(/$!(/("(A'!(K0,\"*PE`SP&:+1@10BP;_4`2+%X/$"%+H
+MZ!8``#/`BS>*5P2#Q`2`XOZ(5P2*PE`SP&:+1@10BP;_4`2+#X/$"%'HOA8`
+M`(L'4.BV%@``N`<```"#Q`@BPP/`B$0D(HK0,\"*P@V@````)?\```!05^@O
+M"@``5^@)_O__@\0,A<!T"KX"````Z>D```#&1"0?`(M<)"PSP(K#)8````"$
+MP'0*,\"*1P2#X/?K"#/`BD<$@\@(BM"+-XA'!#/`BL)0,\!FBT8$4(L&_U`$
+MBQ>#Q`A2Z"T6```SP(LWBE<$@\0$@,H!B%<$BL)0,\!FBT8$4(L&_U`$BP^#
+MQ`A1Z`,6``"+!U#H^Q4``(L7@\0(4NCP%0``,\"+-XI7!(/$!(#B_HA7!(K"
+M4#/`9HM&!%"+!O]0!(L/@\0(4>C&%0``BP=0Z+X5``"*5"0G@\0(,\#^PHK#
+MB%0D'P/`@/H(BM@/@C'___]7Z!K]__^+\('F_P```(/$!(7V#X7F````,\"+
+M-XI'!(/@]XA'!(K8,\"*PU`SP&:+1@10BP;_4`0SP(LWBE\$@\0(@,L!B%\$
+MBL-0,\!FBT8$4(L&_U`$BP^#Q`A1Z#T5``"+!U#H-14``(L7@\0(4N@J%0``
+M,\"+-XI'!(/$!(/("(A'!(K8,\"*PU`SP&:+1@10BP;_4`2+#X/$"%'H_!0`
+M`#/`BS>*7P2#Q`2`X_Z(7P2*PU`SP&:+1@10BP;_4`2+!X/$"%#HTA0``(L7
+M4NC*%```BEPD*H/$"#/`BL,-H0```"7_````4%?H3@@``%?H*/S__X/$#(7`
+M=`VX_P```%M>7X/$&,.0,MLSP(I$)",#P(A$)"-7Z`#\__^*3"0G@\0$"LC^
+MPXA,)".`^PARVC/`BS>*1P2#X/>(1P2*V#/`BL-0,\!FBT8$4(L&_U`$,\"+
+M-XI?!(/$"(#+`8A?!(K#4#/`9HM&!%"+!O]0!(L'@\0(4.@B%```BQ=2Z!H4
+M``"+#X/$"%'H#Q0``#/`BS>*7P2#Q`2`X_Z(7P2*PU`SP&:+1@10BP;_4`2+
+M!X/$"%#HY1,``(L74NC=$P``,\"+-XI'!(/$"(/("(A'!(K8,\"*PU`SP&:+
+M1@10BP;_4`0SP(LWBE\$@\0(@,L!B%\$BL-0,\!FBT8$4(L&_U`$BP^#Q`A1
+MZ)`3``"+!U#HB!,``(L7@\0(4NA]$P``,\"+-XI'!(/$!(/@]XA'!(K8,\"*
+MPU`SP&:+1@10BP;_4`2+#X/$"%'H3Q,``#/`BS>*7P2#Q`2`X_Z(7P2*PU`S
+MP&:+1@10BP;_4`2+!X/$"%#H)1,``(L74N@=$P``@\0(,\!;7HI$)!M?@\08
+MPY"!_P````"!_P````"#[!`SP%>+?"085E.*1P2+-X/@]XA'!(K8,\"*PU`S
+MP&:+1@10BP;_4`0SP(LWBE\$@\0(@,L!B%\$BL-0,\!FBT8$4(L&_U`$BQ>#
+MQ`A2Z*P2``"+#U'HI!(``(L'@\0(4.B9$@``,\"+-XI'!(/$!(/("(A'!(K8
+M,\"*PU`SP&:+1@10BP;_4`2+%X/$"%+H:Q(``#/`BS>*7P2#Q`2`X_Z(7P2*
+MPU`SP&:+1@10BP;_4`2+#X/$"%'H01(``(L'4.@Y$@``BU0D,(/$"+@'````
+M(L(#P(K0,\"*P@V@````)?\```!05^BR!0``5^B,^?__@\0,A<!T#;@"````
+M6UY?@\00PY"+7"0DB%PD&S+;,\"*1"0;)8````"$P'0+,\"*1P2#X/?K"9`S
+MP(I'!(/("(K0BS>(1P0SP(K"4#/`9HM&!%"+!O]0!(L/@\0(4>BI$0``,\"+
+M-XI7!(/$!(#*`8A7!(K"4#/`9HM&!%"+!O]0!(L'@\0(4.A_$0``BQ=2Z'<1
+M``"+#X/$"%'H;!$``#/`BS>*5P2#Q`2`XOZ(5P2*PE`SP&:+1@10BP;_4`2+
+M!X/$"%#H0A$``(L74N@Z$0``,\"#Q`C^PXI$)!L#P(#["(A$)!L/@C+___]7
+MZ)KX__^#Q`0E_P```%M>7X/$$,.#QP`[_X'_`````(/L"#/`5XM\)!!64XI'
+M!(LW@^#WB$<$BM@SP(K#4#/`9HM&!%"+!O]0!#/`BS>*7P2#Q`B`RP&(7P2*
+MPU`SP&:+1@10BP;_4`2+%X/$"%+HK!```(L/4>BD$```BP>#Q`A0Z)D0```S
+MP(LWBD<$@\0$@\@(B$<$BM@SP(K#4#/`9HM&!%"+!O]0!(L7@\0(4NAK$```
+M,\"+-XI?!(/$!(#C_HA?!(K#4#/`9HM&!%"+!O]0!(L/@\0(4>A!$```BP=0
+MZ#D0``"#Q`A;7E^#Q`C#@\<`@?\`````@?\`````@^P0,\!75E.+7"0D58ML
+M)"2+="0P9HM%!%"+10#_4!R);"04@\0$)?\```#&1"04!(A$)!\SP&H$9HM%
+M!%"+10#_4`0SP(/$"(K#`\"*V(M$)"R+T/[*A,"(5"0L=$F*P_[#)?\```!0
+MC40D%%#H'?C__XOXBL,E_P```/[#4(U$)!Q0Z`?X___!X`B#Q!!F"_AFB3Z+
+M1"0L@\8"B\C^R83`B$PD+'6W,\"*1"0?4#/`9HM%!%"+10#_4`2#Q`A=6UY?
+M@\00PY`[_X'_`````(/L$%>+?"085E-FBW0D)(O&@>;_````)?__``#!^`@E
+M_P```%!65^@D_/__@\0,A<!T%5M>0%^#Q!##D+@!````6UY?@\00PXM<)"B(
+M7"0;,MLSP(I$)!LE@````(3`=`LSP(I'!(/@]^L)D#/`BD<$@\@(BM"+-XA'
+M!#/`BL)0,\!FBT8$4(L&_U`$BQ>#Q`A2Z+D.```SP(LWBE<$@\0$@,H!B%<$
+MBL)0,\!FBT8$4(L&_U`$BP^#Q`A1Z(\.``"+!U#HAPX``(L7@\0(4NA\#@``
+M,\"+-XI7!(/$!(#B_HA7!(K"4#/`9HM&!%"+!O]0!(L/@\0(4>A2#@``BP=0
+MZ$H.```SP(/$"/[#BD0D&P/`@/L(B$0D&P^",O___U?HJO7__X/$!(7`#X4+
+M____,\"+-XI'!(/("(A'!(K8,\"*PU`SP&:+1@10BP;_4`0SP(LWBE\$@\0(
+M@,L!B%\$BL-0,\!FBT8$4(L&_U`$BQ>#Q`A2Z-4-``"+#U'HS0T``(L'@\0(
+M4.C"#0``,\"+-XI'!(/$!(/@]XA'!(K8,\"*PU`SP&:+1@10BP;_4`2+%X/$
+M"%+HE`T``#/`BS>*7P2#Q`2`X_Z(7P2*PU`SP&:+1@10BP;_4`2+#X/$"%'H
+M:@T``(L'4.AB#0``BS^#Q`AJ"HL'_U`T@\0$,\!;7E^#Q!##._\[_X'_````
+M`(/L"#/`5XM\)!!64XI'!(LW@\@(B$<$BM@SP(K#4#/`9HM&!%"+!O]0!#/`
+MBS>*7P2#Q`B`RP&(7P2*PU`SP&:+1@10BP;_4`2+%X/$"%+H[`P``(L/4>CD
+M#```BP>#Q`A0Z-D,```SP(LWBD<$@\0$@^#WB$<$BM@SP(K#4#/`9HM&!%"+
+M!O]0!(L7@\0(4NBK#```,\"+-XI?!(/$!(#C_HA?!(K#4#/`9HM&!%"+!O]0
+M!(L/@\0(4>B!#```BP=0Z'D,``"#Q`A;7E^#Q`C#@\<`@?\`````@?\`````
+M@^P,5XM\)!164\9$)!<`BT0D("6`````A,!T##/`BD<$@^#WZPH[_S/`BD<$
+M@\@(BMB+-XA'!#/`BL-0,\!FBT8$4(L&_U`$BQ>#Q`A2Z`T,```SP(LWBE\$
+M@\0$@,L!B%\$BL-0,\!FBT8$4(L&_U`$BP^#Q`A1Z.,+``"+!U#HVPL``(L7
+M@\0(4NC0"P``,\"+-XI?!(/$!(#C_HA?!(K#4#/`9HM&!%"+!O]0!(L/@\0(
+M4>BF"P``BP=0Z)X+``"+1"0H@\0()?\````#P(I4)!?^PHA$)""(5"07@/H(
+M#X(H____6UY?@\0,PSO_4#/`5XM\)`Q64XI?!(LW@,L!B%\$BL-0,\!FBT8$
+M4(L&_U`$BQ>#Q`A2Z$$+``"+#U'H.0L``(L'@\0(4.@N"P``,\"+-XI?!(/$
+M!(#C_HA?!(K#4#/`9HM&!%"+!O]0!(L7@\0(4N@$"P``BP]1Z/P*``"#Q`A;
+M7E^#Q`3#._]7BWPD"%93,\"+-XI?!(#+`8A?!(K#4#/`9HM&!%"+!O]0!(L7
+M@\0(4NC""@``BP]1Z+H*``"#Q`A;7E_#@\<`5XM\)`A64S/`BS>*7P2`X_Z(
+M7P2*PU`SP&:+1@10BP;_4`2+%X/$"%+H@@H``(L/4>AZ"@``@\0(6UY?PX/'
+M`(I$)`A3BTPD"(3`="<SP(I!!(/@]XK8BQ&(000SP(K#4#/`9HM"!%"+`O]0
+M!(/$"%O#._\SP(I!!(/(".O7._^#[!`SP%=64XM<)"15BVPD)(MT)#!FBT4$
+M4(M%`/]0'(EL)!2#Q`0E_P```,9$)!0$B$0D'S/`:@1FBT4$4(M%`/]0!(M$
+M)#2#Q`B+T/[*A,"(5"0L=&$SP(H&4(K#)?\```!&4(U$)!A0Z''Z___^PX/$
+M#(OXA?]T+C/`BD0D'U`SP&:+1010BT4`_U`$BT0D-(/$",'G""7_````0`O'
+M75M>7X/$$,.+1"0LB\C^R83`B$PD+'6?,\"*1"0?4#/`9HM%!%"+10#_4`2#
+MQ`@SP%U;7E^#Q!##@\<`C70F`(/L-#/)5XM\)$16BT0D1%-5BW0D2,9'`03&
+M1S`#9HM`$&;'1Q)``&:)3Q8E_/\``&:)1Q"+1"1,9HE/%(M`%&;'1QP`0,9'
+M'J*#X/")1QB+1"1,BT`PB4<HBT<8A<!T%HM$)$QFBT`$9JD"`'0(BD<>#$"(
+M1QYJ`#/`9HM'$(/`+B7__P``4/]6!,9''Q`SP&:+1Q"#P"DE__\``%#_5AR#
+MQ`PE\````(/X$'4(BD<?#""(1Q\SP&:+1Q"#P`(E__\``%#_5AR#R`8E_P``
+M`%`SP&:+1Q"#P`(E__\``%#_5@0SP&:+1Q"#P!(E__\``%#_5B!FB40D3B7_
+M_P``@\@@)?__``!0,\!FBT<0@\`2)?__``!0_U8(B70D.#/`9HM'$&H"@\`P
+M9HE$)$`SP&:+1Q"#P"XE__\``%#_5@2-1"0X4(U$)$1J!&H@4.C>]___BT0D
+M2(/$,#/2)?__``!FBU0D&@/"BU0D'('B__\```/",])FBU0D'B7__P``.\)U
+M+8M$)!B(1R**1"09B$<CBD0D&HA')(I$)!N(1R6+1"0<B$<FBD0D'8A')^L/
+MD#/)9HE/(F:)3R1FB4\FC6PD(#/`QD0D0@%FBT4$LQ>)="0PC70D0U"+10#_
+M4!R);"04@\0$BM`SP,9$)!0$BL*(1"1!,\!J!&:+1010BT4`_U`$@\0(L`&*
+MT/[*A,"(5"1"="J*P_[#)?\```!0C40D%%#HF.___X@&@\0(1HI$)$**R/[)
+MA,"(3"1"==8SP(I$)$%0,\!FBT4$4(M%`/]0!(MT)#B#Q`BX!P```")$)$.*
+M@`````#&1R'_B$<L:@`SP&:+1Q"#P"XE__\``%#_5@0SP&:+1"1&4#/`9HM'
+M$(/`$B7__P``4/]6"(M$)%R#Q!!FBT`$9JD$`'0*,\!=6UY?@\0TPUU;7K@"
+M````7X/$-,.#QP`[_X'_`````(/L%#/`5XM\)"A6BW0D(%.+7"0L9HM&!%"+
+M!O]0'(ET)!"#Q`2*T#/`QD0D$`2*PHA$)!\SP&H$9HM&!%"+!O]0!(K#_LN#
+MQ`B$P'0JBT0D*(O0)?\```!0C40D$/["B%0D+%#HA^[__X@'BL.#Q`A'_LN$
+MP'76,\"*1"0?4#/`9HM&!%"+!O]0!(/$"%M>7X/$%,.!_P````"!_P````"#
+M[!!7BWPD&%9358ML)"AFBT<"9CTP`'0?75M>N`$```!?@\00PSO_N`0```!=
+M6UY?@\00PX/&`(N'&`L``(7`=0UFBX=R"P``9JE``'79QH=]"P```(M$)"R)
+MAY`+``"+1"0PB8>4"P``9HN'<@L``&:I`0!T#6;'AY@+``!01NL+._]FQX>8
+M"P``E!$SP(M4)#1FBX>8"P``@>+__P``.\)^"XM$)#1FB8>8"P``N`D```!F
+M(T0D.(/X"70/N`P```!F(T0D.(/X#'4/75M>N`,```!?@\00PSO_BT0D.(7M
+M9HF'F@L``'1%5>C_1@``@\0$A<!U.(I%`$5%B(>("P``145%BD7\B(>)"P``
+MBD7]B(>*"P``BD7^B(>+"P``BD7_B(>,"P``BD4`ZT.0BH>""P``B(>("P``
+MBH>#"P``B(>)"P``BH>$"P``B(>*"P``BH>%"P``B(>+"P``BH>&"P``B(>,
+M"P``BH>'"P``,_8STHB'C0L``(V?B`L``$.*2_\ZRG06B50D&.L>75M>N`(`
+M``!?@\00PX/'`$:#_@9\W,=$)!@!````BT0D&(7`==J*AX@+``"H@'70BX=H
+M"P``BT@\A<ET!U?_4#R#Q`2+AV@+``"*0`N(AW@+``!7BX=L"P``_U`49L>'
+MO`X``"``,\F#Q`0SP(B/M@L``&:)C[0+``"(C[<+``"(C[@+``"(C[H+``"(
+MC[D+``"(C[X.``"(C[\.``"(C\`.``"(C\$.``"(C\(.``"(C\,.``!=6UY?
+M@\00PSO_@^P<5U9358ML)#"+50"!^B"!``!T6EU;7C/`7X/$',-&@_X1<F@S
+M]HM$)#B+WJD$````#X3^````A=L/A/8```!FO@`*B\8E__\``%!5Z!U.``"#
+MQ`B%P'16BT0D*"7__P``]]!F(_CIJP```(/'`,=$)!P`````9L=$)"@PSHM$
+M)#2_#P```(E$)!0S]HL<M0````"%VW2-9HM#"&8]`P`/A7G___^+\^EZ____
+M._]H-I0``(O&)?__``"#P!XE__\``%!5Z%6]__^#Q`R%P'1&BTPD%(O&427_
+M_P``4%7_4Q2+1"0H@\0,0(E$)!R+1"0\BU0D'#O0#XU&`0``BT0D*(M,)!0E
+M__\``/?09B/X@\$TB4PD%(M$)"B#QB`E__\``,'X!&:)1"0H9H'^X`L/A@[_
+M___'1"08`````&;WQP$`#X3@````:$:2``"+1"0<9HL$10````!FB40D*B7_
+M_P``@\`")?__``!05>BLO/__@\0,A<!U-V:+1"0F9JD$`'0*N!P```#K"(/'
+M`+@0````,])FBU0D)@/0@>+__P``4E7H94?__X/$"(7`='@SP&:+1"0F4%7H
+MP+W__X/$"#/VB\B+'+4`````A=MT&#/`B]%FBT,(@>+__P``.\)T"$:#_A%R
+MW3/;A=MT.HM$)#B+$X70=#"+5"04,\!FBT0D)E)05?]3%(M,)"B#Q`Q!BT0D
+M/(E,)!P[R'TFBU0D%(/"-(E4)!2!Y___``"+3"08P?\!08E,)!B#^00/C/K^
+M__^+1"0<75M>7X/$',.#QP"!_P````"!_P````"#[`A75HM$)!2+$('Z(($`
+M`'057KC_____7X/$",,[_S/`7E^#Q`C#N.`/``"+3"049B-$)!PE__\``%!1
+MZ,Y+``"#Q`B%P'77BT0D'"7__P``4(M$)!A0Z,.\__^#Q`B+R&:#^6-TN#/V
+MBSRU`````(7_=!@SP(O19HM'"('B__\``#O"=`A&@_X1<MTS_X7_=(V+5"08
+MBT0D'%(E__\``%"+3"0<4?]7%(/$#%Y?@\0(PY"!_P````"!_P````"+3"0$
+M,\"+D5`+``!29HN!<`L``(/`""7__P``4(N!7`L``/]0#(/$",,[_XUT)@"+
+M5"0$,\!FBT($4(L"_U`<)?\```"#Q`3#@\<`C70F`#/`BU0D!(I$)`A0,\!F
+MBT($4(L"_U`$@\0(PY"-="8`5XM\)`AJ88L'_U`<:F&+!_]0'&IABP?_4!QJ
+M88L'_U`<@\007\,[_SO_@?\`````,\!FBT0D"%"+1"0(BP#_4#2#Q`3#@\<`
+M._^!_P````"#[!PSP%=64XMT)"Q5BUPD-&:+AG`+``"#P#(E__\``%"+AEP+
+M``#_4""+TR7__P``@>+__P``(\*#R`*+^"7__P``4#/`9HN&<`L``(/`,B7_
+M_P``4(N&7`L``/]0"('C__\``#/`@\L"9HE<)#9H4```@&:+AG`+``"#P!0E
+M__\``%"+AEP+``#_4`R[]/___X/$%#/`9HN&<`L``(/`&"7__P``4(N&7`L`
+M`/]0)(E$'""#Q`2#PP1\V<=$)"0`````,]*+QV:+5"0J)?__``"[#````#O"
+M#X0B`0``B^\S_V:+^L'G$('/QP<``&A0``"`,\!FBX9P"P``@\`4)?__``!0
+MBX9<"P``_U`,:+A`8(XSP&:+AG`+``"#P!@E__\``%"+AEP+``#_4`QHV+MR
+M`#/`9HN&<`L``(/`&"7__P``4(N&7`L``/]0#%<SP&:+AG`+``"#P!@E__\`
+M`%"+AEP+``#_4`R!Y?W_```SP%5FBX9P"P``@\`R)?__``!0BX9<"P``_U`(
+MNT3]__^#Q"@SP&:+AG`+``"#P!(E__\``%"+AEP+``#_4""#Q`1#?-\SP+N\
+M`@``9HN&<`L``(/`,B7__P``4(N&7`L``/]0((M4)"B#Q`2+Z"7__P``0HE4
+M)"0STF:+5"0J.\)T#8M$)"2#^&0/C.[^__]H4```@#/`9HN&<`L``(/`%"7_
+M_P``4(N&7`L``/]0#+OT____@\0(BTP<'#/`46:+AG`+``"#P!@E__\``%"+
+MAEP+``#_4`R#Q`B#PP1\V%V[#````%M>7X/$',,[_X/L"#/`5XM\)!!64U5J
+M`&:+AW`+``"#P"XE__\``%"+AUP+``#_4`0SP&:+AW`+``"#P#(E__\``%"+
+MAUP+``#_4""+\&:!YO[_B\8E__\``%`SP&:+AW`+``"#P#(E__\``%"+AUP+
+M``#_4`AF@>;]_S/`@>;__P``5F:+AW`+``"#P#(E__\``%"+AUP+``#_4`B*
+MATX+```D_HB'3@L``#/`9HN'<`L``(/`$B7__P``4(N'7`L``/]0((/$((OP
+M9H'.``*[#P```&:#SA!F(]Z#^P=^!;L'````A=MT#XU+_[L!````T^/K"(/'
+M`+L!````9H'F_^.*AW\+``"$P'0J,]*+PR7__P``BI=_"P``.\)\%V:!S@`8
+M9HN'@`L``&:I$`!T!6:!S@`$@>;__P``,\!69HN'<`L``(/`$B7__P``4(N'
+M7`L``/]0"(/$"(J'?`L``(3`=2-HG"```#/`9HN'<`L``(/`""7__P``4(N'
+M7`L``/]0#(/$",>'4`L``)P@``"!X___```SP$.*AW\+``"+TXOS@>+__P``
+M.\)^!&8/MMB!YO__``"X_0```"O&@>/__P``B^@E__\``(F'5`L``#/`P>,(
+M"]Z!X___``!39HN'<`L``(/`(B7__P``4(N'7`L``/]0"('E__\``#/`@<T`
+M?P``@>7__P``56:+AW`+``"#P"`E__\``%"+AUP+``#_4`AJ`#/`9HN'<`L`
+M`(/`'B7__P``4(N'7`L``/]0"(/$&+Y<````9HN'<@L``&:I@`!U`X/.`E8S
+MP&:+AW`+``"#P"0E__\``%"+AUP+``#_4`QJ`#/`9HN'<`L``(/`!B7__P``
+M4(N'7`L``/]0"(N''`L``(/FXXF')`L``(F'(`L``(J'3@L```P(B(=."P``
+M,\!69HN'<`L``(/`)"7__P``4(N'7`L``/]0#&;'AT@+`````(/$&%U;7E^#
+MQ`C#@\<`@?\`````@?\`````@^P,5U9358U$)!B+;"0H4%6+5"0LBW0D*%+H
+M<<3__X/$#(7`#X7&````:````("+1"0<)?__``"->`,SP&:+AG`+``#!_P*#
+MP!0E__\``%"+AEP+``#_4`R+3"0@,\!19HN&<`L``(/`&"7__P``4(N&7`L`
+M`/]0#(/$$+L!````._M^1HU$)!A0BT0D*%50Z/O#__^#Q`R%P'0'C4?_.]AU
+M38M4)!@SP%)FBX9P"P``@\`8)?__``!0BX9<"P``_U`,@\0(0SO??+I6BX9L
+M"P``_U`L9L=&`B$`9L=&!```,\"#Q`1=6UY?@\0,PSO_75M>N`$```!?@\0,
+MPX/'`%>_PB```%:^!````&:+5"00BDPD#&8C\H7V=`:!YW____^$R74*@<\`
+M`@``ZPT[_X#Y$'4&@<\``0``P><0@<\`,0``9O?""`!T!H'G_^___X7V=`:!
+MY__?__]FBT0D%&8]#P!U`X//!(O'7E_#._^#[!PSP#/)5XM\)"Q6BW0D+%.+
+M7"0LQD<!!,9',`)FBT809L='$D``9HE/%B7\_P``9HE'$&:)3Q2+1A1FQT<<
+M`$#&1QZB@^#PB4<8BT8PB4<HBT<8A<!T$F:+1@1FJ0(`=`B*1QX,0(A''FH`
+M,\!FBT<0@\`N)?__``!0_U,$QD<?`#/`9HM'$(/`*27__P``4/]3'(/$#"7P
+M````@_@0=0B*1Q\,.(A''S/`9HM'$(/`$B7__P``4/]3(&:)1"0H)?__``"#
+MR"`E__\``%`SP&:+1Q"#P!(E__\``%#_4PB)7"0D9HM'$&:)1"0HC40D'%"-
+M1"0H:@1J(%#HS^?__XM$)"R#Q!PSTB7__P``9HM4)!(#PHM4)!2!XO__```#
+MPC/29HM4)!8E__\``#O"=2Z+1"00B$<BBD0D$8A'(XI$)!*(1R2*1"03B$<E
+MBT0D%(A')HI$)!6(1R?K$#O_,\EFB4\B9HE/)&:)3R:-1"0F4(U$)!QJ`6H-
+M4.A/Y___,\"#Q!!FBT0D)HE$)`RI`0```'0&,\#K&SO_BT0D#*D"````=`FX
+M$````.L'._^X!````,9'(?^(1RR+1"0D)?__``!0,\!FBT<0@\`2)?__``!0
+M_U,(9HM&!(/$"&:I!`!T"S/`6UY?@\0<PSO_6UY?N`(```"#Q!S#C70F`(M$
+M)`3'@%`+````````PY"#[`@SP%=6BW0D%&:+AG`+``"#P!(E__\``%"+AEP+
+M``#_4""+^"7__P``@\@@)?__``!0,\!FBX9P"P``@\`2)?__``!0BX9<"P``
+M_U`(BX9<"P``BU0D)(E$)!1FBX9P"P``4FH(:CAFB40D)(U$)"!0Z.CO__^!
+MY___```SP%=FBX9P"P``@\`2)?__``!0BX9<"P``_U`(@\0D7E^#Q`C#D('_
+M`````('_`````(/L"#/`5U93BW0D&&:+AG`+``"#P!(E__\``%"+AEP+``#_
+M4""+^"7__P``@\@@)?__``!0,\!FBX9P"P``@\`2)?__``!0BX9<"P``_U`(
+MBX9<"P``BU0D*(E$)!AFBX9P"P``4FH(:CAFB40D*(U$)"10Z(?K__^+V#/`
+M@>?__P``5V:+AG`+``"#P!(E__\``%"+AEP+``#_4`B#Q"2+PUM>7X/$",.#
+MQP"-="8`@^P05S/_5HMT)!Q358ML)"AFBT4P9JD`@'0DC5TP:F2+AEP+``#_
+M4#2+QT>#Q`2#^&0/CY`"``!F]P,`@'7?:F2+AEP+``#_4#1J`C/`9HN&<`L`
+M`(/`+B7__P``4(N&7`L``/]0!&H6,\!FBX9P"P``@\`6)?__``!0BX9<"P``
+M_U`$:@8SP&:+AG`+``"#P!8E__\``%"+AEP+``#_4`1J`#/`9HN&<`L``(/`
+M+B7__P``4(N&7`L``/]0!+D`@```,\!FB4U<9HF-B````&H!9HN&<`L``(/`
+M*"7__P``4(N&7`L``/]0"(/$+#/_9HN%B````&:I`(!T)XV=B````&IDBX9<
+M"P``_U`TB\='@\0$@_AD#X^;`0``9O<#`(!UWVIDBX9<"P``_U`T:@(SP&:+
+MAG`+``"#P"XE__\``%"+AEP+``#_4`1J%C/`9HN&<`L``(/`%B7__P``4(N&
+M7`L``/]0!&H&,\!FBX9P"P``@\`6)?__``!0BX9<"P``_U`$:@`SP&:+AG`+
+M``"#P"XE__\``%"+AEP+``#_4`1FQX6T`````(`SVX/$)(V]X````&;W!P"`
+M=0F#QRQ#@_L%?/"#^P5U`C/;C11;C13:P>("C805W@```&:+$&:!X@`!9HD0
+MC11;C13:P>("9L>$%>(``````(T46XT4VL'B`HV$%>````")1"0<9L<``(`S
+MP&H%9HN&<`L``(/`*"7__P``4(N&7`L``/]0"(M$)"2#Q`@S_V;W``"`=">)
+M7"00B]AJ9(N&7`L``/]0-(O'1X/$!(/X9']*9O<#`(!UXXM<)!`SP(T,6V:+
+MA;`````STHT,V8/`!,'A`F:+E`W<````.\)T$+@$````75M>7X/$$,.#QP!=
+M6UXSP%^#Q!##._]=6UZX`P```%^#Q!##@\<`75M>N`(```!?@\00PX/'`%U;
+M7K@!````7X/$$,.#QP`[_X'_`````(/L9#/`5XM\)&Q64U5FBX=P"P``4(N'
+M7`L``/]0(&:)1"1T,\!FBX=P"P``@\`D)?__``!0BX=<"P``_U`DB40D8#/`
+M9HN'<`L``(/`!"7__P``4(N'7`L``/]0)(E$)&`SP&:+AW`+``"#P`@E__\`
+M`%"+AUP+``#_4"!FB40D?C/`9HN'<`L``(/`*B7__P``4(N'7`L``/]0(&:)
+MA"2`````,\!FBX=P"P``@\`2)?__``!0BX=<"P``_U`@9HF$)((````SP&:+
+MAW`+``"#P`PE__\``%"+AUP+``#_4"2+GQ0+``"+EQ`+``#WVXE$)&PSP&:+
+MAW`+``"#XP>#P!"+CQ0+``"--!HE__\``%"+AUP+```#V8E<)'S_4"!H__\`
+M`#/`9HN'<`L``(/`$"7__P``4(N'7`L``/]0"&H`,\!FBX=P"P``4(N'7`L`
+M`/]0"&@=X`<`,\!FBX=P"P``@\`D)?__``!0BX=<"P``_U`,:@`SP&:+AW`+
+M``"#P`0E__\``%"+AUP+``#_4`QJ`#/`9HN'<`L``(/`""7__P``4(N'7`L`
+M`/]0"&H`,\!FBX=P"P``@\`J)?__``!0BX=<"P``_U`(,\!FBX=P"P``@\`R
+M)?__``!0BX=<"P``_U`@)?]_``!0,\!FBX=P"P``@\`R)?__``!0BX=<"P``
+M_U`(,\!FBX=P"P``@\`2)?__``!0BX=<"P``_U`@)?#L``"#R`$E__\``%`S
+MP&:+AW`+``"#P!(E__\``%"+AUP+``#_4`AJ`C/`9HN'<`L``(/`+B7__P``
+M4(N'7`L``/]0!#/`9HN'<`L``(/`%B7__P``4(N'7`L``/]0'(K8,\"*PX/(
+M$(B$).8````E_P```%`SP&:+AW`+``"#P!8E__\``%"+AUP+``#_4`1J`#/`
+M9HN'<`L``(/`+B7__P``4(N'7`L``/]0!#/`9HN'<`L``(/`#"7__P``4(N'
+M7`L``/]0)"7__P``#0```P!0,\!FBX=P"P``@\`,)?__``!0BX=<"P``_U`,
+M:@(SP&:+AW`+``"#P"XE__\``%"+AUP+``#_4`0SP(K#@^#OB(0D"P$``"7_
+M````4#/`9HN'<`L``(/`%B7__P``4(N'7`L``/]0!&H`,\!FBX=P"P``@\`N
+M)?__``!0BX=<"P``_U`$@<2H````,]N*@P````!#@_L*B(0>MP$``'+M,]N)
+M?"00BT0D7(VNZ````(E$)&0%W````(E$)&"+1"1<!;@!``")="04B40D3(M$
+M)%P%R`$``+DL````B40D2(V&Y````(E$)!R-AN(```")1"0@C8;@````B40D
+M)(V&W@```(E$)"B-AMP```")1"0LC48,B40D,(U&"(E$)#2-1@:)1"0XC48$
+MB40D/(U&`HOXBT0D/$-FQP80`(M4)$QFQP<```/Q9L<```"+1"0X`_EFQP``
+M!HM$)#2)$(M$)&0#P8E$)&2+1"0PBU0D9(/*`8D0BU0D2(M$)"QFQP`8`(M$
+M)"AFQP```(M$)"1FQP``@(M$)"!FQP```(M$)!R)$(M4)&`#T8M$)#P#P8E5
+M`(E$)#R+1"0XB50D8(M4)#0#P0/1B40D.(M$)#")5"0TBU0D*`/!`]&)1"0P
+MBT0D+(E4)"B+5"0<`\$#T8E$)"R+1"0D`\$#Z8E$)"2+1"0@`\&#^P6)1"0@
+MB50D'`^,'O___XM$)%R+="04BWPD$(/(`8F&O````+D`@```9HN&M@```&8-
+M``%FB8:V````BT0D7&:)3@0%W````&:)3C")AI@!``!FBX:.`0``9@T``6:)
+MAHX!``"+1"1<!=P```!0,\!FBX=P"P``@\`\)?__``!0BX=<"P``_U`,BTPD
+M9#/`46:+AW`+``"#P#@E__\``%"+AUP+``#_4`Q65^AR]___B_`SP&:+AW`+
+M``"#P"0E__\``%"+AUP+``#_4"0-````!5`SP&:+AW`+``"#P"0E__\``%"+
+MAUP+``#_4`QJ9(N'7`L``/]0-(N$))@````E__\``%`SP&:+AW`+``!0BX=<
+M"P``_U`(BX0DB````%`SP&:+AW`+``"#P"0E__\``%"+AUP+``#_4`R+E"2,
+M````,\!29HN'<`L``(/`!"7__P``4(N'7`L``/]0##/`9HN$)*X```!0,\!F
+MBX=P"P``@\`()?__``!0BX=<"P``_U`(BX0DM````"7__P``4#/`9HN'<`L`
+M`(/`*B7__P``4(N'7`L``/]0"#/`9HN$)+H```!0,\!FBX=P"P``@\`2)?__
+M``!0BX=<"P``_U`(:@(SP&:+AW`+``"#P"XE__\``%"+AUP+``#_4`0SP(J$
+M)-(```!0,\!FBX=P"P``@\`6)?__``!0BX=<"P``_U`$:@`SP&:+AW`+``"#
+MP"XE__\``%"+AUP+``#_4`2+C"3`````,\!19HN'<`L``(/`#"7__P``4(N'
+M7`L``/]0#&H",\!FBX=P"P``@\`N)?__``!0BX=<"P``_U`$,\"*A"3S````
+M4#/`9HN'<`L``(/`%B7__P``4(N'7`L``/]0!&H`,\!FBX=P"P``@\`N)?__
+M``!0BX=<"P``_U`$@<20````A?9T'%U;B\9>7X/$9,,[_[@&````75M>7X/$
+M9,.#QP`SP&:+AW`+``"#P"0E__\``%"+AUP+``#_4"2#Q`2#X!2#^!1UREU;
+M7C/`7X/$9,,[_X'_`````#/`BU0D!&:+1"0(4#/`9HN"<`L``(/`,B7__P``
+M4(N"7`L``/]0"(/$",.0C70F`(/L%#/`5XM\)!Q64U5J`&:+AW`+``"#P"XE
+M__\``%"+AUP+``#_4`0SP&:+AW`+``"#P#(E__\``%"+AUP+``#_4""+\&:!
+MYO[_B\8E__\``%`SP&:+AW`+``"#P#(E__\``%"+AUP+``#_4`AF@>;]_S/`
+M@>;__P``5F:+AW`+``"#P#(E__\``%"+AUP+``#_4`B*ATX+```D_HB'3@L`
+M`#/`9HN'<`L``(/`$B7__P``4(N'7`L``/]0((/$((OP9H/.$+L/````9B/>
+M@_L+?@6["P```(7;=`R-2_^[`0```-/CZP6[`0```&:!YO_CBH=_"P``A,!T
+M*C/2B\,E__\``(J7?PL``#O"?!=F@<X`&&:+AX`+``!FJ1``=`5F@<X`!('F
+M__\``#/`5F:+AW`+``"#P!(E__\``%"+AUP+``#_4`B#Q`B*AWP+``"$P'4C
+M:%P@```SP&:+AW`+``"#P`@E__\``%"+AUP+``#_4`R#Q`C'AU`+``!<(```
+M@>/__P``,\"*AW\+``"-<P&+WCO#=@0SVXK8O0`(```SP"ONB:]4"P``:@)F
+MBX=P"P``@\`N)?__``!0BX=<"P``_U`$,\!FBX=P"P``@\`6)?__``!0BX=<
+M"P``_U`<B$0D+R7_````@\@0)?\```!0,\!FBX=P"P``@\`6)?__``!0BX=<
+M"P``_U`$:`\0#P`SP&:+AW`+``"#P"0E__\``%"+AUP+``#_4`QH'Q```#/`
+M9HN'<`L``(/`*"7__P``4(N'7`L``/]0#&H`,\!FBX=P"P``@\`N)?__``!0
+MBX=<"P``_U`$P>L!,\!#P>,0@<L``@``4V:+AW`+``"#P`PE__\``%"+AUP+
+M``#_4`S![0(SP,'N`;KZ`P``P>40*]8+ZE5FBX=P"P``@\`@)?__``!0BX=<
+M"P``_U`,:@(SP&:+AW`+``"#P"XE__\``%"+AUP+``#_4`0SP(I$)&<E[P``
+M`%`SP&:+AW`+``"#P!8E__\``%"+AUP+``#_4`1J`#/`9HN'<`L``(/`+B7_
+M_P``4(N'7`L``/]0!&H`,\!FBX=P"P``4(N'7`L``/]0"(/$7+Y`````9HN'
+M<@L``&:I@`!U`X/.`E8SP&:+AW`+``"#P"0E__\``%"+AUP+``#_4`QJ`#/`
+M9HN'<`L``(/`!"7__P``4(N'7`L``/]0#(/$$(N''`L``(F')`L``(F'(`L`
+M`(J'3@L```P(B(=."P``BX<8"P``/>@!``!R"5?H`/3__X/$!('.````!S/`
+M5F:+AW`+``"#P"0E__\``%"+AUP+``#_4`QFQX=("P````"#Q`A=6UY?@\04
+MPX/'`(UT)@"#[`Q75E-5C40D&(ML)"A058M4)"R+="0H4NAQL/__@\0,A<`/
+MA28!``!H````@(M$)!PE__\``(UX`S/`9HN&<`L``,'_`H/`%"7__P``4(N&
+M7`L``/]0#(M,)"`SP%%FBX9P"P``@\`8)?__``!0BX9<"P``_U`,@\00NP$`
+M```[^WY*C40D&%"+1"0H55#H^Z___X/$#(7`=`N-1_\[V`^%J0```(M4)!@S
+MP%)FBX9P"P``@\`8)?__``!0BX9<"P``_U`,@\0(0SO??+9H\+\`@#/`9HN&
+M<`L``(/`%"7__P``4(N&7`L``/]0#&B0ZE``,\!FBX9P"P``@\`8)?__``!0
+MBX9<"P``_U`,:@`SP&:+AG`+``"#P!@E__\``%"+AEP+``#_4`Q6BX9L"P``
+M_U`L9L=&`B$`9L=&!```,\"#Q!Q=6UY?@\0,PY!=6UZX`0```%^#Q`S#@\<`
+M@^P(,])7BTPD&%:+="084XM<)!@S_V:#^11U!X#[9'4",MMF]\8(`'4%@/MD
+M=06Z`0```&;WQ@0`=`F%TG4%OP$```!F@_D3=0V$VW4)A?]T!;D4````OL(@
+M``"%_W0&@>9_____A-NX``````^4P(E$)!"%P'04@<X`$```9H/Y$W4C@<X@
+M"```ZQN`^Q!U"X'.``$``.L.@\<`@/MD=0:!S@`"``#!YA"!S@`Q``"%TG0&
+M@>;_[___A?]T!H'F_]___XM$)!"%P'4%@/MD=0QF@_D3=0:!S@!"``"`^V1U
+M!H'F_^[__UN+QEY?@\0(PX/'`('_`````('_`````%>+?"0(,\#'AU`+````
+M````:@!FBX=P"P``@\`N)?__``!0BX=<"P``_U`$,\!FBX=P"P``@\`")?__
+M``!0BX=<"P``_U`<@\@&)?\```!0,\!FBX=P"P``@\`")?__``!0BX=<"P``
+M_U`$@\047\.#[`@SP%=6BW0D%&:+AG`+``"#P!(E__\``%"+AEP+``#_4""+
+M^"7__P``@\@@)?__``!0,\!FBX9P"P``@\`2)?__``!0BX9<"P``_U`(BX9<
+M"P``B40D%#/`9HN&<`L``&H"@\`P9HE$)!PSP&:+AG`+``"#P"XE__\``%"+
+MAEP+``#_4`2+5"0LC40D'%)J"&HX4.AVW/__:@`SP&:+AG`+``"#P"XE__\`
+M`%"+AEP+``#_4`2!Y___```SP%=FBX9P"P``@\`2)?__``!0BX9<"P``_U`(
+M@\0T7E^#Q`C#._^!_P````"!_P````"#[`@SP%=64XMT)!AFBX9P"P``@\`2
+M)?__``!0BX9<"P``_U`@B_@E__\``(/(("7__P``4#/`9HN&<`L``(/`$B7_
+M_P``4(N&7`L``/]0"(N&7`L``(E$)!@SP&:+AG`+``!J`H/`,&:)1"0@,\!F
+MBX9P"P``@\`N)?__``!0BX9<"P``_U`$BU0D,(U$)"!2:@AJ.%#HU=?__XO8
+M,\!J`&:+AG`+``"#P"XE__\``%"+AEP+``#_4`2!Y___```SP%=FBX9P"P``
+M@\`2)?__``!0BX9<"P``_U`(@\0TB\-;7E^#Q`C#._^!_P````!05U:+?"08
+M4[D!````BW0D&(A/,(@/B$\!9HEW$+D$````9HE/$F:%SG0)N!P```#K!SO_
+MN!````!FQT<6$`"+UC/)9HE/'('B__\```/0B\9FB5<4)?__``"#P`*)3Q@E
+M__\``%"+1"08_U`<BMB+QB7__P``@\`#)?__``!0BT0D'/]0'(A$)!>#Q`BX
+M`P```"+#BH``````B$<@BD0D#ZB`=!,SP(K#)?P````-``$``(OPZP209C/V
+M@>;__P``P>8+B7<HBD0D#Z@(=`G&1RP0ZP>#Q@#&1RP$QD<>!#/`9HM'%(/`
+M""7__P``4(M$)!C_4!R#Q`2I`@```'0PQD<A!(I''@P8B$<>C4<BBU0D%%`S
+MP&:+1Q104NAO;/__@\0,N`$```!;7E^#Q`3#,\"*1"0/P?@$@^`#BH``````
+MB$<A/`1U"XI''@P0B$<>Z[F0BD<>#`.(1Q[KKCO_@^P,N0$```!7BWPD'%:+
+M="084U6(3P&(3S"+1"0DN00```!FB4<09H7(9HE/$L8'`G0)N!P```#K!SO_
+MN!````!FQT<6$`"+5"0D,\EFB4\<@>+__P```]"+1"0D9HE7%"7__P``@\`"
+MB4\8B]@E__\``%#_5AR(1"0;:@6+PR7__P``4/]6!(M$)#`E__\``(/``XOH
+M)?__``!0_U8<B$0D*XO#:@8E__\``%#_5@2+Q27__P``4/]6'(I4)#>#Q!SV
+MP@&(1"0:=02H@'0EQD<>`&H"B\,E__\``%#_5@2+Q27__P``4/]6'(A$)"5J
+M`^LCD,9''@1J`(O#)?__``!0_U8$B\4E__\``%#_5AR(1"0E:@&+PR7__P``
+M4/]6!(O%)?__``!0_U8<B$0D,(/$&+@'````(D0D&8J``````(A'((M$)!BH
+M`70'QD<L$.L%D,9'+`2+1"08J(!T&+AX````BU0D&"+"#0`#``!FB40D%.L(
+MD&;'1"04``"+1"04)?__``#!X`J)1RB*1"0:J$!T#L9'(02*1QX,"(A''NL5
+M,\"*1"09P?@#@^`'BH``````B$<ABD<A/`1U3(I''@P0B$<>:@:+PR7__P``
+M4/]6!(U'(H'E__\``%!J/%56Z&AN__\SP('C__\``(I$)"]04_]6!(/$(+@!
+M````75M>7X/$#,.#Q@"*1QX,`^NRD('_`````('_`````%>+?"0(,\!FBX=P
+M"P``@\`")?__``!0BX=<"P``_U`<)?<```!0,\!FBX=P"P``@\`")?__``!0
+MBX=<"P``_U`$@\0,7\,[_SO_@?\`````5XM\)`AJ!3/`9HN'<`L``(/``B7_
+M_P``4(N'7`L``/]0!#/`9HN'<`L``(/``R7__P``4(N'7`L``/]0'"7W````
+M4#/`9HN'<`L``(/``R7__P``4(N'7`L``/]0!(/$%%_#D('_`````('_````
+M`%`SP%>+?"0,:@)FBX=P"P``@\`")?__``!0BX=<"P``_U`$,\!FBX=P"P``
+M@\`#)?__``!0BX=<"P``_U`<BU0D'(/$#(K(N`<````BP8'B_P```(J`````
+M`"7_````.\)T5HM$)!`E_P```(J``````(A$)`<\!W8*N`,```!?@\0$PS/`
+M,]**P8I4)`<E^`````O")?\```!0,\!FBX=P"P``@\`#)?__``!0BX=<"P``
+M_U`$@\0(,\!?@\0$PU>+?"0(:@(SP&:+AW`+``"#P`(E__\``%"+AUP+``#_
+M4`0SP&:+AW`+``"#P`,E__\``%"+AUP+``#_4!R*R#/`@\0,BL'!^`,STH/@
+M!XI4)`R*@``````E_P```#O"=#Z*D@`````SP(K!@>+_````P>(#)<<````+
+MPB7_````4#/`9HN'<`L``(/``R7__P``4(N'7`L``/]0!(/$"%_#@\<`@?\`
+M````@?\`````5XM\)`AJ`#/`9HM'%H/`'B7__P``4(N'7`L``/]0!&H(5^A9
+MD?__@\00)0`+```]``,``'42N`$```"(1QM?P[@!````7\.0:@97Z#"1__^#
+MQ`BI@````'7F,\!?PSO_:@0SP(M4)`AFBT(6@\`>)?__``!0BX)<"P``_U`$
+M@\0(PSO_@?\`````@?\`````@^P0,\!7BWPD&%9356:+AW`+``"#P!XE__\`
+M`%"+AUP+``#_4!R*V+@!````(L,E_P```%`SP&:+AW`+``"#P!XE__\``%"+
+MAUP+``#_4`0SP&:+1Q:#P`@E__\``%"+AUP+``#_4""+\+@``P``9B/&@\00
+M/0`#```/A8`"``"+QB7__P``#0`(```E__\``%`SP&:+1Q:#P`@E__\``%"+
+MAUP+``#_4`@SP&:+1Q:#P`XE__\``%"+AUP+``#_4"!FB40D*H/$#&:%P`^$
+M#@(``#/`9HM'%H/`!B7__P``4(N'7`L``/]0(&:)1"0@,\!FBT<6@\`$)?__
+M``!0BX=<"P``_U`@BVPD)(/$"('E__\``"7__P``P>40"^AFBX=R"P``9JD0
+M`'1<9O?&``1T*3/`9HM$)!Y0,\!59HM'%H/`$"7__P``4(N'7`L``/]0*(/$
+M#.F%`0``,\!FBT0D'E`SP%5FBT<6@\`0)?__``!0BX=<"P``_U`0@\0,Z5P!
+M``"#QP`SP&:+1"0>P?@"9HE$)!BX`P```&8C1"0>9O?&``1FB40D%@^$FP``
+M`(M$)!AFA<!T,"7__P``4#/`56:+1Q:#P!`E__\``%"+AUP+``#_4#`SP&:+
+M1"0J)?S_```#Z(/$#&:+1"069JD"`'0B,\!FBT<6@\`0)?__``!0BX=<"P``
+M_U`@@\4"@\0$9HE%_F:+1"069JD!``^$NP```#/`9HM'%H/`$"7__P``4(N'
+M7`L``/]0'(A%`(/$!.F8````@\<`BT0D&&:%P'0P)?__``!0,\!59HM'%H/`
+M$"7__P``4(N'7`L``/]0&#/`9HM$)"HE_/\```/H@\0,9HM$)!9FJ0(`="4S
+MP&:+10!0,\!FBT<6@\`0)?__``!0BX=<"P``_U`(@\4"@\0(9HM$)!9FJ0$`
+M="$SP(I%`%`SP&:+1Q:#P!`E__\``%"+AUP+``#_4`2#Q`A7Z"EI__^#Q`2%
+MP'0*,\!=6UY?@\00P[X!````ZPR05^BZ,___B_"#Q`0SP(K#4#/`9HN'<`L`
+M`(/`'B7__P``4(N'7`L``/]0!(/$"(O&75M>7X/$$,,[_X'_`````%>+?"0(
+M:G$SP&:+AW`+``"#P!TE__\``%"+AUP+``#_4`1J`C/`9HN'<`L``(/`'R7_
+M_P``4(N'7`L``/]0!&CQ````,\!FBX=P"P``@\`=)?__``!0BX=<"P``_U`$
+M,\!FBX=P"P``@\`?)?__``!0BX=<"P``_U`<@\@$)?\```!0,\!FBX=P"P``
+M@\`?)?__``!0BX=<"P``_U`$,\!FBX=P"P``@\`>)?__``!0BX=<"P``_U`<
+M@\@$)?\```!0,\!FBX=P"P``@\`>)?__``!0BX=<"P``_U`$@\0P7\,[_X'_
+M`````('_`````(/L(+D!````5XM\)#!6BW0D+%-5BT0D.,8'`R7__P``B$\!
+MB$\P:#:4``"#P!UFB40D+HM$)#PE__\``(/`'F:)1"0LBT0D/"7__P``@\`?
+M9HE$)"J+1"0L)?__``!05NAKD?__@\0,A<!U/%U;7C/`7X/$(,,[_T.!^P`!
+M```/C",!``"+="04BWPD$#/`BD0D+E`SP&:+1"0J4/]6!(/$".E)`0``D&;'
+M1P2-$&;'1P8!`(M$)"@E__\``%#_5AR(1"0S)?<```!0BT0D,"7__P``4/]6
+M!&H&,\!FBT0D.E#_5@0SP&:+1"0Z4/]6'&;'1Q(@`&:)1PR+1"109HE'$#/`
+M9HM$)$(SR6:)3Q9FB4\4B4\89HE/'&IP4/]6!#/`9HM$)$90_U8<B$<@:/@`
+M```SP&:+1"124/]6!#/`9HM$)%)0_U8<B$0D7H/$,*@@QT0D(``````/A(P`
+M``#&1Q\")=\```!0,\!FBT0D*E#_5@2+1"1`)?__``!0_U8<C6X<B7PD'(ET
+M)""-5@2+1"1$NZH````E__\``(OR@\`+@\0,B_@SP(K#4(O')?__``!0_Q9J
+M8?]5`(O')?__``!0_U4`,]*#Q!"*TSO"#X2B_O__QT0D(`$```"+="04BWPD
+M$.FB_O__D,9''P"+1"0H)?__``!0_U8<@\0$J0$```!U"(M$)""%P'01QD<>
+M",9''P+&1R$$ZR6#Q@#&1QX`:G0SP&:+1"0N4/]6!#/`9HM$)"Y0_U8<B$<A
+M@\0,BD<A/`1T"(I''@P#B$<>:/T````SP&:+1"0N4/]6!(U'(E`SP&:+1"0R
+M:CQ05NC+9/__:D`SP&:+1"1&4/]6!#/`9HM$)$90_U8<P>`0B4<H:D$SP&:+
+M1"124/]6!#/`9HM$)%)0_U8<P>`(BU<H"\*)1RAH]P```#/`9HM$)%Y0_U8$
+M,\!FBT0D7E#_5AR#Q#RI`0```'0)QD<L$.L'@\8`QD<L!#/`BD0D+U"+1"0L
+M)?__``!0_U8$N`$```"#Q`A=6UY?@\0@PXUT)@!7BWPD"#/`9HN'<`L``(/`
+M'B7__P``4(N'7`L``/]0'"7W````4#/`9HN'<`L``(/`'B7__P``4(N'7`L`
+M`/]0!&C^````,\!FBX=P"P``@\`=)?__``!0BX=<"P``_U`$,\!FBX=P"P``
+M@\`?)?__``!0BX=<"P``_U`<@\A`)?\```!0,\!FBX=P"P``@\`?)?__``!0
+MBX=<"P``_U`$:A2+AUP+``#_4#2#Q"1?PU>+?"0(:G`SP&:+AW`+``"#P!TE
+M__\``%"+AUP+``#_4`0SP(I$)!10,\!FBX=P"P``@\`?)?__``!0BX=<"P``
+M_U`$,\"#Q!!?PY"-="8`5XM\)`A3,\!FBX=P"P``@\`>)?__``!0BX=<"P``
+M_U`<BM@SP(K#)?<```!0,\!FBX=P"P``@\`>)?__``!0BX=<"P``_U`$:G0S
+MP&:+AW`+``"#P!TE__\``%"+AUP+``#_4`0SP(I$)"10,\!FBX=P"P``@\`?
+M)?__``!0BX=<"P``_U`$,\"*PU`SP&:+AW`+``"#P!XE__\``%"+AUP+``#_
+M4`2#Q"1;7\.#QP!0BT0D&%>+?"0@5HMT)!13N00```#&1P$#QD<P`8@'BT0D
+M(&:)1P2+1"0<9HE'#&:%SF:)=Q!FB4\2=`BX'````.L&D+@0````9L='%A``
+MB]8SR6:)3QR!XO__```#T(O&9HE7%"7__P``B4\84(M$)!C_4!R*V(O&)?__
+M``!`)?__``!0BT0D'/]0'(A$)!>#Q`BX<````")$)`^#^'!U"\9''C#&1R$$
+MZQJ0QD<>(HM$)"!F/80*=0>P(@P!B$<>QD<A_[@#````(L.*@`````"(1R"*
+M1"0/J(!T$S/`BL,E_`````T``0``B_#K!)!F,_:!YO__``#!Y@N)=RB*1"0/
+MJ`AT)<9'+!"-1R*+3"044#/`9HM'%%!1Z$!=__^#Q`Q;7E^#Q`3#.__&1RP$
+MZ]D[_X'_`````('_`````(/L#%>_`0```%9358ML)"#'1"08`````(UU!(M4
+M)"0[^G1EC4<')?\```!0:)8```#_%F@!`0``_U4<P>`(:``!``"+V/]5'(/$
+M$`O#/80*```/A*0````]A0H``'0'/88*``!U(F@"`0``_U4<P?@$@^`#B\BX
+M`0```-/@"T0D'(E$)!R#Q`1'@_\(?HUJ`(OU:)8```#_5@0SVX/$"(ML)"2+
+M?"0HB\NX`0```-/@BU0D&(70=5PSP&:+!%T`````4%;H9XS__X/$"(/X!75#
+M5VH$:(0*``!5,\!FBP1=`````%!6Z-7]__^X`0```(/$&%U;7E^#Q`S#D&H`
+M:)8```#_%H/$"#/`75M>7X/$#,,[_T.#^P1\C5U;7C/`7X/$#,.!_P````"!
+M_P````!7BWPD"(M$)`R#P`<E_P```%!HE@```/]7!(M4)!B+3"044FH%:(4*
+M``!1:`(!``#_5QS!^`19@^`#9HL$10`````E__\``%!7Z$+]__^#Q""X`0``
+M`%_#._^!_P````!7BWPD"(M$)`R#P`<E_P```%!HE@```/]7!(M4)!B+3"04
+M4FH&:(8*``!1:`(!``#_5QS!^`19@^`#9HL$10`````E__\``%!7Z.+\__]J
+M`&B6````_U<$@\0HN`$```!?PSO_@?\`````@?\`````@^P45[\!````5E-5
+MBVPD*,=$)!@`````C74$C5T<C4<')?\```!0:)8```#_%F@!`0``_Q/!X`B)
+M1"0<:``!``#_$XM4)""#Q!`+PF:)1"0B,\!FBT0D(CV$"@``#X2-````/84*
+M```/A)8````]A@H```^$MP```.D:`0``._^+3"0PBT0D'%%J!&B$"@``4(M$
+M)#PE__\``%!3Z!_\__^#Q!BX`0```%U;7E^#Q!3#@\<`:@!HE@```/\6BTPD
+M.#/`46H%9HM$)#)0BT0D0%<E__\``%!5Z./[__^X`0```(/$(%U;7E^#Q!3#
+M@\<`BU0D&(E\)!Q"B50D&.F6````._]H`@$``/]5'(M4)#"#Q`3!^`2!XO__
+M``"#X`-FBP1%`````"7__P``.\)TA&@"`0``_U4<BU0D,(/$!,'X!('B__\`
+M`(/@`V:+!$4`````)?__```[PG4\:@!HE@```/\6BT0D.%`SP&H&9HM$)#)0
+MBT0D0%<E__\``%!5Z#O[__^#Q""X`0```%U;7E^#Q!3#@\<`1X/_"`^.?/[_
+M_VH`B]UHE@```/]3!(M$)""#Q`B%P'0W@_@!#X2^_O__BU0D,(M$)"Q2:@1H
+MA`H``&H`)?__``!04^C@^O__@\08N`$```!=6UY?@\04PUU;7C/`7X/$%,,[
+M_XUT)@!7BWPD"&:+AW(+``!FJ0(`=%<SP(J'>PL``(/`!R7_````4&B6````
+MBX=<"P``_U`$:`(!``"+AUP+``#_4!R#R`XE_P```%!H`@$``(N'7`L``/]0
+M!&H`:)8```"+AUP+``#_4`2#Q!Q?PY"-="8`4%=6BW0D%%.+7"0@BWPD)('[
+M/8,)`74(Q@<'ZP:#Q@#&!PC&1P$"QD<P`6:)=Q"Y!````&:)3Q)FA<Z+1"0<
+MB5\$9HE'#'0(N!P```#K!I"X$````&;'1Q80`(O6,\EFB4\<@>+__P```]"+
+MQF:)5Q0E__\``(E/&%"+1"08_U`<B$0D$XO&)?__``!`)?__``!0BT0D'/]0
+M'(K8,\"#Q`B*P\'X!(O6@^`#@>+__P``9HL$10`````E__\``#O"=`HSP%M>
+M7X/$!,.0N`,```"*5"0/(L+VPT"*@`````"(1R!T"\9''C#&1R$$ZPF0QD<>
+M(L9'(?_VPX!T%S/`BD0D#R7\````#0`!``"+\.L&@\<`9C/V@>;__P``P>8+
+M]L,(B7<H=`C&1RP0ZP8[_\9'+`2-1R*+3"044#/`9HM'%%!1Z&=7__^#Q`RX
+M`0```%M>7X/$!,,[_X'_`````%=6BT0D$,'@#(OX)?__```%@`P``"7__P``
+M4(M$)!#_4"2#Q`2+\('^/8,)`70(@?X]@PD"=2.+QR7__P``!80,```E__\`
+M`%"+1"00_U`<@\0$J0$```!U"K@!````7E_#._^!Y___``"+1"0,@<>'#```
+M@>?__P``5_]0','X!(M4)!A25H/@`XM,)!Q19HL$10`````E__\``%"+1"0@
+M4.CY_?__@\087E_#@\<`5XM$)`A64U4S_XU8)(O'P>`,B_`E__\```6`#```
+M)?__``!0_Q.#Q`2+Z(']/8,)`70,@?T]@PD"#X6!````B\8E__\```6$#```
+M)?__``!0BT0D&/]0'(/$!*D!````=%Z!YO__``"+1"04@<:'#```@>;__P``
+M5O]0','X!(/$!(/@`S/29HM4)!AFBP1%`````"7__P``.\)U(XM4)!PSP%)5
+M5XM,)"!FBT0D)%!1Z#K]__^#Q!1=6UY?PSO_1X/_$`^,0____UU;7C/`7\.#
+MQP"!_P````"!_P````!7BWPD"&:+AW(+``!FJ0(`=#XSP&:+AW`+``!`)?__
+M``!0BX=<"P``_U`<@\A`)?\```!0,\!FBX=P"P``0"7__P``4(N'7`L``/]0
+M!(/$#%_#._^!_P````"!_P````!7BWPD"&H`,\!FBT<6@\`4)?__``!0BX=<
+M"P``_U`$,\!FBT<6@\`()?__``!0BX=<"P``_U`@@\0,)0`+```]``,``'42
+MN`$```"(1QM?P[@!````7\.0,\!FBT<6@\`&)?__``!0BX=<"P``_U`@@\0$
+MJ8````!UUC/`7\,[_U>+?"0(BD<;A,!U(C/`9HM'%H/`!B7__P``4(N'7`L`
+M`/]0((/$!*F`````=!ZX`0```%_#@\8`QD<;`5?HCHS__[@!````@\0$7\-7
+MZ*Z*__^#Q`2%P'7?,\!?PX/'`&H`,\"+5"0(9HM"%H/`%"7__P``4(N"7`L`
+M`/]0!#/`@\0(PX'_`````('_`````&C`````,\"+5"0(9HM"%H/`%"7__P``
+M4(N"7`L``/]0!(/$",.#QP`[_X'_`````%>+?"0(,\!FBX=P"P``@\`2)?__
+M``!0BX=<"P``_U`<@^`_4#/`9HN'<`L``(/`$B7__P``4(N'7`L``/]0!(/$
+M#%_#@?\`````@?\`````4(M$)`B*0!N$P'4JBT0D"&:+0!8E__\``(/`%27_
+M_P``4(M$)`R+@%P+``#_4!R#Q`2HP'0*N`$```"#Q`3#D#/`@\0$PSO_._^!
+M_P````!7BWPD"&H`,\!FBT<6@\`4)?__``!0BX=<"P``_U`$,\!FBT<6@\`5
+M)?__``!0BX=<"P``_U`<@\0,J,"X`````%\/E<##._\[_X'_`````%<S_U-F
+MBUPD#(L,O0````"%R708,\"+TV:+00B!XO__```[PG0.1X/_$7+=,\!;7\.#
+MQP!;B\%?PX/'`(UT)@!7,_]3BUPD#(L,O0````"%R70-BU$$.]-T#D>#_Q%R
+MZ#/`6U_#@\<`6XO!7\.#QP!7,_]64S/2BDPD&&:+?"04P><09HM4)!`+^C/V
+MBQRU`````(7;=#>+$_?"P)\``'0GBT,$B]<E`/___X'B`/___SO"=1,SP#/2
+MBD,*BM$[PG4&B\-;7E_#1H/^$7*^6UXSP%_#@?\`````@?\`````N.P0``##
+M._\[_X'_`````(/L"%>+1"005HMT)"2+$(M\)!B!^B"!``!T&5ZX!````%^#
+MQ`C#._^X`@```%Y?@\0(PY!H[!```%?HH7K__V;'1P(``&;'!U*4,\F+1"0<
+MB(^<"P``B8=<"P``BT0D)(F'9`L``(M$)"B)AV`+```SP(F/&`L``(H&4.B0
+M_O__@\0,A<")AV@+``!TFV8/M@9FB4<&BX=H"P``BT!`B8=L"P``9HM&$&:)
+MAW`+``"+AV@+``"+0$!F@S@"=1IFBT849H7`=`EFB4<6ZPN#QP!FBT809HE'
+M%F:+1BYFB8>`"P``BD8MB(=_"P``BX=L"P``A<!T"6H`5_]0!(/$"(N':`L`
+M`(M(.(7)=`=7_U`X@\0$BD8BB(>""P``BD8CB(>#"P``BD8DB(>$"P``BD8E
+MB(>%"P``BD8FB(>&"P``BD8GB(>'"P``BD8AB(=Z"P``BD8>B(=Y"P``BD8,
+MB(=["P``BD8L/`1U#6;'AW(+`````.L+._]FQX=R"P```0"*1AZH`70H9HN'
+M<@L``&8-``%FB8=R"P``BT0D'#T4[_\`=@M>N`,```!?@\0(PXI&'J@(=!)F
+MBX=R"P``9@T$`&:)AW(+``"*1AZH!'029HN'<@L``&8-`"!FB8=R"P``BD8?
+MJ!!T$F:+AW(+``!F#4``9HF'<@L``&:+1P9F/0,`=31FBT8,9H7`=!)FBX=R
+M"P``9@T(`&:)AW(+``"*1A^H`G029HN'<@L``&8-$`!FB8=R"P``,\!FBT<&
+M@_@+=`6#^`QU![@!````ZP(SP(7`=!F*1A^H`7029HN'<@L``&8-`!!FB8=R
+M"P``9HM'!F8]#0!R-XI&'Z@(=!=FBX=R"P``9@V``&:)AW(+``#H.7+__XI&
+M'Z@@=!)FBX=R"P``9@T@`&:)AW(+``"+AVP+``"%P'065_]0#(/$!(7`=0M>
+MN`$```!?@\0(PV;'1P(0`(N';`L``&:#.`%U!,9'&@!>,\!?@\0(PSO_5HMT
+M)`AFBX9R"P``9JD`0'0*N`$```!>PX/'`#/`9HL&/5*4``!U)&:+1@)F/2``
+M=AJ*AGP+``"$P'4*5O^6I`L``(/$!/Z&?`L``#/`7L,SP(M4)`1FBP(]4I0`
+M`'4J9HM"`F8](`!V((J"?`L``(3`=!;^R(B"?`L``(3`=0I2_Y*H"P``@\0$
+MPY"-="8`,\"+5"0$9HL"/5*4``!U&&:+0@)F/2``=@Y2_Y*L"P``@\0$PX/'
+M`#/`PY"-="8`5S/_5HMT)`PSP&:+!CU2E```=21FBT8"9CT@`'8:5O^6L`L`
+M`(/$!(OX@_\!?@E6Z`MU__^#Q`2+QUY?PX/'`#/`BU0D!&:+`CU2E```=2!F
+MBT("9CT@`'864O^2L`L``(/$!(7`N``````/E<##D#/`PY"!_P````"!_P``
+M```SP(M4)`1FBP(]4I0``'439HM"`F8](`!V"5+HH'3__X/$!,.!_P````"!
+M_P````"#[!`SR8M4)!2*@0````!!@_E+B(0*0Q```'+MBH*""P``B(),$```
+MBH*""P``B()U$```BH+<$```B()?$```BH*#"P``B()-$```BH*#"P``B()V
+M$```BH+=$```B()@$```BH*$"P``B().$```BH*$"P``B()W$```BH+>$```
+MB()A$```BH*%"P``B()/$```BH*%"P``B()X$```BH+?$```B()B$```BH*&
+M"P``B()0$```BH*&"P``B()Y$```BH+@$```B()C$```BH*'"P``B()1$```
+MBH*'"P``B()Z$```BH+A$```B()D$```BH),$```#("(@DP0``!FQP0D`0"+
+M@F0+``!FQT0D#$L`!400``")1"0$C8)$$```B40D"&:+@KP.``!FA<!T$FH!
+M:@"-1"0(4%+HS6[__X/$$(/$$,,[_XUT)@!0,\!7BWPD#%9FBT<"A<`/A)L`
+M``"#^!`/A)H```"#^#`/A)$```"#^%!T"8/X8`^%SP```(J'?0L``*@##X2;
+M````5XN';`L``/]0*#/2@\0$B_`E__\``&:+EY`0```KPF:)1"0(9CV@#W97
+MBH=]"P``)/R(AWT+``!H``$``%>+AVP+``#_4!QJ`#/`9HN'D!```('F__\`
+M`%!6:@)J`&H%5^A';/__@\0DZS`[_S/`7E^#Q`3#7KCH`P``7X/$!,.0BT0D
+M"&8]N`MV$&:)MY`0``!7Z-7]__^#Q`2*EX\0``"*PO["J`>(EX\0``!U$FB`
+M````5XN';`L``/]0'(/$"%>+AVP+``#_4!"#Q`1>7X/$!,.0._^!_P````!3
+MBT0D"&:+4`1F_T@$9H72=0JX_____UO#@\<`BU0D"(M$)`R+"KL!`````]F)
+M&HH1B!!;,\##D#O_@?\`````@^P,5HMT)!1FBT8"9CT0`'4*BX9L"P``A<!U
+M&%ZX`@```(/$#,,[_[@!````7H/$#,,[_XM$)!AFBP`E__\``#U2E```=>&+
+M1"08BY9L"P``9HM``F:+$B7__P``@>+__P``.\)UP8M$)!B#P`2)1"0$BT0D
+M&&:+0`1FB40D"(J&>@L``#P$=5^+CF@+``"+EF@+``!FBTD,@>'__P``@<D`
+M@```9@N.<@L``&:)CG(+``"+4B")EJP+``"+EF@+``"+4AB)EK`+``"+EF@+
+M``"+4BB)EJ0+``"+EF@+``"+4C#K48/'`(N.:`L``(N6:`L``&:+20YF"XYR
+M"P``9HF.<@L``(M2)(F6K`L``(N6:`L``(M2'(F6L`L``(N6:`L``(M2+(F6
+MI`L``(N6:`L``(M2-(F6J`L``(U$)`10:`````!6BX9L"P``_U`8@\0,7H/$
+M#,,[_X'_`````%"+1"0(5XH0C7@!A-)U)D>*3_^$R74>1XI7_X32=19'BE?_
+MA-)U#D>*3_^$R74&B@>$P'0',\!?@\0$PU^X`0```(/$!,,[_SO_@?\`````
+M5XM\)`AFBT<"9CU!`'8_BU0D#%)7BX=L"P``_U`(BT0D%(/$"(7`="57Z'%J
+M__^+CV`+``!1BX=<"P``_U`\9L='!```9L='`B(`@\0(7\.+5"0$BT0D"(F"
+MD`L``&:+0@)F/4$`<@]J0%*+@FP+``#_4!R#Q`C#._^!_P````"+5"0$BT0D
+M"(F"E`L``&:+0@)F/4$`=@]J(%*+@FP+``#_4!R#Q`C#._^!_P````!7BWPD
+M"%.*1"00BI]]"P``B(=]"P``9HM'`F8]00!V10^^PS/2BE0D$#/"J0,```!T
+M$F@``0``5XN';`L``/]0'(/$"(I$)!"H`W09]L,#=117BX=L"P``_U`H9HF'
+MD!```(/$!%M?PSO_@?\`````5XM\)`A69HM'`F8]00!V+(M$)!2%P'4DQH=^
+M"P```6B`````5XN';`L``/]0'+@!````@\0(7E_#@\<`5XVWE!```(M$)!2Y
+M%@```(OX,\#SI5]>7\,[_SO_@?\`````BT0D!`^_@+P.``##C70F`(M,)`1F
+MBT$"9CU0`',.N`$```##N`(```##._\/OY&\#@``BT0D"$IFBP`E__\``#O"
+M?>!J`(M4)!!2BT0D$%!1Z-II__\SP(/$$,.-="8`BU0D!+@@````#[^2M`L`
+M`"O"PY"!_P````"!_P````!75HMT)`QFBX:T"P``9CT@`'P17K@"````7\.0
+MN`0```!>7\-FBX9R"P``9JD``701BT0D&(M4)!0#PCT````!=]IFBT8"9CU!
+M`',(7K@!````7\-FBX::"P``9JD"`'0;,\"+3"089HN&F`L``#O(?0I>N`,`
+M``!?PSO_BH:X"P``N1\````BR(M4)!"-#$G!X0.-O`Z\"P``B1>+5"04B5<$
+M9HM4)!AFB5<(BU0D'(E7%&:+1@)F/5``<@Y75HN&;`L``/]0)(/$"&;_AK0+
+M``"*EK@+``#^PC/`B):X"P``7E_#@\<`._^!_P````!J`8M4)`A2BX)L"P``
+M_U`$@\0(PX'_`````('_`````%!64XMT)!"*?"049HM&`F8]$`!T"UNX`0``
+M`%Z#Q`3#9HN&<@L``&:I`"!U3S/`BL>%P'0G@_@$="R#^!!T)X/X9'4*9HM&
+M!F8]$P!T&+@"````6UZ#Q`3#@\<`BH9Y"P``J(!T%C/`9HM&!DB#^!-W"O\D
+MA20'``"#QP!;N`,```!>@\0$PY!J`S/`9HN&<`L``(/``B7__P``4(N&7`L`
+M`/]0!#/`9HN&<`L``(/``R7__P``4(N&7`L``/]0'(A$)!>#Q`RH`70)N!``
+M``#K!SO_N`0````STHK7.\(/A)\!```SP(I$)`N#\`$E_P```%`SP&:+AG`+
+M``"#P`,E__\``%"+AEP+``#_4`2#Q`CI;0$``)!H]P```#/`9HN&<`L``(/`
+M'27__P``4(N&7`L``/]0!#/`9HN&<`L``(/`'R7__P``4(N&7`L``/]0'(/$
+M#(K8]L,!=`>X$````.L%N`0````STHK7.\(/A`\!```SP(K#@_`!)?\```!0
+M,\!FBX9P"P``@\`?)?__``!0BX9<"P``_U`$@\0(Z=\```"#QP`SP&:+AG`+
+M``!`)?__``!0BX9<"P``_U`<@\0$BMCVPPAT";@0````ZP<[_[@$````,]**
+MUSO"#X2?````,\"*PX/P""7_````4#/`9HN&<`L``$`E__\``%"+AEP+``#_
+M4`2#Q`CK=#/`9HN&<`L``(/`$"7__P``4(N&7`L``/]0'(/$!(K8]L.`=`>X
+M$````.L%N`0````STHK7.\)T.S/`BL,U@````"7_````4#/`9HN&<`L``(/`
+M$"7__P``4(N&7`L``/]0!(/$".L,B+Z="P``B+Z>"P``@/\0=0]FBY9R"P``
+M9H/*`>L.._]FBY9R"P``9H'B_O]FB99R"P``6S/`7H/$!,.0@?\`````@?\`
+M````BU0D!(I,)`AFBT("9CT0`'0.N`$```##N`(```##._]FBX)R"P``9JD(
+M('42@/D/=^:+@F@+``"+0$2%P'4)N`,```##@\<`,\"*P5!2BX)H"P``_U!$
+M,\"#Q`C#@\<`5HMT)`A3BEPD$&:+1@)F/1``=!!;N`$```!>P[@#````6U[#
+M9HN&<@L``&:I`"!UZS/`BL.#^`=^"SW_````#X7K`0``,\!FBT8&2(/X"W?+
+M_R2%=`<``#/`BL.#^`(/A,L!``"#^`0/A+X````]_P````^$MP$``&:+AG(+
+M``!FJ00`=9:+AF0+```]%.__`'>)BI9Y"P``@,H#B)9Y"P``@.+OB)9Y"P``
+MZ3<!```SP(K#@_@$=$,]_P````^$;`$``&:+AG(+``!FJ0P`#X5'____BX9D
+M"P``/13O_P`/AS;___^*EGD+``"`R@.(EGD+``#I[0```#O_BI9Y"P``@.+\
+MB)9Y"P``Z=<````SP(K#@_@$=!,]_P````^$8O___^D'`0``@\<`BI9Y"P``
+M@.+\B)9Y"P``@,H0B)9Y"P``Z9X```"#QP`SP(K#@_@$="<]_P````^%T```
+M`(J6>0L``(#*`HB6>0L``(#B[XB6>0L``.MM._^*EGD+``"`XOV(EGD+``"`
+MRA"(EGD+``#K43O_@/L$=$KIC@```#O_,\"*PX/X!'0K/?\```!U?&:+AG(+
+M``!FJ0`0#X57_O__BI9Y"P``@,H"B)9Y"P``ZQ$[_XJ6>0L``(#B_8B6>0L`
+M`(N&:`L``(M`2(7`=!(SP(K#4%:+AF@+``#_4$B#Q`B+1"04B)YZ"P``BI9Y
+M"P``B!"*AGD+``"H`7069HN6<@L``&:!R@`!ZQ1;N`(```!>PV:+EG(+``!F
+M@>+__F:)EG(+``!;,\!>PU"X_P,``%=64XM<)!2+="089B/&)?__```]0`(`
+M``^$\P```#V``@``#X3H````/<`"```/A-T````]``,```^$T@```#T@`P``
+M#X3'````/4`#```/A+P````]8`,```^$L0```(O&)?__``!0_U,<@\0$)>(`
+M``"#^"(/A94```"+QB7__P``@\`#)?__``!0_U,<@\0$)<````"#^$!U=8O&
+M)?__``"#P`0E__\``%#_4QR#Q`2I(````'58B\8E__\``(/`"27__P``4/]3
+M','@"(OXB\8E__\``(/`""7__P``4/]3'(/$"`O'9H7`="-FJ0$`=1V!YO__
+M``"#Q@R!YO__``!6_U,<@\0$J0@```!T"3/`6UY?@\0$PUM>7[@!````@\0$
+MPXUT)@"#[!!75E-5C40D'XML)"2)1"04:/@,``#_51PS_X/$!(K8C74<:F'_
+M%FCX#```_Q8STH/$"(K3.]!T";\!````ZQ`[_T>#_S)\VXM$)!0S_X@8A?\/
+MA<D```"*1"0?J`$/A;T```"-1"0?B40D%&CZ#```_U4<,_^#Q`2*V(UU'&IA
+M_Q9H^@P``/\6,]*#Q`B*TSO0=`J_`0```.L1@\<`1X/_,GS:BT0D%#/_B!B%
+M_W5Q:/@,``#_51R(1"0C@\0$)?\```"I\````'03@^`.@_@(N``````/E,#K
+M!8/'`#/`A<!U/6H.:/@,``#_501J8?]5'&CX#```_U4<@\00@_@.=1YJ`&CX
+M#```_U4$:F'_51QH^`P``/]5'(/$$(7`=`TSP%U;7E^#Q!##@\<`75M>N`$`
+M``!?@\00PX/'`(/L#%:+="044U;HD08``(/$!(7`=2-6Z*3^__^#Q`2%P'0)
+MN@(```#K&#O_5NCN!@``@\0$A<!T![H!````ZP(STH72=$*#^@%T08/Z`G4N
+M:A!H^`P``/]6!(M4)"R+3"0H4E&+1"0L4%;H(00``&H`B]AH^`P``/]6!(/$
+M((O#6UZ#Q`S#._\SV^ORBU0D)(M,)"!248M$)"105NA_`@``B]B#Q!#KUCO_
+M@?\`````5XM$)`A6BW0D%(L0BWPD$('Z(($``'007K@#````7\.X`0```%Y?
+MPS/`BD8(4#/`9HM&`E`SP&:+!E#HX.K__X/$#(O(A<ETUXI&#H3`==!FBT8$
+M9JD!`'3&9HL6BT0D#&:)5P1FBU8"9HE7!HI6/(A7((M6,(/B_(E7*(I6#(A7
+M+6:+5@1FB5<NBE$(B!=75E#_412#Q`Q>7\.0C70F`(/L#%.+1"04BQ"!^B"!
+M``!T$ENX_____X/$#,,SP%N#Q`S#D(M$)!S!X`R+V"7__P``!8`,```E__\`
+M`%"+1"08_U`D4.@&ZO__B40D#(/$"(7`=,<SP&:+PP6$#```)?__``!0BT0D
+M&/]0'(/$!*D!````=*:+3"08BT0D'%%0BU0D'(M$)`Q2_U!,@\0,6X/$#,.!
+M_P````"!_P````"#[`Q7BWPD%%.+%X'Z(($``'056[C_____7X/$#,,[_S/`
+M6U^#Q`S#BT0D((/`!R7_````4&B6````_U<$:`$!``#_5QS!X`AH``$``(O8
+M_U<<:@`+PXO8:)8```#_5P2!X___``!3Z$3I__^)1"0H@\0<A<!TJ8M,)!R+
+M1"0@45!7BT0D&/]03(/$#%M?@\0,PSO_@?\`````@?\`````5HMT)`Q3BUPD
+M(#/`BD8(4#/`9HM&`E`SP&:+!E#H'NG__X/$#(O(A<ET"HM$)!R+$870=0<S
+MP%M>PSO_9HL6B\%FB5,$9HM6`F:)4P9F#[94)!1FB5,,9@^V5"089HE3#HI6
+M/(A3((M6,(/B_(E3*(I6#(A3+6:+5@1FB5,NBE$(B!-;7L,[_SO_@?\`````
+M@^Q4,\E75E-5BT0D;(E,)&")1"1<BT0D:(E,)%"-6`R->"2+1"1P)<"?``")
+M1"14BVPD4,'E"X'-````@%5H^`P``/\3OL#___^#Q`B-1D`+Q5!H^`P``/\3
+M:/P,``#_%XE$-%R#Q`R#Q@1\X(M4)%R^0````%*+3"1848M$)%B#X!]0BT0D
+M7,'X!27_````4(U$)"!0BT0D?%#HT/[__X/$&(OPA?8/A)L```"+1"049JD!
+M`'4L9H-,)!0!B\6#R`10:/@,``#_$XM$)!PE_P```%"+1"1T:/P,``#_4`2#
+MQ!"+5"1<C40D$%)0BTPD<%'_5A2#Q`R%P'0Q@_@"=4>#S015:/@,``#_$XM$
+M)!PE__\``(/(!"7_````4(M$)'1H_`P``/]0!(/$$/]$)&"+1"1TBU0D8#O0
+M?1^+3"1<@\$TB4PD7(M$)%!`B40D4#T``@``#XS4_O__75M>BT0D5%^#Q%3#
+M._^!_P````"#[%@SR5=64U6+1"1PB4PD8(E$)%B+1"1L@\`$B4PD7(E$)%2+
+M1"1LC7@@BT0D7"7_````4(M$)%AH^@P``/\0QT0D6`````"#Q`B+1"10P>`(
+M#0#```"+Z"7__P``4/\7@\0$/8T0```/A0(!``"+1"1L,_:-6"2+Q8T6)?__
+M```+PB7__P``4/\3B40T%(/$!(/&!(/^0'S>P?X"BU0D6%*!YO\```"+1"1X
+MBTPD<"7`GP``4(M$)%A6)?\```!0C40D(%!1Z#3]__^#Q!B+\(7V#X28````
+MBT0D%&:I`0!U*6:#3"04`8M$)!0E_P```%"+Q27__P``@\@$)?__``!0BT0D
+M7/\0@\0(BT0D6(M4)&Q0C40D%%!2_U84@\0,A<!T,(/X`G5'BT0D%('E__\`
+M`"7__P``@\T$@\@$@>7__P``)?\```!0BT0D6%7_$(/$"(M,)&"+1"1X08E,
+M)&`[R'TQBU0D6(/"-(E4)%B+3"1008E,)%"#^1`/C,C^__^+1"1<0(E$)%P]
+M``$```^,E/[__UU;7HM$)%1?@\18PY"!_P````"!_P````!75E-59HML)!B+
+M="04B\4E__\``%#_5APS_X/&'(K8@\0$:F'_%HO%)?__``!0_Q8STH/$"(K3
+M.]!T#;@!````75M>7\.#QP!'@_\R?-2+1"0<B!A=6UXSP%_#D(UT)@!7BWPD
+M"&CX#```_U<D@\0$J0```']U2&@```"`:/@,``#_5PQJ8?]7'&CX#```_U<D
+M@\00/0```(!U)&BG`P"`:/@,``#_5PQJ8?]7'&CX#```_U<D@\00/:0#`(!T
+M!3/`7\.0:@!H^`P``/]7#(/$"+@!````7\,[_X'_`````%>+?"0(:/@,``#_
+M5R2#Q`2I````?W5(:````(!H^`P``/]7#&IA_U<<:/@,``#_5R2#Q!`]````
+M@'4D:*0#`(!H^`P``/]7#&IA_U<<:/@,``#_5R2#Q!`]I`,`@'0%,\!?PY!J
+M`&CX#```_U<,@\0(N`$```!?PSO_@?\`````BU0D!%+H]O[__X/$!(7`=1>+
+M3"0$4>@%]___@\0$A<!T#K@"````P[@!````PSO_BT0D!%#H1O___X/$!(7`
+M=><SP,.!_P````"!_P````"+3"0$9HM!`F8]$`!T#K@!````P[@#````PSO_
+M9HM!!F8]#0!R[HM4)`@SP(F1$`L``(M4)`R)D10+``"+5"00B9$8"P``PY!5
+MB^Q65XMU"(M]#(M-$/.D7UY=PT`H(RET<FQL9"YC("12979I<VEO;CH@("`Q
+M+C$@("0`3VQI8V]M(%123$Q$(#$N,BXP(`HD"E`*5`HP"D`*8`IP"@D#"@M`
+M`H`"P`(``R`#0`-@`P(`````````````````````````````````````````
+M`````````````````````````````````````/P7``!I&```:1@``&D8``!@
+M&```:1@``$@8``!I&```/!@``&D8``!I&```:1@```@8``#X7@``$&```/AB
+M``"P8P``7E\``!AD``!>7P```P``````````````````````````````````
+M````````````````````````````````````````0/_______P`````$````
+M````````````````````````````````````````````````````````````
+M```````````$$`!D````"0,*"P4&!P0!``````````$````20!``#``,````
+M````````````````````````````````````````````````````````````
+M``````````````````D*"PP/`P4'!08'``$#!`0("``%"`8(!P@``0(#"`@$
+M`P0'!08``0("````1I(```(````20!``#``,````````````````````````
+M``````````````````````````````````````````````````````````0`
+M```VE````P````(`````````````````````````````````````````````
+M````````````````````````````````````````````"````(0*```$````
+M`D``````````````````````````````````````````````````````````
+M```````````````````````````````(````A0H```4````"0```````````
+M````````````````````````````````````````````````````````````
+M``````````````````@```"&"@``!@````)`````````````````````````
+M````````````````````````````````````````````````````````````
+M````$````#V#"0$'````$D`0``P`#```````````````````````````````
+M```````````````````````````````````````````````````0````/8,)
+M`@@````20!``#``,````````````````````````````````````````````
+M`````````````````````````````````````$````"-$`$`"@`!``@,````
+M````````````````````````````````````````````````````````````
+M````````````````````````0````(T0`0`+``(#"`PHA/[__O\`````````
+M````````````````````````````````````````````````````````````
+M``````````"`````C1`!``P``P`(#`@$_O\`````````````````````````
+M```````````````````````````````````````````````````````````!
+M``"-$`0`#0`"````"```````````````````````````````````````````
+M``````````````````````````````````````````````(``(T0!``.``,`
+M```(````````````````````````````````````````````````````````
+M````````````````````````````````!```C1`'``\``0$```@`````````
+M````````````````````````````````````````````````````````````
+M``````````````````"```"-$`4`$@`"````"```````````````````````
+M````````````````````````````````````````````````````````````
+M``````@``(T0"``3``$"```(````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````!!`P````"``@```````PG#T]`,`.(0!``I``P``
+M```````&P`$``0`&P`*````,P`L0`%IX:U$````20`P`,C`R,#(P.398-3<V
+M``!L``$`>``!``@!`0"8`0$`F`$!`)@!`0"8`0$`F`$!`&P``0```@$```(!
+M```"`0!H`@$`:`(!`&@"`0!L``$`;``!`&@"`0!H`@$`:`(!`"P#`0!H`P$`
+MP`,!`"`$`0!<!`$`7`0!`%P$`0!<!`$`+`,!`*@$`0"T!`$`M`0!``0````,
+M`````0```%-#3P`!``$``0````@``0(``````````````````````0``````
+M````````!`#Q_P````````````````,``0`````````````````#``(`````
+M`````````````P`#``````````````````,`!``````````````````#``4`
+M`````````````````P`&``````````````````,`!P`````````````````#
+M``@``````````````````P`)``````````````````,`"@`,````````````
+M```$`/'_%````'`/`0!$`````@`!`",````0#@$`7`````(``0`O````8`H!
+M`(@````"``$`-@```/`*`0!H`0```@`!`$````!@#`$`I`$```(``0!*````
+M\`X!`'@````"``$`60```'`.`0!X`````@`!`&4```"0!@$`0`$```(``0!Q
+M````\/H``#@````"``$`>0```(#X``!,`0```@`!`(8```"@\P``9`````(`
+M`0"0````</,``#`````"``$`F0```##S```\`````@`!`*0```"P[0``6`$`
+M``(``0"U`````.@``#0!```"``$`Q@```.#7``#H`````@`!`-T```#PU@``
+MY`````(``0#S````X,<```@(```"``$`_P````#%``#8`@```@`!``H!``!0
+MQ```K`````(``0`@`0``H,,``*0````"``$`-0$``+"Z```8`````@`!`#\!
+M``!@N@``'`````(``0!)`0``0+H``!P````"``$`4@$``&`%`0`L`0```@`!
+M`&`!``"0_```2`````(``0!G`0```+0``)0````"``$`<P$``%"P``#<````
+M`@`!`'\!```0L```0`````(``0"*`0``T*\``$`````"``$`E@$``)"O``!`
+M`````@`!`*`!```0KP``@`````(``0"M`0``0*T``-0````"``$`N0$``#"K
+M```(`@```@`!`,<!``!@J@``R`````(``0#3`0``@*D``-0````"``$`X`$`
+M`("G``#X`0```@`!`.T!```@K@``\`````(``0#Y`0``\*(``(0$```"``$`
+M!`(``("Z```H`````@`!``P"````H@``\`````(``0`6`@``V`8``$L````!
+M``(`)P(``)0&``!$`````0`"`#,"``"`U@``<`````(``0!(`@``,+$``,@"
+M```"``$`6@(``$0&``!0`````0`"`&8"``#T!0``4`````$``@!R`@``I`4`
+M`%`````!``(`?@(``%0%``!0`````0`"`(H"``"0PP``$`````(``0">`@``
+M$+H``"P````"``$`J0(``)#!``#\`0```@`!`+H"```$!0``4`````$``@#&
+M`@``X/(``$@````"``$`T@(``)#R``!(`````@`!`-X"``"T!```4`````$`
+M`@#H`@``$/(``"@````"``$`\P(``.#Q```D`````@`!`/\"``"`\0``8```
+M``(``0`+`P``9`0``%`````!``(`%0,``$#R``!$`````@`!`"8#````\0``
+M@`````(``0`R`P``%`0``%`````!``(`/`,``,0#``!0`````0`"`$<#```0
+M[P``L`````(``0!4`P``H/```%0````"``$`80,``,#O``#4`````@`!`&H#
+M``!T`P``4`````$``@!U`P``T.H``&0````"``$`A`,``"0#``!0`````0`"
+M`(X#``!PZ@``6`````(``0"=`P``U`(``%`````!``(`IP,``$#I```D`0``
+M`@`!`+8#``!`[0``;`````(``0#"`P``0.L``/P!```"``$`RP,``(0"``!0
+M`````0`"`-4#``!0YP``L`````(``0#@`P```.<``$P````"``$`\0,``%#B
+M``#D`````@`!```$``!0Y@``L`````(``0`1!```X-X``"0````"``$`'P0`
+M`(#>``!@`````@`!`"X$```0WP``.`,```(``0`_!```0.,```P#```"``$`
+M2`0``#0"``!0`````0`"`%($``#0W0``I`````(``0!=!```$-T``,`````"
+M``$`;@0``*#<``!D`````@`!`'T$``!0W```2`````(``0".!```,-H``!0"
+M```"``$`EP0``.0!``!0`````0`"`*$$``#<`0``"`````$``@"M!```S`$`
+M`!`````!``(`N00``,0!```(`````0`"`,$$``"\`0``"`````$``@#.!```
+MT-@``&`!```"``$`UP0``&P!``!0`````0`"`.$$``!H`0``!`````$``@#H
+M!```9`$```0````!``(`]`0``%P!```(`````0`"`/T$``#PSP``+`````(`
+M`0`0!0``@-4``/0````"``$`)P4``"#0``#\`P```@`!`#<%```@U```8`$`
+M``(``0!,!0``)`$``#@````!``(`7@4``!@!```*`````0`"`'$%``#0N@``
+M8`(```(``0"#!0``(,$``'`````"``$`F04``#"]``#D`@```@`!`*@%```@
+MP`````$```(``0"\!0``X````#@````!``(`S04``-"A```H`````@`!`-D%
+M``"`H0``2`````(``0#E!0``T)\``+`!```"``$`]@4``$"=``"0`@```@`!
+M``@&``"@FP``E`$```(``0`>!@``()@``'@#```"``$`-`8``'"7``!0````
+M`@`!`$@&``"0D```H`4```(``0!=!@``T(\``,`````"``$`;P8``+"/```@
+M`````@`!`(4&``!PCP``0`````(``0"9!@``0(\``"@````"``$`K`8``)".
+M```H`````@`!`,4&``!`C```*`````(``0#5!@``$(P``"@````"``$`X@8`
+M`/"$``"(`P```@`!`/0&``"PA```/`````(``0#\!@``((0``(P````"``$`
+M!@<``/"#```H`````@`!`!0'```P@P``N`````(``0`D!P```(,``"@````"
+M``$`+@<``%!^``"P!````@`!`#<'``"`?```R`$```(``0!%!P``\'H``(P!
+M```"``$`50<``'!V``!T!````@`!`%T'``!0=@``&`````(``0!E!P``\'4`
+M`%@````"``$`;0<``*!U``!0`````@`!`','```0=0``D`````(``0![!P``
+M`'0``#@````"``$`AP<``.!S```@`````@`!`)`'``"0<P``1`````(``0"=
+M!P``,',``%P````"``$`J`<``*!P``"8`````@`!`+$'``"0;P``0`````(`
+M`0"W!P``(&\``"P````"``$`P`<```!O```<`````@`!`,P'```0;0``Z`$`
+M``(``0#C!P``4&P``+P````"``$`]`<``)!K``"T`````@`!``0(````:P``
+MC`````(``0`-"```$&H``.0````"``$`&`@`````````!````0`#`"$(``#P
+M:```'`$```(``0`I"```D&@``%@````"``$`-P@``!"-``!T`0```@`!`$8(
+M```P9```3`$```(``0!4"```@(@``"`!```"``$`:@@``#"6```X`0```@`!
+M`'X(``#`EP``5`````(``0"-"```$%X``!0&```"``$`G0@``*!=``!H````
+M`@`!`*H(``"06```!`4```(``0"V"```P%<``-`````"``$`QP@``,".``"`
+M`````@`!`-4(``#`C```3`````(``0#E"```<(P``$P````"``$`^@@``,"*
+M``!(`0```@`!``8)``"@B0``'`$```(``0`2"0``L%0``!`#```"``$`)@D`
+M`)!0```4!````@`!`#8)``!`3P``1`$```(``0!$"0``,$X``!`!```"``$`
+M40D``*!,``"0`0```@`!`%\)````3```E`````(``0!M"0```'```)0````"
+M``$`=0D``"!+``#@`````@`!`'T)``"`2@``E`````(``0"'"0``L$@``-`!
+M```"``$`E`D``&!&``!,`@```@`!`)P)``!010``$`$```(``0"E"0```$4`
+M`$P````"``$`K0D``*!"``!@`@```@`!`+0)``#`/@``V`,```(``0#!"0``
+M@&<``!`!```"``$`SPD``+`T```<`@```@`!`-P)```P,P``@`$```(``0#I
+M"0``8#```$0"```"``$`]@D``(`F``"(!@```@`!``@*``#0%0````,```(`
+M`0`5"@``@&4``#P!```"``$`(@H````5``#$`````@`!`"T*``!0#```K`@`
+M``(``0`W"@``L`H``*`!```"``$`1`H``,!F``"X`````@`!`$\*``#P"0``
+MN`````(``0!@"@``0'(``.@````"``$`<`H``-!O```L`````@`!`'@*``"`
+M!P``<`(```(``0"""@``X`(``)0$```"``$`D0H``%!O```\`````@`!`)8*
+M````````V`(```(``0"?"@``C`````$````!``(`J`H``!`M``!$`P```@`!
+M`+@*``"`(P``^`(```(``0#("@``\!X``)`$```"``$`V0H``+`R``!T````
+M`@`!`.D*``#0&```(`8```(``0#Y"@``0'0``+`````"``$`!`L``-`V``#L
+M!P```@`!``P+```@<@``'`````(``0`6"P``\'0``"`````"``$`(PL``$!Q
+M``#@`````@`!`"P+``!4````.`````$``@!#"P``1@````X````!``(`40L`
+M`$(````$`````0`"`%H+```Z````"`````$``@!F"P``,@````@````!``(`
+M;PL``"`````2`````0`"`'<+````````(`````$``@!["P``\+8``%0"```2
+M``$`A0L``%#X```D````$@`!`)\+``!@_@``#````!(``0"Q"P``P/X``!0`
+M```2``$`P@L``&#W```\````$@`!`,X+``#@_```4````!(``0#9"P```/X`
+M`%@````2``$`[`L``-`'`0"H````$@`!`/D+``!@_0``*````!(``0`3#```
+MH+0``%`"```2``$`'0P``.#^``#H````$@`!`#(,``#0_P``%````!(``0!!
+M#```,/T``"@````2``$`5@P``,`)`0"4````$@`!`&D,``#0^0``&`$``!(`
+M`0!S#```P`\!`$@````2``$`@@P```@0`0``````$``!`(P,```0^```-```
+M`!(``0"E#```\/\``+0"```2``$`LPP``"`)`0"4````$@`!`,<,```@]```
+M\`(``!(``0#8#```@`@!`)P````2``$`YPP``!#T```(````$@`!`/@,```P
+M^P``6`$``!(``0`&#0``D/T``&@````2``$`'@T``'#^``!,````$@`!`#$-
+M``"P`@$`8````!(``0!##0``H/<``"P````2``$`60T``%"Y``"T````$@`!
+M`&X-```0]P``4````!(``0![#0``$`,!`%`"```2``$`APT``-#W``!`````
+M$@`!``!T<FQL9&5L9BYO`'1R;&QD+F,`4$-)0DE/4U!R97-E;G0`4$-)0VAE
+M8VM296<`06-C97!T`%!#23%3=V5E<`!00TDR4W=E97``3VQD4$-),5!R97-E
+M;G0`4$-),5!R97-E;G0`4$-),E!R97-E;G0`1V5T0V]D90!396YD5%101G)A
+M;64`4$-)3&]O:W5P`$QO;VMU<$E$`$QO;VMU<%1Y<&4`0V]N9C,Q,S-3;&]T
+M0F%S90!#;VYF,S$R.5-L;W1"87-E`$)U;&QS97EE5W)I=&524$Q%15!R;VT`
+M0G5L;'-E>65296%D4E!,1450<F]M`$1R86EN4EA&:69O`&1R86EN7W1X<G@`
+M2&%W:V5Y95=R:71E4E!,1450<F]M`$AA=VME>65296%D4E!,1450<F]M`$5%
+M35-$96QA>0!%15!O<G1/=70`1450;W)T26X`3D4R,#`P4')E<V5N=`!Z97)O
+M97,`07-I8T5%4F5A9$(`07-I8T5%5W)I=&4`1457<FET94)I=`!%14-L;V-K
+M1&]W;@!%14-L;V-K57``145#;&]C:U!U;'-E`$5%5W)I=&53=&]P`$5%5W)I
+M=&5286YD;VT`07-I8T5%4F5A9%<`1457<FET95-T87)T`$5%1'5M;7E7<FET
+M90!%15=R:71E0GET90!%15)E861">71E`$5%1&5L87D`145296%D0FET`%12
+M;&QD5%105&5M<&QA=&4`061A<'1E<DQI<W0`0G5L;'-E>65(5T-O;F9I9TEN
+M:70`0G5L;'-E>6500TE#;VYF:6<`3T,S-30P5&%B;&4`3T,S,C4P5&%B;&4`
+M3T,S,30Q5&%B;&4`3T,S,30P5&%B;&4`2&%W:V5Y94A70V]N9FEG26YI=`!%
+M;F%B;&500TDT`$AA=VME>6500TE#;VYF:6<`3T,S,3,Y5&%B;&4`1&ES86)L
+M95!#23,`4')E<V5N=%!#23,`4$-),U1A8FQE`$5N86)L95!#23(`1&ES86)L
+M95!#23(`4')E<V5N=%!#23(`4$-),E1A8FQE`%!#23%(5T-O;F9I9TEN:70`
+M1&ES86)L95!#23$`4$-),51A8FQE`$5)4T$R5&%B;&4`0V]N9C,Q,S-3;&]T
+M`$5)4T%/<&5N26YI=`!#;VYF,S$S,P!%25-!,51A8FQE`$U#03-3;&]T0V]N
+M9FEG`$U#03-486)L90!-0T$R4VQO=$-O;F9I9P!-0T$R5&%B;&4`34-!,5-L
+M;W1#;VYF:6<`34-!3W!E;DEN:70`0V]N9C,Q,CD`34-!,51A8FQE`$E303-3
+M971$34$`25-!,U-E=$EN=&5R<G5P=`!)4T$S2%=/<&5N26YI=`!)4T$S2%=#
+M;VYF:6=);FET`$5N86)L93,Q,3A024\`1&ES86)L93,Q,3A024\`25-!,U!)
+M3TEN=&5R<G5P=`!#;VYF,S$Q.`!)4T$S5&%B;&4`25-!,E-E=$1-00!)4T$R
+M4V5T26YT97)R=7!T`$E303)(5T]P96Y);FET`$E303)(5T-O;F9I9TEN:70`
+M0V]N9C,Q,3<`25-!,E1A8FQE`$E303)$34%":71S`$E303));G1":71S`$E3
+M03)$34$`25-!,DEN=$QE=F5L`$-O;F8S,3$U`$E303%486)L90!)4T%$34$`
+M25-!26YT3&5V96P`145?4U!%140`0G5L;'-E>65"87-I8U)E<V5T`$)U;&QS
+M97EE0V]N;F5C=$]P=&EO;G,`0G5L;'-E>65297-T87)T`$)U;&QS97EE0V]D
+M941O=VYL;V%D`$)U;&QS97EE26YT97)F86-E`%181')A:6Y&<F%M94AE861E
+M<@!(87=K97EE0F%S:6-297-E=`!(87=K97EE0V]N;F5C=$]P=&EO;G,`2&%W
+M:V5Y95)E<W1A<G0`2&%W:V5Y94-O9&5$;W=N;&]A9`!(87=K97EE26YT97)F
+M86-E`$1I<V%B;&500TDT`%!R97-E;G100TDT`$AA=VME>65);G1E<G)U<'0`
+M5')A;G-M:71);G1E<G)U<'0`4W!I;C-296-E:79E26YT97)R=7!T`%-P:6XR
+M4F5C96EV94EN=&5R<G5P=`!(87=K97EE4F5A9$U!0U1I;65R`$AA=VME>653
+M971U<%1R86YS;6ET`%-E;F10;VQL26UM961I871E`$AA=VME>65#;&]S94-O
+M;7!L971E9`!(87=K97EE4V5T=7!#;VUM86YD`$AA=VME>65.;T]P97)A=&EO
+M;@!(87=K97EE4F5A9$5R<F]R0V]U;G1E<G,`2&%W:V5Y94U!0U)E<V5T`$AA
+M=VME>65#;&]S90!(87=K97EE2%=/<&5N26YI=`!'971,;VYG`$%S:6-#:&5C
+M:P!00TE(5T]P96Y);FET`%!#25!)3TEN=&5R<G5P=`!%;F%B;&500TD`1&]0
+M0TE024\`4$-)4$E/4')E<V5N=`!00TE(5T-O;F9I9TEN:70`061P5'EP90!%
+M14=E=$1/`$5%0VQE87(`1453970`0VAE8VM)9`!'971435-3:&]R=`!30T)#
+M;&5A<@!3=&%R=$-O;6UA;F0`5$U30V]M;6%N9`!T;7-?;W5T,@!D;W5T,@!T
+M;7-S:&]R=`!3=&]R95IE<F]E<P!2971U<FY#;VUP;&5T961"=69F97)S`%!R
+M;VUI<V-U;W5S0VAE8VL`5')A8V54;V]L4F5M;W9E`$-20T-H96-K`$-O;7!U
+M=&5#4D,`0U)#5&%B;&4`0U)#26YI=`!3971U<%1R86YS;6ET`%5P9&%T94-O
+M=6YT97)S`$5X96-);G1E<G)U<'0`2&%W:V5Y95)E861087)A;65T97)S`$AA
+M=VME>653971U<%)E8V5I=F4`2&%W:V5Y94U!0TEN:70`4W1A='5S26YT97)R
+M=7!T`$AA=VME>65297-E=`!(87=K97EE4&]L;`!(87=K97EE57-E<D-L;W-E
+M`$AA=VME>65296]P96X`2&%W:V5Y95-E=$=R;W5P`$AA=VME>653971&=6YC
+M=&EO;F%L`$AA=VME>65/<&5N`$EN:71#;VUM86YD`$AA=VME>653=&%R=$-O
+M;6UA;F0`3VQD4$E/26YT97)R=7!T`%!R97-E;G1/;&1024\`16YA8FQE36%S
+M=&5R`$1I<V%B;&5-87-T97(`4')E<V5N=$UA<W1E<@!T;7-?:6XR`%=A:710
+M24\`4F5A9$5%0DE!`%1-4U!#24-O;F9I9P!296%D0DE!`$-H96-K0DE!`$5%
+M4&%U<V4`145296%D`$5%3W5T3F]R;4-M9`!2971U<FY"=69F97)S`%)E;W!E
+M;E!H87-E,@!296]P96Y0:&%S934`4F5O<&5N4&AA<V4V`%1R86YS9F5R26YI
+M=$)L;V-K`%1-4TEN=&5R<G5P=`!297-E=$)U9F9E<G,`4FEN9U-T871U<P!4
+M>%)X4W=E97``061A<'1E<D-H96-K`%-E;F13=&%T=7,`0V]M;6%N9$-O;7!L
+M971E9`!297-P;VYD17)R;W)L;V<`=&US;&]N9P!$;T-O;6UA;F0`4F5A9%!A
+M<F%M971E<G,`9&EN,@!435-#:&5C:P!%141)0V]P>0!435-296%D34%#5&EM
+M97(`5$U34V5T=7!296-E:79E`%1-4U-E='5P5')A;G-M:70`5$U34V5T=7!#
+M;VUM86YD`%1-4T-O9&5$;W=N;&]A9`!435--04-);FET`%1-4U!O;&P`5$U3
+M7T-H96-K`%1-4U5S97)#;&]S90!435-297-E=`!0;W=E<DU!0TA?5$U326YT
+M97)F86-E`$Y%,C`P,%!O<G1486(`26YT3&5V96P`:7AT;W1M<V)A<V4`:7AT
+M;V)A<V4`5%)L;&1)1`!?5E\`5%)L;&1&:6YD`%12;&QD26YT97)R=7!T4&]S
+M=%-E<G9I8V4`5%)L;&14<F%N<VUI=$9R964`5%)L;&1296-E:79E1G)E90!4
+M4FQL9$5N86)L90!44FQL9$-L;W-E`%12;&QD1V5T4W1A=&ES=&EC<P!44FQL
+M9$9I;F100TD`5%)L;&13971&=6YC=&EO;F%L061D<F5S<P!44FQL9$]P96X`
+M5%)L;&1296-E:79E1G)A9VUE;G0`5%)L;&1%;65R9V5N8WD`5%)L;&13971'
+M<F]U<$%D9')E<W,`5%)L;&1-0T%3;&]T0V]N9FEG`%12;&QD4&]L;`!44FQL
+M9$%D9$UE;6]R>0!44FQL9$-O<'D`5%)L;&1);G1E<G)U<'10<F5397)V:6-E
+M`%12;&QD4V5T4W!E960`5%)L;&1%25-!4VQO=$-O;F9I9P!44FQL9$%D87!T
+M97));FET`%12;&QD4$-)0V]N9FEG`%12;&QD061A<'1E<E-I>F4`5%)L;&1$
+M;W=N;&]A9`!44FQL9%-E=%!R;VUI<V-U;W5S36]D90!44FQL9%1R86YS;6ET
+M1G)A;64`5%)L;&13971);G1E<G)U<'0`5%)L;&1);G1E<G)U<'10<F5S96YT
+M`%12;&QD24]!9&1R97-S0V]N9FEG`%12;&QD1&ES86)L90!44FQL9%-E=$1-
+M00!44FQL9$EN=&5R<G5P=%-E<G9I8V4``"YT97AT`"YD871A`"YB<W,`+FYO
+M=&4`+G-Y;71A8@`N<W1R=&%B`"YS:'-T<G1A8@`N<F5L+G1E>'0`+G)E;"YD
+M871A`"YC;VUM96YT`'L(```!T@``.PH```'4``#V%P```0,``#@F```!U```
+M@S````'4``!B,0```=0``&0R```!U```[#(```'4``![-````<D``*`U```!
+MZ```J#4```'H``"Q-0```>@``+LU```!Z```Q34```'H``#/-0```>@``#<V
+M```!R```UCH```''``#C/@```=@```L_```!V```(S\```'8``!+/P```=@`
+M`&,_```!V```BS\```'8``"C/P```=@``,L_```!V```&T````'8``!!0```
+M`=@``)%````!V```MT````'8```U00```=@``%9!```!V```?D$```'8``"6
+M00```=@``+Y!```!V```#D(```'8```T0@```=@``-E"```!V```,D,```'8
+M``!:0P```=@``*I#```!V```T$,```'8``!X1````=@``*!$```!V```N$0`
+M``'8``#F1````=@``/)>```!`P``\F@```&F``!2:0```:8``&!I```!I@``
+M<6D```&F``!^:0```:8``)5I```!I@``G6D```&F``"F:0```:8``*QI```!
+MI@``M6D```&F``##:0```:8``-9I```!I@``Y&D```&F``!):@```:8``'=J
+M```!I@``B6H```&F``";:@```:8``*UJ```!I@``V6H```&F``"@<P```=0`
+M`+EU```!V```Z'4```'8```)=@```=@``$!V```!V```SXL```'H```6F0``
+M`OH``'29```"^@``N)D```+Z``#>F0```OH``)2S```!<```@;<```$W``!'
+MN````><``+JX```!-P``O;D```$W``!GRP```78``&;9```!;P``#MH```%N
+M``!NVP```6L``.+;```!:@``9MT```%K``!^W0```6D``"3>```!:@``,]X`
+M``%H``#.Z````>4``/[I```!YP``(.H```'G``"NZ@```><```[K```!YP``
+M8^P```'G``"/[````><``&7N```!YP``C.X```'E``"C[P```><``%#P```!
+MYP``//,```$W``![\P```3<``+_S```!-P``B_@```$V``!R_````14``&4`
+M`0`!`P``9`,!``$#``!8`````>(``%P````!X0``8`````'@``!D`````=\`
+M`&@````!W@``;`````'=``!P`````=P``'0````!VP``>`````':``!\````
+M`=D``)`````!`@``E`````$"``"8`````0(``)P````!`@``H`````$"``"D
+M`````0(``*@````!`@``K`````$"``"P`````0(``+0````!`@``N`````$"
+M``"\`````0(``,`````!`@``Q`````$"``#(`````0(``,P````!`@``T```
+M``$"``#4`````0(``-@````!`@``W`````$"``#D`````:\``.@````!L0``
+M[`````&-``#P`````;```/0````!K0``^`````%Z``#\`````88````!```!
+M@P``!`$```&L```(`0```8(```P!```!>0``$`$```%X```4`0```7<``"@!
+M```!KP``+`$```&Q```P`0```8T``#0!```!L```.`$```&M```\`0```70`
+M`$`!```!A@``1`$```&#``!(`0```:P``$P!```!@@``4`$```%S``!4`0``
+M`7(``%@!```!<0``@`$```%L``"$`0```;@``(@!```!RP``C`$```&Y``"0
+M`0```;P``)@!```!NP``H`$```&Z``"L`0```>,``/@!```!9@``_`$```&X
+M`````@```<L```0"```!N0``"`(```&\```0`@```;L``!@"```!N@``'`(`
+M``%E```@`@```60``"0"```!XP``*`(```%C```L`@```6(``$@"```!8```
+M3`(```%?``!0`@```<L``%0"```!N0``6`(```&\``!<`@```5X``&`"```!
+MNP``9`(```%=``!H`@```;H``&P"```!7```<`(```%;``!T`@```>,``'@"
+M```!6@``?`(```%9``"8`@```5<``)P"```!N```H`(```'+``"D`@```;D`
+M`*@"```!O```L`(```&[``"X`@```;H``,`"```!5@``Q`(```'C``#0`@``
+M`54``.@"```!5P``[`(```&X``#P`@```<L``/0"```!N0``^`(```&\````
+M`P```;L```@#```!N@``$`,```%6```4`P```>,``"`#```!4P``.`,```%7
+M```\`P```;@``$`#```!RP``1`,```&Y``!(`P```;P``%`#```!NP``6`,`
+M``&Z``!@`P```58``&0#```!XP``<`,```%1``"(`P```4\``(P#```!N```
+MD`,```'+``"4`P```;D``)@#```!O```H`,```&[``"H`P```;H``+`#```!
+M3@``M`,```'C``#``P```4T``-@#```!3P``W`,```&X``#@`P```<L``.0#
+M```!N0``Z`,```&\``#P`P```;L``/@#```!N@````0```%.```$!````>,`
+M`!`$```!30``*`0```'````L!````8\``#0$```!N0``/`0```%*``!$!```
+M`9```$P$```!20``4`0```&.``!4!````>,``'@$```!P```?`0```&/``"`
+M!````8\``(0$```!1P``B`0```%'``",!````48``)`$```!1@``E`0```%%
+M``"8!````44``)P$```!DP``H`0```&.``"D!````>,``,@$```!P```S`0`
+M``&/``#0!````<L``-0$```!0P``V`0```%#``#<!````4(``.`$```!0@``
+MY`0```&0``#H!````9```.P$```!DP``\`0```&.``#T!````>,``!@%```!
+M0```(`4```%^```H!0```7T``#`%```!?```.`4```$_```\!0```3X``$`%
+M```!BP``1`4```%[``!H!0```4```'`%```!?@``>`4```%]``"`!0```7P`
+M`(@%```!/P``C`4```$^``"0!0```8L``)0%```!>P``N`4```%```#`!0``
+M`7X``,@%```!?0``T`4```%\``#8!0```3\``-P%```!/@``X`4```&+``#D
+M!0```7L```@&```!0```$`8```%^```8!@```7T``"`&```!?```*`8```$_
+M```L!@```3X``#`&```!BP``-`8```%[``!8!@```3D``&`&```!?@``:`8`
+M``%]``!P!@```7P``'@&```!/P``?`8```$X``"`!@```8L``(0&```!=0``
+ME`8```%M``"8!@```6<``)P&```!80``H`8```%8``"D!@```50``*@&```!
+M4@``K`8```%0``"P!@```4P``+0&```!2P``N`8```%(``"\!@```40``,`&
+M```!00``Q`8```$]``#(!@```3P``,P&```!.P``T`8```$Z```D!P```0(`
+M`"@'```!`@``+`<```$"```P!P```0(``#0'```!`@``.`<```$"```\!P``
+M`0(``$`'```!`@``1`<```$"``!(!P```0(``$P'```!`@``4`<```$"``!4
+M!P```0(``%@'```!`@``7`<```$"``!@!P```0(``&0'```!`@``:`<```$"
+M``!L!P```0(``'`'```!`@``=`<```$"``!X!P```0(``'P'```!`@``@`<`
+M``$"``"$!P```0(``(@'```!`@``C`<```$"``"0!P```0(``)0'```!`@``
+MF`<```$"``"<!P```0(``*`'```!`@``>'!G-'!L=7,@0"@C*2!S=&1D968N
+M:"`R,"XQ(#DT+S$R+S`T(`!A8V]M<#H@4F5L96%S92`U+C`N,&$@,39-87(Y
+M-0!O<'1I;3H@4F5L96%S92`U+C`N,&$@,39-87(Y-0!I,S@V87,Z(%)E;&5A
+M<V4@-2XP+C!A(#$V36%R.34`0"@C*2!T8V]P>2YS(#$N,"`Y."\P."\Q,0!I
+M,S@V87,Z(%)E;&5A<V4@-2XP+C!A(#$V36%R.34`````````````````````
+M`````````````````````````````````````0````$````&`````````$``
+M```<$`$````````````0``````````<````!`````P````````!<$`$`I`<`
+M````````````!``````````-````"`````,``````````!@!```$````````
+M``````0`````````$@````<````````````````8`0`<```````````````!
+M`````````!@````"```````````````<&`$`H!````8```#J````!````!``
+M```@`````P``````````````O"@!`)T-``````````````$`````````*```
+M``,``````````````%DV`0!/```````````````!`````````#(````)````
+M``````````"H-@$`6`,```4````!````!`````@````\````"0``````````
+M`````#H!`"`(```%`````@````0````(````1@````$``````````````"!"
+6`0"Z```````````````!```````````(
+`
+end
diff --git a/sys/contrib/dev/oltr/if_oltr.c b/sys/contrib/dev/oltr/if_oltr.c
new file mode 100644
index 0000000..4df1268
--- /dev/null
+++ b/sys/contrib/dev/oltr/if_oltr.c
@@ -0,0 +1,1586 @@
+/*
+ * Copyright (c) 1998, Larry Lile
+ * All rights reserved.
+ *
+ * For latest sources and information on this driver, please
+ * go to http://anarchy.stdio.com.
+ *
+ * Questions, comments or suggestions should be directed to
+ * Larry Lile <lile@stdio.com>.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/sockio.h>
+#include <sys/mbuf.h>
+#include <sys/malloc.h>
+#include <sys/kernel.h>
+#include <sys/socket.h>
+#include <sys/param.h>
+
+#include <net/if.h>
+#include <net/if_arp.h>
+#include <net/iso88025.h>
+#include <net/ethernet.h>
+#include <net/if_dl.h>
+#include <net/if_media.h>
+#include <net/iso88025.h>
+
+#if (__FreeBSD_version < 400000)
+#include <bpfilter.h>
+#endif
+
+#if (NBPFILTER > 0) || (__FreeBSD_version > 400000)
+#include <net/bpf.h>
+#endif
+
+#include <vm/vm.h> /* for vtophys */
+#include <vm/pmap.h> /* for vtophys */
+#include <machine/bus_memio.h>
+#include <machine/bus_pio.h>
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
+
+#include <pci/pcireg.h>
+#include <pci/pcivar.h>
+
+#include "contrib/dev/oltr/trlld.h"
+
+/*#define DEBUG_MASK DEBUG_POLL*/
+
+#ifndef DEBUG_MASK
+#define DEBUG_MASK 0x0000
+#endif
+
+#define DEBUG_POLL 0x0001
+#define DEBUG_INT 0x0002
+#define DEBUG_INIT 0x0004
+#define DEBUG_FN_ENT 0x8000
+
+#define PCI_VENDOR_OLICOM 0x108D
+
+#define MIN(A,B) (((A) < (B)) ? (A) : (B))
+#define MIN3(A,B,C) (MIN(A, (MIN(B, C))))
+
+char *AdapterName[] = {
+ /* 0 */ "Olicom XT Adapter [unsupported]",
+ /* 1 */ "Olicom OC-3115",
+ /* 2 */ "Olicom ISA 16/4 Adapter (OC-3117)",
+ /* 3 */ "Olicom ISA 16/4 Adapter (OC-3118)",
+ /* 4 */ "Olicom MCA 16/4 Adapter (OC-3129) [unsupported]",
+ /* 5 */ "Olicom MCA 16/4 Adapter (OC-3129) [unsupported]",
+ /* 6 */ "Olicom MCA 16/4 Adapter (OC-3129) [unsupported]",
+ /* 7 */ "Olicom EISA 16/4 Adapter (OC-3133)",
+ /* 8 */ "Olicom EISA 16/4 Adapter (OC-3133)",
+ /* 9 */ "Olicom EISA 16/4 Server Adapter (OC-3135)",
+ /* 10 */ "Olicom PCI 16/4 Adapter (OC-3136)",
+ /* 11 */ "Olicom PCI 16/4 Adapter (OC-3136)",
+ /* 12 */ "Olicom PCI/II 16/4 Adapter (OC-3137)",
+ /* 13 */ "Olicom PCI 16/4 Adapter (OC-3139)",
+ /* 14 */ "Olicom RapidFire 3140 16/4 PCI Adapter (OC-3140)",
+ /* 15 */ "Olicom RapidFire 3141 Fiber Adapter (OC-3141)",
+ /* 16 */ "Olicom PCMCIA 16/4 Adapter (OC-3220) [unsupported]",
+ /* 17 */ "Olicom PCMCIA 16/4 Adapter (OC-3121, OC-3230, OC-3232) [unsupported]",
+ /* 18 */ "Olicom PCMCIA 16/4 Adapter (OC-3250)",
+ /* 19 */ "Olicom RapidFire 3540 100/16/4 Adapter (OC-3540)"
+};
+
+/*
+ * Glue function prototypes for PMW kit IO
+ */
+
+#ifndef TRlldInlineIO
+static void DriverOutByte __P((unsigned short, unsigned char));
+static void DriverOutWord __P((unsigned short, unsigned short));
+static void DriverOutDword __P((unsigned short, unsigned long));
+static void DriverRepOutByte __P((unsigned short, unsigned char *, int));
+static void DriverRepOutWord __P((unsigned short, unsigned short *, int));
+static void DriverRepOutDword __P((unsigned short, unsigned long *, int));
+static unsigned char DriverInByte __P((unsigned short));
+static unsigned short DriverInWord __P((unsigned short));
+static unsigned long DriverInDword __P((unsigned short));
+static void DriverRepInByte __P((unsigned short, unsigned char *, int));
+static void DriverRepInWord __P((unsigned short, unsigned short *, int));
+static void DriverRepInDword __P((unsigned short, unsigned long *, int));
+#endif /*TRlldInlineIO*/
+static void DriverSuspend __P((unsigned short));
+static void DriverStatus __P((void *, TRlldStatus_t *));
+static void DriverCloseCompleted __P((void *));
+static void DriverStatistics __P((void *, TRlldStatistics_t *));
+static void DriverTransmitFrameCompleted __P((void *, void *, int));
+static void DriverReceiveFrameCompleted __P((void *, int, int, void *, int));
+
+static TRlldDriver_t LldDriver = {
+ TRLLD_VERSION,
+#ifndef TRlldInlineIO
+ DriverOutByte,
+ DriverOutWord,
+ DriverOutDword,
+ DriverRepOutByte,
+ DriverRepOutWord,
+ DriverRepOutDword,
+ DriverInByte,
+ DriverInWord,
+ DriverInDword,
+ DriverRepInByte,
+ DriverRepInWord,
+ DriverRepInDword,
+#endif /*TRlldInlineIO*/
+ DriverSuspend,
+ DriverStatus,
+ DriverCloseCompleted,
+ DriverStatistics,
+ DriverTransmitFrameCompleted,
+ DriverReceiveFrameCompleted,
+};
+
+struct oltr_rx_buf {
+ int index;
+ char *data;
+ u_long address;
+};
+
+struct oltr_tx_buf {
+ int index;
+ char *data;
+ u_long address;
+};
+
+#define RING_BUFFER_LEN 16
+#define RING_BUFFER(x) ((RING_BUFFER_LEN - 1) & x)
+#define RX_BUFFER_LEN 2048
+#define TX_BUFFER_LEN 2048
+
+struct oltr_softc {
+ struct arpcom arpcom;
+ struct ifmedia ifmedia;
+ bus_space_handle_t oltr_bhandle;
+ bus_space_tag_t oltr_btag;
+ void *oltr_intrhand;
+ struct resource *oltr_irq;
+ struct resource *oltr_res;
+ int unit;
+ int state;
+#define OL_UNKNOWN 0
+#define OL_INIT 1
+#define OL_READY 2
+#define OL_CLOSING 3
+#define OL_CLOSED 4
+#define OL_OPENING 5
+#define OL_OPEN 6
+#define OL_PROMISC 7
+#define OL_DEAD 8
+ struct oltr_rx_buf rx_ring[RING_BUFFER_LEN];
+ int tx_head, tx_avail, tx_frame;
+ struct oltr_tx_buf tx_ring[RING_BUFFER_LEN];
+ TRlldTransmit_t frame_ring[RING_BUFFER_LEN];
+ struct mbuf *restart;
+ TRlldAdapter_t TRlldAdapter;
+ TRlldStatistics_t statistics;
+ TRlldStatistics_t current;
+ TRlldAdapterConfig_t config;
+ u_short AdapterMode;
+ u_long GroupAddress;
+ u_long FunctionalAddress;
+ struct callout_handle oltr_poll_ch;
+ /*struct callout_handle oltr_stat_ch;*/
+ void *work_memory;
+};
+
+#define SELF_TEST_POLLS 32
+
+void oltr_poll __P((void *));
+/*void oltr_stat __P((void *));*/
+
+static void oltr_start __P((struct ifnet *));
+static void oltr_stop __P((struct oltr_softc *));
+static void oltr_close __P((struct oltr_softc *));
+static void oltr_init __P((void *));
+static int oltr_ioctl __P((struct ifnet *, u_long, caddr_t));
+static void oltr_intr __P((void *));
+static int oltr_ifmedia_upd __P((struct ifnet *));
+static void oltr_ifmedia_sts __P((struct ifnet *, struct ifmediareq *));
+
+#if __FreeBSD_version > 400000
+
+static int oltr_pci_probe __P((device_t));
+static int oltr_pci_attach __P((device_t));
+static int oltr_pci_detach __P((device_t));
+static void oltr_pci_shutdown __P((device_t));
+
+static device_method_t oltr_methods[] = {
+ DEVMETHOD(device_probe, oltr_pci_probe),
+ DEVMETHOD(device_attach, oltr_pci_attach),
+ DEVMETHOD(device_detach, oltr_pci_detach),
+ DEVMETHOD(device_shutdown, oltr_pci_shutdown),
+ { 0, 0 }
+};
+
+static driver_t oltr_driver = {
+ "oltr",
+ oltr_methods,
+ sizeof(struct oltr_softc)
+};
+
+static devclass_t oltr_devclass;
+
+DRIVER_MODULE(oltr, pci, oltr_driver, oltr_devclass, 0, 0);
+
+static int
+oltr_pci_probe(device_t dev)
+{
+ int i, rc;
+ char PCIConfigHeader[64];
+ TRlldAdapterConfig_t config;
+
+ if ((pci_get_vendor(dev) == PCI_VENDOR_OLICOM) &&
+ ((pci_get_device(dev) == 0x0001) ||
+ (pci_get_device(dev) == 0x0004) ||
+ (pci_get_device(dev) == 0x0005) ||
+ (pci_get_device(dev) == 0x0007) ||
+ (pci_get_device(dev) == 0x0008))) {
+
+ for (i = 0; i < sizeof(PCIConfigHeader); i++)
+ PCIConfigHeader[i] = pci_read_config(dev, i, 1);
+
+ rc = TRlldPCIConfig(&LldDriver, &config, PCIConfigHeader);
+ if (rc == TRLLD_PCICONFIG_FAIL) {
+ device_printf(dev, "TRlldPciConfig failed!\n");
+ return(ENXIO);
+ }
+ if (rc == TRLLD_PCICONFIG_VERSION) {
+ device_printf(dev, "wrong LLD version\n");
+ return(ENXIO);
+ }
+ device_set_desc(dev, AdapterName[config.type]);
+ return(0);
+ }
+ return(ENXIO);
+}
+
+static int
+oltr_pci_attach(device_t dev)
+{
+ int i, s, rc = 0, rid,
+ scratch_size;
+ int media = IFM_TOKEN|IFM_TOK_UTP16;
+ u_long command;
+ char PCIConfigHeader[64];
+ struct oltr_softc *sc = device_get_softc(dev);
+ struct ifnet *ifp = &sc->arpcom.ac_if;
+
+ s = splimp();
+
+ bzero(sc, sizeof(struct oltr_softc));
+ sc->unit = device_get_unit(dev);
+ sc->state = OL_UNKNOWN;
+
+ for (i = 0; i < sizeof(PCIConfigHeader); i++)
+ PCIConfigHeader[i] = pci_read_config(dev, i, 1);
+
+ switch(TRlldPCIConfig(&LldDriver, &sc->config, PCIConfigHeader)) {
+ case TRLLD_PCICONFIG_OK:
+ break;
+ case TRLLD_PCICONFIG_SET_COMMAND:
+ device_printf(dev, "enabling bus master mode\n");
+ command = pci_read_config(dev, PCIR_COMMAND, 4);
+ pci_write_config(dev, PCIR_COMMAND,
+ (command | PCIM_CMD_BUSMASTEREN), 4);
+ command = pci_read_config(dev, PCIR_COMMAND, 4);
+ if (!(command & PCIM_CMD_BUSMASTEREN)) {
+ device_printf(dev, "failed to enable bus master mode\n");
+ goto config_failed;
+ }
+ break;
+ case TRLLD_PCICONFIG_FAIL:
+ device_printf(dev, "TRlldPciConfig failed!\n");
+ goto config_failed;
+ break;
+ case TRLLD_PCICONFIG_VERSION:
+ device_printf(dev, "wrong LLD version\n");
+ goto config_failed;
+ break;
+ }
+ device_printf(dev, "MAC address %6D\n", sc->config.macaddress, ":");
+
+ scratch_size = TRlldAdapterSize();
+ if (bootverbose)
+ device_printf(dev, "adapter memory block size %d bytes\n", scratch_size);
+ sc->TRlldAdapter = (TRlldAdapter_t)malloc(scratch_size, M_DEVBUF, M_NOWAIT);
+ if (sc->TRlldAdapter == NULL) {
+ device_printf(dev, "couldn't allocate scratch buffer (%d bytes)\n", scratch_size);
+ goto config_failed;
+ }
+
+ /*
+ * Allocate RX/TX Pools
+ */
+ for (i = 0; i < RING_BUFFER_LEN; i++) {
+ sc->rx_ring[i].index = i;
+ sc->rx_ring[i].data = (char *)malloc(RX_BUFFER_LEN, M_DEVBUF, M_NOWAIT);
+ sc->rx_ring[i].address = vtophys(sc->rx_ring[i].data);
+ sc->tx_ring[i].index = i;
+ sc->tx_ring[i].data = (char *)malloc(TX_BUFFER_LEN, M_DEVBUF, M_NOWAIT);
+ sc->tx_ring[i].address = vtophys(sc->tx_ring[i].data);
+ if ((!sc->rx_ring[i].data) || (!sc->tx_ring[i].data)) {
+ device_printf(dev, "unable to allocate ring buffers\n");
+ while (i > 0) {
+ if (sc->rx_ring[i].data)
+ free(sc->rx_ring[i].data, M_DEVBUF);
+ if (sc->tx_ring[i].data)
+ free(sc->tx_ring[i].data, M_DEVBUF);
+ i--;
+ }
+ goto config_failed;
+ }
+ }
+
+ /*
+ * Allocate interrupt and DMA channel
+ */
+ rid = 0;
+ sc->oltr_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1,
+ (sc->config.mode & TRLLD_MODE_SHARE_INTERRUPT ? RF_ACTIVE | RF_SHAREABLE : RF_ACTIVE));
+ if (sc->oltr_irq == NULL) {
+ device_printf(dev, "couldn't map interrupt\n");
+ goto config_failed;
+ }
+ if (bus_setup_intr(dev, sc->oltr_irq, INTR_TYPE_NET, oltr_intr, sc, &sc->oltr_intrhand)) {
+ device_printf(dev, "couldn't setup interrupt\n");
+ bus_release_resource(dev, SYS_RES_IRQ, 0, sc->oltr_irq);
+ goto config_failed;
+ }
+
+ /*
+ * Do the ifnet initialization
+ */
+ ifp->if_softc = sc;
+ ifp->if_unit = device_get_unit(dev);
+ ifp->if_name = "oltr";
+ ifp->if_output = iso88025_output;
+ ifp->if_init = oltr_init;
+ ifp->if_start = oltr_start;
+ ifp->if_ioctl = oltr_ioctl;
+ ifp->if_flags = IFF_BROADCAST;
+ bcopy(sc->config.macaddress, sc->arpcom.ac_enaddr, sizeof(sc->config.macaddress));
+
+ /*
+ * Do ifmedia setup.
+ */
+ ifmedia_init(&sc->ifmedia, 0, oltr_ifmedia_upd, oltr_ifmedia_sts);
+ rc = TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_16MBPS);
+ switch(sc->config.type) {
+ case TRLLD_ADAPTER_PCI7: /* OC-3540 */
+ ifmedia_add(&sc->ifmedia, IFM_TOKEN|IFM_TOK_UTP100, 0, NULL);
+ /* FALL THROUGH */
+ case TRLLD_ADAPTER_PCI4: /* OC-3139 */
+ case TRLLD_ADAPTER_PCI5: /* OC-3140 */
+ case TRLLD_ADAPTER_PCI6: /* OC-3141 */
+ ifmedia_add(&sc->ifmedia, IFM_TOKEN|IFM_AUTO, 0, NULL);
+ media = IFM_TOKEN|IFM_AUTO;
+ rc = TRlldSetSpeed(sc->TRlldAdapter, 0);
+ /* FALL THROUGH */
+ default:
+ ifmedia_add(&sc->ifmedia, IFM_TOKEN|IFM_TOK_UTP4, 0, NULL);
+ ifmedia_add(&sc->ifmedia, IFM_TOKEN|IFM_TOK_UTP16, 0, NULL);
+ break;
+ }
+ sc->ifmedia.ifm_media = media;
+ ifmedia_set(&sc->ifmedia, media);
+
+ /*
+ * Attach the interface
+ */
+ if_attach(ifp);
+ ifp->if_snd.ifq_maxlen = IFQ_MAXLEN;
+ iso88025_ifattach(ifp);
+
+#if (NBPFILTER > 0) || (__FreeBSD_version > 400000)
+ bpfattach(ifp, DLT_IEEE802, sizeof(struct iso88025_header));
+#endif
+
+ splx(s);
+ return(0);
+
+config_failed:
+
+ splx(s);
+ return(ENXIO);
+}
+
+static int
+oltr_pci_detach(device_t dev)
+{
+ struct oltr_softc *sc = device_get_softc(dev);
+ struct ifnet *ifp = &sc->arpcom.ac_if;
+ int s;
+
+ device_printf(dev, "driver unloading\n");
+
+ s = splimp();
+
+ if_detach(ifp);
+ oltr_stop(sc);
+
+ untimeout(oltr_poll, (void *)sc, sc->oltr_poll_ch);
+ /*untimeout(oltr_stat, (void *)sc, sc->oltr_stat_ch);*/
+
+ bus_teardown_intr(dev, sc->oltr_irq, sc->oltr_intrhand);
+ bus_release_resource(dev, SYS_RES_IRQ, 0, sc->oltr_irq);
+
+ (void)splx(s);
+
+ return(0);
+}
+
+static void
+oltr_pci_shutdown(device_t dev)
+{
+ struct oltr_softc *sc = device_get_softc(dev);
+
+ device_printf(dev, "oltr_pci_shutdown called\n");
+
+ oltr_stop(sc);
+
+ return;
+}
+
+#else
+
+static const char *oltr_pci_probe __P((pcici_t, pcidi_t));
+static void oltr_pci_attach __P((pcici_t, int));
+
+static unsigned long oltr_count = 0;
+
+static struct pci_device oltr_device = {
+ "oltr",
+ oltr_pci_probe,
+ oltr_pci_attach,
+ &oltr_count,
+ NULL
+};
+
+DATA_SET(pcidevice_set, oltr_device);
+
+static const char *
+oltr_pci_probe(pcici_t config_id, pcidi_t device_id)
+{
+ int i, rc;
+ char PCIConfigHeader[64];
+ TRlldAdapterConfig_t config;
+
+ if (((device_id & 0xffff) == PCI_VENDOR_OLICOM) && (
+ (((device_id >> 16) & 0xffff) == 0x0001) ||
+ (((device_id >> 16) & 0xffff) == 0x0004) ||
+ (((device_id >> 16) & 0xffff) == 0x0005) ||
+ (((device_id >> 16) & 0xffff) == 0x0007) ||
+ (((device_id >> 16) & 0xffff) == 0x0008))) {
+
+ for (i = 0; i < 64; i++)
+ PCIConfigHeader[i] = pci_cfgread(config_id, i, /* bytes */ 1);
+
+ rc = TRlldPCIConfig(&LldDriver, &config, PCIConfigHeader);
+
+ if (rc == TRLLD_PCICONFIG_FAIL) {
+ printf("oltr: TRlldPciConfig failed!\n");
+ return(NULL);
+ }
+ if (rc == TRLLD_PCICONFIG_VERSION) {
+ printf("oltr: wrong LLD version.\n");
+ return(NULL);
+ }
+ return(AdapterName[config.type]);
+ }
+
+ return(NULL);
+}
+
+static void
+oltr_pci_attach(pcici_t config_id, int unit)
+{
+ int i, s, rc = 0, scratch_size;
+ int media = IFM_TOKEN|IFM_TOK_UTP16;
+ u_long command;
+ char PCIConfigHeader[64];
+ struct oltr_softc *sc;
+ struct ifnet *ifp; /* = &sc->arpcom.ac_if; */
+
+ s = splimp();
+
+ sc = malloc(sizeof(struct oltr_softc), M_DEVBUF, M_NOWAIT | M_ZERO);
+ if (sc == NULL) {
+ printf("oltr%d: no memory for softc struct!\n", unit);
+ goto config_failed;
+ }
+ sc->unit = unit;
+ sc->state = OL_UNKNOWN;
+ ifp = &sc->arpcom.ac_if;
+
+ for (i = 0; i < sizeof(PCIConfigHeader); i++)
+ PCIConfigHeader[i] = pci_cfgread(config_id, i, 1);
+
+ switch(TRlldPCIConfig(&LldDriver, &sc->config, PCIConfigHeader)) {
+ case TRLLD_PCICONFIG_OK:
+ break;
+ case TRLLD_PCICONFIG_SET_COMMAND:
+ printf("oltr%d: enabling bus master mode\n", unit);
+ command = pci_conf_read(config_id, PCIR_COMMAND);
+ pci_conf_write(config_id, PCIR_COMMAND, (command | PCIM_CMD_BUSMASTEREN));
+ command = pci_conf_read(config_id, PCIR_COMMAND);
+ if (!(command & PCIM_CMD_BUSMASTEREN)) {
+ printf("oltr%d: failed to enable bus master mode\n", unit);
+ goto config_failed;
+ }
+ break;
+ case TRLLD_PCICONFIG_FAIL:
+ printf("oltr%d: TRlldPciConfig failed!\n", unit);
+ goto config_failed;
+ break;
+ case TRLLD_PCICONFIG_VERSION:
+ printf("oltr%d: wrong LLD version\n", unit);
+ goto config_failed;
+ break;
+ }
+ printf("oltr%d: MAC address %6D\n", unit, sc->config.macaddress, ":");
+
+ scratch_size = TRlldAdapterSize();
+ if (bootverbose)
+ printf("oltr%d: adapter memory block size %d bytes\n", unit, scratch_size);
+ sc->TRlldAdapter = (TRlldAdapter_t)malloc(scratch_size, M_DEVBUF, M_NOWAIT);
+ if (sc->TRlldAdapter == NULL) {
+ printf("oltr%d: couldn't allocate scratch buffer (%d bytes)\n",unit, scratch_size);
+ goto config_failed;
+ }
+
+ /*
+ * Allocate RX/TX Pools
+ */
+ for (i = 0; i < RING_BUFFER_LEN; i++) {
+ sc->rx_ring[i].index = i;
+ sc->rx_ring[i].data = (char *)malloc(RX_BUFFER_LEN, M_DEVBUF, M_NOWAIT);
+ sc->rx_ring[i].address = vtophys(sc->rx_ring[i].data);
+ sc->tx_ring[i].index = i;
+ sc->tx_ring[i].data = (char *)malloc(TX_BUFFER_LEN, M_DEVBUF, M_NOWAIT);
+ sc->tx_ring[i].address = vtophys(sc->tx_ring[i].data);
+ if ((!sc->rx_ring[i].data) || (!sc->tx_ring[i].data)) {
+ printf("oltr%d: unable to allocate ring buffers\n", unit);
+ while (i > 0) {
+ if (sc->rx_ring[i].data)
+ free(sc->rx_ring[i].data, M_DEVBUF);
+ if (sc->tx_ring[i].data)
+ free(sc->tx_ring[i].data, M_DEVBUF);
+ i--;
+ }
+ goto config_failed;
+ }
+ }
+
+ /*
+ * Allocate interrupt and DMA channel
+ */
+ if (!pci_map_int(config_id, oltr_intr, sc, &net_imask)) {
+ printf("oltr%d: couldn't setup interrupt\n", unit);
+ goto config_failed;
+ }
+
+ /*
+ * Do the ifnet initialization
+ */
+ ifp->if_softc = sc;
+ ifp->if_unit = unit;
+ ifp->if_name = "oltr";
+ ifp->if_output = iso88025_output;
+ ifp->if_init = oltr_init;
+ ifp->if_start = oltr_start;
+ ifp->if_ioctl = oltr_ioctl;
+ ifp->if_flags = IFF_BROADCAST;
+ bcopy(sc->config.macaddress, sc->arpcom.ac_enaddr, sizeof(sc->config.macaddress));
+
+ /*
+ * Do ifmedia setup.
+ */
+ ifmedia_init(&sc->ifmedia, 0, oltr_ifmedia_upd, oltr_ifmedia_sts);
+ rc = TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_16MBPS);
+ switch(sc->config.type) {
+ case TRLLD_ADAPTER_PCI7: /* OC-3540 */
+ ifmedia_add(&sc->ifmedia, IFM_TOKEN|IFM_TOK_UTP100, 0, NULL);
+ /* FALL THROUGH */
+ case TRLLD_ADAPTER_PCI4: /* OC-3139 */
+ case TRLLD_ADAPTER_PCI5: /* OC-3140 */
+ case TRLLD_ADAPTER_PCI6: /* OC-3141 */
+ ifmedia_add(&sc->ifmedia, IFM_TOKEN|IFM_AUTO, 0, NULL);
+ media = IFM_TOKEN|IFM_AUTO;
+ rc = TRlldSetSpeed(sc->TRlldAdapter, 0);
+ /* FALL THROUGH */
+ default:
+ ifmedia_add(&sc->ifmedia, IFM_TOKEN|IFM_TOK_UTP4, 0, NULL);
+ ifmedia_add(&sc->ifmedia, IFM_TOKEN|IFM_TOK_UTP16, 0, NULL);
+ break;
+ }
+ sc->ifmedia.ifm_media = media;
+ ifmedia_set(&sc->ifmedia, media);
+
+ /*
+ * Attach the interface
+ */
+ if_attach(ifp);
+ ifp->if_snd.ifq_maxlen = IFQ_MAXLEN;
+ iso88025_ifattach(ifp);
+
+#if (NBPFILTER > 0) || (__FreeBSD_version > 400000)
+ bpfattach(ifp, DLT_IEEE802, sizeof(struct iso88025_header));
+#endif
+
+ splx(s);
+ return;
+
+config_failed:
+ (void)splx(s);
+
+ return;
+}
+
+#endif
+
+static void
+oltr_intr(void *xsc)
+{
+ struct oltr_softc *sc = (struct oltr_softc *)xsc;
+
+ if (DEBUG_MASK & DEBUG_INT)
+ printf("I");
+
+ TRlldInterruptService(sc->TRlldAdapter);
+
+ return;
+}
+
+static void
+oltr_start(struct ifnet *ifp)
+{
+ struct oltr_softc *sc = ifp->if_softc;
+ struct mbuf *m0, *m;
+ int copy_len, buffer, frame, fragment, rc, s;
+
+ /*
+ * Check to see if output is already active
+ */
+ if (ifp->if_flags & IFF_OACTIVE)
+ return;
+
+outloop:
+
+ /*
+ * Make sure we have buffers to transmit with
+ */
+ if (sc->tx_avail <= 0) {
+ printf("oltr%d: tx queue full\n", sc->unit);
+ ifp->if_flags |= IFF_OACTIVE;
+ return;
+ }
+
+ if (sc->restart == NULL) {
+ IF_DEQUEUE(&ifp->if_snd, m);
+ if (m == NULL)
+ return;
+ } else {
+ m = sc->restart;
+ sc->restart = NULL;
+ }
+
+ m0 = m;
+ frame = RING_BUFFER(sc->tx_frame);
+ buffer = RING_BUFFER(sc->tx_head);
+ fragment = 0;
+ copy_len = 0;
+ sc->frame_ring[frame].FragmentCount = 0;
+
+ while (copy_len < m0->m_pkthdr.len) {
+ sc->frame_ring[frame].FragmentCount++;
+ if (sc->frame_ring[frame].FragmentCount > sc->tx_avail)
+ goto nobuffers;
+ sc->frame_ring[frame].TransmitFragment[fragment].VirtualAddress = sc->tx_ring[buffer].data;
+ sc->frame_ring[frame].TransmitFragment[fragment].PhysicalAddress = sc->tx_ring[buffer].address;
+ sc->frame_ring[frame].TransmitFragment[fragment].count = MIN(m0->m_pkthdr.len - copy_len, TX_BUFFER_LEN);
+ m_copydata(m0, copy_len, MIN(m0->m_pkthdr.len - copy_len, TX_BUFFER_LEN), sc->tx_ring[buffer].data);
+ copy_len += MIN(m0->m_pkthdr.len - copy_len, TX_BUFFER_LEN);
+ fragment++;
+ buffer = RING_BUFFER((buffer + 1));
+ }
+
+ s = splimp();
+ rc = TRlldTransmitFrame(sc->TRlldAdapter, &sc->frame_ring[frame], (void *)&sc->frame_ring[frame]);
+ (void)splx(s);
+
+ if (rc != TRLLD_TRANSMIT_OK) {
+ printf("oltr%d: TRlldTransmitFrame returned %d\n", sc->unit, rc);
+ ifp->if_oerrors++;
+ goto bad;
+ }
+
+ sc->tx_avail -= sc->frame_ring[frame].FragmentCount;
+ sc->tx_head = RING_BUFFER((sc->tx_head + sc->frame_ring[frame].FragmentCount));
+ sc->tx_frame++;
+
+#if (NBPFILTER > 0) || (__FreeBSD_version > 400000)
+ if (ifp->if_bpf)
+ bpf_mtap(ifp, m0);
+#endif
+ /*ifp->if_opackets++;*/
+
+bad:
+ m_freem(m0);
+
+ goto outloop;
+
+nobuffers:
+
+ printf("oltr%d: queue full\n", sc->unit);
+ ifp->if_flags |= IFF_OACTIVE;
+ ifp->if_oerrors++;
+ /*m_freem(m0);*/
+ sc->restart = m0;
+
+ return;
+}
+
+static void
+oltr_close(struct oltr_softc *sc)
+{
+ /*printf("oltr%d: oltr_close\n", sc->unit);*/
+
+ oltr_stop(sc);
+
+ tsleep(sc, PWAIT, "oltrclose", 30*hz);
+}
+
+static void
+oltr_stop(struct oltr_softc *sc)
+{
+ struct ifnet *ifp = &sc->arpcom.ac_if;
+
+ /*printf("oltr%d: oltr_stop\n", sc->unit);*/
+
+ ifp->if_flags &= ~(IFF_UP | IFF_RUNNING | IFF_OACTIVE);
+ TRlldClose(sc->TRlldAdapter, 0);
+ sc->state = OL_CLOSING;
+}
+
+static void
+oltr_init(void * xsc)
+{
+ struct oltr_softc *sc = (struct oltr_softc *)xsc;
+ struct ifnet *ifp = &sc->arpcom.ac_if;
+ struct ifmedia *ifm = &sc->ifmedia;
+ int poll = 0, i, rc = 0, s;
+ int work_size;
+
+ /*
+ * Check adapter state, don't allow multiple inits
+ */
+ if (sc->state > OL_CLOSED) {
+ printf("oltr%d: adapter not ready\n", sc->unit);
+ return;
+ }
+
+ s = splimp();
+
+ /*
+ * Initialize Adapter
+ */
+ if ((rc = TRlldAdapterInit(&LldDriver, sc->TRlldAdapter, vtophys(sc->TRlldAdapter),
+ (void *)sc, &sc->config)) != TRLLD_INIT_OK) {
+ switch(rc) {
+ case TRLLD_INIT_NOT_FOUND:
+ printf("oltr%d: adapter not found\n", sc->unit);
+ break;
+ case TRLLD_INIT_UNSUPPORTED:
+ printf("oltr%d: adapter not supported by low level driver\n", sc->unit);
+ break;
+ case TRLLD_INIT_PHYS16:
+ printf("oltr%d: adapter memory block above 16M cannot DMA\n", sc->unit);
+ break;
+ case TRLLD_INIT_VERSION:
+ printf("oltr%d: low level driver version mismatch\n", sc->unit);
+ break;
+ default:
+ printf("oltr%d: unknown init error %d\n", sc->unit, rc);
+ break;
+ }
+ goto init_failed;
+ }
+ sc->state = OL_INIT;
+
+ switch(sc->config.type) {
+ case TRLLD_ADAPTER_PCI4: /* OC-3139 */
+ work_size = 32 * 1024;
+ break;
+ case TRLLD_ADAPTER_PCI7: /* OC-3540 */
+ work_size = 256;
+ break;
+ default:
+ work_size = 0;
+ }
+
+ if (work_size) {
+ if ((sc->work_memory = malloc(work_size, M_DEVBUF, M_NOWAIT)) == NULL) {
+ printf("oltr%d: failed to allocate work memory (%d octets).\n", sc->unit, work_size);
+ } else {
+ TRlldAddMemory(sc->TRlldAdapter, sc->work_memory,
+ vtophys(sc->work_memory), work_size);
+ }
+ }
+
+ switch(IFM_SUBTYPE(ifm->ifm_media)) {
+ case IFM_AUTO:
+ rc = TRlldSetSpeed(sc->TRlldAdapter, 0); /* TRLLD_SPEED_AUTO */
+ break;
+ case IFM_TOK_UTP4:
+ rc = TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_4MBPS);
+ break;
+ case IFM_TOK_UTP16:
+ rc = TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_16MBPS);
+ break;
+ case IFM_TOK_UTP100:
+ rc = TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_100MBPS);
+ break;
+ }
+
+ /*
+ * Download adapter micro-code
+ */
+ if (bootverbose)
+ printf("oltr%d: Downloading adapter microcode: ", sc->unit);
+
+ switch(sc->config.mactype) {
+ case TRLLD_MAC_TMS:
+ rc = TRlldDownload(sc->TRlldAdapter, TRlldMacCode);
+ if (bootverbose)
+ printf("TMS-380");
+ break;
+ case TRLLD_MAC_HAWKEYE:
+ rc = TRlldDownload(sc->TRlldAdapter, TRlldHawkeyeMac);
+ if (bootverbose)
+ printf("Hawkeye");
+ break;
+ case TRLLD_MAC_BULLSEYE:
+ rc = TRlldDownload(sc->TRlldAdapter, TRlldBullseyeMac);
+ if (bootverbose)
+ printf("Bullseye");
+ break;
+ default:
+ if (bootverbose)
+ printf("unknown - failed!\n");
+ goto init_failed;
+ break;
+ }
+
+ /*
+ * Check download status
+ */
+ switch(rc) {
+ case TRLLD_DOWNLOAD_OK:
+ if (bootverbose)
+ printf(" - ok\n");
+ break;
+ case TRLLD_DOWNLOAD_ERROR:
+ if (bootverbose)
+ printf(" - failed\n");
+ else
+ printf("oltr%d: adapter microcode download failed\n", sc->unit);
+ goto init_failed;
+ break;
+ case TRLLD_STATE:
+ if (bootverbose)
+ printf(" - not ready\n");
+ goto init_failed;
+ break;
+ }
+
+ /*
+ * Wait for self-test to complete
+ */
+ i = 0;
+ while ((poll++ < SELF_TEST_POLLS) && (sc->state < OL_READY)) {
+ if (DEBUG_MASK & DEBUG_INIT)
+ printf("p");
+ DELAY(TRlldPoll(sc->TRlldAdapter) * 1000);
+ if (TRlldInterruptService(sc->TRlldAdapter) != 0)
+ if (DEBUG_MASK & DEBUG_INIT) printf("i");
+ }
+
+ if (sc->state != OL_CLOSED) {
+ printf("oltr%d: self-test failed\n", sc->unit);
+ goto init_failed;
+ }
+
+ /*
+ * Set up adapter poll
+ */
+ callout_handle_init(&sc->oltr_poll_ch);
+ sc->oltr_poll_ch = timeout(oltr_poll, (void *)sc, 1);
+
+ sc->state = OL_OPENING;
+
+ /*
+ * Open the adapter
+ */
+ rc = TRlldOpen(sc->TRlldAdapter, sc->arpcom.ac_enaddr, sc->GroupAddress,
+ sc->FunctionalAddress, 1552, sc->AdapterMode);
+ switch(rc) {
+ case TRLLD_OPEN_OK:
+ break;
+ case TRLLD_OPEN_STATE:
+ printf("oltr%d: adapter not ready for open\n", sc->unit);
+ (void)splx(s);
+ return;
+ case TRLLD_OPEN_ADDRESS_ERROR:
+ printf("oltr%d: illegal MAC address\n", sc->unit);
+ (void)splx(s);
+ return;
+ case TRLLD_OPEN_MODE_ERROR:
+ printf("oltr%d: illegal open mode\n", sc->unit);
+ (void)splx(s);
+ return;
+ default:
+ printf("oltr%d: unknown open error (%d)\n", sc->unit, rc);
+ (void)splx(s);
+ return;
+ }
+
+ /*
+ * Set promiscious mode for now...
+ */
+ TRlldSetPromiscuousMode(sc->TRlldAdapter, TRLLD_PROM_LLC);
+ ifp->if_flags |= IFF_PROMISC;
+
+ /*
+ * Block on the ring insert and set a timeout
+ */
+ tsleep(sc, PWAIT, "oltropen", 30*hz);
+
+ /*
+ * Set up receive buffer ring
+ */
+ for (i = 0; i < RING_BUFFER_LEN; i++) {
+ rc = TRlldReceiveFragment(sc->TRlldAdapter, (void *)sc->rx_ring[i].data,
+ sc->rx_ring[i].address, RX_BUFFER_LEN, (void *)sc->rx_ring[i].index);
+ if (rc != TRLLD_RECEIVE_OK) {
+ printf("oltr%d: adapter refused receive fragment %d (rc = %d)\n", sc->unit, i, rc);
+ break;
+ }
+ }
+
+ sc->tx_avail = RING_BUFFER_LEN;
+ sc->tx_head = 0;
+ sc->tx_frame = 0;
+
+ sc->restart = NULL;
+
+ ifp->if_flags |= IFF_RUNNING;
+ ifp->if_flags &= ~IFF_OACTIVE;
+
+ /*
+ * Set up adapter statistics poll
+ */
+ /*callout_handle_init(&sc->oltr_stat_ch);*/
+ /*sc->oltr_stat_ch = timeout(oltr_stat, (void *)sc, 1*hz);*/
+
+ (void)splx(s);
+ return;
+
+init_failed:
+ sc->state = OL_DEAD;
+ (void)splx(s);
+ return;
+}
+
+static int
+oltr_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
+{
+ struct oltr_softc *sc = ifp->if_softc;
+ struct ifreq *ifr = (struct ifreq *)data;
+ int error = 0, s;
+
+ s = splimp();
+
+ switch(command) {
+ case SIOCSIFADDR:
+ case SIOCGIFADDR:
+ case SIOCSIFMTU:
+ error = iso88025_ioctl(ifp, command, data);
+ break;
+
+ case SIOCSIFFLAGS:
+ if (ifp->if_flags & IFF_UP) {
+ oltr_init(sc);
+ } else {
+ if (ifp->if_flags & IFF_RUNNING) {
+ oltr_close(sc);
+ }
+ }
+ break;
+ case SIOCGIFMEDIA:
+ case SIOCSIFMEDIA:
+ error = ifmedia_ioctl(ifp, ifr, &sc->ifmedia, command);
+ break;
+ default:
+ error = EINVAL;
+ break;
+ }
+
+ (void)splx(s);
+
+ return(error);
+}
+
+
+void
+oltr_poll(void *arg)
+{
+ struct oltr_softc *sc = (struct oltr_softc *)arg;
+ int s;
+
+ s = splimp();
+
+ if (DEBUG_MASK & DEBUG_POLL) printf("P");
+
+ /* Set up next adapter poll */
+ sc->oltr_poll_ch = timeout(oltr_poll, (void *)sc, (TRlldPoll(sc->TRlldAdapter) * hz / 1000));
+
+ (void)splx(s);
+}
+
+#ifdef NOTYET
+void
+oltr_stat(void *arg)
+{
+ struct oltr_softc *sc = (struct oltr_softc *)arg;
+ int s;
+
+ s = splimp();
+
+ /* Set up next adapter poll */
+ sc->oltr_stat_ch = timeout(oltr_stat, (void *)sc, 1*hz);
+ if (TRlldGetStatistics(sc->TRlldAdapter, &sc->current, 0) != 0) {
+ /*printf("oltr%d: statistics available immediately...\n", sc->unit);*/
+ DriverStatistics((void *)sc, &sc->current);
+ }
+
+ (void)splx(s);
+}
+#endif
+static int
+oltr_ifmedia_upd(struct ifnet *ifp)
+{
+ struct oltr_softc *sc = ifp->if_softc;
+ struct ifmedia *ifm = &sc->ifmedia;
+ int rc;
+
+ if (IFM_TYPE(ifm->ifm_media) != IFM_TOKEN)
+ return(EINVAL);
+
+ switch(IFM_SUBTYPE(ifm->ifm_media)) {
+ case IFM_AUTO:
+ rc = TRlldSetSpeed(sc->TRlldAdapter, 0); /* TRLLD_SPEED_AUTO */
+ break;
+ case IFM_TOK_UTP4:
+ rc = TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_4MBPS);
+ break;
+ case IFM_TOK_UTP16:
+ rc = TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_16MBPS);
+ break;
+ case IFM_TOK_UTP100:
+ rc = TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_100MBPS);
+ break;
+ default:
+ return(EINVAL);
+ break;
+ }
+
+ return(0);
+
+}
+
+static void
+oltr_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
+{
+ struct oltr_softc *sc = ifp->if_softc;
+ struct ifmedia *ifm = &sc->ifmedia;
+
+ /*printf("oltr%d: oltr_ifmedia_sts\n", sc->unit);*/
+
+ ifmr->ifm_active = IFM_TYPE(ifm->ifm_media)|IFM_SUBTYPE(ifm->ifm_media);
+
+}
+
+/*
+ * ---------------------- PMW Callback Functions -----------------------
+ */
+
+void
+DriverStatistics(void *DriverHandle, TRlldStatistics_t *statistics)
+{
+#ifdef NOTYET
+ struct oltr_softc *sc = (struct oltr_softc *)DriverHandle;
+
+ if (sc->statistics.LineErrors != statistics->LineErrors)
+ printf("oltr%d: Line Errors %lu\n", sc->unit,
+ statistics->LineErrors);
+ if (sc->statistics.InternalErrors != statistics->InternalErrors)
+ printf("oltr%d: Internal Errors %lu\n", sc->unit,
+ statistics->InternalErrors);
+ if (sc->statistics.BurstErrors != statistics->BurstErrors)
+ printf("oltr%d: Burst Errors %lu\n", sc->unit,
+ statistics->BurstErrors);
+ if (sc->statistics.AbortDelimiters != statistics->AbortDelimiters)
+ printf("oltr%d: Abort Delimiters %lu\n", sc->unit,
+ statistics->AbortDelimiters);
+ if (sc->statistics.ARIFCIErrors != statistics->ARIFCIErrors)
+ printf("oltr%d: ARIFCI Errors %lu\n", sc->unit,
+ statistics->ARIFCIErrors);
+ if (sc->statistics.LostFrames != statistics->LostFrames)
+ printf("oltr%d: Lost Frames %lu\n", sc->unit,
+ statistics->LostFrames);
+ if (sc->statistics.CongestionErrors != statistics->CongestionErrors)
+ printf("oltr%d: Congestion Errors %lu\n", sc->unit,
+ statistics->CongestionErrors);
+ if (sc->statistics.FrequencyErrors != statistics->FrequencyErrors)
+ printf("oltr%d: Frequency Errors %lu\n", sc->unit,
+ statistics->FrequencyErrors);
+ if (sc->statistics.TokenErrors != statistics->TokenErrors)
+ printf("oltr%d: Token Errors %lu\n", sc->unit,
+ statistics->TokenErrors);
+ if (sc->statistics.DMABusErrors != statistics->DMABusErrors)
+ printf("oltr%d: DMA Bus Errors %lu\n", sc->unit,
+ statistics->DMABusErrors);
+ if (sc->statistics.DMAParityErrors != statistics->DMAParityErrors)
+ printf("oltr%d: DMA Parity Errors %lu\n", sc->unit,
+ statistics->DMAParityErrors);
+ if (sc->statistics.ReceiveLongFrame != statistics->ReceiveLongFrame)
+ printf("oltr%d: Long frames received %lu\n", sc->unit,
+ statistics->ReceiveLongFrame);
+ if (sc->statistics.ReceiveCRCErrors != statistics->ReceiveCRCErrors)
+ printf("oltr%d: Receive CRC Errors %lu\n", sc->unit,
+ statistics->ReceiveCRCErrors);
+ if (sc->statistics.ReceiveOverflow != statistics->ReceiveOverflow)
+ printf("oltr%d: Recieve overflows %lu\n", sc->unit,
+ statistics->ReceiveOverflow);
+ if (sc->statistics.TransmitUnderrun != statistics->TransmitUnderrun)
+ printf("oltr%d: Frequency Errors %lu\n", sc->unit,
+ statistics->TransmitUnderrun);
+ bcopy(statistics, &sc->statistics, sizeof(TRlldStatistics_t));
+#endif
+}
+
+static void
+DriverSuspend(unsigned short MicroSeconds)
+{
+ DELAY(MicroSeconds);
+}
+
+
+static void
+DriverStatus(void *DriverHandle, TRlldStatus_t *Status)
+{
+ struct oltr_softc *sc = (struct oltr_softc *)DriverHandle;
+ struct ifnet *ifp = &sc->arpcom.ac_if;
+
+ char *Protocol[] = { /* 0 */ "Unknown",
+ /* 1 */ "TKP",
+ /* 2 */ "TXI" };
+ char *Timeout[] = { /* 0 */ "command",
+ /* 1 */ "transmit",
+ /* 2 */ "interrupt" };
+
+ switch (Status->Type) {
+
+ case TRLLD_STS_ON_WIRE:
+ printf("oltr%d: ring insert (%d Mbps - %s)\n", sc->unit,
+ Status->Specification.OnWireInformation.Speed,
+ Protocol[Status->Specification.OnWireInformation.AccessProtocol]);
+ sc->state = OL_OPEN;
+ wakeup(sc);
+ break;
+ case TRLLD_STS_SELFTEST_STATUS:
+ if (Status->Specification.SelftestStatus == TRLLD_ST_OK) {
+ sc->state = OL_CLOSED;
+ if (bootverbose)
+ printf("oltr%d: self test complete\n", sc->unit);
+ }
+ if (Status->Specification.SelftestStatus & TRLLD_ST_ERROR) {
+ printf("oltr%d: Adapter self test error %d", sc->unit,
+ Status->Specification.SelftestStatus & ~TRLLD_ST_ERROR);
+ sc->state = OL_DEAD;
+ }
+ if (Status->Specification.SelftestStatus & TRLLD_ST_TIMEOUT) {
+ printf("oltr%d: Adapter self test timed out.\n", sc->unit);
+ sc->state = OL_DEAD;
+ }
+ break;
+ case TRLLD_STS_INIT_STATUS:
+ if (Status->Specification.InitStatus == 0x800) {
+ oltr_stop(sc);
+ ifmedia_set(&sc->ifmedia, IFM_TOKEN|IFM_TOK_UTP16);
+ TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_16MBPS);
+ oltr_init(sc);
+ break;
+ }
+ printf("oltr%d: adapter init failure 0x%03x\n", sc->unit,
+ Status->Specification.InitStatus);
+ oltr_stop(sc);
+ break;
+ case TRLLD_STS_RING_STATUS:
+ if (Status->Specification.RingStatus) {
+ printf("oltr%d: Ring status change: ", sc->unit);
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_SIGNAL_LOSS)
+ printf(" [Signal Loss]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_HARD_ERROR)
+ printf(" [Hard Error]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_SOFT_ERROR)
+ printf(" [Soft Error]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_TRANSMIT_BEACON)
+ printf(" [Beacon]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_LOBE_WIRE_FAULT)
+ printf(" [Wire Fault]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_AUTO_REMOVAL_ERROR)
+ printf(" [Auto Removal]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_REMOVE_RECEIVED)
+ printf(" [Remove Received]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_COUNTER_OVERFLOW)
+ printf(" [Counter Overflow]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_SINGLE_STATION)
+ printf(" [Single Station]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_RING_RECOVERY)
+ printf(" [Ring Recovery]");
+ printf("\n");
+ }
+ break;
+ case TRLLD_STS_ADAPTER_CHECK:
+ printf("oltr%d: adapter check (%04x %04x %04x %04x)\n", sc->unit,
+ Status->Specification.AdapterCheck[0],
+ Status->Specification.AdapterCheck[1],
+ Status->Specification.AdapterCheck[2],
+ Status->Specification.AdapterCheck[3]);
+ sc->state = OL_DEAD;
+ oltr_stop(sc);
+ break;
+ case TRLLD_STS_PROMISCUOUS_STOPPED:
+ printf("oltr%d: promiscuous mode ", sc->unit);
+ if (Status->Specification.PromRemovedCause == 1)
+ printf("remove received.");
+ if (Status->Specification.PromRemovedCause == 2)
+ printf("poll failure.");
+ if (Status->Specification.PromRemovedCause == 2)
+ printf("buffer size failure.");
+ printf("\n");
+ ifp->if_flags &= ~IFF_PROMISC;
+ break;
+ case TRLLD_STS_LLD_ERROR:
+ printf("oltr%d: low level driver internal error ", sc->unit);
+ printf("(%04x %04x %04x %04x).\n",
+ Status->Specification.InternalError[0],
+ Status->Specification.InternalError[1],
+ Status->Specification.InternalError[2],
+ Status->Specification.InternalError[3]);
+ sc->state = OL_DEAD;
+ oltr_stop(sc);
+ break;
+ case TRLLD_STS_ADAPTER_TIMEOUT:
+ printf("oltr%d: adapter %s timeout.\n", sc->unit,
+ Timeout[Status->Specification.AdapterTimeout]);
+ break;
+ default:
+ printf("oltr%d: driver status Type = %d\n", sc->unit, Status->Type);
+ break;
+
+ }
+ if (Status->Closed) {
+ sc->state = OL_CLOSING;
+ oltr_stop(sc);
+ }
+
+}
+
+static void
+DriverCloseCompleted(void *DriverHandle)
+{
+ struct oltr_softc *sc = (struct oltr_softc *)DriverHandle;
+
+ printf("oltr%d: adapter closed\n", sc->unit);
+ wakeup(sc);
+ sc->state = OL_CLOSED;
+}
+
+static void
+DriverTransmitFrameCompleted(void *DriverHandle, void *FrameHandle, int TransmitStatus)
+{
+ struct oltr_softc *sc = (struct oltr_softc *)DriverHandle;
+ struct ifnet *ifp = &sc->arpcom.ac_if;
+ TRlldTransmit_t *frame = (TRlldTransmit_t *)FrameHandle;
+
+ /*printf("oltr%d: DriverTransmitFrameCompleted\n", sc->unit);*/
+
+ if (TransmitStatus != TRLLD_TRANSMIT_OK) {
+ ifp->if_oerrors++;
+ printf("oltr%d: transmit error %d\n", sc->unit, TransmitStatus);
+ } else {
+ ifp->if_opackets++;
+ }
+
+ sc->tx_avail += frame->FragmentCount;
+
+ if (ifp->if_flags & IFF_OACTIVE) {
+ printf("oltr%d: queue restart\n", sc->unit);
+ ifp->if_flags &= ~IFF_OACTIVE;
+ oltr_start(ifp);
+ }
+
+
+}
+
+static void
+DriverReceiveFrameCompleted(void *DriverHandle, int ByteCount, int FragmentCount, void *FragmentHandle, int ReceiveStatus)
+{
+ struct oltr_softc *sc = (struct oltr_softc *)DriverHandle;
+ struct ifnet *ifp = (struct ifnet *)&sc->arpcom.ac_if;
+ struct mbuf *m0, *m1, *m;
+ struct iso88025_header *th;
+ int frame_len = ByteCount, hdr_len, i = (int)FragmentHandle, rc, s;
+ int mbuf_offset, mbuf_size, frag_offset, copy_length;
+ char *fragment = sc->rx_ring[RING_BUFFER(i)].data;
+
+ if (sc->state > OL_CLOSED) {
+ if (ReceiveStatus == TRLLD_RCV_OK) {
+ MGETHDR(m0, M_DONTWAIT, MT_DATA);
+ mbuf_size = MHLEN - 2;
+ if (!m0) {
+ ifp->if_ierrors++;
+ goto dropped;
+ }
+ if (ByteCount + 2 > MHLEN) {
+ MCLGET(m0, M_DONTWAIT);
+ mbuf_size = MCLBYTES - 2;
+ if (!(m0->m_flags & M_EXT)) {
+ m_freem(m0);
+ ifp->if_ierrors++;
+ goto dropped;
+ }
+ }
+ m0->m_pkthdr.rcvif = ifp;
+ m0->m_pkthdr.len = ByteCount;
+ m0->m_len = 0;
+ m0->m_data += 2;
+ th = mtod(m0, struct iso88025_header *);
+ m0->m_pkthdr.header = (void *)th;
+
+ m = m0;
+ mbuf_offset = 0;
+ frag_offset = 0;
+ while (frame_len) {
+ copy_length = MIN3(frame_len,
+ (RX_BUFFER_LEN - frag_offset),
+ (mbuf_size - mbuf_offset));
+ bcopy(fragment + frag_offset, mtod(m, char *) +
+ mbuf_offset, copy_length);
+ m->m_len += copy_length;
+ mbuf_offset += copy_length;
+ frag_offset += copy_length;
+ frame_len -= copy_length;
+
+ if (frag_offset == RX_BUFFER_LEN) {
+ fragment =
+ sc->rx_ring[RING_BUFFER(++i)].data;
+ frag_offset = 0;
+ }
+ if ((mbuf_offset == mbuf_size) && (frame_len > 0)) {
+ MGET(m1, M_DONTWAIT, MT_DATA);
+ mbuf_size = MHLEN;
+ if (!m1) {
+ ifp->if_ierrors++;
+ m_freem(m0);
+ goto dropped;
+ }
+ if (frame_len > MHLEN) {
+ MCLGET(m1, M_DONTWAIT);
+ mbuf_size = MCLBYTES;
+ if (!(m1->m_flags & M_EXT)) {
+ m_freem(m0);
+ m_freem(m1);
+ ifp->if_ierrors++;
+ goto dropped;
+ }
+ }
+ m->m_next = m1;
+ m = m1;
+ mbuf_offset = 0;
+ m->m_len = 0;
+ }
+ }
+#if (NBPFILTER > 0) || (__FreeBSD_version > 400000)
+ if (ifp->if_bpf)
+ bpf_mtap(ifp, m0);
+#endif
+
+ /*if (ifp->if_flags & IFF_PROMISC) {*/
+ if (bcmp(th->iso88025_dhost, etherbroadcastaddr
+ , sizeof(th->iso88025_dhost))) {
+ if ((bcmp(th->iso88025_dhost + 1, sc->arpcom.ac_enaddr + 1, ISO88025_ADDR_LEN - 1)) ||
+ ((th->iso88025_dhost[0] & 0x7f) != sc->arpcom.ac_enaddr[0])) {
+ m_freem(m0);
+ goto dropped;
+ }
+ }
+ /*}*/
+ ifp->if_ipackets++;
+
+ hdr_len = ISO88025_HDR_LEN;
+ if (th->iso88025_shost[0] & 0x80)
+ hdr_len += (ntohs(th->rcf) & 0x1f00) >> 8;
+
+ m0->m_pkthdr.len -= hdr_len;
+ m0->m_len -= hdr_len;
+ m0->m_data += hdr_len;
+
+ iso88025_input(ifp, th, m0);
+
+ } else { /* Receiver error */
+ if (ReceiveStatus != TRLLD_RCV_NO_DATA) {
+ printf("oltr%d: receive error %d\n", sc->unit,
+ ReceiveStatus);
+ ifp->if_ierrors++;
+ }
+ }
+
+dropped:
+ s = splimp();
+ i = (int)FragmentHandle;
+ while (FragmentCount--) {
+ rc = TRlldReceiveFragment(sc->TRlldAdapter,
+ (void *)sc->rx_ring[RING_BUFFER(i)].data,
+ sc->rx_ring[RING_BUFFER(i)].address,
+ RX_BUFFER_LEN, (void *)sc->rx_ring[RING_BUFFER(i)].index);
+ if (rc != TRLLD_RECEIVE_OK) {
+ printf("oltr%d: adapter refused receive fragment %d (rc = %d)\n", sc->unit, i, rc);
+ break;
+ }
+ i++;
+ }
+ (void)splx(s);
+ }
+}
+
+
+/*
+ * ---------------------------- PMW Glue -------------------------------
+ */
+
+#ifndef TRlldInlineIO
+
+static void
+DriverOutByte(unsigned short IOAddress, unsigned char value)
+{
+ outb(IOAddress, value);
+}
+
+static void
+DriverOutWord(unsigned short IOAddress, unsigned short value)
+{
+ outw(IOAddress, value);
+}
+
+static void
+DriverOutDword(unsigned short IOAddress, unsigned long value)
+{
+ outl(IOAddress, value);
+}
+
+static void
+DriverRepOutByte(unsigned short IOAddress, unsigned char *DataPointer, int ByteCount)
+{
+ outsb(IOAddress, (void *)DataPointer, ByteCount);
+}
+
+static void
+DriverRepOutWord(unsigned short IOAddress, unsigned short *DataPointer, int WordCount)
+{
+ outsw(IOAddress, (void *)DataPointer, WordCount);
+}
+
+static void
+DriverRepOutDword(unsigned short IOAddress, unsigned long *DataPointer, int DWordCount)
+{
+ outsl(IOAddress, (void *)DataPointer, DWordCount);
+}
+
+static unsigned char
+DriverInByte(unsigned short IOAddress)
+{
+ return(inb(IOAddress));
+}
+
+static unsigned short
+DriverInWord(unsigned short IOAddress)
+{
+ return(inw(IOAddress));
+}
+
+static unsigned long
+DriverInDword(unsigned short IOAddress)
+{
+ return(inl(IOAddress));
+}
+
+static void
+DriverRepInByte(unsigned short IOAddress, unsigned char *DataPointer, int ByteCount)
+{
+ insb(IOAddress, (void *)DataPointer, ByteCount);
+}
+
+static void
+DriverRepInWord(unsigned short IOAddress, unsigned short *DataPointer, int WordCount)
+{
+ insw(IOAddress, (void *)DataPointer, WordCount);
+}
+static void
+DriverRepInDword( unsigned short IOAddress, unsigned long *DataPointer, int DWordCount)
+{
+ insl(IOAddress, (void *)DataPointer, DWordCount);
+}
+#endif /* TRlldInlineIO */
diff --git a/sys/contrib/dev/oltr/trlld.h b/sys/contrib/dev/oltr/trlld.h
new file mode 100644
index 0000000..988cf35
--- /dev/null
+++ b/sys/contrib/dev/oltr/trlld.h
@@ -0,0 +1,902 @@
+/*
+ ****************************** trlld.h ***********************************
+ *
+ * Copyright (c) 1997
+ * OLICOM A/S
+ * Denmark
+ *
+ * All Rights Reserved
+ *
+ * This source file is subject to the terms and conditions of the
+ * OLICOM Software License Agreement which restricts the manner
+ * in which it may be used.
+ *
+ *---------------------------------------------------------------------------
+ *
+ * Description: PowerMACH Works header file
+ * $FreeBSD$
+ *
+ *---------------------------------------------------------------------------
+ * $Log: J:/usr/project/trlld/libsrc/include/trlld.h_v $
+ *
+ * Rev 1.9 25 Jan 1999 09:56:28 EGS
+ * Added 3150
+ *
+ * Rev 1.8 10 Dec 1998 12:24:52 JHM
+ * version 1.2.0,prominfo structure with shorts.
+ *
+ * Rev 1.7 25 Nov 1998 16:18:48 JHM
+ * Bullseye mac, 100MBPS, mactype in config structure,
+ * 3540 adapter, TRlldTransmitFree, TRlldReceiveFree,
+ * TRlldAdapterName
+ *
+ * Rev 1.6 23 Oct 1998 16:00:36 JHM
+ * hawkeye adapter types
+ *
+ * Rev 1.5 11 Aug 1998 12:22:06 JHM
+ * split hawkeye types into PCI4,5,6
+ *
+ * Rev 1.4 10 Jul 1998 14:39:22 JHM
+ * OC_3140,OC_3250
+ *
+ * Rev 1.3 18 Jun 1998 11:32:20 JHM
+ * AddMemory,OC_3250
+ *
+ * Rev 1.2 18 Apr 1998 15:11:20 JHM
+ *
+ * Rev 1.1 09 Dec 1997 18:17:52 JHM
+ * rel111: TRlldDataPtr_t
+ *
+ * Rev 1.0 24 Nov 1997 11:08:58 JHM
+ * Initial revision.
+
+ Rev 1.5 18 Jun 1997 11:31:36 JHM
+ Checks for version
+
+ Rev 1.4 13 Jun 1997 13:47:34 JHM
+
+ Rev 1.3 13 Jun 1997 13:27:56 JHM
+ DTR support, version change
+
+ Rev 1.2 12 Jun 1997 11:43:20 JHM
+ TRLLD_INTERRUPT_TIMEOUT defined
+
+ Rev 1.1 11 Apr 1997 15:24:18 JHM
+ replaced tabs with spaces
+
+ Rev 1.0 11 Apr 1997 14:43:04 JHM
+ Initial revision.
+ *
+ ****************************************************************************
+*/
+
+#ifndef TRLLD_H
+#define TRLLD_H
+
+/* Data buffer pointers are always 32 bits.
+ For 16:16 it is segment:offset while it for 32:32 is a linear address. */
+
+#ifdef TRlldSmall
+#define TRlldDataPtr_t unsigned char far *
+#define TRlldWordDataPtr_t unsigned short far *
+#define TRlldDWordDataPtr_t unsigned long far *
+#else
+#define TRlldDataPtr_t unsigned char *
+#define TRlldWordDataPtr_t unsigned short *
+#define TRlldDWordDataPtr_t unsigned long *
+#endif
+
+#ifdef __WATCOMC__
+#define CDECL _cdecl
+#else
+#define CDECL
+#endif
+
+/*****************************************************************************/
+/* */
+/* Firmware */
+/* */
+/*****************************************************************************/
+
+extern unsigned char TRlldMacCode[]; /* 3115,17,18,29,33,36,37 */
+extern unsigned char TRlldHawkeyeMac[]; /* 3139,3140,3141,3250 */
+extern unsigned char TRlldBullseyeMac[]; /* 3150,3540 */
+
+/*****************************************************************************/
+/* */
+/* Maximal numbers of concurrent receive and transmit slots */
+/* */
+/*****************************************************************************/
+
+#define TRLLD_MAX_RECEIVE 32
+#define TRLLD_MAX_TRANSMIT 32
+
+/*****************************************************************************/
+/* */
+/* Maximal frame sizes */
+/* */
+/*****************************************************************************/
+
+#define TRLLD_MAXFRAME_100MBPS 18000
+#define TRLLD_MAXFRAME_16MBPS 18000
+#define TRLLD_MAXFRAME_4MBPS 4500
+
+/*****************************************************************************/
+/* */
+/* TRlldStatus contains the adapter status used in a DriverStatus call-back. */
+/* */
+/*****************************************************************************/
+
+struct OnWireInformation {
+ unsigned short RingStatus;
+ unsigned short Speed;
+ unsigned short AccessProtocol;
+ unsigned short Reserved;
+};
+
+typedef struct TRlldStatus {
+ unsigned short Type;
+ unsigned char Closed;
+ unsigned char AccessProtocol;
+ unsigned short MaxFrameSize;
+ unsigned short Reserved;
+ union {
+ unsigned short OnWireRingStatus; /* for compability */
+ unsigned short SelftestStatus;
+ unsigned short InitStatus;
+ unsigned short RingStatus;
+ unsigned short AdapterCheck[4];
+ unsigned short InternalError[4];
+ unsigned short PromRemovedCause;
+ unsigned short AdapterTimeout;
+ struct OnWireInformation OnWireInformation;
+ } Specification;
+} TRlldStatus_t;
+
+/* values of TRlldStatus.Type */
+
+#define TRLLD_STS_ON_WIRE 0
+#define TRLLD_STS_SELFTEST_STATUS 1
+#define TRLLD_STS_INIT_STATUS 2
+#define TRLLD_STS_RING_STATUS 3
+#define TRLLD_STS_ADAPTER_CHECK 4
+#define TRLLD_STS_PROMISCUOUS_STOPPED 5
+#define TRLLD_STS_LLD_ERROR 6
+#define TRLLD_STS_ADAPTER_TIMEOUT 7
+
+/* values of TRlldStatus.Closed */
+
+#define TRLLD_STS_STATUS_OK 0
+#define TRLLD_STS_STATUS_CLOSED 1
+
+/* values of TRlldStatus.AccessProtocol */
+
+#define TRLLD_ACCESS_UNKNOWN 0
+#define TRLLD_ACCESS_TKP 1
+#define TRLLD_ACCESS_TXI 2
+
+/* values of TRlldStatus.SelftestStatus */
+
+#define TRLLD_ST_OK 0
+#define TRLLD_ST_ERROR 0x0100 /* actual errors are 010x, where x is */
+ /* 0: Initial Test Error */
+ /* 1: Adapter Software Checksum Error */
+ /* 2: Adapter RAM Error */
+ /* 4: Instruction Test Error */
+ /* 5: Protocol Handler/RI Hw Error */
+ /* 6: System Interface Register Error */
+
+#define TRLLD_ST_TIMEOUT 0x0200 /* The adapter did not complete */
+ /* selftest after download */
+
+/* values of TRlldStatus.Specification.InitStatus */
+
+/* the most likely cause of an init error (whatever the code) is a wrong */
+/* physical or virtual address of the adapter block in TRlldAdapterInit */
+
+#define TRLLD_INIT_ERROR 0x100 /* actual errors are 010x, where x is */
+ /* 1: Invalid init block (LLD error) */
+ /* 2: Invalid options (LLD error) */
+ /* 3: Invalid rcv burst (LLD error) */
+ /* 4: Invalid xmt burst (LLD error) */
+ /* 5: Invalid DMA threshold (LLDerror)*/
+ /* 6: Invalid scb addr */
+ /* 7: Invalid ssb addr */
+ /* 8: DIO parity error (HW error) */
+ /* 9: DMA timeout (May be interrupt
+ failing if PIO mode or PCI2) */
+ /* A: DMA parity error (HW error) */
+ /* B: DMA bus error (HW error) */
+ /* C: DMA data error */
+ /* D: Adapter check */
+
+#define TRLLD_INIT_TIMEOUT 0x200 /* adapter init did not complete */
+#define TRLLD_INIT_DMA_ERROR 0x300 /* adapter cannot access sys memory */
+#define TRLLD_INIT_INTR_ERROR 0x400 /* adapter cannot interrupt */
+#define TRLLD_OPEN_TIMEOUT 0x500 /* adapter open did not complete */
+ /* within 30 seconds */
+
+#define TRLLD_OPEN_ERROR 0x600 /* actual errors are 06xx, where the */
+ /* bits in x mean: */
+ /* 01: Invalid open options (LLDerror)*/
+ /* 04: TxBuffer count error (LLDerror)*/
+ /* 10: Buffer size error (LLD error) */
+ /* 20: List size error (LLD error) */
+ /* 40: Node address error */
+
+#define TRLLD_OPEN_REPEAT 0x700 /* actual errors are 07xy, where */
+ /* x is the open phase: */
+ /* 1: Lobe media test */
+ /* 2: Physical Insertion */
+ /* 3: Address verification */
+ /* 4: Participation in ring poll */
+ /* 5: Request Initialization */
+ /* 9: Request registration (TXI) */
+ /* A: Lobe Media Test (TXI) */
+ /* B: Address verification (TXI) */
+ /* y is the type of error: */
+ /* 1: Function failure (No Cable ?) */
+ /* 2: Signal loss */
+ /* 5: Timeout */
+ /* 6: Ring failure (TKP) */
+ /* 6: Protocol error (TXI) */
+ /* 7: Ring beaconing */
+ /* 8: Duplicate Node Address (TKP) */
+ /* 8: Insert Denied (TXI) */
+ /* 9: Request Initialization (TKP) */
+ /* 9: Heart beat failure (TXI) */
+ /* A: Remove received */
+ /* B: C-port address changed (TXI) */
+ /* C: Wire Fault (TKP) */
+ /* D: Auto Speed, 1. on ring (TKP) */
+ /* E: Speed sense failed */
+
+/* When opening with FORCE_TXI and only classic token ring attachment is */
+/* possible, the error is Request Registration/Timeout or 0x795 */
+
+#define TRLLD_OPEN_1ST_ON_RING 0x800 /* Speed sense is active, but no other*/
+ /* station is present to set the speed*/
+
+
+/* values of TRlldStatus.Specification.RingStatus */
+
+#define TRLLD_RS_SIGNAL_LOSS 0x8000
+#define TRLLD_RS_HARD_ERROR 0x4000
+#define TRLLD_RS_SOFT_ERROR 0x2000
+#define TRLLD_RS_TRANSMIT_BEACON 0x1000
+#define TRLLD_RS_LOBE_WIRE_FAULT 0x0800
+#define TRLLD_RS_AUTO_REMOVAL_ERROR 0x0400
+#define TRLLD_RS_REMOVE_RECEIVED 0x0100
+#define TRLLD_RS_COUNTER_OVERFLOW 0x0080
+#define TRLLD_RS_SINGLE_STATION 0x0040
+#define TRLLD_RS_RING_RECOVERY 0x0020
+
+/* values of TRlldStatus.Specification.AdapterCheck */
+/* MISSING */
+
+/* values of TRlldStatus.Specification.PromRemovedCause */
+
+#define TRLLD_PROM_REMOVE_RECEIVED 1
+#define TRLLD_PROM_POLL_FAILURE 2
+#define TRLLD_PROM_BUFFER_SIZE 3
+
+/* values of TRlldStatus.Specification.InternalError */
+
+#define TRLLD_INTERNAL_PIO 1 /* A PIO transfer to or from adapter */
+ /* did not complete */
+#define TRLLD_INTERNAL_TX 2 /* Trouble with clean up of tx frames */
+#define TRLLD_INTERNAL_RX 3 /* Trouble with clean up of receive */
+ /* fragments */
+#define TRLLD_INTERNAL_CMD 4 /* error response from adapter */
+#define TRLLD_INTERNAL_STATE 5 /* event happened in unexpected state */
+
+/* values of TRlldStatus.Specification.AdapterTimeout */
+
+#define TRLLD_COMMAND_TIMEOUT 1
+#define TRLLD_TRANSMIT_TIMEOUT 2
+#define TRLLD_INTERRUPT_TIMEOUT 3
+
+
+/*****************************************************************************/
+/* */
+/* TRlldStatistics contains the adapter statistics returned to Driver */
+/* in TRlldStatistics calls and DriverStatistics call-backs */
+/* */
+/*****************************************************************************/
+
+typedef struct TRlldStatistics {
+ unsigned long LineErrors;
+ unsigned long InternalErrors; /* Not maintained by TMS based boards */
+ unsigned long BurstErrors;
+ unsigned long ARIFCIErrors;
+ unsigned long AbortDelimiters; /* Not maintained by TMS based boards */
+ unsigned long LostFrames;
+ unsigned long CongestionErrors;
+ unsigned long FrameCopiedErrors;
+ unsigned long FrequencyErrors; /* Not maintained by TMS based boards */
+ unsigned long TokenErrors;
+ unsigned long DMABusErrors; /* Not maintained by 3139 */
+ unsigned long DMAParityErrors; /* Not maintained by 3139 */
+ unsigned long ReceiveLongFrame; /* Not maintained by TMS based boards */
+ unsigned long ReceiveCRCErrors; /* Not maintained by TMS based boards */
+ unsigned long ReceiveOverflow; /* Not maintained by TMS based boards */
+ unsigned long TransmitUnderrun; /* Not maintained by TMS based boards */
+ unsigned long UnderrunLock; /* Not maintained by TMS based boards */
+ unsigned long OverflowReset;
+ unsigned char UpstreamNeighbour[6];
+ unsigned short RingNumber;
+ unsigned char BeaconingUpstreamNeighbour[6];
+ unsigned short padding;
+} TRlldStatistics_t;
+
+
+/*****************************************************************************/
+/* */
+/* TRlldDriver contains the Driver call-backs */
+/* */
+/*****************************************************************************/
+
+typedef struct TRlldDriver {
+ unsigned long TRlldVersion;
+#ifndef TRlldInlineIO
+ void (CDECL * DriverOutByte)(unsigned short IOAddress,
+ unsigned char Value);
+ void (CDECL * DriverOutWord)(unsigned short IOAddress,
+ unsigned short Value);
+ void (CDECL * DriverOutDWord)(unsigned short IOAddress,
+ unsigned long Value);
+ void (CDECL * DriverRepOutByte)(unsigned short IOAddress,
+ TRlldDataPtr_t DataPointer,
+ int ByteCount);
+ void (CDECL * DriverRepOutWord)(unsigned short IOAddress,
+ TRlldWordDataPtr_t DataPointer,
+ int WordCount);
+ void (CDECL * DriverRepOutDWord)(unsigned short IOAddress,
+ TRlldDWordDataPtr_t DataPointer,
+ int DWordCount);
+ unsigned char (CDECL * DriverInByte)(unsigned short IOAddress);
+ unsigned short (CDECL * DriverInWord)(unsigned short IOAddress);
+ unsigned long (CDECL * DriverInDWord)(unsigned short IOAddress);
+ void (CDECL * DriverRepInByte)(unsigned short IOAddress,
+ TRlldDataPtr_t DataPointer,
+ int ByteCount);
+ void (CDECL * DriverRepInWord)(unsigned short IOAddress,
+ TRlldWordDataPtr_t DataPointer,
+ int WordCount);
+ void (CDECL * DriverRepInDWord)(unsigned short IOAddress,
+ TRlldDWordDataPtr_t DataPointer,
+ int DWordCount);
+#endif
+ void (CDECL * DriverSuspend)(unsigned short MicroSeconds);
+ void (CDECL * DriverStatus)(void * DriverHandle,
+ TRlldStatus_t * Status);
+ void (CDECL * DriverCloseCmpltd)(void * DriverHandle);
+ void (CDECL * DriverStatistics)(void * DriverHandle,
+ TRlldStatistics_t * Statistics);
+ void (CDECL * DriverTxFrameCmpltd)(void * DriverHandle,
+ void * FrameHandle,
+ int TxStatus);
+ void (CDECL * DriverRcvFrameCmpltd)(void * DriverHandle,
+ int ByteCount,
+ int FragmentCount,
+ void * FragmentHandle,
+ int RcvStatus);
+} TRlldDriver_t;
+
+/* Version and model control */
+
+#define TRLLD_VERSION_INLINEIO 0x8000
+#define TRLLD_VERSION_SMALL 0x4000
+#ifdef TRlldInlineIO
+#ifdef TRlldSmall
+#define TRLLD_VERSION 0x4120
+#else
+#define TRLLD_VERSION 0x0120
+#endif
+#else
+#ifdef TRlldSmall
+#define TRLLD_VERSION 0xC120
+#else
+#define TRLLD_VERSION 0x8120
+#endif
+#endif
+
+
+/*****************************************************************************/
+/* */
+/* TRlldAdapterConfig contains the properties found for an adapter */
+/* used when finding and defining adapters to use */
+/* */
+/*****************************************************************************/
+
+
+struct pnp_id {
+ unsigned short vendor;
+ unsigned short device;
+};
+
+struct pci_id {
+ unsigned short vendor;
+ unsigned short device;
+ unsigned char revision;
+ unsigned char reserved_byte;
+ unsigned short reserved_word;
+};
+
+struct pcmcia_id {
+ /* unknown as yet */
+ unsigned char x;
+};
+
+struct pci_slot {
+ unsigned short bus_no;
+ unsigned short device_no;
+};
+
+struct pcmcia_socket {
+ /* unknown as yet */
+ unsigned char x;
+};
+
+typedef struct TRlldAdapterConfig {
+ unsigned char type;
+ unsigned char bus;
+ unsigned short magic;
+ union {
+ struct pnp_id pnp;
+ unsigned long eisa;
+ unsigned short mca;
+ struct pci_id pci;
+ struct pcmcia_id pcmcia;
+ } id;
+ union {
+ unsigned short csn;
+ unsigned short eisa;
+ unsigned short mca;
+ struct pci_slot pci;
+ struct pcmcia_socket pcmcia;
+ } slot;
+ unsigned short iobase0;
+ unsigned short iolength0;
+ unsigned short iobase1;
+ unsigned short iolength1;
+ unsigned long memorybase;
+ unsigned short memorylength;
+ unsigned char mode;
+ unsigned char xmode;
+ unsigned char interruptlevel;
+ unsigned char dmalevel;
+ unsigned char macaddress[6];
+ unsigned long prombase;
+ unsigned char speed;
+ unsigned char cachelinesize;
+ unsigned short pcicommand;
+ unsigned char mactype;
+ unsigned char reserved[3];
+} TRlldAdapterConfig_t;
+
+/* values of TRlldAdapterConfig.Type */
+
+#define TRLLD_ADAPTER_XT 0 /* not supported */
+#define TRLLD_ADAPTER_ISA1 1 /* OC-3115 */
+#define TRLLD_ADAPTER_ISA2 2 /* OC-3117 */
+#define TRLLD_ADAPTER_ISA3 3 /* OC-3118 */
+#define TRLLD_ADAPTER_MCA1 4 /* OC-3129 id A84 */
+#define TRLLD_ADAPTER_MCA2 5 /* OC-3129 id A85 */
+#define TRLLD_ADAPTER_MCA3 6 /* OC-3129 id A86 */
+#define TRLLD_ADAPTER_EISA1 7 /* OC-3133 id 0109833D */
+#define TRLLD_ADAPTER_EISA2 8 /* OC-3133 id 0209833D */
+#define TRLLD_ADAPTER_EISA3 9 /* OC-3135 not supported */
+#define TRLLD_ADAPTER_PCI1 10 /* OC-3136 id 108d0001 rev 1 */
+#define TRLLD_ADAPTER_PCI2 11 /* OC-3136 id 108d0001 rev 2 */
+#define TRLLD_ADAPTER_PCI3 12 /* OC-3137 id 108d0001 rev 3 */
+#define TRLLD_ADAPTER_PCI4 13 /* OC-3139 id 108d0004 rev 2 */
+#define TRLLD_ADAPTER_PCI5 14 /* OC-3140 id 108d0004 rev 3 */
+#define TRLLD_ADAPTER_PCI6 15 /* OC-3141 id 108d0007 rev 1 */
+#define TRLLD_ADAPTER_PCI7 19 /* OC-3540 id 108d0008 rev 1 */
+#define TRLLD_ADAPTER_PCI8 20 /* OC-3150 id 108d000a rev 1 */
+#ifdef PCMCIA
+#define TRLLD_ADAPTER_PCCARD1 16 /* OC-3220 */
+#define TRLLD_ADAPTER_PCCARD2 17 /* OC-3221,OC-3230,OC-3232 */
+#endif
+#define TRLLD_ADAPTER_PCCARD3 18 /* OC-3250 id 108d0005 rev 1 */
+
+/* values of TRlldAdapterConfig.Bus */
+
+#define TRLLD_BUS_ISA 1
+#define TRLLD_BUS_EISA 2
+#define TRLLD_BUS_MCA 3
+#define TRLLD_BUS_PCI 4
+#define TRLLD_BUS_PCMCIA 5
+
+/* values of TRlldAdapterConfig.mode */
+
+#define TRLLD_MODE_16M 0x01 /* needs data buffers below 16 M */
+#define TRLLD_MODE_PHYSICAL 0x02 /* needs valid physical addresses */
+#define TRLLD_MODE_FIXED_CFG 0x04 /* cannot be reconfigured */
+#define TRLLD_MODE_SHORT_SLOT 0x08 /* in short ISA slot, cannot use DMA */
+#define TRLLD_MODE_CANNOT_DISABLE 0x10 /* can not disable interrupt */
+#define TRLLD_MODE_SHARE_INTERRUPT 0x20 /* may share interrupt */
+#define TRLLD_MODE_MEMORY 0x40 /* is configured with a memory window*/
+
+/* values of TRlldAdapterConfig.dma */
+
+#define TRLLD_DMA_PIO 4 /* other values signifies the DMA channel */
+#define TRLLD_DMA_MASTER 0xff /* to use */
+
+/* values of TRlldAdapterConfig.mactype */
+
+ /* download with: */
+#define TRLLD_MAC_TMS 1 /* TRlldMACCode */
+#define TRLLD_MAC_HAWKEYE 2 /* TRlldHawkeyeMAC */
+#define TRLLD_MAC_BULLSEYE 3 /* TRlldBullseyeMAC */
+
+
+typedef void * TRlldAdapter_t;
+typedef void * TRlldAdapterType_t;
+
+#ifndef MAX_FRAGMENTS
+#define MAX_FRAGMENTS 32
+#endif
+
+typedef struct TRlldTransmit {
+ unsigned short FragmentCount;
+ unsigned short TRlldTransmitReserved;
+ struct TRlldTransmitFragment {
+ unsigned long PhysicalAddress;
+ TRlldDataPtr_t VirtualAddress;
+ unsigned short count;
+ unsigned short TRlldTransmitFragmentReserved;
+ } TransmitFragment[MAX_FRAGMENTS];
+} TRlldTransmit_t;
+
+int CDECL TRlldAdapterSize(void);
+
+int CDECL TRlldInit(int TypeCount,
+ TRlldAdapterType_t * AdapterTypeTable);
+
+extern TRlldAdapterType_t CDECL TRlld3115; /* ISA adapters */
+extern TRlldAdapterType_t CDECL TRlld3117;
+extern TRlldAdapterType_t CDECL TRlld3118;
+extern TRlldAdapterType_t CDECL TRlld3129; /* MCA adapters */
+extern TRlldAdapterType_t CDECL TRlld3133; /* EISA adapters */
+extern TRlldAdapterType_t CDECL TRlld3136; /* PCI adapters */
+extern TRlldAdapterType_t CDECL TRlld3137;
+extern TRlldAdapterType_t CDECL TRlld3139; /* Hawkeye adapters */
+extern TRlldAdapterType_t CDECL TRlld3540; /* Bullseye adapters */
+
+#define T3115 &TRlld3115
+#define T3117 &TRlld3117
+#define T3118 &TRlld3118
+#define T3129 &TRlld3129
+#define T3133 &TRlld3133
+#define T3136 &TRlld3136
+#define T3137 &TRlld3137
+#define T3139 &TRlld3139
+#define T3540 &TRlld3540
+
+/* Only for Boot Prom Page Zero code */
+
+extern TRlldAdapterType_t CDECL TRlld3115Boot; /* ISA adapters */
+extern TRlldAdapterType_t CDECL TRlld3117Boot;
+extern TRlldAdapterType_t CDECL TRlld3118Boot;
+extern TRlldAdapterType_t CDECL TRlld3129Boot; /* MCA adapters */
+extern TRlldAdapterType_t CDECL TRlld3133Boot; /* EISA adapters */
+extern TRlldAdapterType_t CDECL TRlld3136Boot; /* PCI adapters */
+extern TRlldAdapterType_t CDECL TRlld3137Boot;
+extern TRlldAdapterType_t CDECL TRlld3139Boot; /* Hawkeye adapters */
+extern TRlldAdapterType_t CDECL TRlld3150Boot;
+extern TRlldAdapterType_t CDECL TRlld3250Boot;
+extern TRlldAdapterType_t CDECL TRlld3540Boot; /* Bullseye adapter */
+
+#define B3115 &TRlld3115Boot
+#define B3117 &TRlld3117Boot
+#define B3118 &TRlld3118Boot
+#define B3129 &TRlld3129Boot
+#define B3133 &TRlld3133Boot
+#define B3136 &TRlld3136Boot
+#define B3137 &TRlld3137Boot
+#define B3139 &TRlld3139Boot
+#define B3150 &TRlld3150Boot
+#define B3250 &TRlld3250Boot
+#define B3540 &TRlld3540Boot
+
+#define TRLLD_INIT_OK 0
+#define TRLLD_INIT_UNKNOWN 5
+
+int CDECL TRlldAdapterInit(TRlldDriver_t * DriverDefinition,
+ TRlldAdapter_t * TRlldAdapter,
+ unsigned long TRlldAdapterPhysical,
+ void * DriverHandle,
+ TRlldAdapterConfig_t * config);
+
+#define TRLLD_INIT_OK 0
+#define TRLLD_INIT_NOT_FOUND 1
+#define TRLLD_INIT_UNSUPPORTED 2
+#define TRLLD_INIT_PHYS16 3
+#define TRLLD_INIT_VERSION 4
+
+int CDECL TRlldSetSpeed(TRlldAdapter_t * adapter,
+ unsigned char speed);
+
+#define TRLLD_SPEED_4MBPS 4
+#define TRLLD_SPEED_16MBPS 16
+#define TRLLD_SPEED_100MBPS 100
+
+int CDECL TRlldSetInterrupt(TRlldAdapter_t * adapter,
+ unsigned char interruptlevel);
+
+int CDECL TRlldSetDMA(TRlldAdapter_t * adapter,
+ unsigned char dma, unsigned char * mode);
+
+#define TRLLD_CONFIG_OK 0
+#define TRLLD_CONFIG_STATE 1
+#define TRLLD_CONFIG_ILLEGAL 2
+#define TRLLD_CONFIG_FAILED 3
+
+int CDECL TRlldSetSpecial(TRlldAdapter_t * adapter,
+ unsigned short param1, unsigned short param2,
+ unsigned short param3, unsigned short param4);
+
+int CDECL TRlldAddMemory(TRlldAdapter_t * adapter,
+ TRlldDataPtr_t virtual,
+ unsigned long physical,
+ long size);
+
+int CDECL TRlldDisable(TRlldAdapter_t * adapter);
+
+#define TRLLD_OK 0
+#define TRLLD_NOT_SUPPORTED 1
+
+void CDECL TRlldEnable(TRlldAdapter_t * adapter);
+
+int CDECL TRlldInterruptPresent(TRlldAdapter_t * adapter);
+
+#define TRLLD_NO_INTERRUPT 0
+#define TRLLD_INTERRUPT 1
+
+int CDECL TRlldInterruptService(TRlldAdapter_t * adapter);
+
+int CDECL TRlldInterruptPreService(TRlldAdapter_t * adapter);
+
+void CDECL TRlldInterruptPostService(TRlldAdapter_t * adapter);
+
+
+int CDECL TRlldPoll(TRlldAdapter_t * adapter);
+
+int CDECL TRlldDownload(TRlldAdapter_t * adapter,
+ char * DownLoadCode);
+
+#define TRLLD_DOWNLOAD_OK 0
+#define TRLLD_DOWNLOAD_ERROR 1
+#define TRLLD_STATE 2
+
+typedef int (CDECL * GetCode_t)(void * handle, unsigned char * maccodebyte);
+
+int CDECL TRlldStreamDownload(TRlldAdapter_t * adapter,
+ GetCode_t procedure, void * handle);
+
+int CDECL TRlldOpen(TRlldAdapter_t * adapter,
+ unsigned char * MACAddress,
+ unsigned long GroupAddress,
+ unsigned long FunctionalAddress,
+ unsigned short MaxFrameSize,
+ unsigned short OpenModes);
+
+#define TRLLD_OPEN_OK 0
+#define TRLLD_OPEN_STATE 1
+#define TRLLD_OPEN_ADDRESS_ERROR 2
+#define TRLLD_OPEN_MODE_ERROR 3
+#define TRLLD_OPEN_MEMORY 4
+
+#define TRLLD_MODE_TX_STATUS 0x01
+#define TRLLD_MODE_RX_SINGLE 0x02
+#define TRLLD_MODE_FORCE_TKP 0x04
+#define TRLLD_MODE_FORCE_TXI 0x08
+#define TRLLD_MODE_TX_CRC 0x10
+
+void CDECL TRlldClose(TRlldAdapter_t * adapter, int immediate);
+
+void CDECL TRlldSetGroupAddress(TRlldAdapter_t * adapter,
+ unsigned long GroupAddress);
+
+void CDECL TRlldSetFunctionalAddress(TRlldAdapter_t * adapter,
+ unsigned long FunctionalAddress);
+
+void CDECL TRlldSetPromiscuousMode(TRlldAdapter_t * adapter,
+ unsigned char mode);
+
+/* mode bits */
+
+#define TRLLD_PROM_LLC 1
+#define TRLLD_PROM_MAC 2
+#define TRLLD_PROM_ERRORFRAMES 4
+
+int CDECL TRlldGetStatistics(TRlldAdapter_t * adapter,
+ TRlldStatistics_t * statistics,
+ int immediate);
+
+#define TRLLD_IMMEDIATE_STATISTICS 1
+
+#define TRLLD_STATISTICS_RETRIEVED 0
+#define TRLLD_STATISTICS_PENDING 1
+
+int CDECL TRlldTransmitFrame(TRlldAdapter_t * adapter,
+ TRlldTransmit_t * TransmitFrame,
+ void * FrameHandle);
+
+#define TRLLD_TRANSMIT_OK 0
+#define TRLLD_TRANSMIT_NOT_OPEN 1
+#define TRLLD_TRANSMIT_TOO_MANY 2
+#define TRLLD_TRANSMIT_MAX16 3
+#define TRLLD_TRANSMIT_SIZE 4
+#define TRLLD_TRANSMIT_EMPTY 5
+
+/* completion flags */
+
+#define TRLLD_TX_OK 0
+#define TRLLD_TX_NOT_PROCESSED 1
+#define TRLLD_TX_NOT_RECOGNIZED 2
+#define TRLLD_TX_NOT_COPIED 3
+
+/* number of free transmit fragments */
+
+int CDECL TRlldTransmitFree(TRlldAdapter_t * adapter);
+
+int CDECL TRlldReceiveFragment(TRlldAdapter_t * adapter,
+ TRlldDataPtr_t FragmentStart,
+ unsigned long FragmentPhysical,
+ int count,
+ void * FragmentHandle);
+
+#define TRLLD_RECEIVE_OK 0
+#define TRLLD_RECEIVE_NOT_OPEN 1
+#define TRLLD_RECEIVE_TOO_MANY 2
+#define TRLLD_RECEIVE_SIZE 3
+#define TRLLD_RECEIVE_MAX16 4
+
+/* completion flags */
+
+#define TRLLD_RCV_OK 0
+#define TRLLD_RCV_NO_DATA 1
+#define TRLLD_RCV_ERROR 2 /* Only when TRLLD_PROM_ERRORFRAMES */
+#define TRLLD_RCV_LONG 3
+
+/* number of free receive fragments */
+
+int CDECL TRlldReceiveFree(TRlldAdapter_t * adapter);
+
+int CDECL TRlldFind(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config_table,
+ unsigned long type_mask,
+ int max);
+
+/* type mask bits */
+
+#define OC_3115 0x0001
+#define OC_3117 0x0002
+#define OC_3118 0x0004
+#define OC_3129 0x0008
+#define OC_3133 0x0010
+#define OC_3136 0x0040
+#define OC_3137 0x0080
+#define OC_3139 0x0100
+#define OC_3140 0x0200
+#define OC_3141 0x0400
+#define OC_3540 0x0800
+#define OC_3150 0x1000
+
+#ifdef PCMCIA
+#define OC_3220 0x0800
+#define OC_3221 0x1000
+#define OC_3230 0x2000
+#define OC_3232 0x4000
+#endif
+
+#define OC_3250 0x8000
+
+int CDECL TRlldIOAddressConfig(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config,
+ unsigned short address);
+
+
+#define TRLLD_FIND_OK 1
+#define TRLLD_FIND_ERROR 0
+#define TRLLD_FIND_VERSION -1
+
+int CDECL TRlldEISASlotConfig(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config,
+ int slot);
+
+int CDECL TRlldMCASlotConfig(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config,
+ int slot);
+
+int CDECL TRlldPCIConfig(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config,
+ char * PCIConfigurationSpace);
+
+#define TRLLD_PCICONFIG_OK 0
+#define TRLLD_PCICONFIG_FAIL 1
+#define TRLLD_PCICONFIG_SET_COMMAND 2
+#define TRLLD_PCICONFIG_VERSION 3
+
+
+int CDECL TRlldFindPCI(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config_table,
+ unsigned long type_mask,
+ int max);
+
+#ifdef PCMCIA
+typedef void * PCCardHandle_t;
+
+typedef int (CDECL * GetTupleData_t)(PCCardHandle_t handle,
+ unsigned short TupleIdent,
+ char * TupleData,
+ int length);
+
+int CDECL TRlldPCCardConfig(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config,
+ unsigned short address,
+ int irq,
+ GetTupleData_t GetTuple,
+ PCCardHandle_t handle);
+
+#define TRLLD_PCCARD_CONFIG_OK 0
+#define TRLLD_PCCARD_CONFIG_FAIL 1
+#endif
+
+/* Boot Prom Support */
+
+typedef struct TRlldPromInfo {
+ unsigned short PromIdent;
+ short PromPages;
+ short PromPageSize;
+} TRlldPromInfo_t;
+
+int CDECL TRlldMapBootProm(TRlldAdapter_t * adapter,
+ TRlldDataPtr_t prompointer);
+
+#define TRLLD_PROM_OK 0
+#define TRLLD_PROM_FAILED 3
+
+int CDECL TRlldGetPromInfo(TRlldAdapter_t * adapter, TRlldPromInfo_t * info);
+
+#define TRLLD_PROM_OK 0
+#define TRLLD_PROM_NOT_MOUNTED 1
+#define TRLLD_PROM_NOT_MAPPED 2
+
+void CDECL TRlldSetPromPage(TRlldAdapter_t * adapter, int page);
+
+int CDECL TRlldSetMemoryUse(TRlldAdapter_t * adapter, int use);
+
+#define TRLLD_PROM_TO_MEMORY 0
+#define TRLLD_REGISTERS_TO_MEMORY 1
+
+#define TRLLD_MEMORY_USE_OK 0
+#define TRLLD_MEMORY_USE_NO_MEMORY 1
+#define TRLLD_MEMORY_USE_STATE 2
+#define TRLLD_MEMORY_USE_ILLEGAL 3
+
+int CDECL TRlldPromErase(TRlldAdapter_t * adapter,
+ void (CDECL * delay)(int milliseconds));
+
+#define TRLLD_PROM_OK 0
+#define TRLLD_PROM_NOT_MOUNTED 1
+#define TRLLD_PROM_NOT_MAPPED 2
+#define TRLLD_PROM_FAILED 3
+
+int CDECL TRlldPromWrite(TRlldAdapter_t * adapter, char * data,
+ int offset, int count);
+
+#define TRLLD_PROM_OK 0
+#define TRLLD_PROM_NOT_MOUNTED 1
+#define TRLLD_PROM_NOT_MAPPED 2
+#define TRLLD_PROM_FAILED 3
+#define TRLLD_PROM_ILLEGAL 4
+
+void CDECL TRlldEmergency(TRlldAdapter_t * adapter);
+
+/* Convert from TRlldAdapterConfig.type to name string */
+char * CDECL TRlldAdapterName(int type);
+#endif
diff --git a/sys/contrib/dev/oltr/trlldbm.c b/sys/contrib/dev/oltr/trlldbm.c
new file mode 100644
index 0000000..944606d
--- /dev/null
+++ b/sys/contrib/dev/oltr/trlldbm.c
@@ -0,0 +1,2690 @@
+/*
+ * $FreeBSD$
+ *
+ * Copyright (c) 1997
+ * OLICOM A/S
+ * Denmark
+ *
+ * All Rights Reserved
+ *
+ * This source file is subject to the terms and conditions of the
+ * OLICOM Software License Agreement which restricts the manner
+ * in which it may be used.
+ *
+ *---------------------------------------------------------------------------
+ *
+ * Description: Olicom adapter micro-code
+ *
+ *---------------------------------------------------------------------------
+ */
+
+unsigned char TRlldBullseyeMac[] __attribute ((aligned(2))) = {
+ 0x52, 0x94, 0x04, 0x00, 0x02, 0x7d, 0x0b, 0xe7, 0x4f, 0x43, 0x53, 0x4d,
+ 0x41, 0x43, 0x2e, 0x42, 0x55, 0x4c, 0x4c, 0x53, 0x45, 0x59, 0x45, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xea, 0x55, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xb8, 0x00, 0x00, 0xbb, 0x00,
+ 0x00, 0xb9, 0x00, 0x00, 0xba, 0x00, 0x00, 0xbe, 0x00, 0x00, 0xbf, 0x00,
+ 0x00, 0xbd, 0x00, 0x00, 0x8c, 0xc8, 0x8e, 0xd8, 0x8e, 0xc0, 0x8e, 0xd0,
+ 0xb8, 0x20, 0x5f, 0x8b, 0xe0, 0x83, 0x3e, 0x4e, 0x00, 0x00, 0x75, 0x1c,
+ 0x2b, 0xdb, 0x8b, 0xf3, 0xad, 0x8b, 0xd8, 0x8b, 0xc8, 0xd1, 0xe9, 0x49,
+ 0x49, 0xad, 0x03, 0xd8, 0xe2, 0xfb, 0x0b, 0xdb, 0x74, 0x06, 0xc7, 0x06,
+ 0xf2, 0x5d, 0x01, 0x00, 0xb8, 0x00, 0x00, 0x8e, 0xd8, 0xc7, 0x06, 0x0c,
+ 0x00, 0x9a, 0x01, 0x8c, 0x0e, 0x0e, 0x00, 0xc7, 0x06, 0x04, 0x00, 0x9a,
+ 0x01, 0x8c, 0x0e, 0x06, 0x00, 0xc7, 0x06, 0x14, 0x00, 0x9a, 0x01, 0x8c,
+ 0x0e, 0x14, 0x00, 0xc7, 0x06, 0x08, 0x00, 0x9a, 0x01, 0x8c, 0x0e, 0x08,
+ 0x00, 0x90, 0x90, 0x90, 0xc7, 0x06, 0x20, 0x00, 0x10, 0x24, 0x8c, 0x0e,
+ 0x22, 0x00, 0x2b, 0xc0, 0xe7, 0x06, 0xc7, 0x06, 0x30, 0x00, 0xee, 0x0d,
+ 0x8c, 0x0e, 0x32, 0x00, 0xc7, 0x06, 0x34, 0x00, 0xe8, 0x0e, 0x8c, 0x0e,
+ 0x36, 0x00, 0xc7, 0x06, 0x38, 0x00, 0x1a, 0x0f, 0x8c, 0x0e, 0x3a, 0x00,
+ 0xc7, 0x06, 0x3c, 0x00, 0x9a, 0x01, 0x8c, 0x0e, 0x3e, 0x00, 0xc7, 0x06,
+ 0x08, 0x00, 0x9a, 0x01, 0x8c, 0x0e, 0x0a, 0x00, 0xc7, 0x06, 0x14, 0x00,
+ 0x9a, 0x01, 0x8c, 0x0e, 0x16, 0x00, 0xbb, 0x40, 0x60, 0x8e, 0xc3, 0x26,
+ 0x83, 0x0e, 0x32, 0x00, 0x08, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b,
+ 0xc0, 0x26, 0x83, 0x26, 0x32, 0x00, 0xf7, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b,
+ 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x0e, 0x32, 0x00, 0x08, 0x2a, 0xe4, 0xb0,
+ 0x13, 0xe6, 0x10, 0x90, 0x90, 0x90, 0xb0, 0x08, 0xe6, 0x12, 0x90, 0x90,
+ 0x90, 0xb0, 0x09, 0xe6, 0x12, 0x90, 0x90, 0x90, 0xb0, 0xff, 0xe6, 0x12,
+ 0x90, 0x90, 0x90, 0x26, 0x83, 0x26, 0x32, 0x00, 0xf7, 0x90, 0x90, 0x90,
+ 0x33, 0xc0, 0x26, 0xc7, 0x06, 0x44, 0x00, 0xff, 0xff, 0x26, 0xc7, 0x06,
+ 0x46, 0x00, 0xff, 0xff, 0x26, 0x09, 0x06, 0x48, 0x00, 0x26, 0x09, 0x06,
+ 0x4a, 0x00, 0xb8, 0x00, 0x00, 0xe7, 0x06, 0xb8, 0x0f, 0x27, 0xe7, 0x00,
+ 0xb8, 0x09, 0x00, 0xe7, 0x06, 0xb0, 0x11, 0xe8, 0x89, 0x0a, 0xe8, 0xc7,
+ 0x0a, 0xfb, 0xe9, 0x71, 0x0b, 0x90, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58,
+ 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0, 0xe7, 0xe7, 0xe7, 0x30, 0x32,
+ 0x30, 0x33, 0x39, 0x39, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x38, 0x2c,
+ 0x20, 0x31, 0x39, 0x39, 0x39, 0x20, 0x4f, 0x6c, 0x69, 0x63, 0x6f, 0x6d,
+ 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73,
+ 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x5a, 0x21,
+ 0x5a, 0x21, 0xdd, 0x37, 0x8e, 0x3b, 0x8a, 0x3d, 0xd9, 0x3e, 0x1b, 0x40,
+ 0x63, 0x43, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0xcc, 0x41, 0x22, 0x42,
+ 0xb3, 0x42, 0x30, 0x43, 0x35, 0x43, 0x3a, 0x43, 0x5a, 0x21, 0x5a, 0x21,
+ 0x5a, 0x21, 0x5a, 0x21, 0xf2, 0x3a, 0x5a, 0x21, 0x5a, 0x21, 0x72, 0x39,
+ 0xd2, 0x39, 0xd2, 0x39, 0xaf, 0x3a, 0xd2, 0x39, 0xd7, 0x3a, 0x13, 0x3b,
+ 0x5a, 0x21, 0x5a, 0x21, 0xcc, 0x41, 0x22, 0x42, 0xb3, 0x42, 0x30, 0x43,
+ 0x35, 0x43, 0x3a, 0x43, 0x5a, 0x21, 0xec, 0x39, 0x5a, 0x21, 0x77, 0x3a,
+ 0x5a, 0x21, 0x48, 0x3b, 0x6e, 0x3b, 0x17, 0x35, 0x17, 0x35, 0x17, 0x35,
+ 0x17, 0x35, 0xe1, 0x35, 0x0e, 0x37, 0x17, 0x35, 0xf3, 0x35, 0xa1, 0x36,
+ 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37,
+ 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37,
+ 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37,
+ 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x4d, 0x36,
+ 0x17, 0x35, 0x17, 0x35, 0x17, 0x35, 0x17, 0x35, 0x17, 0x35, 0x80, 0x36,
+ 0x17, 0x35, 0x17, 0x35, 0x92, 0x36, 0x17, 0x35, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x04, 0x04, 0x05, 0xff, 0xff,
+ 0xff, 0x00, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0x0d, 0x06, 0xff, 0xff,
+ 0x18, 0x06, 0x28, 0x06, 0x28, 0x06, 0x28, 0x06, 0x28, 0x06, 0x00, 0x00,
+ 0x33, 0x06, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x39, 0x06, 0x58, 0x06,
+ 0x9e, 0x06, 0x9e, 0x06, 0x9e, 0x06, 0x6d, 0x06, 0x7d, 0x06, 0x00, 0x00,
+ 0x83, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x5a, 0x21, 0xeb, 0x43, 0x5e, 0x17, 0xc7, 0x34, 0xf3, 0x27,
+ 0x85, 0x4a, 0x5a, 0x21, 0x25, 0x44, 0xfe, 0x47, 0x47, 0x46, 0x47, 0x44,
+ 0xba, 0x45, 0xbf, 0x47, 0x83, 0x45, 0x77, 0x47, 0x85, 0x48, 0xcf, 0x48,
+ 0xbc, 0x48, 0x9e, 0x47, 0xdc, 0x48, 0x01, 0x49, 0x2c, 0x49, 0xbf, 0x48,
+ 0x4a, 0x49, 0x16, 0x03, 0x3c, 0x03, 0x5c, 0x03, 0x88, 0x03, 0xae, 0x03,
+ 0x26, 0x04, 0x8c, 0x04, 0xc6, 0x04, 0x10, 0x05, 0x02, 0x06, 0xe8, 0x01,
+ 0x10, 0x03, 0x36, 0x03, 0x64, 0x03, 0x82, 0x03, 0xa8, 0x03, 0x86, 0x04,
+ 0xc0, 0x04, 0x0a, 0x05, 0xfc, 0x05, 0xe4, 0x01, 0x2e, 0x04, 0x94, 0x04,
+ 0x00, 0x03, 0x2a, 0x03, 0x50, 0x03, 0x76, 0x03, 0x9c, 0x03, 0xc2, 0x03,
+ 0xbc, 0x03, 0xda, 0x03, 0x98, 0x05, 0x0e, 0x04, 0x7a, 0x04, 0xb4, 0x04,
+ 0xda, 0x04, 0xfa, 0x04, 0xe0, 0x05, 0x24, 0x05, 0x48, 0x05, 0x64, 0x05,
+ 0x7c, 0x05, 0xf4, 0x03, 0xb0, 0x05, 0xc8, 0x05, 0xc2, 0x5c, 0xca, 0x5c,
+ 0xd6, 0x5c, 0xde, 0x5c, 0xe6, 0x5c, 0x0c, 0x5d, 0x20, 0x5d, 0x28, 0x5d,
+ 0x34, 0x5d, 0x5a, 0x5d, 0x6e, 0x5d, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+ 0xf6, 0xf7, 0xf8, 0xf9, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x14, 0x1e,
+ 0x7e, 0x1e, 0xaa, 0x1e, 0x20, 0x1f, 0x42, 0x1f, 0xd4, 0x1f, 0x32, 0x20,
+ 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5e, 0x20, 0x86, 0x20,
+ 0xf2, 0x20, 0x16, 0x21, 0x52, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0xfe, 0x16,
+ 0x2e, 0x18, 0xc2, 0x18, 0xc4, 0x18, 0xe0, 0x18, 0x06, 0x19, 0x22, 0x19,
+ 0xb0, 0x19, 0x26, 0x1a, 0x76, 0x1b, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21,
+ 0x5a, 0x21, 0x86, 0x22, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21,
+ 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21,
+ 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21,
+ 0x5a, 0x21, 0xb2, 0x1b, 0x22, 0x1c, 0xcc, 0x1c, 0x18, 0x1d, 0x9a, 0x1d,
+ 0xba, 0x1d, 0xe8, 0x1d, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21,
+ 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0xaa, 0x55, 0x00, 0xff, 0xf6, 0x46,
+ 0x01, 0x01, 0x75, 0x48, 0xc6, 0x86, 0x0e, 0x01, 0x05, 0xe8, 0x73, 0x01,
+ 0xe8, 0x11, 0x06, 0xe8, 0x02, 0x03, 0xe8, 0x60, 0x03, 0x73, 0x19, 0xfe,
+ 0x8e, 0x0e, 0x01, 0x74, 0x0d, 0xe8, 0xae, 0x03, 0x8b, 0x86, 0x0f, 0x01,
+ 0x26, 0xa3, 0x42, 0x00, 0xeb, 0xdf, 0xc7, 0x06, 0xf2, 0x5d, 0x02, 0x00,
+ 0x32, 0xe4, 0x8a, 0x46, 0x00, 0xe8, 0x4c, 0x04, 0x83, 0x3e, 0x4e, 0x00,
+ 0x02, 0x72, 0x03, 0xe8, 0x65, 0x03, 0xa1, 0xf2, 0x5d, 0xe8, 0x25, 0x43,
+ 0xc6, 0x46, 0x01, 0x01, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x74, 0x27, 0xf6,
+ 0x86, 0x6c, 0x01, 0x01, 0x74, 0x03, 0xe8, 0xb1, 0x55, 0xf6, 0x86, 0x6d,
+ 0x01, 0x01, 0x74, 0x03, 0xe8, 0xff, 0x55, 0xf7, 0x86, 0x82, 0x01, 0x01,
+ 0x00, 0x75, 0x08, 0xf7, 0x86, 0x8a, 0x01, 0x01, 0x00, 0x74, 0x03, 0xe8,
+ 0xdb, 0x52, 0xe8, 0x5e, 0x05, 0xe8, 0x2a, 0x05, 0xe8, 0xa2, 0x04, 0xe8,
+ 0x47, 0x04, 0xf6, 0x86, 0x95, 0x02, 0x01, 0x74, 0x03, 0xe8, 0xdc, 0x1c,
+ 0x33, 0xdb, 0xf6, 0x86, 0xae, 0x02, 0x01, 0x74, 0x16, 0x8a, 0x5e, 0x09,
+ 0x8a, 0x7e, 0x08, 0x38, 0xfb, 0x75, 0x30, 0x80, 0xfb, 0x00, 0x74, 0x07,
+ 0x80, 0xfb, 0x1e, 0x74, 0x02, 0xeb, 0x22, 0x80, 0x7e, 0x06, 0x1e, 0x74,
+ 0x1e, 0x33, 0xdb, 0x8a, 0x5e, 0x07, 0x3a, 0x5e, 0x06, 0x74, 0x14, 0xfa,
+ 0x50, 0x8b, 0x46, 0x06, 0x89, 0x46, 0x0c, 0x58, 0x88, 0x5e, 0x06, 0x32,
+ 0xff, 0xff, 0x97, 0xa4, 0x05, 0xeb, 0x32, 0x8a, 0x5e, 0x09, 0x3a, 0x5e,
+ 0x08, 0x74, 0x2a, 0x50, 0x8b, 0x46, 0x08, 0x89, 0x46, 0x0e, 0x58, 0x80,
+ 0xfb, 0x1e, 0x74, 0x12, 0x80, 0xfb, 0x00, 0x74, 0x0d, 0x80, 0xfb, 0x0c,
+ 0x74, 0x08, 0x80, 0xfb, 0x16, 0x74, 0x03, 0xe8, 0x87, 0x2c, 0x88, 0x5e,
+ 0x08, 0x32, 0xff, 0xfa, 0xff, 0x97, 0x82, 0x05, 0xfb, 0xfa, 0xf7, 0x86,
+ 0xf0, 0x00, 0xff, 0xff, 0x74, 0x0f, 0x8b, 0xb6, 0xf0, 0x00, 0x8b, 0x4c,
+ 0x04, 0xe8, 0xd2, 0x09, 0xfb, 0xff, 0xd1, 0xeb, 0x5c, 0xfb, 0xf7, 0x46,
+ 0x16, 0xff, 0xff, 0x74, 0x27, 0x8d, 0x7e, 0x16, 0xe8, 0x68, 0x06, 0x56,
+ 0x8b, 0x5c, 0x02, 0xd1, 0xe3, 0xff, 0x97, 0xd2, 0x04, 0x5e, 0xe8, 0x6c,
+ 0x06, 0xf7, 0x86, 0xcc, 0x01, 0x01, 0x00, 0x74, 0x09, 0xe8, 0x15, 0x26,
+ 0xc7, 0x86, 0xcc, 0x01, 0x00, 0x00, 0xeb, 0x2d, 0xfa, 0xf7, 0x86, 0x0a,
+ 0x01, 0x01, 0x00, 0x75, 0x13, 0xf6, 0x86, 0xc4, 0x15, 0x80, 0x75, 0x0c,
+ 0xc7, 0x86, 0x0a, 0x01, 0x01, 0x00, 0xfb, 0xe8, 0x7d, 0x3c, 0xeb, 0x11,
+ 0xfa, 0x8b, 0x86, 0x67, 0x02, 0x38, 0xc4, 0x74, 0x07, 0x88, 0x86, 0x68,
+ 0x02, 0xe8, 0x0d, 0x1b, 0xfb, 0xe8, 0xd1, 0x05, 0xe9, 0xcd, 0xfe, 0x8e,
+ 0x46, 0x02, 0x26, 0xc7, 0x06, 0x44, 0x00, 0xff, 0xcb, 0x8e, 0x46, 0x02,
+ 0x26, 0xc7, 0x06, 0x48, 0x00, 0xff, 0xfb, 0xe8, 0xa5, 0x02, 0x33, 0xc0,
+ 0x88, 0x86, 0xb8, 0x01, 0x88, 0x86, 0xb9, 0x01, 0x8e, 0x46, 0x02, 0x26,
+ 0xa2, 0x5a, 0x00, 0x89, 0x86, 0x18, 0x02, 0x89, 0x86, 0x0a, 0x02, 0x89,
+ 0x86, 0x3a, 0x02, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x4c, 0x00, 0x30,
+ 0x01, 0x8d, 0x86, 0xa8, 0x08, 0x89, 0x86, 0xc0, 0x01, 0x89, 0x86, 0xc2,
+ 0x01, 0xc7, 0x86, 0xc4, 0x01, 0x01, 0x00, 0x8c, 0xd8, 0x8e, 0xc0, 0x33,
+ 0xc0, 0x8d, 0xbe, 0x58, 0x02, 0xb9, 0x52, 0x00, 0xd1, 0xe9, 0xf3, 0xab,
+ 0xd1, 0xd1, 0xf3, 0xaa, 0x8d, 0xbe, 0xec, 0x05, 0xab, 0xab, 0xaa, 0x8d,
+ 0xbe, 0xf4, 0x05, 0xab, 0xab, 0xaa, 0x8d, 0xbe, 0xb8, 0x02, 0xb9, 0x0b,
+ 0x00, 0xf3, 0xab, 0xc7, 0x86, 0xc8, 0x01, 0x14, 0x00, 0xc7, 0x86, 0xc0,
+ 0x02, 0x04, 0x00, 0xbb, 0x02, 0x05, 0xb9, 0x0b, 0x00, 0x8b, 0x3f, 0x03,
+ 0xfd, 0xab, 0xab, 0xab, 0x43, 0x43, 0xe2, 0xf5, 0xbb, 0x18, 0x05, 0xb9,
+ 0x0a, 0x00, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0xab, 0x43, 0x43, 0xe2, 0xf6,
+ 0xb8, 0x02, 0x00, 0x03, 0x06, 0xcc, 0x5d, 0xe8, 0x1d, 0x05, 0x39, 0x06,
+ 0xcc, 0x5d, 0x75, 0xf7, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00,
+ 0x02, 0xc7, 0x86, 0x0c, 0x02, 0xc8, 0x00, 0xc7, 0x86, 0xfc, 0x01, 0xff,
+ 0xff, 0xc7, 0x86, 0xfa, 0x01, 0x07, 0x00, 0xc6, 0x86, 0x8c, 0x02, 0x00,
+ 0xe8, 0x01, 0x00, 0xc3, 0x8e, 0x46, 0x02, 0x33, 0xc0, 0xfa, 0x89, 0x86,
+ 0xb6, 0x01, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x50, 0x00, 0x8b, 0x86, 0xa8,
+ 0x15, 0x26, 0xa3, 0x70, 0x00, 0x89, 0x86, 0xb2, 0x01, 0x93, 0xc7, 0x07,
+ 0x00, 0x00, 0xc7, 0x47, 0x02, 0xff, 0xff, 0x93, 0xc1, 0xe8, 0x08, 0x26,
+ 0xa3, 0x74, 0x00, 0x8b, 0x86, 0xaa, 0x15, 0x26, 0xa3, 0x78, 0x00, 0x26,
+ 0xa1, 0x78, 0x00, 0x93, 0xc7, 0x47, 0xfc, 0xde, 0xad, 0xc7, 0x47, 0xfe,
+ 0xbe, 0xaf, 0x93, 0xc1, 0xe8, 0x08, 0x26, 0xa3, 0x76, 0x00, 0x33, 0xc0,
+ 0xc6, 0x86, 0x87, 0x02, 0x01, 0x8d, 0xb6, 0xa8, 0x09, 0xc7, 0x86, 0xa6,
+ 0x01, 0xb0, 0x09, 0x01, 0xae, 0xa6, 0x01, 0x89, 0xb6, 0xa8, 0x01, 0x89,
+ 0xb6, 0xaa, 0x01, 0xc7, 0x04, 0x30, 0x80, 0xc7, 0x44, 0x04, 0x00, 0x00,
+ 0xc6, 0x86, 0x8a, 0x02, 0x01, 0xfb, 0xe8, 0xab, 0x08, 0x80, 0xbe, 0xfe,
+ 0x00, 0x02, 0x74, 0x33, 0xb8, 0x00, 0x40, 0x80, 0xbe, 0xfe, 0x00, 0x00,
+ 0x74, 0x13, 0x25, 0xff, 0x1f, 0x0d, 0x00, 0xa0, 0x83, 0xe0, 0xfd, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x0e, 0x4c, 0x00, 0x80, 0x00, 0x8e, 0x46, 0x02,
+ 0x26, 0xa3, 0x40, 0x00, 0xa1, 0xcc, 0x5d, 0x83, 0xc0, 0x02, 0xe8, 0x42,
+ 0x04, 0x39, 0x06, 0xcc, 0x5d, 0x75, 0xf7, 0xc3, 0x8e, 0x46, 0x02, 0x26,
+ 0xc7, 0x06, 0x40, 0x00, 0x08, 0xbe, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26,
+ 0x42, 0x00, 0xc8, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x4c, 0x00, 0xa0,
+ 0x00, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x50, 0x00, 0x04, 0x00, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x26, 0x40, 0x00, 0x7f, 0xff, 0x90, 0x90, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x0e, 0x40, 0x00, 0x80, 0x00, 0x90, 0x90, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x26, 0x40, 0x00, 0x7f, 0xff, 0x8e, 0x46, 0x02,
+ 0x26, 0xc7, 0x06, 0x68, 0x00, 0x18, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83,
+ 0x0e, 0x4c, 0x00, 0x01, 0x26, 0xa1, 0x32, 0x00, 0xc3, 0xc6, 0x86, 0x0c,
+ 0x01, 0x01, 0xc6, 0x86, 0x0d, 0x01, 0x00, 0xe8, 0x1e, 0x28, 0xa1, 0xcc,
+ 0x5d, 0x83, 0xc0, 0x02, 0x0b, 0xc0, 0x0b, 0xc0, 0x0b, 0xc0, 0x0b, 0xc0,
+ 0x39, 0x06, 0xcc, 0x5d, 0x72, 0xf2, 0x80, 0xbe, 0x0d, 0x01, 0x01, 0x74,
+ 0x03, 0xf9, 0xeb, 0x01, 0xf8, 0xc6, 0x86, 0x0c, 0x01, 0x00, 0xc3, 0xb8,
+ 0x00, 0x00, 0x88, 0x86, 0x06, 0x01, 0x88, 0x86, 0x07, 0x01, 0x88, 0x86,
+ 0x08, 0x01, 0x88, 0x86, 0x09, 0x01, 0x89, 0x86, 0x0a, 0x01, 0x88, 0x86,
+ 0xb8, 0x01, 0x88, 0x86, 0xb9, 0x01, 0x88, 0x86, 0xd1, 0x01, 0xa2, 0x23,
+ 0x5f, 0xc3, 0xb8, 0x40, 0x60, 0x8e, 0xc0, 0x26, 0x83, 0x0e, 0x32, 0x00,
+ 0x08, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x26,
+ 0x32, 0x00, 0xf7, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b,
+ 0xc0, 0x26, 0x83, 0x0e, 0x32, 0x00, 0x08, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b,
+ 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x26, 0x32, 0x00, 0xf7, 0xc3, 0x50, 0x53,
+ 0x52, 0xc6, 0x46, 0x01, 0x00, 0x32, 0xe4, 0x8a, 0x46, 0x00, 0xbb, 0x00,
+ 0xbd, 0x81, 0xeb, 0x00, 0x7d, 0x81, 0xe3, 0x00, 0xff, 0x89, 0x9e, 0xac,
+ 0x15, 0x81, 0xc3, 0x00, 0x01, 0xf7, 0xe3, 0x05, 0x00, 0x7d, 0x89, 0x86,
+ 0xa8, 0x15, 0x03, 0x86, 0xac, 0x15, 0x48, 0x89, 0x86, 0xaa, 0x15, 0x5a,
+ 0x5b, 0x58, 0xc3, 0x51, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00,
+ 0xfc, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54, 0x00, 0x80, 0x00, 0x75,
+ 0x1e, 0xb9, 0xf4, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x4c, 0x00,
+ 0x00, 0x08, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54, 0x00, 0x80, 0x00,
+ 0x75, 0x05, 0xe8, 0xe2, 0x02, 0xe2, 0xe5, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x26, 0x4c, 0x00, 0xff, 0xf7, 0x59, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e,
+ 0x4c, 0x00, 0x02, 0xc3, 0x50, 0x53, 0xc1, 0xe0, 0x05, 0x05, 0x00, 0x03,
+ 0x8b, 0xd8, 0x8d, 0x86, 0x00, 0x01, 0x89, 0x07, 0x8d, 0x86, 0xd4, 0x01,
+ 0x89, 0x47, 0x02, 0x8d, 0x86, 0xe4, 0x01, 0x89, 0x47, 0x04, 0x8d, 0x86,
+ 0xb0, 0x15, 0x89, 0x47, 0x08, 0x8d, 0x86, 0xc4, 0x15, 0x89, 0x47, 0x06,
+ 0x8d, 0x86, 0xc0, 0x01, 0x89, 0x47, 0x0a, 0xc7, 0x47, 0x0c, 0x38, 0x5f,
+ 0x8d, 0x86, 0x40, 0x02, 0x89, 0x47, 0x0e, 0x8d, 0x06, 0xcc, 0x5d, 0x89,
+ 0x47, 0x10, 0x5b, 0x58, 0xc3, 0x50, 0xf7, 0x86, 0xf6, 0x00, 0x02, 0x00,
+ 0x75, 0x02, 0xeb, 0x4b, 0xf6, 0x86, 0x64, 0x02, 0x01, 0x75, 0x07, 0xf6,
+ 0x86, 0x72, 0x02, 0x01, 0x74, 0x3d, 0xf6, 0x86, 0x89, 0x02, 0x01, 0x74,
+ 0x36, 0xc6, 0x86, 0x89, 0x02, 0x00, 0x8b, 0x86, 0x0a, 0x02, 0xf7, 0x86,
+ 0x12, 0x01, 0x00, 0x40, 0x74, 0x03, 0x25, 0xff, 0xaf, 0xf7, 0x86, 0x12,
+ 0x01, 0x00, 0x20, 0x74, 0x03, 0x25, 0xff, 0xdf, 0x89, 0x86, 0x0a, 0x02,
+ 0x3b, 0x86, 0x3a, 0x02, 0x74, 0x0d, 0x89, 0x86, 0x3a, 0x02, 0x81, 0xa6,
+ 0x3a, 0x02, 0x7f, 0xdf, 0xe8, 0x4e, 0x3f, 0x58, 0xc3, 0x57, 0x56, 0x50,
+ 0x8b, 0x86, 0xe6, 0x02, 0xa9, 0xff, 0xff, 0x74, 0x40, 0x8d, 0xbe, 0xdc,
+ 0x02, 0x8d, 0xb6, 0xec, 0x05, 0xb9, 0x0a, 0x00, 0x83, 0xf9, 0x05, 0x75,
+ 0x04, 0x8d, 0xb6, 0xf4, 0x05, 0xa9, 0x01, 0x00, 0x74, 0x1e, 0x80, 0x3d,
+ 0xff, 0x74, 0x12, 0xfe, 0x05, 0x80, 0x3d, 0xff, 0x75, 0x0b, 0x81, 0x8e,
+ 0x0a, 0x02, 0x80, 0x00, 0xc6, 0x86, 0x89, 0x02, 0x01, 0x80, 0x3c, 0xff,
+ 0x74, 0x02, 0xfe, 0x04, 0xd1, 0xe8, 0x47, 0x46, 0xe2, 0xce, 0xe8, 0x0a,
+ 0x00, 0xc7, 0x86, 0xe6, 0x02, 0x00, 0x00, 0x58, 0x5e, 0x5f, 0xc3, 0xf6,
+ 0x86, 0x5a, 0x02, 0x01, 0x75, 0x27, 0xf6, 0x86, 0xaf, 0x02, 0x01, 0x75,
+ 0x07, 0xf6, 0x86, 0x64, 0x02, 0x01, 0x74, 0x19, 0xc6, 0x86, 0x5a, 0x02,
+ 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x80, 0x75, 0x0c, 0xbe, 0x7f, 0x4c,
+ 0xe8, 0xa1, 0x03, 0xc7, 0x86, 0xc0, 0x02, 0x04, 0x00, 0xc3, 0xf7, 0x86,
+ 0xb0, 0x15, 0x00, 0x80, 0x75, 0x02, 0xeb, 0x26, 0x8b, 0xb6, 0x60, 0x01,
+ 0x3b, 0xb6, 0x5e, 0x01, 0x74, 0x1c, 0x46, 0x83, 0xe6, 0x07, 0x89, 0xb6,
+ 0x60, 0x01, 0x8b, 0xce, 0xd1, 0xe1, 0xd1, 0xe1, 0x8d, 0xb6, 0x3e, 0x01,
+ 0x03, 0xf1, 0x8b, 0x04, 0x8b, 0x54, 0x02, 0xe9, 0x3e, 0x3f, 0xc3, 0xbb,
+ 0x00, 0x03, 0x83, 0x7f, 0x12, 0x00, 0x74, 0x08, 0xe8, 0xb9, 0x3e, 0xc7,
+ 0x47, 0x12, 0x00, 0x00, 0xc3, 0x53, 0x50, 0x33, 0xc0, 0x88, 0x86, 0xcf,
+ 0x01, 0xa3, 0x34, 0x5f, 0xbb, 0x38, 0x5f, 0x89, 0x1e, 0x2c, 0x5f, 0x89,
+ 0x07, 0x89, 0x47, 0x02, 0x89, 0x47, 0x04, 0xa3, 0x2e, 0x5f, 0xa3, 0x30,
+ 0x5f, 0xa3, 0x32, 0x5f, 0x58, 0x5b, 0xc3, 0x50, 0x8a, 0xe0, 0xe4, 0x12,
+ 0xf6, 0xd4, 0x22, 0xc4, 0xe6, 0x12, 0x58, 0xc3, 0xc6, 0x46, 0x06, 0x00,
+ 0xc6, 0x46, 0x07, 0x00, 0xc6, 0x46, 0x08, 0x00, 0xc6, 0x46, 0x09, 0x00,
+ 0xc6, 0x86, 0xc4, 0x15, 0x80, 0x8d, 0xbe, 0x16, 0x03, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xab, 0xab, 0xab, 0xc3, 0x51, 0x53, 0xb9, 0x10, 0x00, 0xd1, 0xe0,
+ 0xd1, 0xdb, 0xe2, 0xfa, 0x8b, 0xc3, 0x86, 0xc4, 0x5b, 0x59, 0xc3, 0x90,
+ 0x50, 0x53, 0x51, 0x52, 0x57, 0x56, 0x8d, 0x1e, 0x72, 0x05, 0xb8, 0x40,
+ 0x60, 0x8e, 0xc0, 0xff, 0x06, 0x4e, 0x00, 0xc7, 0x06, 0xe8, 0x5d, 0x00,
+ 0x00, 0xc6, 0x06, 0xec, 0x5d, 0x00, 0xc7, 0x06, 0xf0, 0x5d, 0x30, 0x00,
+ 0x8d, 0x3e, 0xea, 0x5d, 0xb8, 0x48, 0x66, 0x89, 0x05, 0x06, 0x33, 0xc0,
+ 0x8e, 0xc0, 0xa3, 0xcc, 0x5d, 0xa3, 0xce, 0x5d, 0xa3, 0xd0, 0x5d, 0x8d,
+ 0x3e, 0xe0, 0x5d, 0xb9, 0x04, 0x00, 0xd1, 0xe9, 0xf3, 0xab, 0x8d, 0x3e,
+ 0xe4, 0x5d, 0xb9, 0x04, 0x00, 0xd1, 0xe9, 0xf3, 0xab, 0x07, 0x8b, 0xd4,
+ 0xb9, 0x01, 0x00, 0xbb, 0x00, 0x00, 0xbd, 0x48, 0x66, 0x88, 0x5e, 0x00,
+ 0x8b, 0xc3, 0xd1, 0xe0, 0xd1, 0xe0, 0x05, 0x40, 0x60, 0x89, 0x46, 0x02,
+ 0x06, 0x51, 0x8c, 0xd8, 0x8e, 0xc0, 0xbe, 0x80, 0x03, 0x8d, 0xbe, 0x1a,
+ 0x04, 0xb9, 0x05, 0x00, 0xf3, 0xa5, 0x59, 0x07, 0xe8, 0x2f, 0xfd, 0xe8,
+ 0xe2, 0x00, 0x8b, 0xc5, 0x05, 0xa4, 0x08, 0x89, 0x86, 0xa6, 0x08, 0x83,
+ 0xc0, 0x02, 0x8b, 0xe0, 0x68, 0x06, 0x06, 0x81, 0xc5, 0x44, 0x16, 0x43,
+ 0xe2, 0xbf, 0x8b, 0xe2, 0x33, 0xed, 0x5e, 0x5f, 0x5a, 0x59, 0x5b, 0x58,
+ 0xc3, 0x3e, 0x89, 0xa6, 0xa6, 0x08, 0x33, 0xed, 0xbc, 0x20, 0x5f, 0xfa,
+ 0x83, 0x0e, 0xe4, 0x5d, 0x00, 0x74, 0x0d, 0x8b, 0x36, 0xe4, 0x5d, 0x8b,
+ 0x4c, 0x04, 0xe8, 0xd1, 0x03, 0xfb, 0xff, 0xd1, 0xfb, 0x32, 0xff, 0x8a,
+ 0x1e, 0xe8, 0x5d, 0x80, 0x8f, 0xee, 0x5d, 0x00, 0x75, 0x21, 0xd1, 0xe3,
+ 0x8b, 0xaf, 0xea, 0x5d, 0x81, 0xbe, 0xa4, 0x06, 0xa5, 0xa5, 0x74, 0x0c,
+ 0xd1, 0xeb, 0xc6, 0x87, 0xee, 0x5d, 0x01, 0xe8, 0xf2, 0x06, 0xeb, 0x07,
+ 0x8b, 0x86, 0xa6, 0x08, 0x8b, 0xe0, 0xc3, 0xeb, 0xb5, 0xeb, 0xae, 0x60,
+ 0x9c, 0xe8, 0xa9, 0xff, 0x0e, 0xe8, 0x02, 0x00, 0xeb, 0x01, 0xcf, 0x61,
+ 0xc3, 0x50, 0xfa, 0x8b, 0x76, 0x1a, 0xf7, 0xc6, 0xff, 0xff, 0x74, 0x10,
+ 0x8b, 0x04, 0x89, 0x46, 0x1a, 0x0b, 0xc0, 0x75, 0x03, 0x89, 0x46, 0x1c,
+ 0xc7, 0x04, 0x00, 0x00, 0xfb, 0x58, 0xc3, 0x53, 0xfa, 0xc7, 0x04, 0x00,
+ 0x00, 0x8b, 0x5d, 0x02, 0x89, 0x37, 0x89, 0x75, 0x02, 0x83, 0x3d, 0x00,
+ 0x75, 0x02, 0x89, 0x35, 0xfb, 0x5b, 0xc3, 0x50, 0xfa, 0x8b, 0x35, 0x8b,
+ 0x04, 0x89, 0x05, 0x0b, 0xc0, 0x75, 0x03, 0x89, 0x45, 0x02, 0xfb, 0x58,
+ 0xc3, 0x50, 0xfa, 0x8b, 0x46, 0x1a, 0x89, 0x04, 0x89, 0x76, 0x1a, 0xf7,
+ 0x46, 0x1a, 0xff, 0xff, 0x75, 0x03, 0x89, 0x76, 0x1a, 0xfb, 0x58, 0xc3,
+ 0x50, 0x53, 0x51, 0x8b, 0xc5, 0x83, 0xc0, 0x1e, 0x89, 0x46, 0x1a, 0x83,
+ 0xc0, 0x48, 0x89, 0x46, 0x1c, 0xb9, 0x09, 0x00, 0x8b, 0xdd, 0x8b, 0xc5,
+ 0x83, 0xc0, 0x26, 0x89, 0x47, 0x1e, 0x83, 0xc3, 0x08, 0x83, 0xc0, 0x08,
+ 0xe2, 0xf5, 0x59, 0x5b, 0x58, 0xc3, 0x60, 0x06, 0x1e, 0xfa, 0x33, 0xdb,
+ 0x8e, 0xdb, 0x83, 0x06, 0xcc, 0x5d, 0x01, 0x73, 0x04, 0x11, 0x1e, 0xce,
+ 0x5d, 0xb9, 0x01, 0x00, 0x8b, 0xaf, 0xea, 0x5d, 0xf6, 0x06, 0x23, 0x5f,
+ 0x01, 0x75, 0x03, 0xe8, 0xe8, 0x46, 0xf7, 0x86, 0xa8, 0x02, 0x01, 0x00,
+ 0x74, 0x30, 0xfe, 0x86, 0x6b, 0x01, 0x80, 0xbe, 0x6b, 0x01, 0x02, 0x73,
+ 0x02, 0xeb, 0x23, 0xc6, 0x86, 0x6b, 0x01, 0x00, 0xf7, 0x86, 0x1c, 0x01,
+ 0x01, 0x00, 0x75, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x44, 0x00,
+ 0x32, 0xfe, 0x81, 0xa6, 0x18, 0x01, 0x32, 0xfe, 0xc7, 0x86, 0xa8, 0x02,
+ 0x00, 0x00, 0xc6, 0x86, 0x6a, 0x01, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xa1,
+ 0x48, 0x00, 0x25, 0x00, 0x02, 0x74, 0x03, 0xe8, 0x44, 0x17, 0xf6, 0x86,
+ 0x58, 0x02, 0x01, 0x74, 0x03, 0xe8, 0xb6, 0x46, 0x8b, 0x86, 0xf6, 0x00,
+ 0x25, 0xd0, 0xe3, 0x89, 0x86, 0x30, 0x02, 0x8a, 0x46, 0x08, 0x3c, 0x06,
+ 0x74, 0x08, 0x3c, 0x0a, 0x74, 0x04, 0x3c, 0x18, 0x75, 0x04, 0xff, 0x86,
+ 0x4a, 0x02, 0x83, 0xc3, 0x02, 0x49, 0x74, 0x03, 0xe9, 0x75, 0xff, 0xf7,
+ 0x06, 0xe0, 0x5d, 0xff, 0xff, 0x74, 0x1f, 0xff, 0x0e, 0xd0, 0x5d, 0x75,
+ 0x19, 0xe8, 0x14, 0x02, 0x8b, 0x1e, 0xe0, 0x5d, 0x0b, 0xdb, 0x74, 0x0e,
+ 0x8b, 0x47, 0x08, 0xa3, 0xd0, 0x5d, 0xf7, 0x06, 0xd0, 0x5d, 0xff, 0xff,
+ 0x74, 0xe7, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58, 0x1f, 0x07, 0x61, 0xcf,
+ 0x60, 0x06, 0x1e, 0xfa, 0x8d, 0x36, 0xd4, 0x5d, 0x83, 0x04, 0x01, 0x83,
+ 0x54, 0x02, 0x00, 0xe8, 0xfb, 0x4a, 0xa0, 0xd2, 0x5d, 0xfe, 0xc0, 0x3c,
+ 0x04, 0x72, 0x08, 0xc6, 0x06, 0xd2, 0x5d, 0x00, 0xe9, 0x0f, 0xff, 0xa2,
+ 0xd2, 0x5d, 0xeb, 0xce, 0x50, 0x57, 0x56, 0xfa, 0x8d, 0x36, 0xd8, 0x5d,
+ 0x83, 0x04, 0x01, 0x83, 0x54, 0x02, 0x00, 0x80, 0x3e, 0x23, 0x5f, 0x01,
+ 0x75, 0x0d, 0x8b, 0x36, 0x26, 0x5f, 0x83, 0xfe, 0x14, 0x77, 0x0e, 0xff,
+ 0x94, 0x5c, 0x05, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58, 0x5e, 0x5f, 0x58,
+ 0xcf, 0xe8, 0xaa, 0x4d, 0xeb, 0xf1, 0x57, 0x56, 0x50, 0xfa, 0x8d, 0x36,
+ 0xdc, 0x5d, 0x83, 0x04, 0x01, 0x83, 0x54, 0x02, 0x00, 0x80, 0x3e, 0x23,
+ 0x5f, 0x01, 0x75, 0x0d, 0x8b, 0x36, 0x26, 0x5f, 0x83, 0xfe, 0x14, 0x77,
+ 0x0e, 0xff, 0x94, 0x5c, 0x05, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58, 0x58,
+ 0x5e, 0x5f, 0xcf, 0xe8, 0x78, 0x4d, 0xeb, 0xf1, 0x50, 0x53, 0x51, 0x57,
+ 0xe8, 0xab, 0x00, 0xfa, 0x8b, 0x3c, 0x03, 0xfd, 0x89, 0x6d, 0x02, 0x8b,
+ 0x44, 0x02, 0x89, 0x45, 0x04, 0x8b, 0x44, 0x04, 0x89, 0x45, 0x06, 0x0b,
+ 0xc0, 0x75, 0x0e, 0x8b, 0x86, 0x0c, 0x02, 0x0b, 0xc0, 0x75, 0x03, 0xb8,
+ 0xc8, 0x00, 0x89, 0x45, 0x06, 0xf7, 0x06, 0xe0, 0x5d, 0xff, 0xff, 0x75,
+ 0x14, 0x89, 0x3e, 0xe0, 0x5d, 0x89, 0x3e, 0xe2, 0x5d, 0xc7, 0x05, 0x00,
+ 0x00, 0x89, 0x45, 0x08, 0xa3, 0xd0, 0x5d, 0xeb, 0x63, 0x8b, 0x3e, 0xe0,
+ 0x5d, 0x8b, 0x0e, 0xd0, 0x5d, 0x33, 0xdb, 0x3b, 0xc8, 0x72, 0x35, 0x0b,
+ 0xdb, 0x75, 0x17, 0x2b, 0xc8, 0x89, 0x4d, 0x08, 0x8b, 0x34, 0x03, 0xf5,
+ 0x89, 0x44, 0x08, 0x89, 0x3c, 0x89, 0x36, 0xe0, 0x5d, 0xa3, 0xd0, 0x5d,
+ 0xeb, 0x3a, 0x2b, 0x4d, 0x08, 0x2b, 0xc1, 0x8b, 0x34, 0x03, 0xf5, 0x89,
+ 0x44, 0x08, 0x8b, 0x4d, 0x08, 0x2b, 0xc8, 0x89, 0x4d, 0x08, 0x89, 0x37,
+ 0x89, 0x3c, 0xeb, 0x20, 0x8b, 0xdf, 0x8b, 0x3d, 0x0b, 0xff, 0x74, 0x05,
+ 0x03, 0x4d, 0x08, 0xeb, 0xba, 0x2b, 0xc1, 0x8b, 0x34, 0x03, 0xf5, 0x89,
+ 0x44, 0x08, 0x89, 0x37, 0xc7, 0x04, 0x00, 0x00, 0x89, 0x36, 0xe2, 0x5d,
+ 0xfb, 0x5f, 0x59, 0x5b, 0x58, 0xc3, 0x57, 0x53, 0x50, 0x56, 0xfa, 0x8b,
+ 0x1e, 0xe0, 0x5d, 0x33, 0xff, 0x8b, 0x34, 0x03, 0xf5, 0x83, 0x7c, 0x02,
+ 0xff, 0x74, 0x4b, 0x3b, 0xde, 0x75, 0x49, 0x0b, 0xff, 0x74, 0x18, 0x8b,
+ 0x07, 0x89, 0x05, 0x0b, 0xc0, 0x75, 0x06, 0x89, 0x3e, 0xe2, 0x5d, 0xeb,
+ 0x2c, 0x8b, 0x4f, 0x08, 0x8b, 0xf8, 0x01, 0x4d, 0x08, 0xeb, 0x22, 0x8b,
+ 0x3f, 0x89, 0x3e, 0xe0, 0x5d, 0x0b, 0xff, 0x75, 0x0c, 0x89, 0x3e, 0xe2,
+ 0x5d, 0xc7, 0x06, 0xd0, 0x5d, 0xff, 0xff, 0xeb, 0x0c, 0xa1, 0xd0, 0x5d,
+ 0x01, 0x45, 0x08, 0x8b, 0x45, 0x08, 0xa3, 0xd0, 0x5d, 0xc7, 0x47, 0x02,
+ 0xff, 0xff, 0xc7, 0x07, 0x00, 0x00, 0xeb, 0x4e, 0x83, 0xcb, 0x00, 0x74,
+ 0x06, 0x8b, 0xfb, 0x8b, 0x1f, 0xeb, 0xa8, 0x83, 0xfd, 0x00, 0x75, 0x05,
+ 0xbb, 0xe4, 0x5d, 0xeb, 0x04, 0x8d, 0x9e, 0xf0, 0x00, 0x8b, 0x1f, 0x83,
+ 0xfb, 0x00, 0x74, 0x2e, 0x3b, 0xde, 0x75, 0x05, 0xe8, 0x6b, 0x00, 0xeb,
+ 0x25, 0x8b, 0xfb, 0x8b, 0x1f, 0x83, 0xcb, 0x00, 0x74, 0x1c, 0x3b, 0xde,
+ 0x75, 0xf3, 0x8b, 0x07, 0x89, 0x05, 0x83, 0xc8, 0x00, 0x75, 0x04, 0x89,
+ 0xbe, 0xf2, 0x00, 0xc7, 0x07, 0x00, 0x00, 0xc7, 0x47, 0x02, 0xff, 0xff,
+ 0xeb, 0x00, 0xfb, 0x5e, 0x58, 0x5b, 0x5f, 0xc3, 0x50, 0x53, 0x56, 0x55,
+ 0x8b, 0x1e, 0xe0, 0x5d, 0x8b, 0x6f, 0x02, 0x0b, 0xed, 0x74, 0x06, 0x81,
+ 0xc5, 0xf0, 0x00, 0xeb, 0x03, 0xbd, 0xe4, 0x5d, 0x8b, 0x76, 0x02, 0x8b,
+ 0x07, 0xa3, 0xe0, 0x5d, 0x0b, 0xc0, 0x75, 0x03, 0xa3, 0xe2, 0x5d, 0x89,
+ 0x5e, 0x02, 0x89, 0x1c, 0xc7, 0x07, 0x00, 0x00, 0x83, 0x4e, 0x00, 0x00,
+ 0x75, 0x03, 0x89, 0x5e, 0x00, 0x5d, 0x5e, 0x5b, 0x58, 0xc3, 0x55, 0x53,
+ 0x50, 0x0b, 0xed, 0x74, 0x06, 0x81, 0xc5, 0xf0, 0x00, 0xeb, 0x03, 0xbd,
+ 0xe4, 0x5d, 0x8b, 0x5e, 0x00, 0xc7, 0x47, 0x02, 0xff, 0xff, 0x8b, 0x07,
+ 0xc7, 0x07, 0x00, 0x00, 0x8b, 0xd8, 0x89, 0x5e, 0x00, 0x0b, 0xdb, 0x75,
+ 0x03, 0x89, 0x5e, 0x02, 0x58, 0x5b, 0x5d, 0xc3, 0x50, 0x53, 0x51, 0x57,
+ 0x56, 0xfa, 0x8b, 0x1e, 0xe0, 0x5d, 0x33, 0xff, 0x83, 0xcb, 0x00, 0x74,
+ 0x54, 0x8b, 0xc3, 0x39, 0x6f, 0x02, 0x75, 0x47, 0x0b, 0xff, 0x74, 0x18,
+ 0x8b, 0x37, 0x89, 0x35, 0x8b, 0xc7, 0x0b, 0xf6, 0x75, 0x06, 0x89, 0x3e,
+ 0xe2, 0x5d, 0xeb, 0x2c, 0x8b, 0x4f, 0x08, 0x01, 0x4c, 0x08, 0xeb, 0x24,
+ 0x8b, 0x37, 0x89, 0x36, 0xe0, 0x5d, 0x0b, 0xf6, 0x75, 0x0c, 0x89, 0x36,
+ 0xe2, 0x5d, 0xc7, 0x06, 0xd0, 0x5d, 0xff, 0xff, 0xeb, 0x0e, 0xa1, 0xd0,
+ 0x5d, 0x01, 0x44, 0x08, 0x8b, 0x44, 0x08, 0xa3, 0xd0, 0x5d, 0x33, 0xc0,
+ 0xc7, 0x47, 0x02, 0xff, 0xff, 0xeb, 0x00, 0x8b, 0xf8, 0x8b, 0x1f, 0xeb,
+ 0xa7, 0xfb, 0x5e, 0x5f, 0x59, 0x5b, 0x58, 0xc3, 0x50, 0x53, 0x51, 0x52,
+ 0x8a, 0x8e, 0xad, 0x02, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x32, 0x00, 0x8a,
+ 0x9e, 0x7d, 0x02, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x57, 0xf6, 0x86,
+ 0xb3, 0x02, 0x01, 0x75, 0x4e, 0x0d, 0x74, 0x80, 0x25, 0x7f, 0x9f, 0x26,
+ 0xa3, 0x32, 0x00, 0xb8, 0x01, 0x00, 0xe8, 0x2d, 0x05, 0x26, 0x83, 0x0e,
+ 0x42, 0x00, 0x04, 0xc6, 0x86, 0xb4, 0x02, 0x00, 0x26, 0xa1, 0x32, 0x00,
+ 0x0d, 0x00, 0x60, 0x26, 0xa3, 0x32, 0x00, 0xb8, 0x00, 0x00, 0xe8, 0x11,
+ 0x05, 0x26, 0xa1, 0x32, 0x00, 0x83, 0xe0, 0xdf, 0x26, 0xa3, 0x32, 0x00,
+ 0xb8, 0x00, 0x00, 0xe8, 0x00, 0x05, 0xe8, 0x83, 0x01, 0x26, 0xa1, 0x8c,
+ 0x00, 0x25, 0xff, 0x07, 0x0d, 0x00, 0xd0, 0x26, 0xa3, 0x8c, 0x00, 0xeb,
+ 0x41, 0xf6, 0x86, 0xb4, 0x02, 0x01, 0x75, 0x3a, 0x26, 0x83, 0x26, 0x42,
+ 0x00, 0xfb, 0x26, 0xa1, 0x32, 0x00, 0x0d, 0xb4, 0x80, 0x25, 0xbf, 0x9f,
+ 0x26, 0xa3, 0x32, 0x00, 0xc6, 0x86, 0xb3, 0x02, 0x00, 0xb8, 0x01, 0x00,
+ 0xe8, 0xc7, 0x04, 0x26, 0xa1, 0x32, 0x00, 0x83, 0xe0, 0xef, 0x26, 0xa3,
+ 0x32, 0x00, 0xc6, 0x86, 0xb4, 0x02, 0x01, 0xc6, 0x06, 0x6f, 0x13, 0x01,
+ 0xb8, 0x00, 0x00, 0xe8, 0xac, 0x04, 0x26, 0xa1, 0x40, 0x00, 0x8b, 0xd8,
+ 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x75, 0x10, 0x83, 0xe0, 0xfd, 0xc6, 0x86,
+ 0x7d, 0x02, 0x01, 0x25, 0xff, 0x1f, 0x0d, 0x00, 0x80, 0xeb, 0x0e, 0x25,
+ 0xff, 0x1f, 0x0d, 0x00, 0x20, 0x83, 0xc8, 0x02, 0xc6, 0x86, 0x7d, 0x02,
+ 0x00, 0xe8, 0xa8, 0x02, 0x0d, 0x00, 0x08, 0xf6, 0x86, 0xaf, 0x02, 0x01,
+ 0x75, 0x03, 0x25, 0xff, 0xf7, 0x33, 0xd8, 0x74, 0x0f, 0x26, 0xa3, 0x40,
+ 0x00, 0xf7, 0xc3, 0x02, 0x00, 0x74, 0x05, 0xc6, 0x06, 0x6f, 0x13, 0x01,
+ 0x26, 0xa1, 0x4c, 0x00, 0x8a, 0x9e, 0x7d, 0x02, 0x8b, 0xd8, 0xf7, 0x86,
+ 0x12, 0x01, 0x10, 0x00, 0x74, 0x05, 0x0d, 0x00, 0x10, 0xeb, 0x03, 0x25,
+ 0xff, 0xef, 0x8a, 0xae, 0x6d, 0x02, 0x80, 0xf9, 0x01, 0x75, 0x04, 0x8a,
+ 0xae, 0x6e, 0x02, 0xf6, 0xc5, 0x01, 0x74, 0x05, 0x83, 0xc8, 0x10, 0xeb,
+ 0x03, 0x83, 0xe0, 0xef, 0xf6, 0x86, 0x6f, 0x02, 0x01, 0x74, 0x0a, 0x83,
+ 0xc8, 0x20, 0xc6, 0x86, 0x7e, 0x02, 0x00, 0xeb, 0x08, 0x83, 0xe0, 0xdf,
+ 0xc6, 0x86, 0x7e, 0x02, 0x01, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x0a,
+ 0xc6, 0x86, 0x7e, 0x02, 0x00, 0x83, 0xc8, 0x40, 0xeb, 0x03, 0x83, 0xe0,
+ 0xbf, 0xf6, 0x86, 0x7d, 0x02, 0x01, 0x74, 0x05, 0x0d, 0x80, 0x00, 0xeb,
+ 0x03, 0x25, 0x7f, 0xff, 0xf6, 0x86, 0x7c, 0x02, 0x01, 0x74, 0x05, 0x0d,
+ 0x00, 0x01, 0xeb, 0x03, 0x25, 0xff, 0xfe, 0xf6, 0x86, 0x7e, 0x02, 0x01,
+ 0x74, 0x05, 0x0d, 0x00, 0x20, 0xeb, 0x03, 0x25, 0xff, 0xdf, 0x33, 0xd8,
+ 0x74, 0x12, 0xf7, 0xc3, 0x20, 0x00, 0x74, 0x05, 0xc6, 0x06, 0x6f, 0x13,
+ 0x01, 0x25, 0xff, 0xf7, 0x26, 0xa3, 0x4c, 0x00, 0x26, 0xa1, 0x50, 0x00,
+ 0x8b, 0xd8, 0x33, 0xd8, 0x74, 0x04, 0x26, 0xa3, 0x50, 0x00, 0xf6, 0x06,
+ 0x6f, 0x13, 0x01, 0x74, 0x25, 0xc6, 0x06, 0x6f, 0x13, 0x00, 0x80, 0xbe,
+ 0xfe, 0x00, 0x02, 0x74, 0x19, 0x26, 0x81, 0x26, 0x40, 0x00, 0x7f, 0xff,
+ 0x90, 0x90, 0x26, 0x81, 0x0e, 0x40, 0x00, 0x80, 0x00, 0x90, 0x90, 0x26,
+ 0x81, 0x26, 0x40, 0x00, 0x7f, 0xff, 0x5a, 0x59, 0x5b, 0x58, 0xc3, 0x00,
+ 0xf6, 0x86, 0xb3, 0x02, 0x01, 0x75, 0x42, 0x50, 0xe8, 0x50, 0x03, 0xb3,
+ 0x00, 0x8a, 0x3e, 0x22, 0x5f, 0xb8, 0x00, 0x80, 0xe8, 0xdf, 0x02, 0x8b,
+ 0xc0, 0x8b, 0xc0, 0x8b, 0xc0, 0xb3, 0x00, 0x8a, 0x3e, 0x22, 0x5f, 0xb8,
+ 0x00, 0x21, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x04, 0x74, 0x03, 0x0d, 0x00,
+ 0x40, 0xe8, 0xc2, 0x02, 0xb3, 0x1b, 0x8a, 0x3e, 0x22, 0x5f, 0xe8, 0x12,
+ 0x02, 0x83, 0xc8, 0x10, 0xe8, 0xb3, 0x02, 0xc6, 0x86, 0xb3, 0x02, 0x01,
+ 0x58, 0xc3, 0x8e, 0x46, 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x04, 0x00, 0x74,
+ 0x0b, 0xc6, 0x06, 0x23, 0x5f, 0x01, 0x26, 0x83, 0x0e, 0x42, 0x00, 0x02,
+ 0xc6, 0x86, 0xb0, 0x02, 0x00, 0xc6, 0x86, 0xb1, 0x02, 0x00, 0xa8, 0x02,
+ 0x74, 0x26, 0x26, 0x83, 0x26, 0x42, 0x00, 0xcf, 0xf7, 0x86, 0xf4, 0x00,
+ 0x04, 0x00, 0x75, 0x14, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x75, 0x0c,
+ 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x77, 0x05, 0xc6, 0x86, 0xb0, 0x02, 0x01,
+ 0xb0, 0x02, 0xeb, 0x2a, 0xa8, 0x04, 0x74, 0x0e, 0x26, 0x83, 0x0e, 0x42,
+ 0x00, 0x20, 0x26, 0x83, 0x26, 0x42, 0x00, 0xef, 0xeb, 0x18, 0xa8, 0x08,
+ 0x74, 0x08, 0x26, 0x83, 0x0e, 0x42, 0x00, 0x30, 0xeb, 0x0c, 0xa8, 0x10,
+ 0x74, 0x08, 0x26, 0x83, 0x0e, 0x42, 0x00, 0x30, 0xeb, 0x00, 0xf6, 0x06,
+ 0x23, 0x5f, 0x01, 0x74, 0x06, 0x26, 0x83, 0x26, 0x42, 0x00, 0xcf, 0xc3,
+ 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x4c, 0x00, 0x00, 0x01, 0x90,
+ 0x90, 0x90, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x4c, 0x00, 0xff,
+ 0xfe, 0xc3, 0x8e, 0x46, 0x02, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x1e,
+ 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, 0x0f, 0x80, 0xbe, 0xb0, 0x02, 0x01,
+ 0x75, 0x10, 0x26, 0x83, 0x0e, 0x42, 0x00, 0x02, 0xeb, 0x08, 0xc6, 0x86,
+ 0x6c, 0x01, 0x01, 0xe8, 0x98, 0x47, 0xc3, 0x8e, 0x46, 0x02, 0xf7, 0x86,
+ 0xf4, 0x00, 0x02, 0x00, 0x74, 0x09, 0x26, 0x81, 0x26, 0x42, 0x00, 0xff,
+ 0xef, 0xeb, 0x07, 0x26, 0x81, 0x0e, 0x42, 0x00, 0x00, 0x10, 0xc3, 0x8e,
+ 0x46, 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x02, 0x00, 0x74, 0x09, 0x26, 0x81,
+ 0x0e, 0x42, 0x00, 0x00, 0x10, 0xeb, 0x07, 0x26, 0x81, 0x26, 0x42, 0x00,
+ 0xff, 0xef, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x42, 0x00, 0x00,
+ 0x80, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x42, 0x00, 0xff, 0x7f,
+ 0xc3, 0xf7, 0x86, 0xf4, 0x00, 0x08, 0x00, 0x74, 0x13, 0xe8, 0xdf, 0xff,
+ 0xeb, 0x39, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x1d, 0x80, 0x7e, 0x06, 0x48,
+ 0x74, 0x23, 0xeb, 0x2b, 0xe8, 0xd7, 0xff, 0x8e, 0x46, 0x02, 0xf7, 0x86,
+ 0xf4, 0x00, 0x10, 0x00, 0x75, 0xe4, 0x80, 0xbe, 0xfe, 0x00, 0x00, 0x75,
+ 0x0c, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x42, 0x00, 0x00, 0x40, 0xeb,
+ 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x42, 0x00, 0xff, 0xbf, 0xc3,
+ 0x83, 0xe0, 0xf7, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x04, 0x74, 0x03, 0x83,
+ 0xc8, 0x08, 0xc3, 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x77, 0x0a, 0x8e, 0x46,
+ 0x02, 0x26, 0x83, 0x0e, 0x50, 0x00, 0x04, 0xc3, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x0e, 0x90, 0x00, 0x04, 0xc3, 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x77,
+ 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x50, 0x00, 0xfb, 0xc3, 0x8e,
+ 0x46, 0x02, 0x26, 0x83, 0x26, 0x90, 0x00, 0xfb, 0xc3, 0x51, 0x50, 0xfa,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x92, 0x00, 0xfb, 0x26, 0x83, 0x26,
+ 0x92, 0x00, 0xfe, 0x90, 0x90, 0x90, 0x90, 0x26, 0x83, 0x0e, 0x92, 0x00,
+ 0x01, 0x90, 0x90, 0x90, 0x90, 0x26, 0xa1, 0x92, 0x00, 0x83, 0xc8, 0x02,
+ 0xb9, 0x20, 0x00, 0xe8, 0x06, 0x00, 0xe2, 0xfb, 0xfb, 0x58, 0x59, 0xc3,
+ 0x53, 0x8e, 0x46, 0x02, 0x24, 0xfe, 0x26, 0xa3, 0x92, 0x00, 0x90, 0x90,
+ 0x90, 0x90, 0x0c, 0x01, 0x26, 0xa3, 0x92, 0x00, 0x90, 0x90, 0x90, 0x5b,
+ 0xc3, 0x51, 0xb1, 0x03, 0xd2, 0xe5, 0xb1, 0x05, 0xd0, 0xe5, 0x72, 0x04,
+ 0x24, 0xfd, 0xeb, 0x02, 0x0c, 0x02, 0xe8, 0xd3, 0xff, 0xfe, 0xc9, 0x75,
+ 0xef, 0x59, 0xc3, 0x9c, 0xfa, 0x51, 0x52, 0xfa, 0x8e, 0x46, 0x02, 0xe8,
+ 0x8f, 0xff, 0x26, 0xa1, 0x92, 0x00, 0x83, 0xe0, 0xfd, 0x83, 0xc8, 0x01,
+ 0x26, 0xa3, 0x92, 0x00, 0x83, 0xc8, 0x04, 0x26, 0xa3, 0x92, 0x00, 0xe8,
+ 0xaa, 0xff, 0x83, 0xc8, 0x02, 0xe8, 0xa4, 0xff, 0x83, 0xc8, 0x02, 0xe8,
+ 0x9e, 0xff, 0x83, 0xe0, 0xfd, 0xe8, 0x98, 0xff, 0x8a, 0xef, 0xe8, 0xac,
+ 0xff, 0x8a, 0xeb, 0xe8, 0xa7, 0xff, 0x83, 0xe0, 0xfb, 0xe8, 0x88, 0xff,
+ 0x83, 0xe0, 0xfe, 0x26, 0xa3, 0x92, 0x00, 0x90, 0x90, 0x26, 0x8b, 0x0e,
+ 0x92, 0x00, 0xf7, 0xc1, 0x02, 0x00, 0x74, 0x12, 0xa8, 0x02, 0x74, 0x0e,
+ 0xb9, 0x12, 0x00, 0xe8, 0x6a, 0xff, 0xe2, 0xfb, 0xfb, 0x5a, 0x59, 0x9d,
+ 0xf9, 0xc3, 0x0c, 0x01, 0x26, 0xa3, 0x92, 0x00, 0x90, 0x90, 0x90, 0x90,
+ 0xb1, 0x10, 0x53, 0x33, 0xdb, 0x24, 0xfe, 0x26, 0xa3, 0x92, 0x00, 0x26,
+ 0xa1, 0x92, 0x00, 0xd1, 0xe3, 0xa8, 0x02, 0x74, 0x03, 0x83, 0xcb, 0x01,
+ 0x0c, 0x01, 0x26, 0xa3, 0x92, 0x00, 0x90, 0x90, 0x90, 0x90, 0xfe, 0xc9,
+ 0x75, 0xdf, 0xe8, 0x2f, 0xff, 0x8b, 0xc3, 0x5b, 0xfb, 0x5a, 0x59, 0x9d,
+ 0xf8, 0xc3, 0x9c, 0xfa, 0x51, 0x53, 0x52, 0x50, 0xfa, 0xe8, 0xe9, 0xfe,
+ 0x26, 0xa1, 0x92, 0x00, 0x83, 0xe0, 0xfd, 0x83, 0xc8, 0x01, 0x26, 0xa3,
+ 0x92, 0x00, 0x83, 0xc8, 0x04, 0x26, 0xa3, 0x92, 0x00, 0xe8, 0x04, 0xff,
+ 0x83, 0xc8, 0x02, 0xe8, 0xfe, 0xfe, 0x24, 0xfd, 0xe8, 0xf9, 0xfe, 0x0c,
+ 0x02, 0xe8, 0xf4, 0xfe, 0x8a, 0xef, 0xe8, 0x08, 0xff, 0x8a, 0xeb, 0xe8,
+ 0x03, 0xff, 0x0c, 0x02, 0xe8, 0xe5, 0xfe, 0x24, 0xfd, 0xe8, 0xe0, 0xfe,
+ 0x5b, 0xb1, 0x10, 0xd1, 0xe3, 0x72, 0x04, 0x24, 0xfd, 0xeb, 0x02, 0x0c,
+ 0x02, 0xe8, 0xd0, 0xfe, 0xfe, 0xc9, 0x75, 0xef, 0x24, 0xfb, 0xe8, 0xc7,
+ 0xfe, 0xfb, 0x5a, 0x5b, 0x59, 0x9d, 0xc3, 0x50, 0xe8, 0x8a, 0xfe, 0xb7,
+ 0x00, 0xb3, 0x02, 0xe8, 0xe9, 0xfe, 0x83, 0xf8, 0xff, 0x75, 0x09, 0xfe,
+ 0xc7, 0x80, 0xff, 0x20, 0x75, 0xf1, 0xb7, 0xff, 0x88, 0x3e, 0x22, 0x5f,
+ 0x58, 0xc3, 0x53, 0x40, 0x03, 0x06, 0xcc, 0x5d, 0x8b, 0xd8, 0xe8, 0x62,
+ 0xf6, 0xa1, 0xcc, 0x5d, 0x3b, 0xc3, 0x75, 0xf6, 0x5b, 0xc3, 0xe8, 0x86,
+ 0xf0, 0xc6, 0x86, 0x6d, 0x02, 0x01, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0x8e,
+ 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32,
+ 0x00, 0x00, 0x80, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x0b, 0xc6, 0x86,
+ 0x7c, 0x02, 0x00, 0xe8, 0x62, 0xfa, 0xe8, 0xf6, 0xfd, 0x33, 0xc0, 0x88,
+ 0x86, 0x8d, 0x02, 0x88, 0x86, 0x8e, 0x02, 0xc6, 0x86, 0x63, 0x01, 0x01,
+ 0xc7, 0x86, 0x64, 0x01, 0x02, 0x06, 0xc6, 0x86, 0x69, 0x01, 0x02, 0xbe,
+ 0xe5, 0x4c, 0xe8, 0xff, 0xf7, 0xbe, 0xdf, 0x4c, 0xe8, 0xf9, 0xf7, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x26, 0x44, 0x00, 0x32, 0xfe, 0xc3, 0xc6, 0x86,
+ 0x63, 0x01, 0x00, 0x80, 0xbe, 0x62, 0x01, 0x01, 0x75, 0x0d, 0xe8, 0x1a,
+ 0xf0, 0xe8, 0xa3, 0x30, 0xc6, 0x46, 0x07, 0x00, 0xe9, 0xb6, 0x00, 0xbe,
+ 0x91, 0x4c, 0xe8, 0x81, 0xf8, 0xbe, 0xdf, 0x4c, 0xe8, 0x7b, 0xf8, 0xc6,
+ 0x86, 0x8d, 0x02, 0x01, 0x80, 0x7e, 0x06, 0x02, 0x74, 0x08, 0x80, 0x7e,
+ 0x06, 0x44, 0x74, 0x09, 0xeb, 0x1c, 0xc6, 0x46, 0x07, 0x04, 0xe9, 0x90,
+ 0x00, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x74, 0x07, 0xc6, 0x46, 0x07,
+ 0x4e, 0xe9, 0x81, 0x00, 0xc6, 0x46, 0x07, 0x46, 0xeb, 0x7b, 0x80, 0x7e,
+ 0x08, 0x08, 0x75, 0xf8, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc6, 0x86, 0x6d,
+ 0x02, 0x00, 0xc6, 0x86, 0x61, 0x02, 0x00, 0xc6, 0x86, 0x60, 0x02, 0x00,
+ 0xc6, 0x86, 0x63, 0x02, 0x01, 0xc6, 0x86, 0x6c, 0x02, 0x01, 0xc6, 0x86,
+ 0x70, 0x02, 0x01, 0xf6, 0x86, 0x5c, 0x02, 0x01, 0x74, 0x17, 0x80, 0xbe,
+ 0xab, 0x02, 0x01, 0x74, 0x2c, 0xc6, 0x46, 0x09, 0x0a, 0xc6, 0x86, 0x6f,
+ 0x02, 0x00, 0xc6, 0x86, 0x5d, 0x02, 0x01, 0xeb, 0x1c, 0xf6, 0x86, 0x5d,
+ 0x02, 0x01, 0x74, 0x15, 0x80, 0xbe, 0xab, 0x02, 0x01, 0x74, 0x0e, 0xc6,
+ 0x46, 0x09, 0x06, 0xc6, 0x86, 0x5c, 0x02, 0x01, 0xc6, 0x86, 0x6f, 0x02,
+ 0x01, 0xe8, 0x3e, 0xfc, 0xe8, 0x71, 0xf9, 0xbe, 0xc7, 0x4c, 0xe8, 0x2b,
+ 0xf7, 0xbe, 0x85, 0x4c, 0xe8, 0x25, 0xf7, 0xbe, 0xcd, 0x4c, 0xe8, 0x1f,
+ 0xf7, 0xc3, 0xc6, 0x46, 0x09, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26,
+ 0x44, 0x00, 0x32, 0xfe, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x75, 0x05,
+ 0xc6, 0x86, 0x97, 0x02, 0x01, 0xe8, 0x64, 0x0a, 0xc7, 0x86, 0xc8, 0x01,
+ 0x14, 0x00, 0xc7, 0x86, 0xcc, 0x02, 0x00, 0x00, 0xbe, 0xd3, 0x4c, 0xe8,
+ 0xee, 0xf6, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x01,
+ 0xc6, 0x86, 0x6c, 0x02, 0x01, 0xc6, 0x86, 0x70, 0x02, 0x01, 0xe8, 0x17,
+ 0xf9, 0xb8, 0x01, 0x00, 0xe8, 0x6f, 0xfe, 0xe8, 0xd8, 0xfb, 0xbe, 0x8b,
+ 0x4c, 0xe8, 0xc8, 0xf6, 0xbe, 0xc7, 0x4c, 0xe8, 0xc2, 0xf6, 0x33, 0xc0,
+ 0x89, 0x86, 0xf2, 0x01, 0x89, 0x86, 0xf4, 0x01, 0x89, 0x86, 0xf6, 0x01,
+ 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x74, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x26, 0x44, 0x00, 0xff, 0xf7, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x20, 0x74,
+ 0x10, 0xbe, 0xcd, 0x4c, 0xe8, 0x95, 0xf6, 0xc6, 0x86, 0x61, 0x02, 0x00,
+ 0xc6, 0x86, 0x60, 0x02, 0x00, 0xc3, 0xc3, 0x90, 0xc6, 0x86, 0x5b, 0x02,
+ 0x01, 0xc7, 0x86, 0xce, 0x02, 0x00, 0x00, 0xc7, 0x86, 0xd0, 0x02, 0x00,
+ 0x00, 0xbe, 0x8b, 0x4c, 0xe8, 0x71, 0xf6, 0xe8, 0xf3, 0x14, 0xc3, 0x90,
+ 0xc6, 0x86, 0x5f, 0x02, 0x01, 0xf6, 0x86, 0x88, 0x02, 0x01, 0x74, 0x08,
+ 0xe8, 0x36, 0x17, 0xc6, 0x86, 0x88, 0x02, 0x00, 0xbe, 0x8b, 0x4c, 0xe8,
+ 0x52, 0xf6, 0xf6, 0x86, 0x67, 0x02, 0x01, 0x74, 0x04, 0xc6, 0x46, 0x07,
+ 0x0c, 0xc3, 0xbe, 0x8b, 0x4c, 0xe8, 0x40, 0xf6, 0xbe, 0xa9, 0x4c, 0xe8,
+ 0x3a, 0xf6, 0xc7, 0x86, 0xc2, 0x02, 0x01, 0x00, 0xc7, 0x86, 0xc4, 0x02,
+ 0x01, 0x00, 0xe8, 0x7c, 0x15, 0xc3, 0xc7, 0x86, 0xcc, 0x02, 0x00, 0x00,
+ 0xc7, 0x86, 0xc8, 0x01, 0x14, 0x00, 0xc6, 0x86, 0x08, 0x01, 0x00, 0x81,
+ 0xa6, 0x0a, 0x02, 0xdf, 0xbf, 0xc6, 0x86, 0x64, 0x02, 0x01, 0xc7, 0x86,
+ 0x2a, 0x02, 0xff, 0xff, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x20, 0x75, 0x18,
+ 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x75, 0x10, 0xbe, 0xcd, 0x4c, 0xe8,
+ 0xf2, 0xf5, 0xc6, 0x86, 0x61, 0x02, 0x00, 0xc6, 0x86, 0x60, 0x02, 0x00,
+ 0xbe, 0x8b, 0x4c, 0xe8, 0x94, 0xf6, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e,
+ 0x4c, 0x00, 0x01, 0x26, 0x81, 0x26, 0x32, 0x00, 0xff, 0x7f, 0xb8, 0x00,
+ 0x80, 0xe8, 0xfe, 0x2f, 0xe8, 0x4a, 0xfb, 0xe8, 0xf9, 0xfa, 0xc6, 0x86,
+ 0x62, 0x02, 0x01, 0xc6, 0x86, 0xce, 0x01, 0x00, 0xf7, 0x86, 0xf6, 0x00,
+ 0x04, 0x00, 0x74, 0x05, 0xc6, 0x86, 0xce, 0x01, 0x01, 0xf6, 0x86, 0x58,
+ 0x02, 0x01, 0x75, 0x06, 0xbe, 0x97, 0x4c, 0xe8, 0xa2, 0xf5, 0xff, 0x86,
+ 0xfc, 0x00, 0xc3, 0x90, 0xe8, 0x8b, 0xfb, 0xc6, 0x86, 0x08, 0x01, 0x00,
+ 0xc6, 0x46, 0x09, 0x00, 0xc6, 0x46, 0x0b, 0x00, 0xc6, 0x86, 0x58, 0x02,
+ 0x00, 0xc6, 0x86, 0x6c, 0x02, 0x00, 0xc6, 0x86, 0x62, 0x02, 0x00, 0xc6,
+ 0x86, 0x64, 0x02, 0x00, 0xc6, 0x86, 0x5f, 0x02, 0x00, 0xc6, 0x86, 0x67,
+ 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x00,
+ 0xc6, 0x86, 0x6e, 0x02, 0x00, 0xe8, 0x9c, 0xf7, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x0e, 0x40, 0x00, 0x20, 0xf6, 0x86, 0x70, 0x02, 0x01, 0x74, 0x02,
+ 0xeb, 0x23, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, 0x08,
+ 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01,
+ 0x01, 0xe8, 0x52, 0x42, 0xe8, 0x01, 0xf7, 0xbe, 0xa3, 0x4c, 0xe8, 0x27,
+ 0xf5, 0xc3, 0xc7, 0x86, 0x32, 0x02, 0x02, 0x00, 0xe8, 0x0f, 0xfb, 0x8e,
+ 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32,
+ 0x00, 0x00, 0x80, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75,
+ 0x08, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d,
+ 0x01, 0x01, 0xe8, 0x15, 0x42, 0xc6, 0x86, 0x08, 0x01, 0x00, 0xc7, 0x86,
+ 0x22, 0x01, 0x00, 0x00, 0xe8, 0x34, 0xfa, 0xe8, 0x58, 0xfa, 0xf7, 0x86,
+ 0xf4, 0x00, 0x10, 0x00, 0x74, 0x14, 0xf7, 0x86, 0xf4, 0x00, 0x02, 0x00,
+ 0x74, 0x0c, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x42, 0x00, 0x00, 0x40,
+ 0xeb, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x42, 0x00, 0xff, 0xbf,
+ 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x05, 0xc6, 0x86, 0xfe, 0x00, 0x01,
+ 0xf6, 0x86, 0xbd, 0x01, 0x01, 0x75, 0x02, 0xeb, 0x71, 0x26, 0xff, 0x36,
+ 0x5e, 0x00, 0x26, 0xff, 0x36, 0x60, 0x00, 0x26, 0xff, 0x36, 0x62, 0x00,
+ 0x26, 0xff, 0x36, 0x64, 0x00, 0x26, 0xff, 0x36, 0x66, 0x00, 0x26, 0xff,
+ 0x36, 0x7a, 0x00, 0x26, 0xff, 0x36, 0x7c, 0x00, 0x26, 0xff, 0x36, 0x7e,
+ 0x00, 0x26, 0xff, 0x36, 0x52, 0x00, 0x26, 0xff, 0x36, 0x6a, 0x00, 0x26,
+ 0xff, 0x36, 0x68, 0x00, 0xe8, 0xf7, 0xee, 0x26, 0x8f, 0x06, 0x68, 0x00,
+ 0x26, 0x8f, 0x06, 0x6a, 0x00, 0x26, 0x8f, 0x06, 0x52, 0x00, 0x26, 0x8f,
+ 0x06, 0x7e, 0x00, 0x26, 0x8f, 0x06, 0x7c, 0x00, 0x26, 0x8f, 0x06, 0x7a,
+ 0x00, 0x26, 0x8f, 0x06, 0x66, 0x00, 0x26, 0x8f, 0x06, 0x64, 0x00, 0x26,
+ 0x8f, 0x06, 0x62, 0x00, 0x26, 0x8f, 0x06, 0x60, 0x00, 0x26, 0x8f, 0x06,
+ 0x5e, 0x00, 0xe8, 0x6e, 0xec, 0xe8, 0xff, 0x2e, 0xc6, 0x86, 0xb2, 0x02,
+ 0x00, 0x8d, 0xbe, 0x16, 0x03, 0x8c, 0xd8, 0x8e, 0xc0, 0xab, 0xab, 0xab,
+ 0xf6, 0x86, 0xab, 0x02, 0x01, 0x74, 0x12, 0x8e, 0x46, 0x02, 0x26, 0x83,
+ 0x0e, 0x42, 0x00, 0x04, 0xc6, 0x86, 0xb4, 0x02, 0x00, 0xc6, 0x46, 0x09,
+ 0x1e, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x44, 0x00, 0xff, 0xfb, 0xf7,
+ 0x86, 0x12, 0x01, 0x00, 0x02, 0x74, 0x10, 0xf7, 0x86, 0x20, 0x01, 0x80,
+ 0x00, 0x75, 0x08, 0xbe, 0x51, 0x4d, 0xe8, 0xe7, 0xf3, 0xeb, 0x0d, 0x8e,
+ 0x46, 0x02, 0x33, 0xc0, 0x26, 0xa3, 0x64, 0x00, 0x26, 0xa3, 0x66, 0x00,
+ 0xc3, 0x90, 0x33, 0xc0, 0x88, 0x86, 0x5f, 0x02, 0x88, 0x86, 0x62, 0x02,
+ 0x88, 0x86, 0x64, 0x02, 0x88, 0x86, 0x67, 0x02, 0x88, 0x86, 0x6c, 0x02,
+ 0xbe, 0xd9, 0x4c, 0xe8, 0xba, 0xf3, 0xc6, 0x86, 0xb2, 0x02, 0x01, 0x8e,
+ 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26,
+ 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0xbd,
+ 0x40, 0xc3, 0xc7, 0x86, 0x32, 0x02, 0x03, 0x00, 0xe8, 0xcc, 0xeb, 0xc6,
+ 0x86, 0x6d, 0x02, 0x01, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0xc4, 0xf5,
+ 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x40, 0x00, 0x00, 0x1e, 0xf7, 0x86,
+ 0xf6, 0x00, 0x00, 0x10, 0x74, 0x15, 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x40,
+ 0x74, 0x0d, 0xf7, 0x86, 0xf6, 0x00, 0x20, 0x00, 0x74, 0x05, 0xc6, 0x86,
+ 0x78, 0x02, 0x01, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x06, 0xbe, 0x45,
+ 0x4d, 0xe8, 0x50, 0xf3, 0xe8, 0x24, 0xf9, 0xf7, 0x86, 0x12, 0x01, 0x00,
+ 0x84, 0x74, 0x06, 0xc6, 0x46, 0x07, 0x44, 0xeb, 0x06, 0xbe, 0xf7, 0x4c,
+ 0xe8, 0x39, 0xf3, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x44, 0x00, 0x32,
+ 0xfe, 0xe8, 0x90, 0x06, 0xc3, 0x90, 0xc7, 0x86, 0x32, 0x02, 0x04, 0x00,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e,
+ 0x32, 0x00, 0x00, 0x80, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xc6, 0x86, 0x6d,
+ 0x02, 0x00, 0xc6, 0x86, 0x7c, 0x02, 0x00, 0xe8, 0x42, 0xf5, 0xe8, 0xd6,
+ 0xf8, 0xb0, 0x00, 0xe8, 0x58, 0x17, 0x33, 0xc0, 0x88, 0x86, 0x8d, 0x02,
+ 0x88, 0x86, 0x8e, 0x02, 0xc6, 0x86, 0x63, 0x01, 0x01, 0xc7, 0x86, 0x64,
+ 0x01, 0x02, 0x06, 0xc6, 0x86, 0x69, 0x01, 0x02, 0x80, 0xbe, 0xfe, 0x00,
+ 0x02, 0x75, 0x2c, 0xc6, 0x86, 0x68, 0x01, 0x02, 0xc7, 0x86, 0x66, 0x01,
+ 0x60, 0x04, 0xc6, 0x86, 0x76, 0x02, 0x01, 0xbe, 0x45, 0x4d, 0xe8, 0xc3,
+ 0xf2, 0xbe, 0x91, 0x4c, 0xe8, 0xbd, 0xf2, 0xbe, 0xf1, 0x4c, 0xe8, 0xb7,
+ 0xf2, 0xbe, 0x3f, 0x4d, 0xe8, 0xb1, 0xf2, 0xe8, 0xae, 0x14, 0xc3, 0xc6,
+ 0x86, 0x68, 0x01, 0x02, 0xc7, 0x86, 0x66, 0x01, 0x20, 0x03, 0x8e, 0x46,
+ 0x02, 0x26, 0xc7, 0x06, 0x5c, 0x00, 0x00, 0x00, 0xbe, 0x91, 0x4c, 0xe8,
+ 0x92, 0xf2, 0xbe, 0xf1, 0x4c, 0xe8, 0x8c, 0xf2, 0x8b, 0xb6, 0x64, 0x01,
+ 0xb9, 0xe8, 0x03, 0xe8, 0x20, 0x11, 0xc3, 0x90, 0xc7, 0x86, 0x32, 0x02,
+ 0x05, 0x00, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x08, 0xc6, 0x86, 0x6d,
+ 0x02, 0x01, 0xe8, 0xab, 0xf4, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x75, 0x04,
+ 0xc6, 0x46, 0x09, 0x16, 0xc6, 0x86, 0x73, 0x02, 0x01, 0xbe, 0x15, 0x4d,
+ 0xe8, 0x55, 0xf2, 0xbe, 0x1b, 0x4d, 0xe8, 0x4f, 0xf2, 0xbe, 0x03, 0x4d,
+ 0xe8, 0x49, 0xf2, 0xbe, 0x2d, 0x4d, 0xe8, 0x43, 0xf2, 0xc7, 0x86, 0xd6,
+ 0x02, 0x01, 0x00, 0xc6, 0x86, 0x7a, 0x02, 0x01, 0xe8, 0xfb, 0x13, 0xc3,
+ 0xc7, 0x86, 0x32, 0x02, 0x07, 0x00, 0xc6, 0x86, 0x6c, 0x02, 0x01, 0xc6,
+ 0x86, 0x60, 0x02, 0x00, 0xc6, 0x86, 0x61, 0x02, 0x00, 0xbe, 0xcd, 0x4c,
+ 0xe8, 0x19, 0xf2, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x75, 0x0d, 0xc6, 0x86,
+ 0x72, 0x02, 0x01, 0xb8, 0x00, 0x80, 0xe8, 0x39, 0x2c, 0xeb, 0x0a, 0x83,
+ 0xa6, 0x0a, 0x02, 0xdf, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xc6, 0x86, 0x08,
+ 0x01, 0x00, 0xe8, 0x74, 0xf7, 0xe8, 0x23, 0xf7, 0xf6, 0x06, 0x23, 0x5f,
+ 0x01, 0x74, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x44, 0x00, 0xff,
+ 0xf7, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00, 0x01, 0x26, 0x81,
+ 0x26, 0x32, 0x00, 0xff, 0x7f, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x15,
+ 0xe8, 0xcf, 0xf6, 0xc7, 0x86, 0xc8, 0x01, 0x14, 0x00, 0xc7, 0x86, 0xcc,
+ 0x02, 0x00, 0x00, 0xbe, 0xd3, 0x4c, 0xe8, 0xb3, 0xf1, 0xc3, 0xbe, 0x33,
+ 0x4d, 0xe8, 0xac, 0xf1, 0xc6, 0x86, 0x78, 0x02, 0x00, 0xc6, 0x86, 0x74,
+ 0x02, 0x00, 0xc6, 0x86, 0xfe, 0x00, 0x02, 0xe8, 0xda, 0xf3, 0xbe, 0x45,
+ 0x4d, 0xe8, 0x94, 0xf1, 0xc3, 0x90, 0xc6, 0x86, 0x6c, 0x02, 0x00, 0xc6,
+ 0x46, 0x09, 0x1e, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe,
+ 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0xc7, 0x86, 0xda, 0x02, 0x05,
+ 0x00, 0xbe, 0x39, 0x4d, 0xe8, 0x6d, 0xf1, 0xb0, 0x00, 0xe8, 0xc6, 0x15,
+ 0xe8, 0x81, 0x13, 0xc3, 0xb8, 0x00, 0x80, 0xe8, 0x90, 0x2b, 0xc6, 0x86,
+ 0x08, 0x01, 0x00, 0xe8, 0xd7, 0xf6, 0xe8, 0x86, 0xf6, 0x8e, 0x46, 0x02,
+ 0x26, 0xc7, 0x06, 0x68, 0x00, 0x18, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83,
+ 0x0e, 0x4c, 0x00, 0x01, 0x26, 0x81, 0x26, 0x32, 0x00, 0xff, 0x7f, 0xc3,
+ 0xc7, 0x86, 0x36, 0x02, 0x01, 0x00, 0xc7, 0x86, 0xc6, 0x01, 0xff, 0xff,
+ 0xc7, 0x86, 0xcc, 0x02, 0x00, 0x00, 0xc7, 0x86, 0xc8, 0x01, 0x14, 0x00,
+ 0x80, 0x7e, 0x07, 0x10, 0x74, 0x4b, 0xb0, 0x00, 0xe8, 0x73, 0x15, 0x80,
+ 0x7e, 0x06, 0x0e, 0x74, 0x02, 0xeb, 0x3e, 0x8e, 0x46, 0x02, 0x26, 0x83,
+ 0x0e, 0x4c, 0x00, 0x01, 0x26, 0x81, 0x26, 0x32, 0x00, 0xff, 0x7f, 0x83,
+ 0xa6, 0x0a, 0x02, 0xdf, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xf6, 0x86, 0x5f,
+ 0x02, 0x01, 0x74, 0x1d, 0xf6, 0x86, 0x6a, 0x02, 0x01, 0x74, 0x16, 0xf6,
+ 0x86, 0x67, 0x02, 0x01, 0x75, 0x0f, 0xc6, 0x86, 0x67, 0x02, 0x01, 0xf6,
+ 0x86, 0x58, 0x02, 0x01, 0x75, 0x03, 0xe8, 0x29, 0x0f, 0xc3, 0x8e, 0x46,
+ 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00,
+ 0x00, 0x80, 0xc7, 0x86, 0x36, 0x02, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02,
+ 0x01, 0xe8, 0xf0, 0xf2, 0xe8, 0x9e, 0xf5, 0xbe, 0xaf, 0x4c, 0xe8, 0xa7,
+ 0xf0, 0xe8, 0xb9, 0x0e, 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26,
+ 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0xc7, 0x86,
+ 0x36, 0x02, 0x03, 0x00, 0xc7, 0x86, 0xcc, 0x02, 0x00, 0x00, 0xc7, 0x86,
+ 0xc8, 0x01, 0x0a, 0x00, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x0f, 0xc6,
+ 0x86, 0x58, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x64, 0x00,
+ 0xff, 0x7f, 0xc6, 0x86, 0x5e, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x01,
+ 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0x98, 0xf2, 0x81, 0xa6, 0x0a, 0x02,
+ 0xff, 0x2f, 0x83, 0x8e, 0x0a, 0x02, 0x20, 0xc6, 0x86, 0x89, 0x02, 0x01,
+ 0xbe, 0x79, 0x4c, 0xe8, 0x42, 0xf0, 0xbe, 0x9d, 0x4c, 0xe8, 0x3c, 0xf0,
+ 0xc7, 0x86, 0xbc, 0x02, 0x01, 0x00, 0xc7, 0x86, 0xbe, 0x02, 0x01, 0x00,
+ 0xe8, 0xf1, 0x0d, 0xc3, 0xff, 0x86, 0x48, 0x02, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80,
+ 0xe8, 0xec, 0xf5, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x75, 0x03, 0xe8, 0x95,
+ 0x0d, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26,
+ 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0x80, 0xbe, 0xab, 0x02, 0x01, 0x75,
+ 0x20, 0xc6, 0x86, 0x6c, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6,
+ 0x86, 0x6f, 0x02, 0x00, 0xe8, 0x21, 0xf2, 0xe8, 0xb2, 0xf1, 0xbe, 0xa3,
+ 0x4c, 0xe8, 0xd8, 0xef, 0xe8, 0xc7, 0xf5, 0xeb, 0x59, 0xc6, 0x86, 0x71,
+ 0x02, 0x01, 0xf6, 0x86, 0x70, 0x02, 0x01, 0x75, 0x4d, 0xe8, 0x98, 0xf1,
+ 0xe8, 0xd9, 0xe8, 0xc6, 0x86, 0x6c, 0x02, 0x00, 0xc6, 0x86, 0x71, 0x02,
+ 0x00, 0xbe, 0xa3, 0x4c, 0xe8, 0xb1, 0xef, 0x8e, 0x46, 0x02, 0xf6, 0x06,
+ 0x23, 0x5f, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb,
+ 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0xb9, 0x3c, 0xe8, 0x6b, 0xf5,
+ 0x33, 0xc0, 0x88, 0x86, 0x8d, 0x02, 0x88, 0x86, 0x8e, 0x02, 0xc6, 0x86,
+ 0x63, 0x01, 0x01, 0xc7, 0x86, 0x64, 0x01, 0x02, 0x06, 0xc6, 0x86, 0x69,
+ 0x01, 0x02, 0xc3, 0x90, 0xff, 0x86, 0x48, 0x02, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80,
+ 0xe8, 0x38, 0xf5, 0xc7, 0x86, 0xb8, 0x02, 0x02, 0x00, 0xc7, 0x86, 0xba,
+ 0x02, 0x08, 0x00, 0xc6, 0x86, 0x58, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x26, 0x64, 0x00, 0xff, 0x7f, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6,
+ 0x86, 0x6f, 0x02, 0x00, 0xe8, 0x79, 0xf1, 0xf6, 0x86, 0x85, 0x02, 0x01,
+ 0x75, 0x06, 0xbe, 0x6d, 0x4c, 0xe8, 0x2c, 0xef, 0x81, 0xa6, 0x0a, 0x02,
+ 0xff, 0x6f, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x40, 0xc6, 0x86, 0x89, 0x02,
+ 0x01, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26,
+ 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0x83, 0xbe, 0xca, 0x01, 0x00, 0x74,
+ 0x0d, 0x8b, 0x86, 0xca, 0x01, 0xc7, 0x86, 0xca, 0x01, 0x00, 0x00, 0xe8,
+ 0x2a, 0x10, 0xbe, 0x79, 0x4c, 0xe8, 0xf0, 0xee, 0xc3, 0x90, 0xc7, 0x86,
+ 0x36, 0x02, 0x01, 0x00, 0xc7, 0x86, 0x34, 0x02, 0x02, 0x00, 0xb0, 0x00,
+ 0xe8, 0x3b, 0x13, 0x80, 0x7e, 0x06, 0x48, 0x75, 0x10, 0x8e, 0x46, 0x02,
+ 0x26, 0x83, 0x0e, 0x4c, 0x00, 0x01, 0x26, 0x81, 0x26, 0x32, 0x00, 0xff,
+ 0x7f, 0xc3, 0xc7, 0x86, 0x34, 0x02, 0x03, 0x00, 0xff, 0x86, 0x48, 0x02,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e,
+ 0x32, 0x00, 0x00, 0x80, 0xc6, 0x86, 0x6c, 0x02, 0x00, 0xc6, 0x86, 0x73,
+ 0x02, 0x00, 0xbe, 0xfd, 0x4c, 0xe8, 0x9c, 0xee, 0xbe, 0x09, 0x4d, 0xe8,
+ 0x96, 0xee, 0xbe, 0x21, 0x4d, 0xe8, 0x90, 0xee, 0x80, 0xbe, 0xfe, 0x00,
+ 0x02, 0x74, 0x08, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0xc1, 0xf0, 0x81,
+ 0x8e, 0x0a, 0x02, 0x04, 0x50, 0xc6, 0x86, 0x89, 0x02, 0x01, 0x80, 0xbe,
+ 0xfe, 0x00, 0x02, 0x74, 0x0d, 0xf6, 0x86, 0x65, 0x02, 0x01, 0x74, 0x06,
+ 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x80, 0xe8, 0x31, 0x30, 0xe8, 0xe6, 0x0b,
+ 0xc3, 0x90, 0xc7, 0x86, 0x34, 0x02, 0x04, 0x00, 0xbe, 0xfd, 0x4c, 0xe8,
+ 0x4e, 0xee, 0xbe, 0x09, 0x4d, 0xe8, 0x48, 0xee, 0x81, 0xa6, 0x0a, 0x02,
+ 0xfb, 0x6f, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x40, 0xc6, 0x86, 0x89, 0x02,
+ 0x01, 0xc3, 0xc7, 0x86, 0x34, 0x02, 0x05, 0x00, 0x80, 0xbe, 0xfe, 0x00,
+ 0x02, 0x74, 0x1a, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75,
+ 0x08, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d,
+ 0x01, 0x01, 0xe8, 0x31, 0x3b, 0x81, 0xa6, 0x0a, 0x02, 0xfb, 0x2f, 0x83,
+ 0x8e, 0x0a, 0x02, 0x20, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xe8, 0x5e, 0x01,
+ 0xc3, 0x90, 0xc7, 0x86, 0x34, 0x02, 0x01, 0x00, 0xc3, 0x90, 0xc3, 0x53,
+ 0x50, 0x89, 0x86, 0x22, 0x01, 0x80, 0xbe, 0x62, 0x01, 0x01, 0x75, 0x0f,
+ 0x50, 0xe8, 0x1b, 0xe6, 0xe8, 0xb1, 0x26, 0xc6, 0x46, 0x07, 0x00, 0x58,
+ 0xe9, 0xea, 0x00, 0xf6, 0x86, 0x08, 0x01, 0x01, 0x74, 0x05, 0xe8, 0xfd,
+ 0x27, 0xeb, 0x6c, 0x83, 0xf8, 0x10, 0x75, 0x08, 0x81, 0x8e, 0x1e, 0x01,
+ 0x00, 0x80, 0xeb, 0x5f, 0x83, 0x8e, 0x1e, 0x01, 0x02, 0x8b, 0x9e, 0x0a,
+ 0x02, 0x83, 0xf8, 0x01, 0x75, 0x04, 0x81, 0xcb, 0x00, 0x04, 0x83, 0xf8,
+ 0x0c, 0x75, 0x04, 0x81, 0xcb, 0x00, 0x08, 0x83, 0xf8, 0x0b, 0x75, 0x03,
+ 0x83, 0xcb, 0x02, 0x83, 0xf8, 0x09, 0x75, 0x03, 0x83, 0xcb, 0x04, 0x83,
+ 0xf8, 0x0a, 0x75, 0x09, 0x81, 0xcb, 0x00, 0x01, 0x83, 0x8e, 0x1e, 0x01,
+ 0x04, 0x83, 0xf8, 0x06, 0x75, 0x03, 0x83, 0xcb, 0x01, 0x83, 0xf8, 0x0f,
+ 0x74, 0x19, 0x83, 0xf8, 0x02, 0x75, 0x03, 0x83, 0xcb, 0x08, 0x83, 0xf8,
+ 0x03, 0x75, 0x03, 0x83, 0xcb, 0x08, 0x89, 0x9e, 0x0a, 0x02, 0xc6, 0x86,
+ 0x89, 0x02, 0x01, 0x8a, 0x4e, 0x06, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x72,
+ 0x2e, 0xf7, 0x86, 0x0a, 0x02, 0x08, 0x00, 0x75, 0x1c, 0x80, 0xf9, 0x48,
+ 0x74, 0x11, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x74, 0x10, 0x80, 0xf9, 0x44,
+ 0x74, 0x05, 0x80, 0xf9, 0x46, 0x75, 0x06, 0xc6, 0x46, 0x07, 0x4c, 0xeb,
+ 0x44, 0xc6, 0x46, 0x07, 0x12, 0xc6, 0x46, 0x09, 0x1e, 0xeb, 0x3a, 0xc6,
+ 0x46, 0x07, 0x12, 0xc6, 0x46, 0x09, 0x1e, 0xf6, 0x86, 0xac, 0x02, 0x01,
+ 0x74, 0x1a, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, 0x08,
+ 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01,
+ 0x01, 0xe8, 0x1e, 0x3a, 0xf6, 0x86, 0xaa, 0x02, 0x01, 0x75, 0x02, 0xeb,
+ 0x08, 0xc6, 0x46, 0x07, 0x10, 0xc6, 0x46, 0x09, 0x00, 0x58, 0x5b, 0xc3,
+ 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x40, 0x00, 0x02, 0x00, 0x74, 0x0b,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x40, 0x00, 0xfd, 0xeb, 0x09, 0x8e,
+ 0x46, 0x02, 0x26, 0x83, 0x0e, 0x40, 0x00, 0x02, 0xc3, 0x90, 0xc7, 0x86,
+ 0x32, 0x02, 0x01, 0x00, 0xc3, 0xb9, 0x01, 0x01, 0x38, 0xc8, 0x75, 0x19,
+ 0x8b, 0xb6, 0xf6, 0x00, 0x81, 0xe6, 0x00, 0xc0, 0x81, 0xfe, 0x00, 0x80,
+ 0x75, 0x0b, 0xc6, 0x86, 0x5a, 0x02, 0x01, 0xbe, 0x7f, 0x4c, 0xe8, 0x9f,
+ 0xec, 0xc3, 0xc3, 0x90, 0x50, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x18,
+ 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x74, 0x05, 0xc6, 0x86, 0xfe, 0x00,
+ 0x01, 0xc6, 0x86, 0x95, 0x02, 0x01, 0xe8, 0xbf, 0xee, 0xe8, 0x02, 0x00,
+ 0x58, 0xc3, 0xc7, 0x86, 0x98, 0x02, 0x00, 0x00, 0xc7, 0x86, 0x9a, 0x02,
+ 0x05, 0x00, 0xb8, 0x05, 0x00, 0xe8, 0x1a, 0x00, 0xc7, 0x86, 0xa2, 0x02,
+ 0x05, 0x00, 0xc3, 0x90, 0xc6, 0x86, 0x95, 0x02, 0x00, 0x06, 0x8e, 0x46,
+ 0x02, 0x26, 0x83, 0x26, 0x40, 0x00, 0xdf, 0x07, 0xc3, 0x90, 0x52, 0x53,
+ 0x51, 0xb9, 0x10, 0x27, 0x83, 0xe0, 0x3f, 0x8b, 0xd0, 0xe5, 0x00, 0x50,
+ 0x8b, 0x1e, 0xcc, 0x5d, 0x53, 0xb8, 0xe7, 0x03, 0xf7, 0xe2, 0xf7, 0xf1,
+ 0x5b, 0x03, 0xd8, 0x58, 0x03, 0xc2, 0x3b, 0xc1, 0x72, 0x03, 0x2b, 0xc1,
+ 0x43, 0x8b, 0xcb, 0x41, 0x89, 0x9e, 0x9c, 0x02, 0x89, 0x8e, 0x9e, 0x02,
+ 0x89, 0x86, 0xa0, 0x02, 0x59, 0x5b, 0x5a, 0xc3, 0xa1, 0xcc, 0x5d, 0x3b,
+ 0x86, 0x9e, 0x02, 0x74, 0x0e, 0x3b, 0x86, 0x9c, 0x02, 0x75, 0x0d, 0xe5,
+ 0x00, 0x3b, 0x86, 0xa0, 0x02, 0x72, 0x05, 0xb8, 0x01, 0x00, 0xeb, 0x02,
+ 0x2b, 0xc0, 0x85, 0xc0, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x04, 0x74, 0x0a,
+ 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x75, 0x02, 0xeb, 0x05, 0xb8, 0x01,
+ 0x00, 0xeb, 0x02, 0x2b, 0xc0, 0x85, 0xc0, 0xc3, 0xe8, 0xc1, 0xff, 0x74,
+ 0x1e, 0xb8, 0x02, 0x00, 0xe8, 0x7f, 0xff, 0x8e, 0x46, 0x02, 0x26, 0xa1,
+ 0x54, 0x00, 0x25, 0x24, 0x01, 0x8b, 0xd8, 0x33, 0x86, 0x98, 0x02, 0x75,
+ 0x0a, 0xff, 0x8e, 0xa2, 0x02, 0x74, 0x02, 0xeb, 0x75, 0xeb, 0x23, 0xc7,
+ 0x86, 0xa2, 0x02, 0x05, 0x00, 0x89, 0x9e, 0x98, 0x02, 0xa9, 0x04, 0x00,
+ 0x74, 0x12, 0xf7, 0xc3, 0x04, 0x00, 0x74, 0x07, 0xc6, 0x86, 0x96, 0x02,
+ 0x01, 0xeb, 0x05, 0xc6, 0x86, 0x96, 0x02, 0x00, 0xeb, 0x50, 0x8b, 0x86,
+ 0x98, 0x02, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x40, 0x00, 0x02, 0x00,
+ 0x74, 0x23, 0x25, 0x04, 0x01, 0x3d, 0x04, 0x01, 0x75, 0x38, 0xe8, 0x81,
+ 0xff, 0x74, 0x2a, 0xc6, 0x86, 0xfe, 0x00, 0x01, 0xe8, 0xa9, 0xed, 0xc7,
+ 0x86, 0x98, 0x02, 0x00, 0x00, 0xb8, 0x05, 0x00, 0xe8, 0x0f, 0xff, 0xeb,
+ 0x1d, 0x25, 0x24, 0x01, 0x3d, 0x24, 0x01, 0x75, 0x15, 0xe8, 0x5e, 0xff,
+ 0x74, 0x07, 0xc6, 0x86, 0xfe, 0x00, 0x00, 0xeb, 0xdb, 0xe8, 0xe4, 0xfe,
+ 0xb8, 0x0e, 0x00, 0xe8, 0x4d, 0xfd, 0xc3, 0x90, 0x55, 0x1e, 0x06, 0x33,
+ 0xed, 0x8e, 0xdd, 0x8b, 0x2e, 0xea, 0x5d, 0x8e, 0x46, 0x02, 0xeb, 0x00,
+ 0x60, 0xfa, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x44, 0x00, 0x89, 0x86, 0x18,
+ 0x01, 0xc7, 0x86, 0x1c, 0x01, 0x01, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xa1,
+ 0x46, 0x00, 0x89, 0x86, 0x1a, 0x01, 0xb8, 0x07, 0x00, 0x8e, 0x46, 0x02,
+ 0x26, 0xa3, 0x46, 0x00, 0xb8, 0xff, 0xff, 0x8e, 0x46, 0x02, 0x26, 0xa3,
+ 0x44, 0x00, 0xfb, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x48, 0x00, 0x8b, 0xd8,
+ 0x81, 0xe3, 0xff, 0xfc, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x48, 0x00,
+ 0x8e, 0x46, 0x02, 0x26, 0x8b, 0x1e, 0x4a, 0x00, 0x8e, 0x46, 0x02, 0x26,
+ 0x89, 0x1e, 0x4a, 0x00, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58, 0xa9, 0x00,
+ 0x08, 0x74, 0x0f, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x74, 0x05, 0xe8, 0x6b,
+ 0x36, 0xeb, 0x03, 0xe8, 0xe8, 0x30, 0xa9, 0x00, 0x01, 0x75, 0x22, 0xf7,
+ 0x86, 0xa8, 0x02, 0x01, 0x00, 0x75, 0x21, 0xa9, 0xcd, 0x01, 0x74, 0x1c,
+ 0x80, 0xbe, 0x6a, 0x01, 0x0a, 0x72, 0x0e, 0xc7, 0x86, 0xa8, 0x02, 0x01,
+ 0x00, 0x81, 0x8e, 0x18, 0x01, 0xcd, 0x00, 0xeb, 0x07, 0xfe, 0x86, 0x6a,
+ 0x01, 0xe8, 0xec, 0x32, 0xa9, 0x00, 0x04, 0x74, 0x29, 0xf7, 0x86, 0x0a,
+ 0x01, 0x01, 0x00, 0x75, 0x21, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x44,
+ 0x00, 0x00, 0x04, 0xe8, 0x8b, 0xe8, 0xc7, 0x44, 0x02, 0x01, 0x00, 0x89,
+ 0x44, 0x04, 0xc7, 0x86, 0x0a, 0x01, 0x01, 0x00, 0x8d, 0x7e, 0x16, 0xe8,
+ 0x95, 0xe8, 0xa9, 0x00, 0x10, 0x74, 0x27, 0x80, 0xbe, 0x0c, 0x01, 0x01,
+ 0x74, 0x20, 0xf6, 0x86, 0xb8, 0x01, 0x01, 0x75, 0x19, 0xe8, 0x61, 0xe8,
+ 0xf7, 0xc6, 0xff, 0xff, 0x74, 0x10, 0xc7, 0x44, 0x02, 0x03, 0x00, 0xc6,
+ 0x86, 0xb8, 0x01, 0x01, 0x8d, 0x7e, 0x16, 0xe8, 0x69, 0xe8, 0xa9, 0x00,
+ 0x20, 0x74, 0x61, 0x80, 0xbe, 0x0c, 0x01, 0x01, 0x75, 0x07, 0xc6, 0x86,
+ 0x0d, 0x01, 0x01, 0xeb, 0x53, 0x50, 0x26, 0xa1, 0x78, 0x00, 0x26, 0x8b,
+ 0x1e, 0x70, 0x00, 0x3b, 0xc3, 0x77, 0x10, 0x2b, 0x86, 0xa8, 0x15, 0x8b,
+ 0xc8, 0x8b, 0x86, 0xaa, 0x15, 0x2b, 0xc3, 0x03, 0xc1, 0xeb, 0x02, 0x2b,
+ 0xc3, 0x3d, 0x00, 0x02, 0x77, 0x0d, 0xe8, 0xe9, 0xef, 0xc6, 0x86, 0xbc,
+ 0x01, 0x01, 0x83, 0x8e, 0xe6, 0x02, 0x40, 0x58, 0xf6, 0x86, 0xb9, 0x01,
+ 0x01, 0x75, 0x19, 0xe8, 0xfb, 0xe7, 0xf7, 0xc6, 0xff, 0xff, 0x74, 0x10,
+ 0xc7, 0x44, 0x02, 0x04, 0x00, 0xc6, 0x86, 0xb9, 0x01, 0x01, 0x8d, 0x7e,
+ 0x16, 0xe8, 0x03, 0xe8, 0xfa, 0x8b, 0x86, 0x18, 0x01, 0x8e, 0x46, 0x02,
+ 0x26, 0xa3, 0x44, 0x00, 0xc7, 0x86, 0x1c, 0x01, 0x00, 0x00, 0x8b, 0x86,
+ 0x1a, 0x01, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x46, 0x00, 0x61, 0x07, 0x1f,
+ 0x5d, 0xcf, 0x50, 0x25, 0x00, 0x02, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x48,
+ 0x00, 0x8b, 0x86, 0xcc, 0x02, 0x40, 0x89, 0x86, 0xcc, 0x02, 0x83, 0xf8,
+ 0x01, 0x75, 0x08, 0x56, 0xbe, 0xd3, 0x4c, 0xe8, 0x8a, 0xe9, 0x5e, 0x3b,
+ 0x86, 0xc8, 0x01, 0x76, 0x0a, 0x80, 0xbe, 0x65, 0x02, 0x01, 0x74, 0x03,
+ 0xe8, 0xc1, 0x32, 0x58, 0xc3, 0x8d, 0x71, 0x18, 0x8b, 0x49, 0x14, 0x86,
+ 0xcd, 0x83, 0xe9, 0x04, 0x7e, 0x1b, 0x33, 0xc0, 0x03, 0xf0, 0x8a, 0x04,
+ 0x0a, 0xc0, 0x74, 0x11, 0x3a, 0x54, 0x01, 0x74, 0x17, 0x32, 0xe4, 0x3c,
+ 0xff, 0x74, 0x0a, 0x2b, 0xc8, 0x72, 0x02, 0x77, 0xe7, 0x33, 0xc0, 0xf9,
+ 0xc3, 0x8b, 0x44, 0x02, 0x86, 0xc4, 0xeb, 0xef, 0x0a, 0xe4, 0x75, 0xf1,
+ 0x38, 0xf0, 0x75, 0xed, 0x8d, 0x74, 0x02, 0xf8, 0xc3, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0x8b, 0xb6, 0xa8, 0x15, 0x8b, 0xbe, 0xaa, 0x15, 0x47, 0xa5, 0xa5,
+ 0xa5, 0x8b, 0x4f, 0x04, 0x83, 0xc1, 0x07, 0x80, 0xe1, 0xfe, 0x8b, 0xc7,
+ 0x2b, 0xc3, 0x2b, 0xc8, 0x76, 0x0a, 0x81, 0xf9, 0x00, 0x01, 0x73, 0x09,
+ 0xd1, 0xe9, 0xf3, 0xa5, 0x8b, 0x07, 0xe9, 0xd1, 0x01, 0xb9, 0x19, 0x00,
+ 0xf3, 0xa5, 0x33, 0xff, 0xf6, 0x47, 0x0e, 0x80, 0x74, 0x0e, 0x8b, 0x47,
+ 0x14, 0x83, 0xe0, 0x1f, 0x74, 0x0f, 0xa8, 0x01, 0x75, 0x0b, 0x8b, 0xf8,
+ 0xba, 0x80, 0x09, 0x68, 0x45, 0x29, 0xe9, 0xa3, 0x05, 0xe9, 0xd9, 0x02,
+ 0xc3, 0x80, 0x7f, 0x17, 0x02, 0x75, 0xf9, 0x50, 0x56, 0x8b, 0xb6, 0x1a,
+ 0x06, 0x8b, 0x04, 0x5e, 0x3b, 0x86, 0xc6, 0x01, 0x74, 0x07, 0x89, 0x86,
+ 0xc6, 0x01, 0x58, 0xeb, 0x3d, 0x58, 0xeb, 0x12, 0x8a, 0x4f, 0x07, 0x80,
+ 0xe1, 0x3f, 0x74, 0xd8, 0x8a, 0xe9, 0x86, 0x8e, 0xfe, 0x01, 0x38, 0xcd,
+ 0x75, 0x18, 0x57, 0x51, 0x8d, 0xbe, 0x00, 0x02, 0x8d, 0x77, 0x0e, 0x8c,
+ 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x06, 0x59, 0x5f,
+ 0xeb, 0xb6, 0x57, 0x51, 0x8d, 0xbe, 0x00, 0x02, 0x8d, 0x77, 0x0e, 0xb9,
+ 0x03, 0x00, 0xf3, 0xa5, 0x59, 0x5f, 0xeb, 0x0d, 0x8b, 0x7e, 0x04, 0x58,
+ 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x01, 0x00, 0x74, 0xf7, 0x80, 0x7e, 0x06,
+ 0x0e, 0x74, 0x08, 0x80, 0x7e, 0x06, 0x48, 0x74, 0x02, 0xeb, 0xe9, 0x50,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0x8b, 0x07, 0xa9, 0x00, 0x40, 0x75, 0xdc, 0x0d,
+ 0x00, 0x40, 0x89, 0x07, 0xe8, 0x8a, 0x00, 0x8b, 0x4f, 0x04, 0x83, 0xc1,
+ 0x03, 0x80, 0xe1, 0xfe, 0x89, 0x7e, 0x04, 0x8b, 0xbe, 0xc2, 0x01, 0x3b,
+ 0xfe, 0x72, 0x11, 0x8d, 0x86, 0xa8, 0x08, 0x05, 0xff, 0x00, 0x2b, 0xc7,
+ 0x3b, 0xc1, 0x7d, 0x0a, 0x8d, 0xbe, 0xa8, 0x08, 0x2b, 0xf7, 0x3b, 0xf1,
+ 0x7c, 0xa6, 0x8b, 0xd7, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8b, 0xf3,
+ 0xd1, 0xe9, 0x83, 0xc7, 0x02, 0x49, 0xad, 0xf3, 0xa5, 0x8b, 0xcf, 0xc7,
+ 0x05, 0x00, 0x00, 0x8b, 0xfa, 0x89, 0x4d, 0x02, 0x51, 0x8b, 0x4d, 0x04,
+ 0x83, 0xe9, 0x04, 0x89, 0x4d, 0x04, 0x59, 0x89, 0x05, 0x8d, 0x86, 0xa8,
+ 0x08, 0x3b, 0xf8, 0x75, 0x0e, 0x8b, 0x86, 0xc0, 0x01, 0x3b, 0x86, 0xc2,
+ 0x01, 0x75, 0x1c, 0x89, 0xbe, 0xc0, 0x01, 0x89, 0x8e, 0xc2, 0x01, 0x8b,
+ 0x7e, 0x04, 0xc7, 0x86, 0xc4, 0x01, 0x00, 0x00, 0xb9, 0x40, 0x60, 0x8e,
+ 0xc1, 0xe8, 0x2b, 0x23, 0xe9, 0x4d, 0xff, 0x97, 0x89, 0x45, 0x02, 0xeb,
+ 0xe2, 0x8b, 0xb6, 0xc0, 0x01, 0xf7, 0x86, 0xc4, 0x01, 0x01, 0x00, 0x75,
+ 0x0f, 0x81, 0x3c, 0x00, 0x80, 0x75, 0x05, 0x8b, 0x74, 0x02, 0xeb, 0xf5,
+ 0x89, 0xb6, 0xc0, 0x01, 0xc3, 0xf7, 0x07, 0x01, 0x09, 0x74, 0x03, 0xe9,
+ 0x9f, 0x01, 0xf7, 0x07, 0x00, 0x10, 0x75, 0x34, 0x68, 0x16, 0x28, 0xe9,
+ 0x0e, 0x27, 0xa8, 0x02, 0x74, 0x22, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x1c,
+ 0x80, 0xbe, 0x62, 0x02, 0x00, 0x74, 0x15, 0x24, 0x28, 0x3c, 0x28, 0x75,
+ 0x0f, 0xf6, 0x47, 0x0e, 0x80, 0x75, 0x64, 0x81, 0x8e, 0xe6, 0x02, 0x80,
+ 0x00, 0xeb, 0x5c, 0x90, 0xeb, 0x59, 0xe9, 0x38, 0xfe, 0x90, 0xeb, 0xd2,
+ 0xeb, 0x34, 0x8b, 0x47, 0x14, 0x83, 0xe0, 0x1f, 0x74, 0x06, 0xa8, 0x01,
+ 0x8b, 0xf8, 0x74, 0x4b, 0xe9, 0x52, 0x01, 0x50, 0x8b, 0x9e, 0xb2, 0x01,
+ 0x8b, 0x07, 0xa9, 0x00, 0x80, 0x75, 0x02, 0x58, 0xc3, 0xa9, 0x00, 0x20,
+ 0x74, 0x0b, 0xff, 0x86, 0x40, 0x02, 0x8b, 0x4f, 0x04, 0x01, 0x8e, 0x42,
+ 0x02, 0xe8, 0xd0, 0x03, 0x75, 0xc4, 0xf7, 0x86, 0xb6, 0x01, 0x00, 0x02,
+ 0x75, 0x11, 0xa9, 0x01, 0x09, 0x75, 0x40, 0x80, 0x7e, 0x07, 0x10, 0x74,
+ 0x3a, 0x80, 0x7e, 0x07, 0x12, 0x74, 0x34, 0xa8, 0x28, 0x75, 0xab, 0x33,
+ 0xff, 0xf6, 0x47, 0x0e, 0x80, 0x75, 0xa7, 0x8b, 0x47, 0x04, 0x83, 0xf8,
+ 0x12, 0x77, 0x05, 0x33, 0xc0, 0xe9, 0xd7, 0x01, 0x83, 0xe8, 0x12, 0x2b,
+ 0xc7, 0x83, 0xf8, 0x04, 0x7c, 0x38, 0x8b, 0x49, 0x16, 0x88, 0xae, 0x08,
+ 0x02, 0x51, 0x80, 0xe1, 0xf0, 0x80, 0xf9, 0x00, 0x74, 0x04, 0x59, 0xe9,
+ 0xdf, 0x00, 0x59, 0x0b, 0xff, 0x74, 0x0f, 0xf6, 0xc1, 0x0f, 0x74, 0xf3,
+ 0x80, 0xf9, 0x33, 0x74, 0xee, 0x80, 0xf9, 0x03, 0x74, 0xe9, 0x86, 0xc4,
+ 0x39, 0x41, 0x14, 0x86, 0xc4, 0x75, 0x03, 0xeb, 0x0d, 0x90, 0xe9, 0x91,
+ 0x01, 0x90, 0xe9, 0x92, 0x01, 0x90, 0xe9, 0x9a, 0x01, 0x90, 0xf6, 0x86,
+ 0x95, 0x02, 0x01, 0x74, 0x11, 0xe8, 0x50, 0xfa, 0x80, 0x7e, 0x06, 0x04,
+ 0x75, 0x08, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xe8, 0xe2, 0xe8, 0xf6, 0x86,
+ 0x97, 0x02, 0x01, 0x74, 0x28, 0xc6, 0x86, 0x97, 0x02, 0x00, 0xf7, 0x86,
+ 0xf8, 0x00, 0x00, 0x01, 0x74, 0x09, 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x74,
+ 0x14, 0xeb, 0x07, 0x80, 0xbe, 0xfe, 0x00, 0x00, 0x74, 0x0b, 0xb8, 0x0e,
+ 0x00, 0xe8, 0x87, 0xf8, 0xeb, 0x6f, 0xe9, 0x52, 0x01, 0x80, 0xfd, 0x17,
+ 0x77, 0x11, 0x80, 0xfd, 0x01, 0x74, 0xab, 0x80, 0xfd, 0x09, 0x74, 0xa6,
+ 0x80, 0xfd, 0x0a, 0x74, 0xa1, 0xeb, 0x12, 0x80, 0xfd, 0x20, 0x72, 0xe2,
+ 0x80, 0xfd, 0x29, 0x77, 0xdd, 0x80, 0xfd, 0x21, 0x74, 0xd8, 0xe9, 0x62,
+ 0xff, 0x80, 0xfd, 0x10, 0x76, 0x02, 0xeb, 0x05, 0x80, 0xfd, 0x0e, 0x73,
+ 0x1d, 0x53, 0x8b, 0xd9, 0xc1, 0xeb, 0x08, 0x80, 0xe1, 0x0f, 0x3a, 0x8f,
+ 0x78, 0x04, 0x74, 0x23, 0x83, 0xfb, 0x0b, 0x74, 0x19, 0x83, 0xfb, 0x0c,
+ 0x74, 0x14, 0x5b, 0xe9, 0xfa, 0x00, 0x80, 0xe1, 0x0f, 0x80, 0xf9, 0x00,
+ 0x74, 0xf5, 0x80, 0xf9, 0x03, 0x74, 0xf0, 0xe9, 0xa1, 0x01, 0x80, 0xf9,
+ 0x08, 0x75, 0xe7, 0x5b, 0xe9, 0x98, 0x01, 0x5b, 0x5f, 0x8b, 0x9e, 0xb2,
+ 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x01, 0x00, 0x74, 0x28, 0x80, 0x7e, 0x06,
+ 0x0e, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x48, 0x75, 0x1c, 0xf7, 0x86, 0x12,
+ 0x01, 0x00, 0x08, 0x74, 0x06, 0x68, 0x79, 0x29, 0xe9, 0x21, 0xfd, 0xf7,
+ 0x86, 0x12, 0x01, 0x80, 0x00, 0x74, 0x06, 0x68, 0x79, 0x29, 0xe9, 0xf4,
+ 0xfc, 0x8b, 0x5f, 0x02, 0x89, 0x9e, 0xb2, 0x01, 0x8b, 0xc3, 0x83, 0xe8,
+ 0x02, 0x3b, 0x86, 0xa8, 0x15, 0x77, 0x04, 0x8b, 0x86, 0xaa, 0x15, 0x8e,
+ 0x46, 0x02, 0x53, 0x26, 0x8b, 0x1e, 0x78, 0x00, 0x81, 0x7f, 0xfc, 0xde,
+ 0xad, 0x75, 0x07, 0x81, 0x7f, 0xfe, 0xbe, 0xaf, 0x74, 0x05, 0xc6, 0x86,
+ 0xbd, 0x01, 0x01, 0x5b, 0x26, 0xa3, 0x78, 0x00, 0x26, 0xa1, 0x78, 0x00,
+ 0x93, 0xc7, 0x47, 0xfc, 0xde, 0xad, 0xc7, 0x47, 0xfe, 0xbe, 0xaf, 0x93,
+ 0xfa, 0x8b, 0x07, 0xa9, 0x00, 0x80, 0x74, 0x17, 0xfb, 0xff, 0x86, 0x3c,
+ 0x01, 0x83, 0xbe, 0x3c, 0x01, 0x05, 0x77, 0x2b, 0x8a, 0x4e, 0x09, 0x3a,
+ 0x4e, 0x08, 0x75, 0x23, 0xe9, 0x22, 0xfe, 0xc6, 0x86, 0xb9, 0x01, 0x00,
+ 0xfb, 0xf6, 0x86, 0xbc, 0x01, 0x01, 0x74, 0x08, 0xc6, 0x86, 0xbc, 0x01,
+ 0x00, 0xe8, 0x2f, 0xeb, 0xc7, 0x86, 0x3c, 0x01, 0x00, 0x00, 0x58, 0xc3,
+ 0xe9, 0x46, 0xff, 0xe8, 0x63, 0xe3, 0xf7, 0xc6, 0xff, 0xff, 0x74, 0xd7,
+ 0xc7, 0x44, 0x02, 0x04, 0x00, 0xc6, 0x86, 0xb9, 0x01, 0x01, 0x8d, 0x7e,
+ 0x16, 0xe8, 0x6b, 0xe3, 0xeb, 0xcb, 0xba, 0x80, 0x02, 0xeb, 0x1d, 0xba,
+ 0x80, 0x01, 0xeb, 0x18, 0xba, 0x80, 0x04, 0xeb, 0x13, 0x5f, 0x5b, 0xf7,
+ 0x86, 0x12, 0x01, 0x00, 0x10, 0x74, 0x06, 0x68, 0x79, 0x29, 0xe9, 0x94,
+ 0xfc, 0xba, 0x80, 0x03, 0x33, 0xc0, 0x8e, 0xc0, 0x68, 0x45, 0x29, 0xe9,
+ 0xc6, 0x01, 0x33, 0xd2, 0x32, 0xed, 0x8a, 0x4d, 0xff, 0x89, 0x55, 0x02,
+ 0x83, 0xc7, 0x05, 0xe2, 0xf8, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x74, 0x38,
+ 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x0b, 0xc6, 0x46, 0x09, 0x04, 0xc6, 0x86,
+ 0x63, 0x02, 0x00, 0xeb, 0x24, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x21, 0xc6,
+ 0x86, 0x63, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x01, 0xe8, 0x0c, 0xe7,
+ 0xbe, 0x9d, 0x4c, 0xe8, 0xc6, 0xe4, 0x50, 0x53, 0x33, 0xc0, 0x8e, 0xc0,
+ 0xe8, 0x47, 0x02, 0x5b, 0x58, 0xbb, 0x00, 0x00, 0x8b, 0xf8, 0x8b, 0xf3,
+ 0x5b, 0x57, 0x53, 0x68, 0x43, 0x29, 0xff, 0x66, 0x12, 0xeb, 0x87, 0x8b,
+ 0xc7, 0x8b, 0xbf, 0x90, 0x04, 0x0b, 0xff, 0x78, 0xf4, 0x74, 0xa6, 0x03,
+ 0xfd, 0xf6, 0x45, 0x01, 0x80, 0x75, 0x02, 0xeb, 0x8d, 0xe9, 0x21, 0x01,
+ 0xe9, 0x03, 0x01, 0x5f, 0x5b, 0xba, 0x80, 0x08, 0xe9, 0x75, 0xff, 0x8b,
+ 0x54, 0x02, 0x86, 0xd6, 0x83, 0xc6, 0x02, 0xb0, 0x04, 0xeb, 0x51, 0x5f,
+ 0x5b, 0xba, 0x80, 0x05, 0xe9, 0x61, 0xff, 0x53, 0x8d, 0x71, 0x18, 0x32,
+ 0xff, 0x8a, 0xdd, 0xd1, 0xe3, 0x83, 0xe8, 0x04, 0x0b, 0xc0, 0x74, 0xb7,
+ 0x89, 0x46, 0x04, 0x57, 0x8b, 0xbf, 0x90, 0x04, 0x0b, 0xff, 0x74, 0xc4,
+ 0x79, 0x03, 0xe9, 0x2c, 0xff, 0x03, 0xfd, 0x8e, 0xc7, 0x33, 0xc0, 0x32,
+ 0xed, 0x8a, 0x4d, 0xff, 0x89, 0x45, 0x02, 0x83, 0xc7, 0x05, 0xe2, 0xf8,
+ 0x33, 0xd2, 0x03, 0xf2, 0x8a, 0x4c, 0x01, 0x8a, 0x14, 0x0a, 0xd2, 0x74,
+ 0xb6, 0x80, 0xfa, 0xff, 0x74, 0xa5, 0xb0, 0x02, 0x29, 0x56, 0x04, 0x72,
+ 0xaa, 0x0a, 0xc9, 0x78, 0x92, 0x8a, 0xe1, 0x80, 0xe1, 0x3f, 0x8c, 0xc7,
+ 0x8a, 0x6d, 0xff, 0xeb, 0x12, 0x80, 0x7d, 0x04, 0xff, 0x74, 0x15, 0xeb,
+ 0x92, 0xe9, 0x7b, 0xff, 0xfe, 0xcd, 0x74, 0xf9, 0x83, 0xc7, 0x05, 0x3a,
+ 0x0d, 0x75, 0xf5, 0x3a, 0x55, 0x04, 0x75, 0xe5, 0x8d, 0x44, 0x02, 0x87,
+ 0x45, 0x02, 0x0b, 0xc0, 0x74, 0x09, 0xf6, 0x45, 0x01, 0x80, 0x75, 0xdd,
+ 0x89, 0x45, 0x02, 0x83, 0x7e, 0x04, 0x00, 0x75, 0xa5, 0x33, 0xc0, 0x8c,
+ 0xc6, 0xf6, 0x44, 0x01, 0x80, 0x74, 0x0e, 0x39, 0x44, 0x02, 0x74, 0x60,
+ 0x83, 0xc6, 0x05, 0xf6, 0x44, 0x01, 0x80, 0x75, 0xf2, 0xf6, 0x86, 0x63,
+ 0x02, 0x01, 0x74, 0x36, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x0b, 0xc6, 0x86,
+ 0x63, 0x02, 0x00, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0x22, 0x80, 0x7e, 0x08,
+ 0x06, 0x75, 0x1f, 0xc6, 0x86, 0x63, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02,
+ 0x01, 0xe8, 0xdc, 0xe5, 0xbe, 0x9d, 0x4c, 0xe8, 0x96, 0xe3, 0x33, 0xc0,
+ 0x8e, 0xc0, 0x53, 0xe8, 0x18, 0x01, 0x5b, 0xbb, 0x00, 0x00, 0x89, 0x5e,
+ 0x04, 0x8b, 0xf3, 0x5f, 0x5b, 0x33, 0xc0, 0x8e, 0xc0, 0x3b, 0xb6, 0xba,
+ 0x01, 0x73, 0x06, 0x68, 0x45, 0x29, 0xff, 0x66, 0x12, 0xe9, 0x69, 0xfd,
+ 0x5f, 0x5b, 0xba, 0x80, 0x07, 0xe9, 0x58, 0xfe, 0x56, 0x57, 0x50, 0x33,
+ 0xc0, 0x8e, 0xc0, 0x8b, 0xb6, 0xa8, 0x15, 0x8b, 0xbe, 0xaa, 0x15, 0x83,
+ 0xc7, 0x01, 0xa5, 0xa5, 0xa5, 0x8b, 0xc3, 0x03, 0x47, 0x04, 0x8b, 0xbe,
+ 0xaa, 0x15, 0x3b, 0xc7, 0x7f, 0x02, 0x32, 0xc0, 0x58, 0x5f, 0x5e, 0xc3,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xf6, 0x41, 0x16, 0x0f, 0x74, 0x60, 0x89, 0x96,
+ 0xee, 0x02, 0x81, 0xfa, 0x80, 0x02, 0x74, 0x13, 0xba, 0x09, 0x04, 0xe8,
+ 0xaf, 0xf9, 0x72, 0x0b, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x18, 0x02, 0x86,
+ 0xe0, 0xeb, 0x06, 0x8b, 0x86, 0x18, 0x02, 0x86, 0xe0, 0x89, 0x86, 0xea,
+ 0x02, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x4d, 0x22, 0x57, 0x53, 0xe8, 0x2b,
+ 0x06, 0x5a, 0x5f, 0x72, 0x29, 0x57, 0xe8, 0x26, 0x00, 0xb8, 0x00, 0x0e,
+ 0xab, 0x47, 0xb0, 0x00, 0xaa, 0x8d, 0xb6, 0xe8, 0x02, 0xa5, 0xa5, 0x8d,
+ 0xb6, 0xec, 0x02, 0xa5, 0xa5, 0x55, 0x8b, 0xea, 0x8a, 0x47, 0x16, 0x8a,
+ 0x66, 0x17, 0xab, 0x5d, 0xe8, 0xa1, 0x06, 0x8b, 0xda, 0x5f, 0xc3, 0x55,
+ 0x8b, 0xea, 0x8a, 0x43, 0x16, 0xc0, 0xe0, 0x04, 0x88, 0x41, 0x16, 0xc7,
+ 0x47, 0x06, 0xe0, 0x00, 0x83, 0xe9, 0x06, 0x89, 0x4f, 0x04, 0x0b, 0xff,
+ 0x75, 0x18, 0x8d, 0x76, 0x0e, 0x8d, 0x7f, 0x08, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0xa5, 0xa5, 0xa5, 0x8b, 0xd5, 0x5d, 0x8d, 0xb6, 0x00, 0x03, 0xa5, 0xa5,
+ 0xa5, 0xc3, 0x8b, 0xcf, 0xd1, 0xe9, 0x8d, 0x76, 0x0e, 0x8d, 0x7f, 0x08,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xad, 0x24, 0x7f, 0xab, 0xa5, 0xa5, 0x8b, 0xd5,
+ 0x5d, 0x56, 0x8d, 0xb6, 0x00, 0x03, 0xad, 0x0c, 0x80, 0xab, 0xa5, 0xa5,
+ 0x5e, 0xad, 0x80, 0xcc, 0x80, 0xab, 0x49, 0xf3, 0xa5, 0xc3, 0x8b, 0x86,
+ 0x0c, 0x03, 0x86, 0xe0, 0x89, 0x86, 0x14, 0x02, 0x89, 0x86, 0x06, 0x02,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xbe, 0x00, 0x02, 0x8d, 0xb6, 0x00, 0x03,
+ 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0xb9, 0x2a, 0x00, 0xe8, 0x5f, 0x05, 0x72,
+ 0xd8, 0x8d, 0xb6, 0xf2, 0x02, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1,
+ 0xe9, 0xf3, 0xa5, 0xe9, 0x0d, 0x06, 0xeb, 0x6a, 0xb9, 0x26, 0x00, 0xe8,
+ 0x44, 0x05, 0x72, 0xf6, 0x8d, 0xb6, 0x1c, 0x03, 0x8b, 0xfb, 0x8c, 0xd8,
+ 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0xf2, 0x05, 0x8d, 0x7f, 0x08,
+ 0x8b, 0x4f, 0x04, 0x83, 0xc1, 0x03, 0x80, 0xe1, 0xfe, 0x57, 0xe8, 0x21,
+ 0x05, 0x5f, 0x8b, 0xd7, 0x72, 0x22, 0x83, 0xe9, 0x08, 0x8d, 0x7f, 0x04,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0x8b, 0xc1, 0xab, 0x8b, 0x86, 0x22, 0x03, 0xab,
+ 0x8b, 0xf2, 0xd1, 0xe9, 0x49, 0xf3, 0xa5, 0xbe, 0x79, 0x4c, 0xe8, 0xef,
+ 0xe1, 0xe9, 0xbb, 0x05, 0xc3, 0xb9, 0x26, 0x00, 0xe8, 0xf3, 0x04, 0x72,
+ 0x11, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xb6, 0x42, 0x03, 0x8b, 0xfb, 0xd1,
+ 0xe9, 0xf3, 0xa5, 0xe9, 0xa1, 0x05, 0xc3, 0xb9, 0x26, 0x00, 0xe8, 0xf3,
+ 0x04, 0x72, 0xf7, 0x8d, 0xb6, 0x68, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xc6, 0x86, 0x67, 0x02, 0x01, 0x80, 0xbe,
+ 0x87, 0x02, 0x01, 0x75, 0x03, 0xe9, 0x74, 0x05, 0x68, 0xc9, 0x31, 0xe9,
+ 0x6e, 0x05, 0xb9, 0x26, 0x00, 0xe8, 0xc8, 0x04, 0x72, 0xcc, 0x8d, 0xb6,
+ 0x8e, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5,
+ 0xc6, 0x86, 0x67, 0x02, 0x01, 0x80, 0xbe, 0x87, 0x02, 0x01, 0x75, 0x03,
+ 0xe9, 0x49, 0x05, 0x68, 0xc9, 0x31, 0xe9, 0x43, 0x05, 0xb9, 0x18, 0x00,
+ 0xe8, 0x9d, 0x04, 0x72, 0xa1, 0x8d, 0xb6, 0xb4, 0x03, 0x8b, 0xfb, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x2a, 0x05, 0x83, 0xc1,
+ 0x1c, 0x56, 0x57, 0x52, 0xe8, 0x81, 0x04, 0x5a, 0x5f, 0x5e, 0x72, 0x53,
+ 0x56, 0x8c, 0xd8, 0x8e, 0xc0, 0x83, 0xe9, 0x08, 0x8b, 0xc1, 0x8d, 0x7f,
+ 0x04, 0xab, 0xba, 0xe0, 0x00, 0x8b, 0xc2, 0xab, 0x8d, 0xb6, 0xd4, 0x03,
+ 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0x00, 0x03, 0x80, 0xbe, 0x62, 0x01, 0x01,
+ 0x75, 0x04, 0x8d, 0xb6, 0x00, 0x01, 0xa5, 0xa5, 0xa5, 0x83, 0xe9, 0x0e,
+ 0x80, 0xbe, 0x63, 0x01, 0x02, 0x75, 0x03, 0x83, 0xe9, 0x04, 0x8b, 0xc1,
+ 0x86, 0xe0, 0xab, 0xb8, 0x00, 0x08, 0xab, 0x83, 0xe9, 0x04, 0xb8, 0xff,
+ 0x26, 0xab, 0x8b, 0xc1, 0x86, 0xe0, 0xab, 0x5e, 0xe9, 0xc9, 0x04, 0xeb,
+ 0x69, 0xf6, 0x86, 0x8b, 0x02, 0x01, 0x75, 0x03, 0xe9, 0xfb, 0x04, 0x83,
+ 0xc1, 0x1a, 0x57, 0x52, 0xe8, 0x15, 0x04, 0x5a, 0x5f, 0x72, 0x53, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0x83, 0xe9, 0x08, 0x8b, 0xc1, 0x8d, 0x7f, 0x04, 0xab,
+ 0xb9, 0x07, 0x00, 0x8d, 0xb6, 0xec, 0x03, 0xf3, 0xa5, 0x83, 0xe8, 0x0e,
+ 0x8b, 0xc8, 0x86, 0xe0, 0xab, 0xb8, 0x00, 0x08, 0xab, 0x83, 0xe9, 0x04,
+ 0x8b, 0xc1, 0xb4, 0x26, 0xab, 0xbe, 0x80, 0x03, 0xb9, 0x23, 0x00, 0xf3,
+ 0xa5, 0xc6, 0x86, 0x8b, 0x02, 0x00, 0xe9, 0x77, 0x04, 0xb9, 0x44, 0x00,
+ 0xe8, 0xd1, 0x03, 0x72, 0x11, 0x8d, 0xb6, 0x00, 0x04, 0x8b, 0xfb, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe8, 0x5e, 0x04, 0xc3, 0xb9,
+ 0x36, 0x00, 0xe8, 0xb7, 0x03, 0x72, 0xf7, 0xff, 0x86, 0x56, 0x02, 0x8d,
+ 0xb6, 0xd2, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3,
+ 0xa5, 0x33, 0xc0, 0x8d, 0xbe, 0xec, 0x05, 0xab, 0xab, 0xaa, 0x8d, 0xbe,
+ 0xf4, 0x05, 0xab, 0xab, 0xaa, 0xe9, 0x30, 0x04, 0x8d, 0x4d, 0x3a, 0x57,
+ 0x53, 0xe8, 0x88, 0x03, 0x5a, 0x5f, 0x72, 0x5b, 0x57, 0xe8, 0x83, 0xfd,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xb8, 0x00, 0x26, 0xab, 0x47, 0xb0, 0x22, 0xaa,
+ 0x8d, 0xb6, 0xe8, 0x02, 0xa5, 0xa5, 0x8d, 0xb6, 0x0e, 0x03, 0xa5, 0xa5,
+ 0xa5, 0x8d, 0xb6, 0x14, 0x03, 0xa5, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0x44,
+ 0x04, 0xa5, 0xa5, 0x8d, 0xb6, 0x48, 0x04, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6,
+ 0x4e, 0x04, 0xa5, 0x53, 0x8c, 0xdb, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x66,
+ 0x00, 0xe8, 0x15, 0xdd, 0x8e, 0xc3, 0xab, 0x8e, 0x46, 0x02, 0x26, 0xa1,
+ 0x64, 0x00, 0xe8, 0x08, 0xdd, 0x8e, 0xc3, 0xab, 0x5b, 0xe8, 0xcc, 0x03,
+ 0x8b, 0xda, 0x5f, 0xc3, 0x8d, 0x4d, 0x38, 0x57, 0x53, 0xe8, 0x20, 0x03,
+ 0x5a, 0x5f, 0x72, 0xf3, 0x57, 0xe8, 0x1b, 0xfd, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0xb8, 0x00, 0x24, 0xab, 0x47, 0xb0, 0x23, 0xaa, 0x8d, 0xb6, 0xe8, 0x02,
+ 0xa5, 0xa5, 0x8d, 0xb6, 0x18, 0x04, 0xb9, 0x06, 0x00, 0xf3, 0xa5, 0x8d,
+ 0xb6, 0x5c, 0x04, 0xa5, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0x54, 0x04, 0xa5,
+ 0xa5, 0xa5, 0xa5, 0xe8, 0x8a, 0x03, 0x8b, 0xda, 0x5f, 0xc3, 0x8d, 0x4d,
+ 0x3e, 0x57, 0x53, 0xe8, 0xde, 0x02, 0x5a, 0x5f, 0x72, 0x64, 0x57, 0xe8,
+ 0xd9, 0xfc, 0x8c, 0xd8, 0x8e, 0xc0, 0xb8, 0x00, 0x2a, 0xab, 0x47, 0xb0,
+ 0x24, 0xaa, 0x8d, 0xb6, 0xe8, 0x02, 0xa5, 0xa5, 0x8d, 0xb6, 0x2c, 0x04,
+ 0xb9, 0x0a, 0x00, 0xf3, 0xa5, 0x8d, 0xb6, 0x4e, 0x04, 0xa5, 0x53, 0x8c,
+ 0xdb, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x66, 0x00, 0xe8, 0x7e, 0xdc, 0x8e,
+ 0xc3, 0xab, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x64, 0x00, 0xe8, 0x71, 0xdc,
+ 0x8e, 0xc3, 0xab, 0x5b, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xb6, 0x64, 0x04,
+ 0xa5, 0x8b, 0x86, 0xfc, 0x01, 0x86, 0xc4, 0xab, 0x8d, 0xb6, 0x68, 0x04,
+ 0xa5, 0x8b, 0x86, 0xfa, 0x01, 0x86, 0xc4, 0xab, 0xe8, 0x19, 0x03, 0x8b,
+ 0xda, 0x5f, 0xc3, 0xb9, 0x3a, 0x00, 0xe8, 0x6f, 0x02, 0x72, 0xf7, 0x8d,
+ 0xb6, 0x6c, 0x04, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3,
+ 0xa5, 0x80, 0xbe, 0x87, 0x02, 0x01, 0x75, 0x03, 0xe9, 0xf5, 0x02, 0x68,
+ 0xc9, 0x31, 0xe9, 0xef, 0x02, 0xb9, 0x26, 0x00, 0xe8, 0x49, 0x02, 0x72,
+ 0xd1, 0xff, 0x86, 0x52, 0x02, 0x8d, 0xb6, 0xa6, 0x04, 0x8b, 0xfb, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0x80, 0xbe, 0x87, 0x02, 0x01,
+ 0x75, 0x03, 0xe9, 0xcb, 0x02, 0x68, 0xc9, 0x31, 0xe9, 0xc5, 0x02, 0xb9,
+ 0x20, 0x00, 0xe8, 0x1f, 0x02, 0x72, 0xa7, 0x8d, 0xb6, 0xf2, 0x01, 0x8d,
+ 0xbe, 0xe6, 0x04, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6,
+ 0xcc, 0x04, 0x8b, 0xfb, 0xd1, 0xe9, 0xf3, 0xa5, 0x80, 0xbe, 0x87, 0x02,
+ 0x01, 0x75, 0x03, 0xe9, 0x9a, 0x02, 0x68, 0xc9, 0x31, 0xe9, 0x94, 0x02,
+ 0x89, 0x86, 0x06, 0x05, 0x86, 0xc4, 0x89, 0x86, 0x12, 0x02, 0xb9, 0x2a,
+ 0x00, 0xe8, 0xe4, 0x01, 0x72, 0x18, 0x8d, 0xb6, 0xec, 0x04, 0x8b, 0xfb,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0x80, 0xbe, 0x87, 0x02,
+ 0x01, 0x75, 0x07, 0xe9, 0x6a, 0x02, 0xe9, 0x5a, 0x01, 0x90, 0x68, 0xc9,
+ 0x31, 0xe9, 0x60, 0x02, 0xb9, 0x18, 0x00, 0xe8, 0xba, 0x01, 0x73, 0x03,
+ 0xe9, 0x3f, 0xff, 0x8d, 0xb6, 0x8a, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x44, 0x02, 0xb9, 0x24, 0x00, 0xe8,
+ 0x9e, 0x01, 0x73, 0x03, 0xe9, 0x23, 0xff, 0x8b, 0x86, 0x34, 0x05, 0x86,
+ 0xc4, 0x89, 0x86, 0x2a, 0x02, 0x8d, 0xb6, 0x16, 0x05, 0x8b, 0xfb, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x1e, 0x02, 0xb9, 0x1c,
+ 0x00, 0xe8, 0x78, 0x01, 0x73, 0x03, 0xe9, 0xfd, 0xfe, 0x8d, 0xb6, 0x3a,
+ 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9,
+ 0x02, 0x02, 0xb9, 0x18, 0x00, 0xe8, 0x5c, 0x01, 0x73, 0x03, 0xe9, 0xe1,
+ 0xfe, 0x8d, 0xb6, 0x56, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1,
+ 0xe9, 0xf3, 0xa5, 0xe9, 0xe6, 0x01, 0xb9, 0x1c, 0x00, 0x50, 0xe8, 0x3f,
+ 0x01, 0x58, 0x73, 0x03, 0xe9, 0xc3, 0xfe, 0x8d, 0xb6, 0x6e, 0x05, 0x8b,
+ 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0xc8, 0x01,
+ 0xb9, 0x18, 0x00, 0xe8, 0x22, 0x01, 0x73, 0x03, 0xe9, 0xa7, 0xfe, 0x8d,
+ 0xb6, 0xa2, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3,
+ 0xa5, 0xe9, 0xac, 0x01, 0xb9, 0x18, 0x00, 0xe8, 0x06, 0x01, 0x73, 0x03,
+ 0xe9, 0x8b, 0xfe, 0x8d, 0xb6, 0xba, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x90, 0x01, 0x8b, 0x4f, 0x04, 0x53,
+ 0xe8, 0xe9, 0x00, 0x5e, 0x72, 0x17, 0x89, 0x9e, 0x3c, 0x02, 0x8b, 0xfb,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xc7, 0x86, 0x3e, 0x02,
+ 0x01, 0x00, 0xe9, 0x6f, 0x01, 0xe9, 0x7d, 0x12, 0xb9, 0x18, 0x00, 0xe8,
+ 0xc6, 0x00, 0x8d, 0xb6, 0xb4, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0xd1, 0xe9, 0xf3, 0xa5, 0x33, 0xc0, 0x8d, 0x7f, 0x08, 0xb9, 0x06, 0x00,
+ 0xf3, 0xab, 0xe9, 0x4b, 0x01, 0x53, 0x8b, 0x9e, 0xb0, 0x01, 0x8b, 0xb6,
+ 0xae, 0x01, 0x3b, 0xde, 0x74, 0x15, 0x8a, 0x47, 0x17, 0xf6, 0x44, 0x0e,
+ 0x80, 0x75, 0x0e, 0x38, 0x44, 0x17, 0x75, 0x09, 0x8b, 0x74, 0x02, 0x89,
+ 0xb6, 0xae, 0x01, 0xeb, 0x1a, 0x8b, 0xfe, 0x8b, 0x74, 0x02, 0x3b, 0xde,
+ 0x74, 0x11, 0xf6, 0x44, 0x0e, 0x80, 0x75, 0xf1, 0x38, 0x44, 0x17, 0x75,
+ 0xec, 0x8b, 0x44, 0x02, 0x89, 0x45, 0x02, 0x5b, 0xc3, 0xe8, 0x37, 0xd8,
+ 0xc6, 0x86, 0x87, 0x02, 0x00, 0x8d, 0xb6, 0xa6, 0x01, 0x8d, 0xbe, 0xac,
+ 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x0e, 0x40, 0x00, 0x00, 0x16, 0x8d, 0x9e, 0xa8, 0x12, 0x89, 0x9e,
+ 0xa8, 0x01, 0x89, 0x9e, 0xaa, 0x01, 0xc7, 0x07, 0x30, 0x80, 0xc7, 0x47,
+ 0x04, 0x00, 0x00, 0x83, 0xc3, 0x08, 0x89, 0x9e, 0xa6, 0x01, 0xc6, 0x86,
+ 0x8a, 0x02, 0x01, 0x83, 0xc1, 0x02, 0xeb, 0x4a, 0x8b, 0x9e, 0xac, 0x01,
+ 0x8b, 0xb6, 0xae, 0x01, 0xeb, 0x29, 0x80, 0xbe, 0x87, 0x02, 0x01, 0x74,
+ 0xa8, 0x8d, 0x96, 0xa8, 0x15, 0x8d, 0xbe, 0xa8, 0x12, 0x8b, 0x9e, 0xa6,
+ 0x01, 0x8b, 0xb6, 0xa8, 0x01, 0xeb, 0x18, 0x90, 0x8b, 0x9e, 0xa6, 0x01,
+ 0x8b, 0xb6, 0xa8, 0x01, 0x80, 0xbe, 0x87, 0x02, 0x01, 0x75, 0xcd, 0x8d,
+ 0x96, 0xa8, 0x12, 0x8d, 0xbe, 0xa8, 0x09, 0x83, 0xc1, 0x02, 0x3b, 0xde,
+ 0x73, 0x17, 0x8b, 0xc6, 0x2b, 0xc3, 0x3b, 0xc1, 0x72, 0x25, 0xc7, 0x07,
+ 0x00, 0x00, 0x83, 0xc3, 0x02, 0xc7, 0x07, 0x00, 0x00, 0x83, 0xe9, 0x02,
+ 0xc3, 0x8b, 0xc2, 0x2b, 0xc3, 0x3b, 0xc1, 0x72, 0x02, 0xeb, 0xe7, 0x8b,
+ 0xdf, 0x8b, 0xc6, 0x2b, 0xc3, 0x3b, 0xc1, 0x72, 0x02, 0xeb, 0xdb, 0x3b,
+ 0xb6, 0xae, 0x01, 0x74, 0x11, 0x80, 0xbe, 0x62, 0x02, 0x01, 0x75, 0x05,
+ 0x83, 0x8e, 0xe6, 0x02, 0x02, 0xe8, 0x8e, 0x01, 0xf9, 0xc3, 0x8b, 0x74,
+ 0x02, 0x89, 0xb6, 0xae, 0x01, 0x3b, 0xdd, 0x74, 0x04, 0x3b, 0xde, 0x77,
+ 0xc4, 0x8b, 0xc6, 0x2b, 0xc3, 0x3b, 0xc1, 0x72, 0xe9, 0x89, 0xb6, 0xae,
+ 0x01, 0xeb, 0xa7, 0x8b, 0xb6, 0xb0, 0x01, 0x89, 0x5c, 0x02, 0x80, 0x4c,
+ 0x05, 0x80, 0x89, 0x9e, 0xb0, 0x01, 0x03, 0x5f, 0x04, 0x83, 0xc3, 0x06,
+ 0x89, 0x9e, 0xac, 0x01, 0xc6, 0x86, 0x8c, 0x02, 0x01, 0xc3, 0xeb, 0xdf,
+ 0x80, 0xbe, 0x87, 0x02, 0x01, 0x75, 0xf7, 0x8e, 0x46, 0x02, 0x26, 0xa1,
+ 0x4c, 0x00, 0x0c, 0x02, 0x80, 0xbe, 0x8a, 0x02, 0x01, 0x74, 0x45, 0x8b,
+ 0xb6, 0xaa, 0x01, 0x89, 0x5c, 0x02, 0x80, 0x4c, 0x05, 0x80, 0x83, 0xc8,
+ 0x04, 0x25, 0xff, 0xf7, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x4c, 0x00, 0x89,
+ 0x9e, 0xaa, 0x01, 0x03, 0x5f, 0x04, 0x83, 0xc3, 0x06, 0x89, 0x9e, 0xa6,
+ 0x01, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x4c, 0x00, 0x0c, 0x02, 0x8b,
+ 0x9e, 0xaa, 0x01, 0xc7, 0x07, 0x00, 0x00, 0x26, 0x89, 0x1e, 0x6c, 0x00,
+ 0x83, 0xc8, 0x08, 0x25, 0xff, 0xf7, 0xeb, 0xcc, 0x8e, 0x46, 0x02, 0x89,
+ 0x9e, 0xa8, 0x01, 0x26, 0x89, 0x1e, 0x6c, 0x00, 0x83, 0xc8, 0x08, 0x25,
+ 0xff, 0xf7, 0xc6, 0x86, 0x8a, 0x02, 0x00, 0xeb, 0xb3, 0x53, 0xf6, 0x86,
+ 0x87, 0x02, 0x01, 0x74, 0x13, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c,
+ 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0xe8, 0x65, 0xfe,
+ 0x5b, 0xc3, 0xe9, 0xb8, 0x00, 0x90, 0x80, 0xbe, 0x87, 0x02, 0x00, 0x75,
+ 0xf5, 0x50, 0xfa, 0x8d, 0xb6, 0xac, 0x01, 0x8d, 0xbe, 0xa6, 0x01, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x80, 0xbe, 0x63, 0x01, 0x01, 0x75,
+ 0x16, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x40, 0x00, 0x00, 0x02, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x26, 0x40, 0x00, 0xff, 0xe3, 0xeb, 0x27, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x0e, 0x40, 0x00, 0x00, 0x02, 0xf6, 0x86, 0xaf,
+ 0x02, 0x01, 0x74, 0x0c, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x40, 0x00,
+ 0x00, 0x1c, 0xeb, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x40, 0x00,
+ 0xff, 0xe3, 0x33, 0xc0, 0x89, 0x86, 0xae, 0x01, 0x40, 0x88, 0x86, 0x87,
+ 0x02, 0x58, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x0a, 0xe8, 0x21, 0xe0,
+ 0x8e, 0x46, 0x02, 0x26, 0xa2, 0x5c, 0x00, 0x8b, 0x9e, 0xa8, 0x01, 0x83,
+ 0x3f, 0x00, 0x74, 0x0f, 0xf7, 0x07, 0x20, 0x00, 0x75, 0x06, 0xc7, 0x07,
+ 0x00, 0x00, 0xeb, 0x03, 0xe8, 0x90, 0x00, 0xf6, 0x86, 0x8c, 0x02, 0x01,
+ 0x74, 0x19, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x6c, 0x00, 0xc6, 0x86,
+ 0x8c, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00, 0x08,
+ 0xfb, 0xeb, 0x06, 0xc6, 0x86, 0x8a, 0x02, 0x01, 0xfb, 0xc3, 0x56, 0x8d,
+ 0xb6, 0xa8, 0x09, 0xc7, 0x86, 0xa6, 0x01, 0xb0, 0x09, 0x01, 0xae, 0xa6,
+ 0x01, 0x89, 0xb6, 0xa8, 0x01, 0x89, 0xb6, 0xaa, 0x01, 0xc7, 0x04, 0x30,
+ 0x80, 0xc7, 0x44, 0x04, 0x00, 0x00, 0xc6, 0x86, 0x8a, 0x02, 0x01, 0x5e,
+ 0xc3, 0xff, 0xa4, 0x22, 0x04, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x32,
+ 0x80, 0x7e, 0x06, 0x46, 0x75, 0x1c, 0xf6, 0x86, 0x7a, 0x02, 0x01, 0x74,
+ 0x15, 0xff, 0x8e, 0xd6, 0x02, 0x75, 0x0f, 0xc6, 0x86, 0x7a, 0x02, 0x00,
+ 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xe8, 0xd8, 0xdc, 0xeb, 0x10, 0x83, 0xfe,
+ 0x10, 0x74, 0x07, 0x83, 0xfe, 0x0e, 0x74, 0x02, 0xeb, 0x04, 0xff, 0xa4,
+ 0x22, 0x04, 0xc3, 0x8b, 0x9e, 0xa8, 0x01, 0x8b, 0x07, 0xfb, 0xa9, 0x10,
+ 0x00, 0x74, 0x6c, 0xa9, 0x00, 0x80, 0x75, 0x46, 0x8b, 0x77, 0x17, 0x81,
+ 0xe6, 0xff, 0x00, 0xf7, 0x86, 0x3e, 0x02, 0x01, 0x00, 0x74, 0x1b, 0x3b,
+ 0x9e, 0x3c, 0x02, 0x75, 0x15, 0x89, 0x86, 0xcc, 0x15, 0x50, 0x53, 0x56,
+ 0xe8, 0x2e, 0x0f, 0x5e, 0x5b, 0x58, 0xc7, 0x86, 0x3e, 0x02, 0x00, 0x00,
+ 0xeb, 0x18, 0xf7, 0x46, 0x14, 0xff, 0xff, 0x74, 0x11, 0x83, 0xfe, 0x2a,
+ 0x77, 0x0c, 0xd1, 0xe6, 0x68, 0x1a, 0x35, 0xff, 0x66, 0x14, 0x5b, 0x83,
+ 0xc4, 0x02, 0x81, 0x0f, 0x00, 0x80, 0xfa, 0xf6, 0x47, 0x05, 0x80, 0x74,
+ 0x1a, 0x8b, 0x5f, 0x02, 0x89, 0x9e, 0xa8, 0x01, 0xf7, 0x07, 0x10, 0x00,
+ 0x74, 0x0d, 0xff, 0x86, 0x3a, 0x01, 0x83, 0xbe, 0x3a, 0x01, 0x06, 0x77,
+ 0x0f, 0xeb, 0x8c, 0xc6, 0x86, 0xb8, 0x01, 0x00, 0xc7, 0x86, 0x3a, 0x01,
+ 0x00, 0x00, 0xfb, 0xc3, 0xe8, 0x16, 0xd8, 0xf7, 0xc6, 0xff, 0xff, 0x74,
+ 0xea, 0xc7, 0x44, 0x02, 0x03, 0x00, 0xc6, 0x86, 0xb8, 0x01, 0x01, 0x8d,
+ 0x7e, 0x16, 0xe8, 0x1e, 0xd8, 0xeb, 0xdd, 0xa9, 0x20, 0x00, 0x75, 0x74,
+ 0xf7, 0x47, 0x04, 0x00, 0x80, 0x74, 0x05, 0xe8, 0x08, 0x00, 0x72, 0x9f,
+ 0x53, 0x68, 0x16, 0x35, 0xff, 0xe6, 0x8a, 0x47, 0x17, 0x8b, 0xfb, 0x8b,
+ 0x7d, 0x02, 0x38, 0x45, 0x17, 0x74, 0x09, 0xf7, 0x45, 0x04, 0x00, 0x80,
+ 0x75, 0xf1, 0xf8, 0xc3, 0xf9, 0xc3, 0xa9, 0x20, 0x00, 0x75, 0x05, 0xa9,
+ 0x00, 0x10, 0x75, 0x0c, 0x33, 0xc9, 0xa9, 0x05, 0x00, 0x75, 0x0a, 0xa9,
+ 0x0a, 0x04, 0x74, 0x05, 0x8b, 0x0d, 0xe3, 0x01, 0x49, 0x89, 0x0d, 0xc3,
+ 0x53, 0x8b, 0x4f, 0x04, 0x80, 0xe5, 0x7f, 0x89, 0x4f, 0x04, 0x83, 0xc1,
+ 0x06, 0xe8, 0xb0, 0xfc, 0x72, 0x19, 0x5e, 0x56, 0x8b, 0xfb, 0xd1, 0xe9,
+ 0x83, 0xe9, 0x02, 0x83, 0xc6, 0x04, 0x83, 0xc7, 0x04, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xf3, 0xa5, 0xe8, 0x36, 0xfd, 0xf8, 0x5b, 0xc3, 0x80, 0x7e, 0x08,
+ 0x02, 0x75, 0x0b, 0xa9, 0x20, 0x00, 0x75, 0x06, 0xc7, 0x86, 0xcc, 0x01,
+ 0x01, 0x00, 0xc3, 0x8a, 0x56, 0x06, 0x80, 0xfa, 0x02, 0x74, 0x17, 0x80,
+ 0xfa, 0x44, 0x74, 0x12, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x18, 0x80, 0xfa,
+ 0x0c, 0x74, 0x07, 0x80, 0xfa, 0x0e, 0x74, 0x02, 0xeb, 0x0b, 0xa9, 0x20,
+ 0x00, 0x75, 0x06, 0xb8, 0x01, 0x00, 0xe8, 0x3e, 0xeb, 0xc3, 0xb9, 0x06,
+ 0x00, 0xa9, 0x20, 0x00, 0x74, 0x09, 0xb9, 0x08, 0x00, 0xa9, 0x0f, 0x00,
+ 0x75, 0x01, 0xc3, 0xff, 0x86, 0xce, 0x02, 0x83, 0xbe, 0xce, 0x02, 0x02,
+ 0x72, 0x06, 0x8b, 0xc1, 0xe8, 0x1c, 0xeb, 0xc3, 0x53, 0xe8, 0x8d, 0xf7,
+ 0x5b, 0xc3, 0x53, 0x68, 0x16, 0x35, 0xe9, 0x50, 0xf8, 0x80, 0x7e, 0x06,
+ 0x0c, 0x75, 0x1d, 0xa9, 0x00, 0x10, 0x75, 0xee, 0xa9, 0x20, 0x00, 0x74,
+ 0xe9, 0xa8, 0x0a, 0x75, 0x10, 0xff, 0x86, 0xc4, 0x02, 0x83, 0xbe, 0xc4,
+ 0x02, 0x04, 0x72, 0xda, 0xc6, 0x46, 0x07, 0x0e, 0xc3, 0x83, 0xbe, 0xc2,
+ 0x02, 0x04, 0x73, 0xf8, 0xbe, 0xa9, 0x4c, 0xe8, 0xce, 0xd8, 0xeb, 0xf0,
+ 0x8d, 0xbe, 0xc8, 0x02, 0xe8, 0x0f, 0xff, 0x0b, 0xc9, 0x74, 0xe5, 0x53,
+ 0x68, 0x16, 0x35, 0xe9, 0x0b, 0xf8, 0x8d, 0xbe, 0xc0, 0x02, 0xe8, 0xfd,
+ 0xfe, 0x0b, 0xc9, 0x74, 0x03, 0xe9, 0x14, 0xff, 0xc3, 0x53, 0x8a, 0x56,
+ 0x06, 0x80, 0xfa, 0x02, 0x74, 0x17, 0x80, 0xfa, 0x44, 0x74, 0x12, 0x80,
+ 0x7e, 0x08, 0x08, 0x75, 0x34, 0x80, 0xfa, 0x0c, 0x74, 0x07, 0x80, 0xfa,
+ 0x0e, 0x74, 0x02, 0xeb, 0x28, 0xa9, 0x20, 0x00, 0x74, 0x25, 0x80, 0xbe,
+ 0xfe, 0x00, 0x02, 0x74, 0x1c, 0x8b, 0x96, 0x66, 0x01, 0x4a, 0x89, 0x96,
+ 0x66, 0x01, 0x83, 0xfa, 0x01, 0x77, 0x1b, 0xbe, 0x91, 0x4c, 0xe8, 0x6b,
+ 0xd8, 0xc6, 0x86, 0x8a, 0x02, 0x01, 0xe8, 0xe8, 0xf6, 0x5b, 0xc3, 0xfe,
+ 0x8e, 0x68, 0x01, 0x75, 0x05, 0xe8, 0x44, 0x20, 0xeb, 0xf3, 0xbe, 0x91,
+ 0x4c, 0xe8, 0x50, 0xd8, 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0xc6,
+ 0x86, 0x8a, 0x02, 0x01, 0xfa, 0xe8, 0xde, 0xf6, 0xeb, 0xdb, 0xa9, 0x20,
+ 0x00, 0x74, 0x41, 0xa9, 0x0f, 0x00, 0x75, 0x25, 0xc6, 0x86, 0x69, 0x02,
+ 0x01, 0xc6, 0x86, 0x6a, 0x02, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0,
+ 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xf2, 0x01, 0xab, 0xab, 0xab, 0x8b, 0x86,
+ 0x0a, 0x02, 0x83, 0x8e, 0x0a, 0x02, 0x40, 0xeb, 0x17, 0x8d, 0x77, 0x0e,
+ 0x8d, 0xbe, 0xf2, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x8b,
+ 0x86, 0x0a, 0x02, 0x83, 0xa6, 0x0a, 0x02, 0xbf, 0x33, 0x86, 0x0a, 0x02,
+ 0x74, 0x05, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xc3, 0xfb, 0xc3, 0xff, 0xa4,
+ 0xc6, 0x03, 0x53, 0x56, 0x8b, 0xc7, 0xf7, 0x07, 0x00, 0x10, 0x75, 0x18,
+ 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xd4, 0x01, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9,
+ 0x03, 0x00, 0xf3, 0xa7, 0x8b, 0xf8, 0x75, 0x0c, 0x81, 0x0f, 0x00, 0x10,
+ 0x80, 0x7e, 0x06, 0x44, 0x74, 0x47, 0xeb, 0x42, 0x8b, 0x49, 0x16, 0x80,
+ 0xf9, 0x00, 0x74, 0x05, 0x80, 0xf9, 0x03, 0x75, 0x38, 0x8d, 0xbe, 0x16,
+ 0x03, 0x83, 0x3d, 0x00, 0x75, 0x0c, 0x83, 0x7d, 0x02, 0x00, 0x75, 0x06,
+ 0x83, 0x7d, 0x04, 0x00, 0x74, 0x23, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0x16,
+ 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x8b, 0xf8,
+ 0x74, 0x0f, 0xc7, 0x86, 0x2e, 0x02, 0x0e, 0x00, 0xb8, 0x0b, 0x00, 0xe8,
+ 0x89, 0xe9, 0x5e, 0x5b, 0xc3, 0x8b, 0xf8, 0x5e, 0x5b, 0xff, 0xa4, 0xf2,
+ 0x03, 0xff, 0x86, 0x4c, 0x02, 0xc7, 0x86, 0x2e, 0x02, 0x06, 0x00, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0x8d, 0xbe, 0x00, 0x02, 0x8d, 0x77, 0x0e, 0xb9, 0x03,
+ 0x00, 0xf3, 0xa5, 0x8b, 0xb6, 0x1a, 0x06, 0x8b, 0x04, 0x86, 0xe0, 0x89,
+ 0x86, 0x06, 0x02, 0x89, 0x86, 0x16, 0x02, 0x8b, 0xb6, 0x1f, 0x06, 0x8b,
+ 0x04, 0x89, 0x86, 0x1a, 0x02, 0x8b, 0x44, 0x02, 0x89, 0x86, 0x1c, 0x02,
+ 0x8b, 0x44, 0x04, 0x89, 0x86, 0x1e, 0x02, 0x8b, 0xb6, 0x24, 0x06, 0x8b,
+ 0x04, 0x89, 0x86, 0x24, 0x02, 0x8b, 0x44, 0x02, 0x89, 0x86, 0x26, 0x02,
+ 0x8b, 0xb6, 0x1a, 0x06, 0x8b, 0x04, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x56,
+ 0xf7, 0x07, 0x00, 0x10, 0x74, 0x14, 0xf6, 0x47, 0x06, 0x08, 0x75, 0x0b,
+ 0x80, 0xbe, 0x63, 0x02, 0x00, 0x75, 0x04, 0xc6, 0x46, 0x09, 0x04, 0xe9,
+ 0x1b, 0x01, 0x3b, 0x86, 0x0c, 0x03, 0x77, 0xf7, 0x80, 0xbe, 0x62, 0x02,
+ 0x01, 0x74, 0x10, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0xea, 0xc6, 0x46, 0x07,
+ 0x10, 0xc6, 0x46, 0x09, 0x1e, 0xeb, 0xe0, 0x80, 0xbe, 0x63, 0x02, 0x00,
+ 0x75, 0xd9, 0xc6, 0x46, 0x09, 0x0a, 0xf6, 0x86, 0x0b, 0x02, 0x10, 0x74,
+ 0xce, 0x80, 0xa6, 0x0b, 0x02, 0x6f, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xe9,
+ 0xdf, 0x00, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x5b, 0xc6, 0x86, 0x58, 0x02,
+ 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xbf, 0xbe, 0x6d,
+ 0x4c, 0xe8, 0xa0, 0xd6, 0x8b, 0xb6, 0x1f, 0x06, 0x8d, 0xbe, 0x00, 0x03,
+ 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x21, 0x83,
+ 0xf8, 0x01, 0x74, 0x1c, 0xff, 0x8e, 0xba, 0x02, 0x75, 0x13, 0xf6, 0x86,
+ 0x5c, 0x02, 0x01, 0x75, 0x0c, 0xc6, 0x86, 0x5c, 0x02, 0x01, 0xc6, 0x46,
+ 0x09, 0x08, 0xe9, 0x94, 0x00, 0xe9, 0x91, 0x00, 0xc7, 0x86, 0xba, 0x02,
+ 0x08, 0x00, 0x83, 0xf8, 0x01, 0x75, 0x0a, 0xc7, 0x86, 0xb8, 0x02, 0x02,
+ 0x00, 0xeb, 0x7e, 0xeb, 0x2e, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0x16, 0x03,
+ 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0xe4, 0xff,
+ 0x8e, 0xb8, 0x02, 0x75, 0x14, 0xc7, 0x86, 0xb8, 0x02, 0x02, 0x00, 0xc6,
+ 0x86, 0x58, 0x02, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00,
+ 0x40, 0xeb, 0x4e, 0x80, 0xbe, 0x62, 0x02, 0x00, 0x74, 0x0c, 0x80, 0x7e,
+ 0x08, 0x08, 0x74, 0x41, 0xc6, 0x46, 0x09, 0x0a, 0xeb, 0x3b, 0xb7, 0x10,
+ 0x8a, 0x5e, 0x06, 0x80, 0xfb, 0x06, 0x74, 0x1f, 0x80, 0xfb, 0x08, 0x74,
+ 0x1a, 0x80, 0xfb, 0x04, 0x74, 0x15, 0x80, 0xfb, 0x0c, 0x74, 0x10, 0x80,
+ 0xfb, 0x0a, 0x75, 0x07, 0xc6, 0x86, 0x5f, 0x02, 0x00, 0xeb, 0x04, 0xb7,
+ 0x12, 0xeb, 0x12, 0x88, 0x7e, 0x07, 0x80, 0xff, 0x12, 0x75, 0x04, 0xc6,
+ 0x46, 0x09, 0x1e, 0xb8, 0x07, 0x00, 0xe8, 0xea, 0xe7, 0xc3, 0xff, 0x86,
+ 0x4c, 0x02, 0xc7, 0x86, 0x2e, 0x02, 0x06, 0x00, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0x8d, 0xbe, 0x00, 0x02, 0x8d, 0x77, 0x0e, 0xb9, 0x03, 0x00, 0xf3, 0xa5,
+ 0x80, 0x7e, 0x06, 0x48, 0x74, 0x08, 0xb8, 0x06, 0x00, 0xe8, 0xc3, 0xe7,
+ 0xeb, 0x37, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x74, 0x26, 0x80, 0x7e, 0x08,
+ 0x16, 0x75, 0x20, 0xc6, 0x46, 0x09, 0x1a, 0xc6, 0x86, 0x73, 0x02, 0x00,
+ 0xc6, 0x86, 0x6c, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c,
+ 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0xeb, 0x0a, 0x80,
+ 0x7e, 0x08, 0x18, 0x75, 0x04, 0xc6, 0x46, 0x09, 0x1a, 0xc3, 0x8a, 0x4e,
+ 0x06, 0x80, 0xbe, 0xac, 0x02, 0x01, 0x74, 0x02, 0xeb, 0x06, 0xb8, 0x06,
+ 0x00, 0xe8, 0x77, 0xe7, 0xc3, 0xe9, 0x8e, 0x00, 0xeb, 0x6e, 0xeb, 0x64,
+ 0x80, 0x7e, 0x06, 0x42, 0x75, 0xf3, 0x8b, 0x47, 0x1a, 0x83, 0xf8, 0x00,
+ 0x75, 0xee, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0xe9, 0xf6, 0x86, 0x78,
+ 0x02, 0x01, 0x74, 0x29, 0xc6, 0x86, 0x78, 0x02, 0x00, 0xc6, 0x86, 0xb0,
+ 0x02, 0x01, 0xc7, 0x86, 0x34, 0x05, 0x00, 0x02, 0xc7, 0x86, 0xd8, 0x02,
+ 0x05, 0x00, 0xbe, 0x27, 0x4d, 0xe8, 0x28, 0xd5, 0xf7, 0x86, 0xf6, 0x00,
+ 0x00, 0x08, 0x74, 0x03, 0xe8, 0xa1, 0xf6, 0xeb, 0x45, 0xf6, 0x86, 0x82,
+ 0x02, 0x01, 0x75, 0x18, 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x10, 0x74, 0x10,
+ 0xb8, 0x02, 0x00, 0xe8, 0xa3, 0x11, 0xc6, 0x46, 0x09, 0x1e, 0xc6, 0x46,
+ 0x07, 0x02, 0xeb, 0x26, 0xb8, 0x06, 0x00, 0xe8, 0x05, 0xe7, 0xeb, 0x1e,
+ 0x3d, 0x00, 0x02, 0x75, 0x10, 0xc6, 0x86, 0x7b, 0x02, 0x01, 0xe8, 0xfa,
+ 0x06, 0xbe, 0x0f, 0x4d, 0xe8, 0xe1, 0xd4, 0xeb, 0x09, 0x3d, 0x00, 0x04,
+ 0x75, 0x04, 0xc6, 0x46, 0x07, 0x4a, 0xc3, 0xc7, 0x86, 0x2e, 0x02, 0x02,
+ 0x00, 0x80, 0x7e, 0x06, 0x46, 0x75, 0x2b, 0x8b, 0x47, 0x1a, 0x83, 0xf8,
+ 0x00, 0x75, 0x10, 0xc6, 0x46, 0x07, 0x48, 0x80, 0x7e, 0x08, 0x1c, 0x75,
+ 0x19, 0xc6, 0x46, 0x09, 0x16, 0xeb, 0x13, 0x86, 0xc4, 0x3d, 0x20, 0x80,
+ 0x75, 0x0c, 0xc7, 0x86, 0x2e, 0x02, 0x11, 0x00, 0xb8, 0x08, 0x00, 0xe8,
+ 0xad, 0xe6, 0xc3, 0xc7, 0x86, 0x2e, 0x02, 0x0f, 0x00, 0x80, 0x7e, 0x06,
+ 0x44, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x42, 0x75, 0x08, 0xb8, 0x06, 0x00,
+ 0xe8, 0x94, 0xe6, 0xeb, 0x0d, 0xf6, 0x86, 0x73, 0x02, 0x01, 0x74, 0x06,
+ 0xbe, 0x1b, 0x4d, 0xe8, 0x76, 0xd4, 0xc3, 0x80, 0x7e, 0x06, 0x44, 0x75,
+ 0x14, 0xe8, 0x85, 0xd2, 0xc7, 0x44, 0x02, 0x02, 0x00, 0x8d, 0x7e, 0x16,
+ 0xe8, 0x98, 0xd2, 0xbe, 0x91, 0x4c, 0xe8, 0x0d, 0xd5, 0xc3, 0xf7, 0x86,
+ 0xf6, 0x00, 0x40, 0x00, 0x74, 0x18, 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x20,
+ 0x74, 0x10, 0x80, 0x7e, 0x06, 0x08, 0x72, 0x0a, 0x80, 0x7e, 0x06, 0x0e,
+ 0x77, 0x04, 0xc6, 0x46, 0x07, 0x14, 0xc3, 0x80, 0x7e, 0x06, 0x44, 0x75,
+ 0x2e, 0xff, 0x8e, 0x66, 0x01, 0x75, 0x1d, 0x8e, 0x46, 0x02, 0x26, 0x83,
+ 0x26, 0x64, 0x00, 0xfd, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x74, 0x06,
+ 0xc6, 0x46, 0x07, 0x4e, 0xeb, 0x11, 0xc6, 0x46, 0x07, 0x46, 0xeb, 0x0b,
+ 0xc6, 0x86, 0x77, 0x02, 0x01, 0xb9, 0x5a, 0x00, 0xe8, 0x06, 0xf3, 0xc3,
+ 0x80, 0x7e, 0x06, 0x44, 0x75, 0x1f, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e,
+ 0x64, 0x00, 0x02, 0xc6, 0x86, 0x76, 0x02, 0x00, 0xbe, 0x91, 0x4c, 0xe8,
+ 0xea, 0xd3, 0xb9, 0x5a, 0x00, 0xc6, 0x86, 0x8b, 0x02, 0x01, 0xe8, 0xe0,
+ 0xf2, 0xc3, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x72, 0x18, 0x8a, 0x4e, 0x06,
+ 0x80, 0xf9, 0x44, 0x74, 0x0a, 0x80, 0xf9, 0x46, 0x74, 0x05, 0x80, 0xf9,
+ 0x48, 0x75, 0x06, 0xb8, 0x03, 0x00, 0xe8, 0xce, 0xe5, 0xc3, 0xff, 0x86,
+ 0x50, 0x02, 0xc7, 0x86, 0x2e, 0x02, 0x0b, 0x00, 0x8a, 0x86, 0x58, 0x02,
+ 0x88, 0x86, 0x84, 0x02, 0xc7, 0x86, 0xcc, 0x02, 0x00, 0x00, 0xc6, 0x86,
+ 0x65, 0x02, 0x00, 0x83, 0x8e, 0x0a, 0x02, 0x20, 0x81, 0xa6, 0x0a, 0x02,
+ 0xff, 0x2f, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xf6, 0x86, 0x58, 0x02, 0x01,
+ 0x74, 0x38, 0xc6, 0x86, 0x84, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x26, 0x64, 0x00, 0xff, 0x7f, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x0a, 0xc6,
+ 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0x8a, 0xa6, 0x84,
+ 0x02, 0x88, 0xa6, 0x58, 0x02, 0xe8, 0xa0, 0xd5, 0x88, 0x86, 0x58, 0x02,
+ 0xc6, 0x46, 0x09, 0x0c, 0xc7, 0x86, 0xca, 0x01, 0x00, 0x01, 0x80, 0x7e,
+ 0x06, 0x04, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x06, 0x80, 0x7e, 0x08, 0x02,
+ 0x75, 0x04, 0xc6, 0x46, 0x09, 0x0c, 0x80, 0x7e, 0x08, 0x06, 0x74, 0x05,
+ 0xc6, 0x86, 0x5e, 0x02, 0x01, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0x00, 0x03,
+ 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x06, 0x00, 0xf3, 0xa6, 0x74, 0x08, 0x77,
+ 0x03, 0xe9, 0x95, 0x00, 0xe9, 0xfe, 0x00, 0xf6, 0x47, 0x06, 0x08, 0x75,
+ 0x59, 0x80, 0x7e, 0x08, 0x04, 0x75, 0x53, 0x8b, 0xb6, 0x2a, 0x06, 0x8d,
+ 0xbe, 0x16, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xb8, 0x01,
+ 0x00, 0xf3, 0xa7, 0x74, 0x02, 0xeb, 0x3e, 0xff, 0x86, 0xbe, 0x02, 0x83,
+ 0xbe, 0xbe, 0x02, 0x03, 0x72, 0x30, 0x83, 0xbe, 0xbc, 0x02, 0x03, 0x72,
+ 0x29, 0xc6, 0x46, 0x09, 0x02, 0xc6, 0x86, 0x84, 0x02, 0x01, 0x8e, 0x46,
+ 0x02, 0x26, 0x81, 0x0e, 0x64, 0x00, 0x00, 0x80, 0x8a, 0x86, 0x58, 0x02,
+ 0x8a, 0xa6, 0x84, 0x02, 0x88, 0xa6, 0x58, 0x02, 0xe8, 0x01, 0xd5, 0x88,
+ 0x86, 0x58, 0x02, 0xe8, 0x6d, 0xf3, 0xe9, 0xec, 0x00, 0x80, 0x7e, 0x0a,
+ 0x00, 0x75, 0x1d, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02,
+ 0x00, 0x8a, 0x86, 0x58, 0x02, 0x8a, 0xa6, 0x84, 0x02, 0x88, 0xa6, 0x58,
+ 0x02, 0xe8, 0xd8, 0xd4, 0x88, 0x86, 0x58, 0x02, 0xc6, 0x46, 0x09, 0x0c,
+ 0xb8, 0x00, 0x03, 0xe8, 0xbe, 0xf3, 0xe9, 0xbc, 0x00, 0x80, 0x7e, 0x08,
+ 0x00, 0x75, 0x3d, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x75, 0x16, 0xf6, 0x86,
+ 0x6c, 0x02, 0x01, 0x74, 0x16, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x08,
+ 0xf7, 0x86, 0x12, 0x01, 0x00, 0x01, 0x75, 0x16, 0xc6, 0x46, 0x09, 0x0c,
+ 0xe9, 0x92, 0x00, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x9c, 0xf7, 0x86,
+ 0x12, 0x01, 0x00, 0x01, 0x74, 0x94, 0xc6, 0x46, 0x09, 0x04, 0xff, 0x86,
+ 0x4e, 0x02, 0xeb, 0x79, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x73, 0xf6, 0x86,
+ 0x63, 0x02, 0x01, 0x75, 0x0e, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x01, 0x75,
+ 0x06, 0xc6, 0x46, 0x09, 0x0c, 0xeb, 0x5e, 0xf7, 0x86, 0x12, 0x01, 0x00,
+ 0x01, 0x74, 0x56, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0x50, 0x80, 0x7e, 0x08,
+ 0x04, 0x75, 0x2c, 0xc6, 0x46, 0x09, 0x0c, 0x80, 0x7e, 0x0a, 0x00, 0x75,
+ 0x1d, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0x8a,
+ 0x86, 0x58, 0x02, 0x8a, 0xa6, 0x84, 0x02, 0x88, 0xa6, 0x58, 0x02, 0xe8,
+ 0x32, 0xd4, 0x88, 0x86, 0x58, 0x02, 0xe8, 0xc8, 0xef, 0xeb, 0x1e, 0x80,
+ 0x7e, 0x08, 0x00, 0x75, 0x09, 0xf6, 0x86, 0x6c, 0x02, 0x01, 0x74, 0x02,
+ 0xeb, 0xab, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x09, 0xf6, 0x86, 0x63, 0x02,
+ 0x01, 0x75, 0x02, 0xeb, 0x9c, 0x8a, 0x86, 0x84, 0x02, 0x88, 0x86, 0x58,
+ 0x02, 0xc3, 0xc7, 0x86, 0xc6, 0x02, 0x02, 0x00, 0xff, 0x86, 0x46, 0x02,
+ 0xc7, 0x86, 0x2e, 0x02, 0x0c, 0x00, 0x80, 0x7e, 0x06, 0x04, 0x74, 0x06,
+ 0x80, 0x7e, 0x06, 0x06, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x08, 0x80, 0x7e,
+ 0x08, 0x00, 0x75, 0x56, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x3b, 0xc6,
+ 0x86, 0x58, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x64, 0x00,
+ 0xff, 0x7f, 0xb8, 0x00, 0x02, 0xe8, 0xb4, 0xf2, 0xf6, 0x86, 0x62, 0x02,
+ 0x01, 0x74, 0x0c, 0xbe, 0x97, 0x4c, 0xe8, 0x73, 0xd1, 0xbe, 0xb5, 0x4c,
+ 0xe8, 0x6d, 0xd1, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x0d, 0xc6, 0x86, 0x6d,
+ 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xe8, 0x9a, 0xd3, 0xf6, 0x86,
+ 0x62, 0x02, 0x01, 0x74, 0x34, 0xc6, 0x86, 0x5c, 0x02, 0x00, 0xc6, 0x86,
+ 0x5d, 0x02, 0x00, 0xe9, 0xc9, 0x00, 0x80, 0x7e, 0x08, 0x0c, 0x75, 0x24,
+ 0xc6, 0x46, 0x09, 0x00, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x16, 0xbe,
+ 0x97, 0x4c, 0xe8, 0x2f, 0xd1, 0xbe, 0xb5, 0x4c, 0xe8, 0x29, 0xd1, 0xc6,
+ 0x86, 0x5c, 0x02, 0x00, 0xc6, 0x86, 0x5d, 0x02, 0x00, 0xe9, 0x9f, 0x00,
+ 0x80, 0x7e, 0x08, 0x02, 0x75, 0xf7, 0xc7, 0x86, 0xcc, 0x01, 0x00, 0x00,
+ 0xc6, 0x46, 0x09, 0x00, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x0a, 0xc6,
+ 0x86, 0x5c, 0x02, 0x00, 0xc6, 0x86, 0x5d, 0x02, 0x00, 0x8d, 0x77, 0x0e,
+ 0x8d, 0xbe, 0x00, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x06, 0x00, 0xf3,
+ 0xa6, 0x74, 0x2e, 0xc6, 0x86, 0x58, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x26, 0x64, 0x00, 0xff, 0x7f, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x0a,
+ 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xe8, 0x07,
+ 0xd3, 0xb8, 0x00, 0x02, 0xe8, 0xf5, 0xf1, 0xc6, 0x46, 0x09, 0x00, 0xeb,
+ 0x3e, 0x8e, 0x46, 0x02, 0x26, 0xa0, 0x5c, 0x00, 0xc6, 0x46, 0x09, 0x00,
+ 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x59, 0x02, 0x00, 0xc6, 0x86,
+ 0x69, 0x02, 0x00, 0xe8, 0xde, 0xd2, 0x24, 0x07, 0xe8, 0xf7, 0xf4, 0xbe,
+ 0x67, 0x4c, 0xe8, 0x93, 0xd0, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d,
+ 0xbe, 0xf2, 0x01, 0xab, 0xab, 0xab, 0xe8, 0xb2, 0xee, 0xbe, 0xb5, 0x4c,
+ 0xe8, 0x7d, 0xd0, 0x80, 0x7e, 0x06, 0x08, 0x75, 0x03, 0xe8, 0xf9, 0xee,
+ 0xc3, 0x8c, 0xd8, 0x8e, 0xc0, 0xff, 0x86, 0x54, 0x02, 0xc7, 0x86, 0x2e,
+ 0x02, 0x0f, 0x00, 0xf6, 0x86, 0xce, 0x01, 0x01, 0x74, 0x3b, 0xb8, 0x38,
+ 0x5f, 0xa3, 0x2c, 0x5f, 0x8d, 0x77, 0x0e, 0x8b, 0xf8, 0xa5, 0xa5, 0xa5,
+ 0xc7, 0x06, 0x34, 0x5f, 0x01, 0x00, 0xc6, 0x86, 0xcf, 0x01, 0x00, 0x33,
+ 0xff, 0xba, 0x02, 0x08, 0xe8, 0xc6, 0xe6, 0xbf, 0x2e, 0x5f, 0xb9, 0x03,
+ 0x00, 0xf3, 0xa5, 0x8d, 0x77, 0x0e, 0xbf, 0x2e, 0x5f, 0xb9, 0x03, 0x00,
+ 0xf3, 0xa7, 0x75, 0x05, 0xe8, 0x8b, 0x04, 0xeb, 0x00, 0x8d, 0x77, 0x0e,
+ 0x8d, 0xbe, 0xf2, 0x01, 0xa5, 0xa5, 0xa5, 0x80, 0x7e, 0x06, 0x04, 0x75,
+ 0x04, 0xc6, 0x46, 0x07, 0x08, 0x8b, 0x8e, 0xc6, 0x02, 0xe3, 0x05, 0x49,
+ 0x89, 0x8e, 0xc6, 0x02, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x0a, 0xf6, 0x86,
+ 0x6c, 0x02, 0x01, 0x74, 0x03, 0xe8, 0x07, 0x02, 0xf6, 0x86, 0x58, 0x02,
+ 0x01, 0x75, 0x03, 0xe9, 0x93, 0x00, 0xbe, 0xb5, 0x4c, 0xe8, 0xe4, 0xcf,
+ 0xf7, 0x07, 0x00, 0x10, 0x75, 0x37, 0xc6, 0x86, 0x58, 0x02, 0x00, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x26, 0x64, 0x00, 0xff, 0x7f, 0xb8, 0x00, 0x02,
+ 0xe8, 0xfd, 0xf0, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x06, 0xbe, 0x97,
+ 0x4c, 0xe8, 0xbc, 0xcf, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x38, 0xc6, 0x86,
+ 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xe8, 0xe9, 0xd1, 0xeb,
+ 0x29, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x33, 0xc6, 0x86, 0x69, 0x02, 0x01,
+ 0xc6, 0x86, 0x6a, 0x02, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d,
+ 0x77, 0x0e, 0x8d, 0xbe, 0xf2, 0x01, 0xab, 0xab, 0xab, 0x8b, 0x86, 0x0a,
+ 0x02, 0xa9, 0x40, 0x00, 0x74, 0x02, 0xeb, 0x48, 0x83, 0xc8, 0x40, 0x89,
+ 0x86, 0x0a, 0x02, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xeb, 0x3a, 0x83, 0xa6,
+ 0x0a, 0x02, 0xbf, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0x77, 0x0e,
+ 0x8d, 0xbe, 0xf2, 0x01, 0xa5, 0xa5, 0xa5, 0xeb, 0x23, 0xf6, 0x86, 0x62,
+ 0x02, 0x01, 0x74, 0x06, 0xbe, 0xb5, 0x4c, 0xe8, 0x4a, 0xcf, 0xc6, 0x86,
+ 0x6b, 0x02, 0x00, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x0b, 0xc6, 0x86, 0x6b,
+ 0x02, 0x01, 0xbe, 0x9d, 0x4c, 0xe8, 0x34, 0xcf, 0xc3, 0xeb, 0x61, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xc7, 0x86, 0x2e, 0x02, 0x0d, 0x00, 0xf6, 0x86, 0xce,
+ 0x01, 0x01, 0x74, 0x50, 0x33, 0xff, 0xba, 0x02, 0x08, 0xe8, 0xa1, 0xe5,
+ 0x8b, 0x3e, 0x2c, 0x5f, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x3d, 0x81,
+ 0xff, 0x46, 0x66, 0x73, 0x6f, 0x89, 0x3e, 0x2c, 0x5f, 0x8d, 0x77, 0x0e,
+ 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x74, 0x05, 0xc6, 0x86, 0xd0, 0x01, 0x01,
+ 0x81, 0xff, 0x46, 0x66, 0x73, 0x56, 0x89, 0x3e, 0x2c, 0x5f, 0x8d, 0x77,
+ 0x0e, 0xa5, 0xa5, 0xa5, 0xff, 0x06, 0x34, 0x5f, 0x8d, 0x77, 0x0e, 0xbf,
+ 0x2e, 0x5f, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x03, 0xe8, 0x36, 0x03,
+ 0x8a, 0x86, 0x0a, 0x02, 0xa8, 0x40, 0x75, 0x3d, 0x80, 0x7e, 0x06, 0x04,
+ 0x75, 0x04, 0xc6, 0x46, 0x07, 0x08, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x3a,
+ 0xf6, 0x86, 0x6c, 0x02, 0x01, 0x74, 0x35, 0xf6, 0x86, 0x58, 0x02, 0x01,
+ 0x74, 0x07, 0xf6, 0x86, 0x69, 0x02, 0x01, 0x75, 0x27, 0xe8, 0xb3, 0x00,
+ 0xc7, 0x86, 0xc8, 0x02, 0x01, 0x00, 0xeb, 0x1c, 0xbf, 0x40, 0x66, 0x33,
+ 0xc0, 0xab, 0xab, 0xab, 0xe8, 0xf3, 0x02, 0xeb, 0xbb, 0x24, 0xbf, 0x88,
+ 0x86, 0x0a, 0x02, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xeb, 0xb6, 0xeb, 0x79,
+ 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x3c, 0xf6, 0x86, 0x69, 0x02, 0x01,
+ 0x74, 0x19, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x12, 0x83, 0xbe, 0xc6,
+ 0x02, 0x00, 0x75, 0x0b, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x05, 0x83, 0x8e,
+ 0xe6, 0x02, 0x08, 0xc6, 0x86, 0x69, 0x02, 0x01, 0xc6, 0x86, 0x6a, 0x02,
+ 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe,
+ 0xf2, 0x01, 0xab, 0xab, 0xab, 0xeb, 0x4b, 0xf6, 0x86, 0x6c, 0x02, 0x01,
+ 0x74, 0x44, 0xf6, 0x86, 0x6b, 0x02, 0x01, 0x75, 0x0d, 0xc6, 0x86, 0x6b,
+ 0x02, 0x01, 0xbe, 0x9d, 0x4c, 0xe8, 0x20, 0xce, 0xeb, 0x30, 0xf6, 0x86,
+ 0x62, 0x02, 0x01, 0x74, 0x12, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x0c, 0x83,
+ 0xbe, 0xc6, 0x02, 0x00, 0x75, 0x05, 0x83, 0x8e, 0xe6, 0x02, 0x08, 0xeb,
+ 0x15, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x0e, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xf2, 0x01, 0xa5, 0xa5, 0xa5, 0xc3, 0x53,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0x16, 0x03, 0x8c,
+ 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x74, 0x54, 0x8b, 0x44,
+ 0xfe, 0x89, 0x45, 0xfe, 0xf3, 0xa5, 0xbb, 0x02, 0x05, 0xb9, 0x0b, 0x00,
+ 0x8d, 0xb6, 0x16, 0x03, 0xad, 0x8b, 0x14, 0x8b, 0x74, 0x02, 0x8b, 0x3f,
+ 0x03, 0xfd, 0xab, 0x89, 0x15, 0x89, 0x75, 0x02, 0x83, 0xc3, 0x02, 0xe2,
+ 0xf1, 0xf6, 0x86, 0xaf, 0x02, 0x01, 0x75, 0x26, 0x8b, 0xb6, 0x2f, 0x06,
+ 0x8d, 0xbe, 0xee, 0x01, 0xa5, 0xa5, 0x80, 0x7e, 0x06, 0x08, 0x76, 0x0b,
+ 0xc7, 0x86, 0xc8, 0x02, 0x04, 0x00, 0xe8, 0x68, 0xee, 0xeb, 0x0b, 0xc6,
+ 0x86, 0x88, 0x02, 0x01, 0xc7, 0x86, 0xc8, 0x02, 0x01, 0x00, 0x5b, 0xc3,
+ 0xb8, 0x80, 0x0a, 0xf6, 0x86, 0xab, 0x02, 0x01, 0x75, 0x45, 0xf6, 0x86,
+ 0xad, 0x02, 0x01, 0x75, 0x3e, 0xf7, 0x86, 0xf6, 0x00, 0x10, 0x00, 0x75,
+ 0x36, 0xf7, 0x07, 0x82, 0x00, 0x74, 0x2f, 0xc7, 0x86, 0x2e, 0x02, 0x07,
+ 0x00, 0xc6, 0x86, 0x16, 0x01, 0x00, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x01,
+ 0xc6, 0x86, 0x89, 0x02, 0x01, 0xf6, 0x86, 0xac, 0x02, 0x01, 0x75, 0x0c,
+ 0x80, 0x7e, 0x06, 0x08, 0x72, 0x0c, 0x80, 0x7e, 0x06, 0x0e, 0x77, 0x06,
+ 0xb8, 0x0a, 0x00, 0xe8, 0x41, 0xdf, 0xc3, 0x89, 0x86, 0xee, 0x02, 0xe9,
+ 0x1b, 0xea, 0xf7, 0x07, 0x02, 0x00, 0x74, 0x0f, 0x80, 0x7e, 0x06, 0x0c,
+ 0x75, 0x09, 0xc6, 0x86, 0x64, 0x02, 0x01, 0xc6, 0x46, 0x07, 0x0e, 0x8b,
+ 0x86, 0x18, 0x02, 0x86, 0xe0, 0x8b, 0xb6, 0x54, 0x06, 0x0b, 0xf6, 0x74,
+ 0x09, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x18, 0x02, 0x86, 0xe0, 0x89, 0x86,
+ 0xea, 0x02, 0x8b, 0xb6, 0x3b, 0x06, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86,
+ 0xc4, 0x89, 0x86, 0x10, 0x02, 0x8b, 0xb6, 0x40, 0x06, 0x0b, 0xf6, 0x74,
+ 0x05, 0x8b, 0xc6, 0xe8, 0xa2, 0x00, 0x8b, 0xb6, 0x45, 0x06, 0x0b, 0xf6,
+ 0x74, 0x07, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x0c, 0x02, 0x8b, 0xb6, 0x4a,
+ 0x06, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, 0xc4, 0x89, 0x86, 0xfc, 0x01,
+ 0x8b, 0xb6, 0x4f, 0x06, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, 0xc4, 0x89,
+ 0x86, 0xfa, 0x01, 0x8b, 0x07, 0xa9, 0x02, 0x00, 0x75, 0x07, 0xa8, 0x28,
+ 0x74, 0x03, 0xe9, 0x71, 0xff, 0xc7, 0x86, 0xee, 0x02, 0x00, 0x01, 0xe9,
+ 0x8b, 0xe9, 0xc3, 0xf7, 0x07, 0x02, 0x02, 0x74, 0xf9, 0x8b, 0x86, 0x18,
+ 0x02, 0x86, 0xe0, 0x8b, 0xb6, 0x69, 0x06, 0x0b, 0xf6, 0x74, 0x09, 0xad,
+ 0x86, 0xe0, 0x89, 0x86, 0x18, 0x02, 0x86, 0xe0, 0x89, 0x86, 0xea, 0x02,
+ 0x8b, 0xb6, 0x5a, 0x06, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, 0xc4, 0x89,
+ 0x86, 0x10, 0x02, 0x8b, 0xb6, 0x5f, 0x06, 0x0b, 0xf6, 0x74, 0x05, 0x8b,
+ 0xc6, 0xe8, 0x20, 0x00, 0x8b, 0xb6, 0x64, 0x06, 0x0b, 0xf6, 0x74, 0x07,
+ 0xad, 0x86, 0xe0, 0x89, 0x86, 0x0c, 0x02, 0x80, 0x7e, 0x06, 0x0c, 0x75,
+ 0x96, 0xc6, 0x86, 0x64, 0x02, 0x01, 0xc6, 0x46, 0x07, 0x0e, 0xeb, 0x8b,
+ 0x53, 0x57, 0x8c, 0xdb, 0x8e, 0xc3, 0xbb, 0x18, 0x05, 0xb9, 0x0a, 0x00,
+ 0x8b, 0xf0, 0xad, 0x8b, 0x34, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0x89, 0x35,
+ 0x83, 0xc3, 0x02, 0xe2, 0xf4, 0x5f, 0x5b, 0xc3, 0x68, 0xe4, 0x2e, 0xeb,
+ 0x08, 0x68, 0x4c, 0x2f, 0xeb, 0x03, 0x68, 0x8e, 0x2f, 0xf7, 0x07, 0x82,
+ 0x02, 0x74, 0x1c, 0x8b, 0x86, 0x18, 0x02, 0x86, 0xe0, 0x8b, 0xb6, 0xa0,
+ 0x06, 0x0b, 0xf6, 0x74, 0x09, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x18, 0x02,
+ 0x86, 0xe0, 0x89, 0x86, 0xea, 0x02, 0xc3, 0x83, 0xc4, 0x02, 0xc3, 0x8b,
+ 0x07, 0xf6, 0x86, 0x63, 0x01, 0x01, 0x74, 0x1e, 0xa9, 0x00, 0x20, 0x74,
+ 0x40, 0x56, 0x57, 0xe8, 0xef, 0xc9, 0xc7, 0x44, 0x02, 0x02, 0x00, 0x8d,
+ 0x7e, 0x16, 0xe8, 0x02, 0xca, 0xbe, 0x91, 0x4c, 0xe8, 0x77, 0xcc, 0x5f,
+ 0x5e, 0xc3, 0x80, 0x7e, 0x06, 0x08, 0x75, 0x21, 0xa9, 0x00, 0x10, 0x74,
+ 0x1c, 0xa9, 0x3c, 0x00, 0x75, 0x17, 0xff, 0x86, 0xd2, 0x02, 0xff, 0x86,
+ 0xd0, 0x02, 0x83, 0xbe, 0xd0, 0x02, 0x02, 0x72, 0x05, 0xc6, 0x46, 0x07,
+ 0x0a, 0xc3, 0xe8, 0x20, 0xea, 0xc3, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0,
+ 0x8b, 0x3e, 0x2c, 0x5f, 0x83, 0xc7, 0x06, 0x81, 0xff, 0x46, 0x66, 0x72,
+ 0x03, 0xbf, 0x40, 0x66, 0xab, 0xab, 0xab, 0xf6, 0x86, 0xd0, 0x01, 0x01,
+ 0x74, 0x18, 0xc6, 0x86, 0xcf, 0x01, 0x01, 0xe8, 0x8b, 0xc9, 0xc7, 0x44,
+ 0x02, 0x05, 0x00, 0x8d, 0x7e, 0x16, 0xe8, 0x9e, 0xc9, 0xc6, 0x86, 0xce,
+ 0x01, 0x00, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x08, 0x00, 0x74, 0x06, 0xbe,
+ 0x5d, 0x4d, 0xe8, 0x53, 0xcb, 0x8d, 0xb6, 0xc4, 0x15, 0x8e, 0x46, 0x02,
+ 0x8a, 0x1c, 0xf6, 0xc3, 0x80, 0x75, 0x0d, 0x80, 0xfb, 0x10, 0x77, 0x14,
+ 0x32, 0xff, 0xd1, 0xe3, 0xff, 0xa7, 0xe0, 0x04, 0xc7, 0x86, 0x0a, 0x01,
+ 0x00, 0x00, 0xc3, 0xb8, 0x00, 0x80, 0xeb, 0x08, 0xb8, 0x00, 0x80, 0xeb,
+ 0x03, 0xb8, 0x00, 0x20, 0x8d, 0xb6, 0xc4, 0x15, 0x89, 0x44, 0x02, 0x80,
+ 0x0c, 0x80, 0xb8, 0x40, 0x60, 0x8e, 0xc0, 0xc7, 0x86, 0x0a, 0x01, 0x00,
+ 0x00, 0x26, 0xc7, 0x06, 0x30, 0x00, 0x08, 0x00, 0xc3, 0xeb, 0xe1, 0xb8,
+ 0x04, 0x00, 0x80, 0xbe, 0x06, 0x01, 0x01, 0x75, 0xf4, 0xb8, 0x05, 0x00,
+ 0x80, 0xbe, 0x07, 0x01, 0x01, 0x74, 0xea, 0xc6, 0x86, 0x08, 0x01, 0x01,
+ 0xc6, 0x86, 0xd1, 0x01, 0x00, 0xc6, 0x86, 0x09, 0x01, 0x00, 0x8b, 0x86,
+ 0xf8, 0x00, 0x89, 0x86, 0xf6, 0x00, 0x8d, 0xb6, 0xce, 0x15, 0xb8, 0x03,
+ 0x00, 0xf6, 0x04, 0x80, 0x75, 0xc7, 0x33, 0xc0, 0x39, 0x04, 0x75, 0x1e,
+ 0x39, 0x44, 0x02, 0x75, 0x19, 0x39, 0x44, 0x04, 0x75, 0x14, 0x8b, 0x86,
+ 0x00, 0x01, 0x89, 0x04, 0x8b, 0x86, 0x02, 0x01, 0x89, 0x44, 0x02, 0x8b,
+ 0x86, 0x04, 0x01, 0x89, 0x44, 0x04, 0xad, 0x8b, 0x14, 0x8b, 0x74, 0x02,
+ 0x89, 0x86, 0xd4, 0x01, 0x89, 0x96, 0xd6, 0x01, 0x89, 0xb6, 0xd8, 0x01,
+ 0x8e, 0x46, 0x02, 0x50, 0xe8, 0x8e, 0xc7, 0x26, 0xa3, 0x5e, 0x00, 0x8b,
+ 0xc2, 0xe8, 0x85, 0xc7, 0x26, 0xa3, 0x60, 0x00, 0x8b, 0xc6, 0xe8, 0x7c,
+ 0xc7, 0x26, 0xa3, 0x62, 0x00, 0x58, 0xbb, 0x30, 0x05, 0xb9, 0x16, 0x00,
+ 0x1e, 0x07, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0x89, 0x15, 0x89, 0x75, 0x02,
+ 0x83, 0xc3, 0x02, 0xe2, 0xf1, 0xbb, 0x2c, 0x05, 0x8d, 0x96, 0xdc, 0x15,
+ 0xb8, 0x02, 0x00, 0x8b, 0x3f, 0x03, 0xfd, 0x8b, 0xf2, 0xb9, 0x09, 0x00,
+ 0xf3, 0xa5, 0x83, 0xc3, 0x02, 0x48, 0x75, 0xef, 0xf7, 0x86, 0xf6, 0x00,
+ 0x08, 0x00, 0x74, 0x06, 0xbe, 0x5d, 0x4d, 0xe8, 0x3a, 0xca, 0x8d, 0xb6,
+ 0xc4, 0x15, 0x8b, 0x44, 0x08, 0x89, 0x86, 0x12, 0x01, 0x89, 0x86, 0x14,
+ 0x01, 0xf7, 0x86, 0x12, 0x01, 0x01, 0x00, 0x74, 0x08, 0xc7, 0x06, 0x8f,
+ 0x4c, 0x58, 0x02, 0xeb, 0x06, 0xc7, 0x06, 0x8f, 0x4c, 0x08, 0x07, 0x8e,
+ 0x46, 0x02, 0x26, 0x8b, 0x1e, 0x68, 0x00, 0x81, 0xe3, 0xff, 0xf4, 0xa9,
+ 0x04, 0x00, 0x74, 0x04, 0x81, 0xcb, 0x00, 0x08, 0xa9, 0x02, 0x00, 0x74,
+ 0x04, 0x81, 0xcb, 0x00, 0x03, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x68,
+ 0x00, 0x8d, 0xb6, 0xd8, 0x15, 0xe8, 0x64, 0x02, 0x8d, 0xb6, 0xd4, 0x15,
+ 0xe8, 0x23, 0x00, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x74, 0x03, 0xe8, 0x87,
+ 0x16, 0xc6, 0x86, 0x07, 0x01, 0x01, 0xe8, 0xd0, 0x03, 0xe8, 0xc7, 0x05,
+ 0xe9, 0xa2, 0xfe, 0x56, 0x83, 0xc6, 0x08, 0xe8, 0x04, 0x00, 0x5e, 0xe9,
+ 0x97, 0xfe, 0x8e, 0x46, 0x02, 0xb8, 0xc0, 0x00, 0xe8, 0xb2, 0xc6, 0x26,
+ 0xa3, 0x7a, 0x00, 0x8b, 0x04, 0x0d, 0x80, 0x00, 0x89, 0x86, 0xda, 0x01,
+ 0xe8, 0xa2, 0xc6, 0x26, 0xa3, 0x7c, 0x00, 0x8b, 0x44, 0x02, 0x89, 0x86,
+ 0xdc, 0x01, 0xe8, 0x94, 0xc6, 0x26, 0xa3, 0x7e, 0x00, 0xc3, 0x83, 0x8e,
+ 0x1e, 0x01, 0x01, 0xc6, 0x86, 0x16, 0x01, 0x00, 0x8a, 0x46, 0x06, 0x3c,
+ 0x00, 0x74, 0x46, 0x3c, 0x10, 0x75, 0x03, 0xe9, 0x53, 0xfe, 0x3c, 0x12,
+ 0x74, 0x3b, 0x3c, 0x4c, 0x75, 0x03, 0xe9, 0x48, 0xfe, 0x80, 0xbe, 0xfe,
+ 0x00, 0x02, 0x72, 0x1a, 0x3c, 0x48, 0x74, 0x0f, 0xf6, 0x86, 0x72, 0x02,
+ 0x01, 0x74, 0x17, 0x3c, 0x44, 0x74, 0x04, 0x3c, 0x46, 0x75, 0x28, 0xc6,
+ 0x46, 0x07, 0x4c, 0xe9, 0x27, 0xfe, 0x3c, 0x0e, 0x74, 0x17, 0x3c, 0x48,
+ 0x74, 0x19, 0xe8, 0x1c, 0xfe, 0xb8, 0x0f, 0x00, 0xe8, 0x4c, 0xdb, 0xeb,
+ 0x35, 0xe8, 0x11, 0xfe, 0xe8, 0x04, 0x04, 0xeb, 0x2d, 0xc6, 0x46, 0x07,
+ 0x10, 0xeb, 0x20, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75,
+ 0x08, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d,
+ 0x01, 0x01, 0xe8, 0x35, 0x16, 0xc6, 0x46, 0x07, 0x12, 0xeb, 0x00, 0xc6,
+ 0x46, 0x09, 0x1e, 0xe9, 0xdf, 0xfd, 0xc3, 0xc6, 0x86, 0x06, 0x01, 0x00,
+ 0xb8, 0x05, 0x00, 0x80, 0xbe, 0x07, 0x01, 0x01, 0x75, 0x03, 0xe9, 0xcf,
+ 0xfd, 0x8b, 0x44, 0x08, 0x89, 0x86, 0xf4, 0x00, 0x8b, 0x44, 0x0a, 0xa9,
+ 0x00, 0x10, 0x74, 0x03, 0x0d, 0x00, 0x01, 0x89, 0x86, 0xf6, 0x00, 0x89,
+ 0x86, 0xf8, 0x00, 0x8b, 0x44, 0x12, 0x0b, 0xc0, 0x75, 0x21, 0xf7, 0x86,
+ 0xf4, 0x00, 0x00, 0x40, 0x74, 0x0b, 0xb8, 0x1f, 0x47, 0xf7, 0x86, 0xf6,
+ 0x00, 0x00, 0x12, 0x75, 0x0e, 0xb8, 0x18, 0x47, 0xf7, 0x86, 0xf6, 0x00,
+ 0x00, 0x01, 0x75, 0x03, 0xb8, 0xc6, 0x11, 0x89, 0x86, 0xfa, 0x00, 0xe8,
+ 0xab, 0x02, 0x8d, 0xbe, 0x56, 0x04, 0x8b, 0x44, 0x0c, 0x89, 0x05, 0x89,
+ 0x86, 0x00, 0x01, 0x8b, 0x44, 0x0e, 0x89, 0x45, 0x02, 0x89, 0x86, 0x02,
+ 0x01, 0x8b, 0x44, 0x10, 0x89, 0x45, 0x04, 0x89, 0x86, 0x04, 0x01, 0x80,
+ 0xbe, 0x62, 0x01, 0x01, 0x75, 0x21, 0x8b, 0x44, 0x0c, 0x89, 0x86, 0xbc,
+ 0x03, 0x89, 0x86, 0xc2, 0x03, 0x8b, 0x44, 0x0e, 0x89, 0x86, 0xbe, 0x03,
+ 0x89, 0x86, 0xc4, 0x03, 0x8b, 0x44, 0x10, 0x89, 0x86, 0xc0, 0x03, 0x89,
+ 0x86, 0xc6, 0x03, 0x8e, 0x46, 0x02, 0x8b, 0x86, 0xfa, 0x00, 0x26, 0xa3,
+ 0x52, 0x00, 0x8b, 0x44, 0x14, 0x26, 0xa3, 0x6a, 0x00, 0x8b, 0x44, 0x16,
+ 0x25, 0xff, 0xf4, 0x83, 0xc8, 0x30, 0x26, 0xa3, 0x68, 0x00, 0x8d, 0x1e,
+ 0x72, 0x05, 0x8b, 0x44, 0x18, 0xc1, 0xe8, 0x04, 0x83, 0xe0, 0x0f, 0xd7,
+ 0xa2, 0x87, 0x03, 0x8b, 0x44, 0x18, 0xc1, 0xe8, 0x0c, 0x83, 0xe0, 0x0f,
+ 0xd7, 0xa2, 0x88, 0x03, 0x33, 0xc0, 0xd7, 0xa2, 0x89, 0x03, 0x06, 0x51,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xbe, 0x80, 0x03, 0x8d, 0xbe, 0x1a, 0x04, 0xb9,
+ 0x05, 0x00, 0xf3, 0xa5, 0x59, 0x07, 0x8b, 0x86, 0xf4, 0x00, 0x25, 0xff,
+ 0xfe, 0xc1, 0xe8, 0x08, 0x89, 0x86, 0x28, 0x02, 0xf7, 0x86, 0xf4, 0x00,
+ 0x04, 0x00, 0x74, 0x0f, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, 0x08, 0xc6,
+ 0x06, 0x23, 0x5f, 0x01, 0xe8, 0xd0, 0x11, 0x80, 0xbe, 0x62, 0x01, 0x01,
+ 0x75, 0x01, 0xc3, 0xc6, 0x86, 0x06, 0x01, 0x01, 0xe9, 0xae, 0xfc, 0x56,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x7c, 0x08, 0x8d, 0xb6, 0xdc, 0x02, 0xb9,
+ 0x05, 0x00, 0x8b, 0xd1, 0xf3, 0xa5, 0x8d, 0xbe, 0xdc, 0x02, 0x33, 0xc0,
+ 0x8b, 0xca, 0xf3, 0xab, 0x81, 0xa6, 0x0a, 0x02, 0x7f, 0xdf, 0x5e, 0xe9,
+ 0x87, 0xfc, 0x56, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x7c, 0x08, 0x8d, 0xb6,
+ 0x40, 0x02, 0xb9, 0x0c, 0x00, 0x8b, 0xd1, 0xf3, 0xa5, 0x8d, 0xbe, 0x40,
+ 0x02, 0x33, 0xc0, 0x8b, 0xca, 0xf3, 0xab, 0x5e, 0xe9, 0x66, 0xfc, 0x83,
+ 0xc6, 0x08, 0xe8, 0x03, 0x00, 0xe9, 0x5d, 0xfc, 0x06, 0x8e, 0x46, 0x02,
+ 0x8b, 0x04, 0x89, 0x86, 0xde, 0x01, 0xe8, 0x74, 0xc4, 0x26, 0xa3, 0x66,
+ 0x00, 0x8b, 0x44, 0x02, 0x23, 0x86, 0xfc, 0x01, 0xe8, 0x66, 0xc4, 0x25,
+ 0xff, 0x7f, 0x26, 0x8b, 0x0e, 0x64, 0x00, 0x81, 0xe1, 0x00, 0x80, 0x0b,
+ 0xc1, 0x26, 0xa3, 0x64, 0x00, 0xe8, 0x51, 0xc4, 0x89, 0x86, 0xe0, 0x01,
+ 0x07, 0xc3, 0xb8, 0x05, 0x00, 0x80, 0xbe, 0x07, 0x01, 0x01, 0x75, 0x03,
+ 0xe9, 0x1d, 0xfc, 0xc6, 0x86, 0x62, 0x01, 0x01, 0xe8, 0x34, 0xfe, 0xc6,
+ 0x86, 0x62, 0x01, 0x00, 0xc6, 0x86, 0x06, 0x01, 0x01, 0xe9, 0x05, 0xfc,
+ 0xb8, 0x11, 0x00, 0xc6, 0x86, 0x62, 0x01, 0x00, 0xe9, 0xfd, 0xfb, 0xc3,
+ 0x8b, 0xd8, 0x26, 0x8b, 0x04, 0x50, 0x33, 0xc0, 0x50, 0x23, 0xc3, 0x8b,
+ 0xc8, 0x26, 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b, 0xc1, 0x58,
+ 0x75, 0x3c, 0x05, 0x55, 0x55, 0x73, 0xe9, 0xb8, 0x01, 0x00, 0x50, 0x23,
+ 0xc3, 0x8b, 0xc8, 0x26, 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b,
+ 0xc1, 0x58, 0x75, 0x22, 0xd1, 0xc0, 0x73, 0xea, 0xf7, 0xd0, 0x50, 0x23,
+ 0xc3, 0x8b, 0xc8, 0x26, 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b,
+ 0xc1, 0x58, 0x75, 0x0a, 0xd1, 0xc0, 0x72, 0xea, 0xf8, 0x58, 0x26, 0x89,
+ 0x04, 0xc3, 0xf9, 0xeb, 0xf8, 0x8b, 0x44, 0x08, 0x25, 0xff, 0x7b, 0x89,
+ 0x86, 0x12, 0x01, 0x89, 0x86, 0x14, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x8b,
+ 0x1e, 0x68, 0x00, 0x81, 0xe3, 0xff, 0xf4, 0xa9, 0x04, 0x00, 0x74, 0x04,
+ 0x81, 0xcb, 0x00, 0x08, 0xa9, 0x02, 0x00, 0x74, 0x04, 0x81, 0xcb, 0x00,
+ 0x03, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x68, 0x00, 0xe9, 0x69, 0xfb,
+ 0xe9, 0x61, 0xfb, 0x8b, 0x44, 0x08, 0x89, 0x86, 0x30, 0x01, 0xbe, 0x4b,
+ 0x4d, 0xe8, 0x80, 0xc6, 0xe9, 0x56, 0xfb, 0x8b, 0x44, 0x08, 0x8e, 0x46,
+ 0x02, 0x26, 0xa3, 0x6a, 0x00, 0xe9, 0x49, 0xfb, 0x80, 0x7e, 0x06, 0x0e,
+ 0x74, 0x06, 0x80, 0x7e, 0x06, 0x48, 0x75, 0x13, 0x80, 0x7e, 0x08, 0x00,
+ 0x74, 0x06, 0x80, 0x7e, 0x08, 0x16, 0x75, 0x07, 0x8d, 0x5c, 0x08, 0xe8,
+ 0x8a, 0xe8, 0xc3, 0xb8, 0x00, 0x10, 0xe9, 0x27, 0xfb, 0xb8, 0x04, 0x00,
+ 0xf6, 0x86, 0x07, 0x01, 0x01, 0x74, 0x1e, 0x8e, 0x46, 0x02, 0x26, 0xa1,
+ 0x68, 0x00, 0x8b, 0x5c, 0x08, 0x81, 0xe3, 0xff, 0xf4, 0x25, 0x00, 0x0b,
+ 0x0b, 0xd8, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x68, 0x00, 0xb8, 0x00,
+ 0x20, 0xe9, 0xfc, 0xfa, 0xb8, 0x05, 0x00, 0xf6, 0x86, 0x07, 0x01, 0x01,
+ 0x75, 0x11, 0xfa, 0xe8, 0xe6, 0xc7, 0xfa, 0xe8, 0xe7, 0xfa, 0x8e, 0x46,
+ 0x02, 0x26, 0x83, 0x0e, 0x32, 0x00, 0x02, 0xe9, 0xde, 0xfa, 0xe9, 0xd8,
+ 0xfa, 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x40, 0x74, 0x0d, 0xc6, 0x86, 0xfe,
+ 0x00, 0x02, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x12, 0x75, 0x12, 0xc6, 0x86,
+ 0xfe, 0x00, 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x11, 0x75, 0x05, 0xc6,
+ 0x86, 0xfe, 0x00, 0x00, 0xc3, 0x8b, 0xd0, 0xb8, 0x01, 0x00, 0xe9, 0xa3,
+ 0x01, 0xc3, 0x80, 0xbe, 0xb2, 0x02, 0x01, 0x74, 0x0e, 0x80, 0xbe, 0x07,
+ 0x01, 0x01, 0x75, 0xf1, 0x80, 0xbe, 0x09, 0x01, 0x01, 0x74, 0xea, 0xc6,
+ 0x86, 0x09, 0x01, 0x01, 0xc6, 0x86, 0xb2, 0x02, 0x00, 0x80, 0xbe, 0xfe,
+ 0x00, 0x01, 0x74, 0x0c, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x08, 0x0d,
+ 0x00, 0x08, 0xeb, 0x03, 0x0d, 0x00, 0x01, 0x80, 0xbe, 0xaa, 0x02, 0x01,
+ 0x74, 0x0a, 0x80, 0xbe, 0xac, 0x02, 0x01, 0x74, 0x03, 0x0d, 0x00, 0x04,
+ 0x80, 0xbe, 0xaa, 0x02, 0x01, 0x74, 0x0a, 0x80, 0xbe, 0xab, 0x02, 0x01,
+ 0x74, 0x03, 0x0d, 0x00, 0x02, 0xf7, 0x86, 0xa6, 0x02, 0x01, 0x00, 0x74,
+ 0x03, 0x0d, 0x00, 0x08, 0xa9, 0x00, 0x80, 0x74, 0x1d, 0xc7, 0x86, 0x2e,
+ 0x01, 0x02, 0x00, 0xf6, 0x86, 0x2c, 0x01, 0x01, 0x74, 0x1d, 0x53, 0xbb,
+ 0x40, 0x60, 0x8e, 0xc3, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x02, 0x5b,
+ 0xeb, 0x0d, 0x8a, 0x56, 0x06, 0xd0, 0xe2, 0xd0, 0xe2, 0xd0, 0xe2, 0x24,
+ 0x0f, 0x0a, 0xc2, 0x89, 0x86, 0x38, 0x02, 0x8b, 0xd0, 0xb8, 0x02, 0x00,
+ 0xe9, 0x92, 0x00, 0x8b, 0x96, 0x1e, 0x01, 0x8b, 0x86, 0x12, 0x01, 0xa9,
+ 0x00, 0x02, 0x74, 0x06, 0xf7, 0xc2, 0x05, 0x80, 0x74, 0x0e, 0xc6, 0x86,
+ 0x07, 0x01, 0x00, 0xc6, 0x86, 0x16, 0x01, 0x00, 0x81, 0xca, 0x80, 0x00,
+ 0x33, 0xc0, 0x89, 0x86, 0x1e, 0x01, 0x89, 0x96, 0x20, 0x01, 0xc7, 0x86,
+ 0x38, 0x02, 0x00, 0x00, 0xf7, 0xc2, 0x01, 0x00, 0x75, 0x22, 0x83, 0xbe,
+ 0x2e, 0x01, 0x03, 0x74, 0x1b, 0xc7, 0x86, 0x2e, 0x01, 0x03, 0x00, 0xf6,
+ 0x86, 0x2c, 0x01, 0x01, 0x74, 0x0e, 0x53, 0xbb, 0x40, 0x60, 0x8e, 0xc3,
+ 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x02, 0x5b, 0xb8, 0x03, 0x00, 0xeb,
+ 0x34, 0x3b, 0xc0, 0x74, 0x00, 0x8b, 0xd0, 0xb8, 0x04, 0x00, 0xeb, 0x29,
+ 0xc3, 0xc6, 0x86, 0xce, 0x01, 0x00, 0xc6, 0x86, 0xcf, 0x01, 0x00, 0x55,
+ 0x33, 0xed, 0xbe, 0x1c, 0x5e, 0xe8, 0xb4, 0xc4, 0x5d, 0xb8, 0x05, 0x00,
+ 0xeb, 0x0f, 0xb8, 0x06, 0x00, 0xeb, 0x0a, 0xb8, 0x07, 0x00, 0xeb, 0x05,
+ 0xb8, 0x08, 0x00, 0xeb, 0x00, 0x8b, 0xb6, 0x60, 0x01, 0x3b, 0xb6, 0x5e,
+ 0x01, 0x75, 0x0a, 0xf7, 0x86, 0xb0, 0x15, 0x00, 0x80, 0x74, 0x02, 0xeb,
+ 0x5f, 0x8b, 0x8e, 0x5e, 0x01, 0x41, 0x80, 0xe1, 0x07, 0x3b, 0xf1, 0x75,
+ 0x20, 0x46, 0x83, 0xe6, 0x07, 0x89, 0xb6, 0x60, 0x01, 0x51, 0x8b, 0xce,
+ 0xd1, 0xe1, 0xd1, 0xe1, 0x8d, 0xb6, 0x3e, 0x01, 0x03, 0xf1, 0x8b, 0x0c,
+ 0x83, 0xf9, 0x05, 0x74, 0x03, 0x0d, 0x00, 0x01, 0x59, 0x83, 0xf8, 0x04,
+ 0x75, 0x1a, 0x51, 0xb9, 0x08, 0x00, 0x8d, 0xb6, 0x3e, 0x01, 0x39, 0x04,
+ 0x74, 0x08, 0x83, 0xc6, 0x04, 0xe2, 0xf7, 0x59, 0xeb, 0x06, 0x89, 0x54,
+ 0x02, 0x59, 0xeb, 0x13, 0x89, 0x8e, 0x5e, 0x01, 0xd1, 0xe1, 0xd1, 0xe1,
+ 0x8d, 0xb6, 0x3e, 0x01, 0x03, 0xf1, 0x89, 0x04, 0x89, 0x54, 0x02, 0xc3,
+ 0x8d, 0xb6, 0xb0, 0x15, 0x89, 0x54, 0x06, 0xc7, 0x44, 0x04, 0x08, 0x00,
+ 0x3c, 0x05, 0x75, 0x05, 0xc7, 0x44, 0x04, 0x06, 0x00, 0x25, 0xff, 0x7f,
+ 0x89, 0x04, 0xb8, 0x40, 0x60, 0x8e, 0xc0, 0x26, 0xc7, 0x06, 0x30, 0x00,
+ 0x00, 0x20, 0xc3, 0x8b, 0x86, 0x14, 0x01, 0x89, 0x86, 0x12, 0x01, 0xc6,
+ 0x46, 0x09, 0x1e, 0xc6, 0x46, 0x08, 0x1e, 0xc6, 0x46, 0x0b, 0x00, 0xc7,
+ 0x86, 0x28, 0x01, 0x00, 0x00, 0xc7, 0x86, 0x2a, 0x01, 0x00, 0x00, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0xbe, 0xe4, 0x01, 0xb9, 0x2b, 0x00,
+ 0xf3, 0xab, 0xc7, 0x86, 0x2a, 0x02, 0xff, 0xff, 0x8e, 0x46, 0x02, 0xb8,
+ 0x02, 0x00, 0xf7, 0x86, 0xf4, 0x00, 0x80, 0x00, 0x74, 0x03, 0x83, 0xc8,
+ 0x01, 0xf7, 0x86, 0xf4, 0x00, 0x40, 0x00, 0x74, 0x03, 0x83, 0xc8, 0x04,
+ 0xf7, 0x86, 0xf4, 0x00, 0x20, 0x00, 0x74, 0x03, 0x83, 0xc8, 0x08, 0x26,
+ 0xa3, 0x4e, 0x00, 0xb0, 0x02, 0xe8, 0x0e, 0xc8, 0xf7, 0x86, 0xf4, 0x00,
+ 0x00, 0x20, 0x74, 0x28, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x74, 0x0c,
+ 0xb8, 0x05, 0x00, 0xe8, 0x27, 0x00, 0xc6, 0x46, 0x07, 0x42, 0xeb, 0x20,
+ 0xf7, 0x86, 0xf6, 0x00, 0x80, 0x00, 0x74, 0x0c, 0xb8, 0x05, 0x00, 0xe8,
+ 0x13, 0x00, 0xc6, 0x46, 0x07, 0x42, 0xeb, 0x0c, 0xb8, 0x02, 0x00, 0xe8,
+ 0x07, 0x00, 0xc6, 0x46, 0x07, 0x02, 0xeb, 0x00, 0xc3, 0x50, 0xb0, 0x00,
+ 0x88, 0x86, 0xaa, 0x02, 0x88, 0x86, 0xab, 0x02, 0x88, 0x86, 0xac, 0x02,
+ 0x88, 0x86, 0xad, 0x02, 0x88, 0x86, 0xaf, 0x02, 0x88, 0x86, 0xae, 0x02,
+ 0x58, 0x9c, 0xfa, 0x83, 0xf8, 0x02, 0x74, 0x13, 0x83, 0xf8, 0x05, 0x74,
+ 0x0c, 0xc7, 0x46, 0x12, 0x5a, 0x21, 0xc7, 0x46, 0x14, 0x5a, 0x21, 0xeb,
+ 0x42, 0xeb, 0x21, 0xc6, 0x86, 0xaa, 0x02, 0x01, 0xc6, 0x86, 0xae, 0x02,
+ 0x01, 0xc6, 0x86, 0xaf, 0x02, 0x00, 0xc7, 0x46, 0x12, 0x62, 0x37, 0xc7,
+ 0x46, 0x14, 0x89, 0x34, 0xc7, 0x86, 0xba, 0x01, 0x2c, 0x00, 0xeb, 0x1f,
+ 0xc6, 0x86, 0xac, 0x02, 0x01, 0xc6, 0x86, 0xae, 0x02, 0x00, 0xc6, 0x86,
+ 0xaf, 0x02, 0x01, 0xc7, 0x46, 0x12, 0x66, 0x37, 0xc7, 0x46, 0x14, 0x8d,
+ 0x34, 0xc7, 0x86, 0xba, 0x01, 0x30, 0x00, 0x0e, 0xe8, 0x02, 0x00, 0xeb,
+ 0x01, 0xcf, 0xc3, 0x8c, 0x00, 0x76, 0x4d, 0xbc, 0x02, 0x96, 0x00, 0xac,
+ 0x4d, 0x14, 0x00, 0x96, 0x00, 0xc0, 0x4d, 0x08, 0x07, 0x96, 0x00, 0xfe,
+ 0x4d, 0x6e, 0x00, 0x78, 0x00, 0x64, 0x50, 0x00, 0x00, 0x6e, 0x00, 0xc0,
+ 0x4e, 0xf4, 0x01, 0x6e, 0x00, 0xf0, 0x4e, 0x08, 0x07, 0x6e, 0x00, 0x1c,
+ 0x52, 0x02, 0x00, 0xaa, 0x00, 0x38, 0x4f, 0xfa, 0x00, 0x8c, 0x00, 0x88,
+ 0x4f, 0x02, 0x00, 0x8c, 0x00, 0x8a, 0x4e, 0x3c, 0x00, 0x78, 0x00, 0xf4,
+ 0x4f, 0x04, 0x01, 0x96, 0x00, 0x20, 0x50, 0x64, 0x00, 0x96, 0x00, 0x44,
+ 0x50, 0xdc, 0x05, 0xbe, 0x00, 0x72, 0x51, 0xf4, 0x01, 0xbe, 0x00, 0x72,
+ 0x51, 0x32, 0x00, 0xa0, 0x00, 0xee, 0x52, 0xf4, 0x01, 0xbe, 0x00, 0x9c,
+ 0x51, 0xf4, 0x01, 0x82, 0x00, 0xc0, 0x55, 0x19, 0x00, 0x6e, 0x00, 0xd4,
+ 0x52, 0x14, 0x00, 0x78, 0x00, 0xb0, 0x51, 0xc4, 0x09, 0x6e, 0x00, 0xc4,
+ 0x51, 0x02, 0x00, 0xd2, 0x00, 0x4a, 0x56, 0x2c, 0x01, 0x78, 0x00, 0xc6,
+ 0x54, 0xf0, 0x00, 0x6e, 0x00, 0x46, 0x53, 0x32, 0x00, 0xa0, 0x00, 0xa8,
+ 0x53, 0xbc, 0x02, 0x6e, 0x00, 0xba, 0x53, 0x08, 0x07, 0x6e, 0x00, 0xc8,
+ 0x53, 0xe8, 0x03, 0x6e, 0x00, 0xda, 0x53, 0x14, 0x00, 0x96, 0x00, 0xe6,
+ 0x53, 0x64, 0x00, 0xa0, 0x00, 0xd4, 0x54, 0xf4, 0x01, 0xc8, 0x00, 0x72,
+ 0x4f, 0x02, 0x00, 0x6e, 0x00, 0x16, 0x54, 0x04, 0x00, 0x8c, 0x00, 0x9e,
+ 0x54, 0x14, 0x00, 0x6e, 0x00, 0x84, 0x56, 0x84, 0x03, 0x96, 0x00, 0x92,
+ 0x56, 0x02, 0x00, 0x82, 0x00, 0xc6, 0x52, 0x14, 0x00, 0xb4, 0x00, 0xbe,
+ 0x56, 0x02, 0x00, 0xdc, 0x00, 0x7a, 0x56, 0x64, 0x00, 0xa0, 0x00, 0xe5,
+ 0x55, 0x64, 0x00, 0xc8, 0x00, 0xfc, 0x55, 0x03, 0x00, 0xd2, 0x00, 0x4e,
+ 0x56, 0xf4, 0x01, 0xd2, 0x00, 0x60, 0x56, 0x4c, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x80, 0xbe,
+ 0x58, 0x02, 0x01, 0x75, 0x28, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x22, 0xf6,
+ 0x86, 0x69, 0x02, 0x01, 0x74, 0x1c, 0xe8, 0xee, 0xdf, 0xbe, 0x67, 0x4c,
+ 0xe8, 0xb9, 0xc1, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0xbe, 0xf2,
+ 0x01, 0xab, 0xab, 0xab, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc3, 0xe8, 0xa6,
+ 0xe2, 0xeb, 0xdf, 0x90, 0x8a, 0x46, 0x08, 0x3c, 0x0a, 0x75, 0x0b, 0xf6,
+ 0x86, 0x62, 0x02, 0x01, 0x74, 0x04, 0xc6, 0x46, 0x09, 0x04, 0xc3, 0x90,
+ 0x80, 0xbe, 0xab, 0x02, 0x01, 0x74, 0x32, 0x80, 0x7e, 0x08, 0x06, 0x75,
+ 0x2c, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0x0f, 0xf6, 0x86, 0x62, 0x02, 0x01,
+ 0x74, 0x08, 0xb8, 0x07, 0x00, 0xe8, 0x7b, 0xd3, 0xeb, 0x17, 0xf6, 0x86,
+ 0x62, 0x02, 0x01, 0x74, 0x10, 0xf6, 0x86, 0x5d, 0x02, 0x01, 0x75, 0x09,
+ 0xc6, 0x86, 0x5d, 0x02, 0x01, 0xc6, 0x46, 0x09, 0x08, 0xc3, 0xe9, 0x84,
+ 0x00, 0x90, 0x8a, 0x4e, 0x06, 0x8a, 0x56, 0x08, 0x80, 0xf9, 0x06, 0x74,
+ 0xf1, 0x80, 0xf9, 0x08, 0x74, 0x05, 0x80, 0xf9, 0x0a, 0x75, 0x0a, 0x80,
+ 0xfa, 0x0c, 0x74, 0xe2, 0x80, 0xfa, 0x04, 0x74, 0xdd, 0x80, 0xfa, 0x0c,
+ 0x74, 0x05, 0x80, 0xfa, 0x04, 0x75, 0x59, 0xf6, 0x86, 0x67, 0x02, 0x01,
+ 0x74, 0x52, 0xe8, 0xed, 0x02, 0xf6, 0x86, 0x65, 0x02, 0x01, 0x74, 0x0b,
+ 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x80, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xc6,
+ 0x46, 0x09, 0x06, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x50, 0xc6, 0x86, 0x89,
+ 0x02, 0x01, 0xc6, 0x86, 0x6e, 0x02, 0x01, 0xc6, 0x86, 0x6d, 0x02, 0x01,
+ 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0x28, 0xc3, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80,
+ 0xbe, 0x73, 0x4c, 0xe8, 0xd2, 0xc0, 0xbe, 0x9d, 0x4c, 0xe8, 0xcc, 0xc0,
+ 0xc3, 0xb8, 0x07, 0x00, 0xe8, 0xd4, 0xd2, 0xeb, 0xf7, 0x90, 0x80, 0xbe,
+ 0xaa, 0x02, 0x01, 0x74, 0x02, 0xeb, 0x2b, 0x80, 0x7e, 0x06, 0x10, 0x75,
+ 0x06, 0xc6, 0x46, 0x07, 0x12, 0xeb, 0x1f, 0x80, 0x7e, 0x08, 0x08, 0x75,
+ 0x19, 0xc6, 0x86, 0x6d, 0x02, 0x01, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8,
+ 0xda, 0xc2, 0xbe, 0xdf, 0x4c, 0xe8, 0x94, 0xc0, 0xbe, 0xe5, 0x4c, 0xe8,
+ 0x8e, 0xc0, 0xc3, 0x90, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x74, 0x28, 0xc6,
+ 0x86, 0x63, 0x02, 0x00, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x06, 0xc6, 0x46,
+ 0x09, 0x04, 0xeb, 0x17, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x11, 0xc6, 0x86,
+ 0x6d, 0x02, 0x01, 0xe8, 0xa6, 0xc2, 0xbe, 0x9d, 0x4c, 0xe8, 0x60, 0xc0,
+ 0xe8, 0xe7, 0xdd, 0xc3, 0x8a, 0x46, 0x06, 0x3c, 0x04, 0x75, 0x31, 0xf7,
+ 0x86, 0xf6, 0x00, 0x00, 0x10, 0x75, 0x21, 0xe8, 0xea, 0xd3, 0xc6, 0x86,
+ 0x97, 0x02, 0x00, 0x8b, 0x86, 0xf8, 0x00, 0x89, 0x86, 0xf6, 0x00, 0xe8,
+ 0x3b, 0xfa, 0xc6, 0x46, 0x07, 0x06, 0xc6, 0x46, 0x06, 0x06, 0xc6, 0x46,
+ 0x09, 0x04, 0xeb, 0x16, 0xb8, 0x0d, 0x00, 0xe8, 0x35, 0xd2, 0xeb, 0x0e,
+ 0x3c, 0x08, 0x72, 0x0a, 0x3c, 0x0c, 0x77, 0x06, 0xb8, 0x05, 0x00, 0xe8,
+ 0x25, 0xd2, 0xc3, 0x90, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x33, 0xf6, 0x86,
+ 0x58, 0x02, 0x01, 0x75, 0x2c, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x25,
+ 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54, 0x00, 0x03, 0x00, 0x74, 0x11,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x54, 0x00, 0x03, 0xbe, 0x97, 0x4c,
+ 0xe8, 0xe5, 0xbf, 0xeb, 0x08, 0xc6, 0x46, 0x09, 0x04, 0xff, 0x86, 0x4e,
+ 0x02, 0xc3, 0x80, 0x7e, 0x08, 0x18, 0x75, 0x0e, 0xbe, 0x21, 0x4d, 0xe8,
+ 0xce, 0xbf, 0xe8, 0x9d, 0x01, 0xe8, 0x52, 0xdd, 0xeb, 0x00, 0xc3, 0x90,
+ 0x80, 0x7e, 0x08, 0x00, 0x75, 0x35, 0x80, 0xbe, 0x5f, 0x02, 0x01, 0x75,
+ 0x58, 0x80, 0xbe, 0x58, 0x02, 0x01, 0x74, 0x1f, 0xe8, 0x07, 0xde, 0x80,
+ 0x7e, 0x06, 0x0a, 0x75, 0x16, 0xc6, 0x86, 0x67, 0x02, 0x01, 0xc6, 0x46,
+ 0x07, 0x0c, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x40, 0x75, 0x05, 0xc6, 0x86,
+ 0x62, 0x02, 0x01, 0xc3, 0xbe, 0x9d, 0x4c, 0xe8, 0x8a, 0xbf, 0xc3, 0x8a,
+ 0x46, 0x08, 0x3c, 0x04, 0x75, 0x0e, 0xbe, 0x9d, 0x4c, 0xe8, 0x7c, 0xbf,
+ 0xff, 0x86, 0xbc, 0x02, 0xe8, 0x39, 0xdd, 0xc3, 0x3c, 0x06, 0x75, 0xdf,
+ 0xf6, 0x86, 0x63, 0x02, 0x01, 0x75, 0xd8, 0xbe, 0x9d, 0x4c, 0xe8, 0x63,
+ 0xbf, 0xe8, 0xea, 0xdc, 0xc3, 0xc6, 0x86, 0x6a, 0x02, 0x01, 0xc3, 0x90,
+ 0x80, 0xbe, 0xab, 0x02, 0x01, 0x74, 0x22, 0x80, 0x7e, 0x06, 0x0c, 0x75,
+ 0x1b, 0xff, 0x86, 0xc2, 0x02, 0x83, 0xbe, 0xc2, 0x02, 0x04, 0x77, 0x0a,
+ 0xbe, 0xa9, 0x4c, 0xe8, 0x3a, 0xbf, 0xe8, 0x88, 0xde, 0xc3, 0xb8, 0x09,
+ 0x00, 0xe8, 0x3f, 0xd1, 0xc3, 0xeb, 0xfd, 0x90, 0x80, 0x7e, 0x08, 0x02,
+ 0x75, 0x1d, 0x80, 0xbe, 0x62, 0x02, 0x01, 0x74, 0x08, 0xb8, 0x05, 0x00,
+ 0xe8, 0x28, 0xd1, 0xeb, 0x0e, 0xff, 0x86, 0x4e, 0x02, 0xc6, 0x46, 0x09,
+ 0x04, 0xb8, 0x00, 0x01, 0xe8, 0x3d, 0xe0, 0xc3, 0x80, 0x7e, 0x08, 0x00,
+ 0x75, 0x16, 0x80, 0xbe, 0x58, 0x02, 0x01, 0x74, 0x07, 0x80, 0xbe, 0x62,
+ 0x02, 0x00, 0x74, 0x08, 0xff, 0x86, 0x4e, 0x02, 0xc6, 0x46, 0x09, 0x04,
+ 0xc3, 0xe9, 0xb8, 0x00, 0xf6, 0x86, 0xaf, 0x02, 0x01, 0x75, 0x07, 0xf6,
+ 0x86, 0x62, 0x02, 0x01, 0x74, 0xef, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x80,
+ 0x74, 0x06, 0xbe, 0x7f, 0x4c, 0xe8, 0xcc, 0xbe, 0x8d, 0xbe, 0xdc, 0x02,
+ 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x05, 0x00, 0x33, 0xc0, 0xf3, 0xaf, 0x74,
+ 0xd0, 0x80, 0xbe, 0xaa, 0x02, 0x01, 0x74, 0x45, 0x80, 0xbe, 0xab, 0x02,
+ 0x01, 0x74, 0x5f, 0x80, 0xbe, 0xac, 0x02, 0x01, 0x74, 0x09, 0x80, 0xbe,
+ 0xad, 0x02, 0x01, 0x74, 0x51, 0xeb, 0x6d, 0xc7, 0x86, 0xc0, 0x02, 0x04,
+ 0x00, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x20, 0xc6, 0x86, 0x89, 0x02, 0x01,
+ 0xf6, 0x86, 0x72, 0x02, 0x01, 0x74, 0x14, 0x80, 0x7e, 0x08, 0x16, 0x75,
+ 0x0e, 0xc6, 0x86, 0x5a, 0x02, 0x00, 0xe8, 0xe2, 0xdd, 0xc7, 0x86, 0x2e,
+ 0x02, 0x03, 0x00, 0xeb, 0x3f, 0xc7, 0x86, 0xc0, 0x02, 0x04, 0x00, 0xc6,
+ 0x86, 0x5a, 0x02, 0x00, 0xe8, 0xcc, 0xdd, 0xc7, 0x86, 0x2e, 0x02, 0x03,
+ 0x00, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x20, 0xc6, 0x86, 0x89, 0x02, 0x01,
+ 0xeb, 0x1e, 0xc7, 0x86, 0xc0, 0x02, 0x04, 0x00, 0x81, 0x8e, 0x0a, 0x02,
+ 0x00, 0x20, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x00,
+ 0x80, 0x75, 0x05, 0xc6, 0x86, 0x5a, 0x02, 0x00, 0xc3, 0x90, 0xc7, 0x86,
+ 0x36, 0x02, 0x06, 0x00, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x18, 0xb8,
+ 0x00, 0x02, 0x80, 0xbe, 0x65, 0x02, 0x01, 0x74, 0x37, 0xf6, 0x86, 0xac,
+ 0x02, 0x01, 0x75, 0x07, 0xf6, 0x86, 0xad, 0x02, 0x01, 0x74, 0x05, 0xb8,
+ 0x00, 0x05, 0xeb, 0x24, 0xb8, 0x00, 0x04, 0xc7, 0x86, 0x36, 0x02, 0x04,
+ 0x00, 0x8a, 0x4e, 0x08, 0x80, 0xf9, 0x0c, 0x74, 0x13, 0xb8, 0x00, 0x04,
+ 0x80, 0xbe, 0x5e, 0x02, 0x01, 0x74, 0x09, 0xb8, 0x00, 0x03, 0xc7, 0x86,
+ 0x36, 0x02, 0x07, 0x00, 0x89, 0x86, 0x0c, 0x03, 0xc3, 0x90, 0x80, 0x7e,
+ 0x08, 0x08, 0x74, 0x23, 0x8a, 0x46, 0x06, 0x3c, 0x04, 0x72, 0x1c, 0x3c,
+ 0x48, 0x74, 0x04, 0x3c, 0x0e, 0x77, 0x14, 0xf6, 0x86, 0x61, 0x02, 0x01,
+ 0x74, 0x0d, 0xf6, 0x86, 0x60, 0x02, 0x01, 0x74, 0x06, 0xb8, 0x0c, 0x00,
+ 0xe8, 0xc0, 0xcf, 0xc3, 0xc6, 0x86, 0x61, 0x02, 0x01, 0x8e, 0x46, 0x02,
+ 0x26, 0x81, 0x26, 0x44, 0x00, 0xff, 0xf7, 0xe8, 0xcc, 0x03, 0xc3, 0x90,
+ 0x80, 0x7e, 0x06, 0x02, 0x74, 0x06, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x06,
+ 0xb8, 0x01, 0x00, 0xe8, 0x99, 0xcf, 0xc3, 0x90, 0x51, 0x52, 0x56, 0x80,
+ 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x02, 0xeb, 0x48, 0x33, 0xd2, 0xc6, 0x86,
+ 0x6d, 0x02, 0x00, 0xe8, 0xb2, 0xbf, 0x8d, 0xb6, 0xa6, 0x01, 0x8d, 0xbe,
+ 0xac, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0xc6, 0x86, 0x87,
+ 0x02, 0x00, 0xb0, 0x00, 0xe8, 0xb7, 0xe1, 0xc6, 0x86, 0x68, 0x01, 0x02,
+ 0xc7, 0x86, 0x66, 0x01, 0x20, 0x03, 0xbe, 0x91, 0x4c, 0xe8, 0x48, 0xbd,
+ 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0x8e, 0x46, 0x02, 0x26, 0xc7,
+ 0x06, 0x5c, 0x00, 0x00, 0x00, 0xe8, 0xd2, 0xdb, 0x5e, 0x5a, 0x59, 0xc3,
+ 0x80, 0x7e, 0x06, 0x02, 0x74, 0x0f, 0x80, 0x7e, 0x06, 0x44, 0x74, 0x09,
+ 0x80, 0x7e, 0x08, 0x08, 0x74, 0x03, 0xe9, 0x94, 0x00, 0x80, 0xbe, 0xfe,
+ 0x00, 0x02, 0x75, 0x26, 0xf6, 0x86, 0x76, 0x02, 0x01, 0x74, 0x0b, 0xbe,
+ 0x91, 0x4c, 0xe8, 0x07, 0xbd, 0xe8, 0x04, 0xdf, 0xeb, 0x7b, 0xf6, 0x86,
+ 0x77, 0x02, 0x01, 0x74, 0x0d, 0xc6, 0x86, 0x77, 0x02, 0x00, 0xbe, 0x91,
+ 0x4c, 0xe8, 0xf0, 0xbc, 0xeb, 0x67, 0xfe, 0x8e, 0x68, 0x01, 0x75, 0x05,
+ 0xe8, 0xd1, 0x04, 0xeb, 0x5c, 0xbe, 0x91, 0x4c, 0xe8, 0xdd, 0xbc, 0x80,
+ 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x08, 0xb9, 0x5a, 0x00, 0xe8, 0xd1, 0xdb,
+ 0xeb, 0x47, 0xe8, 0xc2, 0xb7, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x4c,
+ 0x00, 0x00, 0x01, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x4c, 0x00,
+ 0xff, 0xfe, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x5c, 0x00, 0x00, 0x00,
+ 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0xc6, 0x86, 0x8a, 0x02, 0x01,
+ 0x83, 0xbe, 0x66, 0x01, 0x01, 0x75, 0x07, 0xe8, 0x1b, 0xdb, 0xeb, 0x0d,
+ 0xeb, 0x05, 0xe8, 0x2d, 0xdb, 0xeb, 0x06, 0xb8, 0x01, 0x00, 0xe8, 0x96,
+ 0xce, 0xc3, 0x80, 0x7e, 0x06, 0x44, 0x75, 0x07, 0xf6, 0x86, 0x76, 0x02,
+ 0x01, 0x75, 0xec, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x80, 0x00, 0x74, 0x10,
+ 0x80, 0x7e, 0x06, 0x14, 0x75, 0x0a, 0xb8, 0x05, 0x00, 0xe8, 0x01, 0xf9,
+ 0xc6, 0x46, 0x07, 0x42, 0xc3, 0x90, 0x80, 0xbe, 0xab, 0x02, 0x01, 0x74,
+ 0x4e, 0xc6, 0x86, 0x70, 0x02, 0x00, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x2c,
+ 0xf6, 0x86, 0x71, 0x02, 0x01, 0x74, 0x25, 0xe9, 0x7b, 0xcc, 0xbe, 0xa3,
+ 0x4c, 0xe8, 0x3c, 0xbc, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01,
+ 0x75, 0x08, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86,
+ 0x6d, 0x01, 0x01, 0xe8, 0x44, 0x09, 0xeb, 0x16, 0x80, 0x7e, 0x06, 0x10,
+ 0x75, 0x10, 0xc6, 0x46, 0x09, 0x00, 0xc6, 0x86, 0x58, 0x02, 0x00, 0xc6,
+ 0x86, 0x6c, 0x02, 0x00, 0xeb, 0xc8, 0xc3, 0xeb, 0xfd, 0x90, 0x80, 0x7e,
+ 0x06, 0x42, 0x75, 0x14, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x72, 0x27, 0xf6,
+ 0x86, 0x74, 0x02, 0x01, 0x75, 0x08, 0xb8, 0x02, 0x00, 0xe8, 0x0e, 0x04,
+ 0xeb, 0x45, 0xc7, 0x86, 0x34, 0x05, 0x00, 0x02, 0xc7, 0x86, 0x30, 0x05,
+ 0x00, 0x02, 0xc6, 0x86, 0x79, 0x02, 0x01, 0xc6, 0x86, 0xb0, 0x02, 0x00,
+ 0xeb, 0x1e, 0xc6, 0x86, 0xb0, 0x02, 0x01, 0xc7, 0x86, 0x34, 0x05, 0x00,
+ 0x02, 0xc7, 0x86, 0x30, 0x05, 0x00, 0x01, 0xf6, 0x86, 0x78, 0x02, 0x01,
+ 0x74, 0x06, 0xc7, 0x86, 0x34, 0x05, 0x00, 0x06, 0xc7, 0x86, 0xd8, 0x02,
+ 0x05, 0x00, 0xbe, 0x27, 0x4d, 0xe8, 0xa8, 0xbb, 0xe8, 0x29, 0xdd, 0xc3,
+ 0x80, 0x7e, 0x08, 0x18, 0x74, 0x06, 0x80, 0x7e, 0x08, 0x1a, 0x75, 0x04,
+ 0xc6, 0x46, 0x09, 0x1c, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x46, 0x75, 0x06,
+ 0xb8, 0x05, 0x00, 0xe8, 0x95, 0xcd, 0xc3, 0x90, 0x80, 0x7e, 0x08, 0x1c,
+ 0x75, 0x0a, 0x80, 0x7e, 0x06, 0x48, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x44,
+ 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x42, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x44,
+ 0xc3, 0x90, 0xf6, 0x86, 0x73, 0x02, 0x01, 0x74, 0x27, 0xf6, 0x46, 0x06,
+ 0x46, 0x75, 0x18, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x11, 0xc6, 0x86,
+ 0x6f, 0x02, 0x01, 0xc6, 0x86, 0x7a, 0x02, 0x01, 0xe8, 0x85, 0xbd, 0xff,
+ 0x86, 0xd6, 0x02, 0xe8, 0x98, 0xd9, 0xbe, 0x15, 0x4d, 0xe8, 0x38, 0xbb,
+ 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x42, 0x75, 0x35, 0xf6, 0x86, 0x7b, 0x02,
+ 0x01, 0x75, 0x2e, 0x83, 0xbe, 0xd8, 0x02, 0x00, 0x74, 0x29, 0xff, 0x8e,
+ 0xd8, 0x02, 0xbe, 0x27, 0x4d, 0xe8, 0x18, 0xbb, 0x80, 0xbe, 0xfe, 0x00,
+ 0x01, 0x77, 0x13, 0xc7, 0x86, 0x34, 0x05, 0x00, 0x02, 0xf6, 0x86, 0x78,
+ 0x02, 0x01, 0x74, 0x06, 0xc7, 0x86, 0x34, 0x05, 0x00, 0x06, 0xe8, 0x7f,
+ 0xdc, 0xeb, 0x49, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x74, 0x1c, 0x80,
+ 0xbe, 0xfe, 0x00, 0x00, 0x74, 0x08, 0xb8, 0x06, 0x00, 0xe8, 0x06, 0x03,
+ 0xeb, 0x32, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x74, 0x05, 0xc6, 0x86,
+ 0xfe, 0x00, 0x01, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x18, 0xf7, 0x86,
+ 0xf4, 0x00, 0x00, 0x10, 0x74, 0x10, 0xb8, 0x02, 0x00, 0xe8, 0x5d, 0xf7,
+ 0xc6, 0x46, 0x09, 0x1e, 0xc6, 0x46, 0x07, 0x02, 0xeb, 0x06, 0xb8, 0x06,
+ 0x00, 0xe8, 0xbf, 0xcc, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x46, 0x75, 0x21,
+ 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x11, 0xc6, 0x86, 0x6f, 0x02, 0x01,
+ 0xc6, 0x86, 0x7a, 0x02, 0x01, 0xe8, 0xd4, 0xbc, 0xff, 0x86, 0xd6, 0x02,
+ 0xbe, 0x2d, 0x4d, 0xe8, 0x8a, 0xba, 0xe8, 0x4d, 0xdc, 0xc3, 0x80, 0x7e,
+ 0x06, 0x44, 0x75, 0x06, 0xb8, 0x05, 0x00, 0xe8, 0x89, 0xcc, 0xc3, 0x90,
+ 0x80, 0x7e, 0x06, 0x46, 0x75, 0x08, 0xb8, 0x06, 0x00, 0xe8, 0x7b, 0xcc,
+ 0xeb, 0x17, 0x80, 0x7e, 0x08, 0x16, 0x75, 0x11, 0xc7, 0x86, 0x2e, 0x02,
+ 0x04, 0x00, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x74, 0x04, 0xc6, 0x46, 0x09,
+ 0x18, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x8b, 0x16, 0x42, 0x00, 0xf7, 0xc2,
+ 0x02, 0x00, 0x74, 0x14, 0x8b, 0xc2, 0x83, 0xe0, 0xfd, 0x8e, 0x46, 0x02,
+ 0x26, 0xa3, 0x42, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x16, 0x42, 0x00,
+ 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54, 0x00, 0x03, 0x00,
+ 0x74, 0x10, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x54, 0x00, 0x03, 0xc6,
+ 0x86, 0x59, 0x02, 0x01, 0xeb, 0x00, 0xf6, 0x86, 0x59, 0x02, 0x01, 0x75,
+ 0x14, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x0e, 0xc6, 0x46, 0x09, 0x02, 0xff,
+ 0x86, 0x44, 0x02, 0x81, 0x8e, 0xe6, 0x02, 0x00, 0x02, 0xc6, 0x86, 0x59,
+ 0x02, 0x00, 0xc3, 0x90, 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x10, 0x75, 0x15,
+ 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54, 0x00, 0x03, 0x00, 0x74, 0x09,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x54, 0x00, 0x03, 0xc3, 0x80, 0xbe,
+ 0xb0, 0x02, 0x01, 0x75, 0x3d, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54,
+ 0x00, 0x08, 0x00, 0x74, 0x2c, 0xf6, 0x86, 0x61, 0x02, 0x01, 0x74, 0x2a,
+ 0xf6, 0x86, 0x60, 0x02, 0x01, 0x75, 0x23, 0xc7, 0x86, 0x2e, 0x02, 0x0a,
+ 0x00, 0xbe, 0xbb, 0x4c, 0xf7, 0x86, 0x12, 0x01, 0x20, 0x00, 0x74, 0x03,
+ 0xbe, 0xc1, 0x4c, 0xe8, 0x9a, 0xb9, 0xc6, 0x86, 0x60, 0x02, 0x01, 0xeb,
+ 0x05, 0xc6, 0x86, 0x60, 0x02, 0x00, 0xc3, 0x90, 0xbe, 0xd3, 0x4c, 0xe8,
+ 0x86, 0xb9, 0x33, 0xc0, 0x87, 0x86, 0xcc, 0x02, 0x0b, 0xc0, 0x75, 0x14,
+ 0x80, 0xbe, 0x65, 0x02, 0x00, 0x74, 0x0d, 0xc6, 0x86, 0x65, 0x02, 0x00,
+ 0x80, 0xa6, 0x0b, 0x02, 0x7f, 0xe8, 0x3a, 0xfb, 0xc3, 0x80, 0x7e, 0x06,
+ 0x12, 0x75, 0x10, 0xc6, 0x86, 0x08, 0x01, 0x01, 0xc6, 0x86, 0x09, 0x01,
+ 0x00, 0xe8, 0x55, 0xf3, 0xe8, 0x4c, 0xf5, 0xc3, 0xf6, 0x86, 0x6e, 0x01,
+ 0x01, 0x74, 0x15, 0x80, 0xbe, 0x70, 0x01, 0x03, 0x73, 0x07, 0xc6, 0x86,
+ 0x6c, 0x01, 0x01, 0xeb, 0x23, 0xc6, 0x86, 0x6e, 0x01, 0x00, 0xeb, 0x1c,
+ 0xf6, 0x86, 0x6f, 0x01, 0x01, 0x74, 0x15, 0x80, 0xbe, 0x71, 0x01, 0x03,
+ 0x73, 0x07, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xeb, 0x07, 0xc6, 0x86, 0x6f,
+ 0x01, 0x00, 0xeb, 0x00, 0xc3, 0xf7, 0x86, 0xb0, 0x15, 0x00, 0x80, 0x75,
+ 0x07, 0x83, 0xbe, 0xb0, 0x15, 0x05, 0x74, 0x05, 0xc6, 0x86, 0xce, 0x01,
+ 0x01, 0xc3, 0xe8, 0x63, 0xcc, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x08, 0x00,
+ 0x74, 0x09, 0xe8, 0x45, 0xf4, 0xbe, 0x63, 0x4d, 0xe8, 0xed, 0xb8, 0xc3,
+ 0xf7, 0x86, 0xf6, 0x00, 0x08, 0x00, 0x74, 0x11, 0x81, 0x8e, 0x0a, 0x02,
+ 0x00, 0x04, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xb8, 0x10, 0x00, 0xe8, 0xe2,
+ 0xca, 0xc3, 0x8b, 0x86, 0x30, 0x01, 0x88, 0xa6, 0x2c, 0x01, 0xc3, 0x90,
+ 0x80, 0x7e, 0x06, 0x4a, 0x75, 0x06, 0xb8, 0x04, 0x00, 0xe8, 0xcb, 0xca,
+ 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x4c, 0x75, 0x25, 0xf6, 0x86, 0x74, 0x02,
+ 0x01, 0x74, 0x07, 0x83, 0xbe, 0xda, 0x02, 0x00, 0x75, 0x0a, 0xc6, 0x46,
+ 0x07, 0x12, 0xc6, 0x46, 0x09, 0x1e, 0xeb, 0x0d, 0xff, 0x8e, 0xda, 0x02,
+ 0xbe, 0x39, 0x4d, 0xe8, 0x92, 0xb8, 0xe8, 0xab, 0xda, 0xc3, 0x80, 0xbe,
+ 0xfe, 0x00, 0x02, 0x75, 0x2e, 0x8a, 0x3e, 0x22, 0x5f, 0xb3, 0x01, 0xe8,
+ 0xf1, 0xbe, 0xf6, 0x86, 0x74, 0x02, 0x01, 0x74, 0x24, 0xa9, 0x04, 0x00,
+ 0x75, 0x1d, 0xff, 0x8e, 0xb5, 0x02, 0x75, 0x15, 0xc6, 0x86, 0x74, 0x02,
+ 0x00, 0x8a, 0x4e, 0x06, 0x80, 0xf9, 0x42, 0x74, 0x08, 0xb8, 0x02, 0x00,
+ 0xe8, 0x68, 0xca, 0xeb, 0x41, 0xeb, 0x39, 0xeb, 0x31, 0xa9, 0x04, 0x00,
+ 0x74, 0x2c, 0xc6, 0x86, 0x74, 0x02, 0x01, 0x8a, 0x4e, 0x06, 0x80, 0xf9,
+ 0x4a, 0x75, 0x1d, 0xc6, 0x46, 0x07, 0x42, 0xc6, 0x46, 0x06, 0x42, 0xe8,
+ 0x0d, 0xbe, 0xbe, 0xf7, 0x4c, 0xe8, 0x30, 0xb8, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x26, 0x44, 0x00, 0x32, 0xfe, 0xeb, 0x08, 0xeb, 0x06, 0xc7, 0x86,
+ 0xb5, 0x02, 0x02, 0x00, 0xbe, 0x45, 0x4d, 0xe8, 0x16, 0xb8, 0xc3, 0x90,
+ 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x74, 0x26, 0x80, 0x8e, 0xfe, 0x00,
+ 0x00, 0x74, 0x1f, 0xfe, 0x8e, 0xfe, 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x01,
+ 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0x34, 0xba, 0xbe, 0xdf, 0x4c, 0xe8,
+ 0xee, 0xb7, 0xbe, 0xe5, 0x4c, 0xe8, 0xe8, 0xb7, 0xeb, 0x06, 0xb8, 0x01,
+ 0x00, 0xe8, 0xef, 0xc9, 0xc3, 0x90, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10,
+ 0x74, 0x32, 0x80, 0x8e, 0xfe, 0x00, 0x00, 0x74, 0x2b, 0xfe, 0x8e, 0xfe,
+ 0x00, 0xbe, 0xf7, 0x4c, 0xe8, 0xc5, 0xb7, 0xb0, 0x02, 0xe8, 0x2e, 0xbc,
+ 0xc6, 0x86, 0x6d, 0x02, 0x01, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0xf3,
+ 0xb9, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x40, 0x00, 0x00, 0x1e, 0xe8,
+ 0x7d, 0xbd, 0xeb, 0x03, 0xe8, 0xb0, 0xc9, 0xc3, 0xf6, 0x86, 0x95, 0x02,
+ 0x01, 0x74, 0x0a, 0xa8, 0x24, 0x74, 0x06, 0xc7, 0x86, 0xa2, 0x02, 0x05,
+ 0x00, 0xf6, 0x86, 0xae, 0x02, 0x01, 0x74, 0x09, 0x80, 0xbe, 0x62, 0x02,
+ 0x01, 0x75, 0x58, 0xeb, 0x09, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x75, 0x10,
+ 0xeb, 0x52, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x02, 0xeb, 0x45, 0x80, 0x7e,
+ 0x08, 0x00, 0x75, 0x3f, 0xa8, 0x01, 0x74, 0x05, 0x83, 0x8e, 0xe6, 0x02,
+ 0x10, 0xa8, 0x04, 0x74, 0x05, 0x83, 0x8e, 0xe6, 0x02, 0x04, 0xa8, 0x08,
+ 0x74, 0x05, 0x83, 0x8e, 0xe6, 0x02, 0x40, 0xa8, 0x20, 0x74, 0x10, 0x81,
+ 0x8e, 0xe6, 0x02, 0x00, 0x01, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x75, 0x03,
+ 0xe8, 0x2a, 0xbc, 0xa8, 0x40, 0x74, 0x05, 0x83, 0x8e, 0xe6, 0x02, 0x01,
+ 0xa8, 0x80, 0x74, 0x03, 0xe8, 0x52, 0x00, 0xa9, 0x00, 0x01, 0x75, 0x01,
+ 0xc3, 0x50, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x06, 0xc6, 0x46, 0x09, 0x04,
+ 0xeb, 0x1b, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x23, 0xc6, 0x46, 0x09, 0x02,
+ 0xff, 0x86, 0x44, 0x02, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x06, 0x81,
+ 0x8e, 0xe6, 0x02, 0x00, 0x02, 0xc6, 0x86, 0x6d, 0x02, 0x01, 0x8e, 0x46,
+ 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00, 0x10, 0x8e, 0x46, 0x02, 0x26, 0xc7,
+ 0x06, 0x48, 0x00, 0x00, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x48,
+ 0x00, 0x00, 0x01, 0x58, 0xc3, 0x83, 0x8e, 0xe6, 0x02, 0x20, 0x83, 0x7e,
+ 0x06, 0x08, 0x75, 0x13, 0x8b, 0x8e, 0xce, 0x02, 0x41, 0x89, 0x8e, 0xce,
+ 0x02, 0x80, 0xf9, 0x02, 0x75, 0x05, 0x50, 0xe8, 0x3f, 0xd5, 0x58, 0xc3,
+ 0x50, 0x53, 0x51, 0x8a, 0x4e, 0x06, 0x80, 0xf9, 0x0e, 0x74, 0x1e, 0x80,
+ 0xf9, 0x48, 0x74, 0x19, 0x80, 0xbe, 0x58, 0x02, 0x01, 0x74, 0x46, 0x80,
+ 0xf9, 0x08, 0x72, 0x41, 0x80, 0xf9, 0x0e, 0x77, 0x3c, 0xb8, 0x02, 0x00,
+ 0xe8, 0xa0, 0xc8, 0xeb, 0x34, 0xc7, 0x86, 0x2e, 0x02, 0x05, 0x00, 0xc6,
+ 0x86, 0x65, 0x02, 0x01, 0x8a, 0x46, 0x08, 0x3c, 0x06, 0x74, 0x26, 0x3c,
+ 0x02, 0x74, 0x51, 0x3c, 0x08, 0x74, 0x1a, 0x3c, 0x04, 0x74, 0x16, 0xf6,
+ 0x86, 0xac, 0x02, 0x01, 0x75, 0x13, 0xf6, 0x86, 0xad, 0x02, 0x01, 0x75,
+ 0x0c, 0xc6, 0x46, 0x09, 0x04, 0xff, 0x86, 0x4e, 0x02, 0x59, 0x5b, 0x58,
+ 0xc3, 0x8b, 0x86, 0x0a, 0x02, 0xf6, 0xc4, 0x80, 0x75, 0x0c, 0x80, 0xcc,
+ 0x80, 0x89, 0x86, 0x0a, 0x02, 0xc6, 0x86, 0x89, 0x02, 0x01, 0x81, 0xbe,
+ 0x0c, 0x03, 0x00, 0x02, 0x74, 0xdf, 0xc7, 0x86, 0x0c, 0x03, 0x00, 0x02,
+ 0xf6, 0x86, 0xaa, 0x02, 0x01, 0x74, 0xd2, 0xe8, 0xb4, 0xd3, 0xeb, 0xcd,
+ 0xb8, 0x00, 0x01, 0xe8, 0x56, 0xd7, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74,
+ 0xc0, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0xba, 0xfa, 0xc7, 0x06, 0x30, 0x00,
+ 0xc0, 0x0e, 0x8c, 0x0e, 0x32, 0x00, 0xb8, 0x00, 0x00, 0xe7, 0x06, 0xb8,
+ 0xea, 0x09, 0xe7, 0x00, 0xb8, 0x09, 0x00, 0xe7, 0x06, 0xb0, 0x7f, 0xe8,
+ 0xc5, 0xb2, 0xc6, 0x06, 0x24, 0x5f, 0x80, 0xfb, 0xc3, 0xf7, 0x86, 0x82,
+ 0x01, 0x01, 0x00, 0x74, 0x1a, 0xc7, 0x86, 0x82, 0x01, 0x00, 0x00, 0xf6,
+ 0x86, 0x6e, 0x01, 0x01, 0x74, 0x0d, 0xc6, 0x86, 0x6e, 0x01, 0x00, 0xbe,
+ 0x57, 0x4d, 0xe8, 0x81, 0xb6, 0xeb, 0x00, 0xf7, 0x86, 0x8a, 0x01, 0x01,
+ 0x00, 0x74, 0x45, 0xc7, 0x86, 0x8a, 0x01, 0x00, 0x00, 0xf6, 0x86, 0x6f,
+ 0x01, 0x01, 0x74, 0x0d, 0xc6, 0x86, 0x6f, 0x01, 0x00, 0xbe, 0x57, 0x4d,
+ 0xe8, 0x5f, 0xb6, 0xeb, 0x2b, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x06, 0x80,
+ 0x7e, 0x06, 0x48, 0x75, 0x1f, 0xf6, 0x86, 0x61, 0x02, 0x01, 0x74, 0x18,
+ 0xf6, 0x86, 0x60, 0x02, 0x01, 0x75, 0x11, 0xc6, 0x86, 0x60, 0x02, 0x01,
+ 0xc7, 0x86, 0x2e, 0x02, 0x0a, 0x00, 0xb8, 0x0c, 0x00, 0xe8, 0x8f, 0xc7,
+ 0xc3, 0xb9, 0x01, 0x00, 0x33, 0xdb, 0x8b, 0xaf, 0xea, 0x5d, 0x8e, 0x46,
+ 0x02, 0x26, 0x8b, 0x16, 0x54, 0x00, 0x83, 0xe2, 0x08, 0x26, 0xa1, 0x72,
+ 0x00, 0xd1, 0xe8, 0xd0, 0xe8, 0x86, 0xe0, 0xf7, 0xc2, 0x08, 0x00, 0x75,
+ 0x02, 0xeb, 0x67, 0x83, 0xbe, 0x74, 0x01, 0x00, 0x75, 0x04, 0x88, 0xa6,
+ 0x78, 0x01, 0x81, 0xbe, 0x74, 0x01, 0xbc, 0x02, 0x72, 0x06, 0xc7, 0x86,
+ 0x74, 0x01, 0xf4, 0x01, 0x8a, 0xc4, 0x2a, 0xe4, 0x83, 0xf8, 0x7f, 0x75,
+ 0x12, 0x8b, 0x86, 0x74, 0x01, 0xbe, 0xeb, 0x09, 0xf7, 0xe6, 0xbe, 0x20,
+ 0x00, 0xf7, 0xf6, 0x03, 0x86, 0x78, 0x01, 0x89, 0x86, 0x7c, 0x01, 0xff,
+ 0x86, 0x74, 0x01, 0x83, 0xbe, 0x7c, 0x01, 0x7d, 0x72, 0x21, 0x83, 0xbe,
+ 0x88, 0x01, 0x01, 0x74, 0x1a, 0xc7, 0x86, 0x88, 0x01, 0x01, 0x00, 0xc7,
+ 0x86, 0x8a, 0x01, 0x01, 0x00, 0xa1, 0xd4, 0x5d, 0x89, 0x86, 0x8c, 0x01,
+ 0xa1, 0xd6, 0x5d, 0x89, 0x86, 0x8e, 0x01, 0xe9, 0x94, 0x00, 0x83, 0xbe,
+ 0x76, 0x01, 0x00, 0x75, 0x04, 0x88, 0x86, 0x7a, 0x01, 0x81, 0xbe, 0x76,
+ 0x01, 0xbc, 0x02, 0x72, 0x06, 0xc7, 0x86, 0x76, 0x01, 0xf4, 0x01, 0x2a,
+ 0xe4, 0x83, 0xf8, 0x7f, 0x75, 0x12, 0x8b, 0x86, 0x76, 0x01, 0xbe, 0xeb,
+ 0x09, 0xf7, 0xe6, 0xbe, 0x20, 0x00, 0xf7, 0xf6, 0x03, 0x86, 0x7a, 0x01,
+ 0x89, 0x86, 0x7e, 0x01, 0xff, 0x86, 0x76, 0x01, 0x83, 0xbe, 0x80, 0x01,
+ 0x01, 0x74, 0x53, 0x83, 0xf8, 0x1f, 0x72, 0x4e, 0x8d, 0xb6, 0x96, 0x01,
+ 0x83, 0x3c, 0x12, 0x72, 0x45, 0x83, 0x3c, 0x23, 0x77, 0x40, 0x83, 0x7c,
+ 0x02, 0x1f, 0x72, 0x3a, 0x83, 0x7c, 0x02, 0x45, 0x77, 0x34, 0x83, 0x7c,
+ 0x04, 0x12, 0x72, 0x2e, 0x90, 0x83, 0x7c, 0x04, 0x23, 0x77, 0x27, 0x81,
+ 0x7c, 0x06, 0x9c, 0x00, 0x72, 0x20, 0xc7, 0x86, 0x80, 0x01, 0x01, 0x00,
+ 0xc7, 0x86, 0x82, 0x01, 0x01, 0x00, 0xc7, 0x86, 0x88, 0x01, 0x00, 0x00,
+ 0xa1, 0xd4, 0x5d, 0x89, 0x86, 0x84, 0x01, 0xa1, 0xd6, 0x5d, 0x89, 0x86,
+ 0x86, 0x01, 0x83, 0xc3, 0x02, 0x49, 0x74, 0x03, 0xe9, 0xdb, 0xfe, 0xc3,
+ 0x50, 0x51, 0x52, 0x56, 0x57, 0x8e, 0x46, 0x02, 0x83, 0x86, 0x90, 0x01,
+ 0x01, 0x83, 0x96, 0x92, 0x01, 0x00, 0xc7, 0x86, 0x80, 0x01, 0x00, 0x00,
+ 0x26, 0xa1, 0x72, 0x00, 0xd1, 0xe8, 0xd0, 0xe8, 0x86, 0xe0, 0x8d, 0xb6,
+ 0x96, 0x01, 0x26, 0x8b, 0x0e, 0x54, 0x00, 0x83, 0xe1, 0x08, 0x89, 0x8e,
+ 0x94, 0x01, 0xf7, 0xc1, 0x08, 0x00, 0x74, 0x4f, 0x8b, 0x4c, 0x0a, 0x89,
+ 0x4c, 0x0e, 0x8b, 0x4c, 0x06, 0x89, 0x4c, 0x0a, 0x8b, 0x4c, 0x02, 0x89,
+ 0x4c, 0x06, 0x2a, 0xe4, 0x8b, 0xc8, 0x83, 0xf8, 0x7f, 0x75, 0x19, 0xb0,
+ 0x0a, 0xe6, 0x10, 0xe5, 0x00, 0xb1, 0x05, 0xd3, 0xe8, 0x03, 0x86, 0x7e,
+ 0x01, 0x8b, 0xc8, 0xe4, 0x10, 0xa8, 0x10, 0x74, 0x03, 0x83, 0xc1, 0x4f,
+ 0x8b, 0xc1, 0x89, 0x44, 0x02, 0xc7, 0x86, 0x7e, 0x01, 0x00, 0x00, 0xc7,
+ 0x86, 0x76, 0x01, 0x00, 0x00, 0xeb, 0x7f, 0xc7, 0x86, 0x88, 0x01, 0x00,
+ 0x00, 0xeb, 0x77, 0x8b, 0x4c, 0x08, 0x89, 0x4c, 0x0c, 0x8b, 0x4c, 0x04,
+ 0x89, 0x4c, 0x08, 0x8b, 0x0c, 0x89, 0x4c, 0x04, 0x8a, 0xc4, 0x2a, 0xe4,
+ 0x8b, 0xc8, 0x83, 0xf8, 0x7f, 0x75, 0x25, 0xb0, 0x0a, 0xe6, 0x10, 0xe5,
+ 0x00, 0xb1, 0x05, 0xd3, 0xe8, 0x03, 0x86, 0x7c, 0x01, 0x8b, 0xc8, 0xe4,
+ 0x10, 0xa8, 0x10, 0x74, 0x03, 0x83, 0xc1, 0x4f, 0x8b, 0x96, 0x7c, 0x01,
+ 0x83, 0xf9, 0x7f, 0x77, 0x03, 0x83, 0xc1, 0x4f, 0x8b, 0xc1, 0x89, 0x04,
+ 0xc7, 0x86, 0x7c, 0x01, 0x00, 0x00, 0xc7, 0x86, 0x74, 0x01, 0x00, 0x00,
+ 0x83, 0xf8, 0x7d, 0x72, 0xa2, 0x83, 0xbe, 0x88, 0x01, 0x01, 0x74, 0x1a,
+ 0xc7, 0x86, 0x88, 0x01, 0x01, 0x00, 0xc7, 0x86, 0x8a, 0x01, 0x01, 0x00,
+ 0xa1, 0xd4, 0x5d, 0x89, 0x86, 0x84, 0x01, 0xa1, 0xd6, 0x5d, 0x89, 0x86,
+ 0x86, 0x01, 0x5f, 0x5e, 0x5a, 0x59, 0x58, 0xc3, 0x50, 0x51, 0x57, 0x06,
+ 0xfa, 0x8c, 0xd8, 0x8e, 0xc0, 0x2b, 0xc0, 0x8d, 0xbe, 0x72, 0x01, 0xb9,
+ 0x1a, 0x00, 0xf3, 0xab, 0xfb, 0x07, 0x5f, 0x59, 0x58, 0xc3, 0xfa, 0xf6,
+ 0x06, 0x24, 0x5f, 0x80, 0x74, 0x4e, 0xc6, 0x86, 0x6c, 0x01, 0x00, 0xc6,
+ 0x86, 0x6e, 0x01, 0x01, 0xfe, 0x86, 0x70, 0x01, 0x8a, 0x46, 0x00, 0xa2,
+ 0x24, 0x5f, 0xc7, 0x06, 0x26, 0x5f, 0x02, 0x00, 0xc7, 0x06, 0x28, 0x5f,
+ 0x01, 0x00, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0x8b, 0xc8, 0xb8,
+ 0xd6, 0x13, 0xe7, 0x02, 0xb8, 0x4e, 0x03, 0xe7, 0x04, 0x83, 0xc9, 0x46,
+ 0x8b, 0xc1, 0xe7, 0x06, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x42, 0x00,
+ 0x01, 0xbe, 0x57, 0x4d, 0xe8, 0xe5, 0xb2, 0xc6, 0x86, 0x61, 0x02, 0x01,
+ 0xfb, 0xc3, 0xfa, 0xf6, 0x06, 0x24, 0x5f, 0x80, 0x74, 0x49, 0xc6, 0x86,
+ 0x6d, 0x01, 0x00, 0xc6, 0x86, 0x6f, 0x01, 0x01, 0xfe, 0x86, 0x71, 0x01,
+ 0x8a, 0x46, 0x00, 0xa2, 0x24, 0x5f, 0xc7, 0x06, 0x26, 0x5f, 0x0e, 0x00,
+ 0xc7, 0x06, 0x28, 0x5f, 0x02, 0x00, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7,
+ 0x06, 0x8b, 0xc8, 0xb8, 0xf7, 0x03, 0xe7, 0x02, 0xb8, 0xd6, 0x13, 0xe7,
+ 0x04, 0x83, 0xc9, 0x46, 0x8b, 0xc1, 0xe7, 0x06, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x0e, 0x42, 0x00, 0x01, 0xbe, 0x57, 0x4d, 0xe8, 0x8d, 0xb2, 0xfb,
+ 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc3, 0xb8, 0x9d,
+ 0x06, 0xe7, 0x02, 0xc7, 0x06, 0x26, 0x5f, 0x04, 0x00, 0xc3, 0xc7, 0x06,
+ 0x26, 0x5f, 0x06, 0x00, 0xc3, 0x90, 0xc7, 0x06, 0x26, 0x5f, 0x08, 0x00,
+ 0xc3, 0x90, 0x53, 0xc7, 0x06, 0x26, 0x5f, 0x0a, 0x00, 0x33, 0xdb, 0x8a,
+ 0x1e, 0x24, 0x5f, 0xd0, 0xe3, 0x8b, 0x9f, 0xea, 0x5d, 0x06, 0x8e, 0x47,
+ 0x02, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfe, 0x07, 0xb8, 0x9d, 0x06, 0xe7,
+ 0x02, 0x5b, 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc7,
+ 0x06, 0x26, 0x5f, 0x0c, 0x00, 0xc6, 0x06, 0x24, 0x5f, 0x80, 0xc3, 0x90,
+ 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc3, 0xb8, 0xf7, 0x03, 0xe7,
+ 0x02, 0xc7, 0x06, 0x26, 0x5f, 0x10, 0x00, 0xc3, 0x53, 0xc7, 0x06, 0x26,
+ 0x5f, 0x12, 0x00, 0x33, 0xdb, 0x8a, 0x1e, 0x24, 0x5f, 0xd0, 0xe3, 0x8b,
+ 0x9f, 0xea, 0x5d, 0x06, 0x8e, 0x47, 0x02, 0x26, 0x83, 0x26, 0x42, 0x00,
+ 0xfe, 0x07, 0xb8, 0x9d, 0x06, 0xe7, 0x02, 0x5b, 0xc3, 0x90, 0xe5, 0x06,
+ 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc7, 0x06, 0x26, 0x5f, 0x14, 0x00, 0xc6,
+ 0x06, 0x24, 0x5f, 0x80, 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7,
+ 0x06, 0xc3, 0x4e, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x54, 0x78, 0x74,
+ 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x34, 0x12,
+ 0x45, 0x23, 0x56, 0x34, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xab, 0xde, 0xbc,
+ 0xef, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x74, 0x49, 0x6d, 0x70,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x00, 0x54, 0x69, 0x6d,
+ 0x65, 0x72, 0x30, 0x00, 0x00, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x31, 0x00,
+ 0x00, 0x54, 0x65, 0x73, 0x74, 0x31, 0x00, 0x00, 0x54, 0x65, 0x73, 0x74,
+ 0x32, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x5e, 0x35, 0x56, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
+ 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0xc0, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0xe0, 0x02, 0xc0, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16,
+ 0x00, 0x02, 0x04, 0x01, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x00, 0xe0, 0x03, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x03, 0x06, 0x0b, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0x00, 0xe0, 0x04, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x04, 0x08, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x05, 0xc0, 0x00, 0xff, 0xff,
+ 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x05,
+ 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x06, 0xc0, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12,
+ 0x00, 0x06, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0xe0, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0xe0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x08, 0x02, 0x26, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00,
+ 0xe0, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x1c, 0x26, 0x00, 0x00, 0x00, 0x00,
+ 0x3e, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x50, 0x20, 0x0c, 0x23, 0x30, 0x30,
+ 0x30, 0x30, 0xf3, 0xf0, 0xf0, 0xf8, 0xf9, 0xf6, 0x08, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x14, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x21, 0x00, 0x00, 0x04, 0x21, 0x00, 0x00, 0x06, 0x2b, 0x00, 0x00,
+ 0x00, 0x00, 0x06, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x28, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x29, 0x20, 0x00, 0x08, 0x00, 0x01, 0x00,
+ 0x04, 0x06, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x34, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x40, 0x25, 0x06, 0x0b, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x22,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
+ 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x12, 0x40, 0x26, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x1a, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x60, 0x27, 0x08, 0x0a, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0xe0, 0x00,
+ 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x16, 0x60, 0x28, 0x04, 0x30, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1e, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30, 0x11, 0x04, 0x0c,
+ 0x00, 0x01, 0x04, 0x0e, 0x00, 0x02, 0x04, 0x21, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x16, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x12, 0x04, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0xe0, 0x00, 0xc0, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
+ 0x30, 0x13, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0xe0, 0x00, 0xc0, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
+ 0x03, 0x14, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00,
+ 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x03, 0x15, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00,
+ 0xe0, 0x08, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00,
+ 0xe0, 0x07, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x30, 0x17, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
+ 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x22, 0x60, 0x29, 0x08, 0x2d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0b,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x2a, 0x00, 0x00, 0x02, 0x20, 0x80, 0x00, 0x00, 0x06, 0x09, 0x00,
+ 0x00, 0x00, 0x04, 0x03, 0x01, 0x80, 0x00, 0x00, 0x04, 0x02, 0x80, 0x00,
+ 0x00, 0x08, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x02, 0x02, 0x80, 0x00, 0x00,
+ 0x08, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x01, 0x26, 0x80, 0x00, 0x00, 0xff,
+ 0x06, 0x03, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x05,
+ 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00,
+ 0x00, 0x04, 0x09, 0x00, 0x00, 0x00, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00,
+ 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x05, 0x00, 0x00, 0x00, 0x04, 0x09,
+ 0x00, 0x00, 0x00, 0x04, 0x03, 0x0c, 0x80, 0x00, 0x00, 0x04, 0x0e, 0x80,
+ 0x00, 0x00, 0x04, 0x21, 0x00, 0x00, 0x00, 0x04, 0x01, 0x0f, 0x80, 0x00,
+ 0x00, 0x04, 0x01, 0x0d, 0x80, 0x00, 0x00, 0x04, 0x04, 0x02, 0x80, 0x00,
+ 0x00, 0x08, 0x22, 0x00, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0x00, 0xff,
+ 0x21, 0x00, 0x00, 0x00, 0x04, 0x01, 0x09, 0x00, 0x00, 0x00, 0x04, 0x00,
+ 0xa5, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00
+};
diff --git a/sys/contrib/dev/oltr/trlldhm.c b/sys/contrib/dev/oltr/trlldhm.c
new file mode 100644
index 0000000..cdcb250
--- /dev/null
+++ b/sys/contrib/dev/oltr/trlldhm.c
@@ -0,0 +1,2519 @@
+/*
+ * $FreeBSD$
+ *
+ * Copyright (c) 1997
+ * OLICOM A/S
+ * Denmark
+ *
+ * All Rights Reserved
+ *
+ * This source file is subject to the terms and conditions of the
+ * OLICOM Software License Agreement which restricts the manner
+ * in which it may be used.
+ *
+ *---------------------------------------------------------------------------
+ *
+ * Description: Olicom adapter micro-code
+ *
+ *---------------------------------------------------------------------------
+ */
+
+unsigned char TRlldHawkeyeMac[] __attribute ((aligned(2))) = {
+ 0x52, 0x94, 0x03, 0x00, 0x02, 0x75, 0xea, 0x12, 0x4f, 0x43, 0x53, 0x4d,
+ 0x41, 0x43, 0x2e, 0x48, 0x41, 0x57, 0x4b, 0x45, 0x59, 0x45, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xea, 0x55, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xb8, 0x00, 0x00, 0xbb, 0x00,
+ 0x00, 0xb9, 0x00, 0x00, 0xba, 0x00, 0x00, 0xbe, 0x00, 0x00, 0xbf, 0x00,
+ 0x00, 0xbd, 0x00, 0x00, 0x8c, 0xc8, 0x8e, 0xd8, 0x8e, 0xc0, 0x8e, 0xd0,
+ 0xb8, 0x88, 0x56, 0x8b, 0xe0, 0x83, 0x3e, 0x4e, 0x00, 0x00, 0x75, 0x1c,
+ 0x2b, 0xdb, 0x8b, 0xf3, 0xad, 0x8b, 0xd8, 0x8b, 0xc8, 0xd1, 0xe9, 0x49,
+ 0x49, 0xad, 0x03, 0xd8, 0xe2, 0xfb, 0x0b, 0xdb, 0x74, 0x06, 0xc7, 0x06,
+ 0x5a, 0x55, 0x01, 0x00, 0xc7, 0x06, 0x0c, 0x00, 0xa8, 0x01, 0x8c, 0x0e,
+ 0x0e, 0x00, 0xc7, 0x06, 0x04, 0x00, 0xa8, 0x01, 0x8c, 0x0e, 0x06, 0x00,
+ 0xc7, 0x06, 0x14, 0x00, 0xa8, 0x01, 0x8c, 0x0e, 0x14, 0x00, 0xc7, 0x06,
+ 0x08, 0x00, 0xa8, 0x01, 0x8c, 0x0e, 0x08, 0x00, 0x90, 0x90, 0x90, 0xc7,
+ 0x06, 0x20, 0x00, 0x6a, 0x1f, 0x8c, 0x0e, 0x22, 0x00, 0x2b, 0xc0, 0xe7,
+ 0x06, 0xc7, 0x06, 0x30, 0x00, 0x22, 0x0e, 0x8c, 0x0e, 0x32, 0x00, 0xc7,
+ 0x06, 0x34, 0x00, 0x34, 0x0f, 0x8c, 0x0e, 0x36, 0x00, 0xc7, 0x06, 0x38,
+ 0x00, 0x66, 0x0f, 0x8c, 0x0e, 0x3a, 0x00, 0xc7, 0x06, 0x3c, 0x00, 0xa8,
+ 0x01, 0x8c, 0x0e, 0x3e, 0x00, 0xc7, 0x06, 0x08, 0x00, 0xa8, 0x01, 0x8c,
+ 0x0e, 0x0a, 0x00, 0xc7, 0x06, 0x14, 0x00, 0xa8, 0x01, 0x8c, 0x0e, 0x16,
+ 0x00, 0xbb, 0x40, 0x60, 0x8e, 0xc3, 0x26, 0xa1, 0x02, 0x00, 0x25, 0x00,
+ 0x50, 0x89, 0x86, 0x0f, 0x01, 0x26, 0x83, 0x0e, 0x72, 0x00, 0x08, 0x2b,
+ 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x26, 0x72, 0x00,
+ 0xf7, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x0e,
+ 0x72, 0x00, 0x08, 0x2a, 0xe4, 0xb0, 0x13, 0xe6, 0x10, 0x90, 0x90, 0x90,
+ 0xb0, 0x08, 0xe6, 0x12, 0x90, 0x90, 0x90, 0xb0, 0x09, 0xe6, 0x12, 0x90,
+ 0x90, 0x90, 0xb0, 0xff, 0xe6, 0x12, 0x90, 0x90, 0x90, 0x26, 0x83, 0x26,
+ 0x72, 0x00, 0xf7, 0x8b, 0x86, 0x0f, 0x01, 0x26, 0xa3, 0x02, 0x00, 0x90,
+ 0x90, 0x90, 0x33, 0xc0, 0x26, 0xc7, 0x06, 0x04, 0x00, 0xff, 0xff, 0x26,
+ 0xc7, 0x06, 0x06, 0x00, 0xff, 0xff, 0x26, 0x09, 0x06, 0x08, 0x00, 0x26,
+ 0x09, 0x06, 0x0a, 0x00, 0xb8, 0x00, 0x00, 0xe7, 0x06, 0xb8, 0x0f, 0x27,
+ 0xe7, 0x00, 0xb8, 0x09, 0x00, 0xe7, 0x06, 0xb0, 0x11, 0xe8, 0xb0, 0x0a,
+ 0xe8, 0xed, 0x0a, 0xfb, 0xe9, 0x96, 0x0b, 0x90, 0x50, 0xb0, 0xa0, 0xe6,
+ 0x10, 0x58, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x13, 0xf0, 0xf0, 0xf0, 0xf0, 0xe7, 0xe7, 0xe7, 0x30, 0x32,
+ 0x30, 0x33, 0x39, 0x39, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x37, 0x20,
+ 0x2d, 0x20, 0x31, 0x39, 0x39, 0x39, 0x20, 0x4f, 0x6c, 0x69, 0x63, 0x6f,
+ 0x6d, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x73, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x90,
+ 0x26, 0x1d, 0x26, 0x1d, 0x6f, 0x32, 0x55, 0x35, 0x51, 0x37, 0xa0, 0x38,
+ 0xe2, 0x39, 0x2a, 0x3d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x93, 0x3b,
+ 0xe9, 0x3b, 0x7a, 0x3c, 0xf7, 0x3c, 0xfc, 0x3c, 0x01, 0x3d, 0x26, 0x1d,
+ 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x34, 0x35, 0x26, 0x1d, 0x26, 0x1d,
+ 0x04, 0x34, 0x5d, 0x34, 0x5d, 0x34, 0xf1, 0x34, 0x5d, 0x34, 0x19, 0x35,
+ 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x93, 0x3b, 0xe9, 0x3b, 0x7a, 0x3c,
+ 0xf7, 0x3c, 0xfc, 0x3c, 0x01, 0x3d, 0x26, 0x1d, 0x70, 0x34, 0x26, 0x1d,
+ 0xb9, 0x34, 0x26, 0x1d, 0xbe, 0x2f, 0xbe, 0x2f, 0xbe, 0x2f, 0xbe, 0x2f,
+ 0x88, 0x30, 0xb6, 0x31, 0xbe, 0x2f, 0x9a, 0x30, 0x48, 0x31, 0x08, 0x32,
+ 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32,
+ 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32,
+ 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32,
+ 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0xf4, 0x30, 0xbe, 0x2f,
+ 0xbe, 0x2f, 0xbe, 0x2f, 0xbe, 0x2f, 0xbe, 0x2f, 0x27, 0x31, 0xbe, 0x2f,
+ 0xbe, 0x2f, 0x39, 0x31, 0xbe, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0xff, 0x04, 0x04, 0x05, 0xff, 0xff, 0xff, 0x00,
+ 0x03, 0x00, 0x03, 0x03, 0xb7, 0x05, 0xff, 0xff, 0xc2, 0x05, 0xd2, 0x05,
+ 0xd2, 0x05, 0xd2, 0x05, 0xd2, 0x05, 0x00, 0x00, 0xdd, 0x05, 0xff, 0xff,
+ 0xff, 0xff, 0x00, 0x00, 0xe3, 0x05, 0x02, 0x06, 0x48, 0x06, 0x48, 0x06,
+ 0x48, 0x06, 0x17, 0x06, 0x27, 0x06, 0x00, 0x00, 0x2d, 0x06, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x26, 0x1d,
+ 0xb2, 0x3d, 0xfe, 0x14, 0x6e, 0x2f, 0x17, 0x23, 0xf6, 0x43, 0x26, 0x1d,
+ 0xec, 0x3d, 0x78, 0x41, 0xf5, 0x3f, 0x0e, 0x3e, 0x93, 0x3f, 0x39, 0x41,
+ 0x5c, 0x3f, 0xf1, 0x40, 0xff, 0x41, 0x67, 0x42, 0x36, 0x42, 0x18, 0x41,
+ 0x74, 0x42, 0x99, 0x42, 0xc4, 0x42, 0x57, 0x42, 0xe2, 0x42, 0x0a, 0x03,
+ 0x30, 0x03, 0x50, 0x03, 0x7c, 0x03, 0xa2, 0x03, 0x00, 0x04, 0x66, 0x04,
+ 0xa0, 0x04, 0xea, 0x04, 0xac, 0x05, 0xe4, 0x01, 0x04, 0x03, 0x2a, 0x03,
+ 0x58, 0x03, 0x76, 0x03, 0x9c, 0x03, 0x60, 0x04, 0x9a, 0x04, 0xe4, 0x04,
+ 0xa6, 0x05, 0xe0, 0x01, 0x08, 0x04, 0x6e, 0x04, 0xf4, 0x02, 0x1e, 0x03,
+ 0x44, 0x03, 0x6a, 0x03, 0x90, 0x03, 0xb6, 0x03, 0xb0, 0x03, 0xce, 0x03,
+ 0x72, 0x05, 0xe8, 0x03, 0x54, 0x04, 0x8e, 0x04, 0xb4, 0x04, 0xd4, 0x04,
+ 0x8a, 0x05, 0xfe, 0x04, 0x22, 0x05, 0x3e, 0x05, 0x56, 0x05, 0x2a, 0x54,
+ 0x32, 0x54, 0x3e, 0x54, 0x46, 0x54, 0x4e, 0x54, 0x74, 0x54, 0x88, 0x54,
+ 0x90, 0x54, 0x9c, 0x54, 0xc2, 0x54, 0xd6, 0x54, 0xf0, 0xf1, 0xf2, 0xf3,
+ 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6,
+ 0x1a, 0x1a, 0x7e, 0x1a, 0xa2, 0x1a, 0x12, 0x1b, 0x34, 0x1b, 0xcc, 0x1b,
+ 0x2a, 0x1c, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x4e, 0x1c,
+ 0x70, 0x1c, 0xc6, 0x1c, 0xea, 0x1c, 0x1e, 0x1d, 0x26, 0x1d, 0x26, 0x1d,
+ 0x9c, 0x14, 0xc0, 0x15, 0x54, 0x16, 0x56, 0x16, 0x72, 0x16, 0x98, 0x16,
+ 0xb4, 0x16, 0x3e, 0x17, 0xba, 0x17, 0x6c, 0x18, 0x26, 0x1d, 0x26, 0x1d,
+ 0x26, 0x1d, 0x26, 0x1d, 0xe4, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d,
+ 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d,
+ 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d,
+ 0x26, 0x1d, 0x26, 0x1d, 0xa8, 0x18, 0xe6, 0x18, 0x5c, 0x19, 0xa2, 0x19,
+ 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d,
+ 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0xaa, 0x55, 0x00, 0xff,
+ 0xf6, 0x46, 0x01, 0x01, 0x75, 0x6a, 0xc6, 0x86, 0x0e, 0x01, 0x05, 0xe8,
+ 0x90, 0x01, 0xe8, 0x50, 0x06, 0xe8, 0xfc, 0x02, 0xe8, 0x56, 0x03, 0x73,
+ 0x3a, 0xfe, 0x8e, 0x0e, 0x01, 0x74, 0x2e, 0x26, 0x83, 0x0e, 0x72, 0x00,
+ 0x08, 0x2b, 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x26, 0x72, 0x00, 0xf7, 0x2b,
+ 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x0e, 0x72, 0x00, 0x08, 0x2b, 0xc0, 0x2b,
+ 0xc0, 0x26, 0x83, 0x26, 0x72, 0x00, 0xf7, 0x8b, 0x86, 0x0f, 0x01, 0x26,
+ 0xa3, 0x02, 0x00, 0xeb, 0xbe, 0xc7, 0x06, 0x5a, 0x55, 0x02, 0x00, 0x32,
+ 0xe4, 0x8a, 0x46, 0x00, 0xe8, 0xf6, 0x03, 0x83, 0x3e, 0x4e, 0x00, 0x02,
+ 0x72, 0x03, 0xe8, 0x3a, 0x03, 0xa1, 0x5a, 0x55, 0xe8, 0x7e, 0x3c, 0xc6,
+ 0x46, 0x01, 0x01, 0x90, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x74, 0x27, 0xf6,
+ 0x86, 0x6c, 0x01, 0x01, 0x74, 0x03, 0xe8, 0x01, 0x4d, 0xf6, 0x86, 0x6d,
+ 0x01, 0x01, 0x74, 0x03, 0xe8, 0x4f, 0x4d, 0xf7, 0x86, 0x82, 0x01, 0x01,
+ 0x00, 0x75, 0x08, 0xf7, 0x86, 0x8a, 0x01, 0x01, 0x00, 0x74, 0x03, 0xe8,
+ 0x2b, 0x4a, 0xe8, 0x7b, 0x05, 0xe8, 0x47, 0x05, 0xe8, 0xbf, 0x04, 0xe8,
+ 0x64, 0x04, 0xf6, 0x86, 0x90, 0x02, 0x01, 0x74, 0x03, 0xe8, 0x1c, 0x18,
+ 0x33, 0xdb, 0xf6, 0x86, 0xa9, 0x02, 0x01, 0x74, 0x16, 0x8a, 0x5e, 0x09,
+ 0x8a, 0x7e, 0x08, 0x38, 0xfb, 0x75, 0x30, 0x80, 0xfb, 0x00, 0x74, 0x07,
+ 0x80, 0xfb, 0x1e, 0x74, 0x02, 0xeb, 0x22, 0x80, 0x7e, 0x06, 0x1e, 0x74,
+ 0x1e, 0x33, 0xdb, 0x8a, 0x5e, 0x07, 0x3a, 0x5e, 0x06, 0x74, 0x14, 0xfa,
+ 0x50, 0x8b, 0x46, 0x06, 0x89, 0x46, 0x0c, 0x58, 0x88, 0x5e, 0x06, 0x32,
+ 0xff, 0xff, 0x97, 0x9a, 0x05, 0xeb, 0x2d, 0x8a, 0x5e, 0x09, 0x3a, 0x5e,
+ 0x08, 0x74, 0x25, 0x50, 0x8b, 0x46, 0x08, 0x89, 0x46, 0x0e, 0x58, 0x80,
+ 0xfb, 0x1e, 0x74, 0x0d, 0x80, 0xfb, 0x00, 0x74, 0x08, 0x80, 0xfb, 0x16,
+ 0x74, 0x03, 0xe8, 0x28, 0x27, 0x88, 0x5e, 0x08, 0x32, 0xff, 0xfa, 0xff,
+ 0x97, 0x78, 0x05, 0xfb, 0xfa, 0xf7, 0x86, 0xf0, 0x00, 0xff, 0xff, 0x74,
+ 0x0f, 0x8b, 0xb6, 0xf0, 0x00, 0x8b, 0x4c, 0x04, 0xe8, 0x0b, 0x0a, 0xfb,
+ 0xff, 0xd1, 0xeb, 0x5c, 0xfb, 0xf7, 0x46, 0x16, 0xff, 0xff, 0x74, 0x27,
+ 0x8d, 0x7e, 0x16, 0xe8, 0x88, 0x06, 0x56, 0x8b, 0x5c, 0x02, 0xd1, 0xe3,
+ 0xff, 0x97, 0xce, 0x04, 0x5e, 0xe8, 0x8c, 0x06, 0xf7, 0x86, 0xc8, 0x01,
+ 0x01, 0x00, 0x74, 0x09, 0xe8, 0x60, 0x21, 0xc7, 0x86, 0xc8, 0x01, 0x00,
+ 0x00, 0xeb, 0x2d, 0xfa, 0xf7, 0x86, 0x0a, 0x01, 0x01, 0x00, 0x75, 0x13,
+ 0xf6, 0x86, 0x6c, 0x15, 0x80, 0x75, 0x0c, 0xc7, 0x86, 0x0a, 0x01, 0x01,
+ 0x00, 0xfb, 0xe8, 0x31, 0x36, 0xeb, 0x11, 0xfa, 0x8b, 0x86, 0x63, 0x02,
+ 0x38, 0xc4, 0x74, 0x07, 0x88, 0x86, 0x64, 0x02, 0xe8, 0x58, 0x16, 0xfb,
+ 0xe8, 0xf1, 0x05, 0xe9, 0xd2, 0xfe, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06,
+ 0x04, 0x00, 0xff, 0xcb, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x08, 0x00,
+ 0xff, 0xfb, 0xe8, 0x53, 0x02, 0x33, 0xc0, 0x88, 0x86, 0xb8, 0x01, 0x88,
+ 0x86, 0xb9, 0x01, 0x8e, 0x46, 0x02, 0x26, 0xa2, 0x1a, 0x00, 0x89, 0x86,
+ 0x14, 0x02, 0x89, 0x86, 0x06, 0x02, 0x89, 0x86, 0x36, 0x02, 0x8e, 0x46,
+ 0x02, 0x26, 0xc7, 0x06, 0x0c, 0x00, 0x30, 0x01, 0x8d, 0x86, 0x52, 0x08,
+ 0x89, 0x86, 0xbc, 0x01, 0x89, 0x86, 0xbe, 0x01, 0xc7, 0x86, 0xc0, 0x01,
+ 0x01, 0x00, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0xbe, 0x54, 0x02,
+ 0xb9, 0x51, 0x00, 0xd1, 0xe9, 0xf3, 0xab, 0xd1, 0xd1, 0xf3, 0xaa, 0x8d,
+ 0xbe, 0x96, 0x05, 0xab, 0xab, 0xaa, 0x8d, 0xbe, 0x9e, 0x05, 0xab, 0xab,
+ 0xaa, 0x8d, 0xbe, 0xae, 0x02, 0xb9, 0x0b, 0x00, 0xf3, 0xab, 0xc7, 0x86,
+ 0xc4, 0x01, 0x14, 0x00, 0xc7, 0x86, 0xb6, 0x02, 0x04, 0x00, 0xbb, 0xfe,
+ 0x04, 0xb9, 0x0b, 0x00, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0xab, 0xab, 0x43,
+ 0x43, 0xe2, 0xf5, 0xbb, 0x14, 0x05, 0xb9, 0x0a, 0x00, 0x8b, 0x3f, 0x03,
+ 0xfd, 0xab, 0xab, 0x43, 0x43, 0xe2, 0xf6, 0xb8, 0x02, 0x00, 0x03, 0x06,
+ 0x34, 0x55, 0xe8, 0x3d, 0x05, 0x39, 0x06, 0x34, 0x55, 0x75, 0xf7, 0x8e,
+ 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x02, 0xc7, 0x86, 0x08, 0x02,
+ 0xc8, 0x00, 0xc7, 0x86, 0xf8, 0x01, 0xff, 0xff, 0xc7, 0x86, 0xf6, 0x01,
+ 0x07, 0x00, 0xc6, 0x86, 0x87, 0x02, 0x00, 0xe8, 0x01, 0x00, 0xc3, 0x8e,
+ 0x46, 0x02, 0x33, 0xc0, 0x89, 0x86, 0xb6, 0x01, 0x8e, 0x46, 0x02, 0x26,
+ 0xa3, 0x10, 0x00, 0x8b, 0x86, 0x52, 0x15, 0x26, 0xa3, 0x30, 0x00, 0x89,
+ 0x86, 0xb2, 0x01, 0xc1, 0xe8, 0x08, 0x26, 0xa3, 0x34, 0x00, 0x8b, 0x86,
+ 0x54, 0x15, 0x26, 0xa3, 0x38, 0x00, 0xc1, 0xe8, 0x08, 0x26, 0xa3, 0x36,
+ 0x00, 0x33, 0xc0, 0xc6, 0x86, 0x83, 0x02, 0x01, 0x8d, 0xb6, 0x52, 0x09,
+ 0xc7, 0x86, 0xa6, 0x01, 0x5a, 0x09, 0x01, 0xae, 0xa6, 0x01, 0x89, 0xb6,
+ 0xa8, 0x01, 0x89, 0xb6, 0xaa, 0x01, 0xc7, 0x04, 0x30, 0x80, 0xc7, 0x44,
+ 0x04, 0x00, 0x00, 0xc6, 0x86, 0x86, 0x02, 0x01, 0xe8, 0x01, 0x09, 0xb8,
+ 0x00, 0x40, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x01, 0x74, 0x13, 0x25, 0xff,
+ 0x1f, 0x0d, 0x00, 0xa0, 0x83, 0xe0, 0xfd, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x0e, 0x0c, 0x00, 0x80, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x00, 0x00,
+ 0xa1, 0x34, 0x55, 0x83, 0xc0, 0x02, 0xe8, 0x85, 0x04, 0x39, 0x06, 0x34,
+ 0x55, 0x75, 0xf7, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x00, 0x00,
+ 0x08, 0xbe, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x02, 0x00, 0xc8, 0x8e,
+ 0x46, 0x02, 0x26, 0xc7, 0x06, 0x0c, 0x00, 0xa0, 0x00, 0x8e, 0x46, 0x02,
+ 0x26, 0xc7, 0x06, 0x10, 0x00, 0x04, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x26, 0x00, 0x00, 0x7f, 0xff, 0x90, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x0e, 0x00, 0x00, 0x80, 0x00, 0x90, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x26, 0x00, 0x00, 0x7f, 0xff, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x28,
+ 0x00, 0x18, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x01,
+ 0xc3, 0xc6, 0x86, 0x0c, 0x01, 0x01, 0xc6, 0x86, 0x0d, 0x01, 0x00, 0xe8,
+ 0x06, 0x23, 0xa1, 0x34, 0x55, 0x83, 0xc0, 0x02, 0x0b, 0xc0, 0x0b, 0xc0,
+ 0x0b, 0xc0, 0x0b, 0xc0, 0x39, 0x06, 0x34, 0x55, 0x72, 0xf2, 0x80, 0xbe,
+ 0x0d, 0x01, 0x01, 0x74, 0x03, 0xf9, 0xeb, 0x01, 0xf8, 0xc6, 0x86, 0x0c,
+ 0x01, 0x00, 0xc3, 0xb8, 0x00, 0x00, 0x88, 0x86, 0x06, 0x01, 0x88, 0x86,
+ 0x07, 0x01, 0x88, 0x86, 0x08, 0x01, 0x88, 0x86, 0x09, 0x01, 0x89, 0x86,
+ 0x0a, 0x01, 0x88, 0x86, 0xb8, 0x01, 0x88, 0x86, 0xb9, 0x01, 0x88, 0x86,
+ 0xcd, 0x01, 0xa2, 0x8a, 0x56, 0xc3, 0x50, 0x53, 0x52, 0xc6, 0x46, 0x01,
+ 0x00, 0x32, 0xe4, 0x8a, 0x46, 0x00, 0xbb, 0x00, 0xfd, 0xbb, 0x00, 0xee,
+ 0x83, 0x3e, 0x58, 0x55, 0x20, 0x75, 0x03, 0xbb, 0x00, 0x7d, 0x81, 0xeb,
+ 0x00, 0x75, 0x81, 0xe3, 0x00, 0xff, 0x89, 0x9e, 0x56, 0x15, 0x81, 0xc3,
+ 0x00, 0x01, 0xf7, 0xe3, 0x05, 0x00, 0x75, 0x89, 0x86, 0x52, 0x15, 0x03,
+ 0x86, 0x56, 0x15, 0x48, 0x89, 0x86, 0x54, 0x15, 0x5a, 0x5b, 0x58, 0xc3,
+ 0x51, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfc, 0x8e, 0x46,
+ 0x02, 0x26, 0xf7, 0x06, 0x14, 0x00, 0x80, 0x00, 0x75, 0x1e, 0xb9, 0xf4,
+ 0x01, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x0c, 0x00, 0x00, 0x08, 0x8e,
+ 0x46, 0x02, 0x26, 0xf7, 0x06, 0x14, 0x00, 0x80, 0x00, 0x75, 0x05, 0xe8,
+ 0x54, 0x03, 0xe2, 0xe5, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x0c, 0x00,
+ 0xff, 0xf7, 0x59, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x02,
+ 0xc3, 0x50, 0x53, 0xc1, 0xe0, 0x05, 0x05, 0x00, 0x03, 0x8b, 0xd8, 0x8d,
+ 0x86, 0x00, 0x01, 0x89, 0x07, 0x8d, 0x86, 0xd0, 0x01, 0x89, 0x47, 0x02,
+ 0x8d, 0x86, 0xe0, 0x01, 0x89, 0x47, 0x04, 0x8d, 0x86, 0x58, 0x15, 0x89,
+ 0x47, 0x08, 0x8d, 0x86, 0x6c, 0x15, 0x89, 0x47, 0x06, 0x8d, 0x86, 0xbc,
+ 0x01, 0x89, 0x47, 0x0a, 0xc7, 0x47, 0x0c, 0x9c, 0x56, 0x8d, 0x86, 0x3c,
+ 0x02, 0x89, 0x47, 0x0e, 0x8d, 0x06, 0x34, 0x55, 0x89, 0x47, 0x10, 0xc7,
+ 0x47, 0x14, 0x00, 0x00, 0xc7, 0x47, 0x16, 0x00, 0x00, 0x8d, 0x86, 0xec,
+ 0x15, 0x89, 0x47, 0x18, 0x5b, 0x58, 0xc3, 0x8e, 0x46, 0x02, 0x80, 0xbe,
+ 0x2d, 0x01, 0x01, 0x75, 0x40, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x10,
+ 0x00, 0xfb, 0x26, 0xa1, 0x38, 0x00, 0x2d, 0x00, 0x02, 0x3b, 0x86, 0x52,
+ 0x15, 0x73, 0x0c, 0x8b, 0xd8, 0x2b, 0x9e, 0x52, 0x15, 0x8b, 0x86, 0x54,
+ 0x15, 0x2b, 0xc3, 0x26, 0xa3, 0x6c, 0x00, 0x26, 0xa1, 0x12, 0x00, 0x89,
+ 0x86, 0x32, 0x01, 0x26, 0xc7, 0x06, 0x12, 0x00, 0x00, 0x01, 0x8e, 0x46,
+ 0x02, 0x26, 0x83, 0x0e, 0x10, 0x00, 0x05, 0xeb, 0x18, 0x8e, 0x46, 0x02,
+ 0x26, 0x83, 0x26, 0x10, 0x00, 0xfe, 0x8b, 0x86, 0x32, 0x01, 0x26, 0xa3,
+ 0x12, 0x00, 0xb8, 0xff, 0xff, 0x26, 0xa3, 0x6c, 0x00, 0xc3, 0x50, 0xf7,
+ 0x86, 0xf6, 0x00, 0x02, 0x00, 0x75, 0x02, 0xeb, 0x4b, 0xf6, 0x86, 0x60,
+ 0x02, 0x01, 0x75, 0x07, 0xf6, 0x86, 0x6e, 0x02, 0x01, 0x74, 0x3d, 0xf6,
+ 0x86, 0x85, 0x02, 0x01, 0x74, 0x36, 0xc6, 0x86, 0x85, 0x02, 0x00, 0x8b,
+ 0x86, 0x06, 0x02, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x40, 0x74, 0x03, 0x25,
+ 0xff, 0xaf, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x20, 0x74, 0x03, 0x25, 0xff,
+ 0xdf, 0x89, 0x86, 0x06, 0x02, 0x3b, 0x86, 0x36, 0x02, 0x74, 0x0d, 0x89,
+ 0x86, 0x36, 0x02, 0x81, 0xa6, 0x36, 0x02, 0x7f, 0xdf, 0xe8, 0x8a, 0x38,
+ 0x58, 0xc3, 0x57, 0x56, 0x50, 0x8b, 0x86, 0xda, 0x02, 0xa9, 0xff, 0xff,
+ 0x74, 0x40, 0x8d, 0xbe, 0xd0, 0x02, 0x8d, 0xb6, 0x96, 0x05, 0xb9, 0x0a,
+ 0x00, 0x83, 0xf9, 0x05, 0x75, 0x04, 0x8d, 0xb6, 0x9e, 0x05, 0xa9, 0x01,
+ 0x00, 0x74, 0x1e, 0x80, 0x3d, 0xff, 0x74, 0x12, 0xfe, 0x05, 0x80, 0x3d,
+ 0xff, 0x75, 0x0b, 0x81, 0x8e, 0x06, 0x02, 0x80, 0x00, 0xc6, 0x86, 0x85,
+ 0x02, 0x01, 0x80, 0x3c, 0xff, 0x74, 0x02, 0xfe, 0x04, 0xd1, 0xe8, 0x47,
+ 0x46, 0xe2, 0xce, 0xe8, 0x0a, 0x00, 0xc7, 0x86, 0xda, 0x02, 0x00, 0x00,
+ 0x58, 0x5e, 0x5f, 0xc3, 0xf6, 0x86, 0x56, 0x02, 0x01, 0x75, 0x27, 0xf6,
+ 0x86, 0xaa, 0x02, 0x01, 0x75, 0x07, 0xf6, 0x86, 0x60, 0x02, 0x01, 0x74,
+ 0x19, 0xc6, 0x86, 0x56, 0x02, 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x80,
+ 0x75, 0x0c, 0xbe, 0xa5, 0x45, 0xe8, 0xb8, 0x03, 0xc7, 0x86, 0xb6, 0x02,
+ 0x04, 0x00, 0xc3, 0xf7, 0x86, 0x58, 0x15, 0x00, 0x80, 0x75, 0x02, 0xeb,
+ 0x26, 0x8b, 0xb6, 0x60, 0x01, 0x3b, 0xb6, 0x5e, 0x01, 0x74, 0x1c, 0x46,
+ 0x83, 0xe6, 0x07, 0x89, 0xb6, 0x60, 0x01, 0x8b, 0xce, 0xd1, 0xe1, 0xd1,
+ 0xe1, 0x8d, 0xb6, 0x3e, 0x01, 0x03, 0xf1, 0x8b, 0x04, 0x8b, 0x54, 0x02,
+ 0xe9, 0x7a, 0x38, 0xc3, 0xbb, 0x00, 0x03, 0x83, 0x7f, 0x12, 0x00, 0x74,
+ 0x08, 0xe8, 0xf5, 0x37, 0xc7, 0x47, 0x12, 0x00, 0x00, 0xc3, 0x53, 0x50,
+ 0x33, 0xc0, 0x88, 0x86, 0xcb, 0x01, 0xa3, 0x9a, 0x56, 0xbb, 0x9c, 0x56,
+ 0x89, 0x1e, 0x92, 0x56, 0x89, 0x07, 0x89, 0x47, 0x02, 0x89, 0x47, 0x04,
+ 0xa3, 0x94, 0x56, 0xa3, 0x96, 0x56, 0xa3, 0x98, 0x56, 0x58, 0x5b, 0xc3,
+ 0x50, 0x8a, 0xe0, 0xe4, 0x12, 0xf6, 0xd4, 0x22, 0xc4, 0xe6, 0x12, 0x58,
+ 0xc3, 0xc6, 0x46, 0x06, 0x00, 0xc6, 0x46, 0x07, 0x00, 0xc6, 0x46, 0x08,
+ 0x00, 0xc6, 0x46, 0x09, 0x00, 0xc6, 0x86, 0x6c, 0x15, 0x80, 0x8d, 0xbe,
+ 0x0a, 0x03, 0x8c, 0xd8, 0x8e, 0xc0, 0xab, 0xab, 0xab, 0xc3, 0x51, 0x53,
+ 0xb9, 0x10, 0x00, 0xd1, 0xe0, 0xd1, 0xdb, 0xe2, 0xfa, 0x8b, 0xc3, 0x86,
+ 0xc4, 0x5b, 0x59, 0xc3, 0x50, 0x53, 0x51, 0x52, 0x57, 0x56, 0x8d, 0x1e,
+ 0x68, 0x05, 0xb8, 0x40, 0x60, 0x8e, 0xc0, 0xff, 0x06, 0x4e, 0x00, 0xc7,
+ 0x06, 0x50, 0x55, 0x00, 0x00, 0xc6, 0x06, 0x54, 0x55, 0x00, 0xc7, 0x06,
+ 0x58, 0x55, 0x20, 0x00, 0xbb, 0x00, 0x0d, 0x8b, 0x07, 0x81, 0xc3, 0x00,
+ 0x80, 0x3b, 0x07, 0x74, 0x06, 0xc7, 0x06, 0x58, 0x55, 0x40, 0x00, 0x8d,
+ 0x3e, 0x52, 0x55, 0xb8, 0xac, 0x5d, 0x89, 0x05, 0x06, 0x33, 0xc0, 0x8e,
+ 0xc0, 0xa3, 0x34, 0x55, 0xa3, 0x36, 0x55, 0xa3, 0x38, 0x55, 0x8d, 0x3e,
+ 0x48, 0x55, 0xb9, 0x04, 0x00, 0xd1, 0xe9, 0xf3, 0xab, 0x8d, 0x3e, 0x4c,
+ 0x55, 0xb9, 0x04, 0x00, 0xd1, 0xe9, 0xf3, 0xab, 0x07, 0x8b, 0xd4, 0xb9,
+ 0x01, 0x00, 0xbb, 0x00, 0x00, 0xbd, 0xac, 0x5d, 0x88, 0x5e, 0x00, 0x8b,
+ 0xc3, 0xd1, 0xe0, 0xd1, 0xe0, 0x05, 0x40, 0x60, 0x89, 0x46, 0x02, 0xe8,
+ 0xb0, 0xfc, 0xe8, 0xe2, 0x00, 0x8b, 0xc5, 0x05, 0x4e, 0x08, 0x89, 0x86,
+ 0x50, 0x08, 0x83, 0xc0, 0x02, 0x8b, 0xe0, 0x68, 0xfc, 0x05, 0x81, 0xc5,
+ 0xec, 0x16, 0x43, 0xe2, 0xd3, 0x8b, 0xe2, 0x33, 0xed, 0x5e, 0x5f, 0x5a,
+ 0x59, 0x5b, 0x58, 0xc3, 0x3e, 0x89, 0xa6, 0x50, 0x08, 0x33, 0xed, 0xbc,
+ 0x88, 0x56, 0xfa, 0x83, 0x0e, 0x4c, 0x55, 0x00, 0x74, 0x0d, 0x8b, 0x36,
+ 0x4c, 0x55, 0x8b, 0x4c, 0x04, 0xe8, 0xea, 0x03, 0xfb, 0xff, 0xd1, 0xfb,
+ 0x32, 0xff, 0x8a, 0x1e, 0x50, 0x55, 0x80, 0x8f, 0x56, 0x55, 0x00, 0x75,
+ 0x21, 0xd1, 0xe3, 0x8b, 0xaf, 0x52, 0x55, 0x81, 0xbe, 0x4e, 0x06, 0xa5,
+ 0xa5, 0x74, 0x0c, 0xd1, 0xeb, 0xc6, 0x87, 0x56, 0x55, 0x01, 0xe8, 0x2c,
+ 0x06, 0xeb, 0x07, 0x8b, 0x86, 0x50, 0x08, 0x8b, 0xe0, 0xc3, 0xeb, 0xb5,
+ 0xeb, 0xae, 0x60, 0x9c, 0xe8, 0xa9, 0xff, 0x0e, 0xe8, 0x02, 0x00, 0xeb,
+ 0x01, 0xcf, 0x61, 0xc3, 0x50, 0xfa, 0x8b, 0x76, 0x1a, 0xf7, 0xc6, 0xff,
+ 0xff, 0x74, 0x10, 0x8b, 0x04, 0x89, 0x46, 0x1a, 0x0b, 0xc0, 0x75, 0x03,
+ 0x89, 0x46, 0x1c, 0xc7, 0x04, 0x00, 0x00, 0xfb, 0x58, 0xc3, 0x53, 0xfa,
+ 0xc7, 0x04, 0x00, 0x00, 0x8b, 0x5d, 0x02, 0x89, 0x37, 0x89, 0x75, 0x02,
+ 0x83, 0x3d, 0x00, 0x75, 0x02, 0x89, 0x35, 0xfb, 0x5b, 0xc3, 0x50, 0xfa,
+ 0x8b, 0x35, 0x8b, 0x04, 0x89, 0x05, 0x0b, 0xc0, 0x75, 0x03, 0x89, 0x45,
+ 0x02, 0xfb, 0x58, 0xc3, 0x50, 0xfa, 0x8b, 0x46, 0x1a, 0x89, 0x04, 0x89,
+ 0x76, 0x1a, 0xf7, 0x46, 0x1a, 0xff, 0xff, 0x75, 0x03, 0x89, 0x76, 0x1a,
+ 0xfb, 0x58, 0xc3, 0x50, 0x53, 0x51, 0x8b, 0xc5, 0x83, 0xc0, 0x1e, 0x89,
+ 0x46, 0x1a, 0x83, 0xc0, 0x48, 0x89, 0x46, 0x1c, 0xb9, 0x09, 0x00, 0x8b,
+ 0xdd, 0x8b, 0xc5, 0x83, 0xc0, 0x26, 0x89, 0x47, 0x1e, 0x83, 0xc3, 0x08,
+ 0x83, 0xc0, 0x08, 0xe2, 0xf5, 0x59, 0x5b, 0x58, 0xc3, 0x90, 0x60, 0x06,
+ 0x1e, 0xfa, 0x33, 0xdb, 0x8e, 0xdb, 0x83, 0x06, 0x34, 0x55, 0x01, 0x73,
+ 0x04, 0x11, 0x1e, 0x36, 0x55, 0xb9, 0x01, 0x00, 0x8b, 0xaf, 0x52, 0x55,
+ 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x03, 0xe8, 0xda, 0x3e, 0xf7, 0x06,
+ 0x34, 0x55, 0x07, 0x00, 0x74, 0x10, 0x80, 0xbe, 0x2d, 0x01, 0x01, 0x75,
+ 0x09, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x10, 0x00, 0x01, 0xf7, 0x86,
+ 0xa3, 0x02, 0x01, 0x00, 0x74, 0x30, 0xfe, 0x86, 0x6b, 0x01, 0x80, 0xbe,
+ 0x6b, 0x01, 0x02, 0x73, 0x02, 0xeb, 0x23, 0xc6, 0x86, 0x6b, 0x01, 0x00,
+ 0xf7, 0x86, 0x1c, 0x01, 0x01, 0x00, 0x75, 0x0a, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x26, 0x04, 0x00, 0x32, 0xfe, 0x81, 0xa6, 0x18, 0x01, 0x32, 0xfe,
+ 0xc7, 0x86, 0xa3, 0x02, 0x00, 0x00, 0xc6, 0x86, 0x6a, 0x01, 0x00, 0x8e,
+ 0x46, 0x02, 0x26, 0xa1, 0x08, 0x00, 0x25, 0x00, 0x02, 0x74, 0x03, 0xe8,
+ 0x1d, 0x12, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x74, 0x03, 0xe8, 0x90, 0x3e,
+ 0x8b, 0x86, 0xf6, 0x00, 0x25, 0xd0, 0xe5, 0x89, 0x86, 0x2c, 0x02, 0x8a,
+ 0x46, 0x08, 0x3c, 0x06, 0x74, 0x08, 0x3c, 0x0a, 0x74, 0x04, 0x3c, 0x18,
+ 0x75, 0x04, 0xff, 0x86, 0x46, 0x02, 0x83, 0xc3, 0x02, 0x49, 0x74, 0x03,
+ 0xe9, 0x5d, 0xff, 0xf7, 0x06, 0x48, 0x55, 0xff, 0xff, 0x74, 0x1f, 0xff,
+ 0x0e, 0x38, 0x55, 0x75, 0x19, 0xe8, 0x14, 0x02, 0x8b, 0x1e, 0x48, 0x55,
+ 0x0b, 0xdb, 0x74, 0x0e, 0x8b, 0x47, 0x08, 0xa3, 0x38, 0x55, 0xf7, 0x06,
+ 0x38, 0x55, 0xff, 0xff, 0x74, 0xe7, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58,
+ 0x1f, 0x07, 0x61, 0xcf, 0x60, 0x06, 0x1e, 0xfa, 0x8d, 0x36, 0x3c, 0x55,
+ 0x83, 0x04, 0x01, 0x83, 0x54, 0x02, 0x00, 0xe8, 0x17, 0x42, 0xa0, 0x3a,
+ 0x55, 0xfe, 0xc0, 0x3c, 0x04, 0x72, 0x08, 0xc6, 0x06, 0x3a, 0x55, 0x00,
+ 0xe9, 0xf7, 0xfe, 0xa2, 0x3a, 0x55, 0xeb, 0xce, 0x50, 0x57, 0x56, 0xfa,
+ 0x8d, 0x36, 0x40, 0x55, 0x83, 0x04, 0x01, 0x83, 0x54, 0x02, 0x00, 0x80,
+ 0x3e, 0x8a, 0x56, 0x01, 0x75, 0x0d, 0x8b, 0x36, 0x8c, 0x56, 0x83, 0xfe,
+ 0x14, 0x77, 0x0e, 0xff, 0x94, 0x52, 0x05, 0x50, 0xb0, 0xa0, 0xe6, 0x10,
+ 0x58, 0x5e, 0x5f, 0x58, 0xcf, 0xe8, 0xc6, 0x44, 0xeb, 0xf1, 0x57, 0x56,
+ 0x50, 0xfa, 0x8d, 0x36, 0x44, 0x55, 0x83, 0x04, 0x01, 0x83, 0x54, 0x02,
+ 0x00, 0x80, 0x3e, 0x8a, 0x56, 0x01, 0x75, 0x0d, 0x8b, 0x36, 0x8c, 0x56,
+ 0x83, 0xfe, 0x14, 0x77, 0x0e, 0xff, 0x94, 0x52, 0x05, 0x50, 0xb0, 0xa0,
+ 0xe6, 0x10, 0x58, 0x58, 0x5e, 0x5f, 0xcf, 0xe8, 0x94, 0x44, 0xeb, 0xf1,
+ 0x50, 0x53, 0x51, 0x57, 0xe8, 0xab, 0x00, 0xfa, 0x8b, 0x3c, 0x03, 0xfd,
+ 0x89, 0x6d, 0x02, 0x8b, 0x44, 0x02, 0x89, 0x45, 0x04, 0x8b, 0x44, 0x04,
+ 0x89, 0x45, 0x06, 0x0b, 0xc0, 0x75, 0x0e, 0x8b, 0x86, 0x08, 0x02, 0x0b,
+ 0xc0, 0x75, 0x03, 0xb8, 0xc8, 0x00, 0x89, 0x45, 0x06, 0xf7, 0x06, 0x48,
+ 0x55, 0xff, 0xff, 0x75, 0x14, 0x89, 0x3e, 0x48, 0x55, 0x89, 0x3e, 0x4a,
+ 0x55, 0xc7, 0x05, 0x00, 0x00, 0x89, 0x45, 0x08, 0xa3, 0x38, 0x55, 0xeb,
+ 0x63, 0x8b, 0x3e, 0x48, 0x55, 0x8b, 0x0e, 0x38, 0x55, 0x33, 0xdb, 0x3b,
+ 0xc8, 0x72, 0x35, 0x0b, 0xdb, 0x75, 0x17, 0x2b, 0xc8, 0x89, 0x4d, 0x08,
+ 0x8b, 0x34, 0x03, 0xf5, 0x89, 0x44, 0x08, 0x89, 0x3c, 0x89, 0x36, 0x48,
+ 0x55, 0xa3, 0x38, 0x55, 0xeb, 0x3a, 0x2b, 0x4d, 0x08, 0x2b, 0xc1, 0x8b,
+ 0x34, 0x03, 0xf5, 0x89, 0x44, 0x08, 0x8b, 0x4d, 0x08, 0x2b, 0xc8, 0x89,
+ 0x4d, 0x08, 0x89, 0x37, 0x89, 0x3c, 0xeb, 0x20, 0x8b, 0xdf, 0x8b, 0x3d,
+ 0x0b, 0xff, 0x74, 0x05, 0x03, 0x4d, 0x08, 0xeb, 0xba, 0x2b, 0xc1, 0x8b,
+ 0x34, 0x03, 0xf5, 0x89, 0x44, 0x08, 0x89, 0x37, 0xc7, 0x04, 0x00, 0x00,
+ 0x89, 0x36, 0x4a, 0x55, 0xfb, 0x5f, 0x59, 0x5b, 0x58, 0xc3, 0x57, 0x53,
+ 0x50, 0x56, 0xfa, 0x8b, 0x1e, 0x48, 0x55, 0x33, 0xff, 0x8b, 0x34, 0x03,
+ 0xf5, 0x83, 0x7c, 0x02, 0xff, 0x74, 0x4b, 0x3b, 0xde, 0x75, 0x49, 0x0b,
+ 0xff, 0x74, 0x18, 0x8b, 0x07, 0x89, 0x05, 0x0b, 0xc0, 0x75, 0x06, 0x89,
+ 0x3e, 0x4a, 0x55, 0xeb, 0x2c, 0x8b, 0x4f, 0x08, 0x8b, 0xf8, 0x01, 0x4d,
+ 0x08, 0xeb, 0x22, 0x8b, 0x3f, 0x89, 0x3e, 0x48, 0x55, 0x0b, 0xff, 0x75,
+ 0x0c, 0x89, 0x3e, 0x4a, 0x55, 0xc7, 0x06, 0x38, 0x55, 0xff, 0xff, 0xeb,
+ 0x0c, 0xa1, 0x38, 0x55, 0x01, 0x45, 0x08, 0x8b, 0x45, 0x08, 0xa3, 0x38,
+ 0x55, 0xc7, 0x47, 0x02, 0xff, 0xff, 0xc7, 0x07, 0x00, 0x00, 0xeb, 0x4e,
+ 0x83, 0xcb, 0x00, 0x74, 0x06, 0x8b, 0xfb, 0x8b, 0x1f, 0xeb, 0xa8, 0x83,
+ 0xfd, 0x00, 0x75, 0x05, 0xbb, 0x4c, 0x55, 0xeb, 0x04, 0x8d, 0x9e, 0xf0,
+ 0x00, 0x8b, 0x1f, 0x83, 0xfb, 0x00, 0x74, 0x2e, 0x3b, 0xde, 0x75, 0x05,
+ 0xe8, 0x6b, 0x00, 0xeb, 0x25, 0x8b, 0xfb, 0x8b, 0x1f, 0x83, 0xcb, 0x00,
+ 0x74, 0x1c, 0x3b, 0xde, 0x75, 0xf3, 0x8b, 0x07, 0x89, 0x05, 0x83, 0xc8,
+ 0x00, 0x75, 0x04, 0x89, 0xbe, 0xf2, 0x00, 0xc7, 0x07, 0x00, 0x00, 0xc7,
+ 0x47, 0x02, 0xff, 0xff, 0xeb, 0x00, 0xfb, 0x5e, 0x58, 0x5b, 0x5f, 0xc3,
+ 0x50, 0x53, 0x56, 0x55, 0x8b, 0x1e, 0x48, 0x55, 0x8b, 0x6f, 0x02, 0x0b,
+ 0xed, 0x74, 0x06, 0x81, 0xc5, 0xf0, 0x00, 0xeb, 0x03, 0xbd, 0x4c, 0x55,
+ 0x8b, 0x76, 0x02, 0x8b, 0x07, 0xa3, 0x48, 0x55, 0x0b, 0xc0, 0x75, 0x03,
+ 0xa3, 0x4a, 0x55, 0x89, 0x5e, 0x02, 0x89, 0x1c, 0xc7, 0x07, 0x00, 0x00,
+ 0x83, 0x4e, 0x00, 0x00, 0x75, 0x03, 0x89, 0x5e, 0x00, 0x5d, 0x5e, 0x5b,
+ 0x58, 0xc3, 0x55, 0x53, 0x50, 0x0b, 0xed, 0x74, 0x06, 0x81, 0xc5, 0xf0,
+ 0x00, 0xeb, 0x03, 0xbd, 0x4c, 0x55, 0x8b, 0x5e, 0x00, 0xc7, 0x47, 0x02,
+ 0xff, 0xff, 0x8b, 0x07, 0xc7, 0x07, 0x00, 0x00, 0x8b, 0xd8, 0x89, 0x5e,
+ 0x00, 0x0b, 0xdb, 0x75, 0x03, 0x89, 0x5e, 0x02, 0x58, 0x5b, 0x5d, 0xc3,
+ 0x50, 0x53, 0x51, 0x57, 0x56, 0xfa, 0x8b, 0x1e, 0x48, 0x55, 0x33, 0xff,
+ 0x83, 0xcb, 0x00, 0x74, 0x54, 0x8b, 0xc3, 0x39, 0x6f, 0x02, 0x75, 0x47,
+ 0x0b, 0xff, 0x74, 0x18, 0x8b, 0x37, 0x89, 0x35, 0x8b, 0xc7, 0x0b, 0xf6,
+ 0x75, 0x06, 0x89, 0x3e, 0x4a, 0x55, 0xeb, 0x2c, 0x8b, 0x4f, 0x08, 0x01,
+ 0x4c, 0x08, 0xeb, 0x24, 0x8b, 0x37, 0x89, 0x36, 0x48, 0x55, 0x0b, 0xf6,
+ 0x75, 0x0c, 0x89, 0x36, 0x4a, 0x55, 0xc7, 0x06, 0x38, 0x55, 0xff, 0xff,
+ 0xeb, 0x0e, 0xa1, 0x38, 0x55, 0x01, 0x44, 0x08, 0x8b, 0x44, 0x08, 0xa3,
+ 0x38, 0x55, 0x33, 0xc0, 0xc7, 0x47, 0x02, 0xff, 0xff, 0xeb, 0x00, 0x8b,
+ 0xf8, 0x8b, 0x1f, 0xeb, 0xa7, 0xfb, 0x5e, 0x5f, 0x59, 0x5b, 0x58, 0xc3,
+ 0x50, 0x53, 0x51, 0x52, 0x8a, 0x8e, 0xa8, 0x02, 0x8e, 0x46, 0x02, 0x26,
+ 0xa1, 0x00, 0x00, 0x8b, 0xd8, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x01, 0x74,
+ 0x10, 0x83, 0xe0, 0xfd, 0xc6, 0x86, 0x79, 0x02, 0x01, 0x25, 0xff, 0x1f,
+ 0x0d, 0x00, 0x80, 0xeb, 0x0e, 0x25, 0xff, 0x1f, 0x0d, 0x00, 0x20, 0x83,
+ 0xc8, 0x02, 0xc6, 0x86, 0x79, 0x02, 0x00, 0xe8, 0x67, 0x02, 0x0d, 0x00,
+ 0x08, 0xf6, 0x86, 0xaa, 0x02, 0x01, 0x75, 0x03, 0x25, 0xff, 0xf7, 0x33,
+ 0xd8, 0x74, 0x0f, 0x26, 0xa3, 0x00, 0x00, 0xf7, 0xc3, 0x02, 0x00, 0x74,
+ 0x05, 0xc6, 0x06, 0x0a, 0x13, 0x01, 0x26, 0xa1, 0x0c, 0x00, 0x8b, 0xd8,
+ 0xf7, 0x86, 0x12, 0x01, 0x10, 0x00, 0x74, 0x05, 0x0d, 0x00, 0x10, 0xeb,
+ 0x03, 0x25, 0xff, 0xef, 0x8a, 0xae, 0x69, 0x02, 0x80, 0xf9, 0x01, 0x75,
+ 0x04, 0x8a, 0xae, 0x6a, 0x02, 0xf6, 0xc5, 0x01, 0x74, 0x05, 0x83, 0xc8,
+ 0x10, 0xeb, 0x03, 0x83, 0xe0, 0xef, 0xf6, 0x86, 0x6b, 0x02, 0x01, 0x74,
+ 0x0a, 0x83, 0xc8, 0x20, 0xc6, 0x86, 0x7a, 0x02, 0x00, 0xeb, 0x08, 0x83,
+ 0xe0, 0xdf, 0xc6, 0x86, 0x7a, 0x02, 0x01, 0xf6, 0x86, 0x54, 0x02, 0x01,
+ 0x74, 0x0a, 0xc6, 0x86, 0x7a, 0x02, 0x00, 0x83, 0xc8, 0x40, 0xeb, 0x03,
+ 0x83, 0xe0, 0xbf, 0xf6, 0x86, 0x79, 0x02, 0x01, 0x74, 0x05, 0x0d, 0x80,
+ 0x00, 0xeb, 0x03, 0x25, 0x7f, 0xff, 0xf6, 0x86, 0x78, 0x02, 0x01, 0x74,
+ 0x05, 0x0d, 0x00, 0x01, 0xeb, 0x03, 0x25, 0xff, 0xfe, 0xf6, 0x86, 0x7a,
+ 0x02, 0x01, 0x74, 0x05, 0x0d, 0x00, 0x20, 0xeb, 0x03, 0x25, 0xff, 0xdf,
+ 0x33, 0xd8, 0x74, 0x12, 0xf7, 0xc3, 0x20, 0x00, 0x74, 0x05, 0xc6, 0x06,
+ 0x0a, 0x13, 0x01, 0x25, 0xff, 0xf7, 0x26, 0xa3, 0x0c, 0x00, 0x26, 0xa1,
+ 0x10, 0x00, 0x8b, 0xd8, 0x33, 0xd8, 0x74, 0x04, 0x26, 0xa3, 0x10, 0x00,
+ 0xf6, 0x06, 0x0a, 0x13, 0x01, 0x74, 0x1e, 0xc6, 0x06, 0x0a, 0x13, 0x00,
+ 0x26, 0x81, 0x26, 0x00, 0x00, 0x7f, 0xff, 0x90, 0x90, 0x26, 0x81, 0x0e,
+ 0x00, 0x00, 0x80, 0x00, 0x90, 0x90, 0x26, 0x81, 0x26, 0x00, 0x00, 0x7f,
+ 0xff, 0x5a, 0x59, 0x5b, 0x58, 0xc3, 0x00, 0x8e, 0x46, 0x02, 0xf7, 0x86,
+ 0xf4, 0x00, 0x04, 0x00, 0x74, 0x0b, 0xc6, 0x06, 0x8a, 0x56, 0x01, 0x26,
+ 0x83, 0x0e, 0x02, 0x00, 0x02, 0xc6, 0x86, 0xab, 0x02, 0x00, 0xc6, 0x86,
+ 0xac, 0x02, 0x00, 0x81, 0xa6, 0xf6, 0x00, 0xff, 0xfb, 0xa8, 0x01, 0x74,
+ 0x19, 0x81, 0x8e, 0xf6, 0x00, 0x00, 0x04, 0x26, 0x83, 0x0e, 0x02, 0x00,
+ 0x20, 0x26, 0x83, 0x26, 0x02, 0x00, 0xef, 0xc6, 0x86, 0xac, 0x02, 0x01,
+ 0xeb, 0x4d, 0xa8, 0x02, 0x74, 0x1f, 0x26, 0x83, 0x26, 0x02, 0x00, 0xcf,
+ 0xf7, 0x86, 0xf4, 0x00, 0x04, 0x00, 0x75, 0x0d, 0xf7, 0x86, 0x12, 0x01,
+ 0x00, 0x84, 0x75, 0x05, 0xc6, 0x86, 0xab, 0x02, 0x01, 0xb0, 0x02, 0xeb,
+ 0x2a, 0xa8, 0x04, 0x74, 0x0e, 0x26, 0x83, 0x0e, 0x02, 0x00, 0x20, 0x26,
+ 0x83, 0x26, 0x02, 0x00, 0xef, 0xeb, 0x18, 0xa8, 0x08, 0x74, 0x08, 0x26,
+ 0x83, 0x0e, 0x02, 0x00, 0x30, 0xeb, 0x0c, 0xa8, 0x10, 0x74, 0x08, 0x26,
+ 0x83, 0x0e, 0x02, 0x00, 0x30, 0xeb, 0x00, 0xf6, 0x06, 0x8a, 0x56, 0x01,
+ 0x74, 0x06, 0x26, 0x83, 0x26, 0x02, 0x00, 0xcf, 0xc3, 0xc3, 0x8e, 0x46,
+ 0x02, 0x26, 0x81, 0x0e, 0x0c, 0x00, 0x00, 0x01, 0x90, 0x90, 0x8e, 0x46,
+ 0x02, 0x26, 0x81, 0x26, 0x0c, 0x00, 0xff, 0xfe, 0xc3, 0x8e, 0x46, 0x02,
+ 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x0f, 0x80, 0xbe, 0xab, 0x02, 0x01,
+ 0x75, 0x10, 0x26, 0x83, 0x0e, 0x02, 0x00, 0x02, 0xeb, 0x08, 0xc6, 0x86,
+ 0x6c, 0x01, 0x01, 0xe8, 0x9c, 0x3f, 0xc3, 0x8e, 0x46, 0x02, 0xf7, 0x86,
+ 0xf4, 0x00, 0x02, 0x00, 0x74, 0x09, 0x26, 0x81, 0x26, 0x02, 0x00, 0xff,
+ 0xef, 0xeb, 0x07, 0x26, 0x81, 0x0e, 0x02, 0x00, 0x00, 0x10, 0xc3, 0x8e,
+ 0x46, 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x02, 0x00, 0x74, 0x09, 0x26, 0x81,
+ 0x0e, 0x02, 0x00, 0x00, 0x10, 0xeb, 0x07, 0x26, 0x81, 0x26, 0x02, 0x00,
+ 0xff, 0xef, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x02, 0x00, 0x00,
+ 0x80, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x02, 0x00, 0xff, 0x7f,
+ 0xc3, 0xf7, 0x86, 0xf4, 0x00, 0x08, 0x00, 0x74, 0x13, 0xe8, 0xdf, 0xff,
+ 0xeb, 0x3a, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x1e, 0x80, 0x7e, 0x06, 0x48,
+ 0x74, 0x24, 0xeb, 0x2c, 0xe8, 0xd7, 0xff, 0x8e, 0x46, 0x02, 0xf7, 0x86,
+ 0xf4, 0x00, 0x10, 0x00, 0x75, 0xe4, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x01,
+ 0x75, 0x0c, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x02, 0x00, 0x00, 0x40,
+ 0xeb, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x02, 0x00, 0xff, 0xbf,
+ 0xc3, 0x83, 0xe0, 0xf7, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x04, 0x74, 0x03,
+ 0x83, 0xc8, 0x08, 0xc3, 0x53, 0x40, 0x03, 0x06, 0x34, 0x55, 0x8b, 0xd8,
+ 0xe8, 0xf7, 0xf8, 0xa1, 0x34, 0x55, 0x3b, 0xc3, 0x75, 0xf6, 0x5b, 0xc3,
+ 0xe8, 0xfb, 0xf2, 0xc6, 0x86, 0x69, 0x02, 0x01, 0xc6, 0x86, 0x6b, 0x02,
+ 0x01, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0xc6, 0x86,
+ 0x78, 0x02, 0x00, 0xe8, 0x1e, 0xfd, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06,
+ 0x10, 0x00, 0x04, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x10, 0x00,
+ 0x04, 0x33, 0xc0, 0x88, 0x86, 0x88, 0x02, 0x88, 0x86, 0x89, 0x02, 0xc6,
+ 0x86, 0x63, 0x01, 0x01, 0xc7, 0x86, 0x64, 0x01, 0xf8, 0x05, 0xc6, 0x86,
+ 0x69, 0x01, 0x02, 0xbe, 0x0b, 0x46, 0xe8, 0xab, 0xfa, 0xbe, 0x05, 0x46,
+ 0xe8, 0xa5, 0xfa, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x04, 0x00, 0x32,
+ 0xfe, 0xc3, 0xc6, 0x86, 0x63, 0x01, 0x00, 0x80, 0xbe, 0x62, 0x01, 0x01,
+ 0x75, 0x0d, 0xe8, 0x8d, 0xf2, 0xe8, 0x7d, 0x2c, 0xc6, 0x46, 0x07, 0x00,
+ 0xe9, 0xa7, 0x00, 0xbe, 0xb7, 0x45, 0xe8, 0x2d, 0xfb, 0xbe, 0x05, 0x46,
+ 0xe8, 0x27, 0xfb, 0xc6, 0x86, 0x88, 0x02, 0x01, 0x80, 0x7e, 0x06, 0x02,
+ 0x74, 0x08, 0x80, 0x7e, 0x06, 0x44, 0x74, 0x09, 0xeb, 0x0d, 0xc6, 0x46,
+ 0x07, 0x04, 0xe9, 0x81, 0x00, 0xc6, 0x46, 0x07, 0x46, 0xeb, 0x7b, 0x80,
+ 0x7e, 0x08, 0x08, 0x75, 0xf8, 0xc6, 0x86, 0x81, 0x02, 0x01, 0xc6, 0x86,
+ 0x69, 0x02, 0x00, 0xc6, 0x86, 0x5d, 0x02, 0x00, 0xc6, 0x86, 0x5c, 0x02,
+ 0x00, 0xc6, 0x86, 0x5f, 0x02, 0x01, 0xc6, 0x86, 0x68, 0x02, 0x01, 0xc6,
+ 0x86, 0x6c, 0x02, 0x01, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x17, 0x80,
+ 0xbe, 0xa6, 0x02, 0x01, 0x74, 0x2c, 0xc6, 0x46, 0x09, 0x0a, 0xc6, 0x86,
+ 0x6b, 0x02, 0x00, 0xc6, 0x86, 0x59, 0x02, 0x01, 0xeb, 0x1c, 0xf6, 0x86,
+ 0x59, 0x02, 0x01, 0x74, 0x15, 0x80, 0xbe, 0xa6, 0x02, 0x01, 0x74, 0x0e,
+ 0xc6, 0x46, 0x09, 0x06, 0xc6, 0x86, 0x58, 0x02, 0x01, 0xc6, 0x86, 0x6b,
+ 0x02, 0x01, 0xe8, 0x18, 0xfe, 0xe8, 0x2c, 0xfc, 0xbe, 0xed, 0x45, 0xe8,
+ 0xe6, 0xf9, 0xbe, 0xab, 0x45, 0xe8, 0xe0, 0xf9, 0xbe, 0xf3, 0x45, 0xe8,
+ 0xda, 0xf9, 0xc3, 0x90, 0xc6, 0x46, 0x09, 0x00, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x26, 0x04, 0x00, 0x32, 0xfe, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x02,
+ 0x75, 0x05, 0xc6, 0x86, 0x92, 0x02, 0x01, 0xe8, 0x30, 0x08, 0xc7, 0x86,
+ 0xc4, 0x01, 0x14, 0x00, 0xc7, 0x86, 0xc2, 0x02, 0x00, 0x00, 0xbe, 0xf9,
+ 0x45, 0xe8, 0xa8, 0xf9, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b,
+ 0x02, 0x01, 0xc6, 0x86, 0x68, 0x02, 0x01, 0xc6, 0x86, 0x6c, 0x02, 0x01,
+ 0xe8, 0xd1, 0xfb, 0xb8, 0x01, 0x00, 0xe8, 0x7b, 0xfe, 0xe8, 0xb1, 0xfd,
+ 0xbe, 0xb1, 0x45, 0xe8, 0x82, 0xf9, 0xbe, 0xed, 0x45, 0xe8, 0x7c, 0xf9,
+ 0x33, 0xc0, 0x89, 0x86, 0xee, 0x01, 0x89, 0x86, 0xf0, 0x01, 0x89, 0x86,
+ 0xf2, 0x01, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x74, 0x0a, 0x8e, 0x46, 0x02,
+ 0x26, 0x81, 0x26, 0x04, 0x00, 0xff, 0xf7, 0xf7, 0x86, 0xf6, 0x00, 0x00,
+ 0x20, 0x74, 0x10, 0xbe, 0xf3, 0x45, 0xe8, 0x4f, 0xf9, 0xc6, 0x86, 0x5d,
+ 0x02, 0x00, 0xc6, 0x86, 0x5c, 0x02, 0x00, 0xc3, 0xc3, 0x90, 0xc6, 0x86,
+ 0x57, 0x02, 0x01, 0xc7, 0x86, 0xc4, 0x02, 0x00, 0x00, 0xc7, 0x86, 0xc6,
+ 0x02, 0x00, 0x00, 0xbe, 0xb1, 0x45, 0xe8, 0x2b, 0xf9, 0xe8, 0xbf, 0x12,
+ 0xc3, 0x90, 0xc6, 0x86, 0x5b, 0x02, 0x01, 0xf6, 0x86, 0x84, 0x02, 0x01,
+ 0x74, 0x08, 0xe8, 0xb0, 0x14, 0xc6, 0x86, 0x84, 0x02, 0x00, 0xbe, 0xb1,
+ 0x45, 0xe8, 0x0c, 0xf9, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x74, 0x04, 0xc6,
+ 0x46, 0x07, 0x0c, 0xc3, 0xbe, 0xb1, 0x45, 0xe8, 0xfa, 0xf8, 0xbe, 0xcf,
+ 0x45, 0xe8, 0xf4, 0xf8, 0xc7, 0x86, 0xb8, 0x02, 0x01, 0x00, 0xc7, 0x86,
+ 0xba, 0x02, 0x01, 0x00, 0xe8, 0xf6, 0x12, 0xc3, 0xc7, 0x86, 0xc2, 0x02,
+ 0x00, 0x00, 0xc7, 0x86, 0xc4, 0x01, 0x14, 0x00, 0xc6, 0x86, 0x08, 0x01,
+ 0x00, 0x81, 0xa6, 0x06, 0x02, 0xdf, 0xbf, 0xc6, 0x86, 0x60, 0x02, 0x01,
+ 0xc7, 0x86, 0x26, 0x02, 0xff, 0xff, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x20,
+ 0x75, 0x18, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x75, 0x10, 0xbe, 0xf3,
+ 0x45, 0xe8, 0xac, 0xf8, 0xc6, 0x86, 0x5d, 0x02, 0x00, 0xc6, 0x86, 0x5c,
+ 0x02, 0x00, 0xbe, 0xb1, 0x45, 0xe8, 0x4e, 0xf9, 0xb8, 0x00, 0x80, 0xe8,
+ 0xec, 0x2b, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x01, 0xe8,
+ 0x23, 0xfd, 0xe8, 0xd2, 0xfc, 0xc6, 0x86, 0x5e, 0x02, 0x01, 0xc6, 0x86,
+ 0xca, 0x01, 0x00, 0xf7, 0x86, 0xf6, 0x00, 0x04, 0x00, 0x74, 0x05, 0xc6,
+ 0x86, 0xca, 0x01, 0x01, 0xe8, 0x7c, 0xf3, 0xf6, 0x86, 0x54, 0x02, 0x01,
+ 0x75, 0x06, 0xbe, 0xbd, 0x45, 0xe8, 0x60, 0xf8, 0xff, 0x86, 0xfc, 0x00,
+ 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x10, 0x00, 0xfb, 0xc6,
+ 0x86, 0x08, 0x01, 0x00, 0xc6, 0x46, 0x09, 0x00, 0xc6, 0x46, 0x0b, 0x00,
+ 0xc6, 0x86, 0x54, 0x02, 0x00, 0xc6, 0x86, 0x68, 0x02, 0x00, 0xc6, 0x86,
+ 0x5e, 0x02, 0x00, 0xc6, 0x86, 0x60, 0x02, 0x00, 0xc6, 0x86, 0x5b, 0x02,
+ 0x00, 0xc6, 0x86, 0x63, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xc6,
+ 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6a, 0x02, 0x00, 0xe8, 0x54, 0xfa,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x00, 0x00, 0x20, 0xf6, 0x86, 0x6c,
+ 0x02, 0x01, 0x74, 0x02, 0xeb, 0x23, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a,
+ 0x56, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08,
+ 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0x26, 0x3c, 0xe8, 0xb9, 0xf9, 0xbe,
+ 0xc9, 0x45, 0xe8, 0xdf, 0xf7, 0xc3, 0xc7, 0x86, 0x2e, 0x02, 0x02, 0x00,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x10, 0x00, 0xfb, 0x8e, 0x46, 0x02,
+ 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x02, 0x00,
+ 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0xf3, 0x3b, 0xc6,
+ 0x86, 0x08, 0x01, 0x00, 0xc7, 0x86, 0x22, 0x01, 0x00, 0x00, 0xe8, 0x0e,
+ 0xfc, 0xe8, 0x32, 0xfc, 0xf7, 0x86, 0xf4, 0x00, 0x10, 0x00, 0x74, 0x14,
+ 0xf7, 0x86, 0xf4, 0x00, 0x02, 0x00, 0x74, 0x0c, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x0e, 0x02, 0x00, 0x00, 0x40, 0xeb, 0x0a, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x26, 0x02, 0x00, 0xff, 0xbf, 0xe8, 0x7d, 0xef, 0xe8, 0x6c, 0x2b,
+ 0xc6, 0x86, 0xad, 0x02, 0x00, 0x8d, 0xbe, 0x0a, 0x03, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xab, 0xab, 0xab, 0xf6, 0x86, 0xa6, 0x02, 0x01, 0x74, 0x04, 0xc6,
+ 0x46, 0x09, 0x1e, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x04, 0x00, 0xff,
+ 0xfb, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x02, 0x74, 0x10, 0xf7, 0x86, 0x20,
+ 0x01, 0x80, 0x00, 0x75, 0x08, 0xbe, 0x59, 0x46, 0xe8, 0x3d, 0xf7, 0xeb,
+ 0x0d, 0x8e, 0x46, 0x02, 0x33, 0xc0, 0x26, 0xa3, 0x24, 0x00, 0x26, 0xa3,
+ 0x26, 0x00, 0xc3, 0x90, 0x33, 0xc0, 0x88, 0x86, 0x5b, 0x02, 0x88, 0x86,
+ 0x5e, 0x02, 0x88, 0x86, 0x60, 0x02, 0x88, 0x86, 0x63, 0x02, 0x88, 0x86,
+ 0x68, 0x02, 0xbe, 0xff, 0x45, 0xe8, 0x10, 0xf7, 0xc6, 0x86, 0xad, 0x02,
+ 0x01, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0x26,
+ 0x83, 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01,
+ 0xe8, 0x2f, 0x3b, 0xc3, 0xc7, 0x86, 0x2e, 0x02, 0x03, 0x00, 0xe8, 0xe9,
+ 0xee, 0xc6, 0x86, 0x69, 0x02, 0x01, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xe8,
+ 0x1a, 0xf9, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x00, 0x00, 0x00, 0x1e,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x10, 0x00, 0x04, 0xbe, 0x17, 0x46,
+ 0xe8, 0xc1, 0xf6, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x04, 0x00, 0x32,
+ 0xfe, 0xe8, 0x2a, 0x05, 0xc3, 0x90, 0xc7, 0x86, 0x2e, 0x02, 0x04, 0x00,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0xc6, 0x86, 0x6b,
+ 0x02, 0x01, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x78, 0x02, 0x00,
+ 0xe8, 0xd1, 0xf8, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x10, 0x00, 0x04,
+ 0x00, 0x32, 0xc0, 0xe8, 0x42, 0x15, 0x33, 0xc0, 0x88, 0x86, 0x88, 0x02,
+ 0x88, 0x86, 0x89, 0x02, 0xc6, 0x86, 0x63, 0x01, 0x01, 0xc7, 0x86, 0x64,
+ 0x01, 0xf8, 0x05, 0xc6, 0x86, 0x69, 0x01, 0x02, 0xc6, 0x86, 0x68, 0x01,
+ 0x02, 0xc7, 0x86, 0x66, 0x01, 0x20, 0x03, 0x8e, 0x46, 0x02, 0x26, 0xc7,
+ 0x06, 0x1c, 0x00, 0x00, 0x00, 0xbe, 0xb7, 0x45, 0xe8, 0x4d, 0xf6, 0xbe,
+ 0x11, 0x46, 0xe8, 0x47, 0xf6, 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03,
+ 0xe8, 0xed, 0x0f, 0xc3, 0xc7, 0x86, 0x2e, 0x02, 0x05, 0x00, 0xc6, 0x86,
+ 0x69, 0x02, 0x01, 0xe8, 0x6e, 0xf8, 0xf6, 0x86, 0x6e, 0x02, 0x01, 0x75,
+ 0x04, 0xc6, 0x46, 0x09, 0x16, 0xc6, 0x86, 0x72, 0x02, 0x01, 0xbe, 0x35,
+ 0x46, 0xe8, 0x18, 0xf6, 0xbe, 0x3b, 0x46, 0xe8, 0x12, 0xf6, 0xbe, 0x23,
+ 0x46, 0xe8, 0x0c, 0xf6, 0xbe, 0x4d, 0x46, 0xe8, 0x06, 0xf6, 0xc7, 0x86,
+ 0xcc, 0x02, 0x01, 0x00, 0xc6, 0x86, 0x76, 0x02, 0x01, 0xe8, 0x7e, 0x12,
+ 0xc3, 0x90, 0xc7, 0x86, 0x2e, 0x02, 0x07, 0x00, 0xc6, 0x86, 0x68, 0x02,
+ 0x01, 0xc6, 0x86, 0x5c, 0x02, 0x00, 0xc6, 0x86, 0x5d, 0x02, 0x00, 0xbe,
+ 0xf3, 0x45, 0xe8, 0xdb, 0xf5, 0xf6, 0x86, 0x6e, 0x02, 0x01, 0x75, 0x0d,
+ 0xc6, 0x86, 0x6e, 0x02, 0x01, 0xb8, 0x00, 0x80, 0xe8, 0x1f, 0x29, 0xeb,
+ 0x0a, 0x83, 0xa6, 0x06, 0x02, 0xdf, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc6,
+ 0x86, 0x08, 0x01, 0x00, 0xe8, 0x4e, 0xfa, 0xe8, 0xfd, 0xf9, 0xf6, 0x06,
+ 0x8a, 0x56, 0x01, 0x74, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x04,
+ 0x00, 0xff, 0xf7, 0xe8, 0xc7, 0xf9, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e,
+ 0x0c, 0x00, 0x01, 0xe8, 0xa1, 0xf0, 0xc7, 0x86, 0xc4, 0x01, 0x14, 0x00,
+ 0xc7, 0x86, 0xc2, 0x02, 0x00, 0x00, 0xbe, 0xf9, 0x45, 0xe8, 0x80, 0xf5,
+ 0xc3, 0x90, 0xc7, 0x86, 0x32, 0x02, 0x01, 0x00, 0xc7, 0x86, 0xc2, 0x01,
+ 0xff, 0xff, 0xc7, 0x86, 0xc2, 0x02, 0x00, 0x00, 0xc7, 0x86, 0xc4, 0x01,
+ 0x14, 0x00, 0x80, 0x7e, 0x07, 0x10, 0x74, 0x44, 0x32, 0xc0, 0xe8, 0x1b,
+ 0x14, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x02, 0xeb, 0x37, 0x8e, 0x46, 0x02,
+ 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x01, 0x83, 0xa6, 0x06, 0x02, 0xdf, 0xc6,
+ 0x86, 0x85, 0x02, 0x01, 0xf6, 0x86, 0x5b, 0x02, 0x01, 0x74, 0x1d, 0xf6,
+ 0x86, 0x66, 0x02, 0x01, 0x74, 0x16, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x75,
+ 0x0f, 0xc6, 0x86, 0x63, 0x02, 0x01, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x75,
+ 0x03, 0xe8, 0x88, 0x0e, 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26,
+ 0x0c, 0x00, 0xfe, 0xc7, 0x86, 0x32, 0x02, 0x02, 0x00, 0xc6, 0x86, 0x69,
+ 0x02, 0x01, 0xe8, 0x43, 0xf7, 0xe8, 0x12, 0xf9, 0xbe, 0xd5, 0x45, 0xe8,
+ 0xfa, 0xf4, 0xe8, 0x1e, 0x0e, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26,
+ 0x0c, 0x00, 0xfe, 0xc7, 0x86, 0x32, 0x02, 0x03, 0x00, 0xc7, 0x86, 0xc2,
+ 0x02, 0x00, 0x00, 0xc7, 0x86, 0xc4, 0x01, 0x0a, 0x00, 0xf6, 0x86, 0x54,
+ 0x02, 0x01, 0x74, 0x0f, 0xc6, 0x86, 0x54, 0x02, 0x00, 0x8e, 0x46, 0x02,
+ 0x26, 0x81, 0x26, 0x24, 0x00, 0xff, 0x7f, 0xc6, 0x86, 0x5a, 0x02, 0x00,
+ 0xc6, 0x86, 0x69, 0x02, 0x01, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xe8, 0xf3,
+ 0xf6, 0x81, 0xa6, 0x06, 0x02, 0xff, 0x2f, 0x83, 0x8e, 0x06, 0x02, 0x20,
+ 0xc6, 0x86, 0x85, 0x02, 0x01, 0xbe, 0x9f, 0x45, 0xe8, 0x9d, 0xf4, 0xbe,
+ 0xc3, 0x45, 0xe8, 0x97, 0xf4, 0xc7, 0x86, 0xb2, 0x02, 0x01, 0x00, 0xc7,
+ 0x86, 0xb4, 0x02, 0x01, 0x00, 0xe8, 0x5e, 0x0d, 0xc3, 0x90, 0xff, 0x86,
+ 0x44, 0x02, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0x8e,
+ 0x46, 0x02, 0x26, 0x83, 0x0e, 0x10, 0x00, 0x04, 0xf6, 0x86, 0x5f, 0x02,
+ 0x01, 0x75, 0x03, 0xe8, 0x04, 0x0d, 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x26, 0x0c, 0x00, 0xfe, 0x80, 0xbe, 0xa6, 0x02, 0x01, 0x75, 0x26,
+ 0xc6, 0x86, 0x68, 0x02, 0x00, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86,
+ 0x6b, 0x02, 0x00, 0xe8, 0x82, 0xf6, 0xe8, 0x13, 0xf6, 0xbe, 0xc9, 0x45,
+ 0xe8, 0x39, 0xf4, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x10, 0x00, 0xfb,
+ 0xeb, 0x60, 0xc6, 0x86, 0x6d, 0x02, 0x01, 0xf6, 0x86, 0x6c, 0x02, 0x01,
+ 0x75, 0x54, 0xe8, 0xf3, 0xf5, 0xe8, 0xfb, 0xec, 0xc6, 0x86, 0x68, 0x02,
+ 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xbe, 0xc9, 0x45, 0xe8, 0x0c, 0xf4,
+ 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0x26, 0x83,
+ 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8,
+ 0x30, 0x38, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x10, 0x00, 0x04, 0x00,
+ 0x33, 0xc0, 0x88, 0x86, 0x88, 0x02, 0x88, 0x86, 0x89, 0x02, 0xc6, 0x86,
+ 0x63, 0x01, 0x01, 0xc7, 0x86, 0x64, 0x01, 0xf8, 0x05, 0xc6, 0x86, 0x69,
+ 0x01, 0x02, 0xc3, 0x90, 0xff, 0x86, 0x44, 0x02, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x26, 0x0c, 0x00, 0xfe, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x10,
+ 0x00, 0x04, 0xc7, 0x86, 0xae, 0x02, 0x02, 0x00, 0xc7, 0x86, 0xb0, 0x02,
+ 0x08, 0x00, 0xc6, 0x86, 0x54, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x26, 0x24, 0x00, 0xff, 0x7f, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86,
+ 0x6b, 0x02, 0x00, 0xe8, 0xce, 0xf5, 0xf6, 0x86, 0x81, 0x02, 0x01, 0x75,
+ 0x06, 0xbe, 0x93, 0x45, 0xe8, 0x81, 0xf3, 0x81, 0xa6, 0x06, 0x02, 0xff,
+ 0x6f, 0x81, 0x8e, 0x06, 0x02, 0x00, 0x40, 0xc6, 0x86, 0x85, 0x02, 0x01,
+ 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0x83,
+ 0xbe, 0xc6, 0x01, 0x00, 0x74, 0x0d, 0x8b, 0x86, 0xc6, 0x01, 0xc7, 0x86,
+ 0xc6, 0x01, 0x00, 0x00, 0xe8, 0x45, 0x0f, 0xbe, 0x9f, 0x45, 0xe8, 0x4b,
+ 0xf3, 0xc3, 0xc7, 0x86, 0x32, 0x02, 0x01, 0x00, 0xc7, 0x86, 0x30, 0x02,
+ 0x02, 0x00, 0x32, 0xc0, 0xe8, 0xf9, 0x11, 0x80, 0x7e, 0x06, 0x48, 0x75,
+ 0x09, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x01, 0xc3, 0x90,
+ 0xc7, 0x86, 0x30, 0x02, 0x03, 0x00, 0xff, 0x86, 0x44, 0x02, 0x8e, 0x46,
+ 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0xc6, 0x86, 0x68, 0x02, 0x00,
+ 0xc6, 0x86, 0x72, 0x02, 0x00, 0xbe, 0x1d, 0x46, 0xe8, 0x05, 0xf3, 0xbe,
+ 0x29, 0x46, 0xe8, 0xff, 0xf2, 0xbe, 0x41, 0x46, 0xe8, 0xf9, 0xf2, 0xc6,
+ 0x86, 0x6b, 0x02, 0x01, 0xe8, 0x31, 0xf5, 0x81, 0x8e, 0x06, 0x02, 0x04,
+ 0x50, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xf6, 0x86, 0x61, 0x02, 0x01, 0x74,
+ 0x06, 0x81, 0x8e, 0x06, 0x02, 0x00, 0x80, 0xe8, 0x80, 0x2d, 0xe8, 0x71,
+ 0x0b, 0xc3, 0xc7, 0x86, 0x30, 0x02, 0x04, 0x00, 0xbe, 0x1d, 0x46, 0xe8,
+ 0xc6, 0xf2, 0xbe, 0x29, 0x46, 0xe8, 0xc0, 0xf2, 0x81, 0xa6, 0x06, 0x02,
+ 0xfb, 0x6f, 0x81, 0x8e, 0x06, 0x02, 0x00, 0x40, 0xc6, 0x86, 0x85, 0x02,
+ 0x01, 0xc3, 0xc7, 0x86, 0x30, 0x02, 0x05, 0x00, 0x8e, 0x46, 0x02, 0xf6,
+ 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x02, 0x00, 0xfd,
+ 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0xcc, 0x36, 0x81, 0xa6,
+ 0x06, 0x02, 0xfb, 0x2f, 0x83, 0x8e, 0x06, 0x02, 0x20, 0xc6, 0x86, 0x85,
+ 0x02, 0x01, 0xe8, 0xef, 0x00, 0xc3, 0xc7, 0x86, 0x30, 0x02, 0x01, 0x00,
+ 0xc3, 0x90, 0xc3, 0x53, 0x50, 0x89, 0x86, 0x22, 0x01, 0x80, 0xbe, 0x62,
+ 0x01, 0x01, 0x75, 0x0f, 0x50, 0xe8, 0x62, 0xea, 0xe8, 0x5f, 0x24, 0xc6,
+ 0x46, 0x07, 0x00, 0x58, 0xe9, 0x9d, 0x00, 0xf6, 0x86, 0x08, 0x01, 0x01,
+ 0x74, 0x05, 0xe8, 0xa1, 0x25, 0xeb, 0x57, 0x83, 0xf8, 0x10, 0x75, 0x08,
+ 0x81, 0x8e, 0x1e, 0x01, 0x00, 0x80, 0xeb, 0x4a, 0x83, 0x8e, 0x1e, 0x01,
+ 0x02, 0x8b, 0x9e, 0x06, 0x02, 0x83, 0xf8, 0x01, 0x75, 0x04, 0x81, 0xcb,
+ 0x00, 0x04, 0x83, 0xf8, 0x0c, 0x75, 0x04, 0x81, 0xcb, 0x00, 0x08, 0x83,
+ 0xf8, 0x0b, 0x75, 0x03, 0x83, 0xcb, 0x02, 0x83, 0xf8, 0x09, 0x75, 0x03,
+ 0x83, 0xcb, 0x04, 0x83, 0xf8, 0x0a, 0x75, 0x04, 0x81, 0xcb, 0x00, 0x01,
+ 0x83, 0xf8, 0x06, 0x75, 0x03, 0x83, 0xcb, 0x01, 0x83, 0xf8, 0x0f, 0x74,
+ 0x09, 0x89, 0x9e, 0x06, 0x02, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc6, 0x46,
+ 0x07, 0x12, 0xc6, 0x46, 0x09, 0x1e, 0xf6, 0x86, 0xa7, 0x02, 0x01, 0x74,
+ 0x1a, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0x26,
+ 0x83, 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01,
+ 0xe8, 0x07, 0x36, 0xf6, 0x86, 0xa5, 0x02, 0x01, 0x75, 0x02, 0xeb, 0x08,
+ 0xc6, 0x46, 0x07, 0x10, 0xc6, 0x46, 0x09, 0x00, 0x58, 0x5b, 0xc3, 0x90,
+ 0xc7, 0x86, 0x2e, 0x02, 0x01, 0x00, 0xc3, 0xb9, 0x01, 0x01, 0x38, 0xc8,
+ 0x75, 0x19, 0x8b, 0xb6, 0xf6, 0x00, 0x81, 0xe6, 0x00, 0xc0, 0x81, 0xfe,
+ 0x00, 0x80, 0x75, 0x0b, 0xc6, 0x86, 0x56, 0x02, 0x01, 0xbe, 0xa5, 0x45,
+ 0xe8, 0x8d, 0xf1, 0xc3, 0xc3, 0x90, 0x50, 0xf7, 0x86, 0xf6, 0x00, 0x00,
+ 0x02, 0x74, 0x06, 0x81, 0x8e, 0xf6, 0x00, 0x00, 0x01, 0xc6, 0x86, 0x90,
+ 0x02, 0x01, 0xe8, 0xb3, 0xf3, 0xe8, 0x02, 0x00, 0x58, 0xc3, 0xc7, 0x86,
+ 0x93, 0x02, 0x00, 0x00, 0xc7, 0x86, 0x95, 0x02, 0x05, 0x00, 0xb8, 0x05,
+ 0x00, 0xe8, 0x1a, 0x00, 0xc7, 0x86, 0x9d, 0x02, 0x05, 0x00, 0xc3, 0x90,
+ 0xc6, 0x86, 0x90, 0x02, 0x00, 0x06, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26,
+ 0x00, 0x00, 0xdf, 0x07, 0xc3, 0x90, 0x52, 0x53, 0x51, 0xb9, 0x10, 0x27,
+ 0x83, 0xe0, 0x3f, 0x8b, 0xd0, 0xe5, 0x00, 0x50, 0x8b, 0x1e, 0x34, 0x55,
+ 0x53, 0xb8, 0xe7, 0x03, 0xf7, 0xe2, 0xf7, 0xf1, 0x5b, 0x03, 0xd8, 0x58,
+ 0x03, 0xc2, 0x3b, 0xc1, 0x72, 0x03, 0x2b, 0xc1, 0x43, 0x8b, 0xcb, 0x41,
+ 0x89, 0x9e, 0x97, 0x02, 0x89, 0x8e, 0x99, 0x02, 0x89, 0x86, 0x9b, 0x02,
+ 0x59, 0x5b, 0x5a, 0xc3, 0xa1, 0x34, 0x55, 0x3b, 0x86, 0x99, 0x02, 0x74,
+ 0x0e, 0x3b, 0x86, 0x97, 0x02, 0x75, 0x0d, 0xe5, 0x00, 0x3b, 0x86, 0x9b,
+ 0x02, 0x72, 0x05, 0xb8, 0x01, 0x00, 0xeb, 0x02, 0x2b, 0xc0, 0x85, 0xc0,
+ 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x04, 0x74, 0x0a, 0xf7, 0x86, 0xf6, 0x00,
+ 0x00, 0x02, 0x75, 0x02, 0xeb, 0x05, 0xb8, 0x01, 0x00, 0xeb, 0x02, 0x2b,
+ 0xc0, 0x85, 0xc0, 0xc3, 0xe8, 0xc1, 0xff, 0x74, 0x1e, 0xb8, 0x02, 0x00,
+ 0xe8, 0x7f, 0xff, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x14, 0x00, 0x25, 0x24,
+ 0x01, 0x8b, 0xd8, 0x33, 0x86, 0x93, 0x02, 0x75, 0x0a, 0xff, 0x8e, 0x9d,
+ 0x02, 0x74, 0x02, 0xeb, 0x77, 0xeb, 0x23, 0xc7, 0x86, 0x9d, 0x02, 0x05,
+ 0x00, 0x89, 0x9e, 0x93, 0x02, 0xa9, 0x04, 0x00, 0x74, 0x12, 0xf7, 0xc3,
+ 0x04, 0x00, 0x74, 0x07, 0xc6, 0x86, 0x91, 0x02, 0x01, 0xeb, 0x05, 0xc6,
+ 0x86, 0x91, 0x02, 0x00, 0xeb, 0x52, 0x8b, 0x86, 0x93, 0x02, 0x8e, 0x46,
+ 0x02, 0x26, 0xf7, 0x06, 0x00, 0x00, 0x02, 0x00, 0x74, 0x24, 0x25, 0x04,
+ 0x01, 0x3d, 0x04, 0x01, 0x75, 0x3a, 0xe8, 0x81, 0xff, 0x74, 0x2c, 0x81,
+ 0x8e, 0xf6, 0x00, 0x00, 0x01, 0xe8, 0x9c, 0xf2, 0xc7, 0x86, 0x93, 0x02,
+ 0x00, 0x00, 0xb8, 0x05, 0x00, 0xe8, 0x0e, 0xff, 0xeb, 0x1e, 0x25, 0x24,
+ 0x01, 0x3d, 0x24, 0x01, 0x75, 0x16, 0xe8, 0x5d, 0xff, 0x74, 0x08, 0x81,
+ 0xa6, 0xf6, 0x00, 0xff, 0xfe, 0xeb, 0xda, 0xe8, 0xe2, 0xfe, 0xb8, 0x0e,
+ 0x00, 0xe8, 0xbf, 0xfd, 0xc3, 0x90, 0x55, 0x1e, 0x06, 0x33, 0xed, 0x8e,
+ 0xdd, 0x8b, 0x2e, 0x52, 0x55, 0x8e, 0x46, 0x02, 0xeb, 0x00, 0x60, 0xfa,
+ 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x04, 0x00, 0x89, 0x86, 0x18, 0x01, 0xc7,
+ 0x86, 0x1c, 0x01, 0x01, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x06, 0x00,
+ 0x89, 0x86, 0x1a, 0x01, 0xb8, 0x07, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xa3,
+ 0x06, 0x00, 0xb8, 0xff, 0xff, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x04, 0x00,
+ 0xfb, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x08, 0x00, 0x8b, 0xd8, 0x81, 0xe3,
+ 0xff, 0xfc, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x08, 0x00, 0x8e, 0x46,
+ 0x02, 0x26, 0x8b, 0x1e, 0x0a, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e,
+ 0x0a, 0x00, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58, 0xa9, 0x00, 0x08, 0x74,
+ 0x0f, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x74, 0x05, 0xe8, 0x79, 0x32, 0xeb,
+ 0x03, 0xe8, 0xb4, 0x2d, 0xa9, 0x00, 0x01, 0x75, 0x20, 0xf7, 0x86, 0xa3,
+ 0x02, 0x01, 0x00, 0x75, 0x1f, 0xa9, 0xcd, 0x01, 0x74, 0x1a, 0x80, 0xbe,
+ 0x6a, 0x01, 0x0a, 0x72, 0x0c, 0xc7, 0x86, 0xa3, 0x02, 0x01, 0x00, 0x81,
+ 0x8e, 0x18, 0x01, 0xcd, 0x00, 0xfe, 0x86, 0x6a, 0x01, 0xe8, 0xfc, 0x2e,
+ 0xa9, 0x00, 0x04, 0x74, 0x29, 0xf7, 0x86, 0x0a, 0x01, 0x01, 0x00, 0x75,
+ 0x21, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x04, 0x00, 0x00, 0x04, 0xe8,
+ 0x66, 0xed, 0xc7, 0x44, 0x02, 0x01, 0x00, 0x89, 0x44, 0x04, 0xc7, 0x86,
+ 0x0a, 0x01, 0x01, 0x00, 0x8d, 0x7e, 0x16, 0xe8, 0x70, 0xed, 0xa9, 0x00,
+ 0x10, 0x74, 0x27, 0x80, 0xbe, 0x0c, 0x01, 0x01, 0x74, 0x20, 0xf6, 0x86,
+ 0xb8, 0x01, 0x01, 0x75, 0x19, 0xe8, 0x3c, 0xed, 0xf7, 0xc6, 0xff, 0xff,
+ 0x74, 0x10, 0xc7, 0x44, 0x02, 0x03, 0x00, 0xc6, 0x86, 0xb8, 0x01, 0x01,
+ 0x8d, 0x7e, 0x16, 0xe8, 0x44, 0xed, 0xa9, 0x00, 0x20, 0x74, 0x2e, 0x80,
+ 0xbe, 0x0c, 0x01, 0x01, 0x75, 0x07, 0xc6, 0x86, 0x0d, 0x01, 0x01, 0xeb,
+ 0x20, 0xf6, 0x86, 0xb9, 0x01, 0x01, 0x75, 0x19, 0xe8, 0x09, 0xed, 0xf7,
+ 0xc6, 0xff, 0xff, 0x74, 0x10, 0xc7, 0x44, 0x02, 0x04, 0x00, 0xc6, 0x86,
+ 0xb9, 0x01, 0x01, 0x8d, 0x7e, 0x16, 0xe8, 0x11, 0xed, 0xfa, 0x8b, 0x86,
+ 0x18, 0x01, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x04, 0x00, 0xc7, 0x86, 0x1c,
+ 0x01, 0x00, 0x00, 0x8b, 0x86, 0x1a, 0x01, 0x8e, 0x46, 0x02, 0x26, 0xa3,
+ 0x06, 0x00, 0x61, 0x07, 0x1f, 0x5d, 0xcf, 0x50, 0x25, 0x00, 0x02, 0x8e,
+ 0x46, 0x02, 0x26, 0xa3, 0x08, 0x00, 0x8b, 0x86, 0xc2, 0x02, 0x40, 0x89,
+ 0x86, 0xc2, 0x02, 0x83, 0xf8, 0x01, 0x75, 0x08, 0x56, 0xbe, 0xf9, 0x45,
+ 0xe8, 0xb1, 0xee, 0x5e, 0x3b, 0x86, 0xc4, 0x01, 0x76, 0x0a, 0x80, 0xbe,
+ 0x61, 0x02, 0x01, 0x74, 0x03, 0xe8, 0x04, 0x2f, 0x58, 0xc3, 0x8d, 0x71,
+ 0x18, 0x8b, 0x49, 0x14, 0x86, 0xcd, 0x83, 0xe9, 0x04, 0x7e, 0x1b, 0x33,
+ 0xc0, 0x03, 0xf0, 0x8a, 0x04, 0x0a, 0xc0, 0x74, 0x11, 0x3a, 0x54, 0x01,
+ 0x74, 0x17, 0x32, 0xe4, 0x3c, 0xff, 0x74, 0x0a, 0x2b, 0xc8, 0x72, 0x02,
+ 0x77, 0xe7, 0x33, 0xc0, 0xf9, 0xc3, 0x8b, 0x44, 0x02, 0x86, 0xc4, 0xeb,
+ 0xef, 0x0a, 0xe4, 0x75, 0xf1, 0x38, 0xf0, 0x75, 0xed, 0x8d, 0x74, 0x02,
+ 0xf8, 0xc3, 0x8c, 0xd8, 0x8e, 0xc0, 0x8b, 0xb6, 0x52, 0x15, 0x8b, 0xbe,
+ 0x54, 0x15, 0x47, 0xa5, 0xa5, 0xa5, 0x8b, 0x4f, 0x04, 0x83, 0xc1, 0x07,
+ 0x80, 0xe1, 0xfe, 0x8b, 0xc7, 0x2b, 0xc3, 0x2b, 0xc8, 0x76, 0x0a, 0x81,
+ 0xf9, 0x00, 0x01, 0x73, 0x09, 0xd1, 0xe9, 0xf3, 0xa5, 0x8b, 0x07, 0xe9,
+ 0xc9, 0x01, 0xb9, 0x19, 0x00, 0xf3, 0xa5, 0x33, 0xff, 0xf6, 0x47, 0x0e,
+ 0x80, 0x74, 0x0e, 0x8b, 0x47, 0x14, 0x83, 0xe0, 0x1f, 0x74, 0x0f, 0xa8,
+ 0x01, 0x75, 0x0b, 0x8b, 0xf8, 0xba, 0x80, 0x09, 0x68, 0x5d, 0x24, 0xe9,
+ 0xde, 0x05, 0xe9, 0xcc, 0x02, 0xc3, 0x80, 0x7f, 0x17, 0x02, 0x75, 0xf9,
+ 0x50, 0x56, 0x8b, 0xb6, 0xc4, 0x05, 0x8b, 0x04, 0x5e, 0x3b, 0x86, 0xc2,
+ 0x01, 0x74, 0x07, 0x89, 0x86, 0xc2, 0x01, 0x58, 0xeb, 0x3d, 0x58, 0xeb,
+ 0x12, 0x8a, 0x4f, 0x07, 0x80, 0xe1, 0x3f, 0x74, 0xd8, 0x8a, 0xe9, 0x86,
+ 0x8e, 0xfa, 0x01, 0x38, 0xcd, 0x75, 0x18, 0x57, 0x51, 0x8d, 0xbe, 0xfc,
+ 0x01, 0x8d, 0x77, 0x0e, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3,
+ 0xa7, 0x75, 0x06, 0x59, 0x5f, 0xeb, 0xb6, 0x57, 0x51, 0x8d, 0xbe, 0xfc,
+ 0x01, 0x8d, 0x77, 0x0e, 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0x59, 0x5f, 0xeb,
+ 0x0d, 0x8b, 0x7e, 0x04, 0x58, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x01, 0x00,
+ 0x74, 0xf7, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x08, 0x80, 0x7e, 0x06, 0x48,
+ 0x74, 0x02, 0xeb, 0xe9, 0x50, 0x8c, 0xd8, 0x8e, 0xc0, 0x8b, 0x07, 0xa9,
+ 0x00, 0x40, 0x75, 0xdc, 0x0d, 0x00, 0x40, 0x89, 0x07, 0xe8, 0x8a, 0x00,
+ 0x8b, 0x4f, 0x04, 0x83, 0xc1, 0x03, 0x80, 0xe1, 0xfe, 0x89, 0x7e, 0x04,
+ 0x8b, 0xbe, 0xbe, 0x01, 0x3b, 0xfe, 0x72, 0x11, 0x8d, 0x86, 0x52, 0x08,
+ 0x05, 0xff, 0x00, 0x2b, 0xc7, 0x3b, 0xc1, 0x7d, 0x0a, 0x8d, 0xbe, 0x52,
+ 0x08, 0x2b, 0xf7, 0x3b, 0xf1, 0x7c, 0xa6, 0x8b, 0xd7, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0x33, 0xc0, 0x8b, 0xf3, 0xd1, 0xe9, 0x83, 0xc7, 0x02, 0x49, 0xad,
+ 0xf3, 0xa5, 0x8b, 0xcf, 0xc7, 0x05, 0x00, 0x00, 0x8b, 0xfa, 0x89, 0x4d,
+ 0x02, 0x51, 0x8b, 0x4d, 0x04, 0x83, 0xe9, 0x04, 0x89, 0x4d, 0x04, 0x59,
+ 0x89, 0x05, 0x8d, 0x86, 0x52, 0x08, 0x3b, 0xf8, 0x75, 0x0e, 0x8b, 0x86,
+ 0xbc, 0x01, 0x3b, 0x86, 0xbe, 0x01, 0x75, 0x1c, 0x89, 0xbe, 0xbc, 0x01,
+ 0x89, 0x8e, 0xbe, 0x01, 0x8b, 0x7e, 0x04, 0xc7, 0x86, 0xc0, 0x01, 0x00,
+ 0x00, 0xb9, 0x40, 0x60, 0x8e, 0xc1, 0xe8, 0x77, 0x21, 0xe9, 0x4d, 0xff,
+ 0x97, 0x89, 0x45, 0x02, 0xeb, 0xe2, 0x8b, 0xb6, 0xbc, 0x01, 0xf7, 0x86,
+ 0xc0, 0x01, 0x01, 0x00, 0x75, 0x0f, 0x81, 0x3c, 0x00, 0x80, 0x75, 0x05,
+ 0x8b, 0x74, 0x02, 0xeb, 0xf5, 0x89, 0xb6, 0xbc, 0x01, 0xc3, 0xf7, 0x07,
+ 0x01, 0x09, 0x74, 0x03, 0xe9, 0x92, 0x01, 0xf7, 0x07, 0x00, 0x10, 0x75,
+ 0x33, 0x68, 0x3e, 0x23, 0xe9, 0xeb, 0x24, 0xa8, 0x02, 0x74, 0x21, 0x80,
+ 0x7e, 0x08, 0x00, 0x75, 0x1b, 0x80, 0xbe, 0x5e, 0x02, 0x00, 0x74, 0x14,
+ 0x24, 0x28, 0x3c, 0x28, 0x75, 0x0e, 0xf6, 0x47, 0x0e, 0x80, 0x75, 0x67,
+ 0x81, 0x8e, 0xda, 0x02, 0x80, 0x00, 0xeb, 0x5f, 0xeb, 0x5d, 0xe9, 0x39,
+ 0xfe, 0x90, 0xeb, 0xd3, 0xeb, 0x38, 0x8b, 0x47, 0x14, 0x83, 0xe0, 0x1f,
+ 0x74, 0x06, 0xa8, 0x01, 0x8b, 0xf8, 0x74, 0x4f, 0xe9, 0x46, 0x01, 0x50,
+ 0x8b, 0x9e, 0xb2, 0x01, 0x8b, 0x07, 0xa9, 0x00, 0x20, 0x74, 0x0b, 0xff,
+ 0x86, 0x3c, 0x02, 0x8b, 0x4f, 0x04, 0x01, 0x8e, 0x3e, 0x02, 0xe8, 0xb4,
+ 0x03, 0x75, 0xcb, 0xf6, 0x47, 0x07, 0x40, 0x74, 0x05, 0xe8, 0xd1, 0x03,
+ 0xeb, 0x78, 0xf7, 0x86, 0xb6, 0x01, 0x00, 0x02, 0x75, 0x11, 0xa9, 0x01,
+ 0x09, 0x75, 0x6b, 0x80, 0x7e, 0x07, 0x10, 0x74, 0x65, 0x80, 0x7e, 0x07,
+ 0x12, 0x74, 0x5f, 0xa8, 0x28, 0x75, 0xa7, 0x33, 0xff, 0xf6, 0x47, 0x0e,
+ 0x80, 0x75, 0xa3, 0x8b, 0x47, 0x04, 0x83, 0xf8, 0x12, 0x77, 0x05, 0x33,
+ 0xc0, 0xe9, 0xb0, 0x01, 0x83, 0xe8, 0x12, 0x2b, 0xc7, 0x83, 0xf8, 0x04,
+ 0x7c, 0x40, 0x8b, 0x49, 0x16, 0x88, 0xae, 0x04, 0x02, 0x51, 0x80, 0xe1,
+ 0xf0, 0x80, 0xf9, 0x00, 0x74, 0x09, 0x80, 0xf9, 0x30, 0x74, 0x04, 0x59,
+ 0xe9, 0xca, 0x00, 0x59, 0x0b, 0xff, 0x74, 0x0f, 0xf6, 0xc1, 0x0f, 0x74,
+ 0x19, 0x80, 0xf9, 0x33, 0x74, 0x14, 0x80, 0xf9, 0x03, 0x74, 0x0f, 0x86,
+ 0xc4, 0x39, 0x41, 0x14, 0x86, 0xc4, 0x75, 0x02, 0xeb, 0x0c, 0xe9, 0x66,
+ 0x01, 0x90, 0xe9, 0xa4, 0x00, 0x90, 0xe9, 0x63, 0x01, 0x90, 0xf6, 0x86,
+ 0x90, 0x02, 0x01, 0x74, 0x11, 0xe8, 0x7c, 0xfa, 0x80, 0x7e, 0x06, 0x04,
+ 0x75, 0x08, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xe8, 0x02, 0xee, 0xf6, 0x86,
+ 0x92, 0x02, 0x01, 0x74, 0x20, 0xc6, 0x86, 0x92, 0x02, 0x00, 0x50, 0x8b,
+ 0x86, 0xf8, 0x00, 0x33, 0x86, 0xf6, 0x00, 0xa9, 0x00, 0x01, 0x58, 0x74,
+ 0x0c, 0xb8, 0x0e, 0x00, 0xe8, 0x30, 0xf9, 0xeb, 0x64, 0x90, 0xe9, 0x2f,
+ 0x01, 0x80, 0xfd, 0x15, 0x77, 0x11, 0x80, 0xfd, 0x01, 0x74, 0xf3, 0x80,
+ 0xfd, 0x09, 0x74, 0xee, 0x80, 0xfd, 0x0a, 0x74, 0xe9, 0xeb, 0x11, 0x80,
+ 0xfd, 0x20, 0x72, 0xe2, 0x80, 0xfd, 0x29, 0x77, 0xdd, 0x80, 0xfd, 0x21,
+ 0x74, 0xd8, 0xeb, 0x92, 0x80, 0xfd, 0x10, 0x76, 0x02, 0xeb, 0x0a, 0x80,
+ 0xfd, 0x0e, 0x73, 0x28, 0x80, 0xfd, 0x15, 0x77, 0x23, 0x53, 0x8b, 0xd9,
+ 0xc1, 0xeb, 0x08, 0x80, 0xe1, 0x0f, 0x3a, 0x8f, 0x76, 0x04, 0x74, 0x13,
+ 0x83, 0xfb, 0x0b, 0x74, 0x09, 0x83, 0xfb, 0x0c, 0x74, 0x04, 0x5b, 0xe9,
+ 0xd3, 0x00, 0x80, 0xf9, 0x08, 0x75, 0xf7, 0x5b, 0xe9, 0x81, 0x01, 0x5b,
+ 0x5f, 0x8b, 0x9e, 0xb2, 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x01, 0x00, 0x74,
+ 0x28, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x48, 0x75,
+ 0x1c, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x08, 0x74, 0x06, 0x68, 0x91, 0x24,
+ 0xe9, 0x2e, 0xfd, 0xf7, 0x86, 0x12, 0x01, 0x80, 0x00, 0x74, 0x06, 0x68,
+ 0x91, 0x24, 0xe9, 0x01, 0xfd, 0x8b, 0x5f, 0x02, 0x89, 0x9e, 0xb2, 0x01,
+ 0x8b, 0xc3, 0x83, 0xe8, 0x02, 0x3b, 0x86, 0x52, 0x15, 0x77, 0x04, 0x8b,
+ 0x86, 0x54, 0x15, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x38, 0x00, 0x80, 0xbe,
+ 0x2d, 0x01, 0x01, 0x75, 0x1b, 0x2d, 0x00, 0x02, 0x3b, 0x86, 0x52, 0x15,
+ 0x73, 0x0e, 0x53, 0x8b, 0xd8, 0x2b, 0x9e, 0x52, 0x15, 0x8b, 0x86, 0x54,
+ 0x15, 0x2b, 0xc3, 0x5b, 0x26, 0xa3, 0x6c, 0x00, 0xfa, 0x8b, 0x07, 0xa9,
+ 0x00, 0x80, 0x74, 0x17, 0xfb, 0xff, 0x86, 0x3c, 0x01, 0x83, 0xbe, 0x3c,
+ 0x01, 0x05, 0x77, 0x1c, 0x8a, 0x4e, 0x09, 0x3a, 0x4e, 0x08, 0x75, 0x14,
+ 0xe9, 0x2f, 0xfe, 0xc6, 0x86, 0xb9, 0x01, 0x00, 0xfb, 0xc7, 0x86, 0x3c,
+ 0x01, 0x00, 0x00, 0x58, 0xc3, 0xe9, 0x5d, 0xff, 0xe8, 0x95, 0xe8, 0xf7,
+ 0xc6, 0xff, 0xff, 0x74, 0xe6, 0xc7, 0x44, 0x02, 0x04, 0x00, 0xc6, 0x86,
+ 0xb9, 0x01, 0x01, 0x8d, 0x7e, 0x16, 0xe8, 0x9d, 0xe8, 0xeb, 0xda, 0xba,
+ 0x80, 0x02, 0xeb, 0x1d, 0xba, 0x80, 0x01, 0xeb, 0x18, 0xba, 0x80, 0x04,
+ 0xeb, 0x13, 0x5f, 0x5b, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x10, 0x74, 0x06,
+ 0x68, 0x91, 0x24, 0xe9, 0xb8, 0xfc, 0xba, 0x80, 0x03, 0x33, 0xc0, 0x8e,
+ 0xc0, 0x68, 0x5d, 0x24, 0xe9, 0x25, 0x02, 0x33, 0xd2, 0x32, 0xed, 0x8a,
+ 0x4d, 0xff, 0x89, 0x55, 0x02, 0x83, 0xc7, 0x05, 0xe2, 0xf8, 0xf6, 0x86,
+ 0x5f, 0x02, 0x01, 0x74, 0x38, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x0b, 0xc6,
+ 0x46, 0x09, 0x04, 0xc6, 0x86, 0x5f, 0x02, 0x00, 0xeb, 0x24, 0x80, 0x7e,
+ 0x08, 0x06, 0x75, 0x21, 0xc6, 0x86, 0x5f, 0x02, 0x00, 0xc6, 0x86, 0x69,
+ 0x02, 0x01, 0xe8, 0x57, 0xec, 0xbe, 0xc3, 0x45, 0xe8, 0x11, 0xea, 0x50,
+ 0x53, 0x33, 0xc0, 0x8e, 0xc0, 0xe8, 0xa6, 0x02, 0x5b, 0x58, 0xbb, 0x00,
+ 0x00, 0x8b, 0xf8, 0x8b, 0xf3, 0x5b, 0x57, 0x53, 0x68, 0x5b, 0x24, 0xff,
+ 0x66, 0x12, 0xeb, 0x87, 0x8b, 0xc7, 0x8b, 0xbf, 0x8c, 0x04, 0x0b, 0xff,
+ 0x78, 0xf4, 0x74, 0xa6, 0x03, 0xfd, 0xf6, 0x45, 0x01, 0x80, 0x75, 0x02,
+ 0xeb, 0x8d, 0xe9, 0x21, 0x01, 0xe9, 0x03, 0x01, 0x5f, 0x5b, 0xba, 0x80,
+ 0x08, 0xe9, 0x75, 0xff, 0x8b, 0x54, 0x02, 0x86, 0xd6, 0x83, 0xc6, 0x02,
+ 0xb0, 0x04, 0xeb, 0x51, 0x5f, 0x5b, 0xba, 0x80, 0x05, 0xe9, 0x61, 0xff,
+ 0x53, 0x8d, 0x71, 0x18, 0x32, 0xff, 0x8a, 0xdd, 0xd1, 0xe3, 0x83, 0xe8,
+ 0x04, 0x0b, 0xc0, 0x74, 0xb7, 0x89, 0x46, 0x04, 0x57, 0x8b, 0xbf, 0x8c,
+ 0x04, 0x0b, 0xff, 0x74, 0xc4, 0x79, 0x03, 0xe9, 0x2c, 0xff, 0x03, 0xfd,
+ 0x8e, 0xc7, 0x33, 0xc0, 0x32, 0xed, 0x8a, 0x4d, 0xff, 0x89, 0x45, 0x02,
+ 0x83, 0xc7, 0x05, 0xe2, 0xf8, 0x33, 0xd2, 0x03, 0xf2, 0x8a, 0x4c, 0x01,
+ 0x8a, 0x14, 0x0a, 0xd2, 0x74, 0xb6, 0x80, 0xfa, 0xff, 0x74, 0xa5, 0xb0,
+ 0x02, 0x29, 0x56, 0x04, 0x72, 0xaa, 0x0a, 0xc9, 0x78, 0x92, 0x8a, 0xe1,
+ 0x80, 0xe1, 0x3f, 0x8c, 0xc7, 0x8a, 0x6d, 0xff, 0xeb, 0x12, 0x80, 0x7d,
+ 0x04, 0xff, 0x74, 0x15, 0xeb, 0x92, 0xe9, 0x7b, 0xff, 0xfe, 0xcd, 0x74,
+ 0xf9, 0x83, 0xc7, 0x05, 0x3a, 0x0d, 0x75, 0xf5, 0x3a, 0x55, 0x04, 0x75,
+ 0xe5, 0x8d, 0x44, 0x02, 0x87, 0x45, 0x02, 0x0b, 0xc0, 0x74, 0x09, 0xf6,
+ 0x45, 0x01, 0x80, 0x75, 0xdd, 0x89, 0x45, 0x02, 0x83, 0x7e, 0x04, 0x00,
+ 0x75, 0xa5, 0x33, 0xc0, 0x8c, 0xc6, 0xf6, 0x44, 0x01, 0x80, 0x74, 0x0e,
+ 0x39, 0x44, 0x02, 0x74, 0x60, 0x83, 0xc6, 0x05, 0xf6, 0x44, 0x01, 0x80,
+ 0x75, 0xf2, 0xf6, 0x86, 0x5f, 0x02, 0x01, 0x74, 0x36, 0x80, 0x7e, 0x08,
+ 0x0a, 0x75, 0x0b, 0xc6, 0x86, 0x5f, 0x02, 0x00, 0xc6, 0x46, 0x09, 0x04,
+ 0xeb, 0x22, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x1f, 0xc6, 0x86, 0x5f, 0x02,
+ 0x00, 0xc6, 0x86, 0x69, 0x02, 0x01, 0xe8, 0x27, 0xeb, 0xbe, 0xc3, 0x45,
+ 0xe8, 0xe1, 0xe8, 0x33, 0xc0, 0x8e, 0xc0, 0x53, 0xe8, 0x77, 0x01, 0x5b,
+ 0xbb, 0x00, 0x00, 0x89, 0x5e, 0x04, 0x8b, 0xf3, 0x5f, 0x5b, 0x33, 0xc0,
+ 0x8e, 0xc0, 0x3b, 0xb6, 0xba, 0x01, 0x73, 0x06, 0x68, 0x5d, 0x24, 0xff,
+ 0x66, 0x12, 0xe9, 0x80, 0xfd, 0x5f, 0x5b, 0xba, 0x80, 0x07, 0xe9, 0x58,
+ 0xfe, 0x56, 0x57, 0x50, 0x33, 0xc0, 0x8e, 0xc0, 0x8b, 0xb6, 0x52, 0x15,
+ 0x8b, 0xbe, 0x54, 0x15, 0x83, 0xc7, 0x01, 0xa5, 0xa5, 0xa5, 0x8b, 0xc3,
+ 0x03, 0x47, 0x04, 0x8b, 0xbe, 0x54, 0x15, 0x3b, 0xc7, 0x7f, 0x02, 0x32,
+ 0xc0, 0x58, 0x5f, 0x5e, 0xc3, 0x80, 0xbe, 0x2d, 0x01, 0x01, 0x75, 0x57,
+ 0x53, 0x33, 0xff, 0xf6, 0x47, 0x0e, 0x80, 0x74, 0x0e, 0x8b, 0x47, 0x14,
+ 0x83, 0xe0, 0x1f, 0x74, 0x45, 0xa8, 0x01, 0x75, 0x41, 0x8b, 0xf8, 0x83,
+ 0xc3, 0x06, 0x8d, 0xb6, 0xec, 0x15, 0x33, 0xc0, 0x33, 0xc9, 0x8a, 0x0c,
+ 0x80, 0xf9, 0x00, 0x74, 0x2d, 0x53, 0x46, 0x8a, 0x04, 0x03, 0xd8, 0x80,
+ 0x3c, 0x0e, 0x72, 0x02, 0x03, 0xdf, 0x46, 0x8a, 0x04, 0x3a, 0x07, 0x75,
+ 0x07, 0x5b, 0xfe, 0xc9, 0x74, 0x0a, 0xeb, 0xe5, 0x5b, 0x03, 0xf1, 0x03,
+ 0xf1, 0x4e, 0xeb, 0xd6, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x72, 0x00,
+ 0x00, 0x01, 0x5b, 0xc3, 0x8c, 0xd8, 0x8e, 0xc0, 0xf6, 0x41, 0x16, 0x0f,
+ 0x74, 0x60, 0x89, 0x96, 0xe2, 0x02, 0x81, 0xfa, 0x80, 0x02, 0x74, 0x13,
+ 0xba, 0x09, 0x04, 0xe8, 0x74, 0xf9, 0x72, 0x0b, 0xad, 0x86, 0xe0, 0x89,
+ 0x86, 0x14, 0x02, 0x86, 0xe0, 0xeb, 0x06, 0x8b, 0x86, 0x14, 0x02, 0x86,
+ 0xe0, 0x89, 0x86, 0xde, 0x02, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x4d, 0x22,
+ 0x57, 0x53, 0xe8, 0x9f, 0x05, 0x5a, 0x5f, 0x72, 0x29, 0x57, 0xe8, 0x26,
+ 0x00, 0xb8, 0x00, 0x0e, 0xab, 0x47, 0xb0, 0x00, 0xaa, 0x8d, 0xb6, 0xdc,
+ 0x02, 0xa5, 0xa5, 0x8d, 0xb6, 0xe0, 0x02, 0xa5, 0xa5, 0x55, 0x8b, 0xea,
+ 0x8a, 0x47, 0x16, 0x8a, 0x66, 0x17, 0xab, 0x5d, 0xe8, 0x13, 0x06, 0x8b,
+ 0xda, 0x5f, 0xc3, 0x55, 0x8b, 0xea, 0x8a, 0x43, 0x16, 0xc0, 0xe0, 0x04,
+ 0x88, 0x41, 0x16, 0xc7, 0x47, 0x06, 0xe0, 0x00, 0x83, 0xe9, 0x06, 0x89,
+ 0x4f, 0x04, 0x0b, 0xff, 0x75, 0x18, 0x8d, 0x76, 0x0e, 0x8d, 0x7f, 0x08,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x8b, 0xd5, 0x5d, 0x8d, 0xb6,
+ 0xf4, 0x02, 0xa5, 0xa5, 0xa5, 0xc3, 0x8b, 0xcf, 0xd1, 0xe9, 0x8d, 0x76,
+ 0x0e, 0x8d, 0x7f, 0x08, 0x8c, 0xd8, 0x8e, 0xc0, 0xad, 0x24, 0x7f, 0xab,
+ 0xa5, 0xa5, 0x8b, 0xd5, 0x5d, 0x56, 0x8d, 0xb6, 0xf4, 0x02, 0xad, 0x0c,
+ 0x80, 0xab, 0xa5, 0xa5, 0x5e, 0xad, 0x80, 0xcc, 0x80, 0xab, 0x49, 0xf3,
+ 0xa5, 0xc3, 0x8b, 0x86, 0x00, 0x03, 0x86, 0xe0, 0x89, 0x86, 0x10, 0x02,
+ 0x89, 0x86, 0x02, 0x02, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xbe, 0xfc, 0x01,
+ 0x8d, 0xb6, 0xf4, 0x02, 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0xb9, 0x2a, 0x00,
+ 0xe8, 0xd3, 0x04, 0x72, 0xd8, 0x8d, 0xb6, 0xe6, 0x02, 0x8b, 0xfb, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x7f, 0x05, 0xb9, 0x26,
+ 0x00, 0xe8, 0xba, 0x04, 0x72, 0x62, 0x8d, 0xb6, 0x10, 0x03, 0x8b, 0xfb,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x66, 0x05, 0x8d,
+ 0x7f, 0x08, 0x8b, 0x4f, 0x04, 0x83, 0xc1, 0x03, 0x80, 0xe1, 0xfe, 0x57,
+ 0xe8, 0x97, 0x04, 0x5f, 0x8b, 0xd7, 0x72, 0x22, 0x83, 0xe9, 0x08, 0x8d,
+ 0x7f, 0x04, 0x8c, 0xd8, 0x8e, 0xc0, 0x8b, 0xc1, 0xab, 0x8b, 0x86, 0x16,
+ 0x03, 0xab, 0x8b, 0xf2, 0xd1, 0xe9, 0x49, 0xf3, 0xa5, 0xbe, 0x9f, 0x45,
+ 0xe8, 0xdd, 0xe6, 0xe9, 0x2f, 0x05, 0xc3, 0xb9, 0x26, 0x00, 0xe8, 0x69,
+ 0x04, 0x72, 0x11, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xb6, 0x36, 0x03, 0x8b,
+ 0xfb, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x15, 0x05, 0xc3, 0xb9, 0x26, 0x00,
+ 0xe8, 0x69, 0x04, 0x72, 0xf7, 0x8d, 0xb6, 0x5c, 0x03, 0x8b, 0xfb, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xc6, 0x86, 0x63, 0x02, 0x01,
+ 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, 0x03, 0xe9, 0xe8, 0x04, 0x68, 0x9d,
+ 0x2c, 0xe9, 0xe2, 0x04, 0xb9, 0x26, 0x00, 0xe8, 0x3e, 0x04, 0x72, 0xcc,
+ 0x8d, 0xb6, 0x82, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9,
+ 0xf3, 0xa5, 0xc6, 0x86, 0x63, 0x02, 0x01, 0x80, 0xbe, 0x83, 0x02, 0x01,
+ 0x75, 0x03, 0xe9, 0xbd, 0x04, 0x68, 0x9d, 0x2c, 0xe9, 0xb7, 0x04, 0xb9,
+ 0x18, 0x00, 0xe8, 0x13, 0x04, 0x72, 0xa1, 0x8d, 0xb6, 0xa8, 0x03, 0x8b,
+ 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x9e, 0x04,
+ 0x83, 0xc1, 0x1c, 0x56, 0x57, 0x52, 0xe8, 0xf7, 0x03, 0x5a, 0x5f, 0x5e,
+ 0x72, 0x6c, 0x56, 0x8c, 0xd8, 0x8e, 0xc0, 0x83, 0xe9, 0x08, 0x8b, 0xc1,
+ 0x8d, 0x7f, 0x04, 0xab, 0xba, 0xe0, 0x00, 0x8b, 0xc2, 0xab, 0x8d, 0xb6,
+ 0xc8, 0x03, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0xf4, 0x02, 0x80, 0xbe, 0x62,
+ 0x01, 0x01, 0x75, 0x04, 0x8d, 0xb6, 0x00, 0x01, 0xa5, 0xa5, 0xa5, 0x83,
+ 0xe9, 0x0e, 0x80, 0xbe, 0x63, 0x01, 0x02, 0x75, 0x03, 0x83, 0xe9, 0x04,
+ 0x8b, 0xc1, 0x86, 0xe0, 0xab, 0xb8, 0x00, 0x08, 0xab, 0xb8, 0xff, 0x26,
+ 0xab, 0x83, 0xe9, 0x04, 0x8b, 0xc1, 0x86, 0xe0, 0xab, 0x5e, 0xe9, 0x3d,
+ 0x04, 0xb9, 0x44, 0x00, 0xe8, 0x99, 0x03, 0x72, 0x11, 0x8d, 0xb6, 0xda,
+ 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe8,
+ 0x24, 0x04, 0xc3, 0xb9, 0x36, 0x00, 0xe8, 0x7f, 0x03, 0x72, 0xf7, 0xff,
+ 0x86, 0x52, 0x02, 0x8d, 0xb6, 0x7c, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0x33, 0xc0, 0x8d, 0xbe, 0x96, 0x05, 0xab,
+ 0xab, 0xaa, 0x8d, 0xbe, 0x9e, 0x05, 0xab, 0xab, 0xaa, 0xe9, 0xf6, 0x03,
+ 0x8d, 0x4d, 0x3a, 0x57, 0x53, 0xe8, 0x50, 0x03, 0x5a, 0x5f, 0x72, 0x5b,
+ 0x57, 0xe8, 0xd7, 0xfd, 0x8c, 0xd8, 0x8e, 0xc0, 0xb8, 0x00, 0x26, 0xab,
+ 0x47, 0xb0, 0x22, 0xaa, 0x8d, 0xb6, 0xdc, 0x02, 0xa5, 0xa5, 0x8d, 0xb6,
+ 0x02, 0x03, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0x08, 0x03, 0xa5, 0xa5, 0xa5,
+ 0xa5, 0x8d, 0xb6, 0x1e, 0x04, 0xa5, 0xa5, 0x8d, 0xb6, 0x22, 0x04, 0xa5,
+ 0xa5, 0xa5, 0x8d, 0xb6, 0x28, 0x04, 0xa5, 0x53, 0x8c, 0xdb, 0x8e, 0x46,
+ 0x02, 0x26, 0xa1, 0x26, 0x00, 0xe8, 0x3e, 0xe2, 0x8e, 0xc3, 0xab, 0x8e,
+ 0x46, 0x02, 0x26, 0xa1, 0x24, 0x00, 0xe8, 0x31, 0xe2, 0x8e, 0xc3, 0xab,
+ 0x5b, 0xe8, 0x92, 0x03, 0x8b, 0xda, 0x5f, 0xc3, 0x8d, 0x4d, 0x38, 0x57,
+ 0x53, 0xe8, 0xe8, 0x02, 0x5a, 0x5f, 0x72, 0xf3, 0x57, 0xe8, 0x6f, 0xfd,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xb8, 0x00, 0x24, 0xab, 0x47, 0xb0, 0x23, 0xaa,
+ 0x8d, 0xb6, 0xdc, 0x02, 0xa5, 0xa5, 0x8d, 0xb6, 0xf2, 0x03, 0xb9, 0x06,
+ 0x00, 0xf3, 0xa5, 0x8d, 0xb6, 0x36, 0x04, 0xa5, 0xa5, 0xa5, 0xa5, 0x8d,
+ 0xb6, 0x2e, 0x04, 0xa5, 0xa5, 0xa5, 0xa5, 0xe8, 0x50, 0x03, 0x8b, 0xda,
+ 0x5f, 0xc3, 0x8d, 0x4d, 0x3e, 0x57, 0x53, 0xe8, 0xa6, 0x02, 0x5a, 0x5f,
+ 0x72, 0x64, 0x57, 0xe8, 0x2d, 0xfd, 0x8c, 0xd8, 0x8e, 0xc0, 0xb8, 0x00,
+ 0x2a, 0xab, 0x47, 0xb0, 0x24, 0xaa, 0x8d, 0xb6, 0xdc, 0x02, 0xa5, 0xa5,
+ 0x8d, 0xb6, 0x06, 0x04, 0xb9, 0x0a, 0x00, 0xf3, 0xa5, 0x8d, 0xb6, 0x28,
+ 0x04, 0xa5, 0x53, 0x8c, 0xdb, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x26, 0x00,
+ 0xe8, 0xa7, 0xe1, 0x8e, 0xc3, 0xab, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x24,
+ 0x00, 0xe8, 0x9a, 0xe1, 0x8e, 0xc3, 0xab, 0x5b, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0x8d, 0xb6, 0x3e, 0x04, 0xa5, 0x8b, 0x86, 0xf8, 0x01, 0x86, 0xc4, 0xab,
+ 0x8d, 0xb6, 0x42, 0x04, 0xa5, 0x8b, 0x86, 0xf6, 0x01, 0x86, 0xc4, 0xab,
+ 0xe8, 0xdf, 0x02, 0x8b, 0xda, 0x5f, 0xc3, 0xb9, 0x3a, 0x00, 0xe8, 0x37,
+ 0x02, 0x72, 0xf7, 0x8d, 0xb6, 0x46, 0x04, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, 0x03,
+ 0xe9, 0xbb, 0x02, 0x68, 0x9d, 0x2c, 0xe9, 0xb5, 0x02, 0xb9, 0x26, 0x00,
+ 0xe8, 0x11, 0x02, 0x72, 0xd1, 0xff, 0x86, 0x4e, 0x02, 0x8d, 0xb6, 0x80,
+ 0x04, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0x80,
+ 0xbe, 0x83, 0x02, 0x01, 0x75, 0x03, 0xe9, 0x91, 0x02, 0x68, 0x9d, 0x2c,
+ 0xe9, 0x8b, 0x02, 0xb9, 0x20, 0x00, 0xe8, 0xe7, 0x01, 0x72, 0xa7, 0x8d,
+ 0xb6, 0xee, 0x01, 0x8d, 0xbe, 0xc0, 0x04, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5,
+ 0xa5, 0xa5, 0x8d, 0xb6, 0xa6, 0x04, 0x8b, 0xfb, 0xd1, 0xe9, 0xf3, 0xa5,
+ 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, 0x03, 0xe9, 0x60, 0x02, 0x68, 0x9d,
+ 0x2c, 0xe9, 0x5a, 0x02, 0x89, 0x86, 0xe0, 0x04, 0x86, 0xc4, 0x89, 0x86,
+ 0x0e, 0x02, 0xb9, 0x2a, 0x00, 0xe8, 0xac, 0x01, 0x72, 0x18, 0x8d, 0xb6,
+ 0xc6, 0x04, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5,
+ 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, 0x07, 0xe9, 0x30, 0x02, 0xe9, 0x22,
+ 0x01, 0x90, 0x68, 0x9d, 0x2c, 0xe9, 0x26, 0x02, 0xb9, 0x18, 0x00, 0xe8,
+ 0x82, 0x01, 0x73, 0x03, 0xe9, 0x3f, 0xff, 0x8d, 0xb6, 0x64, 0x05, 0x8b,
+ 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x0a, 0x02,
+ 0xb9, 0x24, 0x00, 0xe8, 0x66, 0x01, 0x73, 0x03, 0xe9, 0x23, 0xff, 0x8b,
+ 0x86, 0x0e, 0x05, 0x86, 0xc4, 0x89, 0x86, 0x26, 0x02, 0x8d, 0xb6, 0xf0,
+ 0x04, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9,
+ 0xe4, 0x01, 0xb9, 0x1c, 0x00, 0xe8, 0x40, 0x01, 0x73, 0x03, 0xe9, 0xfd,
+ 0xfe, 0x8d, 0xb6, 0x14, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1,
+ 0xe9, 0xf3, 0xa5, 0xe9, 0xc8, 0x01, 0xb9, 0x18, 0x00, 0xe8, 0x24, 0x01,
+ 0x73, 0x03, 0xe9, 0xe1, 0xfe, 0x8d, 0xb6, 0x30, 0x05, 0x8b, 0xfb, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0xac, 0x01, 0xb9, 0x1c,
+ 0x00, 0x50, 0xe8, 0x07, 0x01, 0x58, 0x73, 0x03, 0xe9, 0xc3, 0xfe, 0x8d,
+ 0xb6, 0x48, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3,
+ 0xa5, 0xe9, 0x8e, 0x01, 0x8b, 0x4f, 0x04, 0x53, 0xe8, 0xe9, 0x00, 0x5e,
+ 0x72, 0x17, 0x89, 0x9e, 0x38, 0x02, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0xd1, 0xe9, 0xf3, 0xa5, 0xc7, 0x86, 0x3a, 0x02, 0x01, 0x00, 0xe9, 0x6d,
+ 0x01, 0xe9, 0x70, 0x11, 0xb9, 0x18, 0x00, 0xe8, 0xc6, 0x00, 0x8d, 0xb6,
+ 0xa8, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5,
+ 0x33, 0xc0, 0x8d, 0x7f, 0x08, 0xb9, 0x06, 0x00, 0xf3, 0xab, 0xe9, 0x49,
+ 0x01, 0x53, 0x8b, 0x9e, 0xb0, 0x01, 0x8b, 0xb6, 0xae, 0x01, 0x3b, 0xde,
+ 0x74, 0x15, 0x8a, 0x47, 0x17, 0xf6, 0x44, 0x0e, 0x80, 0x75, 0x0e, 0x38,
+ 0x44, 0x17, 0x75, 0x09, 0x8b, 0x74, 0x02, 0x89, 0xb6, 0xae, 0x01, 0xeb,
+ 0x1a, 0x8b, 0xfe, 0x8b, 0x74, 0x02, 0x3b, 0xde, 0x74, 0x11, 0xf6, 0x44,
+ 0x0e, 0x80, 0x75, 0xf1, 0x38, 0x44, 0x17, 0x75, 0xec, 0x8b, 0x44, 0x02,
+ 0x89, 0x45, 0x02, 0x5b, 0xc3, 0xe8, 0x24, 0xdd, 0xc6, 0x86, 0x83, 0x02,
+ 0x00, 0x8d, 0xb6, 0xa6, 0x01, 0x8d, 0xbe, 0xac, 0x01, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xa5, 0xa5, 0xa5, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x00, 0x00,
+ 0x00, 0x16, 0x8d, 0x9e, 0x52, 0x12, 0x89, 0x9e, 0xa8, 0x01, 0x89, 0x9e,
+ 0xaa, 0x01, 0xc7, 0x07, 0x30, 0x80, 0xc7, 0x47, 0x04, 0x00, 0x00, 0x83,
+ 0xc3, 0x08, 0x89, 0x9e, 0xa6, 0x01, 0xc6, 0x86, 0x86, 0x02, 0x01, 0x83,
+ 0xc1, 0x02, 0xeb, 0x4a, 0x8b, 0x9e, 0xac, 0x01, 0x8b, 0xb6, 0xae, 0x01,
+ 0xeb, 0x29, 0x80, 0xbe, 0x83, 0x02, 0x01, 0x74, 0xa8, 0x8d, 0x96, 0x52,
+ 0x15, 0x8d, 0xbe, 0x52, 0x12, 0x8b, 0x9e, 0xa6, 0x01, 0x8b, 0xb6, 0xa8,
+ 0x01, 0xeb, 0x18, 0x90, 0x8b, 0x9e, 0xa6, 0x01, 0x8b, 0xb6, 0xa8, 0x01,
+ 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, 0xcd, 0x8d, 0x96, 0x52, 0x12, 0x8d,
+ 0xbe, 0x52, 0x09, 0x83, 0xc1, 0x02, 0x3b, 0xde, 0x73, 0x17, 0x8b, 0xc6,
+ 0x2b, 0xc3, 0x3b, 0xc1, 0x72, 0x25, 0xc7, 0x07, 0x00, 0x00, 0x83, 0xc3,
+ 0x02, 0xc7, 0x07, 0x00, 0x00, 0x83, 0xe9, 0x02, 0xc3, 0x8b, 0xc2, 0x2b,
+ 0xc3, 0x3b, 0xc1, 0x72, 0x02, 0xeb, 0xe7, 0x8b, 0xdf, 0x8b, 0xc6, 0x2b,
+ 0xc3, 0x3b, 0xc1, 0x72, 0x02, 0xeb, 0xdb, 0x3b, 0xb6, 0xae, 0x01, 0x74,
+ 0x11, 0x80, 0xbe, 0x5e, 0x02, 0x01, 0x75, 0x05, 0x83, 0x8e, 0xda, 0x02,
+ 0x02, 0xe8, 0x68, 0x01, 0xf9, 0xc3, 0x8b, 0x74, 0x02, 0x89, 0xb6, 0xae,
+ 0x01, 0x3b, 0xdd, 0x74, 0x04, 0x3b, 0xde, 0x77, 0xc4, 0x8b, 0xc6, 0x2b,
+ 0xc3, 0x3b, 0xc1, 0x72, 0xe9, 0x89, 0xb6, 0xae, 0x01, 0xeb, 0xa7, 0x8b,
+ 0xb6, 0xb0, 0x01, 0x89, 0x5c, 0x02, 0x80, 0x4c, 0x05, 0x80, 0x89, 0x9e,
+ 0xb0, 0x01, 0x03, 0x5f, 0x04, 0x83, 0xc3, 0x06, 0x89, 0x9e, 0xac, 0x01,
+ 0xc6, 0x86, 0x87, 0x02, 0x01, 0xc3, 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75,
+ 0xda, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x0c, 0x00, 0x0c, 0x02, 0x80, 0xbe,
+ 0x86, 0x02, 0x01, 0x74, 0x27, 0x8b, 0xb6, 0xaa, 0x01, 0x89, 0x5c, 0x02,
+ 0x80, 0x4c, 0x05, 0x80, 0x83, 0xc8, 0x04, 0x25, 0xff, 0xf7, 0x8e, 0x46,
+ 0x02, 0x26, 0xa3, 0x0c, 0x00, 0x89, 0x9e, 0xaa, 0x01, 0x03, 0x5f, 0x04,
+ 0x83, 0xc3, 0x06, 0x89, 0x9e, 0xa6, 0x01, 0xc3, 0x8e, 0x46, 0x02, 0x89,
+ 0x9e, 0xa8, 0x01, 0x26, 0x89, 0x1e, 0x2c, 0x00, 0x83, 0xc8, 0x08, 0x25,
+ 0xff, 0xf7, 0xc6, 0x86, 0x86, 0x02, 0x00, 0xeb, 0xd1, 0x53, 0xf6, 0x86,
+ 0x83, 0x02, 0x01, 0x74, 0x0c, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c,
+ 0x00, 0xfe, 0xe8, 0x8c, 0xfe, 0x5b, 0xc3, 0x90, 0xe9, 0xb8, 0x00, 0x90,
+ 0x80, 0xbe, 0x83, 0x02, 0x00, 0x75, 0xf5, 0x50, 0xfa, 0x8d, 0xb6, 0xac,
+ 0x01, 0x8d, 0xbe, 0xa6, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5,
+ 0x80, 0xbe, 0x63, 0x01, 0x01, 0x75, 0x16, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x0e, 0x00, 0x00, 0x00, 0x02, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x00,
+ 0x00, 0xff, 0xe3, 0xeb, 0x27, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x00,
+ 0x00, 0x00, 0x02, 0xf6, 0x86, 0xaa, 0x02, 0x01, 0x74, 0x0c, 0x8e, 0x46,
+ 0x02, 0x26, 0x81, 0x0e, 0x00, 0x00, 0x00, 0x1c, 0xeb, 0x0a, 0x8e, 0x46,
+ 0x02, 0x26, 0x81, 0x26, 0x00, 0x00, 0xff, 0xe3, 0x33, 0xc0, 0x89, 0x86,
+ 0xae, 0x01, 0x40, 0x88, 0x86, 0x83, 0x02, 0x58, 0xf6, 0x86, 0x54, 0x02,
+ 0x01, 0x74, 0x0a, 0xe8, 0xe0, 0xe4, 0x8e, 0x46, 0x02, 0x26, 0xa2, 0x1c,
+ 0x00, 0x8b, 0x9e, 0xa8, 0x01, 0x83, 0x3f, 0x00, 0x74, 0x0f, 0xf7, 0x07,
+ 0x20, 0x00, 0x75, 0x06, 0xc7, 0x07, 0x00, 0x00, 0xeb, 0x03, 0xe8, 0x89,
+ 0x00, 0xf6, 0x86, 0x87, 0x02, 0x01, 0x74, 0x19, 0x8e, 0x46, 0x02, 0x26,
+ 0x89, 0x1e, 0x2c, 0x00, 0xc6, 0x86, 0x87, 0x02, 0x00, 0x8e, 0x46, 0x02,
+ 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x08, 0xfb, 0xeb, 0x06, 0xc6, 0x86, 0x86,
+ 0x02, 0x01, 0xfb, 0xc3, 0x56, 0x8d, 0xb6, 0x52, 0x09, 0xc7, 0x86, 0xa6,
+ 0x01, 0x5a, 0x09, 0x01, 0xae, 0xa6, 0x01, 0x89, 0xb6, 0xa8, 0x01, 0x89,
+ 0xb6, 0xaa, 0x01, 0xc7, 0x04, 0x30, 0x80, 0xc7, 0x44, 0x04, 0x00, 0x00,
+ 0xc6, 0x86, 0x86, 0x02, 0x01, 0x5e, 0xc3, 0xff, 0xa4, 0x20, 0x04, 0x80,
+ 0x7e, 0x06, 0x46, 0x75, 0x1c, 0xf6, 0x86, 0x76, 0x02, 0x01, 0x74, 0x15,
+ 0xff, 0x8e, 0xcc, 0x02, 0x75, 0x0f, 0xc6, 0x86, 0x76, 0x02, 0x00, 0xc6,
+ 0x86, 0x6b, 0x02, 0x00, 0xe8, 0x7d, 0xe2, 0xeb, 0x10, 0x83, 0xfe, 0x10,
+ 0x74, 0x07, 0x83, 0xfe, 0x0e, 0x74, 0x02, 0xeb, 0x04, 0xff, 0xa4, 0x20,
+ 0x04, 0xc3, 0x8b, 0x9e, 0xa8, 0x01, 0x8b, 0x07, 0xfb, 0xa9, 0x10, 0x00,
+ 0x74, 0x6c, 0xa9, 0x00, 0x80, 0x75, 0x46, 0x8b, 0x77, 0x17, 0x81, 0xe6,
+ 0xff, 0x00, 0xf7, 0x86, 0x3a, 0x02, 0x01, 0x00, 0x74, 0x1b, 0x3b, 0x9e,
+ 0x38, 0x02, 0x75, 0x15, 0x89, 0x86, 0x74, 0x15, 0x50, 0x53, 0x56, 0xe8,
+ 0x4e, 0x0e, 0x5e, 0x5b, 0x58, 0xc7, 0x86, 0x3a, 0x02, 0x00, 0x00, 0xeb,
+ 0x18, 0xf7, 0x46, 0x14, 0xff, 0xff, 0x74, 0x11, 0x83, 0xfe, 0x2a, 0x77,
+ 0x0c, 0xd1, 0xe6, 0x68, 0xc1, 0x2f, 0xff, 0x66, 0x14, 0x5b, 0x83, 0xc4,
+ 0x02, 0x81, 0x0f, 0x00, 0x80, 0xfa, 0xf6, 0x47, 0x05, 0x80, 0x74, 0x1a,
+ 0x8b, 0x5f, 0x02, 0x89, 0x9e, 0xa8, 0x01, 0xf7, 0x07, 0x10, 0x00, 0x74,
+ 0x0d, 0xff, 0x86, 0x3a, 0x01, 0x83, 0xbe, 0x3a, 0x01, 0x06, 0x77, 0x0f,
+ 0xeb, 0x8c, 0xc6, 0x86, 0xb8, 0x01, 0x00, 0xc7, 0x86, 0x3a, 0x01, 0x00,
+ 0x00, 0xfb, 0xc3, 0xe8, 0xa2, 0xdd, 0xf7, 0xc6, 0xff, 0xff, 0x74, 0xea,
+ 0xc7, 0x44, 0x02, 0x03, 0x00, 0xc6, 0x86, 0xb8, 0x01, 0x01, 0x8d, 0x7e,
+ 0x16, 0xe8, 0xaa, 0xdd, 0xeb, 0xdd, 0xa9, 0x20, 0x00, 0x75, 0x74, 0xf7,
+ 0x47, 0x04, 0x00, 0x80, 0x74, 0x05, 0xe8, 0x08, 0x00, 0x72, 0x9f, 0x53,
+ 0x68, 0xbd, 0x2f, 0xff, 0xe6, 0x8a, 0x47, 0x17, 0x8b, 0xfb, 0x8b, 0x7d,
+ 0x02, 0x38, 0x45, 0x17, 0x74, 0x09, 0xf7, 0x45, 0x04, 0x00, 0x80, 0x75,
+ 0xf1, 0xf8, 0xc3, 0xf9, 0xc3, 0xa9, 0x20, 0x00, 0x75, 0x05, 0xa9, 0x00,
+ 0x10, 0x75, 0x0c, 0x33, 0xc9, 0xa9, 0x05, 0x00, 0x75, 0x0a, 0xa9, 0x0a,
+ 0x04, 0x74, 0x05, 0x8b, 0x0d, 0xe3, 0x01, 0x49, 0x89, 0x0d, 0xc3, 0x53,
+ 0x8b, 0x4f, 0x04, 0x80, 0xe5, 0x7f, 0x89, 0x4f, 0x04, 0x83, 0xc1, 0x06,
+ 0xe8, 0xdd, 0xfc, 0x72, 0x19, 0x5e, 0x56, 0x8b, 0xfb, 0xd1, 0xe9, 0x83,
+ 0xe9, 0x02, 0x83, 0xc6, 0x04, 0x83, 0xc7, 0x04, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0xf3, 0xa5, 0xe8, 0x61, 0xfd, 0xf8, 0x5b, 0xc3, 0x80, 0x7e, 0x08, 0x02,
+ 0x75, 0x0b, 0xa9, 0x20, 0x00, 0x75, 0x06, 0xc7, 0x86, 0xc8, 0x01, 0x01,
+ 0x00, 0xc3, 0x8a, 0x56, 0x06, 0x80, 0xfa, 0x02, 0x74, 0x17, 0x80, 0xfa,
+ 0x44, 0x74, 0x12, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x18, 0x80, 0xfa, 0x0c,
+ 0x74, 0x07, 0x80, 0xfa, 0x0e, 0x74, 0x02, 0xeb, 0x0b, 0xa9, 0x20, 0x00,
+ 0x75, 0x06, 0xb8, 0x01, 0x00, 0xe8, 0x63, 0xec, 0xc3, 0xb9, 0x06, 0x00,
+ 0xa9, 0x20, 0x00, 0x74, 0x09, 0xb9, 0x08, 0x00, 0xa9, 0x0f, 0x00, 0x75,
+ 0x01, 0xc3, 0xff, 0x86, 0xc4, 0x02, 0x83, 0xbe, 0xc4, 0x02, 0x02, 0x72,
+ 0x06, 0x8b, 0xc1, 0xe8, 0x41, 0xec, 0xc3, 0x53, 0xe8, 0x44, 0xf8, 0x5b,
+ 0xc3, 0x53, 0x68, 0xbd, 0x2f, 0xe9, 0xb5, 0xf8, 0x80, 0x7e, 0x06, 0x0c,
+ 0x75, 0x1d, 0xa9, 0x00, 0x10, 0x75, 0xee, 0xa9, 0x20, 0x00, 0x74, 0xe9,
+ 0xa8, 0x0a, 0x75, 0x10, 0xff, 0x86, 0xba, 0x02, 0x83, 0xbe, 0xba, 0x02,
+ 0x04, 0x72, 0xda, 0xc6, 0x46, 0x07, 0x0e, 0xc3, 0x83, 0xbe, 0xb8, 0x02,
+ 0x04, 0x73, 0xf8, 0xbe, 0xcf, 0x45, 0xe8, 0x73, 0xde, 0xeb, 0xf0, 0x8d,
+ 0xbe, 0xbe, 0x02, 0xe8, 0x0f, 0xff, 0x0b, 0xc9, 0x74, 0xe5, 0x53, 0x68,
+ 0xbd, 0x2f, 0xe9, 0x70, 0xf8, 0x8d, 0xbe, 0xb6, 0x02, 0xe8, 0xfd, 0xfe,
+ 0x0b, 0xc9, 0x74, 0x03, 0xe9, 0x14, 0xff, 0xc3, 0x53, 0x8a, 0x56, 0x06,
+ 0x80, 0xfa, 0x02, 0x74, 0x17, 0x80, 0xfa, 0x44, 0x74, 0x12, 0x80, 0x7e,
+ 0x08, 0x08, 0x75, 0x2d, 0x80, 0xfa, 0x0c, 0x74, 0x07, 0x80, 0xfa, 0x0e,
+ 0x74, 0x02, 0xeb, 0x21, 0xa9, 0x20, 0x00, 0x74, 0x1e, 0x8b, 0x96, 0x66,
+ 0x01, 0x4a, 0x89, 0x96, 0x66, 0x01, 0x83, 0xfa, 0x01, 0x77, 0x23, 0xbe,
+ 0xb7, 0x45, 0xe8, 0x17, 0xde, 0xc6, 0x86, 0x86, 0x02, 0x01, 0xe8, 0xa6,
+ 0xf7, 0x5b, 0xc3, 0xfe, 0x8e, 0x68, 0x01, 0x80, 0x8e, 0x68, 0x01, 0x00,
+ 0x75, 0x08, 0xb8, 0x01, 0x00, 0xe8, 0x8b, 0xeb, 0xeb, 0xeb, 0xbe, 0xb7,
+ 0x45, 0xe8, 0xf4, 0xdd, 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0xc6,
+ 0x86, 0x86, 0x02, 0x01, 0xfa, 0xe8, 0x94, 0xf7, 0xeb, 0xd3, 0xa9, 0x20,
+ 0x00, 0x74, 0x41, 0xa9, 0x0f, 0x00, 0x75, 0x25, 0xc6, 0x86, 0x65, 0x02,
+ 0x01, 0xc6, 0x86, 0x66, 0x02, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0,
+ 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xab, 0xab, 0xab, 0x8b, 0x86,
+ 0x06, 0x02, 0x83, 0x8e, 0x06, 0x02, 0x40, 0xeb, 0x17, 0x8d, 0x77, 0x0e,
+ 0x8d, 0xbe, 0xee, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x8b,
+ 0x86, 0x06, 0x02, 0x83, 0xa6, 0x06, 0x02, 0xbf, 0x33, 0x86, 0x06, 0x02,
+ 0x74, 0x05, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc3, 0xfb, 0xc3, 0xff, 0xa4,
+ 0xc8, 0x03, 0x53, 0x56, 0xf7, 0x07, 0x00, 0x10, 0x74, 0x0a, 0x8b, 0xc7,
+ 0x80, 0x7e, 0x06, 0x44, 0x74, 0x49, 0xeb, 0x44, 0x8b, 0xc7, 0x8b, 0x49,
+ 0x16, 0x80, 0xf9, 0x00, 0x74, 0x05, 0x80, 0xf9, 0x03, 0x75, 0x38, 0x8d,
+ 0xbe, 0x0a, 0x03, 0x83, 0x3d, 0x00, 0x75, 0x0c, 0x83, 0x7d, 0x02, 0x00,
+ 0x75, 0x06, 0x83, 0x7d, 0x04, 0x00, 0x74, 0x23, 0x8b, 0xf8, 0x8d, 0x71,
+ 0x0e, 0x8d, 0xbe, 0x0a, 0x03, 0x8c, 0xd8, 0x8e, 0xc0, 0xb9, 0x03, 0x00,
+ 0xf3, 0xa7, 0x74, 0x0f, 0xc7, 0x86, 0x2a, 0x02, 0x0e, 0x00, 0xb8, 0x0b,
+ 0x00, 0xe8, 0xc3, 0xea, 0x5e, 0x5b, 0xc3, 0x8b, 0xf8, 0x5e, 0x5b, 0xff,
+ 0xa4, 0xf4, 0x03, 0xff, 0x86, 0x48, 0x02, 0xc7, 0x86, 0x2a, 0x02, 0x06,
+ 0x00, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xbe, 0xfc, 0x01, 0x8d, 0x77, 0x0e,
+ 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0x8b, 0xb6, 0xc4, 0x05, 0x8b, 0x04, 0x86,
+ 0xe0, 0x89, 0x86, 0x02, 0x02, 0x89, 0x86, 0x12, 0x02, 0x8b, 0xb6, 0xc9,
+ 0x05, 0x8b, 0x04, 0x89, 0x86, 0x16, 0x02, 0x8b, 0x44, 0x02, 0x89, 0x86,
+ 0x18, 0x02, 0x8b, 0x44, 0x04, 0x89, 0x86, 0x1a, 0x02, 0x8b, 0xb6, 0xce,
+ 0x05, 0x8b, 0x04, 0x89, 0x86, 0x20, 0x02, 0x8b, 0x44, 0x02, 0x89, 0x86,
+ 0x22, 0x02, 0x8b, 0xb6, 0xc4, 0x05, 0x8b, 0x04, 0x80, 0x7e, 0x08, 0x06,
+ 0x75, 0x56, 0xf7, 0x07, 0x00, 0x10, 0x74, 0x14, 0xf6, 0x47, 0x06, 0x08,
+ 0x75, 0x0b, 0x80, 0xbe, 0x5f, 0x02, 0x00, 0x75, 0x04, 0xc6, 0x46, 0x09,
+ 0x04, 0xe9, 0x1b, 0x01, 0x3b, 0x86, 0x00, 0x03, 0x77, 0xf7, 0x80, 0xbe,
+ 0x5e, 0x02, 0x01, 0x74, 0x10, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0xea, 0xc6,
+ 0x46, 0x07, 0x10, 0xc6, 0x46, 0x09, 0x1e, 0xeb, 0xe0, 0x80, 0xbe, 0x5f,
+ 0x02, 0x00, 0x75, 0xd9, 0xc6, 0x46, 0x09, 0x0a, 0xf6, 0x86, 0x07, 0x02,
+ 0x10, 0x74, 0xce, 0x80, 0xa6, 0x07, 0x02, 0x6f, 0xc6, 0x86, 0x85, 0x02,
+ 0x01, 0xe9, 0xdf, 0x00, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x5b, 0xc6, 0x86,
+ 0x54, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xbf,
+ 0xbe, 0x93, 0x45, 0xe8, 0x5a, 0xdc, 0x8b, 0xb6, 0xc9, 0x05, 0x8d, 0xbe,
+ 0xf4, 0x02, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75,
+ 0x21, 0x83, 0xf8, 0x01, 0x74, 0x1c, 0xff, 0x8e, 0xb0, 0x02, 0x75, 0x13,
+ 0xf6, 0x86, 0x58, 0x02, 0x01, 0x75, 0x0c, 0xc6, 0x86, 0x58, 0x02, 0x01,
+ 0xc6, 0x46, 0x09, 0x08, 0xe9, 0x94, 0x00, 0xe9, 0x91, 0x00, 0xc7, 0x86,
+ 0xb0, 0x02, 0x08, 0x00, 0x83, 0xf8, 0x01, 0x75, 0x0a, 0xc7, 0x86, 0xae,
+ 0x02, 0x02, 0x00, 0xeb, 0x7e, 0xeb, 0x2e, 0x8d, 0x77, 0x0e, 0x8d, 0xbe,
+ 0x0a, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75,
+ 0xe4, 0xff, 0x8e, 0xae, 0x02, 0x75, 0x14, 0xc7, 0x86, 0xae, 0x02, 0x02,
+ 0x00, 0xc6, 0x86, 0x54, 0x02, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e,
+ 0x0c, 0x00, 0x40, 0xeb, 0x4e, 0x80, 0xbe, 0x5e, 0x02, 0x00, 0x74, 0x0c,
+ 0x80, 0x7e, 0x08, 0x08, 0x74, 0x41, 0xc6, 0x46, 0x09, 0x0a, 0xeb, 0x3b,
+ 0xb7, 0x10, 0x8a, 0x5e, 0x06, 0x80, 0xfb, 0x06, 0x74, 0x1f, 0x80, 0xfb,
+ 0x08, 0x74, 0x1a, 0x80, 0xfb, 0x04, 0x74, 0x15, 0x80, 0xfb, 0x0c, 0x74,
+ 0x10, 0x80, 0xfb, 0x0a, 0x75, 0x07, 0xc6, 0x86, 0x5b, 0x02, 0x00, 0xeb,
+ 0x04, 0xb7, 0x12, 0xeb, 0x12, 0x88, 0x7e, 0x07, 0x80, 0xff, 0x12, 0x75,
+ 0x04, 0xc6, 0x46, 0x09, 0x1e, 0xb8, 0x07, 0x00, 0xe8, 0x24, 0xe9, 0xc3,
+ 0xff, 0x86, 0x48, 0x02, 0xc7, 0x86, 0x2a, 0x02, 0x06, 0x00, 0x8c, 0xd8,
+ 0x8e, 0xc0, 0x8d, 0xbe, 0xfc, 0x01, 0x8d, 0x77, 0x0e, 0xb9, 0x03, 0x00,
+ 0xf3, 0xa5, 0x80, 0x7e, 0x06, 0x48, 0x74, 0x08, 0xb8, 0x06, 0x00, 0xe8,
+ 0xfd, 0xe8, 0xeb, 0x30, 0xf6, 0x86, 0x6e, 0x02, 0x01, 0x74, 0x1f, 0x80,
+ 0x7e, 0x08, 0x16, 0x75, 0x19, 0xc6, 0x46, 0x09, 0x1a, 0xc6, 0x86, 0x72,
+ 0x02, 0x00, 0xc6, 0x86, 0x68, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83,
+ 0x26, 0x0c, 0x00, 0xfe, 0xeb, 0x0a, 0x80, 0x7e, 0x08, 0x18, 0x75, 0x04,
+ 0xc6, 0x46, 0x09, 0x1a, 0xc3, 0x8a, 0x4e, 0x06, 0x80, 0xbe, 0xa7, 0x02,
+ 0x01, 0x74, 0x02, 0xeb, 0x06, 0xb8, 0x06, 0x00, 0xe8, 0xb8, 0xe8, 0xc3,
+ 0x80, 0x7e, 0x06, 0x42, 0x75, 0x42, 0x8b, 0x47, 0x1a, 0x83, 0xf8, 0x00,
+ 0x75, 0x27, 0xf6, 0x86, 0x7e, 0x02, 0x01, 0x75, 0x18, 0xf7, 0x86, 0xf4,
+ 0x00, 0x00, 0x10, 0x74, 0x10, 0xb8, 0x02, 0x00, 0xe8, 0x7c, 0x10, 0xc6,
+ 0x46, 0x09, 0x1e, 0xc6, 0x46, 0x07, 0x02, 0xeb, 0x1b, 0xb8, 0x06, 0x00,
+ 0xe8, 0x84, 0xe8, 0xeb, 0x13, 0x3d, 0x00, 0x02, 0x75, 0x0e, 0xc6, 0x86,
+ 0x77, 0x02, 0x01, 0xe8, 0x74, 0x06, 0xbe, 0x2f, 0x46, 0xe8, 0xe0, 0xda,
+ 0xc3, 0xc7, 0x86, 0x2a, 0x02, 0x02, 0x00, 0x80, 0x7e, 0x06, 0x46, 0x75,
+ 0x2b, 0x8b, 0x47, 0x1a, 0x83, 0xf8, 0x00, 0x75, 0x10, 0xc6, 0x46, 0x07,
+ 0x48, 0x80, 0x7e, 0x08, 0x1c, 0x75, 0x19, 0xc6, 0x46, 0x09, 0x16, 0xeb,
+ 0x13, 0x86, 0xc4, 0x3d, 0x20, 0x80, 0x75, 0x0c, 0xc7, 0x86, 0x2a, 0x02,
+ 0x11, 0x00, 0xb8, 0x08, 0x00, 0xe8, 0x37, 0xe8, 0xc3, 0xc7, 0x86, 0x2a,
+ 0x02, 0x0f, 0x00, 0x80, 0x7e, 0x06, 0x44, 0x74, 0x06, 0x80, 0x7e, 0x06,
+ 0x42, 0x75, 0x08, 0xb8, 0x06, 0x00, 0xe8, 0x1e, 0xe8, 0xeb, 0x0d, 0xf6,
+ 0x86, 0x72, 0x02, 0x01, 0x74, 0x06, 0xbe, 0x3b, 0x46, 0xe8, 0x80, 0xda,
+ 0xc3, 0x80, 0x7e, 0x06, 0x44, 0x75, 0x14, 0xe8, 0x76, 0xd8, 0xc7, 0x44,
+ 0x02, 0x02, 0x00, 0x8d, 0x7e, 0x16, 0xe8, 0x89, 0xd8, 0xbe, 0xb7, 0x45,
+ 0xe8, 0x17, 0xdb, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x40, 0x00, 0x74, 0x18,
+ 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x20, 0x74, 0x10, 0x80, 0x7e, 0x06, 0x08,
+ 0x72, 0x0a, 0x80, 0x7e, 0x06, 0x0e, 0x77, 0x04, 0xc6, 0x46, 0x07, 0x14,
+ 0xc3, 0xff, 0x86, 0x4c, 0x02, 0xc7, 0x86, 0x2a, 0x02, 0x0b, 0x00, 0x8a,
+ 0x86, 0x54, 0x02, 0x88, 0x86, 0x80, 0x02, 0xc7, 0x86, 0xc2, 0x02, 0x00,
+ 0x00, 0xc6, 0x86, 0x61, 0x02, 0x00, 0x83, 0x8e, 0x06, 0x02, 0x20, 0x81,
+ 0xa6, 0x06, 0x02, 0xff, 0x2f, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xf6, 0x86,
+ 0x54, 0x02, 0x01, 0x74, 0x38, 0xc6, 0x86, 0x80, 0x02, 0x00, 0x8e, 0x46,
+ 0x02, 0x26, 0x81, 0x26, 0x24, 0x00, 0xff, 0x7f, 0x80, 0x7e, 0x0a, 0x00,
+ 0x75, 0x0a, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00,
+ 0x8a, 0xa6, 0x80, 0x02, 0x88, 0xa6, 0x54, 0x02, 0xe8, 0x25, 0xdc, 0x88,
+ 0x86, 0x54, 0x02, 0xc6, 0x46, 0x09, 0x0c, 0xc7, 0x86, 0xc6, 0x01, 0x00,
+ 0x01, 0x80, 0x7e, 0x06, 0x04, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x06, 0x80,
+ 0x7e, 0x08, 0x02, 0x75, 0x04, 0xc6, 0x46, 0x09, 0x0c, 0x80, 0x7e, 0x08,
+ 0x06, 0x74, 0x05, 0xc6, 0x86, 0x5a, 0x02, 0x01, 0x8d, 0x77, 0x0e, 0x8d,
+ 0xbe, 0xf4, 0x02, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x06, 0x00, 0xf3, 0xa6,
+ 0x74, 0x08, 0x77, 0x03, 0xe9, 0x95, 0x00, 0xe9, 0xfe, 0x00, 0xf6, 0x47,
+ 0x06, 0x08, 0x75, 0x59, 0x80, 0x7e, 0x08, 0x04, 0x75, 0x53, 0x8b, 0xb6,
+ 0xd4, 0x05, 0x8d, 0xbe, 0x0a, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03,
+ 0x00, 0xb8, 0x01, 0x00, 0xf3, 0xa7, 0x74, 0x02, 0xeb, 0x3e, 0xff, 0x86,
+ 0xb4, 0x02, 0x83, 0xbe, 0xb4, 0x02, 0x03, 0x72, 0x30, 0x83, 0xbe, 0xb2,
+ 0x02, 0x03, 0x72, 0x29, 0xc6, 0x46, 0x09, 0x02, 0xc6, 0x86, 0x80, 0x02,
+ 0x01, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x24, 0x00, 0x00, 0x80, 0x8a,
+ 0x86, 0x54, 0x02, 0x8a, 0xa6, 0x80, 0x02, 0x88, 0xa6, 0x54, 0x02, 0xe8,
+ 0x86, 0xdb, 0x88, 0x86, 0x54, 0x02, 0xe8, 0xb2, 0xf4, 0xe9, 0xec, 0x00,
+ 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x1d, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6,
+ 0x86, 0x6b, 0x02, 0x00, 0x8a, 0x86, 0x54, 0x02, 0x8a, 0xa6, 0x80, 0x02,
+ 0x88, 0xa6, 0x54, 0x02, 0xe8, 0x5d, 0xdb, 0x88, 0x86, 0x54, 0x02, 0xc6,
+ 0x46, 0x09, 0x0c, 0xb8, 0x00, 0x03, 0xe8, 0x03, 0xf5, 0xe9, 0xbc, 0x00,
+ 0x80, 0x7e, 0x08, 0x00, 0x75, 0x3d, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x75,
+ 0x16, 0xf6, 0x86, 0x68, 0x02, 0x01, 0x74, 0x16, 0xf6, 0x86, 0x5e, 0x02,
+ 0x01, 0x74, 0x08, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x01, 0x75, 0x16, 0xc6,
+ 0x46, 0x09, 0x0c, 0xe9, 0x92, 0x00, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74,
+ 0x9c, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x01, 0x74, 0x94, 0xc6, 0x46, 0x09,
+ 0x04, 0xff, 0x86, 0x4a, 0x02, 0xeb, 0x79, 0x80, 0x7e, 0x08, 0x0a, 0x75,
+ 0x73, 0xf6, 0x86, 0x5f, 0x02, 0x01, 0x75, 0x0e, 0xf7, 0x86, 0x12, 0x01,
+ 0x00, 0x01, 0x75, 0x06, 0xc6, 0x46, 0x09, 0x0c, 0xeb, 0x5e, 0xf7, 0x86,
+ 0x12, 0x01, 0x00, 0x01, 0x74, 0x56, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0x50,
+ 0x80, 0x7e, 0x08, 0x04, 0x75, 0x2c, 0xc6, 0x46, 0x09, 0x0c, 0x80, 0x7e,
+ 0x0a, 0x00, 0x75, 0x1d, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b,
+ 0x02, 0x00, 0x8a, 0x86, 0x54, 0x02, 0x8a, 0xa6, 0x80, 0x02, 0x88, 0xa6,
+ 0x54, 0x02, 0xe8, 0xb7, 0xda, 0x88, 0x86, 0x54, 0x02, 0xe8, 0x5f, 0xf1,
+ 0xeb, 0x1e, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x09, 0xf6, 0x86, 0x68, 0x02,
+ 0x01, 0x74, 0x02, 0xeb, 0xab, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x09, 0xf6,
+ 0x86, 0x5f, 0x02, 0x01, 0x75, 0x02, 0xeb, 0x9c, 0x8a, 0x86, 0x80, 0x02,
+ 0x88, 0x86, 0x54, 0x02, 0xc3, 0xc7, 0x86, 0xbc, 0x02, 0x02, 0x00, 0xff,
+ 0x86, 0x42, 0x02, 0xc7, 0x86, 0x2a, 0x02, 0x0c, 0x00, 0x80, 0x7e, 0x06,
+ 0x04, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x06, 0x75, 0x04, 0xc6, 0x46, 0x07,
+ 0x08, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x56, 0xf6, 0x86, 0x54, 0x02, 0x01,
+ 0x74, 0x3b, 0xc6, 0x86, 0x54, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x26, 0x24, 0x00, 0xff, 0x7f, 0xb8, 0x00, 0x02, 0xe8, 0xf9, 0xf3, 0xf6,
+ 0x86, 0x5e, 0x02, 0x01, 0x74, 0x0c, 0xbe, 0xbd, 0x45, 0xe8, 0xf8, 0xd7,
+ 0xbe, 0xdb, 0x45, 0xe8, 0xf2, 0xd7, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x0d,
+ 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xe8, 0x1f,
+ 0xda, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x34, 0xc6, 0x86, 0x58, 0x02,
+ 0x00, 0xc6, 0x86, 0x59, 0x02, 0x00, 0xe9, 0xc9, 0x00, 0x80, 0x7e, 0x08,
+ 0x0c, 0x75, 0x24, 0xc6, 0x46, 0x09, 0x00, 0xf6, 0x86, 0x5e, 0x02, 0x01,
+ 0x74, 0x16, 0xbe, 0xbd, 0x45, 0xe8, 0xb4, 0xd7, 0xbe, 0xdb, 0x45, 0xe8,
+ 0xae, 0xd7, 0xc6, 0x86, 0x58, 0x02, 0x00, 0xc6, 0x86, 0x59, 0x02, 0x00,
+ 0xe9, 0x9f, 0x00, 0x80, 0x7e, 0x08, 0x02, 0x75, 0xf7, 0xc7, 0x86, 0xc8,
+ 0x01, 0x00, 0x00, 0xc6, 0x46, 0x09, 0x00, 0xf6, 0x86, 0x5e, 0x02, 0x01,
+ 0x74, 0x0a, 0xc6, 0x86, 0x58, 0x02, 0x00, 0xc6, 0x86, 0x59, 0x02, 0x00,
+ 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xf4, 0x02, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9,
+ 0x06, 0x00, 0xf3, 0xa6, 0x74, 0x2e, 0xc6, 0x86, 0x54, 0x02, 0x00, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x26, 0x24, 0x00, 0xff, 0x7f, 0x80, 0x7e, 0x0a,
+ 0x00, 0x75, 0x0a, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02,
+ 0x00, 0xe8, 0x8c, 0xd9, 0xb8, 0x00, 0x02, 0xe8, 0x3a, 0xf3, 0xc6, 0x46,
+ 0x09, 0x00, 0xeb, 0x3e, 0x8e, 0x46, 0x02, 0x26, 0xa0, 0x1c, 0x00, 0xc6,
+ 0x46, 0x09, 0x00, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x55, 0x02,
+ 0x00, 0xc6, 0x86, 0x65, 0x02, 0x00, 0xe8, 0x63, 0xd9, 0x24, 0x07, 0xe8,
+ 0xde, 0xf5, 0xbe, 0x8d, 0x45, 0xe8, 0x18, 0xd7, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0x33, 0xc0, 0x8d, 0xbe, 0xee, 0x01, 0xab, 0xab, 0xab, 0xe8, 0x49, 0xf0,
+ 0xbe, 0xdb, 0x45, 0xe8, 0x02, 0xd7, 0x80, 0x7e, 0x06, 0x08, 0x75, 0x03,
+ 0xe8, 0x90, 0xf0, 0xc3, 0x8c, 0xd8, 0x8e, 0xc0, 0xff, 0x86, 0x50, 0x02,
+ 0xc7, 0x86, 0x2a, 0x02, 0x0f, 0x00, 0xf6, 0x86, 0xca, 0x01, 0x01, 0x74,
+ 0x3b, 0xb8, 0x9c, 0x56, 0xa3, 0x92, 0x56, 0x8d, 0x77, 0x0e, 0x8b, 0xf8,
+ 0xa5, 0xa5, 0xa5, 0xc7, 0x06, 0x9a, 0x56, 0x01, 0x00, 0xc6, 0x86, 0xcb,
+ 0x01, 0x00, 0x33, 0xff, 0xba, 0x02, 0x08, 0xe8, 0x24, 0xe8, 0xbf, 0x94,
+ 0x56, 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0x8d, 0x77, 0x0e, 0xbf, 0x94, 0x56,
+ 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x05, 0xe8, 0x8b, 0x04, 0xeb, 0x00,
+ 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xa5, 0xa5, 0xa5, 0x80, 0x7e,
+ 0x06, 0x04, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x08, 0x8b, 0x8e, 0xbc, 0x02,
+ 0xe3, 0x05, 0x49, 0x89, 0x8e, 0xbc, 0x02, 0xf7, 0x07, 0x3c, 0x00, 0x75,
+ 0x0a, 0xf6, 0x86, 0x68, 0x02, 0x01, 0x74, 0x03, 0xe8, 0x07, 0x02, 0xf6,
+ 0x86, 0x54, 0x02, 0x01, 0x75, 0x03, 0xe9, 0x93, 0x00, 0xbe, 0xdb, 0x45,
+ 0xe8, 0x69, 0xd6, 0xf7, 0x07, 0x00, 0x10, 0x75, 0x37, 0xc6, 0x86, 0x54,
+ 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x24, 0x00, 0xff, 0x7f,
+ 0xb8, 0x00, 0x02, 0xe8, 0x42, 0xf2, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74,
+ 0x06, 0xbe, 0xbd, 0x45, 0xe8, 0x41, 0xd6, 0x80, 0x7e, 0x0a, 0x00, 0x75,
+ 0x38, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xe8,
+ 0x6e, 0xd8, 0xeb, 0x29, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x33, 0xc6, 0x86,
+ 0x65, 0x02, 0x01, 0xc6, 0x86, 0x66, 0x02, 0x01, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0x33, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xab, 0xab, 0xab,
+ 0x8b, 0x86, 0x06, 0x02, 0xa9, 0x40, 0x00, 0x74, 0x02, 0xeb, 0x48, 0x83,
+ 0xc8, 0x40, 0x89, 0x86, 0x06, 0x02, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xeb,
+ 0x3a, 0x83, 0xa6, 0x06, 0x02, 0xbf, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0,
+ 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xa5, 0xa5, 0xa5, 0xeb, 0x23,
+ 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x06, 0xbe, 0xdb, 0x45, 0xe8, 0xcf,
+ 0xd5, 0xc6, 0x86, 0x67, 0x02, 0x00, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x0b,
+ 0xc6, 0x86, 0x67, 0x02, 0x01, 0xbe, 0xc3, 0x45, 0xe8, 0xb9, 0xd5, 0xc3,
+ 0xeb, 0x61, 0x8c, 0xd8, 0x8e, 0xc0, 0xc7, 0x86, 0x2a, 0x02, 0x0d, 0x00,
+ 0xf6, 0x86, 0xca, 0x01, 0x01, 0x74, 0x50, 0x33, 0xff, 0xba, 0x02, 0x08,
+ 0xe8, 0xff, 0xe6, 0x8b, 0x3e, 0x92, 0x56, 0xb9, 0x03, 0x00, 0xf3, 0xa7,
+ 0x75, 0x3d, 0x81, 0xff, 0xaa, 0x5d, 0x73, 0x6f, 0x89, 0x3e, 0x92, 0x56,
+ 0x8d, 0x77, 0x0e, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x74, 0x05, 0xc6, 0x86,
+ 0xcc, 0x01, 0x01, 0x81, 0xff, 0xaa, 0x5d, 0x73, 0x56, 0x89, 0x3e, 0x92,
+ 0x56, 0x8d, 0x77, 0x0e, 0xa5, 0xa5, 0xa5, 0xff, 0x06, 0x9a, 0x56, 0x8d,
+ 0x77, 0x0e, 0xbf, 0x94, 0x56, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x03,
+ 0xe8, 0x36, 0x03, 0x8a, 0x86, 0x06, 0x02, 0xa8, 0x40, 0x75, 0x3d, 0x80,
+ 0x7e, 0x06, 0x04, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x08, 0xf7, 0x07, 0x3c,
+ 0x00, 0x75, 0x3a, 0xf6, 0x86, 0x68, 0x02, 0x01, 0x74, 0x35, 0xf6, 0x86,
+ 0x54, 0x02, 0x01, 0x74, 0x07, 0xf6, 0x86, 0x65, 0x02, 0x01, 0x75, 0x27,
+ 0xe8, 0xb3, 0x00, 0xc7, 0x86, 0xbe, 0x02, 0x01, 0x00, 0xeb, 0x1c, 0xbf,
+ 0xa4, 0x5d, 0x33, 0xc0, 0xab, 0xab, 0xab, 0xe8, 0xf3, 0x02, 0xeb, 0xbb,
+ 0x24, 0xbf, 0x88, 0x86, 0x06, 0x02, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xeb,
+ 0xb6, 0xeb, 0x79, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x74, 0x3c, 0xf6, 0x86,
+ 0x65, 0x02, 0x01, 0x74, 0x19, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x12,
+ 0x83, 0xbe, 0xbc, 0x02, 0x00, 0x75, 0x0b, 0x80, 0x7e, 0x08, 0x00, 0x75,
+ 0x05, 0x83, 0x8e, 0xda, 0x02, 0x08, 0xc6, 0x86, 0x65, 0x02, 0x01, 0xc6,
+ 0x86, 0x66, 0x02, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0x77,
+ 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xab, 0xab, 0xab, 0xeb, 0x4b, 0xf6, 0x86,
+ 0x68, 0x02, 0x01, 0x74, 0x44, 0xf6, 0x86, 0x67, 0x02, 0x01, 0x75, 0x0d,
+ 0xc6, 0x86, 0x67, 0x02, 0x01, 0xbe, 0xc3, 0x45, 0xe8, 0xa5, 0xd4, 0xeb,
+ 0x30, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x12, 0x80, 0x7e, 0x08, 0x00,
+ 0x75, 0x0c, 0x83, 0xbe, 0xbc, 0x02, 0x00, 0x75, 0x05, 0x83, 0x8e, 0xda,
+ 0x02, 0x08, 0xeb, 0x15, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x74, 0x0e, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xa5, 0xa5,
+ 0xa5, 0xc3, 0x53, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe,
+ 0x0a, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x74,
+ 0x54, 0x8b, 0x44, 0xfe, 0x89, 0x45, 0xfe, 0xf3, 0xa5, 0xbb, 0xfe, 0x04,
+ 0xb9, 0x0b, 0x00, 0x8d, 0xb6, 0x0a, 0x03, 0xad, 0x8b, 0x14, 0x8b, 0x74,
+ 0x02, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0x89, 0x15, 0x89, 0x75, 0x02, 0x83,
+ 0xc3, 0x02, 0xe2, 0xf1, 0xf6, 0x86, 0xaa, 0x02, 0x01, 0x75, 0x26, 0x8b,
+ 0xb6, 0xd9, 0x05, 0x8d, 0xbe, 0xea, 0x01, 0xa5, 0xa5, 0x80, 0x7e, 0x06,
+ 0x08, 0x76, 0x0b, 0xc7, 0x86, 0xbe, 0x02, 0x04, 0x00, 0xe8, 0xad, 0xef,
+ 0xeb, 0x0b, 0xc6, 0x86, 0x84, 0x02, 0x01, 0xc7, 0x86, 0xbe, 0x02, 0x01,
+ 0x00, 0x5b, 0xc3, 0xb8, 0x80, 0x0a, 0xf6, 0x86, 0xa6, 0x02, 0x01, 0x75,
+ 0x45, 0xf6, 0x86, 0xa8, 0x02, 0x01, 0x75, 0x3e, 0xf7, 0x86, 0xf6, 0x00,
+ 0x10, 0x00, 0x75, 0x36, 0xf7, 0x07, 0x82, 0x00, 0x74, 0x2f, 0xc7, 0x86,
+ 0x2a, 0x02, 0x07, 0x00, 0xc6, 0x86, 0x16, 0x01, 0x00, 0x81, 0x8e, 0x06,
+ 0x02, 0x00, 0x01, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xf6, 0x86, 0xa7, 0x02,
+ 0x01, 0x75, 0x0c, 0x80, 0x7e, 0x06, 0x08, 0x72, 0x0c, 0x80, 0x7e, 0x06,
+ 0x0e, 0x77, 0x06, 0xb8, 0x0a, 0x00, 0xe8, 0x46, 0xe1, 0xc3, 0x89, 0x86,
+ 0xe2, 0x02, 0xe9, 0xb4, 0xeb, 0xf7, 0x07, 0x02, 0x00, 0x74, 0x0f, 0x80,
+ 0x7e, 0x06, 0x0c, 0x75, 0x09, 0xc6, 0x86, 0x60, 0x02, 0x01, 0xc6, 0x46,
+ 0x07, 0x0e, 0x8b, 0x86, 0x14, 0x02, 0x86, 0xe0, 0x8b, 0xb6, 0xfe, 0x05,
+ 0x0b, 0xf6, 0x74, 0x09, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x14, 0x02, 0x86,
+ 0xe0, 0x89, 0x86, 0xde, 0x02, 0x8b, 0xb6, 0xe5, 0x05, 0x0b, 0xf6, 0x74,
+ 0x07, 0xad, 0x86, 0xc4, 0x89, 0x86, 0x0c, 0x02, 0x8b, 0xb6, 0xea, 0x05,
+ 0x0b, 0xf6, 0x74, 0x05, 0x8b, 0xc6, 0xe8, 0xa2, 0x00, 0x8b, 0xb6, 0xef,
+ 0x05, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x08, 0x02,
+ 0x8b, 0xb6, 0xf4, 0x05, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, 0xc4, 0x89,
+ 0x86, 0xf8, 0x01, 0x8b, 0xb6, 0xf9, 0x05, 0x0b, 0xf6, 0x74, 0x07, 0xad,
+ 0x86, 0xc4, 0x89, 0x86, 0xf6, 0x01, 0x8b, 0x07, 0xa9, 0x02, 0x00, 0x75,
+ 0x07, 0xa8, 0x28, 0x74, 0x03, 0xe9, 0x71, 0xff, 0xc7, 0x86, 0xe2, 0x02,
+ 0x00, 0x01, 0xe9, 0x24, 0xeb, 0xc3, 0xf7, 0x07, 0x02, 0x02, 0x74, 0xf9,
+ 0x8b, 0x86, 0x14, 0x02, 0x86, 0xe0, 0x8b, 0xb6, 0x13, 0x06, 0x0b, 0xf6,
+ 0x74, 0x09, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x14, 0x02, 0x86, 0xe0, 0x89,
+ 0x86, 0xde, 0x02, 0x8b, 0xb6, 0x04, 0x06, 0x0b, 0xf6, 0x74, 0x07, 0xad,
+ 0x86, 0xc4, 0x89, 0x86, 0x0c, 0x02, 0x8b, 0xb6, 0x09, 0x06, 0x0b, 0xf6,
+ 0x74, 0x05, 0x8b, 0xc6, 0xe8, 0x20, 0x00, 0x8b, 0xb6, 0x0e, 0x06, 0x0b,
+ 0xf6, 0x74, 0x07, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x08, 0x02, 0x80, 0x7e,
+ 0x06, 0x0c, 0x75, 0x96, 0xc6, 0x86, 0x60, 0x02, 0x01, 0xc6, 0x46, 0x07,
+ 0x0e, 0xeb, 0x8b, 0x53, 0x57, 0x8c, 0xdb, 0x8e, 0xc3, 0xbb, 0x14, 0x05,
+ 0xb9, 0x0a, 0x00, 0x8b, 0xf0, 0xad, 0x8b, 0x34, 0x8b, 0x3f, 0x03, 0xfd,
+ 0xab, 0x89, 0x35, 0x83, 0xc3, 0x02, 0xe2, 0xf4, 0x5f, 0x5b, 0xc3, 0x68,
+ 0xf0, 0x29, 0xeb, 0x08, 0x68, 0x58, 0x2a, 0xeb, 0x03, 0x68, 0x9a, 0x2a,
+ 0xf7, 0x07, 0x82, 0x02, 0x74, 0x1c, 0x8b, 0x86, 0x14, 0x02, 0x86, 0xe0,
+ 0x8b, 0xb6, 0x4a, 0x06, 0x0b, 0xf6, 0x74, 0x09, 0xad, 0x86, 0xe0, 0x89,
+ 0x86, 0x14, 0x02, 0x86, 0xe0, 0x89, 0x86, 0xde, 0x02, 0xc3, 0x83, 0xc4,
+ 0x02, 0xc3, 0x8b, 0x07, 0xf6, 0x86, 0x63, 0x01, 0x01, 0x74, 0x1e, 0xa9,
+ 0x00, 0x20, 0x74, 0x40, 0x56, 0x57, 0xe8, 0x5b, 0xd0, 0xc7, 0x44, 0x02,
+ 0x02, 0x00, 0x8d, 0x7e, 0x16, 0xe8, 0x6e, 0xd0, 0xbe, 0xb7, 0x45, 0xe8,
+ 0xfc, 0xd2, 0x5f, 0x5e, 0xc3, 0x80, 0x7e, 0x06, 0x08, 0x75, 0x21, 0xa9,
+ 0x00, 0x10, 0x74, 0x1c, 0xa9, 0x3c, 0x00, 0x75, 0x17, 0xff, 0x86, 0xc8,
+ 0x02, 0xff, 0x86, 0xc6, 0x02, 0x83, 0xbe, 0xc6, 0x02, 0x02, 0x72, 0x05,
+ 0xc6, 0x46, 0x07, 0x0a, 0xc3, 0xe8, 0xb7, 0xeb, 0xc3, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0x33, 0xc0, 0x8b, 0x3e, 0x92, 0x56, 0x83, 0xc7, 0x06, 0x81, 0xff,
+ 0xaa, 0x5d, 0x72, 0x03, 0xbf, 0xa4, 0x5d, 0xab, 0xab, 0xab, 0xf6, 0x86,
+ 0xcc, 0x01, 0x01, 0x74, 0x18, 0xc6, 0x86, 0xcb, 0x01, 0x01, 0xe8, 0xf7,
+ 0xcf, 0xc7, 0x44, 0x02, 0x05, 0x00, 0x8d, 0x7e, 0x16, 0xe8, 0x0a, 0xd0,
+ 0xc6, 0x86, 0xca, 0x01, 0x00, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x08, 0x00,
+ 0x74, 0x06, 0xbe, 0x65, 0x46, 0xe8, 0xd8, 0xd1, 0x8d, 0xb6, 0x6c, 0x15,
+ 0x8e, 0x46, 0x02, 0x8a, 0x1c, 0xf6, 0xc3, 0x80, 0x75, 0x0d, 0x80, 0xfb,
+ 0x10, 0x77, 0x14, 0x32, 0xff, 0xd1, 0xe3, 0xff, 0xa7, 0xdc, 0x04, 0xc7,
+ 0x86, 0x0a, 0x01, 0x00, 0x00, 0xc3, 0xb8, 0x00, 0x80, 0xeb, 0x08, 0xb8,
+ 0x00, 0x80, 0xeb, 0x03, 0xb8, 0x00, 0x20, 0x8d, 0xb6, 0x6c, 0x15, 0x89,
+ 0x44, 0x02, 0x80, 0x0c, 0x80, 0xb8, 0x40, 0x60, 0x8e, 0xc0, 0xc7, 0x86,
+ 0x0a, 0x01, 0x00, 0x00, 0x26, 0xc7, 0x06, 0x70, 0x00, 0x08, 0x00, 0xc3,
+ 0xeb, 0xe1, 0xb8, 0x04, 0x00, 0x80, 0xbe, 0x06, 0x01, 0x01, 0x75, 0xf4,
+ 0xb8, 0x05, 0x00, 0x80, 0xbe, 0x07, 0x01, 0x01, 0x74, 0xea, 0xc6, 0x86,
+ 0x08, 0x01, 0x01, 0xc6, 0x86, 0xcd, 0x01, 0x00, 0xc6, 0x86, 0x09, 0x01,
+ 0x00, 0x8b, 0x86, 0xf8, 0x00, 0x89, 0x86, 0xf6, 0x00, 0x8d, 0xb6, 0x76,
+ 0x15, 0xb8, 0x03, 0x00, 0xf6, 0x04, 0x80, 0x75, 0xc7, 0x33, 0xc0, 0x39,
+ 0x04, 0x75, 0x1e, 0x39, 0x44, 0x02, 0x75, 0x19, 0x39, 0x44, 0x04, 0x75,
+ 0x14, 0x8b, 0x86, 0x00, 0x01, 0x89, 0x04, 0x8b, 0x86, 0x02, 0x01, 0x89,
+ 0x44, 0x02, 0x8b, 0x86, 0x04, 0x01, 0x89, 0x44, 0x04, 0xad, 0x8b, 0x14,
+ 0x8b, 0x74, 0x02, 0x89, 0x86, 0xd0, 0x01, 0x89, 0x96, 0xd2, 0x01, 0x89,
+ 0xb6, 0xd4, 0x01, 0x8e, 0x46, 0x02, 0x50, 0xe8, 0xfc, 0xcd, 0x26, 0xa3,
+ 0x1e, 0x00, 0x8b, 0xc2, 0xe8, 0xf3, 0xcd, 0x26, 0xa3, 0x20, 0x00, 0x8b,
+ 0xc6, 0xe8, 0xea, 0xcd, 0x26, 0xa3, 0x22, 0x00, 0x58, 0xbb, 0x2c, 0x05,
+ 0xb9, 0x13, 0x00, 0x1e, 0x07, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0x89, 0x15,
+ 0x89, 0x75, 0x02, 0x83, 0xc3, 0x02, 0xe2, 0xf1, 0xbb, 0x28, 0x05, 0x8d,
+ 0x96, 0x84, 0x15, 0xb8, 0x02, 0x00, 0x8b, 0x3f, 0x03, 0xfd, 0x8b, 0xf2,
+ 0xb9, 0x09, 0x00, 0xf3, 0xa5, 0x83, 0xc3, 0x02, 0x48, 0x75, 0xef, 0xf7,
+ 0x86, 0xf6, 0x00, 0x08, 0x00, 0x74, 0x06, 0xbe, 0x65, 0x46, 0xe8, 0xbf,
+ 0xd0, 0x8d, 0xb6, 0x6c, 0x15, 0x8b, 0x44, 0x08, 0xf7, 0x86, 0xf4, 0x00,
+ 0x00, 0x20, 0x75, 0x0a, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x0c, 0x75, 0x02,
+ 0xeb, 0x03, 0x25, 0xff, 0x7b, 0x89, 0x86, 0x12, 0x01, 0x89, 0x86, 0x14,
+ 0x01, 0xf7, 0x86, 0x12, 0x01, 0x01, 0x00, 0x74, 0x08, 0xc7, 0x06, 0xb5,
+ 0x45, 0x58, 0x02, 0xeb, 0x06, 0xc7, 0x06, 0xb5, 0x45, 0x08, 0x07, 0x8e,
+ 0x46, 0x02, 0x26, 0x8b, 0x1e, 0x28, 0x00, 0x81, 0xe3, 0xff, 0xf4, 0xa9,
+ 0x04, 0x00, 0x74, 0x04, 0x81, 0xcb, 0x00, 0x08, 0xa9, 0x02, 0x00, 0x74,
+ 0x04, 0x81, 0xcb, 0x00, 0x03, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x28,
+ 0x00, 0x8d, 0xb6, 0x80, 0x15, 0xe8, 0x02, 0x02, 0x8d, 0xb6, 0x7c, 0x15,
+ 0xe8, 0x20, 0x00, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x74, 0x03, 0xe8, 0x13,
+ 0x14, 0xc6, 0x86, 0x07, 0x01, 0x01, 0xe8, 0x5f, 0x05, 0xe9, 0x90, 0xfe,
+ 0x56, 0x83, 0xc6, 0x08, 0xe8, 0x04, 0x00, 0x5e, 0xe9, 0x85, 0xfe, 0x8e,
+ 0x46, 0x02, 0xb8, 0xc0, 0x00, 0xe8, 0x0e, 0xcd, 0x26, 0xa3, 0x3a, 0x00,
+ 0x8b, 0x04, 0x0d, 0x80, 0x00, 0x89, 0x86, 0xd6, 0x01, 0xe8, 0xfe, 0xcc,
+ 0x26, 0xa3, 0x3c, 0x00, 0x8b, 0x44, 0x02, 0x89, 0x86, 0xd8, 0x01, 0xe8,
+ 0xf0, 0xcc, 0x26, 0xa3, 0x3e, 0x00, 0xc3, 0x83, 0x8e, 0x1e, 0x01, 0x01,
+ 0xc6, 0x86, 0x16, 0x01, 0x00, 0x8a, 0x46, 0x06, 0x3c, 0x00, 0x74, 0x1b,
+ 0x3c, 0x10, 0x74, 0x17, 0x3c, 0x12, 0x74, 0x13, 0x3c, 0x0e, 0x74, 0x17,
+ 0x3c, 0x48, 0x74, 0x19, 0xe8, 0x35, 0xfe, 0xb8, 0x0f, 0x00, 0xe8, 0x6a,
+ 0xdd, 0xeb, 0x35, 0xe8, 0x2a, 0xfe, 0xe8, 0xc7, 0x03, 0xeb, 0x2d, 0xc6,
+ 0x46, 0x07, 0x10, 0xeb, 0x20, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, 0x56,
+ 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08, 0xc6,
+ 0x86, 0x6d, 0x01, 0x01, 0xe8, 0xef, 0x13, 0xc6, 0x46, 0x07, 0x12, 0xeb,
+ 0x00, 0xc6, 0x46, 0x09, 0x1e, 0xe9, 0xf8, 0xfd, 0xc3, 0xc6, 0x86, 0x06,
+ 0x01, 0x00, 0xb8, 0x05, 0x00, 0x80, 0xbe, 0x07, 0x01, 0x01, 0x75, 0x03,
+ 0xe9, 0xe8, 0xfd, 0x8b, 0x44, 0x08, 0x89, 0x86, 0xf4, 0x00, 0x8b, 0x44,
+ 0x0a, 0xa9, 0x00, 0x02, 0x74, 0x03, 0x0d, 0x00, 0x01, 0x89, 0x86, 0xf6,
+ 0x00, 0x89, 0x86, 0xf8, 0x00, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x04, 0x74,
+ 0x06, 0xb8, 0x01, 0x00, 0xe9, 0xc0, 0xfd, 0x8b, 0x44, 0x12, 0x0b, 0xc0,
+ 0x75, 0x16, 0xb8, 0x18, 0x47, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x01, 0x75,
+ 0x0b, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x02, 0x75, 0x03, 0xb8, 0xc6, 0x11,
+ 0x89, 0x86, 0xfa, 0x00, 0x89, 0x86, 0x32, 0x01, 0x8d, 0xbe, 0x30, 0x04,
+ 0x8b, 0x44, 0x0c, 0x89, 0x05, 0x89, 0x86, 0x00, 0x01, 0x8b, 0x44, 0x0e,
+ 0x89, 0x45, 0x02, 0x89, 0x86, 0x02, 0x01, 0x8b, 0x44, 0x10, 0x89, 0x45,
+ 0x04, 0x89, 0x86, 0x04, 0x01, 0x80, 0xbe, 0x62, 0x01, 0x01, 0x75, 0x21,
+ 0x8b, 0x44, 0x0c, 0x89, 0x86, 0xb0, 0x03, 0x89, 0x86, 0xb6, 0x03, 0x8b,
+ 0x44, 0x0e, 0x89, 0x86, 0xb2, 0x03, 0x89, 0x86, 0xb8, 0x03, 0x8b, 0x44,
+ 0x10, 0x89, 0x86, 0xb4, 0x03, 0x89, 0x86, 0xba, 0x03, 0x8e, 0x46, 0x02,
+ 0x8b, 0x86, 0xfa, 0x00, 0x26, 0xa3, 0x12, 0x00, 0x8b, 0x44, 0x14, 0x26,
+ 0xa3, 0x2a, 0x00, 0x8b, 0x44, 0x16, 0x25, 0xff, 0xf4, 0x83, 0xc8, 0x30,
+ 0x26, 0xa3, 0x28, 0x00, 0x8b, 0x86, 0xf4, 0x00, 0x25, 0xff, 0xfe, 0xc1,
+ 0xe8, 0x08, 0x89, 0x86, 0x24, 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x04, 0x00,
+ 0x74, 0x0f, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0xc6, 0x06, 0x8a,
+ 0x56, 0x01, 0xe8, 0xbe, 0x0f, 0x80, 0xbe, 0x62, 0x01, 0x01, 0x75, 0x01,
+ 0xc3, 0xc6, 0x86, 0x06, 0x01, 0x01, 0xe9, 0xfb, 0xfc, 0x56, 0x8c, 0xd8,
+ 0x8e, 0xc0, 0x8d, 0x7c, 0x08, 0x8d, 0xb6, 0xd0, 0x02, 0xb9, 0x05, 0x00,
+ 0x8b, 0xd1, 0xf3, 0xa5, 0x8d, 0xbe, 0xd0, 0x02, 0x33, 0xc0, 0x8b, 0xca,
+ 0xf3, 0xab, 0x81, 0xa6, 0x06, 0x02, 0x7f, 0xdf, 0x5e, 0xe9, 0xd4, 0xfc,
+ 0x56, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x7c, 0x08, 0x8d, 0xb6, 0x3c, 0x02,
+ 0xb9, 0x0c, 0x00, 0x8b, 0xd1, 0xf3, 0xa5, 0x8d, 0xbe, 0x3c, 0x02, 0x33,
+ 0xc0, 0x8b, 0xca, 0xf3, 0xab, 0x5e, 0xe9, 0xb3, 0xfc, 0x83, 0xc6, 0x08,
+ 0xe8, 0x03, 0x00, 0xe9, 0xaa, 0xfc, 0x06, 0x8e, 0x46, 0x02, 0x8b, 0x04,
+ 0x89, 0x86, 0xda, 0x01, 0xe8, 0x2f, 0xcb, 0x26, 0xa3, 0x26, 0x00, 0x8b,
+ 0x44, 0x02, 0x23, 0x86, 0xf8, 0x01, 0xe8, 0x21, 0xcb, 0x25, 0xff, 0x7f,
+ 0x26, 0x8b, 0x0e, 0x24, 0x00, 0x81, 0xe1, 0x00, 0x80, 0x0b, 0xc1, 0x26,
+ 0xa3, 0x24, 0x00, 0xe8, 0x0c, 0xcb, 0x89, 0x86, 0xdc, 0x01, 0x07, 0xc3,
+ 0xb8, 0x05, 0x00, 0x80, 0xbe, 0x07, 0x01, 0x01, 0x75, 0x03, 0xe9, 0x6a,
+ 0xfc, 0xc6, 0x86, 0x62, 0x01, 0x01, 0xe8, 0x68, 0xfe, 0xc6, 0x86, 0x62,
+ 0x01, 0x00, 0xc6, 0x86, 0x06, 0x01, 0x01, 0xe9, 0x52, 0xfc, 0xb8, 0x11,
+ 0x00, 0xc6, 0x86, 0x62, 0x01, 0x00, 0xe9, 0x4a, 0xfc, 0xc3, 0x8b, 0xd8,
+ 0x26, 0x8b, 0x04, 0x50, 0x33, 0xc0, 0x50, 0x23, 0xc3, 0x8b, 0xc8, 0x26,
+ 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b, 0xc1, 0x58, 0x75, 0x3c,
+ 0x05, 0x55, 0x55, 0x73, 0xe9, 0xb8, 0x01, 0x00, 0x50, 0x23, 0xc3, 0x8b,
+ 0xc8, 0x26, 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b, 0xc1, 0x58,
+ 0x75, 0x22, 0xd1, 0xc0, 0x73, 0xea, 0xf7, 0xd0, 0x50, 0x23, 0xc3, 0x8b,
+ 0xc8, 0x26, 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b, 0xc1, 0x58,
+ 0x75, 0x0a, 0xd1, 0xc0, 0x72, 0xea, 0xf8, 0x58, 0x26, 0x89, 0x04, 0xc3,
+ 0xf9, 0xeb, 0xf8, 0x8b, 0x44, 0x08, 0x25, 0xff, 0x7b, 0x89, 0x86, 0x12,
+ 0x01, 0x89, 0x86, 0x14, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x8b, 0x1e, 0x28,
+ 0x00, 0x81, 0xe3, 0xff, 0xf4, 0xa9, 0x04, 0x00, 0x74, 0x04, 0x81, 0xcb,
+ 0x00, 0x08, 0xa9, 0x02, 0x00, 0x74, 0x04, 0x81, 0xcb, 0x00, 0x03, 0x8e,
+ 0x46, 0x02, 0x26, 0x89, 0x1e, 0x28, 0x00, 0xe9, 0xb6, 0xfb, 0x8b, 0x44,
+ 0x08, 0x89, 0x86, 0x28, 0x02, 0x86, 0xc4, 0x89, 0x86, 0x62, 0x05, 0xf6,
+ 0x86, 0x73, 0x02, 0x01, 0x75, 0x05, 0xc6, 0x86, 0x74, 0x02, 0x01, 0xc6,
+ 0x86, 0x73, 0x02, 0x00, 0xe9, 0x95, 0xfb, 0x8b, 0x44, 0x08, 0x89, 0x86,
+ 0x30, 0x01, 0xbe, 0x53, 0x46, 0xe8, 0x34, 0xcd, 0xe9, 0x85, 0xfb, 0x8b,
+ 0x44, 0x08, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x2a, 0x00, 0xe9, 0x78, 0xfb,
+ 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x48, 0x75, 0x13,
+ 0x80, 0x7e, 0x08, 0x00, 0x74, 0x06, 0x80, 0x7e, 0x08, 0x16, 0x75, 0x07,
+ 0x8d, 0x5c, 0x08, 0xe8, 0xc6, 0xe9, 0xc3, 0xb8, 0x00, 0x10, 0xe9, 0x56,
+ 0xfb, 0xb8, 0x04, 0x00, 0xf6, 0x86, 0x07, 0x01, 0x01, 0x74, 0x1e, 0x8e,
+ 0x46, 0x02, 0x26, 0xa1, 0x28, 0x00, 0x8b, 0x5c, 0x08, 0x81, 0xe3, 0xff,
+ 0xf4, 0x25, 0x00, 0x0b, 0x0b, 0xd8, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e,
+ 0x28, 0x00, 0xb8, 0x00, 0x20, 0xe9, 0x2b, 0xfb, 0xb8, 0x05, 0x00, 0xf6,
+ 0x86, 0x07, 0x01, 0x01, 0x75, 0x11, 0xfa, 0xe8, 0x9a, 0xce, 0xfa, 0xe8,
+ 0x16, 0xfb, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x72, 0x00, 0x02, 0xe9,
+ 0x0d, 0xfb, 0xe9, 0x07, 0xfb, 0x8b, 0xd0, 0xb8, 0x01, 0x00, 0xe9, 0xa4,
+ 0x01, 0xc3, 0x80, 0xbe, 0xad, 0x02, 0x01, 0x74, 0x0e, 0x80, 0xbe, 0x07,
+ 0x01, 0x01, 0x75, 0xf1, 0x80, 0xbe, 0x09, 0x01, 0x01, 0x74, 0xea, 0xc6,
+ 0x86, 0x09, 0x01, 0x01, 0xc6, 0x86, 0xad, 0x02, 0x00, 0x8e, 0x46, 0x02,
+ 0x26, 0xf7, 0x06, 0x00, 0x00, 0x02, 0x00, 0x74, 0x08, 0xbe, 0x71, 0x46,
+ 0xe8, 0x79, 0xcc, 0xeb, 0x03, 0x0d, 0x00, 0x01, 0x80, 0xbe, 0xa5, 0x02,
+ 0x01, 0x74, 0x0a, 0x80, 0xbe, 0xa7, 0x02, 0x01, 0x74, 0x03, 0x0d, 0x00,
+ 0x04, 0x80, 0xbe, 0xa5, 0x02, 0x01, 0x74, 0x0a, 0x80, 0xbe, 0xa6, 0x02,
+ 0x01, 0x74, 0x03, 0x0d, 0x00, 0x02, 0xf7, 0x86, 0xa1, 0x02, 0x01, 0x00,
+ 0x74, 0x03, 0x0d, 0x00, 0x08, 0xa9, 0x00, 0x80, 0x74, 0x1d, 0xc7, 0x86,
+ 0x2e, 0x01, 0x02, 0x00, 0xf6, 0x86, 0x2c, 0x01, 0x01, 0x74, 0x1d, 0x53,
+ 0xbb, 0x40, 0x60, 0x8e, 0xc3, 0x26, 0x81, 0x0e, 0x72, 0x00, 0x00, 0x02,
+ 0x5b, 0xeb, 0x0d, 0x8a, 0x56, 0x06, 0xd0, 0xe2, 0xd0, 0xe2, 0xd0, 0xe2,
+ 0x24, 0x0f, 0x0a, 0xc2, 0x89, 0x86, 0x34, 0x02, 0x8b, 0xd0, 0xb8, 0x02,
+ 0x00, 0xe9, 0x92, 0x00, 0x8b, 0x96, 0x1e, 0x01, 0x8b, 0x86, 0x12, 0x01,
+ 0xa9, 0x00, 0x02, 0x74, 0x06, 0xf7, 0xc2, 0x05, 0x80, 0x74, 0x0e, 0xc6,
+ 0x86, 0x07, 0x01, 0x00, 0xc6, 0x86, 0x16, 0x01, 0x00, 0x81, 0xca, 0x80,
+ 0x00, 0x33, 0xc0, 0x89, 0x86, 0x1e, 0x01, 0x89, 0x96, 0x20, 0x01, 0xc7,
+ 0x86, 0x34, 0x02, 0x00, 0x00, 0xf7, 0xc2, 0x01, 0x00, 0x75, 0x22, 0x83,
+ 0xbe, 0x2e, 0x01, 0x03, 0x74, 0x1b, 0xc7, 0x86, 0x2e, 0x01, 0x03, 0x00,
+ 0xf6, 0x86, 0x2c, 0x01, 0x01, 0x74, 0x0e, 0x53, 0xbb, 0x40, 0x60, 0x8e,
+ 0xc3, 0x26, 0x81, 0x0e, 0x72, 0x00, 0x00, 0x02, 0x5b, 0xb8, 0x03, 0x00,
+ 0xeb, 0x34, 0x3b, 0xc0, 0x74, 0x00, 0x8b, 0xd0, 0xb8, 0x04, 0x00, 0xeb,
+ 0x29, 0xc3, 0xc6, 0x86, 0xca, 0x01, 0x00, 0xc6, 0x86, 0xcb, 0x01, 0x00,
+ 0x55, 0x33, 0xed, 0xbe, 0x84, 0x55, 0xe8, 0x8f, 0xcb, 0x5d, 0xb8, 0x05,
+ 0x00, 0xeb, 0x0f, 0xb8, 0x06, 0x00, 0xeb, 0x0a, 0xb8, 0x07, 0x00, 0xeb,
+ 0x05, 0xb8, 0x08, 0x00, 0xeb, 0x00, 0x8b, 0xb6, 0x60, 0x01, 0x3b, 0xb6,
+ 0x5e, 0x01, 0x75, 0x0a, 0xf7, 0x86, 0x58, 0x15, 0x00, 0x80, 0x74, 0x02,
+ 0xeb, 0x5f, 0x8b, 0x8e, 0x5e, 0x01, 0x41, 0x80, 0xe1, 0x07, 0x3b, 0xf1,
+ 0x75, 0x20, 0x46, 0x83, 0xe6, 0x07, 0x89, 0xb6, 0x60, 0x01, 0x51, 0x8b,
+ 0xce, 0xd1, 0xe1, 0xd1, 0xe1, 0x8d, 0xb6, 0x3e, 0x01, 0x03, 0xf1, 0x8b,
+ 0x0c, 0x83, 0xf9, 0x05, 0x74, 0x03, 0x0d, 0x00, 0x01, 0x59, 0x83, 0xf8,
+ 0x04, 0x75, 0x1a, 0x51, 0xb9, 0x08, 0x00, 0x8d, 0xb6, 0x3e, 0x01, 0x39,
+ 0x04, 0x74, 0x08, 0x83, 0xc6, 0x04, 0xe2, 0xf7, 0x59, 0xeb, 0x06, 0x89,
+ 0x54, 0x02, 0x59, 0xeb, 0x13, 0x89, 0x8e, 0x5e, 0x01, 0xd1, 0xe1, 0xd1,
+ 0xe1, 0x8d, 0xb6, 0x3e, 0x01, 0x03, 0xf1, 0x89, 0x04, 0x89, 0x54, 0x02,
+ 0xc3, 0x8d, 0xb6, 0x58, 0x15, 0x89, 0x54, 0x06, 0xc7, 0x44, 0x04, 0x08,
+ 0x00, 0x3c, 0x05, 0x75, 0x05, 0xc7, 0x44, 0x04, 0x06, 0x00, 0x25, 0xff,
+ 0x7f, 0x89, 0x04, 0xb8, 0x40, 0x60, 0x8e, 0xc0, 0x26, 0xc7, 0x06, 0x70,
+ 0x00, 0x00, 0x20, 0xc3, 0x8b, 0x86, 0x14, 0x01, 0x89, 0x86, 0x12, 0x01,
+ 0xc6, 0x46, 0x09, 0x1e, 0xc6, 0x46, 0x08, 0x1e, 0xc7, 0x86, 0x28, 0x01,
+ 0x00, 0x00, 0xc7, 0x86, 0x2a, 0x01, 0x00, 0x00, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0x33, 0xc0, 0x8d, 0xbe, 0xe0, 0x01, 0xb9, 0x2b, 0x00, 0xf3, 0xab, 0xc7,
+ 0x86, 0x26, 0x02, 0xff, 0xff, 0xb0, 0x02, 0xe8, 0x1d, 0xce, 0xf7, 0x86,
+ 0xf6, 0x00, 0x80, 0x00, 0x74, 0x0c, 0xb8, 0x05, 0x00, 0xe8, 0x13, 0x00,
+ 0xc6, 0x46, 0x07, 0x42, 0xeb, 0x0c, 0xb8, 0x02, 0x00, 0xe8, 0x07, 0x00,
+ 0xc6, 0x46, 0x07, 0x02, 0xeb, 0x00, 0xc3, 0x50, 0xb0, 0x00, 0x88, 0x86,
+ 0xa5, 0x02, 0x88, 0x86, 0xa6, 0x02, 0x88, 0x86, 0xa7, 0x02, 0x88, 0x86,
+ 0xa8, 0x02, 0x88, 0x86, 0xaa, 0x02, 0x88, 0x86, 0xa9, 0x02, 0x58, 0x9c,
+ 0xfa, 0x83, 0xf8, 0x02, 0x74, 0x13, 0x83, 0xf8, 0x05, 0x74, 0x0c, 0xc7,
+ 0x46, 0x12, 0x26, 0x1d, 0xc7, 0x46, 0x14, 0x26, 0x1d, 0xeb, 0x42, 0xeb,
+ 0x21, 0xc6, 0x86, 0xa5, 0x02, 0x01, 0xc6, 0x86, 0xa9, 0x02, 0x01, 0xc6,
+ 0x86, 0xaa, 0x02, 0x00, 0xc7, 0x46, 0x12, 0x0a, 0x32, 0xc7, 0x46, 0x14,
+ 0x37, 0x2f, 0xc7, 0x86, 0xba, 0x01, 0x2c, 0x00, 0xeb, 0x1f, 0xc6, 0x86,
+ 0xa7, 0x02, 0x01, 0xc6, 0x86, 0xa9, 0x02, 0x00, 0xc6, 0x86, 0xaa, 0x02,
+ 0x01, 0xc7, 0x46, 0x12, 0x0e, 0x32, 0xc7, 0x46, 0x14, 0x3b, 0x2f, 0xc7,
+ 0x86, 0xba, 0x01, 0x2c, 0x00, 0x0e, 0xe8, 0x02, 0x00, 0xeb, 0x01, 0xcf,
+ 0xc3, 0x8c, 0x00, 0x84, 0x46, 0xbc, 0x02, 0x96, 0x00, 0xba, 0x46, 0x14,
+ 0x00, 0x96, 0x00, 0xce, 0x46, 0x08, 0x07, 0x96, 0x00, 0x08, 0x47, 0x6e,
+ 0x00, 0x78, 0x00, 0x88, 0x49, 0x00, 0x00, 0x6e, 0x00, 0xc2, 0x47, 0xf4,
+ 0x01, 0x6e, 0x00, 0xf2, 0x47, 0x08, 0x07, 0x6e, 0x00, 0x30, 0x4b, 0x05,
+ 0x00, 0xaa, 0x00, 0x36, 0x48, 0xfa, 0x00, 0x8c, 0x00, 0xac, 0x48, 0x02,
+ 0x00, 0x8c, 0x00, 0x8c, 0x47, 0x3c, 0x00, 0x78, 0x00, 0x18, 0x49, 0x04,
+ 0x01, 0x96, 0x00, 0x44, 0x49, 0x64, 0x00, 0x96, 0x00, 0x68, 0x49, 0xdc,
+ 0x05, 0xbe, 0x00, 0x8e, 0x4a, 0xf4, 0x01, 0xbe, 0x00, 0x8e, 0x4a, 0x32,
+ 0x00, 0xa0, 0x00, 0xb4, 0x4b, 0xf4, 0x01, 0xbe, 0x00, 0xb8, 0x4a, 0xf4,
+ 0x01, 0x82, 0x00, 0xe6, 0x4d, 0x19, 0x00, 0x6e, 0x00, 0x9b, 0x4b, 0x14,
+ 0x00, 0x78, 0x00, 0xcc, 0x4a, 0xc4, 0x09, 0x6e, 0x00, 0xe0, 0x4a, 0x02,
+ 0x00, 0x78, 0x00, 0xec, 0x4c, 0xf0, 0x00, 0x6e, 0x00, 0x0b, 0x4c, 0x04,
+ 0x00, 0xa0, 0x00, 0x22, 0x4c, 0xbc, 0x02, 0x6e, 0x00, 0x34, 0x4c, 0x08,
+ 0x07, 0x6e, 0x00, 0x42, 0x4c, 0xe8, 0x03, 0x6e, 0x00, 0x54, 0x4c, 0x14,
+ 0x00, 0x96, 0x00, 0x60, 0x4c, 0x64, 0x00, 0xa0, 0x00, 0xfa, 0x4c, 0xf4,
+ 0x01, 0xc8, 0x00, 0x70, 0x48, 0x02, 0x00, 0x6e, 0x00, 0x88, 0x4c, 0x04,
+ 0x00, 0x8c, 0x00, 0xca, 0x4c, 0x14, 0x00, 0xb4, 0x00, 0xf2, 0x4e, 0x64,
+ 0x00, 0xa0, 0x00, 0x0b, 0x4e, 0x05, 0x00, 0xc8, 0x00, 0x20, 0x4e, 0x03,
+ 0x00, 0xd2, 0x00, 0x72, 0x4e, 0xf4, 0x01, 0xd2, 0x00, 0x84, 0x4e, 0x4c,
+ 0x04, 0xdc, 0x00, 0x9e, 0x4e, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x80, 0xbe, 0x54, 0x02,
+ 0x01, 0x75, 0x28, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x22, 0xf6, 0x86, 0x65,
+ 0x02, 0x01, 0x74, 0x1c, 0xe8, 0x3e, 0xe2, 0xbe, 0x8d, 0x45, 0xe8, 0xf7,
+ 0xc8, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0xbe, 0xee, 0x01, 0xab,
+ 0xab, 0xab, 0xc6, 0x86, 0x65, 0x02, 0x00, 0xc3, 0xe8, 0xa4, 0xe4, 0xeb,
+ 0xdf, 0x90, 0x8a, 0x46, 0x08, 0x3c, 0x0a, 0x75, 0x0b, 0xf6, 0x86, 0x5e,
+ 0x02, 0x01, 0x74, 0x04, 0xc6, 0x46, 0x09, 0x04, 0xc3, 0x90, 0x80, 0xbe,
+ 0xa6, 0x02, 0x01, 0x74, 0x32, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x2c, 0x80,
+ 0x7e, 0x06, 0x0c, 0x75, 0x0f, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x08,
+ 0xb8, 0x07, 0x00, 0xe8, 0x39, 0xd6, 0xeb, 0x17, 0xf6, 0x86, 0x5e, 0x02,
+ 0x01, 0x74, 0x10, 0xf6, 0x86, 0x59, 0x02, 0x01, 0x75, 0x09, 0xc6, 0x86,
+ 0x59, 0x02, 0x01, 0xc6, 0x46, 0x09, 0x08, 0xc3, 0x8a, 0x4e, 0x06, 0x8a,
+ 0x56, 0x08, 0x80, 0xf9, 0x06, 0x74, 0x71, 0x80, 0xf9, 0x08, 0x74, 0x05,
+ 0x80, 0xf9, 0x0a, 0x75, 0x0a, 0x80, 0xfa, 0x0c, 0x74, 0x62, 0x80, 0xfa,
+ 0x04, 0x74, 0x5d, 0x80, 0xfa, 0x0c, 0x74, 0x05, 0x80, 0xfa, 0x04, 0x75,
+ 0x52, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x74, 0x4b, 0xe8, 0x07, 0x03, 0xf6,
+ 0x86, 0x61, 0x02, 0x01, 0x74, 0x0b, 0x81, 0x8e, 0x06, 0x02, 0x00, 0x80,
+ 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc6, 0x46, 0x09, 0x06, 0x81, 0x8e, 0x06,
+ 0x02, 0x00, 0x50, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc6, 0x86, 0x6a, 0x02,
+ 0x01, 0xc6, 0x86, 0x69, 0x02, 0x01, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xe8,
+ 0x6a, 0xca, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0xbe,
+ 0x99, 0x45, 0xe8, 0x1b, 0xc8, 0xbe, 0xc3, 0x45, 0xe8, 0x15, 0xc8, 0xc3,
+ 0xb8, 0x07, 0x00, 0xe8, 0x9d, 0xd5, 0xeb, 0xf7, 0x80, 0xbe, 0xa5, 0x02,
+ 0x01, 0x74, 0x02, 0xeb, 0x2b, 0x80, 0x7e, 0x06, 0x10, 0x75, 0x06, 0xc6,
+ 0x46, 0x07, 0x12, 0xeb, 0x1f, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x19, 0xc6,
+ 0x86, 0x69, 0x02, 0x01, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xe8, 0x24, 0xca,
+ 0xbe, 0x05, 0x46, 0xe8, 0xde, 0xc7, 0xbe, 0x0b, 0x46, 0xe8, 0xd8, 0xc7,
+ 0xc3, 0x90, 0xf6, 0x86, 0x5f, 0x02, 0x01, 0x74, 0x28, 0xc6, 0x86, 0x5f,
+ 0x02, 0x00, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x06, 0xc6, 0x46, 0x09, 0x04,
+ 0xeb, 0x17, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x11, 0xc6, 0x86, 0x69, 0x02,
+ 0x01, 0xe8, 0xf0, 0xc9, 0xbe, 0xc3, 0x45, 0xe8, 0xaa, 0xc7, 0xe8, 0x45,
+ 0xe0, 0xc3, 0x8a, 0x46, 0x06, 0x3c, 0x04, 0x75, 0x2e, 0xf7, 0x86, 0xf6,
+ 0x00, 0x00, 0x02, 0x75, 0x1e, 0xe8, 0x40, 0xd6, 0xc6, 0x86, 0x92, 0x02,
+ 0x00, 0x8b, 0x86, 0xf8, 0x00, 0x89, 0x86, 0xf6, 0x00, 0xc6, 0x46, 0x07,
+ 0x06, 0xc6, 0x46, 0x06, 0x06, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0x16, 0xb8,
+ 0x0d, 0x00, 0xe8, 0x02, 0xd5, 0xeb, 0x0e, 0x3c, 0x08, 0x72, 0x0a, 0x3c,
+ 0x0c, 0x77, 0x06, 0xb8, 0x05, 0x00, 0xe8, 0xf2, 0xd4, 0xc3, 0x80, 0x7e,
+ 0x08, 0x00, 0x75, 0x33, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x75, 0x2c, 0xf6,
+ 0x86, 0x5e, 0x02, 0x01, 0x74, 0x25, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06,
+ 0x14, 0x00, 0x03, 0x00, 0x74, 0x11, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26,
+ 0x14, 0x00, 0x03, 0xbe, 0xbd, 0x45, 0xe8, 0x33, 0xc7, 0xeb, 0x08, 0xc6,
+ 0x46, 0x09, 0x04, 0xff, 0x86, 0x4a, 0x02, 0xc3, 0x80, 0x7e, 0x08, 0x18,
+ 0x75, 0x0e, 0xbe, 0x41, 0x46, 0xe8, 0x1c, 0xc7, 0xe8, 0xc3, 0x01, 0xe8,
+ 0xb4, 0xdf, 0xeb, 0x00, 0xc3, 0xf6, 0x86, 0x7c, 0x02, 0x01, 0x75, 0x1e,
+ 0x80, 0xbe, 0x68, 0x02, 0x01, 0x75, 0x17, 0xc6, 0x46, 0x07, 0x12, 0xc6,
+ 0x46, 0x09, 0x1e, 0x83, 0x8e, 0x06, 0x02, 0x08, 0x83, 0x8e, 0x1e, 0x01,
+ 0x02, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc3, 0x90, 0x80, 0x7e, 0x08, 0x00,
+ 0x75, 0x35, 0x80, 0xbe, 0x5b, 0x02, 0x01, 0x75, 0x58, 0x80, 0xbe, 0x54,
+ 0x02, 0x01, 0x74, 0x1f, 0xe8, 0x41, 0xe0, 0x80, 0x7e, 0x06, 0x0a, 0x75,
+ 0x16, 0xc6, 0x86, 0x63, 0x02, 0x01, 0xc6, 0x46, 0x07, 0x0c, 0xf7, 0x86,
+ 0xf6, 0x00, 0x00, 0x40, 0x75, 0x05, 0xc6, 0x86, 0x5e, 0x02, 0x01, 0xc3,
+ 0xbe, 0xc3, 0x45, 0xe8, 0xb2, 0xc6, 0xc3, 0x8a, 0x46, 0x08, 0x3c, 0x04,
+ 0x75, 0x0e, 0xbe, 0xc3, 0x45, 0xe8, 0xa4, 0xc6, 0xff, 0x86, 0xb2, 0x02,
+ 0xe8, 0x73, 0xdf, 0xc3, 0x3c, 0x06, 0x75, 0xdf, 0xf6, 0x86, 0x5f, 0x02,
+ 0x01, 0x75, 0xd8, 0xbe, 0xc3, 0x45, 0xe8, 0x8b, 0xc6, 0xe8, 0x26, 0xdf,
+ 0xc3, 0xc6, 0x86, 0x66, 0x02, 0x01, 0xc3, 0x90, 0x80, 0xbe, 0xa6, 0x02,
+ 0x01, 0x74, 0x22, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0x1b, 0xff, 0x86, 0xb8,
+ 0x02, 0x83, 0xbe, 0xb8, 0x02, 0x04, 0x77, 0x0a, 0xbe, 0xcf, 0x45, 0xe8,
+ 0x62, 0xc6, 0xe8, 0x70, 0xe0, 0xc3, 0xb8, 0x09, 0x00, 0xe8, 0xe7, 0xd3,
+ 0xc3, 0xeb, 0xfd, 0x90, 0x80, 0x7e, 0x08, 0x02, 0x75, 0x1d, 0x80, 0xbe,
+ 0x5e, 0x02, 0x01, 0x74, 0x08, 0xb8, 0x05, 0x00, 0xe8, 0xd0, 0xd3, 0xeb,
+ 0x0e, 0xff, 0x86, 0x4a, 0x02, 0xc6, 0x46, 0x09, 0x04, 0xb8, 0x00, 0x01,
+ 0xe8, 0x25, 0xe2, 0xc3, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x16, 0x80, 0xbe,
+ 0x54, 0x02, 0x01, 0x74, 0x07, 0x80, 0xbe, 0x5e, 0x02, 0x00, 0x74, 0x08,
+ 0xff, 0x86, 0x4a, 0x02, 0xc6, 0x46, 0x09, 0x04, 0xc3, 0xe9, 0xb8, 0x00,
+ 0xf6, 0x86, 0xaa, 0x02, 0x01, 0x75, 0x07, 0xf6, 0x86, 0x5e, 0x02, 0x01,
+ 0x74, 0xef, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x80, 0x74, 0x06, 0xbe, 0xa5,
+ 0x45, 0xe8, 0xf4, 0xc5, 0x8d, 0xbe, 0xd0, 0x02, 0x8c, 0xd9, 0x8e, 0xc1,
+ 0xb9, 0x05, 0x00, 0x33, 0xc0, 0xf3, 0xaf, 0x74, 0xd0, 0x80, 0xbe, 0xa5,
+ 0x02, 0x01, 0x74, 0x45, 0x80, 0xbe, 0xa6, 0x02, 0x01, 0x74, 0x5f, 0x80,
+ 0xbe, 0xa7, 0x02, 0x01, 0x74, 0x09, 0x80, 0xbe, 0xa8, 0x02, 0x01, 0x74,
+ 0x51, 0xeb, 0x6d, 0xc7, 0x86, 0xb6, 0x02, 0x04, 0x00, 0x81, 0x8e, 0x06,
+ 0x02, 0x00, 0x20, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xf6, 0x86, 0x6e, 0x02,
+ 0x01, 0x74, 0x14, 0x80, 0x7e, 0x08, 0x16, 0x75, 0x0e, 0xc6, 0x86, 0x56,
+ 0x02, 0x00, 0xe8, 0xca, 0xdf, 0xc7, 0x86, 0x2a, 0x02, 0x03, 0x00, 0xeb,
+ 0x3f, 0xc7, 0x86, 0xb6, 0x02, 0x04, 0x00, 0xc6, 0x86, 0x56, 0x02, 0x00,
+ 0xe8, 0xb4, 0xdf, 0xc7, 0x86, 0x2a, 0x02, 0x03, 0x00, 0x81, 0x8e, 0x06,
+ 0x02, 0x00, 0x20, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xeb, 0x1e, 0xc7, 0x86,
+ 0xb6, 0x02, 0x04, 0x00, 0x81, 0x8e, 0x06, 0x02, 0x00, 0x20, 0xc6, 0x86,
+ 0x85, 0x02, 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x80, 0x75, 0x05, 0xc6,
+ 0x86, 0x56, 0x02, 0x00, 0xc3, 0x90, 0xb8, 0x00, 0x02, 0xc7, 0x86, 0x32,
+ 0x02, 0x06, 0x00, 0x80, 0xbe, 0x61, 0x02, 0x01, 0x74, 0x37, 0xf6, 0x86,
+ 0xa7, 0x02, 0x01, 0x75, 0x07, 0xf6, 0x86, 0xa8, 0x02, 0x01, 0x74, 0x05,
+ 0xb8, 0x00, 0x05, 0xeb, 0x24, 0xb8, 0x00, 0x04, 0xc7, 0x86, 0x32, 0x02,
+ 0x04, 0x00, 0x8a, 0x4e, 0x08, 0x80, 0xf9, 0x0c, 0x74, 0x13, 0xb8, 0x00,
+ 0x04, 0x80, 0xbe, 0x5a, 0x02, 0x01, 0x74, 0x09, 0xb8, 0x00, 0x03, 0xc7,
+ 0x86, 0x32, 0x02, 0x07, 0x00, 0x89, 0x86, 0x00, 0x03, 0xc3, 0x80, 0x7e,
+ 0x08, 0x08, 0x74, 0x23, 0x8a, 0x46, 0x06, 0x3c, 0x04, 0x72, 0x1c, 0x3c,
+ 0x48, 0x74, 0x04, 0x3c, 0x0e, 0x77, 0x14, 0xf6, 0x86, 0x5d, 0x02, 0x01,
+ 0x74, 0x0d, 0xf6, 0x86, 0x5c, 0x02, 0x01, 0x74, 0x06, 0xb8, 0x0c, 0x00,
+ 0xe8, 0x70, 0xd2, 0xc3, 0xc6, 0x86, 0x5d, 0x02, 0x01, 0x8e, 0x46, 0x02,
+ 0x26, 0x81, 0x26, 0x04, 0x00, 0xff, 0xf7, 0xe8, 0xd6, 0x02, 0xc3, 0x90,
+ 0x80, 0x7e, 0x06, 0x02, 0x74, 0x06, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x06,
+ 0xb8, 0x01, 0x00, 0xe8, 0x49, 0xd2, 0xc3, 0x90, 0x51, 0x52, 0x56, 0x33,
+ 0xd2, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xe8, 0xeb, 0xc6, 0x8d, 0xb6, 0xa6,
+ 0x01, 0x8d, 0xbe, 0xac, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5,
+ 0xc6, 0x86, 0x83, 0x02, 0x00, 0x32, 0xc0, 0xe8, 0x52, 0xe3, 0xc6, 0x86,
+ 0x68, 0x01, 0x02, 0xc7, 0x86, 0x66, 0x01, 0x20, 0x03, 0xbe, 0xb7, 0x45,
+ 0xe8, 0x81, 0xc4, 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0x8e, 0x46,
+ 0x02, 0x26, 0xc7, 0x06, 0x1c, 0x00, 0x00, 0x00, 0xe8, 0x1d, 0xde, 0x5e,
+ 0x5a, 0x59, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x02, 0x74, 0x0e, 0x80, 0x7e,
+ 0x06, 0x44, 0x74, 0x08, 0x80, 0x7e, 0x08, 0x08, 0x74, 0x02, 0xeb, 0x56,
+ 0xfe, 0x8e, 0x68, 0x01, 0x80, 0x8e, 0x68, 0x01, 0x00, 0x74, 0x45, 0xbe,
+ 0xb7, 0x45, 0xe8, 0x43, 0xc4, 0xe8, 0xac, 0xbe, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x0e, 0x0c, 0x00, 0x00, 0x01, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x26, 0x0c, 0x00, 0xff, 0xfe, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x1c,
+ 0x00, 0x00, 0x00, 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0xc6, 0x86,
+ 0x86, 0x02, 0x01, 0x83, 0xbe, 0x66, 0x01, 0x01, 0x75, 0x05, 0xe8, 0xa2,
+ 0xdd, 0xeb, 0x0b, 0xe8, 0xb6, 0xdd, 0xeb, 0x06, 0xb8, 0x01, 0x00, 0xe8,
+ 0x8d, 0xd1, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x80, 0x00, 0x74, 0x10, 0x80,
+ 0x7e, 0x06, 0x14, 0x75, 0x0a, 0xb8, 0x05, 0x00, 0xe8, 0x60, 0xf9, 0xc6,
+ 0x46, 0x07, 0x42, 0xc3, 0x80, 0xbe, 0xa6, 0x02, 0x01, 0x74, 0x4e, 0xc6,
+ 0x86, 0x6c, 0x02, 0x00, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x2c, 0xf6, 0x86,
+ 0x6d, 0x02, 0x01, 0x74, 0x25, 0xe9, 0xa6, 0xcf, 0xbe, 0xc9, 0x45, 0xe8,
+ 0xc2, 0xc3, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08,
+ 0x26, 0x83, 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01,
+ 0x01, 0xe8, 0xe6, 0x07, 0xeb, 0x16, 0x80, 0x7e, 0x06, 0x10, 0x75, 0x10,
+ 0xc6, 0x46, 0x09, 0x00, 0xc6, 0x86, 0x54, 0x02, 0x00, 0xc6, 0x86, 0x68,
+ 0x02, 0x00, 0xeb, 0xc8, 0xc3, 0xeb, 0xfd, 0x80, 0x7e, 0x06, 0x42, 0x75,
+ 0x0f, 0xc7, 0x86, 0xce, 0x02, 0x05, 0x00, 0xbe, 0x47, 0x46, 0xe8, 0x7b,
+ 0xc3, 0xe8, 0xbc, 0xdf, 0xc3, 0x90, 0x80, 0x7e, 0x08, 0x18, 0x74, 0x06,
+ 0x80, 0x7e, 0x08, 0x1a, 0x75, 0x04, 0xc6, 0x46, 0x09, 0x1c, 0xc3, 0x90,
+ 0x80, 0x7e, 0x06, 0x46, 0x75, 0x06, 0xb8, 0x05, 0x00, 0xe8, 0xe7, 0xd0,
+ 0xc3, 0x90, 0x80, 0x7e, 0x08, 0x1c, 0x75, 0x0a, 0x80, 0x7e, 0x06, 0x48,
+ 0x75, 0x04, 0xc6, 0x46, 0x07, 0x44, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x42,
+ 0x75, 0x04, 0xc6, 0x46, 0x07, 0x44, 0xc3, 0x90, 0xf6, 0x86, 0x72, 0x02,
+ 0x01, 0x74, 0x20, 0xf6, 0x46, 0x06, 0x46, 0x75, 0x11, 0xc6, 0x86, 0x6b,
+ 0x02, 0x01, 0xc6, 0x86, 0x76, 0x02, 0x01, 0xe8, 0x5e, 0xc5, 0xff, 0x86,
+ 0xcc, 0x02, 0xe8, 0x83, 0xdc, 0xbe, 0x35, 0x46, 0xe8, 0x11, 0xc3, 0xc3,
+ 0x80, 0x7e, 0x06, 0x42, 0x75, 0x3b, 0xf6, 0x86, 0x77, 0x02, 0x01, 0x75,
+ 0x34, 0x83, 0xbe, 0xce, 0x02, 0x00, 0x74, 0x0f, 0xff, 0x8e, 0xce, 0x02,
+ 0xbe, 0x47, 0x46, 0xe8, 0xf2, 0xc2, 0xe8, 0x33, 0xdf, 0xeb, 0x1e, 0xf7,
+ 0x86, 0xf4, 0x00, 0x00, 0x10, 0x74, 0x10, 0xb8, 0x02, 0x00, 0xe8, 0x56,
+ 0xf8, 0xc6, 0x46, 0x09, 0x1e, 0xc6, 0x46, 0x07, 0x02, 0xeb, 0x06, 0xb8,
+ 0x06, 0x00, 0xe8, 0x5e, 0xd0, 0xc3, 0x80, 0x7e, 0x06, 0x46, 0x75, 0x1a,
+ 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xc6, 0x86, 0x76, 0x02, 0x01, 0xe8, 0xfb,
+ 0xc4, 0xff, 0x86, 0xcc, 0x02, 0xbe, 0x4d, 0x46, 0xe8, 0xb1, 0xc2, 0xe8,
+ 0x34, 0xdf, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x44, 0x75, 0x06, 0xb8, 0x05,
+ 0x00, 0xe8, 0x2f, 0xd0, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x46, 0x75, 0x08,
+ 0xb8, 0x06, 0x00, 0xe8, 0x21, 0xd0, 0xeb, 0x17, 0x80, 0x7e, 0x08, 0x16,
+ 0x75, 0x11, 0xc7, 0x86, 0x2a, 0x02, 0x04, 0x00, 0xf6, 0x86, 0x6e, 0x02,
+ 0x01, 0x74, 0x04, 0xc6, 0x46, 0x09, 0x18, 0xc3, 0x8e, 0x46, 0x02, 0x26,
+ 0x8b, 0x16, 0x02, 0x00, 0xf7, 0xc2, 0x02, 0x00, 0x74, 0x14, 0x8b, 0xc2,
+ 0x83, 0xe0, 0xfd, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x02, 0x00, 0x8e, 0x46,
+ 0x02, 0x26, 0x89, 0x16, 0x02, 0x00, 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26,
+ 0xf7, 0x06, 0x14, 0x00, 0x03, 0x00, 0x74, 0x10, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x26, 0x14, 0x00, 0x03, 0xc6, 0x86, 0x55, 0x02, 0x01, 0xeb, 0x00,
+ 0xf6, 0x86, 0x55, 0x02, 0x01, 0x75, 0x14, 0x80, 0x7e, 0x08, 0x00, 0x75,
+ 0x0e, 0xc6, 0x46, 0x09, 0x02, 0xff, 0x86, 0x40, 0x02, 0x81, 0x8e, 0xda,
+ 0x02, 0x00, 0x02, 0xc6, 0x86, 0x55, 0x02, 0x00, 0xc3, 0x90, 0xf7, 0x86,
+ 0xf4, 0x00, 0x00, 0x10, 0x75, 0x15, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06,
+ 0x14, 0x00, 0x03, 0x00, 0x74, 0x09, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26,
+ 0x14, 0x00, 0x03, 0xc3, 0x80, 0xbe, 0xab, 0x02, 0x01, 0x75, 0x3d, 0x8e,
+ 0x46, 0x02, 0x26, 0xf7, 0x06, 0x14, 0x00, 0x08, 0x00, 0x74, 0x2c, 0xf6,
+ 0x86, 0x5d, 0x02, 0x01, 0x74, 0x2a, 0xf6, 0x86, 0x5c, 0x02, 0x01, 0x75,
+ 0x23, 0xc7, 0x86, 0x2a, 0x02, 0x0a, 0x00, 0xbe, 0xe1, 0x45, 0xf7, 0x86,
+ 0x12, 0x01, 0x20, 0x00, 0x74, 0x03, 0xbe, 0xe7, 0x45, 0xe8, 0xc0, 0xc1,
+ 0xc6, 0x86, 0x5c, 0x02, 0x01, 0xeb, 0x05, 0xc6, 0x86, 0x5c, 0x02, 0x00,
+ 0xc3, 0x90, 0xbe, 0xf9, 0x45, 0xe8, 0xac, 0xc1, 0x33, 0xc0, 0x87, 0x86,
+ 0xc2, 0x02, 0x0b, 0xc0, 0x75, 0x14, 0x80, 0xbe, 0x61, 0x02, 0x00, 0x74,
+ 0x0d, 0xc6, 0x86, 0x61, 0x02, 0x00, 0x80, 0xa6, 0x07, 0x02, 0x7f, 0xe8,
+ 0x38, 0xfc, 0xc3, 0x80, 0x7e, 0x06, 0x12, 0x75, 0x0d, 0xc6, 0x86, 0x08,
+ 0x01, 0x01, 0xc6, 0x86, 0x09, 0x01, 0x00, 0xe8, 0x9a, 0xf6, 0xc3, 0x90,
+ 0xf6, 0x86, 0x6e, 0x01, 0x01, 0x74, 0x15, 0x80, 0xbe, 0x70, 0x01, 0x03,
+ 0x73, 0x07, 0xc6, 0x86, 0x6c, 0x01, 0x01, 0xeb, 0x23, 0xc6, 0x86, 0x6e,
+ 0x01, 0x00, 0xeb, 0x1c, 0xf6, 0x86, 0x6f, 0x01, 0x01, 0x74, 0x15, 0x80,
+ 0xbe, 0x71, 0x01, 0x03, 0x73, 0x07, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xeb,
+ 0x07, 0xc6, 0x86, 0x6f, 0x01, 0x00, 0xeb, 0x00, 0xc3, 0xf7, 0x86, 0x58,
+ 0x15, 0x00, 0x80, 0x75, 0x07, 0x83, 0xbe, 0x58, 0x15, 0x05, 0x74, 0x05,
+ 0xc6, 0x86, 0xca, 0x01, 0x01, 0xc3, 0xe8, 0x9d, 0xcf, 0xc3, 0xf7, 0x86,
+ 0xf6, 0x00, 0x08, 0x00, 0x74, 0x09, 0xe8, 0x92, 0xf5, 0xbe, 0x6b, 0x46,
+ 0xe8, 0x15, 0xc1, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x08, 0x00, 0x74, 0x11,
+ 0x81, 0x8e, 0x06, 0x02, 0x00, 0x04, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xb8,
+ 0x10, 0x00, 0xe8, 0x8a, 0xce, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06,
+ 0x00, 0x00, 0x02, 0x00, 0x74, 0x41, 0xbb, 0x00, 0x03, 0x8b, 0x47, 0x14,
+ 0x83, 0xf8, 0x00, 0x74, 0x36, 0x3b, 0x86, 0x2a, 0x01, 0x74, 0x0c, 0x89,
+ 0x86, 0x2a, 0x01, 0xc7, 0x86, 0x28, 0x01, 0x00, 0x00, 0xeb, 0x24, 0xff,
+ 0x86, 0x28, 0x01, 0x83, 0xbe, 0x28, 0x01, 0x02, 0x72, 0x19, 0x83, 0xbe,
+ 0x28, 0x01, 0x18, 0x73, 0x0c, 0x80, 0x7e, 0x08, 0x00, 0x74, 0x0c, 0x80,
+ 0x7e, 0x08, 0x16, 0x74, 0x06, 0xb8, 0x10, 0x00, 0xe8, 0x3c, 0xce, 0xbe,
+ 0x71, 0x46, 0xe8, 0xa7, 0xc0, 0xc3, 0x8b, 0x86, 0x30, 0x01, 0x88, 0xa6,
+ 0x2c, 0x01, 0x86, 0x86, 0x2d, 0x01, 0x32, 0x86, 0x2d, 0x01, 0x74, 0x0f,
+ 0xf6, 0x46, 0x06, 0x0e, 0x74, 0x06, 0xf6, 0x46, 0x06, 0x48, 0x75, 0x03,
+ 0xe8, 0x94, 0xbb, 0xc3, 0xf6, 0x86, 0x90, 0x02, 0x01, 0x74, 0x0a, 0xa8,
+ 0x24, 0x74, 0x06, 0xc7, 0x86, 0x9d, 0x02, 0x05, 0x00, 0xf6, 0x86, 0xa9,
+ 0x02, 0x01, 0x74, 0x09, 0x80, 0xbe, 0x5e, 0x02, 0x01, 0x75, 0x58, 0xeb,
+ 0x09, 0xf6, 0x86, 0x6e, 0x02, 0x01, 0x75, 0x10, 0xeb, 0x52, 0x80, 0x7e,
+ 0x06, 0x0e, 0x74, 0x02, 0xeb, 0x45, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x3f,
+ 0xa8, 0x01, 0x74, 0x05, 0x83, 0x8e, 0xda, 0x02, 0x10, 0xa8, 0x04, 0x74,
+ 0x05, 0x83, 0x8e, 0xda, 0x02, 0x04, 0xa8, 0x08, 0x74, 0x05, 0x83, 0x8e,
+ 0xda, 0x02, 0x40, 0xa8, 0x20, 0x74, 0x10, 0x81, 0x8e, 0xda, 0x02, 0x00,
+ 0x01, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x75, 0x03, 0xe8, 0x2f, 0xc4, 0xa8,
+ 0x40, 0x74, 0x05, 0x83, 0x8e, 0xda, 0x02, 0x01, 0xa8, 0x80, 0x74, 0x03,
+ 0xe8, 0x52, 0x00, 0xa9, 0x00, 0x01, 0x75, 0x01, 0xc3, 0x50, 0x80, 0x7e,
+ 0x08, 0x0a, 0x75, 0x06, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0x1b, 0x80, 0x7e,
+ 0x08, 0x00, 0x75, 0x23, 0xc6, 0x46, 0x09, 0x02, 0xff, 0x86, 0x40, 0x02,
+ 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x06, 0x81, 0x8e, 0xda, 0x02, 0x00,
+ 0x02, 0xc6, 0x86, 0x69, 0x02, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e,
+ 0x0c, 0x00, 0x10, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x08, 0x00, 0x00,
+ 0x00, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x08, 0x00, 0x00, 0x01, 0x58,
+ 0xc3, 0x83, 0x8e, 0xda, 0x02, 0x20, 0x83, 0x7e, 0x06, 0x08, 0x75, 0x13,
+ 0x8b, 0x8e, 0xc4, 0x02, 0x41, 0x89, 0x8e, 0xc4, 0x02, 0x80, 0xf9, 0x02,
+ 0x75, 0x05, 0x50, 0xe8, 0x35, 0xd9, 0x58, 0xc3, 0x50, 0x53, 0x51, 0x8a,
+ 0x4e, 0x06, 0x80, 0xf9, 0x0e, 0x74, 0x1e, 0x80, 0xf9, 0x48, 0x74, 0x19,
+ 0x80, 0xbe, 0x54, 0x02, 0x01, 0x74, 0x46, 0x80, 0xf9, 0x08, 0x72, 0x41,
+ 0x80, 0xf9, 0x0e, 0x77, 0x3c, 0xb8, 0x02, 0x00, 0xe8, 0x04, 0xcd, 0xeb,
+ 0x34, 0xc7, 0x86, 0x2a, 0x02, 0x05, 0x00, 0xc6, 0x86, 0x61, 0x02, 0x01,
+ 0x8a, 0x46, 0x08, 0x3c, 0x06, 0x74, 0x26, 0x3c, 0x02, 0x74, 0x51, 0x3c,
+ 0x08, 0x74, 0x1a, 0x3c, 0x04, 0x74, 0x16, 0xf6, 0x86, 0xa7, 0x02, 0x01,
+ 0x75, 0x13, 0xf6, 0x86, 0xa8, 0x02, 0x01, 0x75, 0x0c, 0xc6, 0x46, 0x09,
+ 0x04, 0xff, 0x86, 0x4a, 0x02, 0x59, 0x5b, 0x58, 0xc3, 0x8b, 0x86, 0x06,
+ 0x02, 0xf6, 0xc4, 0x80, 0x75, 0x0c, 0x80, 0xcc, 0x80, 0x89, 0x86, 0x06,
+ 0x02, 0xc6, 0x86, 0x85, 0x02, 0x01, 0x81, 0xbe, 0x00, 0x03, 0x00, 0x02,
+ 0x74, 0xdf, 0xc7, 0x86, 0x00, 0x03, 0x00, 0x02, 0xf6, 0x86, 0xa5, 0x02,
+ 0x01, 0x74, 0xd2, 0xe8, 0xac, 0xd7, 0xeb, 0xcd, 0xb8, 0x00, 0x01, 0xe8,
+ 0xfa, 0xda, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0xc0, 0xc6, 0x46, 0x09,
+ 0x04, 0xeb, 0xba, 0xfa, 0xc7, 0x06, 0x30, 0x00, 0x0c, 0x0f, 0x8c, 0x0e,
+ 0x32, 0x00, 0xb8, 0x00, 0x00, 0xe7, 0x06, 0xb8, 0xea, 0x09, 0xe7, 0x00,
+ 0xb8, 0x09, 0x00, 0xe7, 0x06, 0xb0, 0x7f, 0xe8, 0x92, 0xbb, 0xc6, 0x06,
+ 0x8b, 0x56, 0x80, 0xfb, 0xc3, 0xf7, 0x86, 0x82, 0x01, 0x01, 0x00, 0x74,
+ 0x1a, 0xc7, 0x86, 0x82, 0x01, 0x00, 0x00, 0xf6, 0x86, 0x6e, 0x01, 0x01,
+ 0x74, 0x0d, 0xc6, 0x86, 0x6e, 0x01, 0x00, 0xbe, 0x5f, 0x46, 0xe8, 0x65,
+ 0xbf, 0xeb, 0x00, 0xf7, 0x86, 0x8a, 0x01, 0x01, 0x00, 0x74, 0x45, 0xc7,
+ 0x86, 0x8a, 0x01, 0x00, 0x00, 0xf6, 0x86, 0x6f, 0x01, 0x01, 0x74, 0x0d,
+ 0xc6, 0x86, 0x6f, 0x01, 0x00, 0xbe, 0x5f, 0x46, 0xe8, 0x43, 0xbf, 0xeb,
+ 0x2b, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x48, 0x75,
+ 0x1f, 0xf6, 0x86, 0x5d, 0x02, 0x01, 0x74, 0x18, 0xf6, 0x86, 0x5c, 0x02,
+ 0x01, 0x75, 0x11, 0xc6, 0x86, 0x5c, 0x02, 0x01, 0xc7, 0x86, 0x2a, 0x02,
+ 0x0a, 0x00, 0xb8, 0x0c, 0x00, 0xe8, 0xf3, 0xcb, 0xc3, 0xb9, 0x01, 0x00,
+ 0x33, 0xdb, 0x8b, 0xaf, 0x52, 0x55, 0x8e, 0x46, 0x02, 0x26, 0x8b, 0x16,
+ 0x14, 0x00, 0x83, 0xe2, 0x08, 0x26, 0xa1, 0x32, 0x00, 0xd1, 0xe8, 0xd0,
+ 0xe8, 0x86, 0xe0, 0xf7, 0xc2, 0x08, 0x00, 0x75, 0x02, 0xeb, 0x67, 0x83,
+ 0xbe, 0x74, 0x01, 0x00, 0x75, 0x04, 0x88, 0xa6, 0x78, 0x01, 0x81, 0xbe,
+ 0x74, 0x01, 0xbc, 0x02, 0x72, 0x06, 0xc7, 0x86, 0x74, 0x01, 0xf4, 0x01,
+ 0x8a, 0xc4, 0x2a, 0xe4, 0x83, 0xf8, 0x7f, 0x75, 0x12, 0x8b, 0x86, 0x74,
+ 0x01, 0xbe, 0xeb, 0x09, 0xf7, 0xe6, 0xbe, 0x20, 0x00, 0xf7, 0xf6, 0x03,
+ 0x86, 0x78, 0x01, 0x89, 0x86, 0x7c, 0x01, 0xff, 0x86, 0x74, 0x01, 0x83,
+ 0xbe, 0x7c, 0x01, 0x7d, 0x72, 0x21, 0x83, 0xbe, 0x88, 0x01, 0x01, 0x74,
+ 0x1a, 0xc7, 0x86, 0x88, 0x01, 0x01, 0x00, 0xc7, 0x86, 0x8a, 0x01, 0x01,
+ 0x00, 0xa1, 0x3c, 0x55, 0x89, 0x86, 0x8c, 0x01, 0xa1, 0x3e, 0x55, 0x89,
+ 0x86, 0x8e, 0x01, 0xe9, 0x94, 0x00, 0x83, 0xbe, 0x76, 0x01, 0x00, 0x75,
+ 0x04, 0x88, 0x86, 0x7a, 0x01, 0x81, 0xbe, 0x76, 0x01, 0xbc, 0x02, 0x72,
+ 0x06, 0xc7, 0x86, 0x76, 0x01, 0xf4, 0x01, 0x2a, 0xe4, 0x83, 0xf8, 0x7f,
+ 0x75, 0x12, 0x8b, 0x86, 0x76, 0x01, 0xbe, 0xeb, 0x09, 0xf7, 0xe6, 0xbe,
+ 0x20, 0x00, 0xf7, 0xf6, 0x03, 0x86, 0x7a, 0x01, 0x89, 0x86, 0x7e, 0x01,
+ 0xff, 0x86, 0x76, 0x01, 0x83, 0xbe, 0x80, 0x01, 0x01, 0x74, 0x53, 0x83,
+ 0xf8, 0x1f, 0x72, 0x4e, 0x8d, 0xb6, 0x96, 0x01, 0x83, 0x3c, 0x12, 0x72,
+ 0x45, 0x83, 0x3c, 0x23, 0x77, 0x40, 0x83, 0x7c, 0x02, 0x1f, 0x72, 0x3a,
+ 0x83, 0x7c, 0x02, 0x45, 0x77, 0x34, 0x83, 0x7c, 0x04, 0x12, 0x72, 0x2e,
+ 0x90, 0x83, 0x7c, 0x04, 0x23, 0x77, 0x27, 0x81, 0x7c, 0x06, 0x9c, 0x00,
+ 0x72, 0x20, 0xc7, 0x86, 0x80, 0x01, 0x01, 0x00, 0xc7, 0x86, 0x82, 0x01,
+ 0x01, 0x00, 0xc7, 0x86, 0x88, 0x01, 0x00, 0x00, 0xa1, 0x3c, 0x55, 0x89,
+ 0x86, 0x84, 0x01, 0xa1, 0x3e, 0x55, 0x89, 0x86, 0x86, 0x01, 0x83, 0xc3,
+ 0x02, 0x49, 0x74, 0x03, 0xe9, 0xdb, 0xfe, 0xc3, 0x50, 0x51, 0x52, 0x56,
+ 0x57, 0x8e, 0x46, 0x02, 0x83, 0x86, 0x90, 0x01, 0x01, 0x83, 0x96, 0x92,
+ 0x01, 0x00, 0xc7, 0x86, 0x80, 0x01, 0x00, 0x00, 0x26, 0xa1, 0x32, 0x00,
+ 0xd1, 0xe8, 0xd0, 0xe8, 0x86, 0xe0, 0x8d, 0xb6, 0x96, 0x01, 0x26, 0x8b,
+ 0x0e, 0x14, 0x00, 0x83, 0xe1, 0x08, 0x89, 0x8e, 0x94, 0x01, 0xf7, 0xc1,
+ 0x08, 0x00, 0x74, 0x4f, 0x8b, 0x4c, 0x0a, 0x89, 0x4c, 0x0e, 0x8b, 0x4c,
+ 0x06, 0x89, 0x4c, 0x0a, 0x8b, 0x4c, 0x02, 0x89, 0x4c, 0x06, 0x2a, 0xe4,
+ 0x8b, 0xc8, 0x83, 0xf8, 0x7f, 0x75, 0x19, 0xb0, 0x0a, 0xe6, 0x10, 0xe5,
+ 0x00, 0xb1, 0x05, 0xd3, 0xe8, 0x03, 0x86, 0x7e, 0x01, 0x8b, 0xc8, 0xe4,
+ 0x10, 0xa8, 0x10, 0x74, 0x03, 0x83, 0xc1, 0x4f, 0x8b, 0xc1, 0x89, 0x44,
+ 0x02, 0xc7, 0x86, 0x7e, 0x01, 0x00, 0x00, 0xc7, 0x86, 0x76, 0x01, 0x00,
+ 0x00, 0xeb, 0x7f, 0xc7, 0x86, 0x88, 0x01, 0x00, 0x00, 0xeb, 0x77, 0x8b,
+ 0x4c, 0x08, 0x89, 0x4c, 0x0c, 0x8b, 0x4c, 0x04, 0x89, 0x4c, 0x08, 0x8b,
+ 0x0c, 0x89, 0x4c, 0x04, 0x8a, 0xc4, 0x2a, 0xe4, 0x8b, 0xc8, 0x83, 0xf8,
+ 0x7f, 0x75, 0x25, 0xb0, 0x0a, 0xe6, 0x10, 0xe5, 0x00, 0xb1, 0x05, 0xd3,
+ 0xe8, 0x03, 0x86, 0x7c, 0x01, 0x8b, 0xc8, 0xe4, 0x10, 0xa8, 0x10, 0x74,
+ 0x03, 0x83, 0xc1, 0x4f, 0x8b, 0x96, 0x7c, 0x01, 0x83, 0xf9, 0x7f, 0x77,
+ 0x03, 0x83, 0xc1, 0x4f, 0x8b, 0xc1, 0x89, 0x04, 0xc7, 0x86, 0x7c, 0x01,
+ 0x00, 0x00, 0xc7, 0x86, 0x74, 0x01, 0x00, 0x00, 0x83, 0xf8, 0x7d, 0x72,
+ 0xa2, 0x83, 0xbe, 0x88, 0x01, 0x01, 0x74, 0x1a, 0xc7, 0x86, 0x88, 0x01,
+ 0x01, 0x00, 0xc7, 0x86, 0x8a, 0x01, 0x01, 0x00, 0xa1, 0x3c, 0x55, 0x89,
+ 0x86, 0x84, 0x01, 0xa1, 0x3e, 0x55, 0x89, 0x86, 0x86, 0x01, 0x5f, 0x5e,
+ 0x5a, 0x59, 0x58, 0xc3, 0x50, 0x51, 0x57, 0x06, 0xfa, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0x2b, 0xc0, 0x8d, 0xbe, 0x72, 0x01, 0xb9, 0x1a, 0x00, 0xf3, 0xab,
+ 0xfb, 0x07, 0x5f, 0x59, 0x58, 0xc3, 0xfa, 0xf6, 0x06, 0x8b, 0x56, 0x80,
+ 0x74, 0x4e, 0xc6, 0x86, 0x6c, 0x01, 0x00, 0xc6, 0x86, 0x6e, 0x01, 0x01,
+ 0xfe, 0x86, 0x70, 0x01, 0x8a, 0x46, 0x00, 0xa2, 0x8b, 0x56, 0xc7, 0x06,
+ 0x8c, 0x56, 0x02, 0x00, 0xc7, 0x06, 0x8e, 0x56, 0x01, 0x00, 0xe5, 0x06,
+ 0x83, 0xe0, 0x09, 0xe7, 0x06, 0x8b, 0xc8, 0xb8, 0xd6, 0x13, 0xe7, 0x02,
+ 0xb8, 0x4e, 0x03, 0xe7, 0x04, 0x83, 0xc9, 0x46, 0x8b, 0xc1, 0xe7, 0x06,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x02, 0x00, 0x01, 0xbe, 0x5f, 0x46,
+ 0xe8, 0xc9, 0xbb, 0xc6, 0x86, 0x5d, 0x02, 0x01, 0xfb, 0xc3, 0xfa, 0xf6,
+ 0x06, 0x8b, 0x56, 0x80, 0x74, 0x49, 0xc6, 0x86, 0x6d, 0x01, 0x00, 0xc6,
+ 0x86, 0x6f, 0x01, 0x01, 0xfe, 0x86, 0x71, 0x01, 0x8a, 0x46, 0x00, 0xa2,
+ 0x8b, 0x56, 0xc7, 0x06, 0x8c, 0x56, 0x0e, 0x00, 0xc7, 0x06, 0x8e, 0x56,
+ 0x02, 0x00, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0x8b, 0xc8, 0xb8,
+ 0xf7, 0x03, 0xe7, 0x02, 0xb8, 0xd6, 0x13, 0xe7, 0x04, 0x83, 0xc9, 0x46,
+ 0x8b, 0xc1, 0xe7, 0x06, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x02, 0x00,
+ 0x01, 0xbe, 0x5f, 0x46, 0xe8, 0x71, 0xbb, 0xfb, 0xc3, 0x90, 0xe5, 0x06,
+ 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc3, 0xb8, 0x9d, 0x06, 0xe7, 0x02, 0xc7,
+ 0x06, 0x8c, 0x56, 0x04, 0x00, 0xc3, 0xc7, 0x06, 0x8c, 0x56, 0x06, 0x00,
+ 0xc3, 0x90, 0xc7, 0x06, 0x8c, 0x56, 0x08, 0x00, 0xc3, 0x90, 0x53, 0xc7,
+ 0x06, 0x8c, 0x56, 0x0a, 0x00, 0x33, 0xdb, 0x8a, 0x1e, 0x8b, 0x56, 0xd0,
+ 0xe3, 0x8b, 0x9f, 0x52, 0x55, 0x06, 0x8e, 0x47, 0x02, 0x26, 0x83, 0x26,
+ 0x02, 0x00, 0xfe, 0x07, 0xb8, 0x9d, 0x06, 0xe7, 0x02, 0x5b, 0xc3, 0x90,
+ 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc7, 0x06, 0x8c, 0x56, 0x0c,
+ 0x00, 0xc6, 0x06, 0x8b, 0x56, 0x80, 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0,
+ 0x09, 0xe7, 0x06, 0xc3, 0xb8, 0xf7, 0x03, 0xe7, 0x02, 0xc7, 0x06, 0x8c,
+ 0x56, 0x10, 0x00, 0xc3, 0x53, 0xc7, 0x06, 0x8c, 0x56, 0x12, 0x00, 0x33,
+ 0xdb, 0x8a, 0x1e, 0x8b, 0x56, 0xd0, 0xe3, 0x8b, 0x9f, 0x52, 0x55, 0x06,
+ 0x8e, 0x47, 0x02, 0x26, 0x83, 0x26, 0x02, 0x00, 0xfe, 0x07, 0xb8, 0x9d,
+ 0x06, 0xe7, 0x02, 0x5b, 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7,
+ 0x06, 0xc7, 0x06, 0x8c, 0x56, 0x14, 0x00, 0xc6, 0x06, 0x8b, 0x56, 0x80,
+ 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc3, 0x4e, 0x6f,
+ 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x54, 0x78, 0x74, 0x30, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x34, 0x12, 0x45, 0x23, 0x56, 0x34,
+ 0x00, 0x00, 0x00, 0x00, 0xcd, 0xab, 0xde, 0xbc, 0xef, 0xcd, 0x00, 0x00,
+ 0x00, 0x00, 0x4e, 0x6f, 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x65, 0x64, 0x00, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x30, 0x00,
+ 0x00, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x31, 0x00, 0x00, 0x54, 0x65, 0x73,
+ 0x74, 0x31, 0x00, 0x00, 0x54, 0x65, 0x73, 0x74, 0x32, 0x00, 0x00, 0x90,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x55, 0x59, 0x4e,
+ 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00,
+ 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00,
+ 0xe0, 0x02, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x16, 0x00, 0x02, 0x04, 0x01, 0x00, 0x00, 0x06, 0x0b,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x03, 0xc0, 0x00, 0xff, 0xff,
+ 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x03,
+ 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x04, 0xc0, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12,
+ 0x00, 0x04, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0b,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x05,
+ 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x12, 0x00, 0x05, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
+ 0xe0, 0x06, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x12, 0x00, 0x06, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x12, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x14, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x02, 0x26, 0x00, 0x00,
+ 0x00, 0x00, 0x3e, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x50, 0x20, 0x0c, 0x23,
+ 0x30, 0x30, 0x30, 0x30, 0xf3, 0xf0, 0xf0, 0xf8, 0xf9, 0xf6, 0x08, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x22, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x04, 0x21, 0x00, 0x00, 0x04, 0x21, 0x00, 0x00, 0x06, 0x2b,
+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x28,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x29, 0x20, 0x00, 0x08, 0x00,
+ 0x01, 0x00, 0x04, 0x06, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x34, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x40, 0x25, 0x06, 0x0b,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x14, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x40, 0x26, 0x06, 0x0b, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1a, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x60, 0x27, 0x08, 0x0a,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00,
+ 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x16, 0x60, 0x28, 0x04, 0x30, 0x00, 0x00, 0x06, 0x0b,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff,
+ 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30, 0x11,
+ 0x04, 0x0c, 0x00, 0x01, 0x04, 0x0e, 0x00, 0x02, 0x04, 0x21, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff,
+ 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x12,
+ 0x04, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0xe0, 0x00,
+ 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0x30, 0x13, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0xe0, 0x00,
+ 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x03, 0x14, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x12, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x15, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x60, 0x29, 0x08, 0x2d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x04, 0x2a, 0x00, 0x00, 0x02, 0x20, 0x80, 0x00, 0x00, 0x06,
+ 0x09, 0x00, 0x00, 0x00, 0x04, 0x03, 0x01, 0x80, 0x00, 0x00, 0x04, 0x02,
+ 0x80, 0x00, 0x00, 0x08, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x02, 0x02, 0x80,
+ 0x00, 0x00, 0x08, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x01, 0x26, 0x80, 0x00,
+ 0x00, 0xff, 0x06, 0x03, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00,
+ 0x06, 0x05, 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x04, 0x07,
+ 0x00, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0x00, 0x04, 0x04, 0x03, 0x00,
+ 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x05, 0x00, 0x00, 0x00,
+ 0x04, 0x09, 0x00, 0x00, 0x00, 0x04, 0x03, 0x0c, 0x80, 0x00, 0x00, 0x04,
+ 0x0e, 0x80, 0x00, 0x00, 0x04, 0x21, 0x00, 0x00, 0x00, 0x04, 0x01, 0x0f,
+ 0x80, 0x00, 0x00, 0x04, 0x01, 0x0d, 0x80, 0x00, 0x00, 0x04, 0x04, 0x02,
+ 0x80, 0x00, 0x00, 0x08, 0x22, 0x00, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00,
+ 0x00, 0xff, 0x21, 0x00, 0x00, 0x00, 0x04, 0x01, 0x09, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0xa5, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
diff --git a/sys/contrib/dev/oltr/trlldmac.c b/sys/contrib/dev/oltr/trlldmac.c
new file mode 100644
index 0000000..63cfd3e3
--- /dev/null
+++ b/sys/contrib/dev/oltr/trlldmac.c
@@ -0,0 +1,2641 @@
+/*
+ * $FreeBSD$
+ *
+ * Copyright (c) 1997
+ * OLICOM A/S
+ * Denmark
+ *
+ * All Rights Reserved
+ *
+ * This source file is subject to the terms and conditions of the
+ * OLICOM Software License Agreement which restricts the manner
+ * in which it may be used.
+ *
+ *---------------------------------------------------------------------------
+ *
+ * Description: Olicom adapter micro-code
+ *
+ *---------------------------------------------------------------------------
+ */
+
+unsigned char TRlldMacCode[] __attribute ((aligned(2))) = {
+ 0x52, 0x94, 0x02, 0x00, 0xba, 0x7a, 0x00, 0x00, 0xa0, 0x00, 0x01, 0xc8,
+ 0xe2, 0x28, 0xd4, 0xdb, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00,
+ 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40,
+ 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01,
+ 0xff, 0x00, 0x00, 0xff, 0xff, 0xf0, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xff,
+ 0x7f, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0xd4, 0xe7, 0xe7, 0xe7, 0xf2,
+ 0xf2, 0xf8, 0x28, 0x43, 0x29, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, 0x49,
+ 0x47, 0x48, 0x54, 0x20, 0x49, 0x42, 0x4d, 0x20, 0x31, 0x39, 0x38, 0x33,
+ 0x2c, 0x34, 0x2c, 0x35, 0x2c, 0x36, 0x28, 0x43, 0x29, 0x20, 0x43, 0x4f,
+ 0x50, 0x59, 0x52, 0x49, 0x47, 0x48, 0x54, 0x20, 0x54, 0x49, 0x20, 0x31,
+ 0x39, 0x38, 0x33, 0x2d, 0x38, 0x39, 0x2c, 0x39, 0x30, 0x2d, 0x39, 0x34,
+ 0x00, 0x00, 0x7b, 0x63, 0xf6, 0xde, 0xf1, 0xcc, 0xed, 0x9c, 0xf7, 0xe2,
+ 0x00, 0x00, 0x00, 0xc4, 0xbd, 0x24, 0x06, 0x4a, 0x06, 0x50, 0x06, 0x4c,
+ 0xda, 0x00, 0x06, 0x4e, 0x00, 0x0f, 0x06, 0x32, 0x00, 0x01, 0x07, 0x50,
+ 0x07, 0x58, 0x07, 0x52, 0xc2, 0xce, 0x07, 0x54, 0x00, 0x0f, 0x07, 0x38,
+ 0x00, 0x01, 0x00, 0xba, 0x00, 0xa0, 0x00, 0xbc, 0xf7, 0xf0, 0x00, 0xbe,
+ 0x00, 0x0f, 0x07, 0x5e, 0x07, 0x3a, 0x07, 0x62, 0x80, 0x40, 0x07, 0x64,
+ 0xc7, 0xb2, 0x07, 0x66, 0xc7, 0x94, 0x07, 0x68, 0xc5, 0x9e, 0x07, 0x98,
+ 0x80, 0x00, 0x07, 0x78, 0x80, 0x00, 0x08, 0xe2, 0x00, 0x04, 0x08, 0xe4,
+ 0x00, 0x01, 0x08, 0xec, 0x00, 0x08, 0x08, 0xf6, 0x00, 0x0a, 0x08, 0xf8,
+ 0x00, 0x06, 0x09, 0x00, 0x00, 0x0c, 0x09, 0x02, 0x00, 0x04, 0x01, 0xae,
+ 0x00, 0x00, 0x09, 0x1e, 0x00, 0x00, 0x09, 0x66, 0x00, 0x00, 0x06, 0x0c,
+ 0x00, 0x13, 0x06, 0x0a, 0x00, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xb3, 0x86,
+ 0x00, 0xe0, 0xb2, 0xe6, 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xe0, 0xb5, 0x02,
+ 0x00, 0xe0, 0xb6, 0x5e, 0x00, 0xe0, 0xb9, 0x3c, 0x00, 0xe0, 0xb4, 0x12,
+ 0x00, 0xc0, 0xb4, 0x22, 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xe0, 0xb3, 0x86,
+ 0x00, 0xc0, 0xb4, 0x74, 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xe0, 0xb3, 0x86,
+ 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xe0, 0xb3, 0x86,
+ 0x00, 0xc0, 0xbd, 0x4a, 0x00, 0xc0, 0xbd, 0xb4, 0x00, 0xc0, 0xbd, 0xf0,
+ 0x00, 0xc0, 0xbe, 0x60, 0x00, 0xc0, 0xbe, 0xe2, 0x00, 0xe0, 0xc0, 0x50,
+ 0x00, 0xe0, 0xbf, 0xf6, 0x00, 0xe0, 0xc1, 0x52, 0x00, 0xe0, 0xc0, 0xe8,
+ 0x00, 0xe0, 0xba, 0x90, 0x00, 0xc0, 0xbb, 0x00, 0x00, 0xc0, 0xbb, 0x5a,
+ 0x00, 0xc0, 0xbb, 0x8c, 0x00, 0xc0, 0xba, 0xb4, 0x00, 0xc0, 0xb3, 0x80,
+ 0x00, 0xc0, 0xb3, 0x80, 0x3f, 0x00, 0x7f, 0x00, 0x5e, 0x00, 0x00, 0x30,
+ 0x00, 0x28, 0x00, 0x43, 0xb6, 0xb6, 0xb6, 0xb6, 0xb5, 0x1c, 0xb5, 0x14,
+ 0xb5, 0x46, 0xb5, 0x46, 0xb5, 0x62, 0xb6, 0xb6, 0x40, 0x00, 0x00, 0x00,
+ 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08, 0x00, 0x80, 0x00,
+ 0x08, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c,
+ 0x00, 0x10, 0x00, 0x14, 0x10, 0x0e, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x00, 0x00, 0xa1, 0xc8, 0x00, 0x09, 0x08, 0x08, 0x00, 0x00, 0xa1, 0xd0,
+ 0x00, 0x11, 0x06, 0x06, 0x00, 0x00, 0xa1, 0xe0, 0x00, 0x21, 0x04, 0x04,
+ 0x00, 0x00, 0xa2, 0x00, 0x00, 0x41, 0x02, 0x02, 0x00, 0x00, 0xa2, 0x40,
+ 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0xa2, 0xc0, 0x06, 0xd8, 0x07, 0x98,
+ 0xd7, 0xa2, 0x07, 0x58, 0xc6, 0x56, 0x07, 0x58, 0xc5, 0x5c, 0x07, 0x58,
+ 0xc6, 0xc6, 0x07, 0x58, 0xc6, 0x2e, 0x07, 0x98, 0xd4, 0x7e, 0x07, 0x98,
+ 0xd4, 0x76, 0x07, 0x78, 0xce, 0xea, 0x07, 0x58, 0xc6, 0x8e, 0x07, 0x98,
+ 0xd7, 0x5c, 0x07, 0x78, 0xcf, 0xbe, 0x07, 0x58, 0xd4, 0x8e, 0x07, 0x58,
+ 0xc6, 0x3e, 0x07, 0x58, 0xc6, 0x7c, 0x07, 0x58, 0xc7, 0x40, 0x07, 0x98,
+ 0xd8, 0xd2, 0x07, 0x98, 0xd4, 0xb2, 0x07, 0x78, 0xcf, 0x7e, 0x07, 0xb8,
+ 0xd9, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0xce, 0x3e,
+ 0xce, 0xf2, 0xd3, 0xfa, 0xca, 0xba, 0xca, 0xf2, 0xcb, 0x10, 0xcb, 0x9a,
+ 0xcb, 0xbe, 0xcb, 0xda, 0xcc, 0x52, 0xcc, 0x52, 0xcb, 0x86, 0xcc, 0xf0,
+ 0xcb, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x0c, 0x00, 0x0f, 0x01,
+ 0xfe, 0xff, 0x58, 0x00, 0x0e, 0x00, 0xfe, 0xff, 0x00, 0x0e, 0x70, 0x00,
+ 0x80, 0x40, 0x5e, 0x00, 0xc0, 0xa0, 0xff, 0xdf, 0x18, 0x00, 0xe0, 0x00,
+ 0x78, 0x00, 0x50, 0x00, 0x60, 0x00, 0x70, 0x00, 0x0c, 0x00, 0x00, 0x06,
+ 0x00, 0x00, 0xe3, 0x84, 0x07, 0xe6, 0x07, 0xf4, 0x00, 0x08, 0x00, 0x00,
+ 0xe3, 0x8a, 0x07, 0xea, 0x07, 0xf4, 0x00, 0x06, 0x00, 0x40, 0x0a, 0x00,
+ 0x07, 0xe6, 0x07, 0xee, 0x00, 0x08, 0x00, 0x40, 0x0a, 0x06, 0x07, 0xea,
+ 0x07, 0xee, 0x00, 0x00, 0xc1, 0xe2, 0xd4, 0x8b, 0xff, 0xff, 0xd1, 0xd7,
+ 0xc5, 0xd9, 0xc3, 0xd4, 0x59, 0x3b, 0x09, 0x34, 0x05, 0xfc, 0x09, 0x6c,
+ 0x06, 0xd8, 0x04, 0x06, 0xea, 0x7a, 0x09, 0x30, 0x04, 0x48, 0x08, 0x80,
+ 0x00, 0x06, 0x06, 0x0a, 0x0c, 0x0e, 0xdb, 0xa8, 0xe8, 0x7c, 0xe8, 0xa4,
+ 0xe9, 0x8a, 0xea, 0x8c, 0xea, 0xe6, 0xeb, 0x40, 0xeb, 0xf2, 0xdb, 0xa8,
+ 0xec, 0x74, 0xec, 0x04, 0xe8, 0x62, 0xec, 0x10, 0xec, 0x10, 0xed, 0x3a,
+ 0xed, 0x44, 0xed, 0x4e, 0xe5, 0x62, 0xe7, 0xea, 0xdb, 0x9e, 0xe5, 0xb4,
+ 0xe6, 0x82, 0xe6, 0xf2, 0xe7, 0x6e, 0xe7, 0x92, 0xdb, 0xf6, 0xdb, 0x9e,
+ 0xe4, 0xd2, 0xe4, 0xb4, 0xe4, 0x6e, 0xdb, 0x9e, 0xe7, 0xf6, 0xdb, 0x9e,
+ 0x06, 0x72, 0xdf, 0xa2, 0x07, 0x08, 0x06, 0x72, 0xdf, 0x00, 0x01, 0xf4,
+ 0x06, 0x72, 0xde, 0xe0, 0x07, 0x08, 0x06, 0x7c, 0xe6, 0x5a, 0x00, 0x04,
+ 0x06, 0x7c, 0xdf, 0x24, 0x00, 0x00, 0x06, 0x7c, 0xe7, 0xd8, 0x00, 0xfa,
+ 0x06, 0x86, 0xde, 0x70, 0x00, 0x05, 0x06, 0x90, 0xe8, 0x28, 0x00, 0x28,
+ 0x06, 0x90, 0xdf, 0xfc, 0x01, 0x04, 0x06, 0x90, 0x00, 0x00, 0x00, 0x02,
+ 0x06, 0x90, 0xdf, 0x2c, 0x02, 0xbc, 0x06, 0x9a, 0xdf, 0xb2, 0x05, 0xdc,
+ 0x06, 0x9a, 0xdf, 0x56, 0x00, 0x64, 0x06, 0x9a, 0xdf, 0xb6, 0x00, 0x14,
+ 0x06, 0x9a, 0xe9, 0x1c, 0x06, 0x40, 0x06, 0x9a, 0xdf, 0xbe, 0x00, 0x64,
+ 0x00, 0x00, 0x07, 0x0a, 0x07, 0x0e, 0x07, 0x04, 0x06, 0xd8, 0x07, 0x00,
+ 0x06, 0xf0, 0x06, 0xee, 0x06, 0xec, 0x07, 0x0c, 0x06, 0xe6, 0x07, 0x18,
+ 0x50, 0x00, 0x00, 0xcc, 0x00, 0x03, 0x84, 0x00, 0xa8, 0x00, 0xa0, 0x00,
+ 0x20, 0x00, 0x80, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 0x80, 0x00,
+ 0x40, 0x00, 0x10, 0x00, 0xf4, 0x40, 0xf3, 0x06, 0xf3, 0x20, 0xf3, 0x3a,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0xf3, 0xa8,
+ 0xf3, 0x10, 0xf3, 0x26, 0xf3, 0x40, 0x01, 0x40, 0x01, 0x42, 0x01, 0x42,
+ 0x01, 0x42, 0x00, 0x00, 0x00, 0x7f, 0x00, 0xa0, 0x00, 0xff, 0x02, 0x10,
+ 0x02, 0x1f, 0x02, 0x30, 0x02, 0x3f, 0x02, 0x50, 0x02, 0x5f, 0x02, 0x70,
+ 0x02, 0x7f, 0x02, 0x90, 0x02, 0x9f, 0x02, 0xb0, 0x02, 0xbf, 0x02, 0xd0,
+ 0x02, 0xdf, 0x02, 0xe1, 0x02, 0xff, 0x03, 0x01, 0x03, 0x7f, 0x03, 0x81,
+ 0x03, 0x8f, 0x03, 0x91, 0x03, 0x9f, 0x03, 0xa1, 0x03, 0xaf, 0x03, 0xb1,
+ 0x03, 0xbf, 0x03, 0xc1, 0x03, 0xcf, 0x03, 0xe1, 0x03, 0xff, 0x07, 0xc0,
+ 0x07, 0xff, 0x0c, 0x00, 0x0f, 0xff, 0x30, 0x00, 0x37, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xfe, 0xbc, 0x00, 0x07, 0x02, 0x5e, 0x01, 0x00, 0xba, 0xff,
+ 0xba, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0c, 0x01, 0x0a,
+ 0x01, 0x0e, 0x01, 0x10, 0x01, 0x14, 0x00, 0x00, 0x01, 0x12, 0xf8, 0x00,
+ 0x01, 0x16, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0a, 0x01, 0x1c,
+ 0x01, 0x82, 0x96, 0x66, 0x96, 0x66, 0x55, 0x55, 0x00, 0x00, 0x01, 0x82,
+ 0x8a, 0x2a, 0x8a, 0x2a, 0xc9, 0x18, 0xc9, 0x18, 0x01, 0x86, 0xa2, 0xaa,
+ 0xa0, 0x1e, 0x55, 0x55, 0x54, 0x1e, 0x01, 0x8a, 0x50, 0x00, 0x00, 0x00,
+ 0xa8, 0x00, 0x00, 0x00, 0x01, 0x8c, 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00,
+ 0x00, 0x00, 0x01, 0x8e, 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00,
+ 0x01, 0x90, 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x92,
+ 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x94, 0x50, 0x00,
+ 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x96, 0x50, 0x00, 0x00, 0x00,
+ 0xa8, 0x00, 0x00, 0x00, 0x01, 0x98, 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00,
+ 0x00, 0x00, 0x01, 0x9a, 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00,
+ 0x01, 0x9c, 0x55, 0x55, 0x7f, 0xc0, 0xaa, 0xaa, 0x7f, 0xc0, 0x00, 0x00,
+ 0x01, 0xa2, 0x01, 0xa4, 0x01, 0xa8, 0x01, 0xaa, 0x01, 0xae, 0x01, 0xb0,
+ 0x01, 0xb2, 0x01, 0x80, 0x00, 0x00, 0x01, 0x88, 0xff, 0x00, 0x01, 0x9e,
+ 0x00, 0xff, 0x01, 0xa0, 0x80, 0x00, 0x01, 0xac, 0x80, 0x00, 0x00, 0x00,
+ 0x01, 0xa6, 0x80, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0xbc, 0x88, 0x00,
+ 0x06, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00,
+ 0x80, 0x00, 0x00, 0x02, 0x00, 0x44, 0xf2, 0x50, 0x00, 0x48, 0xf2, 0x56,
+ 0x00, 0x50, 0xf2, 0x5c, 0x00, 0x60, 0xf2, 0x62, 0x00, 0x78, 0xf2, 0x68,
+ 0xef, 0xc8, 0xee, 0xd6, 0xe9, 0xfc, 0xee, 0xe8, 0x55, 0x14, 0x01, 0xa0,
+ 0xee, 0xaa, 0xe9, 0x90, 0xef, 0x04, 0xef, 0x5e, 0xee, 0xbe, 0xf0, 0x16,
+ 0x00, 0x00, 0x00, 0x1e, 0xef, 0x04, 0xef, 0x50, 0x41, 0x00, 0x41, 0x01,
+ 0xef, 0x74, 0xea, 0x33, 0xee, 0xd6, 0xea, 0x08, 0xee, 0xaa, 0xe9, 0xc4,
+ 0xef, 0x14, 0xef, 0x20, 0xef, 0x74, 0xea, 0x2e, 0xf0, 0x20, 0x00, 0x00,
+ 0xef, 0xf4, 0xee, 0xaa, 0xe9, 0xba, 0xef, 0x14, 0xef, 0x20, 0xef, 0xf4,
+ 0xf0, 0x20, 0x00, 0x00, 0xee, 0xaa, 0xe9, 0xb0, 0xee, 0xca, 0xef, 0x08,
+ 0xef, 0x20, 0xef, 0xf4, 0xee, 0xaa, 0xe9, 0xba, 0xef, 0x14, 0xef, 0x20,
+ 0xef, 0xf4, 0xf0, 0x20, 0x20, 0x00, 0xee, 0xe8, 0x55, 0x14, 0x01, 0xa0,
+ 0xee, 0xd6, 0xea, 0x10, 0xee, 0xaa, 0xe9, 0x90, 0xf0, 0x16, 0x55, 0x50,
+ 0x00, 0x0c, 0xef, 0x04, 0xef, 0x50, 0x01, 0x00, 0x00, 0x00, 0xef, 0x74,
+ 0xea, 0x35, 0xee, 0xbe, 0xf0, 0x16, 0x55, 0x55, 0x00, 0x0c, 0xef, 0x14,
+ 0xef, 0x5e, 0xee, 0xbe, 0xf0, 0x16, 0xff, 0xff, 0x00, 0x08, 0xf0, 0x16,
+ 0x10, 0x02, 0x00, 0x06, 0xef, 0x04, 0xef, 0x50, 0x01, 0x00, 0x01, 0x01,
+ 0xef, 0x74, 0xea, 0x40, 0xee, 0xbe, 0xf0, 0x16, 0xc0, 0x00, 0x00, 0x08,
+ 0xf0, 0x16, 0xff, 0xff, 0x00, 0x0a, 0xf0, 0x16, 0xff, 0xff, 0x00, 0x0c,
+ 0xf0, 0x16, 0x10, 0x0d, 0x00, 0x06, 0xef, 0x04, 0xef, 0x50, 0x01, 0x00,
+ 0x01, 0x01, 0xef, 0x74, 0xea, 0x34, 0xf0, 0x20, 0x20, 0x08, 0xee, 0xbe,
+ 0xf0, 0x10, 0x01, 0x82, 0xc9, 0x02, 0xef, 0x04, 0xef, 0x74, 0xea, 0x40,
+ 0xf0, 0x20, 0x20, 0x34, 0xee, 0xbe, 0xf0, 0x16, 0x10, 0x00, 0x00, 0x06,
+ 0xef, 0x04, 0xf0, 0x84, 0xef, 0x74, 0xea, 0x38, 0xf0, 0x10, 0x01, 0x9c,
+ 0x00, 0x40, 0xee, 0xd6, 0xea, 0x10, 0xee, 0xe8, 0x00, 0xff, 0x07, 0x80,
+ 0xf0, 0xe4, 0x00, 0x03, 0xf1, 0x24, 0xf1, 0x32, 0xe9, 0xd2, 0xf0, 0xf6,
+ 0x00, 0x00, 0xf1, 0x32, 0xe9, 0xdc, 0xf0, 0xf6, 0x00, 0x04, 0xf1, 0x32,
+ 0xe9, 0xe4, 0xf0, 0xf6, 0x00, 0x07, 0xf1, 0x32, 0xe9, 0xec, 0xf0, 0xe4,
+ 0x00, 0x01, 0xf1, 0x32, 0xe9, 0xf4, 0xf0, 0xf6, 0x00, 0x02, 0xf1, 0x32,
+ 0xe9, 0xf4, 0xf0, 0xf6, 0x00, 0x06, 0xf1, 0x32, 0xe9, 0xf4, 0xf0, 0xf6,
+ 0x00, 0x05, 0xf1, 0x32, 0xe9, 0xf4, 0xf0, 0xe4, 0x00, 0x01, 0xf1, 0x08,
+ 0xf0, 0xe4, 0x00, 0x03, 0xf1, 0x16, 0xef, 0x20, 0xf0, 0xa4, 0xe9, 0x98,
+ 0x00, 0x01, 0xf0, 0xa4, 0xe9, 0xe5, 0x00, 0x02, 0xf0, 0xa4, 0xe9, 0xef,
+ 0x00, 0x06, 0xf0, 0xa4, 0xe9, 0xfa, 0x00, 0x05, 0xef, 0x74, 0xea, 0x34,
+ 0xef, 0xf4, 0xee, 0xaa, 0xe9, 0x90, 0xef, 0x14, 0xf0, 0x84, 0xee, 0xca,
+ 0xef, 0x50, 0x01, 0x00, 0x80, 0x00, 0xef, 0x74, 0xea, 0x38, 0xee, 0xbe,
+ 0xf0, 0xbc, 0xf0, 0x10, 0x01, 0x80, 0x8e, 0x41, 0xef, 0x08, 0xef, 0x50,
+ 0x01, 0x00, 0x1b, 0x01, 0xf0, 0xc4, 0xff, 0xe4, 0xef, 0x74, 0xea, 0x3c,
+ 0xf0, 0x7c, 0xee, 0xd6, 0xea, 0x16, 0xee, 0xca, 0xf0, 0x28, 0xee, 0xfa,
+ 0xe0, 0x00, 0xf0, 0x84, 0xef, 0x74, 0xea, 0x46, 0xee, 0xfa, 0xe8, 0x00,
+ 0xef, 0x20, 0xef, 0x74, 0xea, 0x45, 0xee, 0xfa, 0x08, 0x00, 0xf0, 0x84,
+ 0xef, 0x74, 0xea, 0x46, 0xee, 0xfa, 0xf8, 0x00, 0xef, 0x20, 0xef, 0x74,
+ 0xea, 0x45, 0xf0, 0x10, 0x01, 0x80, 0x02, 0x00, 0xee, 0xfa, 0xe0, 0x00,
+ 0xef, 0x20, 0xef, 0x74, 0xea, 0x45, 0xf0, 0x10, 0x01, 0x84, 0x00, 0x00,
+ 0xf0, 0x20, 0x00, 0x34, 0xee, 0xfa, 0x00, 0x00, 0xf0, 0x84, 0xf0, 0x20,
+ 0x60, 0x34, 0xf0, 0xcc, 0xf0, 0x10, 0x01, 0x84, 0x00, 0x00, 0xef, 0x74,
+ 0xea, 0x46, 0xf0, 0x10, 0x01, 0x82, 0xc8, 0x00, 0xee, 0xfa, 0xe0, 0x00,
+ 0xf0, 0x84, 0xee, 0xfa, 0x10, 0x00, 0xf0, 0x84, 0xf0, 0x20, 0x60, 0x34,
+ 0xf0, 0x10, 0x01, 0x80, 0x06, 0x00, 0xee, 0xfa, 0x00, 0x10, 0xf0, 0x36,
+ 0xef, 0xf4, 0xf0, 0x10, 0x01, 0x84, 0x00, 0x00, 0xf0, 0x20, 0x00, 0x34,
+ 0xee, 0xaa, 0xe9, 0x90, 0xee, 0xd6, 0xea, 0x1c, 0xf0, 0x8e, 0xe9, 0x52,
+ 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0xf0, 0x40, 0x00, 0x06, 0xc7, 0x00,
+ 0xef, 0x5e, 0xf0, 0x9a, 0xe0, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e,
+ 0xd0, 0x40, 0x00, 0x06, 0xe0, 0x00, 0xef, 0x5e, 0xf0, 0x9a, 0xc0, 0x00,
+ 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x90, 0x40, 0x00, 0x06, 0xa0, 0x00,
+ 0xef, 0x5e, 0xf0, 0x9a, 0x80, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e,
+ 0x50, 0x40, 0x00, 0x06, 0x60, 0x00, 0xef, 0x5e, 0xf0, 0x9a, 0x40, 0x00,
+ 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x10, 0x40, 0x00, 0x06, 0x20, 0x00,
+ 0xef, 0x5e, 0xf0, 0x9a, 0x00, 0x00, 0xf0, 0x8e, 0xe9, 0x52, 0xee, 0xbe,
+ 0xee, 0xca, 0xef, 0x2e, 0xd0, 0x40, 0x00, 0x06, 0xa6, 0x00, 0xef, 0x5e,
+ 0xf0, 0x9a, 0xc0, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x90, 0x40,
+ 0x00, 0x06, 0xc0, 0x00, 0xef, 0x5e, 0xf0, 0x9a, 0x80, 0x00, 0xee, 0xbe,
+ 0xee, 0xca, 0xef, 0x2e, 0x50, 0x40, 0x00, 0x06, 0x40, 0x00, 0xef, 0x5e,
+ 0xf0, 0x9a, 0x40, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x70, 0x40,
+ 0x00, 0x06, 0x60, 0x00, 0xef, 0x5e, 0xf0, 0x9a, 0x60, 0x00, 0xf1, 0x3c,
+ 0xe9, 0x50, 0xee, 0xd6, 0xea, 0x22, 0xee, 0xaa, 0xe9, 0x90, 0xf0, 0x62,
+ 0x55, 0x55, 0x00, 0x16, 0xef, 0x04, 0xef, 0x50, 0x00, 0x00, 0x00, 0x00,
+ 0xef, 0x74, 0xea, 0x4b, 0xef, 0xc8, 0xee, 0xd6, 0xea, 0x22, 0xf0, 0x16,
+ 0x55, 0x55, 0x00, 0x16, 0xee, 0xbe, 0xef, 0x04, 0xef, 0x5e, 0xee, 0xe8,
+ 0x00, 0xff, 0x08, 0x00, 0xee, 0xe8, 0x00, 0xff, 0x0c, 0x00, 0xee, 0xe8,
+ 0x00, 0xff, 0x10, 0x00, 0xee, 0xe8, 0x00, 0xff, 0x14, 0x00, 0xee, 0xe8,
+ 0x00, 0xff, 0x18, 0x00, 0xee, 0xe8, 0x00, 0xff, 0x1c, 0x00, 0xee, 0xe8,
+ 0x00, 0xff, 0x20, 0x00, 0xee, 0xe8, 0x00, 0xff, 0x24, 0x00, 0xee, 0xe8,
+ 0x00, 0xff, 0x28, 0x00, 0xee, 0xe8, 0x00, 0xff, 0x2c, 0x00, 0xef, 0x90,
+ 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x30, 0x40, 0x00, 0x06, 0x01, 0x00,
+ 0xef, 0x5e, 0xf0, 0x9a, 0x20, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e,
+ 0x70, 0x40, 0x00, 0x06, 0x43, 0x00, 0xef, 0x5e, 0xf0, 0x9a, 0x60, 0x00,
+ 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0xb0, 0x40, 0x00, 0x06, 0x85, 0x00,
+ 0xef, 0x5e, 0xf0, 0x9a, 0xa0, 0x00, 0xf0, 0x96, 0x01, 0x00, 0x01, 0x03,
+ 0x01, 0x01, 0x00, 0x00, 0x81, 0x00, 0x00, 0x1a, 0x10, 0x40, 0x00, 0x00,
+ 0xa9, 0x98, 0x00, 0x0d, 0x55, 0x55, 0x00, 0x00, 0xa9, 0xa4, 0x00, 0xaa,
+ 0x82, 0x72, 0xa9, 0x4a, 0x5a, 0xa5, 0xe7, 0xda, 0x09, 0x03, 0x9d, 0x11,
+ 0x00, 0x00, 0x81, 0x00, 0x00, 0x04, 0x90, 0xd8, 0x10, 0x00, 0x00, 0x00,
+ 0x81, 0x00, 0x00, 0x04, 0x90, 0xd8, 0xb4, 0xd8, 0x00, 0x00, 0x81, 0x00,
+ 0x00, 0x08, 0x90, 0xd8, 0x16, 0x46, 0x40, 0x00, 0xb4, 0xd8, 0x00, 0x08,
+ 0x00, 0x00, 0x80, 0x00, 0x00, 0x13, 0x10, 0x40, 0x00, 0x16, 0x00, 0x00,
+ 0x80, 0x00, 0x00, 0x10, 0x00, 0x15, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f,
+ 0x00, 0x15, 0x00, 0x00, 0x81, 0x00, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x00,
+ 0x80, 0x00, 0x00, 0x12, 0x80, 0x0a, 0x9e, 0x40, 0xc8, 0x00, 0x00, 0x00,
+ 0x80, 0x5e, 0x00, 0x0f, 0x80, 0x06, 0xfe, 0x40, 0xcc, 0x00, 0x00, 0x00,
+ 0x80, 0x04, 0x8e, 0x40, 0xc9, 0x00, 0x80, 0x04, 0x06, 0x00, 0xcc, 0x00,
+ 0x80, 0x04, 0x0a, 0x40, 0xc8, 0x00, 0x80, 0x0a, 0x8a, 0x40, 0xc8, 0x00,
+ 0x00, 0x00, 0x80, 0x5e, 0x00, 0x0f, 0x08, 0x0a, 0x1c, 0x80, 0x00, 0x0a,
+ 0x1a, 0x1c, 0x80, 0x00, 0x0c, 0x1c, 0x80, 0x00, 0x1a, 0x1c, 0x80, 0x00,
+ 0x0e, 0x1a, 0x1c, 0x80, 0x00, 0x04, 0x80, 0x00, 0x02, 0x80, 0x00, 0x02,
+ 0x80, 0x00, 0x00, 0x00, 0xaa, 0x4e, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0x7a, 0x00, 0x4e, 0x07, 0x58, 0xc5, 0x6a, 0xe0, 0x16, 0x08, 0xe2,
+ 0x08, 0xec, 0x08, 0xf6, 0xe0, 0x16, 0x09, 0x00, 0x09, 0x0a, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0xe2, 0x00, 0x00, 0x08, 0xec, 0x08, 0xf6, 0x09, 0x00,
+ 0x00, 0x00, 0x07, 0xb8, 0xd8, 0xee, 0x02, 0x80, 0x07, 0xb8, 0xd9, 0x0c,
+ 0xff, 0x84, 0x07, 0xb8, 0xd9, 0x2e, 0x07, 0xb8, 0xd9, 0xa8, 0xda, 0x88,
+ 0xda, 0x7c, 0xda, 0xa2, 0xda, 0xa6, 0xda, 0x9e, 0xdb, 0x86, 0xdb, 0x86,
+ 0xdb, 0x86, 0xda, 0xa8, 0xda, 0xb2, 0xdb, 0x2e, 0xdb, 0x78, 0x00, 0x00,
+ 0xaa, 0xc8, 0x00, 0x09, 0xdb, 0x86, 0x00, 0x00, 0xaa, 0xd0, 0x02, 0xb0,
+ 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x08,
+ 0x08, 0x05, 0x08, 0x08, 0x08, 0x00, 0x00, 0x02, 0x04, 0x04, 0x04, 0x04,
+ 0x00, 0x08, 0x0a, 0x00, 0x00, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x41, 0x04, 0x0b, 0x06, 0xc2, 0x08, 0xe6, 0x00, 0xe7, 0x00, 0x06, 0x04,
+ 0x07, 0x04, 0x03, 0x04, 0x04, 0x06, 0x05, 0x04, 0x88, 0x04, 0x00, 0x03,
+ 0x00, 0x1c, 0x0c, 0x00, 0x80, 0x00, 0xe3, 0xfc, 0xe4, 0x04, 0xe4, 0x48,
+ 0xe4, 0x08, 0xe4, 0x14, 0xe4, 0x1a, 0xe4, 0x3e, 0xe4, 0x0e, 0xe4, 0x5c,
+ 0x06, 0x00, 0x00, 0x00, 0x07, 0x06, 0x0e, 0x14, 0x14, 0x1e, 0x2a, 0x4c,
+ 0x38, 0x7c, 0x3e, 0x78, 0x43, 0x92, 0x58, 0x9c, 0x4d, 0xb2, 0x2f, 0x64,
+ 0x1d, 0x34, 0x6c, 0xd0, 0x23, 0x3e, 0x1d, 0x2a, 0x65, 0xc0, 0x72, 0xe0,
+ 0x78, 0xee, 0x7f, 0xfc, 0x01, 0x32, 0x57, 0x01, 0x11, 0x32, 0x51, 0x81,
+ 0x56, 0x02, 0x55, 0x03, 0x11, 0x54, 0x81, 0x56, 0x02, 0x55, 0x02, 0x54,
+ 0x81, 0x56, 0x76, 0x01, 0x34, 0x02, 0x55, 0x02, 0x54, 0x81, 0x58, 0x02,
+ 0x55, 0x02, 0x54, 0x81, 0x58, 0x02, 0x12, 0x11, 0x52, 0x02, 0x83, 0x58,
+ 0x05, 0x52, 0x04, 0x81, 0x58, 0x05, 0x52, 0x03, 0x15, 0x5c, 0x5b, 0x53,
+ 0x87, 0x52, 0x03, 0x11, 0x51, 0x41, 0x51, 0x78, 0x11, 0x34, 0x11, 0x81,
+ 0x31, 0x20, 0x57, 0x54, 0x53, 0x01, 0x12, 0x5a, 0x51, 0x81, 0x31, 0x20,
+ 0x57, 0x5b, 0x5a, 0x01, 0x11, 0x01, 0x11, 0x51, 0x81, 0x31, 0x20, 0x57,
+ 0x01, 0x15, 0x01, 0x13, 0x01, 0x11, 0x11, 0x11, 0x51, 0x81, 0x58, 0x05,
+ 0x52, 0x02, 0x54, 0x5b, 0x81, 0x5d, 0x05, 0x52, 0x02, 0x54, 0x81, 0x58,
+ 0x02, 0x50, 0x03, 0x13, 0x81, 0x58, 0x02, 0x50, 0x03, 0x11, 0x54, 0x81,
+ 0x5d, 0x72, 0x03, 0x50, 0x03, 0x13, 0x01, 0x13, 0x54, 0x40, 0x00, 0x0e,
+ 0x06, 0x20, 0x06, 0x56, 0xe5, 0x2a, 0x00, 0x24, 0x10, 0x02, 0x00, 0x16,
+ 0x00, 0x02, 0x04, 0x01, 0x07, 0x08, 0xe5, 0x2a, 0x00, 0x20, 0x10, 0x03,
+ 0x00, 0x12, 0x00, 0x03, 0xe4, 0x78, 0x8e, 0x14, 0x00, 0x20, 0x10, 0x04,
+ 0x00, 0x12, 0x00, 0x04, 0xdb, 0xc0, 0x00, 0x20, 0xe0, 0x05, 0x00, 0x12,
+ 0x00, 0x05, 0xdb, 0xc0, 0x00, 0x20, 0xe0, 0x06, 0x00, 0x12, 0x00, 0x06,
+ 0xe7, 0x22, 0x00, 0x12, 0xe0, 0x01, 0x09, 0x6c, 0x06, 0xcc, 0x00, 0x04,
+ 0x00, 0x07, 0x00, 0x00, 0x06, 0x30, 0xe6, 0x42, 0x05, 0xf0, 0xe0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xe2, 0x00, 0x08, 0xff, 0x26,
+ 0x05, 0xdc, 0xe7, 0xae, 0x00, 0x3e, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00,
+ 0x00, 0x02, 0x00, 0x30, 0x50, 0x20, 0x0c, 0x23, 0x05, 0xfc, 0x06, 0x52,
+ 0x06, 0x56, 0x00, 0x00, 0x81, 0x00, 0x00, 0x16, 0xe0, 0x00, 0xc0, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x40, 0x2a, 0x04, 0x2a, 0x06, 0x56,
+ 0x00, 0x26, 0xec, 0x71, 0x06, 0x2b, 0x09, 0x72, 0x00, 0x22, 0x00, 0x24,
+ 0xec, 0x87, 0x0c, 0x23, 0x05, 0xfc, 0x08, 0x28, 0x09, 0x34, 0x08, 0x29,
+ 0x07, 0x58, 0x07, 0x78, 0x07, 0x98, 0x00, 0x23, 0x00, 0x2a, 0xec, 0x95,
+ 0x04, 0x06, 0x06, 0xf0, 0x04, 0x07, 0x06, 0xee, 0x00, 0x24, 0xdb, 0xc0,
+ 0x00, 0x34, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x26,
+ 0x40, 0x25, 0xdb, 0xc0, 0x00, 0x20, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x12, 0x40, 0x26, 0xdb, 0xc0, 0x00, 0x1a, 0xe0, 0x00,
+ 0x00, 0x0c, 0x60, 0x27, 0x08, 0x0a, 0x06, 0xe6, 0xdb, 0xc0, 0x00, 0x24,
+ 0xe0, 0x00, 0x00, 0x16, 0x60, 0x28, 0x04, 0x30, 0x07, 0x06, 0xdc, 0x16,
+ 0x81, 0x00, 0x00, 0x30, 0xe0, 0x00, 0x00, 0x22, 0x60, 0x29, 0x08, 0x2d,
+ 0x07, 0x1c, 0x08, 0x2e, 0x07, 0x22, 0x00, 0x00, 0x02, 0x08, 0x01, 0x06,
+ 0x06, 0x14, 0x08, 0x18, 0x0c, 0x20, 0x0e, 0x26, 0x0f, 0x30, 0x11, 0x34,
+ 0x12, 0x3e, 0x14, 0x42, 0x16, 0x46, 0x0a, 0x1c, 0x18, 0x4a, 0x03, 0x13,
+ 0x83, 0x11, 0x11, 0x01, 0x81, 0x11, 0x81, 0x12, 0x01, 0x13, 0x83, 0x52,
+ 0x85, 0x81, 0x11, 0x85, 0x81, 0x12, 0x81, 0x12, 0x81, 0x19, 0x85, 0x60,
+ 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x6c, 0x00, 0x00, 0x06, 0x30,
+ 0xec, 0xfc, 0x06, 0x54, 0x06, 0x50, 0x02, 0x38, 0x04, 0x21, 0x09, 0x1e,
+ 0x06, 0x0b, 0x06, 0xd8, 0x08, 0x02, 0x06, 0xdc, 0xc0, 0x00, 0xff, 0xff,
+ 0xff, 0xff, 0x00, 0x41, 0x00, 0x41, 0xae, 0x14, 0x00, 0x00, 0x81, 0x00,
+ 0x04, 0x09, 0x07, 0x0c, 0x00, 0x41, 0x00, 0x41, 0x02, 0x14, 0x00, 0x00,
+ 0x81, 0x00, 0x06, 0x0b, 0x06, 0xd8, 0x06, 0x2c, 0x09, 0x76, 0x14, 0x22,
+ 0x09, 0x3a, 0x00, 0x41, 0x00, 0x41, 0x02, 0x54, 0x00, 0x00, 0x81, 0x00,
+ 0x06, 0xd8, 0x84, 0x00, 0x48, 0x00, 0xff, 0xfc, 0x00, 0x09, 0xc0, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xad, 0x80, 0x02, 0x81, 0x00, 0x00,
+ 0x00, 0x00, 0xb0, 0x00, 0x06, 0x44, 0x54, 0x68, 0x69, 0x73, 0x20, 0x63,
+ 0x6f, 0x64, 0x65, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61,
+ 0x73, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x6c, 0x69,
+ 0x63, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x4f, 0x6e, 0x6c, 0x79, 0x2c, 0x20,
+ 0x41, 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x72,
+ 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x01, 0x60, 0x01, 0x42,
+ 0x08, 0x00, 0x16, 0x08, 0x03, 0xb0, 0x04, 0xe0, 0x00, 0x00, 0x01, 0x20,
+ 0x00, 0x00, 0xff, 0xff, 0x13, 0xfc, 0x03, 0x80, 0x07, 0xa0, 0x01, 0x42,
+ 0x08, 0x00, 0x07, 0x20, 0x00, 0x00, 0x04, 0xe0, 0x01, 0x00, 0x07, 0x8b,
+ 0x3d, 0x00, 0x01, 0x60, 0x01, 0x42, 0x00, 0x80, 0x13, 0x09, 0x07, 0x8b,
+ 0x2d, 0x00, 0xc0, 0x20, 0x01, 0x4e, 0x02, 0x80, 0x0f, 0x41, 0x11, 0x02,
+ 0x07, 0x8b, 0x3d, 0x00, 0xc8, 0x0b, 0x01, 0x4a, 0x02, 0x00, 0xa0, 0x00,
+ 0x09, 0xa0, 0xc8, 0x00, 0x01, 0x66, 0x02, 0xe0, 0x00, 0xa0, 0x07, 0xa0,
+ 0x01, 0x04, 0x00, 0x20, 0x01, 0xa0, 0x01, 0x40, 0xfe, 0x00, 0x48, 0x20,
+ 0xe0, 0x2a, 0x01, 0x42, 0x04, 0xe0, 0x01, 0x02, 0x04, 0xe0, 0x09, 0x60,
+ 0x04, 0xe0, 0x01, 0x82, 0x01, 0x60, 0x01, 0x1c, 0x00, 0x04, 0x16, 0x03,
+ 0x01, 0xe0, 0x01, 0x40, 0x0c, 0x00, 0x06, 0xa0, 0xb1, 0xbc, 0x07, 0xa0,
+ 0x01, 0x04, 0x00, 0x2d, 0xc2, 0x20, 0xe0, 0x00, 0x02, 0x88, 0xe2, 0x28,
+ 0x16, 0x14, 0x07, 0xa0, 0x01, 0x04, 0x00, 0x2e, 0x01, 0x60, 0x01, 0x42,
+ 0x03, 0x00, 0x16, 0x0d, 0x07, 0xa0, 0x01, 0x04, 0x00, 0x21, 0x07, 0x88,
+ 0xb0, 0x00, 0x07, 0x89, 0xff, 0xfe, 0x09, 0xa8, 0x09, 0xa9, 0x07, 0x8a,
+ 0xe0, 0x02, 0x06, 0xa0, 0xf4, 0x42, 0x10, 0x56, 0x07, 0x88, 0xa0, 0x00,
+ 0x07, 0x89, 0xaf, 0xfe, 0x09, 0xa8, 0x09, 0xa9, 0x07, 0x8a, 0xe0, 0x78,
+ 0x06, 0xa0, 0xf4, 0x42, 0x10, 0x4b, 0x05, 0xa0, 0x01, 0x04, 0x07, 0x88,
+ 0x00, 0x08, 0x07, 0x89, 0x00, 0x7a, 0x03, 0x00, 0x00, 0x01, 0x06, 0xa0,
+ 0xf4, 0x7c, 0x10, 0x40, 0x06, 0xa0, 0xb1, 0xbc, 0x02, 0xe0, 0x03, 0xf4,
+ 0x07, 0x88, 0x00, 0xa0, 0x07, 0x89, 0x00, 0xfe, 0x06, 0xa0, 0xf4, 0x7c,
+ 0x10, 0x35, 0x02, 0xe0, 0x00, 0xa0, 0x04, 0xe0, 0x01, 0x7e, 0x04, 0xc8,
+ 0x02, 0x09, 0x03, 0xf2, 0x62, 0x48, 0xc1, 0xe0, 0x01, 0x40, 0x01, 0xa0,
+ 0x01, 0x40, 0x04, 0x00, 0xce, 0x18, 0x06, 0x09, 0x16, 0xfd, 0x01, 0xa0,
+ 0x01, 0x40, 0x40, 0x00, 0xc8, 0x07, 0x01, 0x40, 0x07, 0x88, 0x03, 0xf4,
+ 0x07, 0x89, 0x3f, 0xfe, 0x06, 0xa0, 0xf4, 0x7c, 0x10, 0x19, 0x02, 0xe0,
+ 0x00, 0xa0, 0x06, 0xa0, 0xf5, 0xa4, 0x10, 0x14, 0xc8, 0x08, 0x04, 0x44,
+ 0xc8, 0x09, 0x04, 0x46, 0x06, 0xa0, 0xf4, 0xd2, 0x10, 0x0d, 0x07, 0x81,
+ 0xe0, 0x7c, 0xc0, 0xb1, 0x13, 0x26, 0xc8, 0x01, 0x00, 0xe0, 0x05, 0xa0,
+ 0x01, 0x04, 0x06, 0x92, 0x10, 0x03, 0xc0, 0x60, 0x00, 0xe0, 0x10, 0xf5,
+ 0x01, 0xe0, 0x01, 0x04, 0x00, 0x10, 0x03, 0xb0, 0x10, 0xff, 0x01, 0xa0,
+ 0x01, 0x04, 0x80, 0x00, 0x03, 0x80, 0x07, 0x80, 0x00, 0xa0, 0x04, 0xc2,
+ 0xcc, 0x80, 0x07, 0x81, 0xb1, 0xaa, 0x02, 0x82, 0x00, 0x1e, 0x16, 0x02,
+ 0x07, 0x81, 0xb1, 0xb4, 0xc4, 0x81, 0x8c, 0x81, 0x16, 0xe9, 0x02, 0x82,
+ 0x00, 0x7c, 0x16, 0xf2, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x5b, 0x07, 0x81,
+ 0xe1, 0x08, 0x07, 0x82, 0x00, 0x04, 0x04, 0xe0, 0x01, 0x80, 0x04, 0xe0,
+ 0x01, 0x82, 0xc4, 0x91, 0x8c, 0xb1, 0x16, 0xd8, 0x02, 0x82, 0x00, 0x7c,
+ 0x16, 0xfa, 0xc8, 0x20, 0xe0, 0x04, 0x01, 0x82, 0xe8, 0x20, 0xe0, 0x0c,
+ 0x01, 0x82, 0xc8, 0x20, 0xe0, 0x10, 0x01, 0x80, 0x07, 0x81, 0xe0, 0x86,
+ 0xc0, 0xb1, 0x13, 0x07, 0xc4, 0xb1, 0x10, 0xfc, 0x07, 0xa0, 0x01, 0x04,
+ 0x00, 0x2e, 0x04, 0x60, 0xb1, 0xaa, 0x07, 0x81, 0xe0, 0x34, 0x07, 0x82,
+ 0x05, 0xfc, 0x07, 0x83, 0x00, 0x0a, 0xcc, 0xb1, 0x06, 0x43, 0x16, 0xfd,
+ 0x02, 0x02, 0x06, 0x00, 0xd0, 0x60, 0x01, 0x4e, 0x13, 0xed, 0x02, 0x21,
+ 0xf7, 0x00, 0x02, 0x21, 0xc0, 0x00, 0xdc, 0x81, 0xd0, 0x60, 0x01, 0x4f,
+ 0xc0, 0xc1, 0x09, 0x41, 0x02, 0x21, 0xf0, 0x00, 0xdc, 0x81, 0x02, 0x43,
+ 0x0f, 0x00, 0x02, 0x23, 0xf0, 0x00, 0xdc, 0x83, 0x02, 0x01, 0x0c, 0x32,
+ 0xc0, 0xa0, 0x04, 0x44, 0xc0, 0xe0, 0x04, 0x46, 0xc1, 0x03, 0x61, 0x02,
+ 0x05, 0x84, 0xc8, 0x04, 0x04, 0x48, 0xc1, 0x03, 0x05, 0x84, 0xa1, 0x04,
+ 0xa1, 0x01, 0xc8, 0x04, 0x0c, 0x30, 0xc1, 0x03, 0x05, 0x84, 0x04, 0xf1,
+ 0x06, 0x04, 0x16, 0xfd, 0x02, 0x08, 0xb0, 0x00, 0x09, 0xa8, 0xc2, 0x60,
+ 0x0c, 0x30, 0x02, 0x29, 0x03, 0xff, 0x09, 0xa9, 0x02, 0x29, 0x00, 0x40,
+ 0x07, 0x80, 0xa0, 0x00, 0x09, 0xa0, 0x07, 0x8a, 0xaf, 0xfe, 0x02, 0x2a,
+ 0x03, 0xff, 0x09, 0xaa, 0x02, 0x01, 0x0c, 0x32, 0x02, 0x05, 0x00, 0x00,
+ 0xc1, 0x03, 0x05, 0x84, 0x07, 0x11, 0x05, 0xc1, 0x05, 0x85, 0x06, 0x04,
+ 0x13, 0x0b, 0x80, 0x85, 0x1a, 0xf9, 0x80, 0x05, 0x1a, 0xf8, 0x82, 0x85,
+ 0x1a, 0xf5, 0x82, 0x05, 0x1a, 0xf4, 0x82, 0x45, 0x1a, 0xf1, 0x10, 0xf1,
+ 0x2d, 0x20, 0x00, 0x02, 0x01, 0x60, 0x01, 0x40, 0x40, 0x00, 0x16, 0x06,
+ 0x07, 0x8a, 0x08, 0x00, 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, 0x10, 0x48,
+ 0x01, 0x60, 0x01, 0x42, 0x80, 0x00, 0x16, 0x06, 0x07, 0x8a, 0x10, 0x00,
+ 0x01, 0xa0, 0x01, 0x42, 0x80, 0x00, 0x10, 0x3e, 0x01, 0x60, 0x01, 0x02,
+ 0x10, 0x00, 0x16, 0x0a, 0x01, 0x60, 0x01, 0x00, 0x04, 0x00, 0x16, 0x06,
+ 0x07, 0x8a, 0x80, 0x00, 0x01, 0xa0, 0x01, 0x02, 0x10, 0x00, 0x10, 0x30,
+ 0x01, 0x60, 0x01, 0x02, 0x08, 0x00, 0x16, 0x0a, 0x01, 0x60, 0x01, 0x00,
+ 0x04, 0x00, 0x16, 0x06, 0x01, 0xa0, 0x01, 0x02, 0x08, 0x00, 0x02, 0x0d,
+ 0x00, 0x01, 0x10, 0x0d, 0x01, 0x60, 0x01, 0x02, 0x04, 0x00, 0x16, 0x16,
+ 0x01, 0x60, 0x01, 0x00, 0x08, 0x00, 0x16, 0x12, 0x01, 0xa0, 0x01, 0x02,
+ 0x04, 0x00, 0x02, 0x0d, 0x00, 0x02, 0xc3, 0xa0, 0x01, 0x0e, 0xc3, 0xe0,
+ 0x01, 0x10, 0x07, 0x8a, 0x20, 0x00, 0x01, 0x60, 0x01, 0x00, 0x80, 0x00,
+ 0x13, 0x0b, 0x07, 0x8a, 0x40, 0x00, 0x10, 0x08, 0x07, 0x8a, 0x00, 0x04,
+ 0x10, 0x05, 0x07, 0x8a, 0x00, 0x02, 0x10, 0x02, 0x07, 0x8a, 0x00, 0x08,
+ 0x03, 0x00, 0x00, 0x00, 0x04, 0xe0, 0x01, 0x82, 0x07, 0x8b, 0x05, 0xe0,
+ 0xce, 0xca, 0xce, 0xcd, 0xce, 0xce, 0xc6, 0xcf, 0xc3, 0x20, 0x07, 0x58,
+ 0x23, 0x20, 0xe0, 0x04, 0x13, 0x12, 0x07, 0x8b, 0xff, 0x18, 0x02, 0x8a,
+ 0x80, 0x00, 0x13, 0x0a, 0x05, 0x8b, 0xa2, 0xcd, 0x02, 0x8a, 0x40, 0x00,
+ 0x13, 0x05, 0x02, 0x8a, 0x20, 0x00, 0x13, 0x02, 0x07, 0x8b, 0xff, 0x1d,
+ 0xc8, 0x0b, 0x01, 0x04, 0x10, 0x0d, 0xd3, 0x20, 0x01, 0x05, 0x11, 0xfd,
+ 0xd8, 0x20, 0x07, 0xdf, 0x01, 0x17, 0x07, 0x8b, 0xff, 0x80, 0xc8, 0x0b,
+ 0x01, 0x04, 0xe8, 0x20, 0xe0, 0x0a, 0x01, 0x00, 0xc2, 0xe0, 0x01, 0x04,
+ 0x22, 0xe0, 0xe1, 0x86, 0x16, 0xfb, 0x02, 0xe0, 0x00, 0xa0, 0x04, 0xe0,
+ 0x01, 0x82, 0xe8, 0x20, 0xe0, 0x0a, 0x01, 0x00, 0xc2, 0xe0, 0x01, 0x00,
+ 0x22, 0xe0, 0xe0, 0x06, 0x13, 0xf8, 0x01, 0xa0, 0x01, 0x40, 0xf6, 0x00,
+ 0x04, 0x60, 0xb0, 0x90, 0x03, 0x00, 0x00, 0x02, 0x07, 0xa0, 0x01, 0x02,
+ 0xdf, 0xff, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02,
+ 0x07, 0x09, 0xc2, 0xa0, 0x01, 0x04, 0x01, 0x8a, 0x00, 0x80, 0x52, 0x4a,
+ 0xd2, 0x89, 0xc8, 0x0a, 0x01, 0x04, 0xd2, 0xa0, 0x01, 0x04, 0x16, 0xf9,
+ 0x05, 0x49, 0x01, 0x89, 0x80, 0x00, 0x01, 0x49, 0x40, 0x00, 0x13, 0x0e,
+ 0xf8, 0x09, 0x07, 0x3a, 0xc2, 0x60, 0x07, 0x36, 0x16, 0x03, 0x03, 0x90,
+ 0xff, 0xff, 0x03, 0x80, 0x04, 0xe0, 0x07, 0x36, 0x04, 0x54, 0x03, 0x90,
+ 0xff, 0xff, 0x03, 0x80, 0x22, 0x60, 0xe1, 0x86, 0x13, 0xc2, 0x04, 0xe0,
+ 0x01, 0x82, 0x04, 0x60, 0xb3, 0xe0, 0x03, 0x00, 0x00, 0x02, 0x07, 0xa0,
+ 0x09, 0x62, 0x03, 0xe8, 0x04, 0xc9, 0xc1, 0xa0, 0x06, 0x34, 0x16, 0x04,
+ 0x06, 0xa0, 0xc2, 0xae, 0x04, 0xe0, 0x09, 0x20, 0x07, 0x86, 0x05, 0xe8,
+ 0x01, 0xa0, 0x01, 0x40, 0x80, 0x00, 0xc2, 0x20, 0x01, 0x84, 0x48, 0x20,
+ 0xe0, 0x08, 0x01, 0x84, 0x22, 0x20, 0xe0, 0x08, 0x13, 0x08, 0x01, 0x60,
+ 0x01, 0xae, 0x00, 0x01, 0x16, 0x04, 0x01, 0xe0, 0x06, 0x34, 0x80, 0x00,
+ 0x10, 0x06, 0xc2, 0x20, 0x09, 0x32, 0x13, 0x06, 0x01, 0xe0, 0x06, 0x34,
+ 0x08, 0x00, 0x04, 0xe0, 0x06, 0x30, 0x07, 0x09, 0x05, 0xa0, 0x05, 0xee,
+ 0x06, 0x20, 0x05, 0xec, 0x16, 0x02, 0xc2, 0x16, 0x16, 0x03, 0xc2, 0x49,
+ 0x16, 0x12, 0x03, 0x80, 0xc5, 0x98, 0xc1, 0xe8, 0x00, 0x02, 0xe9, 0xe0,
+ 0xe0, 0x14, 0x00, 0x04, 0x04, 0xd7, 0x02, 0x27, 0x00, 0x08, 0x06, 0xa0,
+ 0xc2, 0x44, 0xc2, 0x16, 0x13, 0x04, 0xc8, 0x28, 0x00, 0x08, 0x05, 0xec,
+ 0x13, 0xef, 0x04, 0x54, 0x03, 0x00, 0x00, 0x02, 0xc1, 0xe0, 0x01, 0x86,
+ 0x02, 0x47, 0x00, 0x0e, 0xc2, 0xa7, 0xe1, 0x90, 0x04, 0x5a, 0x07, 0x8a,
+ 0xa0, 0x00, 0xc8, 0x0a, 0x01, 0x86, 0xa1, 0xc7, 0x02, 0x27, 0xe1, 0x98,
+ 0xe8, 0x37, 0x06, 0x34, 0xe8, 0x17, 0x06, 0xd2, 0x04, 0xe0, 0x06, 0x30,
+ 0x04, 0x60, 0xb9, 0xc0, 0xe8, 0x0a, 0x06, 0xd2, 0x01, 0xe0, 0x06, 0x34,
+ 0x08, 0x00, 0x04, 0xe0, 0x06, 0x30, 0xe0, 0x20, 0xe0, 0x18, 0x04, 0x5b,
+ 0x05, 0xa0, 0x09, 0x20, 0x88, 0x20, 0x09, 0x20, 0xe0, 0x16, 0x1a, 0xe5,
+ 0x04, 0xe0, 0x09, 0x20, 0x06, 0xa0, 0xe1, 0x18, 0x03, 0x80, 0x05, 0xa0,
+ 0x09, 0x32, 0x03, 0x80, 0xc3, 0x01, 0x13, 0xfb, 0x01, 0x60, 0x09, 0x6a,
+ 0x00, 0x01, 0x13, 0x78, 0x05, 0xa0, 0x09, 0x32, 0x10, 0x75, 0xc0, 0x41,
+ 0x13, 0x06, 0xc8, 0x01, 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x02, 0x11, 0x01,
+ 0x10, 0x7b, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40, 0x16, 0x79, 0xd8, 0x20,
+ 0x09, 0x2f, 0x01, 0x83, 0xc0, 0x41, 0x13, 0x04, 0xc8, 0x01, 0x01, 0x8a,
+ 0xc8, 0x01, 0x09, 0x18, 0x07, 0x86, 0x00, 0x43, 0xc8, 0x06, 0x01, 0x6c,
+ 0x02, 0x07, 0xfc, 0x02, 0xc2, 0x17, 0x04, 0x60, 0xb6, 0xfa, 0x04, 0xe0,
+ 0x09, 0x18, 0x61, 0xc7, 0x07, 0x08, 0x01, 0x60, 0xfc, 0x06, 0x00, 0x40,
+ 0x13, 0x02, 0x02, 0x08, 0x00, 0x01, 0x10, 0x09, 0xc2, 0x4c, 0xc3, 0x20,
+ 0xfc, 0x00, 0x13, 0x2a, 0xc8, 0x0c, 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x02,
+ 0x11, 0x1b, 0x01, 0x4b, 0x01, 0x00, 0x16, 0xf4, 0x22, 0xc8, 0x13, 0x12,
+ 0x01, 0xcb, 0x40, 0x00, 0xc8, 0x0b, 0xfc, 0x02, 0x10, 0x0d, 0xc1, 0xe0,
+ 0x09, 0x18, 0xc3, 0x01, 0x13, 0x21, 0xc2, 0x4c, 0x13, 0x15, 0xc8, 0x0c,
+ 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x02, 0x11, 0x06, 0x81, 0xcc, 0x13, 0xd5,
+ 0xc2, 0x4c, 0xc3, 0x20, 0xfc, 0x00, 0x10, 0xf4, 0xc8, 0x09, 0x01, 0x6c,
+ 0xc2, 0xe0, 0xfc, 0x02, 0x16, 0x1e, 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00,
+ 0xc3, 0x09, 0x10, 0x19, 0xc8, 0x09, 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x02,
+ 0x16, 0x05, 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00, 0xc3, 0x09, 0x10, 0x0f,
+ 0xc2, 0xe0, 0x0c, 0x02, 0x11, 0x01, 0x10, 0x1e, 0xd8, 0x20, 0xe2, 0x00,
+ 0x01, 0x83, 0x00, 0x00, 0xb6, 0x44, 0x00, 0x09, 0x09, 0x8b, 0x00, 0x00,
+ 0xb6, 0x4c, 0x0b, 0x36, 0x07, 0xa0, 0x01, 0x8a, 0x00, 0x43, 0x10, 0x13,
+ 0xc8, 0x0c, 0x01, 0x8a, 0xc8, 0x0c, 0x09, 0x18, 0x10, 0x0e, 0x03, 0x00,
+ 0x00, 0x02, 0xc0, 0xe0, 0x01, 0x6c, 0xc3, 0x20, 0x01, 0x8a, 0x98, 0x20,
+ 0x01, 0x83, 0xe2, 0x00, 0x13, 0x81, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40,
+ 0x13, 0xb9, 0x83, 0x01, 0x16, 0x31, 0xc8, 0x03, 0x01, 0x6c, 0x01, 0x40,
+ 0x00, 0x10, 0x16, 0x14, 0xc2, 0xe0, 0x06, 0x2e, 0x13, 0x11, 0xc2, 0xe0,
+ 0x05, 0xf8, 0x13, 0x0e, 0x01, 0xe0, 0x07, 0x3a, 0x80, 0x00, 0x01, 0x80,
+ 0x00, 0x10, 0xc2, 0xe0, 0x07, 0x36, 0x13, 0x06, 0x04, 0xe0, 0x07, 0x36,
+ 0x01, 0x80, 0x00, 0x20, 0x04, 0x60, 0xb9, 0xc0, 0x01, 0x40, 0x00, 0x20,
+ 0x13, 0xf9, 0x03, 0x90, 0x11, 0xff, 0x03, 0x80, 0x01, 0x08, 0x04, 0x00,
+ 0x16, 0x19, 0x01, 0x60, 0x09, 0x6a, 0x00, 0x01, 0x16, 0x15, 0x01, 0x88,
+ 0x1a, 0x00, 0x01, 0xc8, 0x01, 0x00, 0xc5, 0xc8, 0x10, 0x0f, 0x04, 0xe0,
+ 0x09, 0x18, 0x01, 0xc0, 0x00, 0x04, 0x10, 0x15, 0xc1, 0x81, 0xc8, 0x01,
+ 0x01, 0x6c, 0x02, 0x07, 0xfc, 0x00, 0xc0, 0x77, 0xc2, 0x17, 0x01, 0x48,
+ 0x18, 0x00, 0x13, 0xe4, 0x01, 0x40, 0x00, 0x40, 0x16, 0x15, 0x01, 0x80,
+ 0x00, 0x45, 0xc1, 0x46, 0xd0, 0x20, 0xfc, 0x07, 0x81, 0x60, 0x09, 0x18,
+ 0x13, 0xe6, 0xc2, 0xe0, 0xfc, 0x08, 0x11, 0x08, 0xc2, 0xe0, 0xfc, 0x0e,
+ 0x15, 0x07, 0x13, 0x06, 0xc2, 0xe0, 0xfc, 0x14, 0x15, 0x03, 0x13, 0x02,
+ 0x01, 0xc0, 0x00, 0x01, 0x01, 0x48, 0x01, 0x00, 0x13, 0x11, 0x01, 0x40,
+ 0x40, 0x80, 0x13, 0x5b, 0x04, 0x60, 0xb6, 0x66, 0x01, 0x48, 0x00, 0x01,
+ 0x16, 0x03, 0x01, 0x40, 0x40, 0x00, 0x16, 0x0b, 0x01, 0xc8, 0x40, 0x00,
+ 0x05, 0xa0, 0x09, 0x32, 0xc5, 0xc8, 0x10, 0x05, 0x01, 0xc0, 0x00, 0x40,
+ 0x01, 0x40, 0x00, 0x04, 0x13, 0xef, 0x05, 0xc7, 0xc2, 0xd7, 0x62, 0xc4,
+ 0x05, 0x0b, 0x02, 0x2b, 0xff, 0xfc, 0xc5, 0xcb, 0x15, 0x02, 0x81, 0x46,
+ 0x13, 0x5d, 0x01, 0x08, 0x5e, 0x00, 0x16, 0x5a, 0x01, 0x08, 0x00, 0x88,
+ 0x16, 0x13, 0x02, 0x86, 0x00, 0x43, 0x16, 0x1e, 0x01, 0x40, 0x40, 0x00,
+ 0x13, 0x0b, 0x01, 0x08, 0x00, 0x03, 0x13, 0x08, 0xc2, 0x84, 0x02, 0x2a,
+ 0xff, 0xd8, 0xc8, 0x06, 0x01, 0x6c, 0x68, 0x0a, 0xfc, 0x04, 0x10, 0x66,
+ 0x04, 0x60, 0xb8, 0xa8, 0x01, 0x40, 0x00, 0x01, 0x13, 0xea, 0x01, 0x08,
+ 0x00, 0x02, 0x16, 0xe7, 0x01, 0x48, 0x00, 0x01, 0x16, 0xe4, 0x07, 0x8a,
+ 0x00, 0x80, 0x06, 0xa0, 0xb5, 0x32, 0x10, 0xdf, 0xc0, 0x00, 0x11, 0xee,
+ 0xc2, 0x60, 0x09, 0x6a, 0x01, 0x40, 0x40, 0x00, 0x13, 0x0a, 0x01, 0x48,
+ 0x00, 0x01, 0x13, 0x2e, 0x01, 0x48, 0x00, 0x02, 0x13, 0x04, 0x01, 0x49,
+ 0x00, 0x04, 0x16, 0xe0, 0x10, 0x00, 0x01, 0x49, 0x00, 0x01, 0x13, 0x12,
+ 0x01, 0x40, 0x40, 0x80, 0x16, 0x01, 0xc1, 0x46, 0x04, 0xe0, 0xfc, 0x00,
+ 0x07, 0x87, 0x05, 0xf8, 0xc2, 0x17, 0x13, 0x14, 0x05, 0xc7, 0xc8, 0x17,
+ 0x01, 0x6c, 0xc8, 0x05, 0xfc, 0x00, 0xc5, 0xc6, 0x04, 0x60, 0xb6, 0x66,
+ 0x02, 0x07, 0xfc, 0x02, 0xa1, 0xe0, 0x09, 0x2c, 0xcd, 0xe0, 0x05, 0xee,
+ 0xc5, 0xe0, 0xfc, 0x04, 0xc8, 0x20, 0x09, 0x2c, 0xfc, 0x04, 0x10, 0xe2,
+ 0xcd, 0xc5, 0xc5, 0xc6, 0x04, 0x60, 0xb6, 0x66, 0x04, 0x60, 0xb8, 0x8c,
+ 0xc8, 0x06, 0x01, 0x6c, 0x81, 0x85, 0x13, 0x1a, 0xc2, 0xe0, 0xfc, 0x04,
+ 0x15, 0x17, 0xc2, 0x86, 0xa2, 0x8a, 0xc1, 0xaa, 0x0c, 0x32, 0xc8, 0x06,
+ 0x01, 0x6c, 0xa8, 0x0b, 0xfc, 0x04, 0x09, 0x1a, 0xc8, 0x0a, 0x01, 0x6c,
+ 0xc2, 0xe0, 0xfc, 0x02, 0x04, 0xe0, 0xfc, 0x00, 0xc8, 0x06, 0x01, 0x6c,
+ 0xc8, 0x0b, 0xfc, 0x02, 0x06, 0xa0, 0xc1, 0x9c, 0xc8, 0x06, 0x01, 0x6c,
+ 0x04, 0xe0, 0xfc, 0x00, 0x01, 0xa0, 0xfc, 0x02, 0x00, 0x02, 0x07, 0x87,
+ 0x06, 0x30, 0x01, 0xe7, 0x00, 0x04, 0x00, 0x40, 0x04, 0xd7, 0x02, 0x27,
+ 0x00, 0x0c, 0xc2, 0x05, 0x06, 0xa0, 0xc2, 0x5a, 0x01, 0xc0, 0x00, 0x20,
+ 0x04, 0x60, 0xb6, 0x66, 0x01, 0x48, 0x18, 0x00, 0x13, 0x03, 0x01, 0x48,
+ 0x10, 0x00, 0x16, 0x02, 0x05, 0xa0, 0x09, 0x32, 0x02, 0x86, 0x00, 0x43,
+ 0x13, 0x03, 0x01, 0x40, 0x40, 0x80, 0x13, 0x9f, 0xc8, 0x06, 0x01, 0x6c,
+ 0x04, 0xe0, 0xfc, 0x00, 0xc2, 0x85, 0x06, 0xa0, 0xc1, 0x9c, 0x06, 0x20,
+ 0x09, 0x62, 0x16, 0xe6, 0x06, 0xa0, 0xe1, 0x18, 0x10, 0xe3, 0xc2, 0xa0,
+ 0x05, 0xf6, 0x16, 0x52, 0xc8, 0x19, 0x05, 0xf0, 0xc2, 0xa9, 0x00, 0x0a,
+ 0x11, 0x0d, 0xf2, 0xa0, 0x09, 0x2e, 0xd8, 0x0a, 0x01, 0x80, 0xc8, 0x29,
+ 0x00, 0x06, 0x01, 0x8c, 0x07, 0xa0, 0x09, 0x16, 0x00, 0x04, 0xc8, 0x09,
+ 0x05, 0xf4, 0x10, 0x42, 0xc8, 0x29, 0x00, 0x06, 0x01, 0x6c, 0xc8, 0x20,
+ 0xfc, 0x0e, 0x01, 0xbc, 0xc8, 0x20, 0xfc, 0x10, 0x01, 0xb0, 0xc8, 0x20,
+ 0xfc, 0x12, 0x01, 0xb2, 0xf2, 0xa0, 0x09, 0x2e, 0x01, 0x8a, 0x10, 0x00,
+ 0x01, 0xa0, 0x01, 0x80, 0xc4, 0x00, 0x10, 0xe1, 0x01, 0x47, 0x00, 0x08,
+ 0x16, 0x06, 0xc2, 0xa8, 0x00, 0x06, 0x06, 0xa0, 0xc1, 0x9c, 0x04, 0xe8,
+ 0x00, 0x06, 0x01, 0x07, 0x00, 0x20, 0x13, 0x2d, 0x04, 0xe8, 0x00, 0x02,
+ 0x10, 0x37, 0x04, 0xe0, 0xfc, 0x00, 0x06, 0xa0, 0xc1, 0x9c, 0x10, 0x25,
+ 0x03, 0x00, 0x00, 0x02, 0xc2, 0x20, 0x01, 0x8c, 0xc0, 0xe0, 0x01, 0x6c,
+ 0xc2, 0x20, 0x05, 0xf4, 0xc8, 0x28, 0x00, 0x08, 0x01, 0x6c, 0xc1, 0xe8,
+ 0x00, 0x0a, 0xc3, 0x20, 0xfc, 0x02, 0x01, 0x0c, 0xfe, 0x00, 0x16, 0x3b,
+ 0x01, 0x47, 0x00, 0x40, 0x13, 0x50, 0xc2, 0x60, 0x05, 0xf0, 0x16, 0xab,
+ 0x04, 0xe0, 0x05, 0xf4, 0xca, 0x0c, 0x00, 0x08, 0x01, 0x47, 0x00, 0x80,
+ 0x16, 0xcd, 0xc8, 0x28, 0x00, 0x06, 0x01, 0x6c, 0xc2, 0xa0, 0xfc, 0x00,
+ 0x16, 0xd6, 0xc1, 0xe8, 0x00, 0x02, 0xc2, 0xd7, 0x16, 0x0f, 0x02, 0x27,
+ 0x00, 0x10, 0x04, 0xd8, 0xc2, 0x57, 0x13, 0x0e, 0x05, 0xc7, 0xc2, 0x57,
+ 0xc6, 0x48, 0xc5, 0xc8, 0xc8, 0x03, 0x01, 0x6c, 0x11, 0x0d, 0x03, 0x90,
+ 0x11, 0xff, 0x03, 0x80, 0x04, 0xd7, 0x01, 0xc3, 0x80, 0x00, 0x10, 0xed,
+ 0x01, 0xe7, 0xff, 0xf4, 0x00, 0x20, 0xcd, 0xc8, 0xc5, 0xc8, 0x10, 0xf0,
+ 0x03, 0x90, 0x11, 0xf8, 0x02, 0xe0, 0x00, 0xc0, 0xc3, 0x60, 0x00, 0xfa,
+ 0xc3, 0xa0, 0x00, 0xfc, 0xc3, 0xe0, 0x00, 0xfe, 0x04, 0x54, 0xc2, 0xe8,
+ 0x00, 0x08, 0xc2, 0xa8, 0x00, 0x06, 0xc3, 0x0c, 0x11, 0x33, 0x23, 0x20,
+ 0xe0, 0x0a, 0x13, 0x45, 0x23, 0x20, 0xe0, 0x10, 0x13, 0x46, 0x23, 0x20,
+ 0xe0, 0x0e, 0x13, 0x13, 0x21, 0xe0, 0xe0, 0x16, 0x16, 0xb6, 0x23, 0x20,
+ 0xe0, 0x06, 0x16, 0x03, 0x27, 0x20, 0xe4, 0x68, 0x13, 0x0a, 0xc2, 0xe8,
+ 0x00, 0x08, 0xc2, 0xa8, 0x00, 0x06, 0x01, 0x4c, 0x00, 0x88, 0x16, 0xa9,
+ 0x01, 0x0c, 0x00, 0x44, 0x16, 0xa6, 0x06, 0x20, 0x09, 0x16, 0x13, 0xa3,
+ 0xc8, 0x0a, 0x01, 0x6c, 0xc8, 0x20, 0xe0, 0x04, 0xfc, 0x02, 0xc8, 0x0b,
+ 0x01, 0x6c, 0x07, 0xa0, 0xfc, 0x02, 0x81, 0x00, 0xc3, 0x20, 0x01, 0x80,
+ 0x01, 0xa0, 0x01, 0x80, 0xc4, 0x00, 0xc8, 0x0c, 0x01, 0x80, 0xc8, 0x0a,
+ 0x01, 0x8c, 0x10, 0xac, 0xc2, 0x0a, 0x13, 0x0f, 0xc8, 0x08, 0x01, 0x6c,
+ 0xc2, 0xa0, 0xfc, 0x00, 0xc3, 0x20, 0xfc, 0x02, 0x23, 0x20, 0xe0, 0x12,
+ 0x16, 0xf5, 0xc8, 0x0b, 0x01, 0x6c, 0xc8, 0x0c, 0xfc, 0x02, 0x04, 0x60,
+ 0xb9, 0x48, 0x07, 0x8a, 0x04, 0x00, 0x04, 0x60, 0xb3, 0x8a, 0x07, 0x8a,
+ 0x00, 0x20, 0x04, 0x60, 0xb3, 0x8a, 0x07, 0x8a, 0x02, 0x00, 0x27, 0x20,
+ 0xe0, 0x0e, 0x16, 0x02, 0x06, 0xa0, 0xb5, 0x32, 0xc2, 0xa8, 0x00, 0x06,
+ 0x04, 0x60, 0xb9, 0x66, 0x03, 0x00, 0x00, 0x02, 0x01, 0xc0, 0x00, 0x10,
+ 0xc2, 0xe0, 0x06, 0x2e, 0x13, 0x08, 0xc2, 0xe0, 0x05, 0xf8, 0x13, 0x05,
+ 0x01, 0xe0, 0x07, 0x3a, 0x80, 0x00, 0x01, 0x80, 0x00, 0x10, 0x03, 0x90,
+ 0x7f, 0xff, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0xc2, 0x20, 0x05, 0xf6,
+ 0xe2, 0x20, 0x05, 0xf4, 0x16, 0x0e, 0xd8, 0x20, 0x09, 0x2e, 0x01, 0x80,
+ 0xc8, 0x2b, 0x00, 0x06, 0x01, 0x8c, 0x07, 0xa0, 0x09, 0x16, 0x00, 0x04,
+ 0xc8, 0x0b, 0x05, 0xf4, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x07, 0x87,
+ 0x05, 0xf0, 0x04, 0xdb, 0xc2, 0x57, 0x16, 0x05, 0xcd, 0xcb, 0xc5, 0xcb,
+ 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x05, 0xc7, 0xc2, 0x57, 0xc6, 0x4b,
+ 0xc5, 0xcb, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02,
+ 0xc2, 0x0b, 0xc3, 0x20, 0x05, 0xf4, 0x13, 0x0f, 0xc2, 0xa8, 0x00, 0x0a,
+ 0x01, 0x4a, 0x00, 0x10, 0x16, 0x16, 0x22, 0xa0, 0xe0, 0x04, 0x16, 0x1a,
+ 0xc3, 0x08, 0x06, 0xa0, 0xbb, 0xfe, 0xc2, 0x0c, 0xc3, 0x20, 0x05, 0xf4,
+ 0x16, 0x13, 0x01, 0x68, 0x00, 0x0a, 0x00, 0x10, 0x13, 0x03, 0xc2, 0xe0,
+ 0x05, 0xf6, 0x16, 0x05, 0x06, 0xa0, 0xbc, 0x40, 0x03, 0x90, 0xff, 0xff,
+ 0x03, 0x80, 0x07, 0x87, 0x05, 0xf0, 0x06, 0xa0, 0xc2, 0x44, 0x03, 0x90,
+ 0xff, 0xff, 0x03, 0x80, 0x07, 0x87, 0x05, 0xf0, 0x06, 0xa0, 0xc2, 0x8a,
+ 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0x07, 0x87, 0x05, 0xf0, 0xc2, 0xcb,
+ 0x16, 0x08, 0x06, 0xa0, 0xbb, 0xfe, 0x07, 0x20, 0x05, 0xf6, 0xcb, 0x60,
+ 0x05, 0xf4, 0x00, 0x02, 0x03, 0x80, 0x04, 0xe0, 0x05, 0xf6, 0xc2, 0x20,
+ 0x05, 0xf4, 0x16, 0x05, 0xc2, 0x17, 0x13, 0x03, 0xc5, 0xd8, 0x06, 0xa0,
+ 0xbc, 0x40, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0xc2, 0x8b, 0x06, 0xa0,
+ 0xbb, 0xfe, 0xc1, 0xca, 0x02, 0x27, 0x00, 0x10, 0x07, 0x88, 0x05, 0xf0,
+ 0xc1, 0x88, 0xc2, 0x18, 0x13, 0x26, 0x82, 0xa8, 0x00, 0x02, 0x16, 0xfa,
+ 0xc2, 0xe8, 0x00, 0x0a, 0x22, 0xe0, 0xe0, 0x1e, 0x16, 0xf5, 0xc5, 0x98,
+ 0x22, 0xe0, 0xe0, 0x1c, 0x16, 0x0b, 0xc8, 0x28, 0x00, 0x06, 0x00, 0xf4,
+ 0x02, 0xe0, 0x00, 0xe0, 0x06, 0xa0, 0xc1, 0x9c, 0x02, 0xe0, 0x00, 0xc0,
+ 0x04, 0xe8, 0x00, 0x06, 0x22, 0xe0, 0xe0, 0x18, 0x13, 0xe4, 0xea, 0x20,
+ 0xe0, 0x22, 0x00, 0x0a, 0xea, 0xa0, 0xe0, 0x18, 0x00, 0x04, 0x04, 0xda,
+ 0x06, 0xa0, 0xc2, 0x44, 0x06, 0x47, 0xc2, 0x06, 0x10, 0xd8, 0xc8, 0x06,
+ 0x05, 0xf2, 0xcb, 0x60, 0x05, 0xf4, 0x00, 0x02, 0x04, 0x54, 0xc2, 0x20,
+ 0x05, 0xf4, 0x13, 0x13, 0x01, 0xe0, 0x01, 0x9c, 0x40, 0x00, 0x0b, 0x8b,
+ 0x0b, 0x8b, 0x01, 0x60, 0x01, 0x9c, 0x40, 0x00, 0x16, 0x0a, 0xc2, 0x60,
+ 0x01, 0x6c, 0xc8, 0x28, 0x00, 0x06, 0x01, 0x6c, 0xc2, 0xa0, 0xfc, 0x02,
+ 0x11, 0x03, 0xc8, 0x09, 0x01, 0x6c, 0x04, 0x5b, 0xc8, 0x09, 0x01, 0x6c,
+ 0xc2, 0x4b, 0x07, 0x87, 0x05, 0xf0, 0x06, 0xa0, 0xc2, 0x8a, 0x04, 0xe0,
+ 0x05, 0xf4, 0x04, 0x59, 0xc2, 0xa8, 0x00, 0x0a, 0x11, 0x0d, 0xf2, 0xa0,
+ 0x09, 0x2e, 0xd8, 0x0a, 0x01, 0x80, 0xc8, 0x28, 0x00, 0x06, 0x01, 0x8c,
+ 0x07, 0xa0, 0x09, 0x16, 0x00, 0x04, 0xc8, 0x08, 0x05, 0xf4, 0x04, 0x5b,
+ 0xc3, 0x20, 0x01, 0x6c, 0xc8, 0x28, 0x00, 0x06, 0x01, 0x6c, 0xc8, 0x20,
+ 0xfc, 0x0e, 0x01, 0xbc, 0xc8, 0x20, 0xfc, 0x10, 0x01, 0xb0, 0xc8, 0x20,
+ 0xfc, 0x12, 0x01, 0xb2, 0xc8, 0x0c, 0x01, 0x6c, 0xf2, 0xa0, 0x09, 0x2e,
+ 0x01, 0x8a, 0x10, 0x00, 0x01, 0xa0, 0x01, 0x80, 0xc4, 0x00, 0x10, 0xdd,
+ 0x07, 0x33, 0x07, 0x33, 0x10, 0x0c, 0x07, 0x13, 0x07, 0x23, 0x00, 0x02,
+ 0xc8, 0xcb, 0x00, 0x06, 0x02, 0x23, 0x00, 0x18, 0xcc, 0xe0, 0x01, 0x6c,
+ 0xcc, 0xcd, 0xcc, 0xce, 0xcc, 0xcf, 0x07, 0x83, 0x06, 0x30, 0xc1, 0xd3,
+ 0x13, 0x0a, 0x07, 0x83, 0x07, 0x36, 0xc1, 0xd3, 0x13, 0x06, 0x07, 0x83,
+ 0x00, 0xa0, 0x00, 0x93, 0xc8, 0x0c, 0x01, 0x6c, 0x03, 0x80, 0x07, 0x63,
+ 0x00, 0x02, 0x15, 0x2a, 0xc2, 0x63, 0x00, 0x04, 0x42, 0x63, 0x00, 0x06,
+ 0x13, 0xdb, 0xc3, 0x63, 0x00, 0x1a, 0xd2, 0x49, 0x13, 0x0c, 0x06, 0xc9,
+ 0x72, 0x49, 0xd2, 0x69, 0xe1, 0xc0, 0x06, 0xc9, 0x72, 0x49, 0x48, 0xe9,
+ 0xe0, 0x04, 0x00, 0x04, 0xcb, 0x49, 0x00, 0x02, 0x04, 0x52, 0xc2, 0x69,
+ 0xe1, 0xc0, 0x72, 0x49, 0x02, 0x29, 0x00, 0x10, 0xc2, 0xc3, 0xa2, 0xe9,
+ 0xe1, 0xa8, 0xc3, 0x1b, 0x02, 0x89, 0x00, 0x12, 0x13, 0x0f, 0xc6, 0xdc,
+ 0x16, 0x03, 0x48, 0xe9, 0xe0, 0x04, 0x00, 0x04, 0xcb, 0x49, 0x00, 0x02,
+ 0xcb, 0x4c, 0x00, 0x04, 0x03, 0x90, 0x01, 0xff, 0x00, 0x93, 0xc8, 0x0c,
+ 0x01, 0x6c, 0x03, 0x80, 0xc8, 0x0c, 0x01, 0x6c, 0xc6, 0xe0, 0xfc, 0x00,
+ 0x16, 0xf1, 0x48, 0xe9, 0xe0, 0x04, 0x00, 0x04, 0xcb, 0x49, 0x00, 0x02,
+ 0xcb, 0x4c, 0x00, 0x04, 0x10, 0xed, 0x03, 0x00, 0x00, 0x02, 0xc2, 0xdb,
+ 0xc2, 0x63, 0x00, 0x04, 0x42, 0x4b, 0x13, 0x9f, 0xd2, 0x49, 0x13, 0x0e,
+ 0x06, 0xc9, 0x72, 0x49, 0xd2, 0x69, 0xe1, 0xc0, 0x06, 0xc9, 0x72, 0x49,
+ 0x48, 0xe9, 0xe0, 0x04, 0x00, 0x04, 0xcb, 0x49, 0x00, 0x02, 0x03, 0x90,
+ 0xff, 0xff, 0x03, 0x80, 0xc2, 0x69, 0xe1, 0xc0, 0x72, 0x49, 0x02, 0x29,
+ 0x00, 0x10, 0xc2, 0xc3, 0xa2, 0xe9, 0xe1, 0xa8, 0xc3, 0x1b, 0x02, 0x89,
+ 0x00, 0x12, 0x13, 0x0c, 0xc6, 0xdc, 0x16, 0x03, 0x48, 0xe9, 0xe0, 0x04,
+ 0x00, 0x04, 0xcb, 0x49, 0x00, 0x02, 0xcb, 0x4c, 0x00, 0x04, 0x03, 0x90,
+ 0xff, 0xff, 0x03, 0x80, 0xc8, 0x0c, 0x01, 0x6c, 0xc6, 0xe0, 0xfc, 0x00,
+ 0x16, 0xf4, 0x10, 0xf0, 0x03, 0x00, 0x00, 0x02, 0xc2, 0xbb, 0xc1, 0xbb,
+ 0xd1, 0x86, 0x13, 0x03, 0xea, 0x86, 0x00, 0x04, 0x10, 0x13, 0xd1, 0xa6,
+ 0xe1, 0xc0, 0x06, 0xc6, 0x71, 0x86, 0xc1, 0xca, 0xa1, 0xe6, 0xe1, 0xb8,
+ 0xea, 0xa6, 0xe0, 0x14, 0x00, 0x04, 0xc2, 0x1b, 0x02, 0x86, 0x00, 0x02,
+ 0x16, 0x03, 0x06, 0xa0, 0xc2, 0x6a, 0x10, 0x02, 0x06, 0xa0, 0xc2, 0x44,
+ 0x04, 0xda, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0xc2, 0xab, 0x00, 0x06,
+ 0x07, 0x8c, 0x05, 0xe8, 0xc2, 0x5c, 0x13, 0x16, 0xc1, 0xa0, 0x05, 0xec,
+ 0x81, 0x8a, 0x1a, 0x1a, 0xc1, 0xc6, 0xc2, 0x09, 0xc2, 0x59, 0x13, 0x20,
+ 0xa1, 0xe9, 0x00, 0x08, 0x82, 0x87, 0x12, 0xf9, 0xa2, 0xa9, 0x00, 0x08,
+ 0x62, 0x87, 0xca, 0xca, 0x00, 0x08, 0x6a, 0x4a, 0x00, 0x08, 0xc6, 0xc9,
+ 0xc6, 0x0b, 0x03, 0x80, 0xca, 0xca, 0x00, 0x08, 0xc8, 0x0a, 0x05, 0xec,
+ 0x04, 0xdb, 0xcf, 0x0b, 0xc7, 0x0b, 0x03, 0x80, 0x61, 0x8a, 0xca, 0x46,
+ 0x00, 0x08, 0xca, 0xca, 0x00, 0x08, 0xc8, 0x0a, 0x05, 0xec, 0xc6, 0xc9,
+ 0xc7, 0x0b, 0x03, 0x80, 0x62, 0x87, 0xca, 0xca, 0x00, 0x08, 0x04, 0xdb,
+ 0xc6, 0x0b, 0xcb, 0x0b, 0x00, 0x02, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02,
+ 0xc1, 0xbb, 0xc2, 0xdb, 0x07, 0x8c, 0x05, 0xe8, 0xc2, 0x4c, 0x04, 0xed,
+ 0x00, 0x02, 0xc2, 0x09, 0xc2, 0x59, 0x13, 0x18, 0x81, 0xa9, 0x00, 0x02,
+ 0x16, 0xfa, 0x82, 0xe9, 0x00, 0x04, 0x16, 0xf7, 0xcb, 0x49, 0x00, 0x04,
+ 0xc2, 0x99, 0xc6, 0x0a, 0x13, 0x0a, 0x83, 0x08, 0x13, 0x04, 0xaa, 0xa9,
+ 0x00, 0x08, 0x00, 0x08, 0x03, 0x80, 0xa8, 0x2a, 0x00, 0x08, 0x05, 0xec,
+ 0x03, 0x80, 0xcb, 0x08, 0x00, 0x02, 0x03, 0x80, 0x07, 0x2d, 0x00, 0x02,
+ 0x07, 0x8c, 0x00, 0x08, 0xa3, 0x06, 0xc2, 0x4c, 0xc2, 0x09, 0xc2, 0x59,
+ 0x13, 0x13, 0x82, 0xe9, 0x00, 0x04, 0x16, 0xfa, 0x07, 0xad, 0x00, 0x02,
+ 0x00, 0x01, 0xcb, 0x49, 0x00, 0x04, 0xc6, 0x19, 0x13, 0x01, 0x03, 0x80,
+ 0x83, 0x08, 0x16, 0x04, 0x49, 0xa0, 0xe0, 0x14, 0x00, 0x04, 0x03, 0x80,
+ 0xcb, 0x08, 0x00, 0x02, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0x06, 0x0b,
+ 0x11, 0x1f, 0x13, 0x4d, 0x07, 0x8b, 0x4e, 0x00, 0x01, 0x60, 0x01, 0x42,
+ 0x00, 0x80, 0x13, 0x09, 0x07, 0x8b, 0x3a, 0x00, 0xc1, 0x20, 0x01, 0x4e,
+ 0x02, 0x84, 0x0f, 0x41, 0x11, 0x02, 0x07, 0x8b, 0x4e, 0x00, 0xc8, 0x0b,
+ 0x01, 0x44, 0x07, 0xa0, 0x09, 0x62, 0x03, 0xe8, 0x01, 0xe0, 0x01, 0x40,
+ 0x02, 0x00, 0x01, 0xe0, 0x01, 0x40, 0x20, 0x00, 0x07, 0x84, 0xbc, 0xa0,
+ 0x04, 0x60, 0xbc, 0xae, 0xc8, 0x20, 0xe0, 0x16, 0x00, 0xe0, 0xc2, 0xe0,
+ 0x09, 0x6a, 0x22, 0xe0, 0xe0, 0x10, 0x13, 0x03, 0xe8, 0x20, 0xe0, 0x14,
+ 0x00, 0xe0, 0xc8, 0x20, 0xe0, 0x04, 0x01, 0x82, 0xc8, 0x20, 0x00, 0xe2,
+ 0x01, 0x8a, 0x04, 0xe0, 0x09, 0x18, 0x04, 0xe0, 0x05, 0xf4, 0x04, 0xe0,
+ 0x05, 0xf8, 0x04, 0xe0, 0x05, 0xf0, 0x04, 0xe0, 0x07, 0x42, 0x07, 0xa0,
+ 0x01, 0x88, 0x00, 0x20, 0xc2, 0xe0, 0x09, 0x30, 0x13, 0x09, 0x07, 0xa0,
+ 0x01, 0x88, 0x00, 0x80, 0xe8, 0x20, 0xe0, 0x16, 0x01, 0x80, 0x01, 0xe0,
+ 0x01, 0x82, 0x03, 0x00, 0x07, 0x8b, 0xa0, 0x00, 0xe8, 0x0b, 0x01, 0x86,
+ 0x03, 0x80, 0x04, 0xe0, 0x01, 0x86, 0x01, 0xe0, 0x01, 0x9c, 0x00, 0x40,
+ 0x01, 0xe0, 0x01, 0x9c, 0x40, 0x00, 0x04, 0xcb, 0x03, 0xb0, 0x06, 0x0b,
+ 0x13, 0x04, 0x01, 0x60, 0x01, 0x9c, 0x40, 0x00, 0x16, 0xf9, 0x04, 0xe0,
+ 0x01, 0x82, 0xe8, 0x20, 0xe0, 0x08, 0x09, 0x6a, 0x07, 0x8b, 0x80, 0x00,
+ 0xc8, 0x0b, 0x07, 0x98, 0xc8, 0x0b, 0x07, 0x78, 0xc8, 0x20, 0xe0, 0x04,
+ 0x01, 0x82, 0x07, 0x8b, 0x87, 0x6f, 0x48, 0x0b, 0x07, 0x3a, 0xc2, 0xe0,
+ 0x07, 0x50, 0x02, 0x8b, 0x07, 0x58, 0x13, 0x10, 0xe8, 0x20, 0xe0, 0x0a,
+ 0x01, 0x00, 0xc2, 0xe0, 0x01, 0x00, 0x22, 0xe0, 0xe0, 0x06, 0x13, 0xf8,
+ 0x07, 0x8b, 0x07, 0x58, 0xc8, 0x0b, 0x07, 0x50, 0x07, 0x8b, 0xc5, 0x6a,
+ 0xc8, 0x0b, 0x07, 0x52, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0xc2, 0xe0,
+ 0x09, 0x1a, 0x13, 0x0c, 0x06, 0x20, 0x09, 0x1c, 0xc8, 0x0b, 0x01, 0x6c,
+ 0xc8, 0x20, 0xfc, 0x00, 0x09, 0x1a, 0xcb, 0x4b, 0x00, 0x02, 0x03, 0x90,
+ 0xff, 0xff, 0x03, 0x80, 0xc0, 0x41, 0x13, 0x0f, 0x80, 0x81, 0x13, 0x0d,
+ 0xa0, 0x82, 0xc2, 0xe2, 0x0c, 0x32, 0x09, 0x12, 0xc8, 0x0b, 0x01, 0x6c,
+ 0x04, 0xe0, 0xfc, 0x00, 0xc3, 0x20, 0xfc, 0x02, 0x11, 0x07, 0xc8, 0x02,
+ 0xfc, 0x00, 0x04, 0xed, 0x00, 0x02, 0x04, 0xe0, 0x01, 0x6c, 0x03, 0x80,
+ 0xcb, 0x42, 0x00, 0x02, 0xc8, 0x02, 0x01, 0x6c, 0xc0, 0x8b, 0x03, 0x80,
+ 0x03, 0x00, 0x00, 0x02, 0x07, 0x83, 0x80, 0x00, 0xc2, 0x60, 0x09, 0x7e,
+ 0xc1, 0x09, 0x02, 0x24, 0xff, 0xf8, 0x08, 0xa9, 0x02, 0x01, 0x00, 0x00,
+ 0x02, 0x02, 0x00, 0x00, 0x02, 0x0b, 0x00, 0x00, 0x02, 0x0c, 0x00, 0x00,
+ 0x02, 0x07, 0x00, 0x00, 0xcb, 0x2c, 0x0c, 0x32, 0x0c, 0x32, 0x13, 0x06,
+ 0x05, 0x8b, 0x05, 0xcc, 0x88, 0x0b, 0x04, 0x46, 0x1b, 0x27, 0x10, 0xf6,
+ 0xc2, 0x09, 0xc2, 0x8b, 0x06, 0x08, 0x13, 0x0a, 0x05, 0x8b, 0x05, 0xcc,
+ 0x88, 0x0b, 0x04, 0x46, 0x1b, 0x1d, 0xcb, 0x2c, 0x0c, 0x32, 0x0c, 0x32,
+ 0x16, 0xed, 0x10, 0xf4, 0xc0, 0x82, 0x13, 0x14, 0xc8, 0x02, 0x01, 0x6c,
+ 0xc8, 0x0a, 0xfc, 0x00, 0xc8, 0x0a, 0x01, 0x6c, 0x04, 0xe0, 0xfc, 0x00,
+ 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00, 0xc8, 0x04, 0xfc, 0x04, 0xc2, 0x0a,
+ 0xa2, 0x08, 0xca, 0x02, 0x0c, 0x32, 0xc0, 0x8a, 0x05, 0x87, 0x10, 0xd6,
+ 0xc0, 0x4a, 0x10, 0xee, 0xcb, 0x47, 0x00, 0x02, 0x04, 0xe0, 0x01, 0x6c,
+ 0x07, 0x8b, 0x00, 0x43, 0x04, 0xe0, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x02,
+ 0xc8, 0x0b, 0x01, 0x6c, 0xc2, 0x8b, 0x06, 0xa0, 0xc1, 0xa0, 0x03, 0x90,
+ 0x00, 0x7f, 0x03, 0x80, 0x01, 0xa0, 0xfc, 0x02, 0x00, 0x20, 0x01, 0x60,
+ 0x09, 0x6a, 0x00, 0x01, 0x16, 0x0b, 0x02, 0x0a, 0xfc, 0x02, 0xa2, 0xa0,
+ 0x09, 0x2c, 0xce, 0xa0, 0x05, 0xee, 0xc6, 0xa0, 0xfc, 0x04, 0xc8, 0x20,
+ 0x09, 0x2c, 0xfc, 0x04, 0x07, 0x8a, 0x05, 0xf8, 0xc2, 0x5a, 0x13, 0x08,
+ 0x05, 0xca, 0xc2, 0x5a, 0xc8, 0x09, 0x01, 0x6c, 0xc8, 0x0b, 0xfc, 0x00,
+ 0xc6, 0x8b, 0x10, 0x02, 0xce, 0x8b, 0xc6, 0x8b, 0x20, 0x20, 0xe0, 0x1a,
+ 0x16, 0x05, 0xe8, 0x20, 0xe0, 0x04, 0x07, 0x3a, 0x04, 0xe0, 0x07, 0x36,
+ 0x03, 0x90, 0x00, 0x7f, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0xc8, 0x0b,
+ 0x01, 0x6c, 0x04, 0xcc, 0x04, 0xe0, 0xfc, 0x00, 0xc2, 0x8b, 0x06, 0xa0,
+ 0xc1, 0xae, 0x03, 0x90, 0x00, 0x7f, 0x03, 0x80, 0x07, 0xa0, 0xfc, 0x02,
+ 0x80, 0x00, 0xc8, 0x20, 0xe1, 0x8c, 0xfc, 0x04, 0xc0, 0x41, 0x16, 0x0f,
+ 0xd8, 0x20, 0xe2, 0x00, 0x01, 0x83, 0x00, 0x00, 0xc1, 0x82, 0x00, 0x15,
+ 0x0b, 0x8b, 0x00, 0x00, 0xc1, 0x96, 0x0c, 0xa8, 0xc8, 0x0a, 0x01, 0x8a,
+ 0x04, 0x5b, 0xc8, 0x0a, 0x01, 0x6c, 0xc3, 0x20, 0xfc, 0x00, 0x04, 0xe0,
+ 0xfc, 0x00, 0x02, 0x8a, 0x00, 0x43, 0x13, 0xdf, 0x07, 0xa0, 0xfc, 0x02,
+ 0x80, 0x00, 0xc8, 0x04, 0xfc, 0x04, 0x98, 0x20, 0x09, 0x84, 0x09, 0x1d,
+ 0x13, 0x0a, 0xc8, 0x20, 0x09, 0x1a, 0xfc, 0x00, 0xc8, 0x0a, 0x09, 0x1a,
+ 0x05, 0xa0, 0x09, 0x1c, 0xc2, 0x8c, 0x16, 0xe5, 0x04, 0x5b, 0xc0, 0x41,
+ 0x13, 0x10, 0xa2, 0x8a, 0xca, 0x82, 0x0c, 0x32, 0x09, 0x1a, 0xc8, 0x02,
+ 0x01, 0x6c, 0xc8, 0x0a, 0xfc, 0x00, 0xc0, 0x8a, 0x98, 0x20, 0x01, 0x83,
+ 0xe2, 0x00, 0x13, 0x09, 0xc2, 0x8c, 0x16, 0xd3, 0x04, 0x5b, 0xc0, 0x4a,
+ 0xc0, 0x8a, 0x98, 0x20, 0x01, 0x83, 0xe2, 0x00, 0x16, 0x1b, 0x01, 0xe0,
+ 0x01, 0x9c, 0x00, 0x40, 0x07, 0xa0, 0x09, 0x64, 0x70, 0x00, 0x01, 0x60,
+ 0x01, 0x9c, 0x00, 0x40, 0x13, 0x07, 0x06, 0x20, 0x09, 0x64, 0x16, 0xf9,
+ 0x02, 0x0a, 0x01, 0x00, 0x04, 0x60, 0xb3, 0x8a, 0x01, 0x60, 0x0c, 0x02,
+ 0x01, 0x00, 0x13, 0xe2, 0xd8, 0x20, 0x09, 0x2f, 0x01, 0x83, 0x07, 0xa0,
+ 0x0c, 0x02, 0x80, 0x00, 0xc8, 0x0a, 0x01, 0x8a, 0xc8, 0x0a, 0x09, 0x18,
+ 0x10, 0xd7, 0x04, 0xd8, 0xc2, 0x57, 0x16, 0x03, 0xcd, 0xc8, 0xc5, 0xc8,
+ 0x04, 0x5b, 0x05, 0xc7, 0xc2, 0x57, 0xc6, 0x48, 0xc5, 0xc8, 0x04, 0x5b,
+ 0xc8, 0x08, 0x01, 0x6c, 0xa2, 0x08, 0xca, 0x20, 0xfc, 0x00, 0x0c, 0x32,
+ 0x09, 0x18, 0x10, 0x02, 0xc8, 0x08, 0x01, 0x6c, 0x04, 0xe0, 0xfc, 0x00,
+ 0xc2, 0x57, 0x16, 0x03, 0xcd, 0xc8, 0xc5, 0xc8, 0x04, 0x5b, 0x05, 0xc7,
+ 0xc8, 0x17, 0x01, 0x6c, 0xc8, 0x08, 0xfc, 0x00, 0xc5, 0xc8, 0x04, 0x5b,
+ 0xc6, 0x17, 0x16, 0x02, 0xc9, 0xc8, 0x00, 0x02, 0xc5, 0xc8, 0x04, 0x5b,
+ 0xc2, 0x17, 0xc8, 0x08, 0x01, 0x6c, 0x13, 0x07, 0xc5, 0xe0, 0xfc, 0x00,
+ 0xa2, 0x08, 0xc8, 0x28, 0x0c, 0x32, 0xfc, 0x00, 0x09, 0x18, 0x04, 0x5b,
+ 0x01, 0x60, 0x01, 0x82, 0x20, 0x00, 0x16, 0x0a, 0xc2, 0x60, 0x01, 0x84,
+ 0x01, 0xa0, 0x01, 0x82, 0x20, 0x00, 0x01, 0xe0, 0x01, 0x82, 0x20, 0x00,
+ 0xc8, 0x09, 0x01, 0x84, 0x04, 0xc9, 0x04, 0x5b, 0x06, 0xa0, 0xc5, 0x1c,
+ 0x04, 0xd3, 0x04, 0xe0, 0x01, 0x02, 0xe8, 0x20, 0xe0, 0x14, 0x01, 0x00,
+ 0xc8, 0x20, 0xe0, 0x16, 0x01, 0x04, 0x2c, 0x05, 0x48, 0x20, 0xe0, 0x14,
+ 0x01, 0x00, 0x07, 0x8c, 0x0a, 0x00, 0x07, 0x8d, 0x07, 0xd8, 0x07, 0x8e,
+ 0x00, 0x18, 0xcf, 0x7c, 0x06, 0x4e, 0x16, 0xfd, 0x02, 0xe0, 0x07, 0xd8,
+ 0x07, 0x8f, 0xff, 0x11, 0x02, 0x8b, 0x59, 0x3b, 0x16, 0x21, 0x02, 0x8a,
+ 0x59, 0x3b, 0x13, 0x1e, 0x05, 0x8f, 0x20, 0x20, 0xe0, 0x16, 0x16, 0x01,
+ 0x10, 0x19, 0x20, 0x20, 0xe0, 0x04, 0x16, 0x16, 0x01, 0x00, 0x00, 0xbf,
+ 0x16, 0x13, 0x07, 0x8b, 0x40, 0xc0, 0x01, 0x00, 0x60, 0x00, 0x13, 0x10,
+ 0x01, 0x40, 0x60, 0x00, 0x16, 0x0b, 0x07, 0x8b, 0x44, 0xc4, 0xc3, 0xa0,
+ 0x01, 0x02, 0x48, 0x0e, 0x01, 0x02, 0x01, 0x4e, 0x10, 0x00, 0x16, 0x04,
+ 0x07, 0x8f, 0xff, 0x18, 0x04, 0x60, 0xc4, 0xf2, 0xc3, 0x0b, 0xc3, 0x4b,
+ 0x20, 0x20, 0xe0, 0x0a, 0x16, 0x02, 0x02, 0x6b, 0x20, 0x20, 0x20, 0x20,
+ 0xe0, 0x0c, 0x16, 0x02, 0x02, 0x6c, 0x20, 0x00, 0x20, 0x20, 0xe0, 0x0e,
+ 0x16, 0x02, 0x02, 0x6c, 0x00, 0x20, 0x05, 0x8f, 0x20, 0x20, 0xe0, 0x10,
+ 0x16, 0x07, 0x02, 0x6d, 0x00, 0x20, 0x21, 0x20, 0xe0, 0x22, 0x13, 0xe4,
+ 0xc1, 0x04, 0x16, 0x02, 0x07, 0x84, 0x7f, 0xfe, 0x05, 0x8f, 0x20, 0x20,
+ 0xe0, 0x12, 0x16, 0x02, 0x02, 0x6d, 0x20, 0x00, 0x21, 0x60, 0xe0, 0x22,
+ 0x13, 0xd7, 0xc1, 0x45, 0x16, 0x02, 0x07, 0x85, 0x7f, 0xfe, 0x05, 0x8f,
+ 0xd1, 0x86, 0x13, 0x0b, 0x25, 0xa0, 0xe0, 0x26, 0x13, 0x08, 0x05, 0x8f,
+ 0x26, 0x20, 0xe0, 0x22, 0x16, 0x04, 0x05, 0x8f, 0x26, 0xa0, 0xe0, 0x22,
+ 0x13, 0x02, 0x04, 0x60, 0xc4, 0xf2, 0xd8, 0x01, 0x08, 0xec, 0xd8, 0x20,
+ 0x07, 0xdb, 0x09, 0x00, 0xd8, 0x02, 0x08, 0xf6, 0xd8, 0x20, 0x07, 0xdd,
+ 0x08, 0xe2, 0x02, 0xe0, 0x07, 0x58, 0xd8, 0x20, 0x07, 0xef, 0x07, 0xf4,
+ 0xd8, 0x20, 0x07, 0xf1, 0x07, 0xf6, 0xd8, 0x20, 0x07, 0xf3, 0x07, 0xf8,
+ 0x02, 0x09, 0x00, 0x06, 0x04, 0xcb, 0x02, 0x0f, 0x07, 0xee, 0x05, 0x8f,
+ 0xdf, 0xcb, 0x06, 0x09, 0x16, 0xfc, 0x06, 0xa0, 0xc5, 0x1c, 0x07, 0x89,
+ 0xe3, 0x5c, 0x04, 0xe0, 0x01, 0x1a, 0xc8, 0x20, 0x07, 0xe4, 0x01, 0x18,
+ 0xc8, 0x19, 0x01, 0x0c, 0xc8, 0x39, 0x01, 0x0a, 0xc8, 0x39, 0x01, 0x12,
+ 0x16, 0x09, 0xc3, 0x79, 0x02, 0x0f, 0xe0, 0x00, 0x63, 0x4f, 0x02, 0x2d,
+ 0xa0, 0x00, 0xc8, 0x0d, 0x01, 0x14, 0x10, 0x02, 0xc8, 0x39, 0x01, 0x14,
+ 0xc3, 0xf9, 0xc8, 0x3f, 0x01, 0x0e, 0xc8, 0x1f, 0x01, 0x10, 0x04, 0xe0,
+ 0x09, 0x14, 0xc2, 0xb9, 0xc8, 0x1a, 0x01, 0x00, 0x06, 0x96, 0x02, 0x89,
+ 0xe3, 0x84, 0x16, 0xe0, 0x07, 0x8f, 0xff, 0x1c, 0x07, 0x8c, 0x0a, 0x00,
+ 0x07, 0x8d, 0xe3, 0x84, 0x07, 0x8e, 0x00, 0x10, 0x8f, 0x7c, 0x16, 0x44,
+ 0x06, 0x4e, 0x16, 0xfc, 0xc3, 0xa0, 0x07, 0xe2, 0xc3, 0xe0, 0x07, 0xe0,
+ 0x83, 0xce, 0x14, 0x01, 0xc3, 0xce, 0xc8, 0x0f, 0x01, 0x1a, 0x07, 0x8c,
+ 0xe3, 0x94, 0x07, 0x8d, 0x0a, 0x00, 0x07, 0x8e, 0xe3, 0xa4, 0x63, 0x8c,
+ 0xcf, 0x7c, 0x06, 0x4e, 0x16, 0xfd, 0x04, 0xe0, 0x09, 0x30, 0x01, 0x20,
+ 0x01, 0x42, 0x04, 0x00, 0x16, 0x02, 0x07, 0x20, 0x09, 0x30, 0xc2, 0x60,
+ 0x01, 0x62, 0x04, 0xe0, 0x01, 0x62, 0x07, 0x8e, 0x80, 0x00, 0x07, 0x8c,
+ 0x09, 0x34, 0x07, 0x8d, 0x00, 0x06, 0xdf, 0x3e, 0x05, 0x8e, 0x06, 0x0d,
+ 0x16, 0xfc, 0xd3, 0xfe, 0x06, 0xcf, 0x05, 0x8e, 0xd3, 0xfe, 0x06, 0xcf,
+ 0x07, 0x8c, 0x09, 0x34, 0xc8, 0x09, 0x01, 0x62, 0x04, 0xc9, 0xa3, 0x5c,
+ 0xe2, 0x7c, 0xa3, 0x5c, 0xe2, 0x7c, 0xa3, 0x5c, 0xe2, 0x7c, 0x13, 0x02,
+ 0x83, 0xcd, 0x13, 0x09, 0x07, 0x20, 0x09, 0x34, 0x10, 0x06, 0x07, 0x8f,
+ 0xff, 0x19, 0xa3, 0xcd, 0xc8, 0x0f, 0x01, 0x04, 0x10, 0xff, 0x01, 0xa0,
+ 0x01, 0x02, 0x10, 0x00, 0xc3, 0xe0, 0x07, 0xee, 0x43, 0xe0, 0xe0, 0x06,
+ 0xc8, 0x0f, 0x01, 0x00, 0xc0, 0x20, 0xe0, 0x04, 0x04, 0xe0, 0x06, 0xfe,
+ 0x04, 0xd3, 0x04, 0xe0, 0x01, 0x04, 0x04, 0x60, 0xc5, 0x6a, 0x07, 0x8c,
+ 0x0a, 0x00, 0x07, 0x8d, 0x00, 0x18, 0x07, 0x8e, 0x59, 0x3b, 0xcf, 0x0e,
+ 0x06, 0x4d, 0x16, 0xfd, 0x04, 0x5b, 0x01, 0x93, 0x80, 0x00, 0x04, 0x20,
+ 0xe2, 0xc0, 0xd0, 0x60, 0x07, 0x98, 0x13, 0x1c, 0x03, 0x00, 0x00, 0x02,
+ 0xc0, 0xa0, 0x07, 0x46, 0xc8, 0x12, 0x07, 0x46, 0x16, 0x02, 0x01, 0x93,
+ 0x00, 0x20, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x20, 0xe2, 0xe8, 0x01, 0x93,
+ 0x20, 0x00, 0x01, 0x80, 0x40, 0x00, 0x01, 0x00, 0x00, 0xfe, 0x16, 0x49,
+ 0xc3, 0xc4, 0x16, 0x25, 0xc3, 0xd3, 0x43, 0xc5, 0x16, 0x0c, 0xc3, 0xe0,
+ 0x07, 0x98, 0x11, 0x03, 0x02, 0xe0, 0x07, 0x98, 0x04, 0x51, 0xc3, 0xe0,
+ 0x07, 0x78, 0x11, 0x0a, 0x02, 0xe0, 0x07, 0x78, 0x04, 0x51, 0x11, 0xd3,
+ 0x01, 0x4f, 0x20, 0x00, 0x13, 0xe4, 0x01, 0x4f, 0x00, 0x20, 0x13, 0xd1,
+ 0x2c, 0x05, 0xa0, 0x41, 0x04, 0x21, 0xe2, 0xc0, 0x07, 0x8b, 0xc5, 0x6a,
+ 0x01, 0x00, 0x40, 0x00, 0x13, 0x0f, 0xc3, 0xdd, 0x02, 0x4f, 0x00, 0x0f,
+ 0xe1, 0x2f, 0xe0, 0x14, 0x04, 0x5b, 0xc3, 0xe4, 0xe1, 0xc0, 0x73, 0xcf,
+ 0x41, 0x2f, 0xe0, 0x14, 0xc3, 0x6f, 0xea, 0x8c, 0x07, 0x8b, 0xc5, 0x6a,
+ 0xc2, 0x4b, 0xc2, 0xa0, 0x07, 0xf4, 0x07, 0x8c, 0x00, 0x08, 0xc0, 0xbd,
+ 0xc3, 0xa0, 0x07, 0xea, 0xc3, 0xe0, 0x07, 0xec, 0x06, 0xa0, 0xc7, 0x5e,
+ 0x01, 0xc0, 0x40, 0x00, 0xd8, 0x02, 0x01, 0x17, 0x02, 0x62, 0xff, 0x80,
+ 0x06, 0xa0, 0xc7, 0xb2, 0xc8, 0x02, 0x01, 0x04, 0x03, 0x90, 0x60, 0x3f,
+ 0x04, 0x59, 0xc3, 0xc0, 0x73, 0xcf, 0xc3, 0xef, 0xe1, 0xc0, 0x73, 0xcf,
+ 0xc3, 0xaf, 0xea, 0x7e, 0xc3, 0x9e, 0x02, 0x4e, 0x00, 0x0f, 0x21, 0x2e,
+ 0xe0, 0x14, 0x13, 0x08, 0x40, 0x2f, 0xe0, 0x14, 0xa3, 0xcf, 0x04, 0x2f,
+ 0xe2, 0xf0, 0x01, 0x40, 0x40, 0x00, 0x13, 0xa4, 0xc3, 0xc4, 0x16, 0xc7,
+ 0x01, 0x00, 0x00, 0xfe, 0x16, 0xe6, 0x10, 0x9e, 0x01, 0x40, 0x40, 0x00,
+ 0x16, 0x05, 0xe0, 0x20, 0xe0, 0x14, 0x02, 0x65, 0x58, 0x00, 0x10, 0x96,
+ 0xd8, 0x20, 0x07, 0xde, 0x01, 0x17, 0x07, 0x8f, 0xff, 0x86, 0xc8, 0x0f,
+ 0x01, 0x04, 0x01, 0xc0, 0x40, 0x00, 0x02, 0x45, 0xa7, 0xff, 0x10, 0x8a,
+ 0xc3, 0x20, 0x06, 0xfe, 0x27, 0x20, 0xe3, 0x38, 0x13, 0x07, 0x23, 0x20,
+ 0xe0, 0x22, 0x13, 0x1a, 0x02, 0x65, 0xdf, 0xff, 0x40, 0x20, 0xe0, 0x14,
+ 0xe0, 0x20, 0xe0, 0x16, 0xc8, 0x0c, 0x08, 0xe6, 0x07, 0x8d, 0x08, 0xe2,
+ 0x04, 0x58, 0x48, 0x20, 0xe0, 0x08, 0x06, 0xfe, 0xc3, 0x20, 0x08, 0xe6,
+ 0x27, 0x20, 0xe3, 0x38, 0x16, 0x19, 0x03, 0x80, 0xc3, 0x02, 0xc2, 0x6c,
+ 0x00, 0x0a, 0x06, 0x99, 0x04, 0x60, 0xc5, 0x6a, 0xc2, 0xa0, 0x07, 0xf4,
+ 0x07, 0x8c, 0x00, 0x01, 0x07, 0x8d, 0x06, 0x06, 0x04, 0xce, 0xc3, 0xe0,
+ 0x06, 0x08, 0x13, 0x01, 0x06, 0x97, 0xd8, 0x20, 0x06, 0x07, 0x01, 0x17,
+ 0x07, 0x8b, 0xff, 0x82, 0xc8, 0x0b, 0x01, 0x04, 0x06, 0xa0, 0xcb, 0xe4,
+ 0x04, 0x60, 0xc5, 0x6a, 0xc2, 0xa0, 0x07, 0xee, 0x07, 0x8c, 0x00, 0x06,
+ 0x07, 0x8d, 0x08, 0xee, 0xc3, 0xa0, 0x07, 0xe6, 0xc3, 0xe0, 0x07, 0xe8,
+ 0x06, 0x97, 0xc2, 0xa0, 0x07, 0xf4, 0x07, 0x8d, 0x08, 0xf4, 0x04, 0xdd,
+ 0x07, 0x8c, 0x00, 0x02, 0x06, 0x97, 0x07, 0x8d, 0x80, 0x00, 0xc2, 0xa0,
+ 0x08, 0xee, 0x88, 0x0a, 0x06, 0x0c, 0x1b, 0x14, 0x07, 0x82, 0xc7, 0x2e,
+ 0xc3, 0xa0, 0x08, 0xf0, 0xc3, 0xe0, 0x08, 0xf2, 0x07, 0x8b, 0xe3, 0x0c,
+ 0x02, 0x8a, 0x00, 0x14, 0x1a, 0x04, 0x07, 0x8b, 0xea, 0x7a, 0x02, 0x2a,
+ 0xff, 0xec, 0xa2, 0x8a, 0xa2, 0xca, 0xc2, 0xdb, 0x13, 0x01, 0x06, 0x9b,
+ 0xc8, 0x20, 0x08, 0xee, 0x08, 0xf2, 0xc8, 0x20, 0xe0, 0x20, 0x08, 0xee,
+ 0xc8, 0x0d, 0x08, 0xf0, 0x07, 0x8d, 0x08, 0xec, 0xe0, 0x20, 0xe0, 0x18,
+ 0x02, 0x65, 0x58, 0x00, 0x04, 0x58, 0x02, 0x45, 0xa7, 0xff, 0x03, 0x80,
+ 0xc0, 0x60, 0x05, 0xee, 0x02, 0x21, 0x03, 0xe8, 0x01, 0x20, 0x01, 0x02,
+ 0x00, 0x06, 0x16, 0x07, 0x88, 0x01, 0x05, 0xee, 0x16, 0xf9, 0x10, 0x39,
+ 0xd0, 0x60, 0x01, 0x03, 0x13, 0xf1, 0x02, 0x01, 0x01, 0x0a, 0xcc, 0x4c,
+ 0xcc, 0x4c, 0xcc, 0x4e, 0xcc, 0x4f, 0x07, 0xb1, 0x00, 0x40, 0xcc, 0x4d,
+ 0xc8, 0x0a, 0x01, 0x00, 0x04, 0x5b, 0xc0, 0x60, 0x05, 0xee, 0x02, 0x21,
+ 0x03, 0xe8, 0x01, 0x20, 0x01, 0x02, 0x00, 0x06, 0x16, 0x07, 0x88, 0x01,
+ 0x05, 0xee, 0x16, 0xf9, 0x10, 0x1e, 0xd0, 0x60, 0x01, 0x03, 0x13, 0xf1,
+ 0x02, 0x01, 0x01, 0x0a, 0xcc, 0x4c, 0xcc, 0x4c, 0xcc, 0x4e, 0xcc, 0x4f,
+ 0x07, 0xb1, 0x00, 0x40, 0xcc, 0x4d, 0xc8, 0x0a, 0x01, 0x00, 0x03, 0xa0,
+ 0xd0, 0x60, 0x01, 0x03, 0x13, 0x01, 0x04, 0x5b, 0xc0, 0x60, 0x05, 0xee,
+ 0x02, 0x21, 0x03, 0xe8, 0x01, 0x20, 0x01, 0x02, 0x00, 0x06, 0x16, 0xf7,
+ 0x88, 0x01, 0x05, 0xee, 0x16, 0xf9, 0x04, 0xcd, 0x07, 0x8a, 0x40, 0x00,
+ 0xc3, 0x20, 0x01, 0x00, 0x01, 0x0c, 0x80, 0x00, 0x13, 0x02, 0x07, 0x8a,
+ 0x20, 0x00, 0xc3, 0xa0, 0x01, 0x0e, 0xc3, 0xe0, 0x01, 0x10, 0x03, 0xb0,
+ 0xc3, 0x20, 0x07, 0x58, 0x23, 0x20, 0xe0, 0x04, 0x13, 0x02, 0x04, 0x60,
+ 0xc4, 0xec, 0x04, 0x60, 0xb3, 0x8a, 0x07, 0x8d, 0x20, 0x00, 0x20, 0x20,
+ 0xe0, 0x0a, 0x16, 0x01, 0x04, 0x5b, 0x02, 0x0d, 0x0c, 0x32, 0xc2, 0x5d,
+ 0x11, 0x01, 0x04, 0xdd, 0x05, 0xcd, 0x88, 0x0d, 0x0c, 0x30, 0x16, 0xf9,
+ 0xc2, 0x60, 0x06, 0x0a, 0x07, 0x8d, 0x09, 0x6a, 0x06, 0xa0, 0xcc, 0x24,
+ 0x02, 0x09, 0x00, 0x6e, 0xc3, 0xe0, 0x09, 0x30, 0x16, 0x03, 0x01, 0xe0,
+ 0x09, 0x6a, 0x00, 0x10, 0xc2, 0xe0, 0x09, 0x6a, 0x02, 0x0f, 0x01, 0x00,
+ 0x26, 0xc9, 0x13, 0x02, 0x04, 0x60, 0xca, 0xb6, 0x02, 0x09, 0x12, 0x00,
+ 0x01, 0x4b, 0x00, 0x10, 0x13, 0x02, 0x02, 0x09, 0x13, 0x00, 0xd8, 0x09,
+ 0x09, 0x2e, 0x07, 0x8f, 0x40, 0x00, 0x07, 0x89, 0x09, 0x6c, 0x04, 0xcb,
+ 0xe2, 0xf9, 0xe2, 0xf9, 0xe2, 0xf9, 0x16, 0x07, 0x07, 0x8b, 0x09, 0x34,
+ 0x07, 0x8c, 0x09, 0x6c, 0xcf, 0x3b, 0xcf, 0x3b, 0xc7, 0x1b, 0xc3, 0x20,
+ 0x09, 0x6c, 0x11, 0x19, 0x07, 0x8f, 0x20, 0x00, 0x07, 0x89, 0x09, 0x7a,
+ 0x06, 0xa0, 0xc8, 0x98, 0x06, 0xa0, 0xc8, 0x98, 0x10, 0x12, 0xce, 0x4c,
+ 0x04, 0x5b, 0xc3, 0x19, 0x16, 0x02, 0x07, 0x8c, 0x00, 0x1a, 0xc3, 0x4c,
+ 0x02, 0x2d, 0xff, 0xf8, 0x02, 0x0a, 0x00, 0x09, 0x02, 0x2d, 0xff, 0xfa,
+ 0x13, 0xf2, 0x06, 0x0a, 0x16, 0xfb, 0x04, 0x60, 0xca, 0xb6, 0x07, 0x8f,
+ 0x10, 0x00, 0xc2, 0xd9, 0x11, 0xfa, 0x16, 0x02, 0x07, 0x8b, 0x04, 0x00,
+ 0xc3, 0x4b, 0x02, 0x8d, 0x00, 0x20, 0x14, 0x02, 0x02, 0x0d, 0x00, 0x20,
+ 0x02, 0x8d, 0x04, 0x00, 0x12, 0x02, 0x02, 0x0d, 0x04, 0x00, 0x02, 0x2d,
+ 0xff, 0xf8, 0xc8, 0x0d, 0x09, 0x2c, 0x02, 0x2b, 0x03, 0xff, 0x01, 0x8b,
+ 0x03, 0xff, 0xce, 0x4b, 0x04, 0xcb, 0x04, 0xe0, 0x05, 0xf8, 0x04, 0xe0,
+ 0x09, 0x66, 0xc8, 0x20, 0x0c, 0x30, 0x09, 0x80, 0x07, 0xa0, 0x09, 0x82,
+ 0xdf, 0xfe, 0x07, 0x8d, 0xdf, 0xfe, 0xc3, 0xe0, 0x07, 0xd8, 0x23, 0xe0,
+ 0xe0, 0x16, 0x16, 0x24, 0xc3, 0xe0, 0x0c, 0x30, 0x63, 0x4f, 0x04, 0xff,
+ 0x04, 0xff, 0x06, 0x4d, 0x16, 0xfd, 0x07, 0x8d, 0xdf, 0xfe, 0x04, 0x20,
+ 0xea, 0x62, 0xc3, 0xa0, 0xea, 0x62, 0xc3, 0xee, 0x00, 0x12, 0x16, 0xc1,
+ 0xc3, 0x6e, 0x00, 0x18, 0x09, 0xad, 0x07, 0x8c, 0xe0, 0x00, 0x09, 0xac,
+ 0x63, 0x0d, 0x13, 0x0c, 0xc3, 0x6e, 0x00, 0x18, 0x09, 0xad, 0x02, 0x2d,
+ 0x00, 0x40, 0x0a, 0x1d, 0x02, 0x2d, 0x0c, 0x32, 0x07, 0xbd, 0x7f, 0xff,
+ 0x06, 0x0c, 0x16, 0xfc, 0xc3, 0x20, 0x04, 0x46, 0x02, 0x8c, 0x00, 0x80,
+ 0x1a, 0x13, 0x02, 0xac, 0xc8, 0x0c, 0x00, 0x9a, 0x02, 0xe0, 0x00, 0x80,
+ 0x07, 0x88, 0x00, 0x80, 0xc2, 0x60, 0x04, 0x46, 0x06, 0xa0, 0xf4, 0xd2,
+ 0x10, 0x02, 0x00, 0x9d, 0x10, 0x05, 0x00, 0x9d, 0x07, 0x8f, 0x08, 0x00,
+ 0x04, 0x60, 0xca, 0xb6, 0x2d, 0x4b, 0xc3, 0x81, 0x05, 0xc9, 0x07, 0x8f,
+ 0x10, 0x00, 0x02, 0x8e, 0x00, 0x02, 0x11, 0xf6, 0x07, 0x8f, 0x04, 0x00,
+ 0x05, 0xc9, 0xc2, 0xd9, 0x26, 0xe0, 0xe0, 0x26, 0x16, 0x02, 0x02, 0x2b,
+ 0x00, 0x06, 0xc6, 0x4b, 0xc3, 0x4b, 0x72, 0xcb, 0x02, 0x2e, 0xff, 0xfe,
+ 0x83, 0x8b, 0x1b, 0xe6, 0x06, 0xcd, 0x73, 0x4d, 0x82, 0xcd, 0x1b, 0xe2,
+ 0x04, 0xe0, 0x09, 0x1a, 0x04, 0xe0, 0x09, 0x1c, 0xc3, 0x4d, 0x13, 0x02,
+ 0x66, 0x60, 0xe0, 0x12, 0x05, 0xc9, 0x04, 0xcf, 0x2d, 0x81, 0xc8, 0x01,
+ 0x01, 0x6c, 0x13, 0xd4, 0xc8, 0x0f, 0xfc, 0x00, 0xc3, 0xc1, 0x06, 0x0d,
+ 0x15, 0xf7, 0x02, 0x0d, 0x07, 0x36, 0x02, 0x0e, 0x08, 0x98, 0x02, 0x0c,
+ 0x00, 0x03, 0xcb, 0x8d, 0x00, 0x02, 0x2d, 0x81, 0xcb, 0x81, 0x00, 0x06,
+ 0x13, 0xc3, 0x04, 0xee, 0x00, 0x0c, 0x02, 0x2e, 0x00, 0x18, 0x06, 0x0c,
+ 0x16, 0xf4, 0x04, 0xe0, 0x08, 0x96, 0x2e, 0x1f, 0xc3, 0xb9, 0xc3, 0xd9,
+ 0x07, 0x89, 0x00, 0x12, 0x07, 0x8d, 0x09, 0x3a, 0x06, 0xa0, 0xcc, 0x24,
+ 0xc3, 0x60, 0x07, 0xd8, 0x23, 0x60, 0xe0, 0x16, 0x16, 0x09, 0xe8, 0x20,
+ 0xe0, 0x10, 0x09, 0x6a, 0xe8, 0x20, 0xe0, 0x18, 0x07, 0x98, 0xe8, 0x20,
+ 0xe0, 0x12, 0x07, 0x78, 0xc3, 0x60, 0x09, 0x6a, 0x23, 0x60, 0xe0, 0x1e,
+ 0x16, 0x03, 0x48, 0x20, 0xe3, 0xa4, 0x09, 0x6a, 0x23, 0x60, 0xe0, 0x22,
+ 0x13, 0x06, 0x27, 0x60, 0xe3, 0xa6, 0x13, 0x03, 0xe8, 0x20, 0xe0, 0x10,
+ 0x09, 0x6a, 0x2d, 0x20, 0x00, 0x00, 0x07, 0x8e, 0x00, 0x00, 0x06, 0xa0,
+ 0xcc, 0x04, 0x05, 0x4e, 0x2c, 0x0e, 0xc0, 0xa0, 0x08, 0x04, 0xc3, 0xef,
+ 0x00, 0x06, 0x16, 0x1b, 0xc3, 0xa0, 0x09, 0x72, 0xc3, 0xe0, 0x09, 0x74,
+ 0x06, 0xa0, 0xca, 0xf2, 0xc3, 0xa0, 0x09, 0x76, 0xc3, 0xe0, 0x09, 0x78,
+ 0x06, 0xa0, 0xcb, 0x10, 0xe0, 0x20, 0xe0, 0x0a, 0xc3, 0x60, 0x07, 0xd8,
+ 0x23, 0x60, 0xe0, 0x16, 0x16, 0x05, 0x04, 0xe0, 0x06, 0x2e, 0x41, 0x60,
+ 0xe0, 0x04, 0x2e, 0x4d, 0x07, 0x8d, 0x80, 0x00, 0x04, 0x52, 0x73, 0xcf,
+ 0x02, 0x2f, 0x02, 0x00, 0xc3, 0x4f, 0x04, 0x52, 0x20, 0x20, 0xe0, 0x0a,
+ 0x13, 0x03, 0x07, 0x8d, 0x10, 0x00, 0x04, 0x5b, 0x40, 0x20, 0xe0, 0x0a,
+ 0x02, 0x40, 0xf0, 0xff, 0x07, 0x8e, 0x00, 0x02, 0x06, 0xa0, 0xcc, 0x04,
+ 0x05, 0x4e, 0x2c, 0x0e, 0xc0, 0xa0, 0x08, 0x04, 0x06, 0xa0, 0xcb, 0xe4,
+ 0xc3, 0x60, 0x07, 0xd8, 0x23, 0x60, 0xe0, 0x16, 0x16, 0x66, 0x04, 0x20,
+ 0xea, 0x76, 0x10, 0x63, 0x02, 0x6e, 0x80, 0x00, 0x07, 0x8d, 0xc0, 0x00,
+ 0xc8, 0x0d, 0x01, 0xa6, 0xc8, 0x0e, 0x09, 0x72, 0xc8, 0x0f, 0x09, 0x74,
+ 0xc8, 0x0e, 0x01, 0xa8, 0xc8, 0x0f, 0x01, 0xaa, 0x10, 0x12, 0x01, 0x8f,
+ 0x00, 0x01, 0x07, 0x8a, 0x09, 0x76, 0xe3, 0xa0, 0x09, 0x4e, 0xce, 0x8e,
+ 0x01, 0x9a, 0xff, 0xfe, 0xe3, 0xe0, 0x09, 0x50, 0xe6, 0x8f, 0x07, 0x8a,
+ 0x01, 0xac, 0xce, 0x8e, 0x01, 0x9a, 0xff, 0xfe, 0xe6, 0x8f, 0x20, 0x20,
+ 0xe0, 0x0a, 0x13, 0x3f, 0x07, 0x8d, 0x10, 0x00, 0x04, 0x5b, 0x20, 0x20,
+ 0xe0, 0x0a, 0x13, 0x03, 0x02, 0x0d, 0x10, 0x00, 0x04, 0x5b, 0xc3, 0x8e,
+ 0x13, 0x04, 0x01, 0xe0, 0x09, 0x50, 0x01, 0x00, 0x10, 0x06, 0x01, 0xa0,
+ 0x09, 0x50, 0x01, 0x00, 0x01, 0xa0, 0x09, 0x78, 0x01, 0x00, 0xc3, 0xa0,
+ 0x09, 0x76, 0xc3, 0xe0, 0x09, 0x78, 0xe3, 0xa0, 0x09, 0x4e, 0xe3, 0xe0,
+ 0x09, 0x50, 0xc8, 0x0e, 0x01, 0xac, 0xc8, 0x0f, 0x01, 0xae, 0xc8, 0x0e,
+ 0x09, 0x76, 0xc8, 0x0f, 0x09, 0x78, 0x10, 0x19, 0x02, 0x6e, 0x80, 0x00,
+ 0xc8, 0x0e, 0x01, 0xa6, 0x20, 0x20, 0xe0, 0x0a, 0x13, 0x12, 0x02, 0x0d,
+ 0x10, 0x00, 0x04, 0x5b, 0x07, 0x8d, 0x07, 0x28, 0x07, 0x89, 0x00, 0x0e,
+ 0x06, 0xa0, 0xcc, 0x2a, 0x07, 0x8d, 0x07, 0x28, 0x04, 0xfd, 0x02, 0x8d,
+ 0x07, 0x36, 0x16, 0xfc, 0x48, 0x20, 0xe0, 0x14, 0x06, 0xfe, 0x07, 0x8d,
+ 0x80, 0x00, 0x04, 0x52, 0xc2, 0xa0, 0x07, 0xee, 0x07, 0x8c, 0x00, 0x04,
+ 0x07, 0x8d, 0x08, 0xf0, 0x06, 0x97, 0xc2, 0x7d, 0xc3, 0x5d, 0x43, 0x60,
+ 0xe0, 0x22, 0x06, 0xa0, 0xcc, 0x2a, 0x10, 0xef, 0xc8, 0x0e, 0x06, 0x06,
+ 0xc8, 0x0f, 0x06, 0x08, 0x10, 0xea, 0x03, 0xb0, 0x01, 0xa0, 0x07, 0x60,
+ 0x00, 0x26, 0x02, 0x40, 0xc0, 0x00, 0x04, 0xe0, 0x06, 0x06, 0x07, 0x8c,
+ 0x40, 0x10, 0x44, 0xcc, 0x04, 0xe0, 0x06, 0xfe, 0x07, 0x85, 0x80, 0x40,
+ 0x04, 0x5b, 0xc8, 0x02, 0x08, 0x04, 0x07, 0x8f, 0x07, 0xfa, 0xcb, 0xce,
+ 0x00, 0x02, 0x07, 0x8e, 0x07, 0x36, 0xcb, 0xce, 0x00, 0x04, 0x07, 0x8d,
+ 0x06, 0x30, 0x07, 0x8e, 0x00, 0x10, 0x2c, 0x4d, 0x04, 0x5b, 0xc2, 0xa0,
+ 0x07, 0xf2, 0x10, 0x02, 0xc2, 0xa0, 0x07, 0xf8, 0xc8, 0x0b, 0x08, 0xea,
+ 0xc3, 0x09, 0x13, 0x0a, 0x06, 0xa0, 0xc7, 0x94, 0xc2, 0xa0, 0x01, 0x00,
+ 0xe2, 0xa0, 0xe0, 0x06, 0xa3, 0x4c, 0xa3, 0xcc, 0x17, 0x01, 0x05, 0x8e,
+ 0x62, 0x4c, 0xc2, 0xe0, 0x08, 0xea, 0x04, 0x5b, 0x07, 0x8d, 0x10, 0x00,
+ 0x20, 0x20, 0xe0, 0x0a, 0x13, 0x01, 0x04, 0x5b, 0x02, 0x0d, 0x00, 0x6e,
+ 0xc3, 0xe0, 0x09, 0x30, 0x16, 0x02, 0x01, 0xce, 0x00, 0x10, 0x27, 0x8d,
+ 0x13, 0x03, 0x02, 0x0d, 0x01, 0x00, 0x04, 0x52, 0x03, 0x00, 0x00, 0x02,
+ 0xc3, 0x60, 0x09, 0x6a, 0x02, 0x4d, 0x80, 0x08, 0x02, 0x4e, 0x7f, 0xf7,
+ 0xe3, 0x8d, 0xc3, 0xe0, 0x07, 0xd8, 0x23, 0xe0, 0xe0, 0x16, 0x13, 0x04,
+ 0x07, 0x8d, 0x00, 0x06, 0x27, 0x8d, 0x13, 0x02, 0xe3, 0xa0, 0xe0, 0x10,
+ 0xc8, 0x0e, 0x09, 0x6a, 0x02, 0x0d, 0x12, 0x00, 0x01, 0x4e, 0x00, 0x10,
+ 0x13, 0x02, 0x02, 0x0d, 0x13, 0x00, 0xd8, 0x0d, 0x09, 0x2e, 0xc3, 0x60,
+ 0x01, 0x80, 0x02, 0x4e, 0x00, 0x01, 0x02, 0x4d, 0xff, 0xfe, 0xe3, 0x4e,
+ 0xc8, 0x0d, 0x01, 0x80, 0xd8, 0x20, 0xe2, 0x40, 0x09, 0x2f, 0x01, 0x20,
+ 0x09, 0x6a, 0x00, 0x06, 0x13, 0x03, 0xd8, 0x20, 0xe1, 0xd0, 0x09, 0x2f,
+ 0x98, 0x20, 0x01, 0x83, 0xe2, 0x00, 0x13, 0x03, 0xd8, 0x20, 0x09, 0x2f,
+ 0x01, 0x83, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x60, 0xcb, 0xb8, 0x20, 0x20,
+ 0xe0, 0x0a, 0x13, 0x03, 0x02, 0x0d, 0x10, 0x00, 0x04, 0x5b, 0x02, 0x09,
+ 0x00, 0x08, 0x02, 0x0d, 0x09, 0x58, 0x06, 0xa0, 0xcc, 0x24, 0x07, 0xa0,
+ 0x02, 0x02, 0x00, 0x00, 0x02, 0x0d, 0x04, 0x00, 0xc3, 0xe0, 0x09, 0x58,
+ 0x01, 0x0f, 0x7c, 0x00, 0x13, 0x01, 0x04, 0x52, 0xc3, 0x8f, 0x02, 0x4e,
+ 0x00, 0x0f, 0x13, 0xfb, 0x02, 0x8e, 0x00, 0x0f, 0x13, 0xf8, 0x02, 0x0d,
+ 0x40, 0x00, 0xc2, 0x4f, 0x09, 0x49, 0x02, 0x49, 0x00, 0x3f, 0x01, 0x09,
+ 0x00, 0x01, 0x16, 0xef, 0x02, 0x89, 0x00, 0x06, 0x1a, 0xec, 0x02, 0x89,
+ 0x00, 0x20, 0x14, 0xe9, 0x06, 0xc9, 0x09, 0x1f, 0x02, 0x4f, 0x40, 0x00,
+ 0xe2, 0x4f, 0x02, 0x69, 0x80, 0x00, 0xc8, 0x09, 0x09, 0x58, 0x02, 0x0f,
+ 0xff, 0xff, 0xc2, 0x4e, 0x09, 0x1f, 0x06, 0x09, 0x16, 0xfd, 0x05, 0x4f,
+ 0x02, 0x0d, 0x20, 0x00, 0xc2, 0x60, 0x09, 0x5a, 0x13, 0xd4, 0x26, 0x4f,
+ 0x16, 0xd2, 0x02, 0x0d, 0x10, 0x00, 0xc2, 0x60, 0x09, 0x5c, 0x13, 0xcd,
+ 0x26, 0x4f, 0x16, 0xcb, 0x02, 0x0d, 0x30, 0x00, 0x88, 0x20, 0x09, 0x5a,
+ 0x09, 0x5c, 0x13, 0xc5, 0xc3, 0xe0, 0x09, 0x5a, 0xc2, 0x4e, 0x0a, 0x1f,
+ 0x06, 0x09, 0x16, 0xfd, 0xe3, 0xe0, 0x09, 0x5e, 0xc8, 0x0f, 0x09, 0x5a,
+ 0xc3, 0xe0, 0x09, 0x5c, 0xc2, 0x4e, 0x0a, 0x1f, 0x06, 0x09, 0x16, 0xfd,
+ 0xe3, 0xe0, 0x09, 0x5e, 0xc8, 0x0f, 0x09, 0x5c, 0x02, 0x0f, 0xff, 0xff,
+ 0xc2, 0x4e, 0x0a, 0x1f, 0x06, 0x09, 0x16, 0xfd, 0x02, 0x0d, 0x08, 0x00,
+ 0xc2, 0x60, 0x09, 0x5e, 0x26, 0x4f, 0x16, 0xa5, 0x05, 0x4f, 0xc8, 0x0f,
+ 0x09, 0x5e, 0x02, 0x0f, 0x02, 0x02, 0x02, 0x0e, 0x00, 0x03, 0xc3, 0x60,
+ 0x01, 0x40, 0x02, 0x0c, 0xce, 0x26, 0x01, 0xa0, 0x01, 0x40, 0x04, 0x00,
+ 0x05, 0xcf, 0x02, 0x09, 0x55, 0x55, 0x06, 0x9c, 0x05, 0x49, 0x06, 0x9c,
+ 0x07, 0x09, 0x06, 0x9c, 0x05, 0x49, 0x06, 0x9c, 0x06, 0x0e, 0x16, 0xf4,
+ 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, 0xc8, 0x0d, 0x01, 0x40, 0x02, 0x09,
+ 0x00, 0x08, 0x02, 0x0e, 0x09, 0x58, 0x02, 0x0f, 0x02, 0x02, 0xcf, 0xfe,
+ 0x06, 0x49, 0x16, 0xfd, 0x04, 0x60, 0xcb, 0xb8, 0xc7, 0xc9, 0x82, 0x5f,
+ 0x16, 0x01, 0x04, 0x5b, 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, 0xc8, 0x0d,
+ 0x01, 0x40, 0x02, 0x0d, 0x01, 0x00, 0x04, 0x52, 0x00, 0x00, 0xd8, 0xee,
+ 0x00, 0x92, 0xc2, 0xad, 0x00, 0x02, 0xc2, 0x6d, 0x00, 0x00, 0x16, 0x05,
+ 0x07, 0xaa, 0x00, 0x02, 0x07, 0x36, 0x2c, 0x9a, 0x03, 0x80, 0x2c, 0xea,
+ 0x00, 0x02, 0xcb, 0x41, 0x00, 0x00, 0x03, 0x80, 0xc3, 0x2d, 0x00, 0x18,
+ 0x07, 0xac, 0x00, 0x02, 0x07, 0x36, 0x4b, 0x20, 0xea, 0xa6, 0x00, 0x0a,
+ 0xeb, 0x20, 0xea, 0xa0, 0x00, 0x0a, 0x2e, 0x9c, 0x03, 0x80, 0xc2, 0xa0,
+ 0xe0, 0x22, 0x04, 0x60, 0xb3, 0x8a, 0xc0, 0xed, 0x00, 0x18, 0x06, 0xa0,
+ 0xd9, 0x5e, 0x03, 0x80, 0xc2, 0x44, 0xc0, 0xc3, 0x13, 0x02, 0x06, 0xa0,
+ 0xd9, 0x5e, 0xc3, 0x19, 0xcb, 0x09, 0x00, 0x18, 0x05, 0xc9, 0xcb, 0x19,
+ 0x00, 0x16, 0xc2, 0x4c, 0x02, 0x2c, 0x00, 0x1a, 0xcf, 0x0d, 0xcf, 0x0e,
+ 0xc7, 0x0f, 0x00, 0x99, 0x04, 0x5b, 0x07, 0x8c, 0x09, 0x0a, 0xc2, 0x9c,
+ 0x22, 0xa0, 0xe0, 0x14, 0x13, 0x06, 0xc2, 0xa0, 0x07, 0x58, 0x22, 0xa0,
+ 0xe0, 0x20, 0x16, 0x01, 0x03, 0x80, 0xc1, 0x03, 0x04, 0xc3, 0x07, 0x8a,
+ 0x00, 0x04, 0xa2, 0x84, 0x00, 0x00, 0xd9, 0x80, 0x00, 0x0b, 0xcf, 0x3a,
+ 0x00, 0x00, 0xd9, 0x8a, 0x00, 0xb2, 0x02, 0xe0, 0x07, 0x58, 0x07, 0x8d,
+ 0x09, 0x0a, 0xc8, 0x0b, 0x07, 0xc2, 0x06, 0xa0, 0xc5, 0xa2, 0xc2, 0xe0,
+ 0x07, 0xc2, 0xe0, 0x20, 0xe0, 0x20, 0x02, 0xe0, 0x07, 0xb8, 0x04, 0x5b,
+ 0xc3, 0x2d, 0x00, 0x18, 0xc2, 0x8c, 0xc2, 0x60, 0x01, 0x6c, 0xc8, 0x0a,
+ 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x00, 0x13, 0x02, 0xc2, 0x8b, 0x10, 0xf9,
+ 0xc8, 0x09, 0x01, 0x6c, 0x07, 0x8b, 0x05, 0xf8, 0xc2, 0x5b, 0x13, 0x0c,
+ 0x05, 0xcb, 0xc2, 0x5b, 0xc6, 0xca, 0xc2, 0xe0, 0x01, 0x6c, 0xc8, 0x09,
+ 0x01, 0x6c, 0xc8, 0x0c, 0xfc, 0x00, 0xc8, 0x0b, 0x01, 0x6c, 0x10, 0x02,
+ 0xce, 0xcc, 0xc6, 0xca, 0xc2, 0xa0, 0x00, 0xe0, 0x22, 0xa0, 0xe0, 0x1a,
+ 0x16, 0x06, 0xe8, 0x20, 0xe0, 0x04, 0x07, 0x3a, 0x48, 0x20, 0xe0, 0x1a,
+ 0x00, 0xe0, 0x03, 0x80, 0xd3, 0xe0, 0xe3, 0xab, 0xc1, 0xe0, 0x06, 0xa8,
+ 0x16, 0x05, 0x02, 0x07, 0x06, 0xa2, 0x06, 0xa0, 0xc2, 0x96, 0x16, 0x0b,
+ 0xc1, 0xe0, 0x06, 0xba, 0x16, 0x20, 0x02, 0x07, 0x06, 0xb4, 0x06, 0xa0,
+ 0xc2, 0x96, 0x13, 0x1b, 0x02, 0x07, 0x06, 0xb8, 0x10, 0x02, 0x02, 0x07,
+ 0x06, 0xa6, 0xc1, 0x60, 0xfc, 0x02, 0xc8, 0x25, 0x00, 0x0c, 0xfc, 0x02,
+ 0xc9, 0xc5, 0x00, 0x0c, 0x00, 0x00, 0xda, 0x3c, 0x00, 0x0b, 0xcd, 0xf5,
+ 0x00, 0x00, 0xda, 0x46, 0x19, 0x3a, 0xc5, 0xf5, 0x01, 0xb7, 0x00, 0x28,
+ 0x02, 0x27, 0xff, 0xf4, 0x07, 0xa7, 0x00, 0x04, 0xdb, 0x48, 0x2e, 0x97,
+ 0x10, 0xd5, 0x03, 0x00, 0x00, 0x02, 0x06, 0xa0, 0xc2, 0xae, 0x03, 0x00,
+ 0x00, 0x0f, 0x2c, 0x20, 0xed, 0x48, 0x93, 0xe0, 0xe3, 0xab, 0x16, 0x03,
+ 0x02, 0x81, 0x00, 0x16, 0x16, 0xc7, 0xc1, 0x21, 0xea, 0xb0, 0x04, 0x54,
+ 0x93, 0xe0, 0xe0, 0x10, 0x16, 0x03, 0xd2, 0xa0, 0xe3, 0xa8, 0x10, 0x0b,
+ 0xd3, 0xcf, 0x16, 0x09, 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x06, 0x07, 0x84,
+ 0x00, 0x20, 0xe8, 0x04, 0x06, 0xd2, 0xd2, 0xa0, 0xe0, 0x0c, 0x04, 0x60,
+ 0xdb, 0xc0, 0x04, 0x60, 0xde, 0x34, 0x10, 0x7b, 0xc1, 0x22, 0x00, 0x04,
+ 0x04, 0xe2, 0x00, 0x02, 0x04, 0x54, 0xc8, 0x02, 0x01, 0x6c, 0xa0, 0x82,
+ 0xc8, 0x22, 0x0c, 0x32, 0xfc, 0x00, 0x02, 0x02, 0xfc, 0x00, 0x93, 0xe0,
+ 0xe3, 0xaa, 0x13, 0x70, 0x06, 0xa0, 0xdc, 0xc6, 0x48, 0xa0, 0xe0, 0x04,
+ 0x00, 0x0e, 0x02, 0x85, 0x00, 0x07, 0x13, 0x0e, 0x01, 0x0e, 0x00, 0x03,
+ 0x13, 0x0b, 0x23, 0xa0, 0xe0, 0x22, 0x16, 0x03, 0xd2, 0xa0, 0xe0, 0x0e,
+ 0x10, 0x02, 0xd2, 0xa0, 0xe3, 0xa8, 0x01, 0x8e, 0x00, 0x03, 0x10, 0x5a,
+ 0xc8, 0x05, 0x06, 0xfc, 0xc0, 0xc3, 0x16, 0x53, 0x43, 0xa0, 0xe0, 0x10,
+ 0x88, 0x22, 0x00, 0x0e, 0x09, 0x6c, 0x16, 0x0a, 0x88, 0x22, 0x00, 0x10,
+ 0x09, 0x6e, 0x16, 0x06, 0x88, 0x22, 0x00, 0x12, 0x09, 0x70, 0x16, 0x02,
+ 0xe3, 0xa0, 0xe0, 0x10, 0x02, 0x85, 0x00, 0x09, 0x13, 0x02, 0x06, 0xa0,
+ 0xe2, 0xe4, 0xa1, 0x45, 0xc1, 0x65, 0xe3, 0xac, 0x04, 0x55, 0xc0, 0x62,
+ 0x00, 0x04, 0xc8, 0x22, 0x00, 0x06, 0x01, 0x6c, 0x02, 0x82, 0x04, 0x48,
+ 0x1b, 0x02, 0x43, 0xa0, 0xe0, 0x0c, 0xc1, 0x22, 0x00, 0x0e, 0x04, 0x51,
+ 0xc0, 0x42, 0x04, 0xe1, 0x00, 0x02, 0xc0, 0xa2, 0x00, 0x0c, 0xc1, 0x22,
+ 0x00, 0x0a, 0x21, 0x20, 0xe0, 0x18, 0x13, 0x07, 0xc8, 0xa1, 0x00, 0x0a,
+ 0x00, 0x0a, 0xc8, 0xa1, 0x00, 0x08, 0x00, 0x08, 0x10, 0xe2, 0xc8, 0x22,
+ 0x00, 0x06, 0x01, 0x6c, 0x06, 0xa0, 0xe1, 0xa2, 0x04, 0x60, 0xdb, 0x9e,
+ 0xc8, 0x02, 0x06, 0xd4, 0xc1, 0x62, 0x00, 0x02, 0xc1, 0x65, 0xe3, 0xce,
+ 0x04, 0x55, 0x10, 0x0b, 0x07, 0x85, 0x03, 0xf4, 0x04, 0xf5, 0xcd, 0x60,
+ 0xed, 0x26, 0x06, 0xa0, 0xe3, 0xce, 0xe3, 0xa0, 0xe0, 0x0c, 0x2e, 0xa0,
+ 0x03, 0xf4, 0x04, 0x60, 0xda, 0x04, 0x06, 0xa0, 0xe0, 0x6e, 0x10, 0x0c,
+ 0x06, 0xa0, 0xe1, 0xa2, 0x10, 0x09, 0x06, 0xa0, 0xe3, 0x56, 0x10, 0x06,
+ 0x06, 0xa0, 0xe1, 0xa2, 0xc8, 0x03, 0x09, 0x2a, 0xd2, 0xa0, 0xe3, 0xaa,
+ 0x06, 0xa0, 0xdc, 0x32, 0x92, 0xa0, 0xe0, 0x26, 0x16, 0x0c, 0xd3, 0xe0,
+ 0xe0, 0x26, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x0a, 0xc1, 0x0a, 0x83, 0xc4,
+ 0x13, 0x07, 0xc3, 0xc4, 0xc1, 0x24, 0xe3, 0xd2, 0x04, 0x54, 0x93, 0xca,
+ 0x13, 0xdc, 0xd3, 0xca, 0x03, 0xb0, 0xd8, 0x0f, 0x06, 0x59, 0x71, 0x04,
+ 0xc1, 0x24, 0xe3, 0xde, 0x04, 0x54, 0x23, 0xa0, 0xe0, 0x0c, 0x13, 0xd1,
+ 0xc3, 0x4d, 0x13, 0xcf, 0x07, 0x86, 0x00, 0x02, 0x07, 0x84, 0x00, 0x26,
+ 0x23, 0x46, 0x13, 0x03, 0x06, 0x44, 0xa1, 0x86, 0x10, 0xfb, 0x43, 0x46,
+ 0x10, 0xb9, 0x07, 0x85, 0x07, 0x1c, 0x07, 0x86, 0x04, 0x1a, 0x6d, 0x76,
+ 0x6d, 0x76, 0x6d, 0x76, 0x05, 0xc6, 0x6d, 0x76, 0x6d, 0x76, 0x6d, 0x76,
+ 0x07, 0x83, 0x90, 0x00, 0x10, 0xbe, 0xc3, 0x0b, 0x07, 0x86, 0x01, 0x00,
+ 0x07, 0x85, 0x80, 0x00, 0xc1, 0x20, 0x06, 0xd2, 0x13, 0x37, 0x04, 0xc4,
+ 0xc0, 0x60, 0x06, 0xd2, 0x20, 0x45, 0x13, 0x04, 0x05, 0x84, 0x09, 0x15,
+ 0x16, 0xf9, 0x10, 0x2e, 0xd3, 0xcf, 0x16, 0x06, 0x23, 0xe0, 0xe0, 0x14,
+ 0x16, 0x03, 0x01, 0x0e, 0x00, 0x03, 0x13, 0x03, 0x04, 0xe0, 0x06, 0xd2,
+ 0x10, 0x23, 0xd0, 0x64, 0x07, 0x1c, 0xb0, 0x46, 0x18, 0x10, 0xd9, 0x01,
+ 0x07, 0x1c, 0x23, 0x60, 0xe0, 0x20, 0x13, 0x0b, 0x07, 0x81, 0x00, 0x18,
+ 0xc0, 0x61, 0xe3, 0xee, 0x88, 0x11, 0xed, 0x26, 0x13, 0x04, 0x02, 0x08,
+ 0x80, 0x18, 0x06, 0xa0, 0xe0, 0x22, 0xd0, 0x64, 0x07, 0x28, 0xb0, 0x46,
+ 0x18, 0x08, 0xd9, 0x01, 0x07, 0x28, 0xb0, 0x46, 0x17, 0x04, 0x07, 0x83,
+ 0x80, 0x40, 0x06, 0xa0, 0xe3, 0x56, 0x48, 0x05, 0x06, 0xd2, 0x16, 0xca,
+ 0xc1, 0x20, 0x09, 0x32, 0x16, 0x01, 0x04, 0x5c, 0x02, 0x04, 0x00, 0x07,
+ 0x06, 0x20, 0x09, 0x32, 0x02, 0x05, 0x01, 0x00, 0x10, 0xc7, 0xc3, 0x0b,
+ 0x04, 0xc5, 0xc0, 0x42, 0x04, 0xc7, 0xc2, 0x20, 0x01, 0x6c, 0xa1, 0xe1,
+ 0x00, 0x04, 0xc8, 0x11, 0x01, 0x6c, 0x16, 0xfb, 0xc8, 0x08, 0x01, 0x6c,
+ 0x04, 0xc8, 0x43, 0xa0, 0xe0, 0x1a, 0xc1, 0x22, 0x00, 0x0e, 0x15, 0x0d,
+ 0x13, 0x0c, 0xe3, 0xa0, 0xe0, 0x1a, 0x06, 0xa0, 0xe3, 0x40, 0xc2, 0x08,
+ 0x13, 0x48, 0x02, 0x88, 0x00, 0x12, 0x1b, 0x45, 0x22, 0x20, 0xe0, 0x22,
+ 0x13, 0x42, 0xc1, 0x02, 0xa1, 0x08, 0x05, 0x08, 0x02, 0x28, 0xff, 0xf2,
+ 0xa2, 0x07, 0x07, 0x83, 0x80, 0x01, 0x02, 0x88, 0x00, 0x04, 0x11, 0x6e,
+ 0xc2, 0x64, 0x00, 0x16, 0xd2, 0x49, 0x16, 0x02, 0x81, 0x02, 0x16, 0x31,
+ 0x01, 0x09, 0xf0, 0x00, 0x16, 0x28, 0xc1, 0x49, 0x71, 0x45, 0x04, 0xc3,
+ 0x02, 0x85, 0x00, 0x09, 0x13, 0x7c, 0x07, 0x83, 0x80, 0x02, 0xc1, 0xa4,
+ 0x00, 0x14, 0x81, 0x88, 0x16, 0x76, 0x05, 0x83, 0x02, 0x85, 0x00, 0x10,
+ 0x1b, 0x13, 0x05, 0x83, 0x99, 0x49, 0xea, 0xd0, 0x13, 0x0a, 0x98, 0x09,
+ 0xe0, 0x0e, 0x16, 0x6b, 0x98, 0x25, 0xea, 0xd0, 0xe0, 0x0c, 0x16, 0x67,
+ 0xc1, 0xe0, 0x06, 0xec, 0x16, 0x64, 0x04, 0xc3, 0xc2, 0x52, 0x13, 0x0f,
+ 0x07, 0x83, 0x80, 0x09, 0xc1, 0xe0, 0x09, 0x6a, 0x01, 0x47, 0x10, 0x00,
+ 0x16, 0x5a, 0xc0, 0xa0, 0x01, 0x6c, 0x06, 0xa0, 0xe1, 0xfa, 0x04, 0x60,
+ 0xdb, 0x9e, 0x04, 0x60, 0xdb, 0xa8, 0x07, 0x89, 0x07, 0x0e, 0x04, 0xc7,
+ 0xd1, 0xe5, 0xea, 0xe1, 0x13, 0x05, 0x06, 0xc7, 0x02, 0x27, 0xea, 0xf2,
+ 0xce, 0x77, 0x15, 0xfe, 0xc0, 0x44, 0x02, 0x21, 0x00, 0x18, 0x02, 0x28,
+ 0xff, 0xfc, 0x13, 0x36, 0xc1, 0x91, 0xd1, 0x86, 0x13, 0x1f, 0x06, 0xc6,
+ 0x07, 0x87, 0x07, 0x0e, 0xc0, 0xf7, 0x02, 0x46, 0xbf, 0xff, 0x02, 0x43,
+ 0x3f, 0xff, 0x91, 0xa0, 0xed, 0x4d, 0x16, 0x09, 0x03, 0xb0, 0x98, 0x20,
+ 0xe0, 0x0e, 0x06, 0x5d, 0x16, 0x0f, 0xc8, 0x21, 0x00, 0x02, 0x07, 0x0c,
+ 0x10, 0x17, 0x82, 0x47, 0x1b, 0x0c, 0x90, 0xc6, 0x16, 0xeb, 0x06, 0x47,
+ 0x04, 0xf7, 0x03, 0xb0, 0x98, 0x20, 0x06, 0x5d, 0x06, 0x57, 0x13, 0x0c,
+ 0x07, 0x83, 0x80, 0x05, 0x10, 0x1c, 0xc0, 0xd1, 0x20, 0xe0, 0xe0, 0x16,
+ 0x16, 0x03, 0x07, 0x83, 0x80, 0x08, 0x10, 0x15, 0x44, 0x60, 0xe0, 0x26,
+ 0x71, 0x86, 0xa0, 0x46, 0x62, 0x06, 0x07, 0x83, 0x80, 0x05, 0xc2, 0x08,
+ 0x15, 0xcb, 0x16, 0x0b, 0x04, 0xc3, 0x07, 0x87, 0x07, 0x0e, 0xc0, 0x77,
+ 0x82, 0x47, 0x1b, 0x05, 0x20, 0x60, 0xe0, 0x06, 0x16, 0xfa, 0x07, 0x83,
+ 0x80, 0x07, 0x04, 0x5c, 0x92, 0xa0, 0xe0, 0x0e, 0x16, 0x11, 0xc8, 0x20,
+ 0xe0, 0x20, 0x07, 0x08, 0x04, 0xe0, 0x01, 0x84, 0x05, 0x60, 0x07, 0x02,
+ 0x13, 0x3f, 0x48, 0x20, 0xe0, 0x06, 0x01, 0x82, 0x06, 0xa0, 0xe0, 0x18,
+ 0x07, 0x83, 0xc0, 0x00, 0x06, 0xa0, 0xe3, 0x56, 0xc8, 0x20, 0xe0, 0x1e,
+ 0x07, 0x02, 0xe3, 0xa0, 0xe0, 0x04, 0x02, 0x08, 0x80, 0x24, 0x06, 0xa0,
+ 0xe0, 0x22, 0x10, 0x36, 0xc1, 0x20, 0x01, 0x84, 0x02, 0x44, 0x88, 0x00,
+ 0x13, 0x1e, 0x48, 0x04, 0x01, 0x84, 0x06, 0x20, 0x07, 0x02, 0x16, 0xf1,
+ 0x23, 0xa0, 0xe0, 0x22, 0x16, 0x05, 0x43, 0xa0, 0xe0, 0x22, 0xd2, 0xa0,
+ 0xe0, 0x0e, 0x10, 0xd3, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x04, 0x98, 0x20,
+ 0xe3, 0xa9, 0x06, 0x65, 0x16, 0x06, 0x92, 0xa0, 0xe0, 0x0e, 0x13, 0xc9,
+ 0xd2, 0xa0, 0xe3, 0xa8, 0x10, 0xd7, 0x07, 0x83, 0x00, 0x02, 0x04, 0x60,
+ 0xdb, 0xb8, 0xe8, 0x20, 0xe0, 0x06, 0x01, 0x82, 0x06, 0xa0, 0xe0, 0x18,
+ 0x07, 0x20, 0x07, 0x02, 0x43, 0xa0, 0xe0, 0x04, 0xc8, 0x20, 0xe4, 0x6e,
+ 0x01, 0x86, 0x88, 0x20, 0xe0, 0x20, 0x07, 0x08, 0x16, 0x03, 0xc8, 0x20,
+ 0xeb, 0x0a, 0x07, 0x08, 0x04, 0x60, 0xdb, 0xc0, 0x01, 0x0e, 0x00, 0x03,
+ 0x13, 0x16, 0xd3, 0xcf, 0x16, 0x08, 0x23, 0xa0, 0xe0, 0x20, 0x16, 0x03,
+ 0xd2, 0xa0, 0xe3, 0xa8, 0x10, 0x02, 0xd2, 0xa0, 0xe0, 0x0e, 0x01, 0x8e,
+ 0x00, 0x03, 0x10, 0x09, 0xc1, 0x60, 0x01, 0x84, 0x21, 0x60, 0xe0, 0x0a,
+ 0x16, 0x04, 0x07, 0x83, 0x84, 0x00, 0x04, 0x60, 0xdb, 0xb8, 0xc8, 0x20,
+ 0xe0, 0x2e, 0x01, 0x84, 0x02, 0x08, 0x80, 0x06, 0x06, 0xa0, 0xe0, 0x22,
+ 0x04, 0x60, 0xdb, 0xc0, 0xe3, 0x60, 0xe0, 0x20, 0x04, 0x60, 0xdb, 0xc0,
+ 0x93, 0xe0, 0xe0, 0x26, 0x16, 0x10, 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x0d,
+ 0x23, 0xa0, 0xe0, 0x06, 0x13, 0x02, 0xe3, 0x60, 0xe0, 0x1c, 0xe3, 0x60,
+ 0xe0, 0x18, 0x43, 0xa0, 0xe0, 0x06, 0x02, 0x08, 0x80, 0x3c, 0x06, 0xa0,
+ 0xe0, 0x22, 0x04, 0x60, 0xdb, 0xc0, 0x92, 0xa0, 0xe3, 0xa8, 0x13, 0x03,
+ 0x92, 0xa0, 0xe3, 0xa9, 0x16, 0x1e, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x08,
+ 0x98, 0x20, 0xe3, 0xa9, 0x06, 0x65, 0x13, 0x04, 0x07, 0x83, 0x00, 0x07,
+ 0x04, 0x60, 0xdb, 0xb8, 0xd2, 0xa0, 0xe0, 0x0e, 0xc8, 0x20, 0xe0, 0x20,
+ 0x07, 0x08, 0x27, 0xa0, 0xe0, 0x04, 0x16, 0x0b, 0xc8, 0x20, 0xe0, 0x1e,
+ 0x07, 0x08, 0x93, 0xe0, 0xe3, 0xa8, 0x16, 0x05, 0x23, 0xa0, 0xe0, 0x12,
+ 0x13, 0x02, 0x06, 0x20, 0x07, 0x08, 0x04, 0x60, 0xdb, 0xc0, 0x23, 0xe0,
+ 0xe0, 0x14, 0x13, 0x36, 0x03, 0xb0, 0x98, 0x20, 0xe0, 0x0e, 0x06, 0x6f,
+ 0x16, 0x0f, 0xd3, 0xcf, 0x16, 0x2f, 0xd2, 0xa0, 0xe3, 0xa8, 0x04, 0x60,
+ 0xdb, 0xc0, 0x92, 0xa0, 0xe0, 0x0c, 0x16, 0x28, 0x23, 0xe0, 0xe0, 0x14,
+ 0x13, 0xf6, 0x07, 0x83, 0x00, 0x06, 0x10, 0x07, 0x07, 0x83, 0x00, 0x05,
+ 0x93, 0xe0, 0xe0, 0x0e, 0x16, 0x02, 0x07, 0x83, 0x00, 0x07, 0x04, 0x60,
+ 0xdb, 0xb8, 0xe3, 0x60, 0xe0, 0x12, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x0d,
+ 0x98, 0x20, 0xe0, 0x0c, 0x06, 0x65, 0x16, 0x03, 0xd8, 0x20, 0xe3, 0xa9,
+ 0x06, 0x65, 0x10, 0x0c, 0xc1, 0x20, 0x01, 0x84, 0x21, 0x20, 0xe0, 0x06,
+ 0x16, 0xd6, 0x48, 0x20, 0xe0, 0x06, 0x01, 0x84, 0x02, 0x08, 0x80, 0x30,
+ 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x60, 0xdb, 0xc0, 0x02, 0x04, 0x00, 0x64,
+ 0x06, 0x04, 0x16, 0xfe, 0x04, 0x5b, 0xe3, 0xa0, 0xe0, 0x0a, 0xc2, 0x08,
+ 0x11, 0x02, 0x43, 0xa0, 0xe0, 0x0a, 0x42, 0x20, 0xe0, 0x04, 0x02, 0x28,
+ 0xe3, 0xee, 0xc0, 0x58, 0xc0, 0x02, 0x88, 0x11, 0xed, 0x26, 0x16, 0x03,
+ 0x2c, 0xd1, 0xc0, 0x58, 0x04, 0xd1, 0xc0, 0x80, 0x01, 0x0e, 0x10, 0x00,
+ 0x13, 0x0f, 0xcc, 0x60, 0xed, 0x26, 0x05, 0xc8, 0xcc, 0x78, 0x16, 0x03,
+ 0x06, 0x41, 0xcc, 0x60, 0x06, 0xd6, 0xc4, 0x58, 0x16, 0x02, 0xc4, 0x60,
+ 0x07, 0x00, 0x02, 0x21, 0xff, 0xfa, 0x2c, 0x91, 0x04, 0x5b, 0xc3, 0x0b,
+ 0x06, 0xa0, 0xe1, 0x0a, 0x06, 0xa0, 0xe0, 0xe4, 0xc2, 0x08, 0x16, 0x05,
+ 0xc2, 0x62, 0x00, 0x02, 0x26, 0x60, 0xe4, 0x68, 0x16, 0x0d, 0xc2, 0x42,
+ 0x05, 0xc9, 0xce, 0x60, 0xed, 0x4a, 0xc6, 0x60, 0xeb, 0x0c, 0x06, 0xa0,
+ 0xe1, 0x4c, 0xca, 0x18, 0x00, 0x0a, 0x46, 0x20, 0xe0, 0x26, 0x16, 0x04,
+ 0xc0, 0xa0, 0x01, 0x6c, 0x2e, 0x12, 0x10, 0x1d, 0xc1, 0x12, 0x13, 0x05,
+ 0xc1, 0x60, 0x01, 0x6c, 0x2e, 0x14, 0xc8, 0x05, 0x01, 0x6c, 0x04, 0xd2,
+ 0x06, 0x48, 0x07, 0x84, 0x00, 0x02, 0xc1, 0x48, 0xc0, 0xa0, 0x01, 0x6c,
+ 0xc0, 0x02, 0x06, 0xa0, 0xe3, 0xce, 0xc5, 0x60, 0xfc, 0x02, 0x02, 0x07,
+ 0x06, 0xa2, 0x02, 0x25, 0xff, 0xf4, 0xc8, 0x05, 0xfc, 0x02, 0xc2, 0x20,
+ 0x01, 0x6c, 0x06, 0xa0, 0xc2, 0x5a, 0x04, 0x5c, 0xc2, 0x42, 0x02, 0x29,
+ 0x00, 0x08, 0xc2, 0x39, 0x02, 0x48, 0xc0, 0x00, 0x02, 0x88, 0xc0, 0x00,
+ 0x16, 0x08, 0x8e, 0x60, 0xe0, 0x2e, 0x16, 0x05, 0x86, 0x60, 0xe0, 0x2e,
+ 0x16, 0x02, 0x04, 0xc8, 0x04, 0x5b, 0x07, 0x08, 0x04, 0x5b, 0x88, 0x20,
+ 0xe1, 0x8e, 0x01, 0x6c, 0x16, 0x02, 0x04, 0x60, 0xdb, 0xa8, 0x04, 0x5b,
+ 0x07, 0x88, 0x01, 0xae, 0xe8, 0x20, 0xe0, 0x0e, 0x01, 0x80, 0x06, 0x08,
+ 0x16, 0xfe, 0x48, 0x20, 0xe0, 0x0e, 0x01, 0x80, 0x04, 0x5b, 0x04, 0xc2,
+ 0x23, 0xa0, 0xe0, 0x0c, 0x16, 0x0a, 0x2f, 0x20, 0x06, 0x30, 0x07, 0x82,
+ 0xff, 0xdf, 0x2c, 0x02, 0x02, 0x82, 0x03, 0xf4, 0x16, 0xfa, 0x43, 0xa0,
+ 0xe0, 0x0c, 0x04, 0x5b, 0xc2, 0x42, 0x07, 0x88, 0x00, 0x0e, 0xa2, 0x09,
+ 0x02, 0x29, 0x00, 0x08, 0xce, 0x78, 0xce, 0x78, 0xce, 0x78, 0xce, 0x60,
+ 0x09, 0x6c, 0xce, 0x60, 0x09, 0x6e, 0xce, 0x60, 0x09, 0x70, 0x23, 0xa0,
+ 0xe0, 0x1a, 0x16, 0x0f, 0xc2, 0x58, 0x02, 0x49, 0x1f, 0x80, 0x2a, 0x60,
+ 0xe0, 0x14, 0xe8, 0xa0, 0xe0, 0x04, 0x00, 0x0e, 0xc6, 0x09, 0x02, 0x49,
+ 0x1f, 0x00, 0x06, 0xc9, 0xa2, 0x09, 0xa8, 0x89, 0x00, 0x04, 0x02, 0x28,
+ 0x00, 0x02, 0xc2, 0x58, 0x0a, 0x49, 0x02, 0x49, 0xf0, 0x00, 0xd6, 0x09,
+ 0x04, 0xe2, 0x00, 0x06, 0x04, 0x5b, 0x07, 0x00, 0xc0, 0x82, 0x13, 0x53,
+ 0xc0, 0xa0, 0x01, 0x6c, 0xc1, 0xa0, 0xfc, 0x06, 0x02, 0x46, 0x00, 0x0f,
+ 0x02, 0x86, 0x00, 0x01, 0x12, 0x3d, 0x88, 0x06, 0x06, 0xf2, 0x16, 0x12,
+ 0x02, 0x01, 0xfc, 0x0e, 0x88, 0x31, 0x06, 0xf4, 0x16, 0x0d, 0x88, 0x31,
+ 0x06, 0xf6, 0x16, 0x0a, 0x88, 0x31, 0x06, 0xf8, 0x16, 0x07, 0x02, 0x86,
+ 0x00, 0x02, 0x16, 0x2c, 0x88, 0x20, 0x07, 0x0a, 0x06, 0xfa, 0x13, 0x28,
+ 0xc1, 0x20, 0x09, 0x6a, 0x01, 0x44, 0x08, 0x00, 0x13, 0x06, 0x02, 0x86,
+ 0x00, 0x02, 0x16, 0x20, 0x01, 0x44, 0x00, 0x80, 0x16, 0x1d, 0x07, 0x00,
+ 0x23, 0xe0, 0xe0, 0x14, 0x16, 0x19, 0x02, 0x82, 0x00, 0x43, 0x13, 0x16,
+ 0x02, 0x00, 0xfc, 0x02, 0xc0, 0x40, 0x01, 0xb0, 0x00, 0x20, 0x01, 0x60,
+ 0x09, 0x6a, 0x00, 0x01, 0x16, 0x07, 0xa0, 0x60, 0x09, 0x2c, 0xcc, 0x60,
+ 0x05, 0xee, 0xc4, 0x50, 0xc4, 0x20, 0x09, 0x2c, 0x07, 0x80, 0x07, 0x36,
+ 0x07, 0x81, 0x00, 0x40, 0x2c, 0x40, 0x04, 0xc0, 0x07, 0x84, 0x06, 0xf2,
+ 0xcd, 0x06, 0x02, 0x01, 0xfc, 0x0e, 0xcd, 0x31, 0xcd, 0x31, 0xcd, 0x31,
+ 0xc5, 0x20, 0x07, 0x0a, 0xc0, 0x00, 0x13, 0x01, 0x2e, 0x12, 0x04, 0xe0,
+ 0x01, 0x6c, 0x04, 0x5b, 0xc8, 0x0b, 0x09, 0x22, 0x06, 0xa0, 0xe2, 0x72,
+ 0x02, 0x08, 0x80, 0x42, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, 0x80, 0x30,
+ 0x06, 0xa0, 0xe0, 0x22, 0xc2, 0xe0, 0x09, 0x22, 0x04, 0x5b, 0xc3, 0x0b,
+ 0x48, 0x20, 0xeb, 0x0e, 0x01, 0x82, 0x48, 0x20, 0xe4, 0x6c, 0x01, 0x80,
+ 0x48, 0x20, 0xe0, 0x22, 0x01, 0xae, 0x48, 0x20, 0xe0, 0x22, 0x09, 0x78,
+ 0x43, 0x60, 0xe0, 0x18, 0x43, 0xa0, 0xe0, 0x08, 0x02, 0x08, 0x00, 0x42,
+ 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x5c, 0xc3, 0x0b, 0xe8, 0x20, 0xe0, 0x0e,
+ 0x01, 0x82, 0xe8, 0x20, 0xe0, 0x22, 0x01, 0xae, 0xe8, 0x20, 0xe0, 0x22,
+ 0x09, 0x78, 0xe3, 0xa0, 0xe0, 0x08, 0xe3, 0x60, 0xe0, 0x18, 0x43, 0xa0,
+ 0xe0, 0x06, 0x02, 0x08, 0x80, 0x3c, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08,
+ 0x80, 0x42, 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x5c, 0xc3, 0x0b, 0x07, 0x83,
+ 0x68, 0x00, 0x06, 0xa0, 0xe3, 0x56, 0x07, 0x83, 0x80, 0x10, 0x06, 0xa0,
+ 0xe3, 0x56, 0x04, 0x5c, 0xc3, 0x0b, 0x06, 0xa0, 0xe3, 0x40, 0xa2, 0x02,
+ 0xc2, 0x68, 0x00, 0x14, 0x02, 0x29, 0xff, 0xfc, 0x13, 0x24, 0x02, 0x28,
+ 0x00, 0x18, 0x07, 0x87, 0x00, 0x0e, 0x07, 0x81, 0x07, 0x0e, 0x04, 0xf1,
+ 0x06, 0x47, 0x15, 0xfd, 0xc0, 0x58, 0x03, 0xb0, 0x78, 0x01, 0x06, 0x63,
+ 0x02, 0x41, 0x00, 0x3f, 0x13, 0x0e, 0x02, 0x81, 0x00, 0x1f, 0x1b, 0x0b,
+ 0xa0, 0x41, 0xc0, 0x61, 0xe4, 0x4e, 0xc1, 0xf8, 0x06, 0xc7, 0x71, 0xc7,
+ 0x06, 0x47, 0xcc, 0x78, 0x06, 0x47, 0x15, 0xfd, 0x10, 0x04, 0xc0, 0x58,
+ 0x06, 0xc1, 0x70, 0x41, 0xa2, 0x01, 0xc2, 0x49, 0x15, 0xe5, 0x04, 0x5c,
+ 0x23, 0xa0, 0xe0, 0x1a, 0x13, 0x02, 0x04, 0xc8, 0x04, 0x5b, 0xc2, 0x22,
+ 0x00, 0x14, 0x02, 0x48, 0x1f, 0x00, 0x06, 0xc8, 0x04, 0x5b, 0x02, 0x83,
+ 0x00, 0x0f, 0x1b, 0x17, 0xc1, 0xa0, 0x06, 0xd4, 0x13, 0x35, 0x02, 0x26,
+ 0x00, 0x04, 0xcd, 0xa0, 0xed, 0x26, 0xc5, 0x83, 0x13, 0x04, 0xc2, 0x4a,
+ 0x0a, 0x39, 0xe0, 0xc9, 0xc5, 0x83, 0x07, 0x86, 0x07, 0x36, 0x07, 0x87,
+ 0x00, 0x10, 0xc2, 0x20, 0x06, 0xd4, 0x04, 0xe0, 0x06, 0xd4, 0x2c, 0x46,
+ 0x04, 0x5b, 0xc0, 0x60, 0x06, 0xfe, 0xc2, 0x20, 0x09, 0x6a, 0x02, 0x48,
+ 0x60, 0x00, 0x22, 0x20, 0xe0, 0x06, 0x16, 0x04, 0xe2, 0x20, 0xe0, 0x0a,
+ 0xe2, 0x20, 0xe0, 0x18, 0x0a, 0x13, 0x18, 0x04, 0x05, 0x41, 0x48, 0x03,
+ 0x06, 0xfe, 0x10, 0x06, 0x02, 0x83, 0x00, 0x02, 0x16, 0x01, 0x09, 0x13,
+ 0xe8, 0x03, 0x06, 0xfe, 0x40, 0xc8, 0x40, 0xc1, 0x13, 0x05, 0x07, 0x88,
+ 0x07, 0x36, 0x07, 0x89, 0x40, 0x00, 0x2c, 0x48, 0x04, 0x5b, 0x04, 0xc9,
+ 0xc1, 0x24, 0xeb, 0x24, 0xc1, 0x84, 0x71, 0x86, 0x02, 0x26, 0xeb, 0xd6,
+ 0x06, 0xc4, 0x71, 0x04, 0x02, 0x24, 0xeb, 0x4c, 0xd2, 0x14, 0x09, 0xc8,
+ 0xa2, 0x08, 0x03, 0xb0, 0xd8, 0x34, 0x06, 0x5f, 0x02, 0x47, 0x00, 0x0f,
+ 0xa1, 0xc7, 0xc2, 0x28, 0xeb, 0x12, 0x04, 0x58, 0xcd, 0x76, 0x06, 0x47,
+ 0x16, 0xfd, 0x10, 0x32, 0xc2, 0x36, 0x10, 0x26, 0x09, 0x17, 0xa1, 0x47,
+ 0x10, 0x2d, 0x09, 0x17, 0x61, 0x47, 0x10, 0x2a, 0x43, 0xa0, 0xe0, 0x16,
+ 0x04, 0x5b, 0x43, 0xa0, 0xe0, 0x16, 0xc2, 0x49, 0x16, 0x03, 0xc2, 0x44,
+ 0xc8, 0x06, 0x09, 0x22, 0xc1, 0x27, 0xec, 0xe6, 0xc1, 0x84, 0x71, 0x86,
+ 0x02, 0x26, 0xed, 0x1c, 0x06, 0xc4, 0x71, 0x04, 0x02, 0x24, 0xed, 0x02,
+ 0x10, 0xd3, 0xc1, 0x09, 0xc1, 0xa0, 0x09, 0x22, 0x04, 0xc9, 0x10, 0x10,
+ 0xc2, 0x36, 0xd5, 0x78, 0x41, 0x60, 0xe0, 0x22, 0x05, 0xc5, 0x10, 0x0a,
+ 0xcd, 0x78, 0x06, 0x47, 0x15, 0xfd, 0x10, 0x06, 0x23, 0xa0, 0xe0, 0x16,
+ 0x16, 0xcd, 0xc2, 0x49, 0x16, 0xec, 0x10, 0xd6, 0xe3, 0xa0, 0xe0, 0x16,
+ 0x10, 0xbb, 0x02, 0x08, 0x80, 0x5a, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x3e,
+ 0x92, 0xa0, 0xe0, 0x0c, 0x16, 0x15, 0x02, 0x44, 0x5e, 0x00, 0x16, 0x14,
+ 0x48, 0x20, 0xe4, 0x6c, 0x01, 0x80, 0x06, 0xa0, 0xe2, 0x9e, 0xc8, 0x20,
+ 0x01, 0x9e, 0x01, 0x9e, 0x2e, 0xe0, 0x00, 0x01, 0x43, 0xa0, 0xe0, 0x18,
+ 0xd2, 0xa0, 0xe0, 0x26, 0x07, 0x83, 0x00, 0x10, 0x06, 0xa0, 0xe3, 0x56,
+ 0x04, 0x60, 0xdb, 0xc0, 0x07, 0x84, 0x00, 0x08, 0x04, 0x60, 0xdb, 0x88,
+ 0x07, 0x85, 0x02, 0x03, 0xc8, 0x05, 0x06, 0xce, 0x43, 0xa0, 0xe0, 0x12,
+ 0x04, 0xe0, 0x06, 0xfa, 0x06, 0xa0, 0xe2, 0xd0, 0x02, 0x08, 0x80, 0x48,
+ 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x11, 0x27, 0xa0, 0xe0, 0x2c, 0x16, 0x04,
+ 0x02, 0x08, 0x80, 0x54, 0x06, 0xa0, 0xe0, 0x22, 0x07, 0x83, 0xa8, 0x00,
+ 0x88, 0x20, 0x07, 0x08, 0xe0, 0x20, 0x16, 0x02, 0x07, 0x83, 0xe8, 0x00,
+ 0x06, 0xa0, 0xe3, 0x56, 0x02, 0x08, 0x00, 0x36, 0x06, 0xa0, 0xe0, 0x22,
+ 0xe8, 0x20, 0xe0, 0x0c, 0x01, 0x82, 0x23, 0xa0, 0xe0, 0x18, 0x13, 0x06,
+ 0xe3, 0xa0, 0xe0, 0x18, 0x2e, 0xe0, 0x00, 0x00, 0xc0, 0x41, 0x16, 0xfa,
+ 0x06, 0xa0, 0xe1, 0x2e, 0xc0, 0x82, 0x13, 0x02, 0x02, 0x4f, 0xff, 0x80,
+ 0x04, 0xc4, 0xd1, 0x0f, 0x06, 0xc4, 0x04, 0x60, 0xdb, 0x88, 0x06, 0xa0,
+ 0xe5, 0x50, 0x02, 0x08, 0x80, 0x36, 0x07, 0xa0, 0x06, 0xd6, 0xe5, 0x3e,
+ 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x10, 0x06, 0xa0, 0xe5, 0x50, 0xd1, 0x20,
+ 0x06, 0xce, 0x13, 0xe6, 0x78, 0x20, 0xe0, 0x12, 0x06, 0xce, 0x10, 0xe2,
+ 0xc1, 0x20, 0x04, 0x16, 0x0a, 0x14, 0x06, 0xc4, 0x91, 0x0a, 0x16, 0x01,
+ 0x04, 0x5b, 0x04, 0x60, 0xdb, 0xc0, 0x04, 0xca, 0x04, 0xcd, 0x04, 0xce,
+ 0x04, 0xcf, 0x04, 0xe0, 0x06, 0xa8, 0x04, 0xe0, 0x06, 0xba, 0x07, 0x84,
+ 0x01, 0xa0, 0x07, 0x85, 0x00, 0x10, 0x04, 0xf4, 0x06, 0x45, 0x15, 0xfd,
+ 0x07, 0x84, 0x06, 0xd8, 0x07, 0x85, 0x07, 0x34, 0x61, 0x44, 0x04, 0xf4,
+ 0x06, 0x45, 0x15, 0xfd, 0x07, 0x84, 0x00, 0xc8, 0xc8, 0x04, 0x07, 0x00,
+ 0x07, 0x84, 0x7f, 0xff, 0xc8, 0x04, 0x06, 0xf0, 0x07, 0x84, 0x00, 0x06,
+ 0xc8, 0x04, 0x06, 0xee, 0x03, 0xb0, 0xd8, 0x20, 0xe0, 0x10, 0x06, 0x65,
+ 0x04, 0x60, 0xdb, 0xc0, 0xf8, 0x20, 0xed, 0x71, 0x01, 0x82, 0xc8, 0x20,
+ 0xe0, 0x10, 0x06, 0xc6, 0xc8, 0x20, 0xe0, 0x20, 0x06, 0xc8, 0x2e, 0xe0,
+ 0x00, 0x00, 0x06, 0xa0, 0xe1, 0x2e, 0xc8, 0x20, 0x09, 0x6c, 0x01, 0xa0,
+ 0xc8, 0x20, 0x09, 0x6e, 0x01, 0xa2, 0xc8, 0x20, 0x09, 0x70, 0x01, 0xa4,
+ 0xc8, 0x20, 0x09, 0x6e, 0x01, 0xb0, 0xc8, 0x20, 0x09, 0x70, 0x01, 0xb2,
+ 0xc8, 0x20, 0x09, 0x70, 0x06, 0xcc, 0xf8, 0x20, 0xed, 0x70, 0x01, 0x80,
+ 0x06, 0xa0, 0xe1, 0x18, 0x48, 0x20, 0xe0, 0x04, 0x01, 0x80, 0x04, 0xe0,
+ 0x01, 0x9e, 0x02, 0x08, 0x80, 0x12, 0x06, 0xa0, 0xe0, 0x22, 0x07, 0x84,
+ 0x00, 0x0a, 0x07, 0x85, 0x03, 0xf4, 0x88, 0x20, 0x06, 0xc6, 0xe0, 0x20,
+ 0x1b, 0x04, 0x07, 0x84, 0x00, 0x1c, 0x07, 0x85, 0x03, 0xf8, 0x06, 0xa0,
+ 0xe3, 0xce, 0x07, 0x85, 0xe6, 0x42, 0xc8, 0x05, 0x03, 0xf8, 0x23, 0xa0,
+ 0xe0, 0x0c, 0x13, 0x23, 0xe3, 0xa0, 0xe0, 0x0c, 0x2e, 0xa0, 0x03, 0xf4,
+ 0x10, 0x1e, 0x03, 0xb0, 0x98, 0x20, 0xe0, 0x10, 0x06, 0x65, 0x16, 0x19,
+ 0x02, 0x44, 0x5e, 0x00, 0x16, 0x04, 0x06, 0x20, 0x06, 0xc6, 0x16, 0xd7,
+ 0x10, 0x08, 0x03, 0xb0, 0x98, 0x20, 0xe0, 0x10, 0x06, 0x65, 0x16, 0x0d,
+ 0x06, 0x20, 0x06, 0xc8, 0x16, 0xc4, 0x01, 0x0e, 0x00, 0x03, 0x13, 0x03,
+ 0x07, 0x83, 0x82, 0x00, 0x10, 0x02, 0x07, 0x83, 0x00, 0x01, 0x04, 0x60,
+ 0xdb, 0xb8, 0x04, 0x60, 0xdb, 0x9e, 0x01, 0x0e, 0x00, 0x03, 0x13, 0x0a,
+ 0x02, 0x08, 0x80, 0x0c, 0x06, 0xa0, 0xe0, 0x22, 0xe3, 0xe0, 0xe0, 0x14,
+ 0xc8, 0x20, 0xe4, 0x6e, 0x01, 0x86, 0x10, 0x26, 0x48, 0x20, 0xe0, 0x0c,
+ 0x01, 0x82, 0x2e, 0xe0, 0x00, 0x01, 0xc1, 0x60, 0x09, 0x1e, 0x0a, 0x35,
+ 0xe8, 0x05, 0x01, 0x82, 0xc1, 0x20, 0x09, 0x6a, 0x01, 0x04, 0x00, 0x06,
+ 0x13, 0x06, 0xd8, 0x20, 0xe1, 0xd0, 0x09, 0x2f, 0xd8, 0x20, 0xe1, 0xd0,
+ 0x01, 0x83, 0x21, 0x20, 0xe0, 0x22, 0x16, 0x03, 0xe8, 0x20, 0xe0, 0x22,
+ 0x01, 0x80, 0x21, 0x20, 0xe0, 0x04, 0x16, 0x04, 0xe3, 0xa0, 0xe0, 0x14,
+ 0x04, 0x60, 0xdf, 0xb6, 0x02, 0x08, 0x80, 0x00, 0x06, 0xa0, 0xe0, 0x22,
+ 0xe8, 0x20, 0xe0, 0x08, 0x01, 0x82, 0x04, 0x60, 0xdb, 0x9e, 0xc8, 0x20,
+ 0xe4, 0x6e, 0x01, 0x86, 0x02, 0x08, 0x80, 0x00, 0x06, 0xa0, 0xe0, 0x22,
+ 0xc2, 0x20, 0x09, 0x1e, 0xa2, 0x08, 0x05, 0x08, 0xc8, 0x28, 0xe0, 0x22,
+ 0x06, 0xca, 0xc8, 0x20, 0xe0, 0x20, 0x06, 0xc6, 0xc8, 0x20, 0xe0, 0x20,
+ 0x06, 0xc8, 0xe3, 0x60, 0xe0, 0x16, 0x04, 0x60, 0xdb, 0xc0, 0xc1, 0x44,
+ 0x02, 0x44, 0x5e, 0x00, 0x16, 0xf8, 0x25, 0x60, 0xe4, 0x68, 0x16, 0x0f,
+ 0x06, 0x20, 0x06, 0xc6, 0x16, 0xf2, 0x06, 0x20, 0x06, 0xca, 0x13, 0x03,
+ 0x05, 0xa0, 0x06, 0xcc, 0x10, 0xe6, 0x03, 0xb0, 0xd8, 0x20, 0xe0, 0x0c,
+ 0x06, 0x65, 0x04, 0x60, 0xdb, 0xc0, 0x06, 0x20, 0x06, 0xc8, 0x16, 0xe3,
+ 0x88, 0x20, 0x09, 0x70, 0x06, 0xcc, 0x16, 0x03, 0x07, 0x83, 0x00, 0x08,
+ 0x10, 0x02, 0x07, 0x83, 0x00, 0x0c, 0x04, 0x60, 0xdb, 0xb8, 0x04, 0x60,
+ 0xdb, 0xc0, 0x23, 0xa0, 0xe0, 0x08, 0x13, 0x03, 0x23, 0x60, 0xe0, 0x12,
+ 0x16, 0x06, 0x03, 0xb0, 0xd8, 0x20, 0xe3, 0xa9, 0x06, 0x65, 0x04, 0x60,
+ 0xdb, 0xc0, 0x02, 0x08, 0x80, 0x00, 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x60,
+ 0xdb, 0x9e, 0x02, 0x08, 0x80, 0x00, 0x06, 0xa0, 0xe0, 0x22, 0xc8, 0x20,
+ 0xe0, 0x1e, 0x06, 0xc6, 0xc8, 0x20, 0xe0, 0x1e, 0x06, 0xc8, 0xe3, 0x60,
+ 0xe0, 0x10, 0x04, 0x60, 0xdb, 0xc0, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x19,
+ 0xc1, 0x44, 0x02, 0x44, 0x1e, 0x00, 0x16, 0xf5, 0x25, 0x60, 0xe4, 0x68,
+ 0x16, 0x06, 0x06, 0x20, 0x06, 0xc8, 0x16, 0xef, 0x04, 0xc2, 0x04, 0x60,
+ 0xec, 0x20, 0x02, 0x08, 0x80, 0x1e, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x07,
+ 0x06, 0x20, 0x06, 0xc6, 0x16, 0xe4, 0x07, 0x83, 0x00, 0x09, 0x06, 0xa0,
+ 0xdb, 0xb8, 0x04, 0x60, 0xdb, 0x9e, 0x04, 0xce, 0x04, 0xe0, 0x09, 0x2a,
+ 0xd3, 0xe0, 0xe3, 0xaa, 0xc2, 0x8f, 0xc8, 0x20, 0xe4, 0x70, 0x01, 0x86,
+ 0x48, 0x20, 0xe0, 0x08, 0x01, 0x82, 0x07, 0x86, 0x00, 0x05, 0x07, 0x84,
+ 0x06, 0x72, 0xc1, 0x54, 0x13, 0x01, 0x2c, 0xd4, 0x02, 0x24, 0x00, 0x0a,
+ 0x06, 0x06, 0x16, 0xf9, 0x02, 0x08, 0x80, 0x2a, 0x06, 0xa0, 0xe0, 0x22,
+ 0x2c, 0x20, 0xe0, 0x1a, 0x04, 0x60, 0xda, 0x6a, 0x06, 0xa0, 0xe2, 0x72,
+ 0x04, 0xcd, 0x23, 0xa0, 0xe0, 0x1c, 0x13, 0x0d, 0x01, 0x0e, 0x00, 0x03,
+ 0x13, 0x0a, 0xe3, 0xa0, 0xe0, 0x1c, 0x03, 0xb0, 0xd8, 0x20, 0xe0, 0x10,
+ 0x06, 0x65, 0xd2, 0xa0, 0xe0, 0x26, 0x04, 0xcf, 0x10, 0x08, 0x2d, 0x20,
+ 0x00, 0x01, 0xc0, 0xe0, 0x09, 0x2a, 0x06, 0xa0, 0xe3, 0x56, 0xd2, 0xa0,
+ 0xe3, 0xab, 0x04, 0x60, 0xdb, 0xc0, 0x06, 0xa0, 0xe0, 0xe4, 0xc2, 0x08,
+ 0x13, 0x19, 0x07, 0x83, 0x80, 0x80, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x02,
+ 0x07, 0x83, 0x00, 0x0a, 0x04, 0x60, 0xdb, 0xb4, 0xc1, 0x20, 0x06, 0x06,
+ 0x13, 0x0d, 0x06, 0xa0, 0xe0, 0xe4, 0xc2, 0x08, 0x13, 0x09, 0x07, 0x83,
+ 0x00, 0x0b, 0x23, 0xe0, 0xe0, 0x14, 0x16, 0x02, 0x07, 0x83, 0x80, 0x01,
+ 0x04, 0x60, 0xdb, 0xb4, 0x07, 0x83, 0x80, 0x0a, 0x04, 0x60, 0xdb, 0xa2,
+ 0x93, 0xe0, 0xe0, 0x0e, 0x13, 0x5e, 0x93, 0xe0, 0xe0, 0x10, 0x13, 0x17,
+ 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x04, 0x07, 0x83, 0x00, 0x07, 0x04, 0x60,
+ 0xdb, 0xb4, 0x07, 0x83, 0xa0, 0x00, 0x06, 0xa0, 0xe3, 0x56, 0x07, 0x83,
+ 0x48, 0x00, 0x06, 0xa0, 0xe3, 0x56, 0xd2, 0xa0, 0xe0, 0x10, 0xc8, 0x20,
+ 0xe0, 0x1c, 0x06, 0xca, 0xc8, 0x20, 0xe0, 0x20, 0x06, 0xcc, 0x06, 0xa0,
+ 0xe2, 0x72, 0x02, 0x08, 0x80, 0x4e, 0x06, 0xa0, 0xe0, 0x22, 0x23, 0xa0,
+ 0xe0, 0x1c, 0x13, 0x20, 0x88, 0x20, 0x09, 0x6c, 0x07, 0x0e, 0x16, 0x1c,
+ 0x88, 0x20, 0x09, 0x6e, 0x07, 0x10, 0x16, 0x18, 0x88, 0x20, 0x09, 0x70,
+ 0x07, 0x12, 0x16, 0x14, 0x88, 0x20, 0x07, 0x0a, 0xe0, 0x22, 0x13, 0x10,
+ 0x06, 0x20, 0x06, 0xca, 0x16, 0x38, 0xe3, 0xa0, 0xe0, 0x20, 0x10, 0x06,
+ 0x23, 0xe0, 0xe0, 0x14, 0x16, 0xca, 0xe3, 0xa0, 0xe0, 0x22, 0x04, 0xc2,
+ 0xd2, 0xa0, 0xe3, 0xaa, 0x04, 0x60, 0xdb, 0xa8, 0xc8, 0x20, 0xe0, 0x1c,
+ 0x06, 0xca, 0x88, 0xa0, 0x06, 0xdc, 0x00, 0x0e, 0x16, 0x10, 0x88, 0xa0,
+ 0x06, 0xde, 0x00, 0x10, 0x16, 0x0c, 0x88, 0xa0, 0x06, 0xe0, 0x00, 0x12,
+ 0x16, 0x08, 0x06, 0x20, 0x06, 0xcc, 0x16, 0x19, 0xe8, 0x20, 0xe0, 0x0e,
+ 0x01, 0x82, 0xe3, 0xa0, 0xe0, 0x1e, 0xc8, 0x20, 0xe0, 0x20, 0x06, 0xcc,
+ 0x10, 0x10, 0x23, 0xa0, 0xe0, 0x10, 0x16, 0x08, 0xc1, 0x64, 0x00, 0x06,
+ 0x21, 0x60, 0xe0, 0x0c, 0x13, 0x08, 0xd2, 0xa0, 0xe3, 0xa8, 0x10, 0x05,
+ 0x88, 0x20, 0x07, 0x0a, 0x07, 0x08, 0x12, 0x96, 0x10, 0x00, 0x04, 0x60,
+ 0xdb, 0xa8, 0x93, 0xe0, 0xe0, 0x0e, 0x13, 0x50, 0x93, 0xe0, 0xe3, 0xa9,
+ 0x13, 0x4d, 0x93, 0xe0, 0xe3, 0xa8, 0x13, 0x1c, 0x06, 0xa0, 0xe2, 0xd0,
+ 0x23, 0xa0, 0xe0, 0x10, 0x13, 0x45, 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x06,
+ 0xe3, 0x60, 0xe0, 0x1e, 0xc8, 0x20, 0xe0, 0x22, 0x07, 0x06, 0x10, 0x34,
+ 0x23, 0xe0, 0xe0, 0x14, 0x16, 0x31, 0xc1, 0x60, 0x09, 0x6a, 0x21, 0x60,
+ 0xe0, 0x12, 0x16, 0x2c, 0x06, 0xa0, 0xea, 0x34, 0x10, 0x31, 0xd2, 0xa0,
+ 0xe3, 0xa8, 0x10, 0x2e, 0xe3, 0xa0, 0xe0, 0x12, 0x06, 0xa0, 0xea, 0x34,
+ 0xc1, 0x64, 0x00, 0x06, 0x21, 0x60, 0xe0, 0x0c, 0x13, 0x25, 0x88, 0x20,
+ 0x07, 0x0e, 0x06, 0xdc, 0x16, 0x14, 0x88, 0x20, 0x07, 0x10, 0x06, 0xde,
+ 0x16, 0x10, 0x88, 0x20, 0x07, 0x12, 0x06, 0xe0, 0x16, 0x0c, 0x98, 0x20,
+ 0x06, 0xce, 0x06, 0xcf, 0x13, 0x15, 0x06, 0x20, 0x06, 0xce, 0x16, 0x12,
+ 0xe3, 0x60, 0xe0, 0x1a, 0xd2, 0xa0, 0xe0, 0x0c, 0x10, 0x0d, 0xe3, 0x60,
+ 0xe0, 0x1e, 0xc8, 0x20, 0xe0, 0x32, 0x07, 0x06, 0x06, 0xa0, 0xe2, 0x72,
+ 0x02, 0x08, 0x80, 0x48, 0x06, 0xa0, 0xe0, 0x22, 0xd2, 0xa0, 0xe3, 0xa9,
+ 0x04, 0x60, 0xdb, 0xa8, 0x88, 0x22, 0x00, 0x0e, 0x09, 0x6c, 0x1a, 0xc9,
+ 0x1b, 0x0b, 0x88, 0x22, 0x00, 0x10, 0x09, 0x6e, 0x1a, 0xc4, 0x1b, 0x06,
+ 0x88, 0x22, 0x00, 0x12, 0x09, 0x70, 0x1a, 0xbf, 0x1b, 0x01, 0x04, 0x5b,
+ 0xc1, 0x60, 0x01, 0x6c, 0x02, 0x85, 0x00, 0x43, 0x13, 0xe1, 0x93, 0xe0,
+ 0xe3, 0xa8, 0x16, 0xde, 0xc8, 0xa0, 0xed, 0x58, 0x00, 0x02, 0x07, 0x84,
+ 0x00, 0x0e, 0xc1, 0x42, 0xc0, 0xa0, 0x01, 0x6c, 0xc0, 0x02, 0x02, 0x25,
+ 0x00, 0x48, 0x07, 0x81, 0xea, 0x86, 0x07, 0x83, 0xae, 0x14, 0x04, 0x60,
+ 0xed, 0x92, 0x02, 0x02, 0xfc, 0x00, 0x10, 0xca, 0x98, 0x20, 0xe0, 0x0e,
+ 0x06, 0x65, 0x16, 0x03, 0xd8, 0x20, 0xe3, 0xa8, 0x06, 0x65, 0x93, 0xe0,
+ 0xe3, 0xa9, 0x13, 0x0d, 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x19, 0x23, 0xa0,
+ 0xe0, 0x10, 0x13, 0x16, 0xe3, 0x60, 0xe0, 0x1e, 0xc8, 0x20, 0xe0, 0x20,
+ 0x07, 0x06, 0x06, 0xa0, 0xe2, 0x72, 0x43, 0xa0, 0xe0, 0x18, 0x2e, 0xe0,
+ 0x00, 0x01, 0xd2, 0xa0, 0xe0, 0x26, 0x07, 0x83, 0x00, 0x10, 0x06, 0xa0,
+ 0xe3, 0x56, 0x23, 0xe0, 0xe0, 0x14, 0x16, 0x02, 0x06, 0xa0, 0xe2, 0x54,
+ 0x43, 0xa0, 0xe0, 0x2c, 0xc8, 0x20, 0xe0, 0x20, 0x09, 0x24, 0x04, 0x60,
+ 0xdb, 0xa8, 0x43, 0xa0, 0xe0, 0x0e, 0xc1, 0xa0, 0x09, 0x24, 0x13, 0x02,
+ 0x06, 0x20, 0x09, 0x24, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x03, 0x23, 0xa0,
+ 0xe0, 0x08, 0x16, 0x26, 0x02, 0x08, 0x80, 0x42, 0x06, 0xa0, 0xe0, 0x22,
+ 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x1f, 0x23, 0xa0, 0xe0, 0x10, 0x16, 0x0a,
+ 0xc1, 0x22, 0x00, 0x02, 0x25, 0x20, 0xe4, 0x68, 0x16, 0x23, 0x07, 0x83,
+ 0x80, 0x20, 0x06, 0xa0, 0xe3, 0x56, 0x10, 0x12, 0x06, 0xa0, 0xe2, 0x72,
+ 0x23, 0xe0, 0xe0, 0x14, 0x16, 0x02, 0x06, 0xa0, 0xe2, 0x54, 0xe3, 0x60,
+ 0xe0, 0x1e, 0xc8, 0x20, 0xe0, 0x20, 0x07, 0x06, 0x23, 0xa0, 0xe0, 0x08,
+ 0x16, 0x03, 0x23, 0xa0, 0xe0, 0x06, 0x13, 0x51, 0x98, 0x20, 0xe0, 0x0e,
+ 0x06, 0x65, 0x16, 0x03, 0xd8, 0x20, 0xe3, 0xa8, 0x06, 0x65, 0xc1, 0x22,
+ 0x00, 0x02, 0x25, 0x20, 0xe4, 0x68, 0x13, 0x0e, 0x07, 0x83, 0x00, 0x20,
+ 0x06, 0xa0, 0xe3, 0x56, 0xc8, 0x22, 0x00, 0x0e, 0x06, 0xe6, 0xc8, 0x22,
+ 0x00, 0x10, 0x06, 0xe8, 0xc8, 0x22, 0x00, 0x12, 0x06, 0xea, 0x10, 0x37,
+ 0x88, 0x22, 0x00, 0x0e, 0x06, 0xdc, 0x16, 0x08, 0x88, 0x22, 0x00, 0x10,
+ 0x06, 0xde, 0x16, 0x04, 0x88, 0x22, 0x00, 0x12, 0x06, 0xe0, 0x13, 0x0b,
+ 0xc8, 0x22, 0x00, 0x0e, 0x06, 0xdc, 0xc8, 0x22, 0x00, 0x10, 0x06, 0xde,
+ 0xc8, 0x22, 0x00, 0x12, 0x06, 0xe0, 0xe3, 0x60, 0xe0, 0x14, 0x23, 0xa0,
+ 0xe0, 0x0e, 0x16, 0x08, 0xc1, 0xa0, 0x09, 0x24, 0x16, 0x1a, 0x07, 0x86,
+ 0x10, 0x00, 0xe8, 0x06, 0x06, 0xd2, 0x10, 0x15, 0xe3, 0xa0, 0xe0, 0x0e,
+ 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x09, 0xe3, 0xa0, 0xe0, 0x06, 0x04, 0xe0,
+ 0x06, 0xe6, 0x04, 0xe0, 0x06, 0xe8, 0x04, 0xe0, 0x06, 0xea, 0x10, 0x07,
+ 0x02, 0x08, 0x80, 0x36, 0x07, 0xa0, 0x06, 0xd6, 0xdf, 0xe2, 0x06, 0xa0,
+ 0xe0, 0x22, 0x04, 0x60, 0xdb, 0xa8, 0x98, 0x20, 0x06, 0x65, 0xe0, 0x10,
+ 0x16, 0x03, 0xd8, 0x20, 0xe0, 0x0e, 0x06, 0x65, 0x04, 0x60, 0xdb, 0xa8,
+ 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x02, 0x04, 0x60, 0xdb, 0xa8, 0x10, 0x2e,
+ 0x03, 0xb0, 0x98, 0x20, 0xe3, 0xa9, 0x06, 0x6f, 0x16, 0x19, 0xc2, 0x24,
+ 0x00, 0x08, 0x11, 0x16, 0xe3, 0xe0, 0xe0, 0x14, 0x07, 0x83, 0x00, 0x00,
+ 0x06, 0xa0, 0xe3, 0x56, 0x23, 0xa0, 0xe0, 0x14, 0x13, 0x04, 0x02, 0x08,
+ 0x80, 0x06, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, 0x00, 0x1e, 0x06, 0xa0,
+ 0xe0, 0x22, 0x23, 0xa0, 0xe0, 0x08, 0x13, 0x02, 0x06, 0xa0, 0xe2, 0x54,
+ 0xc0, 0x82, 0x16, 0x02, 0x04, 0x60, 0xdb, 0xc0, 0xe8, 0x20, 0xed, 0x74,
+ 0x06, 0xf0, 0x99, 0x20, 0xe0, 0x0e, 0x00, 0x16, 0x16, 0x05, 0x04, 0xe0,
+ 0x06, 0xec, 0x48, 0x20, 0xe0, 0x14, 0x06, 0xf0, 0x07, 0x83, 0x00, 0x01,
+ 0x04, 0x60, 0xdb, 0xa2, 0xc2, 0x64, 0x00, 0x14, 0x02, 0x24, 0x00, 0x18,
+ 0xc1, 0xc4, 0x61, 0xc2, 0x02, 0x27, 0xff, 0xfc, 0xc1, 0x74, 0xc1, 0x85,
+ 0x71, 0x45, 0x02, 0x85, 0x00, 0x27, 0x16, 0x46, 0xc1, 0x54, 0x02, 0x45,
+ 0xff, 0xcf, 0x16, 0x42, 0x04, 0xc8, 0xc1, 0x64, 0x00, 0x08, 0x15, 0x06,
+ 0x13, 0x05, 0xc2, 0x24, 0x00, 0x0e, 0x02, 0x48, 0x1f, 0x00, 0x06, 0xc8,
+ 0x02, 0x28, 0x00, 0x11, 0xa2, 0x04, 0x98, 0x18, 0xed, 0x79, 0x16, 0x32,
+ 0xc1, 0x42, 0x02, 0x25, 0x00, 0x04, 0x65, 0x47, 0xc2, 0x35, 0xcd, 0x74,
+ 0x06, 0x48, 0x15, 0xfd, 0xc0, 0xa0, 0x01, 0x6c, 0xc1, 0x02, 0xc8, 0x04,
+ 0x01, 0x6c, 0xc1, 0xa0, 0xfc, 0x00, 0x13, 0x05, 0xc8, 0x20, 0xeb, 0x10,
+ 0xfc, 0x02, 0xc1, 0x06, 0x10, 0xf6, 0xc8, 0x02, 0x01, 0x6c, 0xc8, 0x20,
+ 0xed, 0x58, 0xfc, 0x02, 0x07, 0x81, 0xec, 0xfc, 0xc0, 0x04, 0x07, 0x83,
+ 0x02, 0x10, 0x07, 0x84, 0x00, 0x0e, 0x10, 0x3b, 0x07, 0x84, 0x00, 0x0c,
+ 0xc0, 0xe2, 0x00, 0x08, 0x02, 0x05, 0xfc, 0x00, 0xc0, 0xa0, 0x01, 0x6c,
+ 0xc0, 0x02, 0xc1, 0xa0, 0xfc, 0x00, 0x13, 0x2f, 0x04, 0xe0, 0xfc, 0x00,
+ 0x2e, 0x16, 0x10, 0x2b, 0xc8, 0xa0, 0xed, 0x7a, 0x00, 0x0e, 0xc8, 0xa0,
+ 0xed, 0x7c, 0x00, 0x10, 0xc8, 0xa0, 0xed, 0x7e, 0x00, 0x12, 0x07, 0x83,
+ 0x80, 0x06, 0x04, 0x60, 0xdb, 0xa2, 0x04, 0x60, 0xdb, 0xc0, 0x07, 0x84,
+ 0x00, 0x10, 0x07, 0x85, 0x00, 0x34, 0x10, 0x09, 0x07, 0x84, 0x00, 0x12,
+ 0x07, 0x85, 0x00, 0x32, 0x10, 0x04, 0x07, 0x84, 0x00, 0x14, 0x07, 0x85,
+ 0x00, 0x38, 0x06, 0xa0, 0xe1, 0x0a, 0xc8, 0x85, 0x00, 0x04, 0x06, 0xa0,
+ 0xe1, 0x4c, 0xc8, 0xa0, 0xed, 0x58, 0x00, 0x02, 0xc0, 0xa0, 0x01, 0x6c,
+ 0xc0, 0x02, 0x06, 0x48, 0xc1, 0x48, 0x06, 0xa0, 0xe3, 0xce, 0x02, 0x07,
+ 0x06, 0xa2, 0xc5, 0x60, 0xfc, 0x02, 0x02, 0x25, 0xff, 0xf4, 0xc8, 0x05,
+ 0xfc, 0x02, 0xc2, 0x20, 0x01, 0x6c, 0x06, 0xa0, 0xc2, 0x5a, 0x04, 0x60,
+ 0xdb, 0x9e, 0x06, 0xa0, 0xe3, 0xce, 0x02, 0x07, 0x06, 0xb4, 0x10, 0xef,
+ 0xc3, 0x0b, 0x03, 0x00, 0x00, 0x02, 0x07, 0x82, 0x00, 0xc0, 0xc8, 0x20,
+ 0x00, 0x0c, 0x00, 0xc0, 0xc8, 0x20, 0x00, 0x0e, 0x00, 0xc2, 0xc8, 0x20,
+ 0x00, 0x10, 0x00, 0xc4, 0xc8, 0x20, 0x00, 0x12, 0x00, 0xc6, 0xc8, 0x20,
+ 0x00, 0x14, 0x00, 0xc8, 0xc8, 0x20, 0x00, 0x16, 0x00, 0xca, 0xc8, 0x20,
+ 0x00, 0x04, 0x00, 0xcc, 0xc8, 0x20, 0x00, 0x06, 0x00, 0xce, 0xc8, 0x02,
+ 0x00, 0x0c, 0x07, 0xa0, 0x00, 0x0e, 0xee, 0x3c, 0xc8, 0x02, 0x00, 0x10,
+ 0x07, 0xa0, 0x00, 0x12, 0xee, 0x46, 0xc8, 0x02, 0x00, 0x14, 0x07, 0xa0,
+ 0x00, 0x16, 0xee, 0x76, 0xc8, 0x02, 0x00, 0x04, 0x07, 0xa0, 0x00, 0x06,
+ 0xee, 0x8c, 0x01, 0x60, 0x01, 0x1c, 0x00, 0x04, 0x16, 0x09, 0x01, 0xe0,
+ 0x01, 0x40, 0x08, 0x00, 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, 0x01, 0xe0,
+ 0x01, 0x40, 0x04, 0x00, 0x06, 0xa0, 0xf1, 0x4c, 0x02, 0x05, 0x80, 0x00,
+ 0xd8, 0x05, 0x04, 0x80, 0x04, 0xc7, 0x03, 0x00, 0x00, 0x0f, 0x07, 0x88,
+ 0x10, 0x00, 0x02, 0x09, 0x20, 0x00, 0x07, 0x8a, 0xee, 0xa4, 0x02, 0x03,
+ 0xe5, 0xfe, 0x04, 0x5a, 0x03, 0x00, 0x00, 0x00, 0xd2, 0x20, 0x01, 0x87,
+ 0x10, 0x06, 0x03, 0x00, 0x00, 0x00, 0xc2, 0x20, 0x01, 0x8a, 0x02, 0x08,
+ 0x1a, 0x00, 0xc2, 0x60, 0x00, 0xae, 0xda, 0x48, 0x04, 0x80, 0x05, 0x89,
+ 0x02, 0x89, 0x00, 0x06, 0x15, 0x07, 0x07, 0x88, 0x80, 0x00, 0xda, 0x48,
+ 0x04, 0x80, 0xc8, 0x09, 0x00, 0xae, 0x03, 0x80, 0x02, 0xe0, 0x00, 0xa0,
+ 0x04, 0x5c, 0x03, 0x00, 0x00, 0x00, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x20,
+ 0x13, 0xe2, 0xc2, 0x20, 0x01, 0x8c, 0x02, 0x08, 0x1c, 0x00, 0x10, 0xe3,
+ 0x03, 0x00, 0x00, 0x00, 0x01, 0x60, 0x01, 0x40, 0x40, 0x00, 0x16, 0xec,
+ 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, 0x02, 0x08, 0x02, 0x00, 0x10, 0xd7,
+ 0xc0, 0xb3, 0x06, 0x92, 0x10, 0xfd, 0xc0, 0xb3, 0xc0, 0x48, 0xcc, 0x72,
+ 0xcc, 0x72, 0xc1, 0x32, 0xcc, 0x44, 0xdc, 0x72, 0x06, 0x04, 0x16, 0xfd,
+ 0x04, 0x5b, 0xc0, 0x48, 0x02, 0x02, 0xe9, 0x90, 0x07, 0x84, 0x00, 0x06,
+ 0x10, 0xf6, 0x02, 0x02, 0xe5, 0xde, 0xc0, 0x49, 0x07, 0x84, 0x00, 0x06,
+ 0x10, 0xf0, 0xc0, 0xb3, 0xc1, 0x32, 0x02, 0x01, 0x00, 0x01, 0xd0, 0x44,
+ 0x06, 0xc1, 0x02, 0x44, 0x00, 0xff, 0x10, 0xe7, 0xc1, 0x33, 0xc0, 0x73,
+ 0xd1, 0x44, 0x02, 0x44, 0x00, 0xff, 0xdc, 0x45, 0x06, 0x04, 0x16, 0xfd,
+ 0x04, 0x5a, 0x06, 0xa0, 0xf0, 0xcc, 0xc8, 0x33, 0x01, 0x9e, 0x04, 0x5a,
+ 0x06, 0xa0, 0xee, 0xca, 0xc1, 0x89, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40,
+ 0xc8, 0x06, 0x01, 0x8a, 0xc1, 0x88, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40,
+ 0xc8, 0x06, 0x01, 0x8c, 0x04, 0xc2, 0xc1, 0xc7, 0x16, 0x03, 0x06, 0x02,
+ 0x16, 0xfc, 0x10, 0x4d, 0x04, 0x5a, 0x06, 0xa0, 0xf0, 0x16, 0xc1, 0x89,
+ 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40, 0xc8, 0x06, 0x01, 0x8a, 0xc1, 0x88,
+ 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40, 0xc8, 0x06, 0x01, 0x8c, 0xc8, 0x33,
+ 0x01, 0x9e, 0x10, 0xe8, 0x8a, 0x33, 0x00, 0x02, 0x16, 0x38, 0x8a, 0x73,
+ 0x00, 0x02, 0x16, 0x35, 0x04, 0x5a, 0x8a, 0x20, 0xe9, 0x8a, 0x00, 0x02,
+ 0x16, 0x30, 0x8a, 0x60, 0xe9, 0x8e, 0x00, 0x02, 0x16, 0x2c, 0x07, 0x82,
+ 0xea, 0x34, 0x10, 0x01, 0xc0, 0xb3, 0x02, 0x04, 0x04, 0x80, 0xd1, 0x52,
+ 0x13, 0x03, 0x9d, 0x32, 0x16, 0x22, 0x10, 0xfb, 0x07, 0x85, 0x80, 0x00,
+ 0xd8, 0x05, 0x04, 0x80, 0x04, 0xc7, 0x04, 0x5a, 0xc8, 0x20, 0x00, 0xc0,
+ 0x00, 0x0c, 0xc8, 0x20, 0x00, 0xc2, 0x00, 0x0e, 0xc8, 0x20, 0x00, 0xc4,
+ 0x00, 0x10, 0xc8, 0x20, 0x00, 0xc6, 0x00, 0x12, 0xc8, 0x20, 0x00, 0xc8,
+ 0x00, 0x14, 0xc8, 0x20, 0x00, 0xca, 0x00, 0x16, 0xc8, 0x20, 0x00, 0xcc,
+ 0x00, 0x04, 0xc8, 0x20, 0x00, 0xce, 0x00, 0x06, 0x03, 0x00, 0x00, 0x0f,
+ 0x05, 0xcc, 0x04, 0x5c, 0x04, 0xe0, 0x01, 0x82, 0x02, 0x02, 0xe5, 0xd8,
+ 0xc8, 0x32, 0x01, 0x82, 0xc8, 0x32, 0x01, 0x80, 0x06, 0xa0, 0xef, 0xe2,
+ 0xc8, 0x12, 0x01, 0x82, 0xc2, 0xca, 0x07, 0x84, 0x07, 0xd0, 0x04, 0xe0,
+ 0x01, 0x84, 0x06, 0x04, 0x16, 0xfc, 0xc1, 0x20, 0x01, 0x84, 0x16, 0xe9,
+ 0x02, 0x04, 0x00, 0x32, 0x07, 0x85, 0x80, 0x00, 0xd8, 0x05, 0x04, 0x80,
+ 0x04, 0xc7, 0xc1, 0x60, 0x01, 0x86, 0x06, 0x04, 0x16, 0xfc, 0xc1, 0x20,
+ 0x01, 0x84, 0x04, 0x5b, 0xc0, 0xb3, 0xc4, 0xb3, 0x04, 0x5b, 0xc0, 0x48,
+ 0xc0, 0xb3, 0xa0, 0x73, 0xc4, 0x42, 0x04, 0x5b, 0x88, 0x33, 0x01, 0x84,
+ 0x16, 0xe6, 0x04, 0x5a, 0xc1, 0x89, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40,
+ 0xc8, 0x06, 0x01, 0x8a, 0x04, 0x5b, 0x04, 0xc5, 0x07, 0xa0, 0x01, 0x9c,
+ 0x00, 0x40, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40, 0x13, 0x03, 0x06, 0x05,
+ 0x16, 0xf7, 0x04, 0x5c, 0x04, 0x5b, 0x06, 0xa0, 0xf0, 0x6a, 0xc0, 0x60,
+ 0x01, 0x40, 0xc8, 0x05, 0x01, 0x40, 0xc5, 0x02, 0xc8, 0x01, 0x01, 0x40,
+ 0x04, 0x5a, 0x06, 0xa0, 0xf0, 0x6a, 0xa1, 0x08, 0x10, 0xf4, 0xc0, 0xb3,
+ 0xc1, 0x33, 0xc1, 0x60, 0x01, 0x40, 0x01, 0x85, 0x04, 0x00, 0x01, 0xc5,
+ 0x10, 0x00, 0x04, 0x5b, 0xc1, 0x08, 0xc2, 0x09, 0xc2, 0x44, 0x04, 0x5b,
+ 0x02, 0x05, 0x00, 0xc8, 0x06, 0x05, 0x16, 0xfe, 0x04, 0x5b, 0xc1, 0x33,
+ 0xc0, 0x03, 0xc0, 0xc4, 0x04, 0x5b, 0xc0, 0xc0, 0x04, 0x5b, 0x94, 0xe0,
+ 0x01, 0x9e, 0x16, 0xc2, 0x05, 0xc3, 0x04, 0x5b, 0xc0, 0x73, 0x06, 0xa0,
+ 0xf0, 0xe4, 0x02, 0x2d, 0x00, 0x08, 0x07, 0x85, 0x00, 0x08, 0x9f, 0x71,
+ 0x16, 0xb7, 0x06, 0x05, 0x16, 0xfc, 0x04, 0x5a, 0x02, 0x02, 0xe5, 0xe4,
+ 0x04, 0x60, 0xee, 0xce, 0x8c, 0xe9, 0x00, 0x04, 0x16, 0xad, 0x04, 0x5b,
+ 0xc1, 0x20, 0x01, 0x80, 0x07, 0x85, 0x07, 0xd0, 0x01, 0xe0, 0x01, 0x80,
+ 0x04, 0x00, 0x06, 0x45, 0x16, 0xfe, 0xc8, 0x04, 0x01, 0x80, 0x04, 0x5b,
+ 0xc1, 0x33, 0xc3, 0x48, 0xc1, 0x04, 0x13, 0x04, 0x02, 0x2d, 0x04, 0x00,
+ 0x06, 0x04, 0x16, 0xfc, 0x04, 0x5b, 0xc3, 0x8d, 0x06, 0xa0, 0xf0, 0xe4,
+ 0xc1, 0x8d, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40, 0xc7, 0x86, 0x04, 0x5a,
+ 0xc1, 0x8d, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40, 0xc8, 0x06, 0x01, 0x8a,
+ 0x04, 0x5b, 0xc1, 0x8d, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40, 0xc8, 0x06,
+ 0x01, 0x8c, 0x04, 0x5b, 0xc0, 0x4d, 0x02, 0x04, 0x00, 0x28, 0x07, 0x85,
+ 0x55, 0x00, 0x04, 0x60, 0xee, 0xf2, 0xc0, 0x4d, 0xc0, 0xb3, 0xc1, 0x32,
+ 0x04, 0x60, 0xee, 0xb6, 0xc1, 0x33, 0x01, 0x60, 0x01, 0x1c, 0x00, 0x04,
+ 0x16, 0x01, 0x04, 0x5b, 0xc0, 0xc4, 0x04, 0x5b, 0x07, 0x89, 0xe5, 0x26,
+ 0xc2, 0x39, 0x13, 0x07, 0xc6, 0x39, 0x86, 0x39, 0x16, 0x25, 0xc6, 0x39,
+ 0x86, 0x39, 0x16, 0x22, 0x10, 0xf7, 0x02, 0x02, 0xf1, 0x6a, 0x04, 0xc4,
+ 0x04, 0xc5, 0xc2, 0x39, 0x13, 0x02, 0x04, 0x60, 0xf1, 0xa6, 0x02, 0x02,
+ 0xf1, 0x78, 0x04, 0xc4, 0xc2, 0x39, 0x13, 0x03, 0xc1, 0x79, 0x04, 0x60,
+ 0xf1, 0xa6, 0x02, 0x02, 0xf1, 0x88, 0x04, 0xc5, 0xc2, 0x39, 0x13, 0x03,
+ 0xc1, 0x39, 0x04, 0x60, 0xf1, 0xa6, 0xc0, 0x79, 0xc0, 0xb9, 0x60, 0x81,
+ 0x05, 0xc2, 0x09, 0x12, 0x04, 0xf1, 0x06, 0x02, 0x16, 0xfd, 0x04, 0x5b,
+ 0x04, 0x5c, 0x02, 0x01, 0xaa, 0xaa, 0xc6, 0x01, 0xe0, 0x44, 0x40, 0x45,
+ 0x80, 0x58, 0x16, 0xf8, 0x02, 0x01, 0x00, 0x14, 0x06, 0x01, 0x16, 0xfe,
+ 0x02, 0x01, 0x55, 0x55, 0xc6, 0x01, 0xe0, 0x44, 0x40, 0x45, 0x80, 0x58,
+ 0x16, 0xed, 0x04, 0x52, 0x02, 0xe0, 0x00, 0xa0, 0x07, 0x88, 0x00, 0xc0,
+ 0x02, 0x09, 0xf2, 0x20, 0x07, 0x84, 0xe5, 0xea, 0x02, 0x05, 0x00, 0x01,
+ 0xc2, 0x8b, 0x04, 0xcc, 0x06, 0xa0, 0xf2, 0x2a, 0x2c, 0x60, 0x00, 0x01,
+ 0x06, 0x99, 0x2c, 0xa0, 0x00, 0x02, 0x06, 0x99, 0x2d, 0x20, 0x00, 0x04,
+ 0x06, 0x99, 0x2e, 0x20, 0x00, 0x08, 0x06, 0x99, 0x2f, 0xa0, 0x00, 0x10,
+ 0x05, 0x8c, 0x16, 0x09, 0xcc, 0x80, 0xc4, 0x81, 0x07, 0x83, 0xf2, 0x6e,
+ 0xc0, 0x88, 0x04, 0x02, 0x05, 0x8c, 0x16, 0x01, 0x10, 0x33, 0x02, 0xe0,
+ 0x00, 0xa0, 0x04, 0x5a, 0x05, 0x8c, 0x16, 0xfb, 0xcc, 0x80, 0xc4, 0x81,
+ 0x0a, 0x15, 0xc0, 0xb4, 0xc0, 0x12, 0xcc, 0x88, 0xc0, 0x52, 0xc4, 0xb4,
+ 0x06, 0x42, 0x04, 0x5b, 0x07, 0x2d, 0x00, 0x18, 0x8b, 0x41, 0x00, 0x0a,
+ 0x16, 0xec, 0x82, 0xc1, 0x16, 0xea, 0x02, 0xc2, 0x02, 0x42, 0x02, 0x00,
+ 0x16, 0xe6, 0x03, 0x80, 0x07, 0x81, 0x00, 0x01, 0x10, 0xf1, 0x02, 0x01,
+ 0x00, 0x02, 0x10, 0xee, 0x02, 0x01, 0x00, 0x04, 0x10, 0xeb, 0x02, 0x01,
+ 0x00, 0x08, 0x10, 0xe8, 0x02, 0x01, 0x00, 0x10, 0x10, 0xe5, 0x02, 0xa1,
+ 0x8b, 0x41, 0x00, 0x10, 0x13, 0x02, 0x04, 0x60, 0xf2, 0x1a, 0x07, 0x2d,
+ 0x00, 0x18, 0x03, 0x80, 0x02, 0x09, 0x08, 0x00, 0x02, 0x03, 0x00, 0x04,
+ 0x04, 0xc7, 0x06, 0xa0, 0xf3, 0x9a, 0x01, 0x60, 0x01, 0x1c, 0x00, 0x04,
+ 0x16, 0x1c, 0x01, 0xa0, 0x01, 0x40, 0x08, 0x00, 0x01, 0xe0, 0x01, 0x40,
+ 0x10, 0x00, 0x02, 0x04, 0x00, 0x01, 0xce, 0x44, 0x06, 0xc4, 0xc6, 0x44,
+ 0x01, 0xa0, 0x01, 0x40, 0x10, 0x00, 0x06, 0x49, 0x01, 0xa0, 0x01, 0x40,
+ 0x40, 0x00, 0x01, 0xe0, 0x01, 0x40, 0x04, 0x00, 0x01, 0xe0, 0x01, 0x40,
+ 0x08, 0x00, 0x06, 0xa0, 0xf4, 0x38, 0x06, 0xa0, 0xf4, 0x38, 0x05, 0xc7,
+ 0x02, 0x04, 0xe4, 0xa4, 0x04, 0xe0, 0x03, 0xd0, 0xc1, 0x74, 0xc1, 0xb4,
+ 0x05, 0x86, 0x13, 0x1c, 0x02, 0xe0, 0x00, 0xc0, 0x02, 0x00, 0x00, 0x00,
+ 0xc0, 0x40, 0xc0, 0x80, 0xc0, 0xc0, 0xc1, 0x00, 0xc1, 0x40, 0xc1, 0x80,
+ 0xc1, 0xc0, 0xc2, 0x00, 0xc2, 0x40, 0xc2, 0x80, 0xc2, 0xc0, 0xc3, 0x00,
+ 0xc3, 0x40, 0xc3, 0x80, 0xc3, 0xc0, 0x04, 0xa0, 0x00, 0xaa, 0x03, 0xd0,
+ 0x03, 0xd0, 0x10, 0x3f, 0x05, 0x85, 0x81, 0x85, 0x13, 0xe1, 0x10, 0xe4,
+ 0x05, 0xc7, 0x02, 0x05, 0x7f, 0xff, 0xa1, 0x45, 0x03, 0xd0, 0x03, 0xd0,
+ 0x10, 0x34, 0xcc, 0xc0, 0xc4, 0xc1, 0x02, 0x03, 0x00, 0x28, 0x06, 0xa0,
+ 0xf3, 0x9a, 0x01, 0xe0, 0x01, 0x42, 0x10, 0x00, 0x05, 0xc7, 0x03, 0xd0,
+ 0x03, 0xd0, 0x10, 0x27, 0x05, 0xc7, 0xc1, 0xa0, 0x01, 0x4a, 0x07, 0xa0,
+ 0x01, 0x4a, 0x0e, 0x00, 0x01, 0xa0, 0x01, 0x40, 0x02, 0x00, 0x07, 0x20,
+ 0x01, 0x44, 0xc1, 0x60, 0x01, 0x44, 0x02, 0x85, 0xff, 0x00, 0x16, 0x17,
+ 0x01, 0xe0, 0x01, 0x40, 0x22, 0x00, 0x02, 0x05, 0x00, 0xc0, 0x06, 0x05,
+ 0x03, 0xd0, 0x16, 0xfd, 0xc1, 0x60, 0x01, 0x46, 0x02, 0x85, 0xff, 0x00,
+ 0x13, 0x0a, 0x02, 0x05, 0x33, 0x93, 0x06, 0x05, 0x00, 0x00, 0xf3, 0x80,
+ 0x00, 0x0b, 0x10, 0x00, 0x00, 0x00, 0xf3, 0x8a, 0x04, 0x9c, 0x03, 0xd0,
+ 0x16, 0xf8, 0x10, 0x51, 0xc8, 0x06, 0x01, 0x4a, 0xcc, 0xc0, 0xc4, 0xc1,
+ 0x10, 0x4b, 0xc0, 0x13, 0xcc, 0xc8, 0xc0, 0x53, 0x02, 0x02, 0xf3, 0xaa,
+ 0xc4, 0xc2, 0x06, 0x43, 0x04, 0x5b, 0xc0, 0x60, 0x00, 0xae, 0x02, 0xc4,
+ 0x02, 0x44, 0x00, 0x0f, 0x88, 0x44, 0xe4, 0x8a, 0x16, 0x3c, 0x02, 0x81,
+ 0x00, 0x08, 0x13, 0x27, 0xc1, 0x21, 0xe4, 0x9c, 0xc1, 0x14, 0x21, 0x21,
+ 0xe4, 0x7a, 0x16, 0x33, 0xc1, 0x21, 0xe4, 0x82, 0x02, 0x81, 0x00, 0x00,
+ 0x13, 0x0b, 0x02, 0x0d, 0x00, 0xa0, 0x83, 0x84, 0x13, 0x09, 0x05, 0xc4,
+ 0x83, 0x84, 0x13, 0x06, 0x05, 0xc4, 0x83, 0x84, 0x13, 0x03, 0x10, 0x23,
+ 0x81, 0x0e, 0x16, 0x21, 0xc1, 0x21, 0xe4, 0x9c, 0x45, 0x21, 0xe4, 0x7a,
+ 0x01, 0xe0, 0x01, 0x42, 0x10, 0x00, 0x01, 0xa0, 0x01, 0x42, 0x10, 0x00,
+ 0xc3, 0xa1, 0xe4, 0x94, 0x02, 0x0f, 0x00, 0x2f, 0x03, 0x80, 0x01, 0xa0,
+ 0x01, 0x40, 0x02, 0x00, 0x01, 0xa0, 0x01, 0x40, 0x80, 0x00, 0xc0, 0x6d,
+ 0x00, 0x0a, 0x13, 0x09, 0x02, 0x81, 0x12, 0x5c, 0x1b, 0x06, 0x02, 0x0e,
+ 0xf3, 0x90, 0x02, 0x0f, 0x00, 0x0f, 0x03, 0x80, 0x05, 0xca, 0x02, 0xe0,
+ 0x00, 0xa0, 0x04, 0x5a, 0xce, 0x59, 0x88, 0x20, 0xe4, 0xa4, 0xe4, 0xa4,
+ 0x10, 0xf8, 0x04, 0xc1, 0x62, 0x48, 0x05, 0x89, 0xc0, 0xa0, 0x01, 0x6c,
+ 0xc8, 0x08, 0x01, 0x6c, 0x02, 0x03, 0xfc, 0x00, 0x02, 0x04, 0x02, 0x00,
+ 0xa0, 0x73, 0x06, 0x04, 0x16, 0xfd, 0x05, 0x88, 0x06, 0x09, 0x16, 0xf4,
+ 0xc8, 0x02, 0x01, 0x6c, 0x86, 0x81, 0x16, 0x02, 0x03, 0xd0, 0x05, 0xcb,
+ 0x04, 0x5b, 0xc0, 0x48, 0xc0, 0x89, 0x60, 0x81, 0x05, 0xc2, 0x04, 0x5b,
+ 0xc3, 0x0b, 0x06, 0xa0, 0xf4, 0x72, 0xcc, 0x41, 0x06, 0x42, 0x16, 0xfd,
+ 0x06, 0xa0, 0xf4, 0x72, 0xc1, 0x01, 0x8c, 0x44, 0x16, 0x12, 0x05, 0xc4,
+ 0x06, 0x42, 0x16, 0xfb, 0x02, 0x04, 0xf4, 0xb8, 0x02, 0x03, 0x01, 0x01,
+ 0x06, 0x94, 0x02, 0x03, 0x5a, 0x5a, 0x06, 0x94, 0x05, 0x43, 0x06, 0x94,
+ 0x07, 0x03, 0x06, 0x94, 0x04, 0xc3, 0x06, 0x94, 0x05, 0xcc, 0x04, 0x5c,
+ 0xc1, 0xcb, 0x06, 0xa0, 0xf4, 0x72, 0xcc, 0x43, 0x06, 0x42, 0x16, 0xfd,
+ 0x06, 0xa0, 0xf4, 0x72, 0x8c, 0x43, 0x16, 0xf5, 0x06, 0x42, 0x16, 0xfc,
+ 0x04, 0x57, 0xc2, 0x8b, 0xc0, 0x08, 0xc1, 0x49, 0x05, 0x85, 0x02, 0x80,
+ 0x00, 0x40, 0x11, 0x03, 0x02, 0x80, 0x00, 0x4f, 0x12, 0x45, 0x02, 0x01,
+ 0xf4, 0x72, 0x09, 0xa1, 0x80, 0x01, 0x13, 0x40, 0x02, 0x01, 0xf5, 0xa2,
+ 0x09, 0xa1, 0x80, 0x01, 0x13, 0x3b, 0xc0, 0x60, 0x00, 0x06, 0x09, 0xa1,
+ 0x80, 0x01, 0x13, 0x36, 0x05, 0x81, 0x80, 0x01, 0x13, 0x33, 0xc0, 0x4a,
+ 0x09, 0xa1, 0x80, 0x01, 0x13, 0x2f, 0xc8, 0x00, 0x01, 0x6a, 0x02, 0x80,
+ 0x00, 0x80, 0x14, 0x17, 0x02, 0x01, 0xf8, 0x00, 0xc1, 0xa0, 0x01, 0x40,
+ 0x01, 0xa0, 0x01, 0x40, 0x04, 0x00, 0x02, 0x02, 0x10, 0x00, 0x02, 0x03,
+ 0x04, 0x00, 0xcc, 0xb1, 0x06, 0x43, 0x16, 0xfd, 0x01, 0xa0, 0x01, 0x40,
+ 0x40, 0x00, 0x02, 0x08, 0xf8, 0x10, 0xc8, 0x06, 0x01, 0x40, 0xc0, 0x00,
+ 0x13, 0x02, 0x02, 0x08, 0xf8, 0x00, 0x02, 0x09, 0xfb, 0xfe, 0x06, 0xa0,
+ 0xf4, 0x7c, 0x10, 0x25, 0x02, 0x80, 0x00, 0x80, 0x14, 0x09, 0x02, 0x01,
+ 0xf8, 0x00, 0x02, 0x02, 0x10, 0x00, 0x02, 0x03, 0x04, 0x00, 0xcc, 0x72,
+ 0x06, 0x43, 0x16, 0xfd, 0x05, 0x80, 0x02, 0x80, 0x00, 0x80, 0x12, 0x04,
+ 0x01, 0x60, 0x01, 0x04, 0x00, 0x20, 0x13, 0x05, 0x81, 0x40, 0x16, 0xab,
+ 0x02, 0x80, 0x00, 0x80, 0x14, 0x0b, 0x07, 0xa0, 0x01, 0x6a, 0x00, 0x7e,
+ 0x02, 0x02, 0x10, 0x00, 0x02, 0x03, 0x04, 0x00, 0x04, 0xc1, 0xcc, 0x81,
+ 0x06, 0x43, 0x16, 0xfd, 0x05, 0xca, 0x04, 0x5a, 0x02, 0x00, 0xf5, 0x94,
+ 0x02, 0x01, 0xf6, 0xc4, 0x02, 0x40, 0xfc, 0x00, 0x02, 0x41, 0xfc, 0x00,
+ 0x80, 0x40, 0x13, 0x04, 0x07, 0xa0, 0x01, 0x04, 0x00, 0x3c, 0x04, 0x5b,
+ 0x04, 0xc0, 0x02, 0x01, 0x00, 0x08, 0x02, 0x02, 0x12, 0x00, 0xc1, 0xe0,
+ 0x01, 0x40, 0x01, 0xa0, 0x01, 0x40, 0x04, 0x00, 0x02, 0x03, 0x01, 0x00,
+ 0xc8, 0x00, 0x01, 0x6a, 0xcc, 0xa0, 0xf8, 0x10, 0x05, 0x80, 0x06, 0x03,
+ 0x16, 0xf9, 0x02, 0x22, 0x02, 0x00, 0x06, 0x01, 0x16, 0xf3, 0x01, 0xa0,
+ 0x01, 0x40, 0x40, 0x00, 0xc8, 0x07, 0x01, 0x40, 0x02, 0x00, 0x08, 0x00,
+ 0xc0, 0x40, 0x06, 0x01, 0xc8, 0x01, 0x01, 0x6a, 0x02, 0x61, 0x80, 0x00,
+ 0xc8, 0x01, 0xf8, 0x10, 0x06, 0x00, 0x16, 0xf6, 0x04, 0xc0, 0x04, 0xc8,
+ 0x04, 0xc9, 0x02, 0x03, 0x08, 0x00, 0xc8, 0x00, 0x01, 0x6a, 0xc1, 0x80,
+ 0x02, 0x66, 0x80, 0x00, 0xc1, 0x20, 0xf8, 0x10, 0x81, 0x06, 0x16, 0x15,
+ 0xc2, 0x08, 0x13, 0x06, 0x05, 0x80, 0x06, 0x03, 0x16, 0xf2, 0xc2, 0x08,
+ 0x13, 0x0d, 0x10, 0x19, 0x07, 0xa0, 0xf8, 0x10, 0x55, 0x55, 0xc1, 0x20,
+ 0xf8, 0x10, 0x02, 0x84, 0x55, 0x55, 0x16, 0x02, 0xc2, 0x06, 0x10, 0xf0,
+ 0x81, 0x06, 0x13, 0xee, 0x04, 0x5b, 0x07, 0xa0, 0xf8, 0x10, 0x55, 0x55,
+ 0xc1, 0x60, 0xf8, 0x10, 0x81, 0x05, 0x13, 0x03, 0x02, 0x85, 0x55, 0x55,
+ 0x16, 0xf5, 0xc2, 0x08, 0x13, 0xe1, 0xc2, 0x40, 0x06, 0x09, 0x02, 0x48,
+ 0x07, 0xff, 0x04, 0xc0, 0x02, 0x01, 0x00, 0x08, 0x02, 0x02, 0x12, 0x00,
+ 0x02, 0x03, 0x01, 0x00, 0xc8, 0x00, 0x01, 0x6a, 0xc8, 0x32, 0xf8, 0x10,
+ 0x05, 0x80, 0x06, 0x03, 0x16, 0xf9, 0x02, 0x22, 0x02, 0x00, 0x06, 0x01,
+ 0x16, 0xf3, 0x02, 0x88, 0x00, 0x40, 0x15, 0x13, 0x02, 0x89, 0x00, 0x4f,
+ 0x11, 0x10, 0x04, 0xc0, 0x02, 0x02, 0x12, 0x00, 0x02, 0x01, 0x00, 0x08,
+ 0x02, 0x03, 0x01, 0x00, 0xcc, 0x80, 0x06, 0x03, 0x16, 0xfd, 0x02, 0x22,
+ 0x02, 0x00, 0x06, 0x01, 0x16, 0xf7, 0x05, 0xcb, 0x04, 0x5b, 0x07, 0xa0,
+ 0x01, 0x04, 0x00, 0x37, 0x04, 0x5b, 0x28, 0x43, 0x29, 0x31, 0x39, 0x38,
+ 0x33, 0x2d, 0x38, 0x38, 0x20, 0x42, 0x59, 0x20, 0x54, 0x49, 0xc2, 0x4b,
+ 0x02, 0xa8, 0x00, 0x98, 0x07, 0x83, 0x00, 0x02, 0x02, 0x28, 0x00, 0x08,
+ 0xc6, 0x23, 0xe4, 0xf6, 0x06, 0x48, 0xc0, 0xc4, 0x0a, 0x73, 0x17, 0x65,
+ 0x06, 0xa0, 0xf7, 0xc4, 0xc1, 0xc8, 0x05, 0xc7, 0x02, 0x03, 0x00, 0xa5,
+ 0x03, 0xb0, 0xcd, 0xf8, 0xcd, 0xf8, 0x02, 0xa6, 0x62, 0x06, 0x02, 0x88,
+ 0x00, 0x0a, 0x16, 0x57, 0x29, 0x03, 0x16, 0x55, 0x29, 0x05, 0x80, 0xc4,
+ 0x16, 0x52, 0x09, 0x15, 0x17, 0x50, 0x09, 0x15, 0x18, 0x4e, 0x02, 0x85,
+ 0x00, 0x29, 0x16, 0x4b, 0x05, 0xc6, 0x00, 0x96, 0x07, 0x03, 0x04, 0xc4,
+ 0x06, 0x45, 0x00, 0x95, 0x05, 0x44, 0x16, 0x43, 0x81, 0x44, 0x16, 0x41,
+ 0x03, 0x00, 0x00, 0x05, 0x02, 0xc4, 0x03, 0x00, 0x00, 0x0a, 0x02, 0x44,
+ 0x00, 0x0f, 0x02, 0x84, 0x00, 0x05, 0x16, 0x37, 0x02, 0xc4, 0x03, 0x00,
+ 0x00, 0x0f, 0x02, 0x44, 0x00, 0x0f, 0x02, 0x84, 0x00, 0x0a, 0x16, 0x2f,
+ 0x02, 0x04, 0xff, 0xfe, 0x13, 0x2c, 0x15, 0x2b, 0x1a, 0x2a, 0x05, 0x84,
+ 0x12, 0x28, 0x15, 0x27, 0x1a, 0x26, 0x18, 0x25, 0x05, 0x84, 0x16, 0x23,
+ 0x1b, 0x22, 0x17, 0x21, 0x05, 0x84, 0x13, 0x1f, 0x1a, 0x1e, 0x11, 0x1d,
+ 0x06, 0x04, 0x16, 0x1b, 0x02, 0xa5, 0xc1, 0xc5, 0x02, 0x25, 0x00, 0x06,
+ 0x02, 0x03, 0xa5, 0xa5, 0xc1, 0x83, 0x00, 0x95, 0x38, 0x03, 0x00, 0x94,
+ 0x02, 0x83, 0x6b, 0x2e, 0x16, 0x0e, 0x02, 0x84, 0x1c, 0x59, 0x16, 0x0b,
+ 0x02, 0x24, 0x00, 0x69, 0x00, 0x95, 0x3c, 0x03, 0x00, 0x94, 0x81, 0x83,
+ 0x16, 0x04, 0x02, 0x84, 0x00, 0x69, 0x16, 0x01, 0x05, 0xc9, 0x04, 0x59,
+ 0xd0, 0xc3, 0x13, 0xfd, 0x1c, 0x01, 0x10, 0xfb, 0x90, 0xe0, 0xe4, 0xfd,
+ 0x16, 0xf8, 0x06, 0xc3, 0xd0, 0xc3, 0x1c, 0xf5, 0x16, 0xf4, 0x90, 0xe0,
+ 0xe4, 0xfa, 0x16, 0xf1, 0x04, 0x5b, 0xc3, 0x0b, 0x02, 0x09, 0xe4, 0xfe,
+ 0x06, 0xa0, 0xf1, 0x50, 0x05, 0xcc, 0x04, 0x5c, 0x07, 0x88, 0xb0, 0x00,
+ 0x07, 0x89, 0xff, 0xfe, 0x09, 0xa8, 0x09, 0xa9, 0x07, 0x8a, 0xe0, 0x02,
+ 0x06, 0xa0, 0xf4, 0x42, 0x00, 0x00, 0x07, 0x88, 0xa0, 0x00, 0x07, 0x89,
+ 0xaf, 0xfe, 0x09, 0xa8, 0x09, 0xa9, 0x07, 0x8a, 0xe0, 0x78, 0x06, 0xa0,
+ 0xf4, 0x42, 0x00, 0x00, 0x06, 0xa0, 0xf6, 0xde, 0x00, 0x00, 0x10, 0xe6,
+ 0x10, 0xe5, 0x00, 0x00, 0xf8, 0x26, 0x07, 0x93, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xb8, 0x00, 0x48, 0x28, 0x43, 0x29, 0x31, 0x39, 0x38, 0x33, 0x2d,
+ 0x38, 0x39, 0x2c, 0x39, 0x30, 0x2d, 0x39, 0x34, 0x20, 0x54, 0x65, 0x78,
+ 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x73, 0x0a, 0x28, 0x43, 0x29, 0x31, 0x39, 0x38, 0x33, 0x2c, 0x34,
+ 0x2c, 0x35, 0x2c, 0x36, 0x20, 0x49, 0x42, 0x4d, 0x20, 0x43, 0x6f, 0x72,
+ 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x34, 0xff, 0xb8,
+ 0x00, 0x80, 0xb0, 0x3e, 0x20, 0x00, 0x90, 0x00, 0x0d, 0xd2, 0x45, 0x4f,
+ 0x20, 0x56, 0x32, 0x32, 0x38, 0x2e, 0x31, 0x30, 0x2e, 0x31, 0x38, 0x20,
+ 0x20, 0x28, 0x43, 0x29, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x20, 0x4f, 0x6c, 0x69, 0x63, 0x6f, 0x6d, 0x20, 0x31, 0x39,
+ 0x39, 0x38, 0x2e, 0x00, 0x03, 0x00, 0x00, 0x02, 0xc0, 0xa0, 0x01, 0x6a,
+ 0xc3, 0x0e, 0x09, 0xac, 0xc8, 0x0c, 0x01, 0x6a, 0xc3, 0x0e, 0x02, 0x4c,
+ 0x03, 0xff, 0xd8, 0xec, 0xf8, 0x00, 0x13, 0xc0, 0x05, 0x83, 0x02, 0x43,
+ 0x00, 0x3f, 0xd8, 0xec, 0xf8, 0x01, 0x13, 0xc0, 0xc8, 0x02, 0x01, 0x6a,
+ 0x05, 0xce, 0x03, 0x90, 0xef, 0xff, 0x03, 0x80, 0x11, 0x08, 0xc3, 0xbc,
+ 0xdf, 0xbc, 0x06, 0x0d, 0x16, 0xfd, 0x05, 0x8c, 0x01, 0x8c, 0x00, 0x01,
+ 0x10, 0x12, 0xc3, 0xbc, 0xc3, 0xfc, 0x01, 0x8d, 0x80, 0x00, 0x13, 0x0d,
+ 0x01, 0x0d, 0x40, 0x00, 0x16, 0x04, 0xdf, 0x8f, 0x06, 0x0d, 0x16, 0xfd,
+ 0x10, 0x06, 0x01, 0x8d, 0x40, 0x01, 0x13, 0x03, 0xcf, 0x8f, 0x06, 0x4d,
+ 0x16, 0xfd, 0xc3, 0x7c, 0x16, 0xe3, 0x04, 0x5b, 0xc1, 0x60, 0x01, 0x6c,
+ 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd, 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c,
+ 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00, 0x16, 0x0e, 0xc8, 0x0d, 0x01, 0x6c,
+ 0x07, 0x0f, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02,
+ 0x88, 0x0f, 0xfc, 0x06, 0x13, 0xf8, 0xd8, 0x20, 0xe0, 0x0a, 0xfc, 0x06,
+ 0xc8, 0x05, 0x01, 0x6c, 0x07, 0x8f, 0xfc, 0x00, 0xc1, 0x5f, 0x13, 0xe0,
+ 0x04, 0xff, 0x07, 0xbf, 0x81, 0x00, 0x07, 0x20, 0xff, 0xfe, 0xc7, 0xc2,
+ 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0,
+ 0x01, 0x03, 0x13, 0xf8, 0xc2, 0x8a, 0x16, 0x23, 0xc8, 0x0d, 0x01, 0x8c,
+ 0xc2, 0xcd, 0xc3, 0x20, 0x01, 0x6c, 0x07, 0x8a, 0x00, 0x01, 0xd2, 0x8e,
+ 0x15, 0x2d, 0x05, 0xa0, 0x10, 0x84, 0x07, 0x8d, 0x01, 0x04, 0x01, 0x5d,
+ 0x21, 0x00, 0x16, 0x03, 0x07, 0x9d, 0xde, 0x8c, 0x10, 0x25, 0x01, 0x5d,
+ 0x01, 0x00, 0x16, 0x22, 0xc3, 0xdd, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f,
+ 0x04, 0x80, 0xc7, 0x4f, 0x01, 0x5d, 0x20, 0x00, 0x13, 0xf1, 0x01, 0xe0,
+ 0x07, 0x78, 0x80, 0x00, 0x10, 0x15, 0xc3, 0xe0, 0x01, 0x6c, 0xc8, 0x09,
+ 0x01, 0x6c, 0x13, 0x08, 0xc8, 0x0d, 0xfc, 0x00, 0xc2, 0x4f, 0x05, 0x87,
+ 0xf1, 0xce, 0xc3, 0x8e, 0x11, 0xda, 0x10, 0x06, 0xc2, 0x0d, 0xc2, 0x4f,
+ 0x07, 0x87, 0x00, 0x01, 0xd1, 0xce, 0x11, 0xd3, 0x05, 0xa0, 0x10, 0x84,
+ 0xc8, 0x06, 0x07, 0x92, 0x07, 0x81, 0x01, 0x0a, 0x01, 0x60, 0x13, 0x0c,
+ 0x10, 0x00, 0x16, 0x04, 0xc8, 0x05, 0x01, 0x6c, 0x07, 0x20, 0xfc, 0x06,
+ 0x03, 0x90, 0xa0, 0x07, 0x02, 0xe0, 0x07, 0x78, 0x06, 0x9b, 0x02, 0xe0,
+ 0x08, 0x5c, 0xcc, 0x66, 0x00, 0x04, 0xcc, 0x43, 0xcc, 0x76, 0xcc, 0x76,
+ 0xc8, 0x44, 0x00, 0x02, 0xc4, 0x45, 0x07, 0xa1, 0xff, 0xee, 0x60, 0x81,
+ 0xc3, 0x45, 0xc0, 0xb6, 0x80, 0xc2, 0x1b, 0x63, 0xc3, 0x96, 0x04, 0xf6,
+ 0x02, 0x46, 0xfe, 0xf8, 0x01, 0x4e, 0x40, 0x00, 0x16, 0x02, 0x04, 0x60,
+ 0x90, 0xaa, 0x07, 0x81, 0x01, 0x0a, 0xa1, 0x02, 0xc0, 0x83, 0x02, 0x22,
+ 0x00, 0x06, 0x60, 0x84, 0x15, 0x25, 0x07, 0x84, 0x00, 0x06, 0xc0, 0x83,
+ 0xc8, 0x05, 0x01, 0x6c, 0xc8, 0x02, 0xfc, 0x04, 0x07, 0xa0, 0xfc, 0x02,
+ 0x80, 0x00, 0x04, 0xe0, 0xff, 0xfe, 0xc1, 0x60, 0x01, 0x6c, 0xc8, 0x06,
+ 0x07, 0x92, 0x02, 0xe0, 0x07, 0x78, 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c,
+ 0xc8, 0x05, 0x01, 0x6c, 0xc1, 0x60, 0xfc, 0x00, 0x16, 0x16, 0x10, 0xf1,
+ 0xc8, 0x06, 0x07, 0x92, 0x03, 0x90, 0x80, 0x03, 0x02, 0xe0, 0x07, 0x78,
+ 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c, 0x10, 0x0b, 0xc3, 0xe6, 0x00, 0x06,
+ 0x13, 0xf3, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02,
+ 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0xcc, 0x66, 0x00, 0x04, 0xcc, 0x42,
+ 0xcc, 0x76, 0xcc, 0x76, 0xc8, 0x44, 0x00, 0x02, 0xc4, 0x45, 0x07, 0xa1,
+ 0xff, 0xee, 0x60, 0x81, 0x05, 0xa0, 0x10, 0x84, 0x65, 0x82, 0x15, 0x0e,
+ 0xa0, 0xb6, 0xc3, 0x96, 0x04, 0xf6, 0x02, 0x46, 0xfe, 0xf8, 0x01, 0x4e,
+ 0x40, 0x00, 0x16, 0xb1, 0xa0, 0x84, 0x07, 0x84, 0x00, 0x06, 0x60, 0x84,
+ 0x04, 0x60, 0x90, 0xaa, 0x02, 0x26, 0xff, 0xfc, 0xc0, 0x36, 0xc0, 0x76,
+ 0x10, 0x06, 0x02, 0x26, 0xff, 0xfa, 0xc0, 0x36, 0xc0, 0x76, 0xc0, 0x83,
+ 0x65, 0x82, 0x07, 0x84, 0x00, 0x06, 0xa0, 0x42, 0x17, 0x01, 0x05, 0x80,
+ 0xc8, 0x05, 0x01, 0x6c, 0x07, 0x8f, 0xfc, 0x00, 0xc1, 0x7f, 0x16, 0x09,
+ 0xc1, 0x60, 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd, 0x06, 0x9b,
+ 0x02, 0xe0, 0x08, 0x5c, 0x10, 0xf1, 0x07, 0xbf, 0x80, 0x00, 0x04, 0xe0,
+ 0xff, 0xfe, 0xc7, 0xc3, 0xc0, 0xb6, 0xc3, 0x96, 0x04, 0xf6, 0x02, 0x46,
+ 0xfe, 0xf8, 0x27, 0xa0, 0x08, 0x98, 0x13, 0x0d, 0xc3, 0xc5, 0xc8, 0x0e,
+ 0x08, 0x8e, 0xc3, 0xa0, 0x08, 0x90, 0xc0, 0xee, 0xff, 0xfe, 0x05, 0xa0,
+ 0x08, 0xa0, 0x16, 0x32, 0x05, 0xa0, 0x08, 0x9e, 0x10, 0x2f, 0x07, 0x83,
+ 0x03, 0xf8, 0x06, 0x20, 0x08, 0x9c, 0x13, 0x02, 0x04, 0x60, 0x95, 0x0c,
+ 0xc3, 0xe0, 0x08, 0x9a, 0x83, 0xe0, 0x08, 0x98, 0x13, 0x08, 0xc8, 0x0f,
+ 0x08, 0x98, 0x04, 0xe0, 0x08, 0x9e, 0x04, 0xe0, 0x08, 0xa0, 0x27, 0x8f,
+ 0x16, 0xdf, 0x04, 0x60, 0x95, 0x0c, 0xc8, 0x0f, 0x01, 0x6c, 0x07, 0xa0,
+ 0xfc, 0x02, 0x80, 0x00, 0x04, 0xe0, 0xff, 0xfe, 0x04, 0xe0, 0xfc, 0x04,
+ 0xc8, 0x3e, 0xfc, 0x06, 0xc3, 0xe0, 0xfc, 0x00, 0x16, 0x0b, 0xc3, 0xe0,
+ 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd, 0x06, 0x9b, 0x02, 0xe0,
+ 0x08, 0x5c, 0xc8, 0x0f, 0x01, 0x6c, 0x10, 0xf2, 0x60, 0x9e, 0x87, 0x82,
+ 0x15, 0xe4, 0xa0, 0x9e, 0x02, 0x82, 0x00, 0xe0, 0x15, 0x1b, 0x02, 0x82,
+ 0x00, 0x70, 0x15, 0x35, 0xc3, 0xa0, 0x08, 0x8e, 0x03, 0x00, 0x00, 0x0f,
+ 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8,
+ 0x07, 0x8f, 0x01, 0x0a, 0xcf, 0xc2, 0x07, 0x3f, 0xcf, 0xc0, 0xcf, 0xc1,
+ 0xcb, 0xc4, 0x00, 0x02, 0xc7, 0xc5, 0x07, 0xaf, 0xff, 0xee, 0x60, 0x81,
+ 0x04, 0x60, 0x90, 0xaa, 0xc8, 0x0f, 0x01, 0x6c, 0x07, 0xa0, 0xfc, 0x02,
+ 0x80, 0x00, 0x04, 0xe0, 0xff, 0xfe, 0x04, 0xe0, 0xfc, 0x04, 0xc3, 0xc2,
+ 0x09, 0x2f, 0xa3, 0xcf, 0xc8, 0x0f, 0xfc, 0x06, 0x60, 0x8f, 0xc3, 0xe0,
+ 0xfc, 0x00, 0x16, 0x0b, 0xc3, 0xe0, 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78,
+ 0x04, 0xcd, 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c, 0xc8, 0x0f, 0x01, 0x6c,
+ 0x10, 0xf2, 0xc8, 0x0f, 0x01, 0x6c, 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00,
+ 0x04, 0xe0, 0xff, 0xfe, 0x04, 0xe0, 0xfc, 0x04, 0x01, 0xc2, 0x80, 0x00,
+ 0xc8, 0x02, 0xfc, 0x06, 0xc3, 0xe0, 0xfc, 0x00, 0x16, 0x0b, 0xc3, 0xe0,
+ 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd, 0x06, 0x9b, 0x02, 0xe0,
+ 0x08, 0x5c, 0xc8, 0x0f, 0x01, 0x6c, 0x10, 0xf2, 0xc8, 0x0f, 0x01, 0x6c,
+ 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00, 0x04, 0xe0, 0xff, 0xfe, 0x04, 0xe0,
+ 0xfc, 0x04, 0xc3, 0x8f, 0xc3, 0xe0, 0xfc, 0x00, 0x16, 0x0b, 0xc3, 0xe0,
+ 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd, 0x06, 0x9b, 0x02, 0xe0,
+ 0x08, 0x5c, 0xc8, 0x0f, 0x01, 0x6c, 0x10, 0xf2, 0xc8, 0x05, 0x01, 0x6c,
+ 0xc0, 0xa0, 0xfc, 0x06, 0x15, 0x0f, 0x01, 0x82, 0x80, 0x00, 0xc3, 0xc2,
+ 0x06, 0x0f, 0x01, 0x8f, 0x00, 0x01, 0xc8, 0x0f, 0x08, 0x5a, 0xc8, 0x0f,
+ 0xfc, 0x04, 0x63, 0xc2, 0x05, 0x0f, 0xc8, 0x0f, 0x08, 0x58, 0x10, 0x05,
+ 0x07, 0xa0, 0x00, 0x1a, 0x95, 0x3e, 0xc8, 0x02, 0xfc, 0x04, 0x03, 0x00,
+ 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03,
+ 0x13, 0xf8, 0x04, 0xe0, 0x01, 0x02, 0x07, 0x8f, 0x01, 0x0a, 0x07, 0x3f,
+ 0xcf, 0xc2, 0xcf, 0xc0, 0xcf, 0xc1, 0xcb, 0xc4, 0x00, 0x02, 0xc7, 0xc5,
+ 0x07, 0xaf, 0xff, 0xee, 0x68, 0x81, 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00,
+ 0x16, 0x05, 0xc8, 0x0d, 0x01, 0x6c, 0xd8, 0x20, 0xe0, 0x0a, 0xfc, 0x06,
+ 0xc2, 0x8a, 0x16, 0x13, 0xc8, 0x0d, 0x01, 0x8c, 0xc2, 0xcd, 0xc3, 0x0e,
+ 0x07, 0x8a, 0x00, 0x01, 0xc3, 0xa0, 0x08, 0x8e, 0xd2, 0x8e, 0x03, 0x00,
+ 0x00, 0x0f, 0x01, 0x60, 0x01, 0x00, 0x08, 0x00, 0x13, 0xfc, 0x03, 0x00,
+ 0x00, 0x02, 0x04, 0x60, 0x91, 0x54, 0xc8, 0x09, 0x01, 0x6c, 0x13, 0x08,
+ 0xc8, 0x0d, 0xfc, 0x00, 0xc2, 0x4e, 0x05, 0x87, 0xc3, 0xa0, 0x08, 0x8e,
+ 0xf1, 0xce, 0x10, 0xeb, 0xc2, 0x0d, 0xc2, 0x4e, 0x07, 0x87, 0x00, 0x01,
+ 0xc3, 0xa0, 0x08, 0x8e, 0xd1, 0xce, 0x10, 0xe3, 0xa0, 0x43, 0x17, 0x01,
+ 0x05, 0x80, 0xc8, 0x05, 0x01, 0x6c, 0x07, 0x8f, 0xfc, 0x00, 0xc1, 0x7f,
+ 0x16, 0x09, 0xc1, 0x60, 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd,
+ 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c, 0x10, 0xf1, 0x07, 0xbf, 0x80, 0x00,
+ 0x04, 0xe0, 0xff, 0xfe, 0xc7, 0xc3, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0,
+ 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x07, 0x8f,
+ 0x01, 0x0a, 0xcf, 0xc2, 0xcf, 0xc3, 0xcf, 0xc0, 0xcf, 0xc1, 0xcb, 0xc4,
+ 0x00, 0x02, 0xc7, 0xc5, 0x07, 0xaf, 0xff, 0xee, 0x60, 0x81, 0x60, 0x83,
+ 0x15, 0xd3, 0xa0, 0x83, 0x04, 0x60, 0x91, 0xb6, 0x03, 0x00, 0x00, 0x02,
+ 0xc8, 0x0c, 0x01, 0x6a, 0xc3, 0x20, 0xf8, 0x00, 0xc8, 0x0c, 0x01, 0x6a,
+ 0xc1, 0xa0, 0xf8, 0x06, 0x11, 0x10, 0xc8, 0x06, 0xf8, 0x04, 0x04, 0xe4,
+ 0xff, 0xf6, 0xcd, 0x06, 0x02, 0x24, 0x00, 0x04, 0xc9, 0x0b, 0x00, 0x02,
+ 0xc5, 0x0c, 0x07, 0xa4, 0xff, 0xee, 0x68, 0x81, 0x03, 0x90, 0x0a, 0x07,
+ 0x03, 0x80, 0x01, 0x86, 0x80, 0x00, 0xc1, 0x46, 0x06, 0x06, 0x01, 0x86,
+ 0x00, 0x01, 0xc8, 0x06, 0xf8, 0x04, 0x04, 0xe4, 0xff, 0xf6, 0xcd, 0x05,
+ 0x02, 0x24, 0x00, 0x04, 0xc9, 0x0b, 0x00, 0x02, 0xc5, 0x0c, 0x07, 0xa4,
+ 0xff, 0xee, 0x68, 0x81, 0x61, 0x46, 0x07, 0xa0, 0x00, 0x1a, 0x95, 0xa8,
+ 0x03, 0x90, 0x08, 0x07, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0xc8, 0x0c,
+ 0x01, 0x6a, 0xc1, 0xa6, 0xf8, 0x06, 0xc3, 0x20, 0xf8, 0x00, 0xc8, 0x0c,
+ 0x01, 0x6a, 0xc8, 0x06, 0xf8, 0x06, 0xc8, 0x05, 0xf8, 0x04, 0xc3, 0x20,
+ 0xf8, 0x00, 0x04, 0xe0, 0xf8, 0x00, 0x07, 0xa0, 0xf8, 0x02, 0x81, 0x00,
+ 0x07, 0x20, 0xfb, 0xfe, 0x07, 0xa0, 0x01, 0x00, 0x20, 0x81, 0x03, 0x90,
+ 0x02, 0x07, 0x03, 0x80, 0xc2, 0x84, 0xc3, 0x0a, 0xc8, 0x0a, 0x01, 0x6a,
+ 0x01, 0x20, 0xf8, 0x02, 0x81, 0x00, 0x13, 0x09, 0x01, 0x20, 0xf8, 0x02,
+ 0xfe, 0x00, 0x16, 0x0a, 0xc2, 0xa0, 0xf8, 0x00, 0x16, 0xf2, 0x06, 0xa0,
+ 0x97, 0xb6, 0xc2, 0xa0, 0xf8, 0x00, 0x16, 0xee, 0x06, 0xa0, 0x97, 0xb6,
+ 0xc2, 0xa0, 0xf8, 0x02, 0x11, 0x09, 0x01, 0x0a, 0x02, 0x00, 0x16, 0x55,
+ 0x01, 0x0a, 0x14, 0x00, 0x13, 0x5f, 0x01, 0x4a, 0x10, 0x00, 0x16, 0x33,
+ 0x07, 0x0a, 0x26, 0xa0, 0x08, 0x9e, 0x16, 0x02, 0xc2, 0xa0, 0x08, 0xa0,
+ 0x09, 0x5a, 0x05, 0x0a, 0x02, 0x2a, 0x08, 0x10, 0xc8, 0x0a, 0x08, 0x9c,
+ 0x04, 0xe0, 0x08, 0x98, 0x07, 0x8a, 0x7f, 0xfe, 0x98, 0x0a, 0x07, 0x2c,
+ 0x13, 0x0a, 0x98, 0x0a, 0x07, 0x20, 0x13, 0x07, 0x06, 0xca, 0x98, 0x0a,
+ 0x07, 0x2c, 0x13, 0x03, 0x98, 0x0a, 0x07, 0x20, 0x16, 0x0a, 0x01, 0xe0,
+ 0x06, 0xd2, 0x08, 0x00, 0x01, 0xe0, 0x06, 0x34, 0x08, 0x00, 0x04, 0xe0,
+ 0x06, 0x30, 0x04, 0xcb, 0x10, 0x0c, 0x07, 0x8a, 0x01, 0x00, 0xb8, 0x0a,
+ 0x07, 0x2c, 0x17, 0x02, 0x78, 0x0a, 0x07, 0x2c, 0xb8, 0x0a, 0x07, 0x20,
+ 0x17, 0x02, 0x78, 0x0a, 0x07, 0x20, 0xc2, 0xa0, 0xfb, 0xfe, 0x02, 0x4a,
+ 0x01, 0x00, 0x01, 0xca, 0x80, 0x00, 0xc8, 0x0a, 0xf8, 0x02, 0xc8, 0x0c,
+ 0x01, 0x6a, 0xc2, 0xa0, 0xf8, 0x02, 0x11, 0x07, 0x07, 0xa0, 0xf8, 0x02,
+ 0x80, 0x00, 0xc8, 0x20, 0xf8, 0x00, 0x01, 0x6a, 0x10, 0xf6, 0x07, 0x8a,
+ 0x01, 0x8c, 0xc6, 0x8c, 0xc2, 0xcb, 0x03, 0x90, 0xff, 0xdf, 0x13, 0x32,
+ 0x03, 0x80, 0x01, 0x4a, 0x06, 0x00, 0x13, 0x0a, 0x01, 0xe0, 0x06, 0xd2,
+ 0x02, 0x00, 0x01, 0xe0, 0x06, 0x34, 0x08, 0x00, 0x04, 0xe0, 0x06, 0x30,
+ 0x01, 0xcb, 0x00, 0x01, 0x88, 0x05, 0x01, 0x6a, 0x13, 0x1a, 0xc3, 0x20,
+ 0xfb, 0xfe, 0x16, 0x08, 0x04, 0xe0, 0xf8, 0x02, 0xc8, 0x20, 0xf8, 0x00,
+ 0x01, 0x6a, 0x16, 0xf4, 0x06, 0xa0, 0x97, 0xb6, 0xd2, 0xa0, 0xe0, 0x12,
+ 0xc8, 0x0a, 0xf8, 0x02, 0xc3, 0x20, 0xf8, 0x00, 0x13, 0x06, 0xc2, 0xa0,
+ 0xf8, 0x02, 0x11, 0xd3, 0xc2, 0x8c, 0x04, 0x60, 0x95, 0xe6, 0x06, 0xa0,
+ 0x97, 0xb6, 0xc8, 0x0a, 0xf8, 0x02, 0x07, 0x8a, 0x01, 0x8c, 0x01, 0x4b,
+ 0x00, 0x01, 0x04, 0x5b, 0x07, 0x8b, 0x00, 0xda, 0xce, 0xcd, 0xce, 0xce,
+ 0xc6, 0xcf, 0x02, 0xe0, 0x00, 0xc0, 0x04, 0x54, 0x06, 0xa0, 0x95, 0xe2,
+ 0x16, 0x25, 0xc0, 0x82, 0x13, 0x0b, 0xc6, 0x81, 0xc8, 0x09, 0x01, 0x6a,
+ 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0xc1, 0x01, 0xc1, 0x42, 0x04, 0xc2,
+ 0xc0, 0xc0, 0x10, 0xe8, 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00,
+ 0xc2, 0x45, 0x04, 0xc3, 0x10, 0xe1, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80,
+ 0x03, 0x00, 0x00, 0x02, 0x86, 0x8a, 0x01, 0x60, 0x01, 0x9c, 0x40, 0x00,
+ 0x16, 0xf6, 0x86, 0x8a, 0xc8, 0x05, 0x01, 0x6a, 0x01, 0x20, 0xf8, 0x02,
+ 0xfe, 0x00, 0x16, 0xd8, 0xc0, 0x82, 0x13, 0x0d, 0xc6, 0x81, 0xc8, 0x09,
+ 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0xc1, 0x01, 0xc1, 0x42,
+ 0x04, 0xc2, 0xc0, 0xc0, 0x03, 0x90, 0x00, 0x1f, 0x03, 0x80, 0xc8, 0x09,
+ 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0x04, 0xc3, 0x03, 0x90,
+ 0x00, 0x1f, 0x03, 0x80, 0x02, 0xe0, 0x08, 0x6a, 0xc2, 0x8b, 0x02, 0x2a,
+ 0xff, 0xfc, 0x04, 0x60, 0xb3, 0x8a, 0xc0, 0x82, 0x13, 0x07, 0xc6, 0x81,
+ 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0x10, 0x06,
+ 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0x04, 0xc0,
+ 0x06, 0xa0, 0x99, 0x16, 0xc0, 0xc0, 0xc1, 0x01, 0xc1, 0x42, 0x04, 0xc2,
+ 0x10, 0x9b, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02,
+ 0x86, 0x8a, 0x01, 0x60, 0x01, 0x9c, 0x40, 0x00, 0x16, 0xf6, 0x86, 0x8a,
+ 0xc8, 0x05, 0x01, 0x6a, 0x01, 0x20, 0xf8, 0x02, 0xfe, 0x00, 0x13, 0x03,
+ 0x06, 0xa0, 0x95, 0xe2, 0x13, 0xd6, 0xc0, 0x82, 0x13, 0x07, 0xc6, 0x81,
+ 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0x10, 0x06,
+ 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0x04, 0xc0,
+ 0x06, 0xa0, 0x99, 0x16, 0xc0, 0xc0, 0xc1, 0x01, 0xc1, 0x42, 0x04, 0xc2,
+ 0x03, 0x90, 0x00, 0x1f, 0x03, 0x80, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80,
+ 0x03, 0x00, 0x00, 0x02, 0x88, 0x08, 0x01, 0x8c, 0x01, 0x60, 0x01, 0x9c,
+ 0x40, 0x00, 0x16, 0xf5, 0x88, 0x08, 0x01, 0x8c, 0xc0, 0xe0, 0x01, 0x6c,
+ 0xc2, 0x20, 0x05, 0xf4, 0x13, 0x02, 0x04, 0x60, 0xb9, 0x4c, 0x02, 0xe0,
+ 0x08, 0x6a, 0x01, 0x03, 0x00, 0xff, 0x13, 0x11, 0x01, 0x43, 0x04, 0x00,
+ 0x13, 0x0e, 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45,
+ 0xc1, 0x60, 0x08, 0x96, 0x02, 0x85, 0x97, 0xf6, 0x16, 0x02, 0x06, 0xa0,
+ 0x99, 0x16, 0x02, 0x43, 0x03, 0x00, 0x02, 0xe0, 0x00, 0xe0, 0x01, 0x20,
+ 0x08, 0x70, 0x01, 0x00, 0x16, 0x2f, 0xc2, 0x20, 0x05, 0xf4, 0x16, 0x2c,
+ 0xc2, 0x60, 0x05, 0xf0, 0x13, 0x12, 0xc8, 0x19, 0x05, 0xf0, 0xc2, 0xa9,
+ 0x00, 0x0a, 0x11, 0x02, 0xf2, 0xa0, 0x09, 0x2e, 0xd8, 0x0a, 0x01, 0x80,
+ 0xc8, 0x29, 0x00, 0x06, 0x01, 0x8c, 0x07, 0xa0, 0x09, 0x16, 0x00, 0x04,
+ 0xc8, 0x09, 0x05, 0xf4, 0x10, 0x17, 0x02, 0xe0, 0x08, 0x6a, 0x01, 0x83,
+ 0x06, 0x00, 0x16, 0x05, 0xc1, 0x42, 0x13, 0x08, 0xc0, 0xc0, 0xc1, 0x01,
+ 0x04, 0xc2, 0xd8, 0x20, 0x09, 0x2e, 0x01, 0x80, 0xc8, 0x04, 0x01, 0x8c,
+ 0x02, 0xe0, 0x00, 0xe0, 0x07, 0xa0, 0x00, 0x14, 0x08, 0x6a, 0xc8, 0x20,
+ 0x08, 0x96, 0x00, 0x16, 0xc8, 0x03, 0x01, 0x6c, 0x11, 0x03, 0x03, 0x90,
+ 0x11, 0xff, 0x03, 0x80, 0x04, 0x60, 0xb9, 0xc0, 0xc8, 0x04, 0x01, 0x6a,
+ 0x10, 0x03, 0xc8, 0x20, 0xf8, 0x00, 0x01, 0x6a, 0xc3, 0x20, 0xf8, 0x02,
+ 0x01, 0x4c, 0x01, 0x00, 0x16, 0xf8, 0xc1, 0x60, 0x10, 0x86, 0x02, 0x45,
+ 0x00, 0x1f, 0x06, 0xcc, 0xd9, 0x4c, 0x10, 0x88, 0x13, 0x0d, 0x05, 0xa0,
+ 0x10, 0x86, 0x06, 0x03, 0x01, 0x03, 0x00, 0xff, 0x13, 0x52, 0xc1, 0x20,
+ 0xf8, 0x00, 0xc8, 0x04, 0x01, 0x6a, 0x16, 0xe8, 0x06, 0xa0, 0x97, 0xb6,
+ 0x01, 0x0c, 0x00, 0xfe, 0x16, 0xf0, 0xc3, 0x20, 0x01, 0x6a, 0xc8, 0x04,
+ 0x01, 0x6a, 0x01, 0x20, 0xf8, 0x0e, 0x80, 0x00, 0x13, 0x07, 0xc1, 0x20,
+ 0xf8, 0x14, 0x01, 0x84, 0x60, 0xff, 0x02, 0x84, 0x02, 0x00, 0x1b, 0x33,
+ 0xc1, 0x20, 0xf8, 0x08, 0x11, 0x0c, 0x88, 0x20, 0xf8, 0x0c, 0x01, 0xa4,
+ 0x16, 0x2f, 0x88, 0x20, 0xf8, 0x0a, 0x01, 0xa2, 0x16, 0x2b, 0x88, 0x04,
+ 0x01, 0xa0, 0x13, 0x25, 0x10, 0x27, 0xc1, 0x20, 0xf8, 0x0a, 0x11, 0x09,
+ 0x25, 0x20, 0x01, 0xac, 0x16, 0x1e, 0xc1, 0x20, 0xf8, 0x0c, 0x25, 0x20,
+ 0x01, 0xae, 0x16, 0x19, 0x10, 0x1b, 0x02, 0x84, 0xff, 0xff, 0x16, 0x0a,
+ 0x88, 0x04, 0xf8, 0x0c, 0x16, 0x07, 0x41, 0x20, 0xf8, 0x08, 0x13, 0x0f,
+ 0x02, 0x84, 0x3f, 0xff, 0x13, 0x0c, 0x10, 0x0e, 0x88, 0x04, 0x01, 0xa8,
+ 0x16, 0x0b, 0x88, 0x20, 0xf8, 0x0c, 0x01, 0xaa, 0x16, 0x07, 0x88, 0x20,
+ 0xf8, 0x08, 0x01, 0xa6, 0x16, 0x03, 0xd9, 0x60, 0xee, 0xa8, 0x10, 0x88,
+ 0xc8, 0x0c, 0x01, 0x6a, 0x10, 0xa8, 0x01, 0x43, 0x20, 0x00, 0x16, 0x07,
+ 0x07, 0x85, 0x01, 0x04, 0x01, 0x55, 0x21, 0x00, 0x16, 0x03, 0x07, 0x95,
+ 0xde, 0x8c, 0x04, 0x5b, 0x01, 0x55, 0x01, 0x00, 0x16, 0xfc, 0xc1, 0x15,
+ 0x01, 0xc4, 0xff, 0x00, 0x01, 0x84, 0x04, 0x80, 0xc5, 0x44, 0x01, 0x55,
+ 0x20, 0x00, 0x13, 0xf1, 0x01, 0xe0, 0x07, 0x78, 0x80, 0x00, 0x04, 0x5b,
+ 0x03, 0x00, 0x00, 0x02, 0xc2, 0x0b, 0xc3, 0x20, 0x05, 0xf4, 0x16, 0x08,
+ 0xc3, 0x20, 0x08, 0x70, 0x01, 0x0c, 0x00, 0xff, 0x13, 0x1a, 0x01, 0x4c,
+ 0x04, 0x00, 0x13, 0x17, 0xc2, 0xa8, 0x00, 0x0a, 0x01, 0x4a, 0x00, 0x10,
+ 0x16, 0x46, 0x01, 0x4a, 0x80, 0x00, 0x16, 0x19, 0xc3, 0x08, 0x06, 0xa0,
+ 0x9a, 0xf4, 0xc2, 0x0c, 0xc3, 0x20, 0x05, 0xf4, 0x16, 0x12, 0xc3, 0x20,
+ 0x08, 0x70, 0x01, 0x0c, 0x00, 0xff, 0x13, 0x03, 0x01, 0x4c, 0x04, 0x00,
+ 0x16, 0x0a, 0x01, 0x68, 0x00, 0x0a, 0x00, 0x10, 0x13, 0x03, 0x01, 0x0c,
+ 0x01, 0x00, 0x16, 0x2d, 0x06, 0xa0, 0xbc, 0x40, 0x10, 0x04, 0x07, 0x87,
+ 0x05, 0xf0, 0x06, 0xa0, 0xc2, 0x8a, 0x01, 0xe0, 0x08, 0x70, 0x02, 0x00,
+ 0x07, 0xa0, 0x00, 0x14, 0x00, 0xe0, 0x07, 0xa0, 0x00, 0x16, 0x98, 0x4e,
+ 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0xa8, 0xc3, 0xa9, 0xa0, 0xcf, 0xec,
+ 0xe9, 0xe3, 0xef, 0xed, 0xa0, 0xb1, 0xb9, 0xb9, 0xb6, 0x00, 0x03, 0x00,
+ 0x00, 0x02, 0xc2, 0x20, 0x08, 0x70, 0x16, 0x0c, 0xd8, 0x20, 0x09, 0x2e,
+ 0x01, 0x80, 0xc8, 0x2b, 0x00, 0x06, 0x01, 0x8c, 0x07, 0xa0, 0x09, 0x16,
+ 0x00, 0x04, 0xc8, 0x0b, 0x05, 0xf4, 0x10, 0x05, 0xc2, 0x0b, 0x07, 0x87,
+ 0x05, 0xf0, 0x06, 0xa0, 0xc2, 0x44, 0x01, 0xe0, 0x08, 0x70, 0x02, 0x00,
+ 0x07, 0xa0, 0x00, 0x14, 0x00, 0xe0, 0x07, 0xa0, 0x00, 0x16, 0x98, 0x4e,
+ 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0xc2, 0x20, 0x05, 0xf4, 0x13, 0x02,
+ 0x04, 0x60, 0xbc, 0x04, 0x02, 0xa8, 0xc8, 0x08, 0x08, 0x84, 0x02, 0xe0,
+ 0x08, 0x6a, 0x01, 0x03, 0x00, 0xff, 0x13, 0x22, 0x01, 0x43, 0x04, 0x00,
+ 0x13, 0x1f, 0x01, 0xe0, 0x01, 0x9c, 0x40, 0x00, 0x0b, 0xab, 0x0b, 0xab,
+ 0x01, 0x60, 0x01, 0x9c, 0x40, 0x00, 0x16, 0x16, 0xc8, 0x04, 0x01, 0x6a,
+ 0xc2, 0xe0, 0xf8, 0x02, 0x11, 0x0f, 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04,
+ 0xf8, 0x00, 0xc2, 0x45, 0xc1, 0x60, 0x08, 0x96, 0x02, 0x85, 0x97, 0xf6,
+ 0x16, 0x02, 0x06, 0xa0, 0x99, 0x16, 0x02, 0x43, 0x03, 0x00, 0x10, 0x02,
+ 0x01, 0xc3, 0x04, 0x00, 0x00, 0x9d, 0x04, 0x5b, 0x03, 0x00, 0x00, 0x02,
+ 0x07, 0x87, 0x05, 0xf0, 0xc2, 0xcb, 0x16, 0x0f, 0x06, 0xa0, 0x9a, 0xf4,
+ 0x01, 0xe0, 0x08, 0x70, 0x01, 0x00, 0x07, 0xa0, 0x00, 0x14, 0x00, 0xe0,
+ 0x07, 0xa0, 0x00, 0x16, 0x98, 0x4e, 0xcb, 0x60, 0x05, 0xf4, 0x00, 0x02,
+ 0x03, 0x80, 0xc2, 0x20, 0x08, 0x70, 0x01, 0x88, 0x01, 0x00, 0xc8, 0x08,
+ 0x08, 0x70, 0x01, 0x08, 0x04, 0x00, 0x16, 0x03, 0x01, 0x08, 0x00, 0xff,
+ 0x16, 0x08, 0xc2, 0x20, 0x05, 0xf4, 0x16, 0x05, 0xc2, 0x17, 0x13, 0x04,
+ 0xc5, 0xd8, 0x06, 0xa0, 0xbc, 0x40, 0x03, 0x80, 0x02, 0xe0, 0x08, 0x6a,
+ 0x01, 0x83, 0x06, 0x00, 0x16, 0x05, 0xc1, 0x42, 0x13, 0x08, 0xc0, 0xc0,
+ 0xc1, 0x01, 0x04, 0xc2, 0xd8, 0x20, 0x09, 0x2e, 0x01, 0x80, 0xc8, 0x04,
+ 0x01, 0x8c, 0x02, 0xe0, 0x00, 0xc0, 0x07, 0xa0, 0x00, 0x14, 0x08, 0x6a,
+ 0xc8, 0x20, 0x08, 0x96, 0x00, 0x16, 0x03, 0x80, 0xc8, 0x01, 0x01, 0x6a,
+ 0x13, 0x05, 0xc2, 0xe0, 0xf8, 0x02, 0x11, 0x02, 0x06, 0xa0, 0x97, 0xb6,
+ 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40, 0x13, 0x01, 0x03, 0x80, 0xd8, 0x20,
+ 0x09, 0x2f, 0x01, 0x83, 0xc0, 0x41, 0x13, 0x04, 0xc8, 0x01, 0x01, 0x8a,
+ 0xc8, 0x01, 0x09, 0x18, 0x07, 0x85, 0x00, 0x43, 0x01, 0x20, 0x0c, 0x06,
+ 0x00, 0xc0, 0x16, 0x20, 0xc2, 0x20, 0x0c, 0x02, 0x06, 0x08, 0x01, 0x08,
+ 0xfe, 0x03, 0x16, 0x1a, 0x07, 0x8a, 0x00, 0x24, 0x62, 0xa0, 0x0c, 0x04,
+ 0xc8, 0x0a, 0x0c, 0x04, 0x07, 0x87, 0x06, 0x30, 0x01, 0xe7, 0x00, 0x04,
+ 0x00, 0x40, 0x04, 0xd7, 0x02, 0x27, 0x00, 0x0c, 0xc2, 0x57, 0x16, 0x04,
+ 0xcd, 0xc5, 0xc5, 0xc5, 0x04, 0x60, 0xb9, 0xc0, 0x05, 0xc7, 0xc8, 0x17,
+ 0x01, 0x6a, 0xc8, 0x05, 0xf8, 0x00, 0x10, 0xf7, 0x04, 0x60, 0xf8, 0xfe,
+ 0x03, 0x00, 0x00, 0x02, 0xc3, 0x20, 0x01, 0x8a, 0x98, 0x20, 0xe0, 0x10,
+ 0x01, 0x83, 0x13, 0xba, 0x01, 0x20, 0x01, 0x9c, 0x00, 0x40, 0x13, 0x02,
+ 0x06, 0xa0, 0xd7, 0xd8, 0xc1, 0x41, 0x83, 0x05, 0x16, 0x01, 0x03, 0x80,
+ 0xc8, 0x05, 0x01, 0x6a, 0xc2, 0x20, 0xf8, 0x02, 0x01, 0x40, 0x00, 0x40,
+ 0x16, 0x12, 0x88, 0x01, 0x09, 0x18, 0x16, 0x07, 0xc8, 0x20, 0x09, 0x1a,
+ 0x09, 0x18, 0x04, 0xe0, 0x09, 0x1a, 0x01, 0xc0, 0x00, 0x04, 0x01, 0x80,
+ 0x40, 0x40, 0x01, 0x20, 0xf8, 0x06, 0x00, 0xc0, 0x16, 0x02, 0x01, 0xc0,
+ 0x40, 0x00, 0x01, 0x48, 0x01, 0x00, 0x16, 0x55, 0x01, 0xc0, 0x00, 0x40,
+ 0x01, 0x00, 0x40, 0x04, 0x13, 0x50, 0x01, 0x40, 0x40, 0x00, 0x16, 0x48,
+ 0x01, 0xa0, 0x07, 0x78, 0x40, 0x00, 0x01, 0x80, 0x40, 0x00, 0x01, 0x48,
+ 0x00, 0x01, 0x16, 0x3d, 0x01, 0x80, 0x00, 0x04, 0xc1, 0x41, 0xc0, 0x60,
+ 0xf8, 0x00, 0x04, 0xe0, 0xf8, 0x00, 0x07, 0x8b, 0x03, 0xea, 0x62, 0xe0,
+ 0xf8, 0x04, 0xc8, 0x0b, 0xf8, 0x04, 0x85, 0x05, 0x16, 0x02, 0xc5, 0x01,
+ 0x10, 0x10, 0xc8, 0x14, 0x01, 0x6a, 0x88, 0x05, 0xf8, 0x00, 0x13, 0x06,
+ 0xc8, 0x20, 0xf8, 0x00, 0x01, 0x6a, 0x88, 0x05, 0xf8, 0x00, 0x16, 0xfa,
+ 0xc8, 0x01, 0xf8, 0x00, 0x16, 0x02, 0xc0, 0xa0, 0x01, 0x6a, 0x01, 0x08,
+ 0xfe, 0x00, 0x16, 0x4a, 0xc8, 0x05, 0x01, 0x6a, 0x07, 0x87, 0x06, 0x30,
+ 0x01, 0xe7, 0x00, 0x04, 0x00, 0x40, 0x04, 0xd7, 0x02, 0x27, 0x00, 0x0c,
+ 0xa1, 0x45, 0xc9, 0x60, 0xf8, 0x00, 0x0c, 0x32, 0x04, 0xe0, 0xf8, 0x00,
+ 0x09, 0x15, 0xc2, 0x57, 0x16, 0x31, 0xcd, 0xc5, 0xc5, 0xc5, 0x01, 0xc0,
+ 0x00, 0x20, 0xc1, 0x41, 0x10, 0x0e, 0x01, 0x40, 0x00, 0x04, 0x16, 0x05,
+ 0x01, 0x80, 0x00, 0x04, 0x01, 0xe0, 0xf8, 0x02, 0x40, 0x00, 0xc1, 0x60,
+ 0xf8, 0x00, 0x01, 0x00, 0x40, 0x00, 0x16, 0x01, 0xc0, 0x45, 0x83, 0x05,
+ 0x16, 0x87, 0xc2, 0xe0, 0x09, 0x18, 0x16, 0x10, 0x01, 0x00, 0x00, 0x04,
+ 0x16, 0x0d, 0x98, 0x20, 0xe0, 0x10, 0x01, 0x83, 0x13, 0x09, 0x07, 0x8b,
+ 0xd7, 0x5e, 0x01, 0x40, 0x00, 0x40, 0x13, 0x02, 0x07, 0x8b, 0xd7, 0xa4,
+ 0xc8, 0x0b, 0x00, 0x12, 0x01, 0x00, 0x00, 0x20, 0x16, 0x01, 0x03, 0x80,
+ 0x01, 0x80, 0x00, 0x20, 0x04, 0x60, 0xb9, 0xc0, 0x05, 0xc7, 0xc8, 0x17,
+ 0x01, 0x6a, 0xc8, 0x05, 0xf8, 0x00, 0x10, 0xca, 0xc1, 0x81, 0x06, 0xa0,
+ 0xf9, 0x32, 0xc1, 0x46, 0x10, 0xd8, 0x05, 0xa0, 0x09, 0x32, 0xc0, 0x41,
+ 0x16, 0x01, 0x03, 0x80, 0xc3, 0x20, 0x00, 0x12, 0x04, 0x5c, 0x03, 0x00,
+ 0x00, 0x00, 0x03, 0xb0, 0x10, 0xff, 0x03, 0x80, 0x20, 0x00, 0x9d, 0xd2,
+ 0x02, 0x2f, 0x00, 0x00, 0x20, 0x00, 0xc7, 0x46, 0x00, 0x88, 0xc0, 0x60,
+ 0x05, 0xee, 0x02, 0x21, 0x03, 0xe8, 0x01, 0x20, 0x01, 0x02, 0x00, 0x06,
+ 0x13, 0x04, 0x01, 0x20, 0x01, 0x00, 0x08, 0x00, 0x13, 0x04, 0x88, 0x01,
+ 0x05, 0xee, 0x16, 0xf5, 0x10, 0x35, 0x07, 0x81, 0x01, 0x0a, 0xcc, 0x4c,
+ 0xcc, 0x4c, 0xcc, 0x4e, 0xcc, 0x4f, 0x07, 0xb1, 0x00, 0x40, 0xc4, 0x4d,
+ 0xc8, 0x0a, 0x01, 0x00, 0x04, 0x5b, 0xc0, 0x60, 0x05, 0xee, 0x02, 0x21,
+ 0x03, 0xe8, 0x01, 0x20, 0x01, 0x02, 0x00, 0x06, 0x13, 0x04, 0x01, 0x20,
+ 0x01, 0x00, 0x08, 0x00, 0x13, 0x04, 0x88, 0x01, 0x05, 0xee, 0x16, 0xf5,
+ 0x10, 0x19, 0x07, 0x81, 0x01, 0x0a, 0xcc, 0x4c, 0xcc, 0x4c, 0xcc, 0x4e,
+ 0xcc, 0x4f, 0x07, 0xb1, 0x00, 0x40, 0xc4, 0x4d, 0xc8, 0x0a, 0x01, 0x00,
+ 0xc0, 0x60, 0x05, 0xee, 0x02, 0x21, 0x03, 0xe8, 0x01, 0x20, 0x01, 0x02,
+ 0x00, 0x06, 0x13, 0x01, 0x04, 0x5b, 0x88, 0x01, 0x05, 0xee, 0x16, 0xf8,
+ 0x10, 0x01, 0x20, 0x00, 0xce, 0x3e, 0x0a, 0x32, 0x07, 0x8d, 0x10, 0x00,
+ 0x20, 0x0d, 0x16, 0x28, 0x07, 0x8d, 0x08, 0x00, 0x01, 0x40, 0x02, 0x00,
+ 0x13, 0x23, 0x01, 0xc0, 0x02, 0x00, 0x07, 0x8f, 0x97, 0xf6, 0xc3, 0x8e,
+ 0x11, 0x02, 0x07, 0x8f, 0x97, 0x6a, 0xc8, 0x0f, 0x08, 0x96, 0xc3, 0x60,
+ 0x00, 0x16, 0x02, 0x8d, 0x98, 0x4e, 0x13, 0x02, 0xc8, 0x0f, 0x00, 0x16,
+ 0x07, 0x8f, 0x03, 0xf8, 0x02, 0x4e, 0x40, 0x00, 0xc8, 0x0e, 0x08, 0x98,
+ 0xc8, 0x0e, 0x08, 0x9a, 0x13, 0x05, 0x07, 0x8e, 0xee, 0x60, 0xc3, 0xfe,
+ 0xc8, 0x0e, 0x08, 0x90, 0xc8, 0x0f, 0x08, 0x62, 0x04, 0x20, 0xea, 0x7a,
+ 0x04, 0x5b, 0x07, 0x8d, 0x10, 0x00, 0x20, 0x0d, 0x16, 0xfb, 0x07, 0x8d,
+ 0x08, 0x00, 0x01, 0x40, 0x04, 0x00, 0x13, 0xf6, 0x07, 0x8d, 0x40, 0x00,
+ 0x01, 0x0e, 0x00, 0x01, 0x16, 0xf1, 0x01, 0xc0, 0x04, 0x00, 0x06, 0x0f,
+ 0x01, 0x8f, 0x80, 0x00, 0xc8, 0x0f, 0x08, 0x8c, 0xc3, 0xce, 0x01, 0x8e,
+ 0xe0, 0x00, 0x05, 0x0e, 0xc8, 0x0e, 0x08, 0x4c, 0xa8, 0x0e, 0x08, 0x8c,
+ 0x09, 0xdf, 0x02, 0x4f, 0x00, 0x04, 0x02, 0x2f, 0x03, 0xf0, 0xc8, 0x0f,
+ 0x08, 0x8a, 0x01, 0x85, 0x00, 0x40, 0x04, 0x20, 0xea, 0x7a, 0xc0, 0x41,
+ 0x13, 0xfe, 0x03, 0x00, 0x00, 0x02, 0x88, 0x01, 0x00, 0xe2, 0x13, 0x36,
+ 0xc8, 0x01, 0x01, 0x6c, 0x01, 0x20, 0xfc, 0x06, 0x00, 0xc0, 0x13, 0x30,
+ 0xc0, 0xe0, 0xfc, 0x02, 0xc1, 0x81, 0x07, 0x20, 0xfc, 0x02, 0x07, 0xa0,
+ 0xfc, 0x04, 0x03, 0xee, 0xc8, 0x04, 0xfc, 0x76, 0xc8, 0x04, 0xfc, 0xe6,
+ 0xc8, 0x04, 0xfd, 0x56, 0xc8, 0x04, 0xfd, 0xc6, 0xc8, 0x04, 0xfe, 0x36,
+ 0xc8, 0x04, 0xfe, 0xa6, 0xc8, 0x04, 0xff, 0x16, 0xc8, 0x04, 0xff, 0x86,
+ 0x07, 0x8e, 0xfc, 0x00, 0xc0, 0x5e, 0x04, 0xde, 0xc8, 0x20, 0x00, 0xe4,
+ 0x01, 0x6c, 0xc8, 0x06, 0xfc, 0x00, 0xc8, 0x06, 0x00, 0xe4, 0x01, 0x43,
+ 0x01, 0x00, 0x13, 0x0a, 0x03, 0x00, 0x00, 0x0f, 0x03, 0x00, 0x00, 0x02,
+ 0x88, 0x01, 0x00, 0xe2, 0x13, 0xf9, 0xc8, 0x01, 0x01, 0x6c, 0x10, 0xd0,
+ 0x03, 0x00, 0x00, 0x0f, 0x01, 0x60, 0x07, 0x58, 0x14, 0x00, 0x16, 0xbf,
+ 0x07, 0x83, 0xfc, 0x76, 0x02, 0xe0, 0x08, 0x5c, 0x04, 0x60, 0x91, 0x6a,
+ 0x02, 0x2d, 0x00, 0x06, 0xc0, 0xa0, 0x08, 0x4c, 0x04, 0x60, 0xd3, 0x36,
+ 0x01, 0x00, 0x07, 0xff, 0x16, 0x11, 0x01, 0xc0, 0x07, 0xff, 0x01, 0x00,
+ 0x20, 0x00, 0x16, 0x29, 0x01, 0xc0, 0x20, 0x00, 0x07, 0x8f, 0x08, 0x92,
+ 0xc7, 0xc1, 0xc8, 0x0f, 0x00, 0xe8, 0xc0, 0x60, 0x05, 0xf8, 0x04, 0xe0,
+ 0x05, 0xf8, 0x10, 0x1f, 0x01, 0x40, 0x20, 0x00, 0x16, 0x0b, 0xc0, 0x60,
+ 0x05, 0xf8, 0x16, 0xf7, 0x01, 0x80, 0x20, 0x00, 0x07, 0xa0, 0x00, 0xe8,
+ 0x07, 0x7a, 0xc0, 0x60, 0x08, 0x92, 0x10, 0x0f, 0xc3, 0xdd, 0x13, 0x05,
+ 0x03, 0x90, 0x00, 0x17, 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0x03, 0x00,
+ 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03,
+ 0x13, 0xf8, 0x24, 0x40, 0x13, 0xcd, 0xc8, 0x01, 0x01, 0x6c, 0x88, 0x01,
+ 0x00, 0xe2, 0x16, 0x24, 0xc3, 0xdd, 0x16, 0xea, 0x84, 0xc4, 0x13, 0xed,
+ 0x01, 0x20, 0xfc, 0x06, 0x00, 0xc0, 0x16, 0x53, 0x01, 0xc0, 0x40, 0x00,
+ 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0,
+ 0x01, 0x03, 0x13, 0xf8, 0x01, 0x40, 0x40, 0x00, 0x16, 0xe4, 0xc3, 0xdd,
+ 0x13, 0xf3, 0x03, 0x90, 0x00, 0x17, 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06,
+ 0xc8, 0x01, 0x01, 0x6c, 0x10, 0xeb, 0x07, 0x86, 0x03, 0xf4, 0x61, 0x89,
+ 0x04, 0x60, 0xd4, 0x28, 0xc0, 0xe0, 0xfc, 0x02, 0x13, 0xf8, 0xc1, 0xa0,
+ 0x08, 0x8a, 0x61, 0x89, 0x61, 0xa0, 0xfc, 0x04, 0x15, 0x0a, 0x04, 0x60,
+ 0xd2, 0x78, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02,
+ 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0xcd, 0x4a, 0xcd, 0x46, 0xcd, 0x47,
+ 0xcd, 0x48, 0xc9, 0x49, 0x00, 0x02, 0xc5, 0x41, 0x07, 0xa5, 0xff, 0xee,
+ 0xe0, 0x81, 0x02, 0x25, 0xff, 0xf8, 0x04, 0x60, 0xd2, 0x74, 0x03, 0x90,
+ 0x00, 0x17, 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, 0x01, 0x6c,
+ 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0,
+ 0x01, 0x03, 0x13, 0xf8, 0x88, 0x01, 0x00, 0xe2, 0x16, 0xcd, 0xc3, 0xdd,
+ 0x16, 0xec, 0x84, 0xc4, 0x13, 0xf1, 0x61, 0x83, 0x02, 0x23, 0x00, 0x70,
+ 0x84, 0xc4, 0x16, 0xfc, 0xa1, 0x83, 0xcd, 0x4a, 0xcd, 0x46, 0xcd, 0x47,
+ 0xcd, 0x48, 0xc9, 0x49, 0x00, 0x02, 0xc5, 0x41, 0x07, 0xa5, 0xff, 0xee,
+ 0xe0, 0x81, 0x02, 0x25, 0xff, 0xf8, 0x62, 0x86, 0x15, 0x43, 0xa1, 0x8a,
+ 0xa2, 0x46, 0xa0, 0x86, 0x17, 0x21, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00,
+ 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03,
+ 0x13, 0xf8, 0x05, 0xa0, 0x10, 0x80, 0x01, 0x5e, 0x21, 0x00, 0x16, 0x03,
+ 0x07, 0x9e, 0xde, 0x8c, 0x10, 0x11, 0x01, 0x5e, 0x01, 0x00, 0x16, 0x0e,
+ 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f,
+ 0x01, 0x5e, 0x20, 0x00, 0x13, 0xf1, 0x01, 0xc0, 0x80, 0x00, 0x10, 0x02,
+ 0x05, 0xa0, 0x10, 0x80, 0xc1, 0x8a, 0x88, 0x02, 0x08, 0x8c, 0x15, 0x3f,
+ 0xc2, 0xac, 0x00, 0x04, 0x13, 0x3e, 0x01, 0x8a, 0x80, 0x00, 0xc1, 0xfc,
+ 0xc2, 0x3c, 0x04, 0xfc, 0x02, 0x8c, 0x11, 0xe8, 0x16, 0x02, 0x07, 0x8c,
+ 0x11, 0x28, 0x05, 0x06, 0x13, 0xa3, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0,
+ 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x10, 0xaf,
+ 0xa2, 0x46, 0xa2, 0x06, 0x17, 0x01, 0x05, 0x87, 0xa0, 0x86, 0x04, 0xc6,
+ 0x17, 0x93, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0,
+ 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x01, 0x5e,
+ 0x21, 0x00, 0x16, 0x03, 0x07, 0x9e, 0xde, 0x8c, 0x10, 0x8b, 0x01, 0x5e,
+ 0x01, 0x00, 0x16, 0x88, 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f,
+ 0x04, 0x80, 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00, 0x13, 0xf1, 0x01, 0xc0,
+ 0x80, 0x00, 0x04, 0x60, 0xd0, 0x9e, 0x04, 0x60, 0xd5, 0xa0, 0x03, 0x00,
+ 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03,
+ 0x13, 0xf8, 0xc2, 0xac, 0x00, 0x04, 0x16, 0xb7, 0xc3, 0xdd, 0x13, 0xf3,
+ 0x03, 0x90, 0x01, 0xb7, 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01,
+ 0x01, 0x6c, 0x10, 0xeb, 0xa1, 0x8a, 0xa2, 0x46, 0xa0, 0x86, 0x17, 0x21,
+ 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00,
+ 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x05, 0xa0, 0x10, 0x80,
+ 0x01, 0x5e, 0x21, 0x00, 0x16, 0x03, 0x07, 0x9e, 0xde, 0x8c, 0x10, 0x11,
+ 0x01, 0x5e, 0x01, 0x00, 0x16, 0x0e, 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00,
+ 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00, 0x13, 0xf1,
+ 0x01, 0xc0, 0x80, 0x00, 0x10, 0x02, 0x05, 0xa0, 0x10, 0x80, 0xc1, 0x8a,
+ 0x88, 0x02, 0x08, 0x8c, 0x15, 0x15, 0xc2, 0xac, 0x00, 0x04, 0x16, 0x14,
+ 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0,
+ 0x01, 0x03, 0x13, 0xf8, 0xc3, 0xdd, 0x13, 0xf3, 0x03, 0x90, 0x01, 0xb7,
+ 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, 0x01, 0x6c, 0x10, 0xeb,
+ 0x04, 0x60, 0xd5, 0xa0, 0x01, 0x8a, 0x80, 0x00, 0xc1, 0xfc, 0xc2, 0x3c,
+ 0x04, 0xfc, 0x02, 0x8c, 0x11, 0xe8, 0x16, 0x02, 0x07, 0x8c, 0x11, 0x28,
+ 0x05, 0x06, 0x04, 0x60, 0xd0, 0x54, 0x62, 0x86, 0x17, 0xaf, 0xa1, 0x82,
+ 0xc0, 0xa0, 0x08, 0x4c, 0x61, 0x82, 0xc3, 0xe0, 0x10, 0x82, 0x02, 0x4f,
+ 0x00, 0x1f, 0x0a, 0x2f, 0xcb, 0xc6, 0x10, 0xa8, 0xcb, 0xc3, 0x10, 0xaa,
+ 0xc1, 0x81, 0x07, 0x20, 0xfc, 0x02, 0x07, 0xa0, 0xfc, 0x04, 0x03, 0xee,
+ 0x07, 0x83, 0xfc, 0x76, 0x07, 0x89, 0x00, 0x06, 0xc2, 0xac, 0x00, 0x04,
+ 0x13, 0x08, 0xc1, 0xfc, 0xc2, 0x3c, 0x04, 0xfc, 0x02, 0x8c, 0x11, 0xe8,
+ 0x16, 0x02, 0x07, 0x8c, 0x11, 0x28, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00,
+ 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03,
+ 0x13, 0xf8, 0x05, 0xa0, 0x10, 0x82, 0x01, 0x5e, 0x21, 0x00, 0x16, 0x3b,
+ 0x07, 0x9e, 0xde, 0x8c, 0x05, 0xa0, 0x10, 0x80, 0xc4, 0xc4, 0xc8, 0x04,
+ 0xfc, 0xe6, 0xc8, 0x04, 0xfd, 0x56, 0xc8, 0x04, 0xfd, 0xc6, 0xc8, 0x04,
+ 0xfe, 0x36, 0xc8, 0x04, 0xfe, 0xa6, 0xc8, 0x04, 0xff, 0x16, 0xc8, 0x04,
+ 0xff, 0x86, 0x07, 0x8e, 0xfc, 0x00, 0xc0, 0x5e, 0x04, 0xde, 0xc8, 0x20,
+ 0x00, 0xe4, 0x01, 0x6c, 0xc3, 0xe0, 0x00, 0xe2, 0x13, 0x40, 0xc7, 0x86,
+ 0xc8, 0x06, 0x00, 0xe4, 0x04, 0xc6, 0xc2, 0x8a, 0x15, 0x31, 0x13, 0x0a,
+ 0x05, 0xa0, 0x10, 0x80, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00,
+ 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0xc2, 0xac, 0x00, 0x04,
+ 0x16, 0x19, 0xc3, 0xdd, 0x13, 0xf3, 0x03, 0x90, 0x01, 0xb7, 0x06, 0x9b,
+ 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, 0x01, 0x6c, 0x10, 0xeb, 0x01, 0x5e,
+ 0x01, 0x00, 0x16, 0xc4, 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f,
+ 0x04, 0x80, 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00, 0x13, 0xb9, 0x01, 0xc0,
+ 0x80, 0x00, 0x10, 0xb8, 0xc1, 0xfc, 0xc2, 0x3c, 0x04, 0xfc, 0x02, 0x8c,
+ 0x11, 0xe8, 0x16, 0x02, 0x07, 0x8c, 0x11, 0x28, 0xc2, 0x8a, 0x11, 0xd0,
+ 0xc3, 0xdd, 0x16, 0x02, 0x04, 0x60, 0xcf, 0xe8, 0x03, 0x90, 0x00, 0x17,
+ 0x06, 0x9b, 0x04, 0x60, 0xcf, 0xd4, 0x07, 0x8e, 0xd3, 0x1a, 0xc8, 0x20,
+ 0x08, 0x94, 0x01, 0x6a, 0x16, 0x03, 0xc8, 0x06, 0x08, 0x94, 0x04, 0x5e,
+ 0xc8, 0x06, 0xf8, 0x00, 0xc8, 0x06, 0x00, 0xe4, 0xc1, 0xa0, 0x08, 0x94,
+ 0x98, 0x20, 0xe0, 0x10, 0x01, 0x83, 0x16, 0x19, 0x01, 0xe0, 0x01, 0x9c,
+ 0x00, 0x40, 0x07, 0x8f, 0x03, 0xe8, 0x0b, 0x8f, 0x0b, 0x8f, 0x06, 0x0f,
+ 0x13, 0x1a, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40, 0x16, 0xf8, 0x01, 0x60,
+ 0x0c, 0x02, 0x01, 0x00, 0x13, 0x12, 0xd8, 0x20, 0x09, 0x2f, 0x01, 0x83,
+ 0x07, 0xa0, 0x0c, 0x02, 0x80, 0x00, 0x0b, 0x8f, 0x0b, 0x8f, 0xc8, 0x06,
+ 0x01, 0x8a, 0xc8, 0x06, 0x09, 0x18, 0x07, 0xa0, 0x00, 0x12, 0x9c, 0x56,
+ 0x01, 0xe0, 0x00, 0xe0, 0x00, 0x40, 0x04, 0xe0, 0x08, 0x94, 0xc8, 0x06,
+ 0x00, 0xe2, 0x01, 0x40, 0x20, 0x00, 0x13, 0x07, 0xc0, 0x41, 0x13, 0x03,
+ 0xc8, 0x06, 0xfc, 0x00, 0x04, 0x5e, 0xc0, 0x46, 0x04, 0x5e, 0xc3, 0xe0,
+ 0x08, 0x92, 0x16, 0xf8, 0xc8, 0x06, 0x08, 0x92, 0x04, 0x5e, 0xcd, 0x4a,
+ 0xcd, 0x46, 0xcd, 0x47, 0xcd, 0x48, 0xc9, 0x49, 0x00, 0x02, 0xc5, 0x41,
+ 0x07, 0xa5, 0xff, 0xee, 0xe0, 0x81, 0x02, 0x25, 0xff, 0xf8, 0x62, 0x86,
+ 0x15, 0x57, 0xa1, 0x8a, 0xa2, 0x46, 0xa0, 0x86, 0x17, 0x21, 0x07, 0x8e,
+ 0x01, 0x04, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02,
+ 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x05, 0xa0, 0x10, 0x80, 0x01, 0x5e,
+ 0x21, 0x00, 0x16, 0x03, 0x07, 0x9e, 0xde, 0x8c, 0x10, 0x11, 0x01, 0x5e,
+ 0x01, 0x00, 0x16, 0x0e, 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f,
+ 0x04, 0x80, 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00, 0x13, 0xf1, 0x01, 0xc0,
+ 0x80, 0x00, 0x10, 0x02, 0x05, 0xa0, 0x10, 0x80, 0xc1, 0x8a, 0x88, 0x02,
+ 0x08, 0x8c, 0x15, 0x15, 0xc2, 0xac, 0x00, 0x04, 0x16, 0x14, 0x03, 0x00,
+ 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03,
+ 0x13, 0xf8, 0xc3, 0xdd, 0x13, 0xf3, 0x03, 0x90, 0x01, 0xb7, 0x06, 0x9b,
+ 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, 0x01, 0x6c, 0x10, 0xeb, 0x04, 0x60,
+ 0xd5, 0xa0, 0x01, 0x8a, 0x80, 0x00, 0xc1, 0xfc, 0xc2, 0x3c, 0x04, 0xfc,
+ 0x02, 0x8c, 0x11, 0xe8, 0x16, 0x02, 0x07, 0x8c, 0x11, 0x28, 0x05, 0x06,
+ 0x13, 0x09, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02,
+ 0xd3, 0xa0, 0x01, 0x03, 0x13, 0xf8, 0x10, 0x9b, 0xa2, 0x06, 0x17, 0x01,
+ 0x05, 0x87, 0xa0, 0x86, 0x17, 0x1e, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00,
+ 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03,
+ 0x13, 0xf8, 0x01, 0x5e, 0x21, 0x00, 0x16, 0x03, 0x07, 0x9e, 0xde, 0x8c,
+ 0x10, 0x0e, 0x01, 0x5e, 0x01, 0x00, 0x16, 0x0b, 0xc3, 0xde, 0x01, 0xcf,
+ 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00,
+ 0x13, 0xf1, 0x01, 0xc0, 0x80, 0x00, 0xc1, 0x81, 0x07, 0x20, 0xfc, 0x02,
+ 0x07, 0x83, 0xfc, 0x76, 0x07, 0x89, 0x00, 0x06, 0x07, 0x8e, 0xfc, 0x00,
+ 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0,
+ 0x01, 0x03, 0x13, 0xf8, 0xc4, 0xc4, 0xc8, 0x04, 0xfc, 0xe6, 0xc8, 0x04,
+ 0xfd, 0x56, 0xc8, 0x04, 0xfd, 0xc6, 0xc8, 0x04, 0xfe, 0x36, 0xc8, 0x04,
+ 0xfe, 0xa6, 0xc8, 0x04, 0xff, 0x16, 0xc8, 0x04, 0xff, 0x86, 0xc0, 0x5e,
+ 0x04, 0xde, 0xc8, 0x20, 0x00, 0xe4, 0x01, 0x6c, 0xc3, 0xe0, 0x00, 0xe2,
+ 0x13, 0x08, 0xc7, 0x86, 0xc8, 0x06, 0x00, 0xe4, 0x04, 0xc6, 0xc8, 0x01,
+ 0x01, 0x6c, 0x04, 0x60, 0xd0, 0x9e, 0x07, 0x8e, 0xd5, 0x8e, 0x04, 0x60,
+ 0xd3, 0x98, 0x62, 0x46, 0x60, 0x86, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0,
+ 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x88, 0x01,
+ 0x00, 0xe2, 0x16, 0x0a, 0xc3, 0xdd, 0x13, 0xf3, 0x03, 0x90, 0x00, 0x17,
+ 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, 0x01, 0x6c, 0x10, 0xeb,
+ 0xc0, 0xe0, 0xfc, 0x02, 0x13, 0x09, 0xc1, 0xa0, 0x08, 0x8a, 0x61, 0x89,
+ 0x61, 0xa0, 0xfc, 0x04, 0x06, 0x20, 0x10, 0x80, 0x04, 0x60, 0xd2, 0x78,
+ 0x07, 0x86, 0x03, 0xf4, 0x61, 0x89, 0xa0, 0x86, 0x15, 0x02, 0x07, 0x82,
+ 0x7f, 0xff, 0xc1, 0x81, 0x07, 0x20, 0xfc, 0x02, 0x07, 0xa0, 0xfc, 0x04,
+ 0x03, 0xee, 0x07, 0x83, 0xfc, 0x76, 0x07, 0x89, 0x00, 0x06, 0x07, 0x8e,
+ 0xfc, 0x00, 0xc4, 0xc4, 0xc8, 0x04, 0xfc, 0xe6, 0xc8, 0x04, 0xfd, 0x56,
+ 0xc8, 0x04, 0xfd, 0xc6, 0xc8, 0x04, 0xfe, 0x36, 0xc8, 0x04, 0xfe, 0xa6,
+ 0xc8, 0x04, 0xff, 0x16, 0xc8, 0x04, 0xff, 0x86, 0xc0, 0x5e, 0x04, 0xde,
+ 0xc8, 0x20, 0x00, 0xe4, 0x01, 0x6c, 0xc3, 0xe0, 0x00, 0xe2, 0x13, 0x07,
+ 0xc7, 0x86, 0xc8, 0x06, 0x00, 0xe4, 0x04, 0xc6, 0xc8, 0x01, 0x01, 0x6c,
+ 0x10, 0xae, 0x07, 0x8e, 0xd6, 0x40, 0x04, 0x60, 0xd3, 0x98, 0xc1, 0x60,
+ 0xf8, 0x00, 0x83, 0x05, 0x13, 0x0c, 0xc8, 0x05, 0x01, 0x6a, 0xc2, 0x20,
+ 0xf8, 0x02, 0x13, 0xf7, 0x15, 0x14, 0x06, 0xa0, 0x97, 0xb6, 0xc0, 0x60,
+ 0xf8, 0x00, 0x83, 0x01, 0x16, 0x6d, 0x04, 0x60, 0xb9, 0xc0, 0x06, 0xa0,
+ 0xf9, 0x32, 0x80, 0x45, 0x16, 0x4f, 0x04, 0x60, 0xb9, 0xc0, 0x06, 0xa0,
+ 0x97, 0xb6, 0xc2, 0x20, 0xf8, 0x02, 0x11, 0xfb, 0x13, 0xe2, 0x01, 0xa0,
+ 0x07, 0x78, 0x40, 0x00, 0xc1, 0x41, 0xc0, 0x60, 0xf8, 0x00, 0x01, 0x48,
+ 0x00, 0x01, 0x16, 0x3e, 0x04, 0xe0, 0xf8, 0x00, 0x07, 0x8b, 0x03, 0xea,
+ 0x62, 0xe0, 0xf8, 0x04, 0xc8, 0x0b, 0xf8, 0x04, 0x85, 0x05, 0x16, 0x02,
+ 0xc5, 0x01, 0x10, 0x10, 0xc8, 0x14, 0x01, 0x6a, 0x88, 0x05, 0xf8, 0x00,
+ 0x13, 0x06, 0xc8, 0x20, 0xf8, 0x00, 0x01, 0x6a, 0x88, 0x05, 0xf8, 0x00,
+ 0x16, 0xfa, 0xc8, 0x01, 0xf8, 0x00, 0x16, 0x02, 0xc0, 0xa0, 0x01, 0x6a,
+ 0x01, 0x08, 0xfe, 0x00, 0x16, 0xcc, 0xc8, 0x05, 0x01, 0x6a, 0x01, 0xe0,
+ 0xf8, 0x02, 0x00, 0x20, 0x07, 0x87, 0x06, 0x30, 0x01, 0xe7, 0x00, 0x04,
+ 0x00, 0x40, 0x04, 0xd7, 0x02, 0x27, 0x00, 0x0c, 0xa1, 0x45, 0xc9, 0x60,
+ 0xf8, 0x00, 0x0c, 0x32, 0x04, 0xe0, 0xf8, 0x00, 0x09, 0x15, 0xc2, 0x57,
+ 0x16, 0x03, 0xcd, 0xc5, 0xc5, 0xc5, 0x10, 0x06, 0x05, 0xc7, 0xc8, 0x17,
+ 0x01, 0x6a, 0xc8, 0x05, 0xf8, 0x00, 0xc5, 0xc5, 0x83, 0x01, 0x13, 0xa9,
+ 0xc8, 0x01, 0x01, 0x6a, 0x01, 0x20, 0xf8, 0x06, 0x00, 0xc0, 0x13, 0xad,
+ 0x01, 0x60, 0xf8, 0x02, 0x01, 0x00, 0x16, 0x05, 0xc0, 0x60, 0xf8, 0x00,
+ 0x83, 0x01, 0x16, 0xf2, 0x10, 0x9a, 0x07, 0xa0, 0x00, 0x12, 0xd7, 0xa4,
+ 0xc0, 0x60, 0xf8, 0x00, 0x83, 0x01, 0x13, 0x93, 0xc8, 0x01, 0x01, 0x6a,
+ 0x01, 0x60, 0xf8, 0x02, 0x01, 0x00, 0x16, 0x89, 0x07, 0xa0, 0x00, 0x12,
+ 0xd7, 0x5e, 0x10, 0xea, 0x03, 0x00, 0x00, 0x02, 0xc3, 0x20, 0x01, 0x8a,
+ 0x13, 0x1d, 0x83, 0x01, 0x13, 0x0e, 0xc8, 0x01, 0x01, 0x6a, 0x01, 0x20,
+ 0xf8, 0x06, 0x00, 0xc0, 0x13, 0x86, 0x01, 0x60, 0xf8, 0x02, 0x01, 0x00,
+ 0x16, 0x07, 0xc0, 0x60, 0xf8, 0x00, 0x83, 0x01, 0x16, 0xf2, 0x03, 0x90,
+ 0xbf, 0xff, 0x03, 0x80, 0x07, 0xa0, 0x00, 0x12, 0xd7, 0xa4, 0xc0, 0x60,
+ 0xf8, 0x00, 0x83, 0x01, 0x16, 0x0b, 0x03, 0x90, 0xbf, 0xff, 0x03, 0x80,
+ 0x10, 0x18, 0x03, 0x00, 0x00, 0x02, 0xc3, 0x20, 0x01, 0x8a, 0x13, 0x13,
+ 0x83, 0x01, 0x13, 0x0e, 0xc8, 0x01, 0x01, 0x6a, 0x01, 0x60, 0xf8, 0x02,
+ 0x01, 0x00, 0x16, 0x04, 0x07, 0xa0, 0x00, 0x12, 0xd7, 0x5e, 0x10, 0xdd,
+ 0xc0, 0x60, 0xf8, 0x00, 0x83, 0x01, 0x16, 0xf2, 0x03, 0x90, 0xbf, 0xff,
+ 0x03, 0x80, 0x07, 0x8b, 0x9c, 0x72, 0xc3, 0x01, 0x13, 0x39, 0xc2, 0x4c,
+ 0xc8, 0x0c, 0x01, 0x6a, 0xc2, 0x20, 0xf8, 0x02, 0x11, 0x2d, 0xc2, 0x4c,
+ 0xc3, 0x20, 0xf8, 0x00, 0x16, 0xf7, 0xc8, 0x09, 0x01, 0x6a, 0xc2, 0x20,
+ 0xf8, 0x02, 0x16, 0x2a, 0x01, 0xe0, 0xf8, 0x02, 0x19, 0x00, 0x05, 0xa0,
+ 0x13, 0x80, 0x10, 0x24, 0x01, 0xe0, 0xf8, 0x02, 0x19, 0x00, 0x05, 0xa0,
+ 0x13, 0x80, 0xc8, 0x0c, 0x01, 0x8a, 0x07, 0x89, 0x09, 0x18, 0xc2, 0x19,
+ 0x13, 0x01, 0x05, 0xc9, 0xc6, 0x4c, 0xc2, 0x20, 0x00, 0x12, 0x02, 0x88,
+ 0xd7, 0x5e, 0x16, 0x03, 0x01, 0xc0, 0x00, 0x40, 0x10, 0x05, 0x02, 0x88,
+ 0xd7, 0xa4, 0x16, 0x05, 0x01, 0x80, 0x40, 0x40, 0x07, 0xa0, 0x00, 0x12,
+ 0x9c, 0x56, 0x04, 0x5b, 0xc8, 0x09, 0x01, 0x6a, 0xc2, 0x20, 0xf8, 0x02,
+ 0x16, 0xe2, 0x10, 0xdc, 0xc2, 0x20, 0x0c, 0x02, 0x11, 0x01, 0x10, 0xe5,
+ 0xd8, 0x20, 0xe0, 0x10, 0x01, 0x83, 0x07, 0x88, 0x00, 0x05, 0x0b, 0x88,
+ 0x0b, 0x88, 0x06, 0x08, 0x16, 0xfc, 0x07, 0xa0, 0x01, 0x8a, 0x00, 0x43,
+ 0x10, 0xd8, 0x20, 0x00, 0xd8, 0x70, 0x00, 0x7f, 0x00, 0x00, 0x20, 0x00,
+ 0xf8, 0x30, 0x05, 0xec, 0x68, 0x04, 0x09, 0x32, 0xd3, 0xcf, 0x16, 0x30,
+ 0x01, 0x4f, 0x00, 0x80, 0x16, 0x2d, 0x01, 0x0e, 0x00, 0x03, 0x16, 0x2a,
+ 0xd1, 0x04, 0x13, 0x01, 0x07, 0x04, 0x06, 0xc4, 0x07, 0x03, 0x07, 0x88,
+ 0x07, 0x23, 0xb6, 0x04, 0x18, 0x0d, 0x01, 0x4d, 0x00, 0x02, 0x13, 0x0f,
+ 0xc0, 0x60, 0x06, 0x7c, 0x02, 0x81, 0x06, 0x30, 0x13, 0x0a, 0x07, 0x88,
+ 0x80, 0x18, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x05, 0x76, 0x04, 0x96, 0x03,
+ 0x13, 0x02, 0xd6, 0x01, 0x10, 0xee, 0x07, 0x88, 0x07, 0x2f, 0xb6, 0x04,
+ 0x18, 0x03, 0x96, 0x03, 0x13, 0x05, 0x04, 0x5c, 0x76, 0x04, 0x96, 0x03,
+ 0x13, 0x05, 0xd6, 0x03, 0x07, 0x83, 0x80, 0x40, 0x06, 0xa0, 0xe3, 0x56,
+ 0x04, 0x5c, 0x03, 0x00, 0x00, 0x02, 0xc1, 0x4b, 0x02, 0x85, 0x00, 0x43,
+ 0x13, 0x2c, 0x01, 0x60, 0x09, 0x6a, 0x00, 0x04, 0x16, 0x06, 0xc8, 0x05,
+ 0x01, 0x6c, 0x01, 0x60, 0xfc, 0x02, 0x00, 0x20, 0x13, 0x07, 0x06, 0xa0,
+ 0xf9, 0x32, 0x03, 0x90, 0x04, 0x77, 0x03, 0x80, 0xc8, 0x0a, 0x01, 0x6c,
+ 0xc2, 0xa0, 0xfc, 0x00, 0x16, 0xfb, 0xc2, 0xa0, 0x01, 0x6c, 0x07, 0x89,
+ 0x03, 0xea, 0x62, 0x60, 0xfc, 0x04, 0xc8, 0x09, 0xfc, 0x04, 0x07, 0x89,
+ 0x05, 0xf8, 0xc2, 0xd9, 0x16, 0x02, 0xce, 0x45, 0x10, 0x05, 0x05, 0xc9,
+ 0xc8, 0x19, 0x01, 0x6c, 0xc8, 0x05, 0xfc, 0x00, 0xc6, 0x4a, 0x01, 0xa0,
+ 0x07, 0x78, 0x07, 0xff, 0x10, 0xe0, 0x07, 0xa0, 0x0c, 0x02, 0x80, 0x00,
+ 0x07, 0xa0, 0x0c, 0x04, 0x00, 0x28, 0xc0, 0x41, 0x16, 0xd8, 0xd8, 0x20,
+ 0xe0, 0x10, 0x01, 0x83, 0x07, 0x89, 0x00, 0x05, 0x0b, 0x89, 0x0b, 0x89,
+ 0x06, 0x09, 0x16, 0xfc, 0xc8, 0x05, 0x01, 0x8a, 0x07, 0xa0, 0x00, 0x12,
+ 0x9c, 0x56, 0x01, 0xe0, 0x00, 0xe0, 0x00, 0x40, 0x10, 0xc6, 0xc2, 0x85,
+ 0xc2, 0x60, 0x07, 0x80, 0xc8, 0x0a, 0x01, 0x6a, 0x07, 0x20, 0xf8, 0x02,
+ 0x07, 0xa0, 0xf8, 0x04, 0x03, 0xee, 0xc8, 0x09, 0xf8, 0x76, 0xc8, 0x09,
+ 0xf8, 0xe6, 0xc8, 0x09, 0xf9, 0x56, 0xc8, 0x09, 0xf9, 0xc6, 0xc8, 0x09,
+ 0xfa, 0x36, 0xc8, 0x09, 0xfa, 0xa6, 0xc8, 0x09, 0xfb, 0x16, 0xc8, 0x09,
+ 0xfb, 0x86, 0xc8, 0x09, 0xfb, 0xf6, 0xc2, 0xa0, 0xf8, 0x00, 0x16, 0xe4,
+ 0xc2, 0xa0, 0x01, 0x6a, 0xc0, 0x41, 0x13, 0x06, 0xc8, 0x02, 0x01, 0x6a,
+ 0xc8, 0x05, 0xf8, 0x00, 0xc0, 0x8a, 0x04, 0x5b, 0xc8, 0x20, 0x08, 0x94,
+ 0x01, 0x6a, 0x16, 0x05, 0x82, 0x85, 0x16, 0x07, 0xc8, 0x05, 0x08, 0x94,
+ 0x04, 0x5b, 0xc8, 0x05, 0xf8, 0x00, 0xc1, 0x60, 0x08, 0x94, 0x98, 0x20,
+ 0xe0, 0x10, 0x01, 0x83, 0x16, 0x19, 0x01, 0xe0, 0x01, 0x9c, 0x00, 0x40,
+ 0x07, 0x89, 0x03, 0xe8, 0x0b, 0x89, 0x0b, 0x89, 0x06, 0x09, 0x13, 0x14,
+ 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40, 0x16, 0xf8, 0x01, 0x60, 0x0c, 0x02,
+ 0x01, 0x00, 0x13, 0x0c, 0xd8, 0x20, 0x09, 0x2f, 0x01, 0x83, 0x07, 0xa0,
+ 0x0c, 0x02, 0x80, 0x00, 0x0b, 0x89, 0x0b, 0x89, 0xc8, 0x05, 0x01, 0x8a,
+ 0xc8, 0x05, 0x09, 0x18, 0x04, 0xe0, 0x08, 0x94, 0xc0, 0x54, 0x16, 0x02,
+ 0xc5, 0x05, 0x10, 0x04, 0xc8, 0x02, 0x01, 0x6a, 0xc8, 0x05, 0xf8, 0x00,
+ 0xc0, 0x45, 0xc0, 0x8a, 0x07, 0xa0, 0x00, 0x12, 0x9c, 0x56, 0x01, 0xe0,
+ 0x00, 0xe0, 0x00, 0x40, 0x04, 0x5b, 0x07, 0x20, 0x0c, 0xb8, 0x07, 0x83,
+ 0x80, 0x00, 0x04, 0x5b, 0x07, 0xa0, 0xfc, 0x04, 0x03, 0xee, 0xc2, 0x20,
+ 0x07, 0x80, 0xc8, 0x08, 0xfc, 0x76, 0xc8, 0x08, 0xfc, 0xe6, 0xc8, 0x08,
+ 0xfd, 0x56, 0xc8, 0x08, 0xfd, 0xc6, 0xc8, 0x08, 0xfe, 0x36, 0xc8, 0x08,
+ 0xfe, 0xa6, 0xc8, 0x08, 0xff, 0x16, 0xc8, 0x08, 0xff, 0x86, 0xc8, 0x08,
+ 0xff, 0xf6, 0x04, 0x60, 0xc0, 0xc6, 0xc3, 0xa0, 0x00, 0xe2, 0xc8, 0x0e,
+ 0x08, 0x66, 0xc8, 0x0e, 0x01, 0x6c, 0xc3, 0xa0, 0xfc, 0x00, 0x06, 0x0d,
+ 0x16, 0xfa, 0x04, 0xe0, 0xfc, 0x00, 0xc8, 0x20, 0x01, 0x6c, 0x08, 0x7c,
+ 0xc8, 0x0e, 0x00, 0xe2, 0xc8, 0x0e, 0x07, 0x7a, 0x04, 0xe0, 0x08, 0x94,
+ 0x04, 0xe0, 0x0c, 0xb8, 0x07, 0x8d, 0x00, 0x10, 0x04, 0x5b, 0x03, 0x00,
+ 0x00, 0x02, 0x07, 0x09, 0xc2, 0xa0, 0x01, 0x04, 0x01, 0x8a, 0x00, 0x80,
+ 0x52, 0x4a, 0xd2, 0x89, 0x01, 0xca, 0x25, 0x00, 0xc8, 0x0a, 0x01, 0x04,
+ 0xd2, 0xa0, 0x01, 0x04, 0x01, 0x0a, 0xda, 0x00, 0x16, 0xf5, 0x52, 0x4a,
+ 0x01, 0xa0, 0x08, 0xa0, 0xff, 0x00, 0x07, 0xa0, 0x08, 0xa8, 0x10, 0x00,
+ 0x01, 0xc9, 0x05, 0x00, 0x07, 0x8a, 0x07, 0x78, 0x02, 0x89, 0x5f, 0xff,
+ 0x16, 0x19, 0x01, 0x5a, 0x80, 0x00, 0x16, 0x0f, 0x07, 0x89, 0xde, 0x8c,
+ 0x01, 0x20, 0x07, 0x58, 0x20, 0xfe, 0x13, 0x02, 0x01, 0x89, 0x04, 0x00,
+ 0xc8, 0x09, 0x01, 0x04, 0x01, 0x9a, 0x80, 0x00, 0x03, 0x90, 0xff, 0xff,
+ 0x03, 0x80, 0x01, 0x20, 0x07, 0x58, 0x20, 0xfe, 0x16, 0x22, 0x03, 0x90,
+ 0xff, 0xff, 0x03, 0x80, 0x05, 0x49, 0x01, 0x89, 0x80, 0x00, 0x01, 0x49,
+ 0x40, 0x00, 0x13, 0x23, 0x01, 0x49, 0x20, 0x00, 0x16, 0x2f, 0x01, 0x5a,
+ 0x80, 0x00, 0x16, 0x0e, 0x01, 0x9a, 0x80, 0x00, 0x07, 0x8a, 0xde, 0x8c,
+ 0x01, 0x20, 0x07, 0x58, 0x20, 0xfe, 0x13, 0x02, 0x01, 0x8a, 0x04, 0x00,
+ 0xc8, 0x0a, 0x01, 0x04, 0x01, 0x89, 0x20, 0x00, 0xd2, 0x49, 0x16, 0x05,
+ 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x07, 0x89, 0x20, 0x00, 0xf8, 0x09,
+ 0x07, 0x3a, 0xc2, 0x60, 0x07, 0x36, 0x13, 0xf6, 0x04, 0xe0, 0x07, 0x36,
+ 0x04, 0x54, 0x04, 0xca, 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a,
+ 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a,
+ 0x06, 0x0a, 0x16, 0xf4, 0x04, 0x60, 0xb3, 0xf0, 0x01, 0x5a, 0x80, 0x00,
+ 0x13, 0x04, 0x01, 0x20, 0x07, 0x58, 0x20, 0xfe, 0x13, 0xdb, 0xc2, 0xa0,
+ 0x01, 0x04, 0x01, 0xca, 0xff, 0x00, 0x01, 0x8a, 0x04, 0x80, 0xc8, 0x0a,
+ 0x01, 0x04, 0x01, 0x60, 0x01, 0x04, 0x20, 0x00, 0x16, 0xcf, 0x01, 0xc9,
+ 0x20, 0x00, 0x07, 0x8a, 0x07, 0x78, 0x10, 0xb9, 0x01, 0x60, 0x07, 0x58,
+ 0x10, 0x00, 0x16, 0x13, 0x01, 0x20, 0x05, 0xee, 0x00, 0x07, 0x16, 0x0f,
+ 0xc1, 0xa0, 0x08, 0xa0, 0x06, 0xc6, 0xd1, 0xe0, 0x01, 0x03, 0x13, 0x14,
+ 0x71, 0x86, 0x06, 0xc6, 0x01, 0x20, 0x01, 0x04, 0x20, 0x00, 0x13, 0x22,
+ 0x71, 0x86, 0xc8, 0x06, 0x08, 0xa0, 0x01, 0x60, 0x01, 0x82, 0x20, 0x00,
+ 0x16, 0x06, 0x01, 0xa0, 0x01, 0x82, 0x20, 0x00, 0x01, 0xe0, 0x01, 0x82,
+ 0x20, 0x00, 0x04, 0x5b, 0x07, 0x87, 0x01, 0x0c, 0x07, 0x88, 0x08, 0xa2,
+ 0x02, 0x26, 0xff, 0x00, 0x18, 0x04, 0xce, 0x37, 0xce, 0x37, 0xc6, 0x17,
+ 0x10, 0xe2, 0x8e, 0x37, 0x16, 0xdf, 0x8e, 0x37, 0x16, 0xdd, 0x86, 0x17,
+ 0x16, 0xdb, 0xd1, 0x86, 0x16, 0xda, 0x10, 0x11, 0x02, 0x26, 0x01, 0x00,
+ 0x18, 0x0e, 0x19, 0xdb, 0xc1, 0xe0, 0x01, 0x04, 0x01, 0xc7, 0xff, 0x00,
+ 0x01, 0x87, 0x04, 0x80, 0xc8, 0x07, 0x01, 0x04, 0x01, 0x20, 0x01, 0x04,
+ 0x20, 0x00, 0x16, 0xce, 0x10, 0xce, 0x04, 0xe0, 0x08, 0xa8, 0x04, 0x5b,
+ 0xc0, 0xe0, 0x07, 0x5c, 0xc8, 0x03, 0x01, 0x6c, 0xc3, 0x43, 0xc2, 0xc3,
+ 0xa2, 0xcb, 0xc2, 0xeb, 0x0c, 0x32, 0xc8, 0x0b, 0xfc, 0x00, 0x13, 0x07,
+ 0xc8, 0x0b, 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x00, 0x16, 0xfb, 0xc3, 0x60,
+ 0x01, 0x6c, 0x07, 0x8b, 0x03, 0xea, 0x62, 0xe0, 0xfc, 0x04, 0xc8, 0x0b,
+ 0xfc, 0x04, 0x07, 0x8b, 0x05, 0xf8, 0x03, 0x00, 0x00, 0x02, 0xc3, 0x9b,
+ 0x16, 0x02, 0xce, 0xc3, 0x10, 0x05, 0x05, 0xcb, 0xc8, 0x1b, 0x01, 0x6c,
+ 0xc8, 0x03, 0xfc, 0x00, 0xc6, 0xcd, 0x01, 0xa0, 0x07, 0x78, 0x07, 0xff,
+ 0x03, 0x00, 0x00, 0x0f, 0x04, 0x20, 0xea, 0x7a, 0x07, 0x8e, 0x01, 0x04,
+ 0x03, 0x00, 0x00, 0x02, 0xc3, 0xde, 0x01, 0x4f, 0x20, 0x00, 0x16, 0x08,
+ 0x01, 0x20, 0x07, 0x78, 0x80, 0x00, 0x16, 0x04, 0x03, 0x00, 0x00, 0x0f,
+ 0x04, 0x60, 0xc5, 0xc6, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80,
+ 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00, 0x16, 0x04, 0x01, 0x60, 0x07, 0x78,
+ 0x80, 0x00, 0x16, 0xf0, 0xc3, 0xdd, 0x02, 0x4f, 0x00, 0x0f, 0xe1, 0x2f,
+ 0xe0, 0x14, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x5b, 0x03, 0x00, 0x00, 0x0f,
+ 0x10, 0x08, 0x06, 0xa0, 0xc7, 0x7e, 0x01, 0xc2, 0xff, 0x80, 0x01, 0x82,
+ 0x24, 0x00, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, 0x00, 0x02, 0x01, 0x5e,
+ 0x20, 0x00, 0x16, 0xf0, 0xc7, 0x82, 0x03, 0x00, 0x00, 0x0f, 0x03, 0x90,
+ 0x60, 0x3f, 0x04, 0x59, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, 0x00, 0x02,
+ 0x01, 0x5e, 0x20, 0x00, 0x13, 0x06, 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00,
+ 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x60,
+ 0xc5, 0x60, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, 0x00, 0x02, 0x01, 0x5e,
+ 0x20, 0x00, 0x16, 0x10, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x60, 0xc6, 0x22,
+ 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, 0x00, 0x02, 0x01, 0x5e, 0x20, 0x00,
+ 0x16, 0x09, 0x07, 0xa0, 0x01, 0x04, 0xdb, 0x86, 0x01, 0x85, 0x58, 0x00,
+ 0x03, 0x00, 0x00, 0x0f, 0x04, 0x60, 0xc5, 0x6a, 0xc3, 0xde, 0x01, 0xcf,
+ 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00,
+ 0x13, 0xee, 0x01, 0xc0, 0x00, 0x80, 0x01, 0xc5, 0x58, 0x00, 0x10, 0xee,
+ 0x07, 0x8e, 0x80, 0x20, 0xc2, 0x60, 0x01, 0x62, 0x04, 0xe0, 0x01, 0x62,
+ 0x07, 0x8c, 0x09, 0x34, 0xcf, 0x1e, 0x11, 0x16, 0xc3, 0x5e, 0xc3, 0xfe,
+ 0xcf, 0x1e, 0xe3, 0x5e, 0xa3, 0xfe, 0xcf, 0x1e, 0xe3, 0x5e, 0x13, 0x0e,
+ 0xa3, 0xfe, 0x83, 0xfe, 0x16, 0x0b, 0xc3, 0x7e, 0x05, 0x4d, 0x83, 0x6e,
+ 0xff, 0xf6, 0x16, 0x06, 0x02, 0x8e, 0x80, 0x30, 0x16, 0xf8, 0xc8, 0x09,
+ 0x01, 0x62, 0x04, 0x5b, 0xc8, 0x09, 0x01, 0x62, 0x07, 0x20, 0x09, 0x34,
+ 0x04, 0x5b, 0x04, 0xe0, 0x01, 0x68, 0xc8, 0x20, 0x07, 0xe4, 0x01, 0x18,
+ 0xc3, 0x60, 0x07, 0xe2, 0x07, 0x8f, 0x00, 0x81, 0xd3, 0xe0, 0x07, 0xf4,
+ 0x01, 0x4d, 0x40, 0x00, 0x16, 0x01, 0x05, 0x8f, 0xc8, 0x0f, 0x07, 0xf8,
+ 0x07, 0x8f, 0x00, 0x81, 0xd3, 0xe0, 0x07, 0xee, 0x01, 0x4d, 0x80, 0x00,
+ 0x16, 0x01, 0x05, 0x8f, 0xc8, 0x0f, 0x07, 0xee, 0x01, 0x8d, 0xc0, 0x00,
+ 0xc8, 0x0d, 0x01, 0x1a, 0x04, 0x60, 0xc4, 0x16, 0x07, 0x8c, 0xee, 0x00,
+ 0x06, 0xa0, 0x90, 0x94, 0x07, 0x8c, 0xed, 0x90, 0x06, 0xa0, 0x90, 0x94,
+ 0x04, 0xe0, 0x01, 0x04, 0x04, 0x60, 0xc5, 0x6a, 0x02, 0x85, 0x00, 0x0e,
+ 0x1a, 0x05, 0x01, 0x09, 0x0f, 0x00, 0x13, 0x02, 0x04, 0x60, 0xdd, 0x6a,
+ 0x99, 0x49, 0xea, 0xd0, 0x04, 0x60, 0xdd, 0x54, 0x20, 0x00, 0xb3, 0xcc,
+ 0x00, 0x14, 0x07, 0x8b, 0x01, 0x04, 0x01, 0x5b, 0x20, 0x00, 0x16, 0xfd,
+ 0xd8, 0x20, 0x07, 0xdf, 0x01, 0x17, 0x07, 0x9b, 0xdf, 0x80, 0x20, 0x00,
+ 0xff, 0xc0, 0x00, 0x2a, 0x03, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x01, 0x00,
+ 0x00, 0x80, 0x06, 0x4e, 0x02, 0x01, 0xef, 0xfa, 0xcc, 0x4d, 0xcc, 0x4e,
+ 0xc4, 0x4f, 0x02, 0x00, 0x00, 0x01, 0xc8, 0x00, 0xef, 0xe0, 0x88, 0x00,
+ 0xef, 0xe0, 0x13, 0xfd, 0x02, 0xe0, 0xef, 0xe0, 0x03, 0x80, 0x20, 0x00,
+ 0xae, 0x00, 0x00, 0xaa, 0xc3, 0xce, 0x10, 0x32, 0x00, 0x00, 0xc0, 0x3c,
+ 0x08, 0x4e, 0x00, 0x00, 0xc0, 0x20, 0x07, 0x78, 0x00, 0x00, 0x00, 0x02,
+ 0x08, 0x56, 0x01, 0x0c, 0x00, 0x08, 0x08, 0x62, 0x03, 0xf8, 0x00, 0x06,
+ 0x00, 0x00, 0x12, 0x00, 0x00, 0x02, 0x08, 0x7e, 0x01, 0x8c, 0x00, 0x02,
+ 0x07, 0x78, 0x07, 0xff, 0x00, 0x06, 0x07, 0x7e, 0xfc, 0x76, 0xbe, 0xad,
+ 0x01, 0x0a, 0x00, 0x08, 0x07, 0x8a, 0x00, 0x06, 0x00, 0x00, 0xcf, 0x7a,
+ 0x11, 0x28, 0x00, 0x04, 0x13, 0xa0, 0x13, 0xa0, 0x90, 0x2a, 0x00, 0x02,
+ 0x08, 0x96, 0x97, 0x6a, 0xc0, 0x04, 0x08, 0x9e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x80, 0x9d, 0xc8, 0x01, 0x80, 0x01, 0x00, 0x01, 0x38, 0x01, 0x7c,
+ 0x01, 0xce, 0x02, 0x32, 0x02, 0xae, 0x03, 0x42, 0x03, 0xf8, 0x03, 0xf8,
+ 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8,
+ 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8,
+ 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8,
+ 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8,
+ 0x03, 0xf8, 0x03, 0xf8, 0xcc, 0x00, 0x20, 0x00, 0xb2, 0x98, 0x00, 0x04,
+ 0x02, 0x09, 0x14, 0x00, 0x20, 0x00, 0xb2, 0xa8, 0x00, 0x02, 0x90, 0x00,
+ 0x20, 0x00, 0xb1, 0x00, 0x00, 0x02, 0x90, 0x00, 0x20, 0x00, 0xf8, 0x08,
+ 0x00, 0x02, 0x90, 0x00, 0x20, 0x00, 0xc8, 0xbe, 0x00, 0x04, 0xc2, 0xcb,
+ 0xc2, 0xcb, 0x20, 0x00, 0xbf, 0xb4, 0x00, 0x08, 0x88, 0x0b, 0x07, 0x98,
+ 0x88, 0x0b, 0x07, 0x78, 0x20, 0x00, 0xc0, 0x54, 0x00, 0x04, 0x06, 0xa0,
+ 0xfa, 0x06, 0x20, 0x00, 0xc0, 0x5e, 0x00, 0x04, 0x07, 0x84, 0x07, 0x7a,
+ 0x20, 0x00, 0xc0, 0xc2, 0x00, 0x04, 0x04, 0x60, 0xfa, 0x10, 0x20, 0x00,
+ 0xc9, 0xc0, 0x00, 0x02, 0x16, 0xe2, 0x20, 0x00, 0xc9, 0xc2, 0x00, 0x04,
+ 0x06, 0xa0, 0xfa, 0x42, 0x20, 0x00, 0xc9, 0xe8, 0x00, 0x04, 0x04, 0x60,
+ 0xca, 0x0c, 0x20, 0x00, 0xb9, 0xa0, 0x00, 0x04, 0x04, 0x60, 0x98, 0xa0,
+ 0x20, 0x00, 0xbb, 0x92, 0x00, 0x04, 0x06, 0xa0, 0x9a, 0xf4, 0x20, 0x00,
+ 0xbc, 0x20, 0x00, 0x04, 0xc1, 0xe0, 0xfc, 0x02, 0x20, 0x00, 0xc5, 0x5c,
+ 0x00, 0x04, 0x04, 0x60, 0xfc, 0xec, 0x20, 0x00, 0xc5, 0xa2, 0x00, 0x04,
+ 0x04, 0x60, 0xfc, 0x78, 0x20, 0x00, 0xc5, 0xda, 0x00, 0x04, 0x04, 0x60,
+ 0xfc, 0xc6, 0x20, 0x00, 0xc6, 0x1c, 0x00, 0x04, 0x04, 0x60, 0xfd, 0x0e,
+ 0x20, 0x00, 0xc2, 0xe6, 0x00, 0x06, 0x01, 0x20, 0x01, 0x00, 0x00, 0x80,
+ 0x20, 0x00, 0xc3, 0xd4, 0x00, 0x02, 0x01, 0x17, 0x20, 0x00, 0xa2, 0xca,
+ 0x00, 0x02, 0xc5, 0x60, 0x20, 0x00, 0xa2, 0xd2, 0x00, 0x02, 0xfd, 0x24,
+ 0x20, 0x00, 0xa2, 0xf2, 0x00, 0x02, 0xfd, 0x24, 0x20, 0x00, 0xa3, 0x18,
+ 0x00, 0x02, 0xce, 0x98, 0x20, 0x00, 0xc5, 0x6e, 0x00, 0x02, 0x10, 0x0c,
+ 0x20, 0x00, 0xc4, 0x0c, 0x00, 0x04, 0x06, 0xa0, 0xfd, 0xaa, 0x20, 0x00,
+ 0xcc, 0x38, 0x00, 0x02, 0xc7, 0x7e, 0x20, 0x00, 0xa0, 0xc4, 0x00, 0x02,
+ 0xc7, 0x7e, 0x20, 0x00, 0xc5, 0xec, 0x00, 0x02, 0xc7, 0xb4, 0x20, 0x00,
+ 0xa0, 0xc0, 0x00, 0x02, 0xc7, 0xb4, 0x20, 0x00, 0xc5, 0x14, 0x00, 0x04,
+ 0x04, 0x60, 0xfd, 0xec, 0x20, 0x00, 0xc4, 0xe6, 0x00, 0x04, 0x06, 0xa0,
+ 0xfd, 0x60, 0x20, 0x00, 0xc8, 0x2c, 0x00, 0x02, 0x06, 0x69, 0x20, 0x00,
+ 0xcc, 0x60, 0x00, 0x02, 0x06, 0x69, 0x20, 0x00, 0xdc, 0x68, 0x00, 0x02,
+ 0x04, 0x5c, 0x20, 0x00, 0xdc, 0xb8, 0x00, 0x04, 0x04, 0x60, 0xf8, 0x30,
+ 0x20, 0x00, 0xdd, 0x50, 0x00, 0x04, 0x04, 0x60, 0xfe, 0x04, 0x20, 0x80,
+ 0xb4, 0x88, 0x00, 0x02, 0xfb, 0x88, 0x20, 0x80, 0xdf, 0x06, 0x00, 0x02,
+ 0x08, 0xa8, 0x20, 0x00, 0xa0, 0x34, 0x00, 0x0a, 0x00, 0x02, 0x28, 0xf1,
+ 0xf0, 0xf1, 0xf8, 0xe7, 0xe7, 0xe7, 0x20, 0x00, 0xb2, 0x3c, 0x00, 0x02,
+ 0x06, 0x03, 0x20, 0x00, 0xa1, 0x16, 0x00, 0x02, 0x9c, 0x56, 0x20, 0x00,
+ 0xa1, 0x1a, 0x00, 0x02, 0x98, 0x4e, 0x20, 0x00, 0xa1, 0x1c, 0x00, 0x04,
+ 0x08, 0x4e, 0x95, 0xa8, 0x20, 0x00, 0xa1, 0x22, 0x00, 0x02, 0xfa, 0x76,
+ 0x20, 0x00, 0xa1, 0x66, 0x00, 0x02, 0xf8, 0x9a, 0x20, 0x00, 0xa1, 0x6e,
+ 0x00, 0x02, 0x9a, 0x22, 0x20, 0x00, 0xa1, 0x72, 0x00, 0x02, 0x9b, 0x56,
+ 0x20, 0x00, 0xa1, 0x7a, 0x00, 0x02, 0x9a, 0xb0, 0x20, 0x00, 0xa1, 0x80,
+ 0x00, 0x04, 0xef, 0xc0, 0xff, 0xc0, 0x20, 0x00, 0xa1, 0x9c, 0x00, 0x02,
+ 0x9d, 0xb8, 0x20, 0x00, 0xa0, 0xb0, 0x00, 0x02, 0xce, 0xe8, 0x20, 0x00,
+ 0xa0, 0xac, 0x00, 0x02, 0x07, 0x78, 0x20, 0x00, 0xa2, 0xe6, 0x00, 0x02,
+ 0xfc, 0x1c, 0x20, 0x00, 0xf5, 0xc4, 0x00, 0x02, 0x00, 0x02, 0x20, 0x00,
+ 0xf6, 0x7a, 0x00, 0x02, 0x00, 0x02, 0x20, 0x00, 0xf6, 0xae, 0x00, 0x02,
+ 0x00, 0x02, 0x20, 0x00, 0xf5, 0xfa, 0x00, 0x02, 0x02, 0x00, 0x20, 0x00,
+ 0xf6, 0x18, 0x00, 0x02, 0x02, 0x00, 0x20, 0x00, 0xc5, 0xc8, 0x00, 0x04,
+ 0xc2, 0xa0, 0x07, 0xf8, 0x20, 0x00, 0xc6, 0x9a, 0x00, 0x04, 0xc2, 0xa0,
+ 0x07, 0xf8, 0x20, 0x00, 0xc6, 0xdc, 0x00, 0x04, 0xc2, 0xa0, 0x07, 0xf8,
+ 0x20, 0x00, 0xcc, 0x24, 0x00, 0x04, 0xc2, 0xa0, 0x07, 0xee, 0x20, 0x00,
+ 0xa3, 0x64, 0x00, 0x02, 0x07, 0xf8, 0x20, 0x00, 0xa3, 0x6e, 0x00, 0x02,
+ 0x07, 0xf8, 0x20, 0x00, 0xc3, 0xa6, 0x00, 0x02, 0x3f, 0xfe, 0x20, 0x00,
+ 0xa4, 0x46, 0x00, 0x02, 0x07, 0x08, 0x30, 0x00, 0x90, 0xf0, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0x92, 0x2a, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0x93, 0x5c, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0x94, 0x5a, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0x95, 0x16, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xcf, 0xe2, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd0, 0x14, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd0, 0x5e, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd0, 0x98, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd0, 0xea, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd1, 0x52, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd1, 0x76, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd1, 0xb6, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd1, 0xec, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd2, 0x3c, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd2, 0xca, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd3, 0x30, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd4, 0x5a, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd4, 0xaa, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd4, 0xea, 0x00, 0x06,
+ 0xc3, 0xa0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd5, 0x0a, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd5, 0x54, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd5, 0xae, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xfb, 0x9e, 0x00, 0x06,
+ 0xc1, 0xe0, 0xf0, 0x00, 0x11, 0x14, 0x30, 0x00, 0xc7, 0x4e, 0x00, 0x06,
+ 0x01, 0x60, 0xf0, 0x00, 0x80, 0x00, 0x30, 0x00, 0xc7, 0x86, 0x00, 0x06,
+ 0x01, 0x60, 0xf0, 0x00, 0x80, 0x00, 0x30, 0x00, 0xc7, 0xbc, 0x00, 0x06,
+ 0x01, 0x60, 0xf0, 0x00, 0x80, 0x00, 0x30, 0x00, 0x95, 0x5e, 0x00, 0x04,
+ 0xed, 0x03, 0xed, 0x03, 0x30, 0x00, 0x95, 0x8a, 0x00, 0x04, 0xed, 0x03,
+ 0xed, 0x03, 0x34, 0x00, 0x91, 0xa4, 0x00, 0x02, 0x60, 0x82, 0x34, 0x00,
+ 0x92, 0x44, 0x00, 0x02, 0x60, 0x82, 0x34, 0x00, 0x93, 0x78, 0x00, 0x02,
+ 0x60, 0x82, 0x34, 0x00, 0x94, 0x7a, 0x00, 0x02, 0x68, 0x82, 0x34, 0x00,
+ 0x95, 0x32, 0x00, 0x02, 0x60, 0x82, 0x34, 0x00, 0x95, 0x6c, 0x00, 0x02,
+ 0x68, 0x82, 0x34, 0x00, 0x95, 0x98, 0x00, 0x02, 0x68, 0x82, 0x34, 0x00,
+ 0x95, 0xda, 0x00, 0x02, 0x20, 0x82, 0x38, 0x00, 0xd0, 0x76, 0x00, 0x02,
+ 0xe0, 0x82, 0x38, 0x00, 0xd0, 0xca, 0x00, 0x02, 0xe0, 0x82, 0x38, 0x00,
+ 0xd4, 0x3a, 0x00, 0x02, 0xe0, 0x82, 0x20, 0x00, 0xa0, 0x02, 0x00, 0x02,
+ 0xf9, 0xe0, 0x20, 0x00, 0xa0, 0x7a, 0x00, 0x02, 0xe5, 0x18, 0x20, 0x80,
+ 0xa0, 0x02, 0x00, 0x02, 0x5b, 0x58, 0x20, 0x80, 0xa0, 0x7a, 0x00, 0x02,
+ 0x83, 0xa0, 0x30, 0x00, 0xa0, 0x02, 0x00, 0x02, 0xae, 0x4f, 0x30, 0x00,
+ 0xa0, 0x7a, 0x00, 0x02, 0x2f, 0xfc, 0x30, 0x80, 0xa0, 0x02, 0x00, 0x02,
+ 0x0f, 0xc7, 0x30, 0x80, 0xa0, 0x7a, 0x00, 0x02, 0xce, 0x84, 0x34, 0x00,
+ 0xa0, 0x02, 0x00, 0x02, 0xae, 0x4f, 0x34, 0x00, 0xa0, 0x7a, 0x00, 0x02,
+ 0x2f, 0xf4, 0x34, 0x80, 0xa0, 0x02, 0x00, 0x02, 0x0f, 0xc7, 0x34, 0x80,
+ 0xa0, 0x7a, 0x00, 0x02, 0xce, 0x7c, 0x38, 0x00, 0xa0, 0x02, 0x00, 0x02,
+ 0xae, 0x52, 0x38, 0x00, 0xa0, 0x7a, 0x00, 0x02, 0x2f, 0xf1, 0x38, 0x80,
+ 0xa0, 0x02, 0x00, 0x02, 0x0f, 0xca, 0x38, 0x80, 0xa0, 0x7a, 0x00, 0x02,
+ 0xce, 0x79, 0x00, 0x00, 0x80, 0x00, 0x09, 0xfc, 0x53, 0x4d, 0x41, 0x43,
+ 0x2e, 0x30, 0x30, 0x2e, 0x33, 0x38, 0x20, 0x20, 0x28, 0x43, 0x29, 0x20,
+ 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x4f, 0x6c,
+ 0x69, 0x63, 0x6f, 0x6d, 0x20, 0x31, 0x39, 0x39, 0x38, 0x2e, 0x00, 0x00,
+ 0x07, 0xa0, 0x13, 0x04, 0xc4, 0x00, 0x01, 0x60, 0x09, 0x6a, 0x80, 0x00,
+ 0x16, 0x03, 0x01, 0xa0, 0x09, 0x6a, 0x00, 0x60, 0x01, 0x60, 0x09, 0x6a,
+ 0x00, 0x40, 0x16, 0x34, 0x01, 0x20, 0x13, 0x0c, 0x10, 0x00, 0x16, 0x30,
+ 0xd8, 0x20, 0x09, 0x2e, 0x13, 0x06, 0xd8, 0x20, 0x01, 0x80, 0x13, 0x08,
+ 0xd8, 0x20, 0x01, 0x82, 0x13, 0x0a, 0x07, 0xa0, 0x13, 0x00, 0x87, 0xe0,
+ 0x07, 0xa0, 0x13, 0x02, 0xed, 0xb6, 0x07, 0xa0, 0x13, 0x14, 0x00, 0x04,
+ 0x06, 0xa0, 0x84, 0xd0, 0x07, 0xa0, 0x13, 0x0c, 0x04, 0x00, 0xd8, 0x20,
+ 0xef, 0x54, 0x09, 0x2e, 0x01, 0xe0, 0x13, 0x0c, 0x10, 0x00, 0x01, 0xa0,
+ 0x13, 0x0c, 0x28, 0x00, 0x01, 0x60, 0x09, 0x6a, 0x00, 0x20, 0x16, 0x03,
+ 0x01, 0xe0, 0x13, 0x0c, 0x28, 0x00, 0x07, 0xa0, 0x13, 0x4c, 0x00, 0x02,
+ 0x02, 0x0a, 0x00, 0x02, 0x01, 0xe0, 0x13, 0x0e, 0x01, 0x80, 0x10, 0x09,
+ 0x07, 0xa0, 0x13, 0x00, 0xdb, 0xc4, 0x07, 0xa0, 0x13, 0x02, 0xea, 0xb0,
+ 0x01, 0xa0, 0x13, 0x0c, 0x38, 0x00, 0x06, 0xa0, 0xdc, 0x32, 0xc2, 0xe0,
+ 0x13, 0x00, 0x04, 0x5b, 0x01, 0x4e, 0x00, 0x40, 0x16, 0x02, 0x04, 0x60,
+ 0xcc, 0xb4, 0x02, 0x0d, 0x12, 0x00, 0x04, 0x60, 0xcc, 0xa6, 0x01, 0x60,
+ 0x13, 0x0c, 0x10, 0x00, 0x13, 0x02, 0x04, 0x60, 0xe3, 0xce, 0xc8, 0x0b,
+ 0x13, 0x52, 0x06, 0xa0, 0xe3, 0xce, 0xd8, 0x20, 0xe0, 0x0a, 0xfc, 0x06,
+ 0xc2, 0xe0, 0x13, 0x52, 0x04, 0x5b, 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00,
+ 0x16, 0x06, 0x02, 0x84, 0x00, 0x12, 0x13, 0x15, 0x02, 0x84, 0x00, 0x14,
+ 0x13, 0x2d, 0x06, 0xa0, 0xe3, 0xce, 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00,
+ 0x16, 0x0a, 0xd8, 0x20, 0xe0, 0x0a, 0x04, 0x06, 0x88, 0x20, 0x13, 0x54,
+ 0x03, 0xf8, 0x13, 0x03, 0x07, 0xa0, 0x03, 0xf8, 0x81, 0x8c, 0x04, 0x60,
+ 0xdb, 0x96, 0x02, 0x04, 0x00, 0x08, 0x06, 0xa0, 0xe3, 0xce, 0x07, 0xa0,
+ 0x03, 0xf8, 0x81, 0x8c, 0x02, 0x05, 0x04, 0x04, 0x02, 0x06, 0xef, 0x5c,
+ 0xcd, 0x76, 0xcd, 0x76, 0x02, 0x25, 0x00, 0x0c, 0xcd, 0x76, 0xcd, 0x76,
+ 0xcd, 0x76, 0xcd, 0x60, 0x13, 0x12, 0xcd, 0x76, 0xcd, 0x60, 0x13, 0x4c,
+ 0xcd, 0x76, 0xc5, 0x60, 0x09, 0x1e, 0x10, 0xe3, 0x02, 0x04, 0x00, 0x08,
+ 0x06, 0xa0, 0xe3, 0xce, 0x07, 0xa0, 0x03, 0xf8, 0x81, 0x8c, 0x02, 0x05,
+ 0x04, 0x04, 0x02, 0x06, 0xef, 0x6a, 0xcd, 0x76, 0xcd, 0x76, 0x02, 0x25,
+ 0x00, 0x0c, 0xcd, 0x76, 0xcd, 0x76, 0x10, 0xd1, 0x04, 0x60, 0x87, 0xe0,
+ 0x01, 0x4f, 0x00, 0x0a, 0x16, 0x03, 0x01, 0x4f, 0x00, 0x80, 0x04, 0x5b,
+ 0x04, 0x60, 0xda, 0x04, 0xc0, 0xc3, 0x13, 0x06, 0x01, 0x60, 0x13, 0x0c,
+ 0x10, 0x00, 0x16, 0x02, 0x01, 0xd6, 0x00, 0x80, 0x07, 0x86, 0x07, 0x36,
+ 0x04, 0x60, 0xe3, 0x7a, 0xa0, 0x60, 0x13, 0x02, 0xc1, 0x11, 0x04, 0x54,
+ 0x01, 0x48, 0x40, 0x00, 0x16, 0x06, 0x01, 0x88, 0x40, 0x00, 0x02, 0x28,
+ 0xef, 0x00, 0x04, 0x60, 0xe0, 0x36, 0x02, 0x28, 0xe3, 0xee, 0x04, 0x60,
+ 0xe0, 0x36, 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00, 0x16, 0x06, 0x02, 0x85,
+ 0x00, 0x12, 0x13, 0x0a, 0x02, 0x85, 0x00, 0x14, 0x13, 0x07, 0x02, 0x85,
+ 0x00, 0x15, 0x13, 0x24, 0x02, 0x85, 0x00, 0x10, 0x04, 0x60, 0xdd, 0x4c,
+ 0x02, 0x03, 0x80, 0x02, 0x88, 0x24, 0x00, 0x14, 0xe0, 0x1c, 0x16, 0x19,
+ 0x05, 0x83, 0x05, 0x83, 0x92, 0x60, 0xef, 0x9e, 0x16, 0x14, 0x05, 0x83,
+ 0x99, 0x20, 0xe0, 0x0e, 0x00, 0x18, 0x16, 0x0f, 0x05, 0x83, 0x05, 0x83,
+ 0x02, 0x85, 0x00, 0x12, 0x16, 0x05, 0x99, 0x20, 0xef, 0xa0, 0x00, 0x19,
+ 0x16, 0x06, 0x10, 0x04, 0x99, 0x20, 0xef, 0xa1, 0x00, 0x19, 0x16, 0x01,
+ 0x04, 0xc3, 0x04, 0x5c, 0x02, 0x03, 0x80, 0x02, 0x88, 0x24, 0x00, 0x14,
+ 0xe0, 0x1e, 0x16, 0xf9, 0x05, 0x83, 0x05, 0x83, 0x92, 0x60, 0xef, 0x9e,
+ 0x16, 0xf4, 0x04, 0xc3, 0x10, 0xf2, 0x02, 0x85, 0x00, 0x15, 0x13, 0x09,
+ 0x02, 0x85, 0x00, 0x09, 0x13, 0x02, 0x06, 0xa0, 0xe2, 0xe4, 0xa1, 0x45,
+ 0xc1, 0x65, 0xe3, 0xac, 0x04, 0x55, 0x06, 0xa0, 0xe1, 0xa2, 0x01, 0x60,
+ 0x13, 0x0c, 0x04, 0x00, 0x16, 0x19, 0x01, 0x4f, 0x00, 0x80, 0x16, 0x09,
+ 0x01, 0xe0, 0x13, 0x0e, 0x20, 0x00, 0x02, 0x03, 0x80, 0x10, 0x06, 0xa0,
+ 0xe3, 0x56, 0x06, 0xa0, 0xe2, 0x72, 0x01, 0xe0, 0x13, 0x0e, 0x00, 0x10,
+ 0x07, 0xa0, 0x13, 0x00, 0x87, 0xe0, 0x07, 0xa0, 0x13, 0x02, 0xed, 0xb6,
+ 0x01, 0x8f, 0x00, 0x80, 0x02, 0x0a, 0x00, 0x08, 0x04, 0x60, 0x80, 0xbe,
+ 0x02, 0x0d, 0x80, 0x00, 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00, 0x16, 0x02,
+ 0x02, 0x0d, 0x80, 0x80, 0x04, 0x52, 0x01, 0x60, 0x13, 0x0e, 0x20, 0x00,
+ 0x16, 0x02, 0x02, 0x03, 0x82, 0x00, 0x04, 0x60, 0xdb, 0xb8, 0x02, 0x8f,
+ 0x00, 0x06, 0x16, 0x56, 0x01, 0xe0, 0x13, 0x0e, 0x00, 0xa0, 0x05, 0xa0,
+ 0x13, 0x16, 0x06, 0xa0, 0x85, 0x30, 0x02, 0x08, 0xc0, 0x00, 0x06, 0xa0,
+ 0xe0, 0x22, 0x01, 0xcd, 0x04, 0x00, 0x10, 0x48, 0x02, 0x8f, 0x00, 0x02,
+ 0x16, 0x45, 0x02, 0x08, 0xc0, 0x42, 0x06, 0xa0, 0xe0, 0x22, 0x01, 0xcd,
+ 0x08, 0x00, 0x10, 0x3e, 0x93, 0xe0, 0xef, 0xa3, 0x13, 0x03, 0x93, 0xe0,
+ 0xef, 0xa4, 0x16, 0x38, 0xd2, 0xa0, 0xef, 0xa5, 0x10, 0x35, 0x02, 0x8f,
+ 0x00, 0x06, 0x16, 0x32, 0x02, 0x03, 0x00, 0x03, 0x04, 0x60, 0x82, 0xc2,
+ 0x93, 0xe0, 0xef, 0xa5, 0x16, 0x2b, 0x01, 0xe0, 0x13, 0x0e, 0x00, 0x80,
+ 0x06, 0xa0, 0x85, 0x30, 0x04, 0xcf, 0x02, 0x0a, 0x00, 0x04, 0x02, 0x08,
+ 0xc0, 0x1e, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x03, 0x68, 0x00, 0x06, 0xa0,
+ 0xe3, 0x56, 0x02, 0x03, 0x80, 0x10, 0x06, 0xa0, 0xe3, 0x56, 0x10, 0x16,
+ 0x02, 0x8f, 0x00, 0x04, 0x16, 0x13, 0x02, 0x03, 0x00, 0x03, 0x04, 0x60,
+ 0x82, 0xc2, 0x02, 0x8f, 0x00, 0x02, 0x16, 0x7a, 0x01, 0x60, 0x13, 0x0e,
+ 0x00, 0x08, 0x16, 0x02, 0x04, 0x60, 0x85, 0x56, 0x02, 0x0a, 0x00, 0x04,
+ 0x02, 0x08, 0xc0, 0x1e, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x6d, 0x01, 0x60,
+ 0x13, 0x0e, 0x40, 0x00, 0x16, 0x69, 0x02, 0x8f, 0x00, 0x06, 0x16, 0x07,
+ 0x01, 0xe0, 0x13, 0x0e, 0x00, 0xa0, 0x05, 0xa0, 0x13, 0x16, 0x06, 0xa0,
+ 0x85, 0x30, 0x02, 0x08, 0xc0, 0x30, 0x06, 0xa0, 0xe0, 0x22, 0x01, 0xcd,
+ 0x01, 0x00, 0x10, 0x58, 0x93, 0xe0, 0xef, 0xa3, 0x16, 0x55, 0x02, 0x08,
+ 0xc0, 0x36, 0x06, 0xa0, 0xe0, 0x22, 0x07, 0xa0, 0x07, 0x08, 0x00, 0x05,
+ 0x01, 0x60, 0x13, 0x0e, 0x04, 0x00, 0x16, 0x03, 0x07, 0xa0, 0x07, 0x08,
+ 0x00, 0x02, 0x02, 0x05, 0x03, 0xf8, 0x02, 0x04, 0x00, 0x04, 0x04, 0x60,
+ 0x80, 0xfa, 0xc1, 0x20, 0x01, 0x84, 0x02, 0x44, 0x88, 0x00, 0x13, 0x12,
+ 0x48, 0x04, 0x01, 0x84, 0x06, 0x20, 0x07, 0x02, 0x16, 0x08, 0x01, 0xe0,
+ 0x13, 0x0e, 0x04, 0x00, 0x07, 0x83, 0xc0, 0x00, 0x06, 0xa0, 0xe3, 0x56,
+ 0x10, 0x2f, 0x02, 0x08, 0xc0, 0x3c, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x2a,
+ 0x01, 0xe0, 0x01, 0x82, 0x40, 0x00, 0x06, 0xa0, 0xe0, 0x18, 0x07, 0x20,
+ 0x07, 0x02, 0x01, 0x8e, 0x80, 0x00, 0x01, 0xa0, 0x13, 0x0e, 0x06, 0x00,
+ 0x10, 0x1d, 0x02, 0x8f, 0x00, 0x02, 0x16, 0x1a, 0x01, 0x20, 0x13, 0x0e,
+ 0x00, 0x40, 0x16, 0x16, 0xc2, 0x20, 0x13, 0x14, 0x13, 0x09, 0x06, 0x20,
+ 0x13, 0x14, 0x02, 0x08, 0xc0, 0x42, 0x06, 0xa0, 0xe0, 0x22, 0x01, 0xcd,
+ 0x08, 0x00, 0x10, 0x0a, 0x01, 0x60, 0x13, 0x0c, 0x20, 0x00, 0x13, 0x02,
+ 0x04, 0x60, 0x85, 0x56, 0x02, 0x03, 0x00, 0x05, 0x04, 0x60, 0x82, 0xc2,
+ 0x04, 0x60, 0x87, 0xe0, 0x02, 0x8f, 0x00, 0x06, 0x16, 0x04, 0x02, 0x03,
+ 0x00, 0x05, 0x04, 0x60, 0x82, 0xc2, 0x01, 0x60, 0x13, 0x0e, 0x20, 0x00,
+ 0x16, 0xf3, 0x93, 0xe0, 0xef, 0xa2, 0x16, 0xf0, 0x01, 0xa0, 0x13, 0x0e,
+ 0x50, 0x80, 0x06, 0xa0, 0x85, 0x30, 0x01, 0xce, 0x00, 0x01, 0xd2, 0xa0,
+ 0xef, 0xa3, 0x07, 0xa0, 0x07, 0x08, 0x00, 0x05, 0x01, 0x60, 0x13, 0x0e,
+ 0x04, 0x00, 0x16, 0x03, 0x07, 0xa0, 0x07, 0x08, 0x00, 0x02, 0x02, 0x08,
+ 0xc0, 0x36, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, 0xc0, 0x0c, 0x06, 0xa0,
+ 0xe0, 0x22, 0x02, 0x08, 0xc0, 0x18, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0xd0,
+ 0x02, 0x8f, 0x00, 0x08, 0x16, 0xcd, 0x07, 0xa0, 0x13, 0x14, 0x00, 0x0c,
+ 0x04, 0x60, 0x80, 0x74, 0xc3, 0x0b, 0x06, 0xa0, 0x85, 0x48, 0x06, 0xa0,
+ 0x84, 0xf2, 0xc2, 0xcc, 0x04, 0xe0, 0x13, 0x0e, 0x04, 0xe0, 0x13, 0x16,
+ 0x04, 0xe0, 0x06, 0xdc, 0x04, 0xe0, 0x06, 0xde, 0x04, 0xe0, 0x06, 0xe0,
+ 0x04, 0x5b, 0x02, 0x06, 0x00, 0x05, 0x02, 0x04, 0x13, 0x1a, 0xc1, 0x54,
+ 0x13, 0x01, 0x2c, 0xd4, 0x02, 0x24, 0x00, 0x0a, 0x06, 0x06, 0x16, 0xf9,
+ 0x04, 0x5b, 0x02, 0x06, 0x00, 0x05, 0x02, 0x04, 0x06, 0x72, 0xc1, 0x54,
+ 0x13, 0x01, 0x2c, 0xd4, 0x02, 0x24, 0x00, 0x0a, 0x06, 0x06, 0x16, 0xf9,
+ 0x04, 0x5b, 0x01, 0x60, 0x13, 0x0e, 0x08, 0x00, 0x16, 0x03, 0x01, 0xe0,
+ 0x01, 0x82, 0x20, 0x00, 0x01, 0x60, 0x13, 0x0e, 0x00, 0x80, 0x16, 0x04,
+ 0x01, 0xe0, 0x01, 0x82, 0x0a, 0x00, 0x10, 0x03, 0x01, 0xa0, 0x01, 0x82,
+ 0x0a, 0x00, 0x04, 0x5b, 0x01, 0xa0, 0x01, 0x82, 0x28, 0x00, 0x01, 0xe0,
+ 0x01, 0x82, 0x10, 0x00, 0x04, 0x5b, 0x06, 0xa0, 0x84, 0xf2, 0x04, 0xe0,
+ 0x13, 0x0e, 0xd8, 0x20, 0x13, 0x06, 0x09, 0x2e, 0xd8, 0x20, 0x13, 0x08,
+ 0x01, 0x80, 0xd8, 0x20, 0x13, 0x0a, 0x01, 0x82, 0x06, 0xa0, 0xe0, 0x18,
+ 0x04, 0x60, 0xe5, 0x62, 0xc0, 0x62, 0x00, 0x04, 0xc8, 0x22, 0x00, 0x06,
+ 0x01, 0x6c, 0x02, 0x82, 0x04, 0x00, 0x1b, 0x0d, 0x01, 0x8e, 0x08, 0x00,
+ 0x02, 0x8f, 0x00, 0x06, 0x16, 0x08, 0x06, 0x20, 0x13, 0x16, 0x16, 0x05,
+ 0x01, 0xa0, 0x13, 0x0e, 0x00, 0xa0, 0x06, 0xa0, 0x85, 0x30, 0xc1, 0x22,
+ 0x00, 0x0e, 0x04, 0x51, 0xc8, 0x02, 0x01, 0x6c, 0xa0, 0x82, 0xc8, 0x22,
+ 0x0c, 0x32, 0xfc, 0x00, 0x02, 0x02, 0xfc, 0x00, 0x93, 0xe0, 0xe3, 0xaa,
+ 0x13, 0x71, 0x06, 0xa0, 0xdc, 0xc6, 0x01, 0xa2, 0x00, 0x0e, 0x80, 0x00,
+ 0xc8, 0x05, 0x06, 0xfc, 0xc0, 0xc3, 0x16, 0x43, 0x01, 0x22, 0x00, 0x16,
+ 0x0f, 0x00, 0x16, 0x10, 0x88, 0x22, 0x00, 0x0e, 0x09, 0x6c, 0x16, 0x0c,
+ 0x88, 0x22, 0x00, 0x10, 0x09, 0x6e, 0x16, 0x08, 0x88, 0x22, 0x00, 0x12,
+ 0x09, 0x70, 0x16, 0x04, 0x06, 0xa0, 0xe1, 0xa2, 0x04, 0x60, 0x87, 0xe0,
+ 0x98, 0xa0, 0xef, 0xa6, 0x00, 0x16, 0x13, 0x04, 0x98, 0xa0, 0xef, 0xa7,
+ 0x00, 0x16, 0x16, 0x15, 0xc2, 0xe0, 0x06, 0xdc, 0x16, 0x06, 0xc2, 0xe0,
+ 0x06, 0xde, 0x16, 0x03, 0xc2, 0xe0, 0x06, 0xe0, 0x13, 0x0c, 0x88, 0x22,
+ 0x00, 0x0e, 0x06, 0xdc, 0x16, 0x71, 0x88, 0x22, 0x00, 0x10, 0x06, 0xde,
+ 0x16, 0x6d, 0x88, 0x22, 0x00, 0x12, 0x06, 0xe0, 0x16, 0x69, 0x02, 0x85,
+ 0x00, 0x09, 0x13, 0x0b, 0x02, 0x85, 0x00, 0x15, 0x13, 0x08, 0x02, 0x85,
+ 0x00, 0x12, 0x13, 0x0d, 0x02, 0x85, 0x00, 0x14, 0x13, 0x0e, 0x06, 0xa0,
+ 0xe2, 0xe4, 0xa1, 0x45, 0xc1, 0x65, 0xef, 0x72, 0x04, 0x55, 0x06, 0xa0,
+ 0xe0, 0x6e, 0x04, 0x60, 0x87, 0xe0, 0xc8, 0x24, 0x00, 0x1a, 0x13, 0x4e,
+ 0x10, 0xf4, 0xc8, 0x24, 0x00, 0x1a, 0x13, 0x50, 0x10, 0xf0, 0x01, 0x20,
+ 0x13, 0x0e, 0x02, 0x00, 0x16, 0x07, 0x04, 0xe0, 0x01, 0x84, 0x01, 0xa0,
+ 0x01, 0x82, 0x40, 0x00, 0x06, 0xa0, 0xe0, 0x18, 0x07, 0xa0, 0x07, 0x02,
+ 0x00, 0x04, 0x01, 0xe0, 0x13, 0x0e, 0x02, 0x00, 0x01, 0xce, 0x80, 0x00,
+ 0x02, 0x08, 0xc0, 0x3c, 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x60, 0x87, 0xe0,
+ 0x06, 0xa0, 0xe1, 0xa2, 0x04, 0x60, 0x87, 0xe0, 0x06, 0xa0, 0xe1, 0xa2,
+ 0x02, 0x03, 0x00, 0x05, 0x01, 0x4f, 0x00, 0x80, 0x16, 0x02, 0x02, 0x03,
+ 0x82, 0x00, 0x04, 0x60, 0x82, 0xc2, 0x01, 0x60, 0x13, 0x0e, 0x20, 0x00,
+ 0x16, 0x24, 0x93, 0xe0, 0xef, 0xa2, 0x16, 0x0c, 0x01, 0x60, 0x13, 0x0e,
+ 0x20, 0x00, 0x16, 0x28, 0x02, 0x03, 0xa0, 0x00, 0x06, 0xa0, 0xe3, 0x56,
+ 0x01, 0xa0, 0x13, 0x0e, 0x50, 0x00, 0x10, 0x03, 0x93, 0xe0, 0xef, 0xa3,
+ 0x16, 0x1d, 0x01, 0xce, 0x00, 0x02, 0xd2, 0xa0, 0xef, 0xa4, 0x02, 0x08,
+ 0xc0, 0x0c, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, 0xc0, 0x18, 0x06, 0xa0,
+ 0xe0, 0x22, 0x10, 0x10, 0x06, 0xa0, 0xe1, 0xa2, 0x02, 0x03, 0x00, 0x0b,
+ 0x10, 0x04, 0x06, 0xa0, 0xe1, 0xa2, 0x02, 0x03, 0x00, 0x05, 0x01, 0x4f,
+ 0x00, 0x80, 0x16, 0x02, 0x02, 0x03, 0x82, 0x00, 0x04, 0x60, 0x82, 0xc2,
+ 0x10, 0xbd, 0x02, 0x8f, 0x00, 0x02, 0x13, 0xf1, 0x02, 0x8f, 0x00, 0x04,
+ 0x13, 0xee, 0x01, 0x60, 0x13, 0x0e, 0x40, 0x00, 0x16, 0xf5, 0x02, 0x08,
+ 0xc0, 0x48, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0xf0, 0x02, 0x8f, 0x00, 0x02,
+ 0x16, 0xab, 0xc0, 0xe0, 0x13, 0x4e, 0x16, 0x0e, 0x01, 0x60, 0x13, 0x0c,
+ 0x08, 0x00, 0x13, 0xa8, 0x01, 0xe0, 0x13, 0x0e, 0x00, 0x48, 0x06, 0xa0,
+ 0xe1, 0xa2, 0x02, 0x08, 0xc0, 0x24, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x22,
+ 0x02, 0x83, 0x00, 0x02, 0x16, 0xd9, 0xc8, 0x24, 0x00, 0x0e, 0x06, 0xdc,
+ 0xc8, 0x24, 0x00, 0x10, 0x06, 0xde, 0xc8, 0x24, 0x00, 0x12, 0x06, 0xe0,
+ 0x06, 0xa0, 0xe1, 0xa2, 0x02, 0x08, 0xc0, 0x24, 0x06, 0xa0, 0xe0, 0x22,
+ 0x01, 0xe0, 0x13, 0x0e, 0x00, 0x40, 0xc0, 0xe0, 0x13, 0x12, 0x16, 0x04,
+ 0x01, 0xa0, 0x13, 0x0e, 0x08, 0x01, 0x10, 0x06, 0x02, 0x83, 0x00, 0x01,
+ 0x16, 0x03, 0x01, 0xe0, 0x13, 0x0e, 0x08, 0x01, 0x10, 0x17, 0x02, 0x8f,
+ 0x00, 0x06, 0x16, 0xb6, 0xc0, 0xe0, 0x13, 0x50, 0x02, 0x83, 0x00, 0x00,
+ 0x16, 0x05, 0x06, 0xa0, 0xe1, 0xa2, 0x02, 0x0a, 0x00, 0x0a, 0x10, 0x0a,
+ 0x02, 0x83, 0x80, 0x20, 0x16, 0x04, 0x02, 0x03, 0x00, 0x08, 0x04, 0x60,
+ 0x82, 0xc2, 0x16, 0xa4, 0x04, 0x60, 0xda, 0x04, 0x92, 0xa0, 0xe0, 0x26,
+ 0x16, 0x0d, 0xd3, 0xe0, 0xe0, 0x26, 0x01, 0x4f, 0x00, 0x80, 0x13, 0x07,
+ 0xc1, 0x0a, 0x83, 0xc4, 0x13, 0x08, 0xc3, 0xc4, 0xc1, 0x24, 0xed, 0xd6,
+ 0x04, 0x54, 0x10, 0x03, 0x93, 0xca, 0x13, 0xec, 0xd3, 0xca, 0x03, 0xb0,
+ 0xd8, 0x0f, 0x06, 0x59, 0x71, 0x04, 0xc1, 0x24, 0xed, 0xe2, 0x04, 0x54,
+ 0xf8, 0x20, 0xef, 0x54, 0x01, 0x80, 0xf8, 0x20, 0xef, 0x56, 0x01, 0x82,
+ 0x06, 0xa0, 0xe0, 0x18, 0x2e, 0xe0, 0x00, 0x00, 0xc8, 0x20, 0x09, 0x6c,
+ 0x01, 0xa0, 0xc8, 0x20, 0x09, 0x6e, 0x01, 0xa2, 0xc8, 0x20, 0x09, 0x70,
+ 0x01, 0xa4, 0x02, 0x08, 0xc0, 0x06, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0xcc,
+ 0x07, 0xa0, 0x06, 0xc6, 0x02, 0x00, 0x07, 0xa0, 0x06, 0xc8, 0x00, 0x02,
+ 0xd8, 0x20, 0xef, 0x58, 0x09, 0x2e, 0xd8, 0x20, 0xef, 0x58, 0x01, 0x80,
+ 0xd8, 0x20, 0xef, 0x5a, 0x01, 0x82, 0x06, 0xa0, 0xe0, 0x18, 0x04, 0xe0,
+ 0x01, 0x9e, 0x02, 0x08, 0xc0, 0x2a, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x04,
+ 0x00, 0x0a, 0x02, 0x05, 0x03, 0xf4, 0x06, 0xa0, 0xe3, 0xce, 0x07, 0xa0,
+ 0x03, 0xf8, 0x88, 0x94, 0x01, 0x4e, 0x08, 0x00, 0x13, 0xa9, 0x01, 0xce,
+ 0x08, 0x00, 0x2e, 0xa0, 0x03, 0xf4, 0x10, 0xa4, 0x03, 0xb0, 0x98, 0x20,
+ 0xe0, 0x0e, 0x06, 0x65, 0x16, 0x9f, 0x92, 0xa0, 0xe0, 0x26, 0x16, 0x9c,
+ 0x02, 0x44, 0x5e, 0x00, 0x16, 0x0b, 0x06, 0x20, 0x06, 0xc6, 0x16, 0xdd,
+ 0x02, 0x0a, 0x00, 0x06, 0x10, 0x95, 0x03, 0xb0, 0x98, 0x20, 0xe0, 0x0e,
+ 0x06, 0x65, 0x16, 0x8e, 0x06, 0x20, 0x06, 0xc8, 0x16, 0xc5, 0x04, 0x60,
+ 0xe6, 0x6a, 0xd8, 0x20, 0xef, 0x54, 0x09, 0x2e, 0xd8, 0x20, 0xef, 0x54,
+ 0x01, 0x80, 0xd8, 0x20, 0xef, 0x56, 0x01, 0x82, 0x06, 0xa0, 0xe0, 0x18,
+ 0x01, 0xe0, 0x13, 0x0e, 0x40, 0x20, 0x07, 0xa0, 0x13, 0x16, 0x00, 0x01,
+ 0x02, 0x08, 0xc0, 0x30, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, 0xc0, 0x48,
+ 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, 0xc0, 0x12, 0x06, 0xa0, 0xe0, 0x22,
+ 0x02, 0x08, 0xc0, 0x00, 0x06, 0xa0, 0xe0, 0x22, 0x01, 0xcd, 0x04, 0x00,
+ 0x04, 0x60, 0x87, 0xe0, 0x06, 0xa0, 0x85, 0x48, 0x01, 0xce, 0x00, 0x20,
+ 0x2e, 0xe0, 0x00, 0x00, 0x04, 0xcd, 0x06, 0xa0, 0x85, 0x0a, 0x02, 0x08,
+ 0xc0, 0x4e, 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x60, 0x87, 0xe0, 0x01, 0xa0,
+ 0x13, 0x0e, 0x00, 0x80, 0x06, 0xa0, 0x85, 0x22, 0x01, 0xcf, 0x00, 0x80,
+ 0x01, 0xe0, 0x13, 0x0e, 0x10, 0x00, 0x01, 0x60, 0x13, 0x0e, 0x00, 0x01,
+ 0x16, 0x04, 0x07, 0x88, 0x80, 0x06, 0x06, 0xa0, 0xe0, 0x22, 0x01, 0x20,
+ 0x13, 0x0e, 0x20, 0x00, 0x16, 0x07, 0x01, 0xe0, 0x13, 0x0e, 0x20, 0x00,
+ 0x04, 0xc3, 0x06, 0xa0, 0xe3, 0x56, 0x10, 0x0e, 0x01, 0x8e, 0x00, 0x03,
+ 0x02, 0x03, 0x00, 0x10, 0x06, 0xa0, 0xe3, 0x56, 0x01, 0x60, 0x13, 0x0e,
+ 0x00, 0x10, 0x16, 0x04, 0x02, 0x03, 0x80, 0x08, 0x06, 0xa0, 0xe3, 0x56,
+ 0xc8, 0x20, 0xe4, 0x6e, 0x01, 0x86, 0x2e, 0xe0, 0x00, 0x01, 0x01, 0x8e,
+ 0x00, 0x20, 0x04, 0x60, 0x87, 0xdc, 0x02, 0x03, 0xa8, 0x00, 0x01, 0x60,
+ 0x07, 0x08, 0x00, 0x02, 0x16, 0x02, 0x02, 0x03, 0xe8, 0x00, 0x06, 0xa0,
+ 0xe3, 0x56, 0x01, 0x4e, 0x00, 0x20, 0x13, 0x06, 0x01, 0xce, 0x00, 0x20,
+ 0x2e, 0xe0, 0x00, 0x00, 0xc0, 0x41, 0x16, 0xfa, 0x06, 0xa0, 0xe1, 0x2e,
+ 0x02, 0x4a, 0xff, 0x00, 0x02, 0x4f, 0xff, 0x80, 0x02, 0x05, 0x03, 0xf8,
+ 0x02, 0x04, 0x00, 0x04, 0x04, 0x60, 0x80, 0xfa, 0x02, 0x4a, 0xff, 0x00,
+ 0x02, 0x4f, 0xff, 0x80, 0x04, 0x60, 0x87, 0xdc, 0x06, 0xa0, 0x85, 0x48,
+ 0x04, 0x60, 0x87, 0xdc, 0x06, 0xa0, 0x84, 0xf2, 0x04, 0xe0, 0x13, 0x0e,
+ 0x01, 0xce, 0x00, 0x08, 0x04, 0x60, 0xe7, 0xf6, 0x00, 0x00, 0x89, 0xfc,
+ 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0xad, 0x90, 0x00, 0x62, 0xc0, 0x80,
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x00, 0xdb, 0xc4, 0x00, 0x02,
+ 0x13, 0x02, 0xea, 0xb0, 0x00, 0x02, 0x13, 0x54, 0xdc, 0x16, 0x00, 0x02,
+ 0x09, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x13, 0x12, 0x00, 0x01, 0x00, 0x00,
+ 0xda, 0x88, 0xda, 0x7c, 0x86, 0x6e, 0xda, 0xa6, 0xda, 0x9e, 0xdb, 0x86,
+ 0xdb, 0x86, 0xdb, 0x86, 0xda, 0xa8, 0x85, 0xa8, 0x85, 0x78, 0xdb, 0x78,
+ 0xdb, 0x86, 0xdb, 0x86, 0xdb, 0x86, 0xdb, 0x86, 0xdb, 0x9e, 0x88, 0x14,
+ 0x88, 0x44, 0x88, 0xca, 0x89, 0x14, 0x89, 0x32, 0xdb, 0xf6, 0x89, 0x9a,
+ 0x89, 0xd8, 0x89, 0xe4, 0xe4, 0x6e, 0xdb, 0x9e, 0x89, 0xec, 0xdb, 0x9e,
+ 0x00, 0x00, 0xaf, 0x00, 0x00, 0xa8, 0x13, 0x24, 0x82, 0xd2, 0x00, 0x14,
+ 0x13, 0x1a, 0x82, 0xf4, 0x00, 0x04, 0x13, 0x38, 0x83, 0x08, 0x02, 0xbc,
+ 0x13, 0x1a, 0x83, 0x1a, 0x07, 0x08, 0x13, 0x1a, 0x83, 0x28, 0x03, 0xe8,
+ 0x13, 0x1a, 0x83, 0x58, 0x00, 0xf0, 0x13, 0x1a, 0x83, 0x66, 0x00, 0x14,
+ 0x13, 0x24, 0x88, 0xb6, 0x00, 0x04, 0x13, 0x2e, 0x83, 0x86, 0x00, 0x64,
+ 0x13, 0x2e, 0x83, 0xb0, 0x00, 0x02, 0x13, 0x42, 0x83, 0xde, 0x00, 0x05,
+ 0x13, 0x1a, 0x84, 0x26, 0x00, 0x04, 0x13, 0x38, 0x84, 0x64, 0x01, 0xf4,
+ 0x13, 0x1a, 0x84, 0xc0, 0x00, 0x14, 0xae, 0x00, 0xd9, 0x00, 0x02, 0x00,
+ 0xd9, 0x00, 0x00, 0x1e, 0x10, 0x00, 0x00, 0x10, 0x30, 0x11, 0x04, 0x0c,
+ 0x04, 0x0e, 0x04, 0x21, 0x00, 0x12, 0x10, 0x00, 0x00, 0x04, 0x30, 0x13,
+ 0xdb, 0xa8, 0xe8, 0x7c, 0x86, 0xbe, 0x86, 0xa8, 0x86, 0xa8, 0x87, 0x26,
+ 0x86, 0xa8, 0xeb, 0xf2, 0xdb, 0xa8, 0x86, 0xa0, 0xec, 0x04, 0xe8, 0x62,
+ 0xec, 0x10, 0xec, 0x10, 0xed, 0x3a, 0xed, 0x44, 0xed, 0x4e, 0x86, 0xa0,
+ 0x87, 0x44, 0x86, 0xa0, 0x87, 0xb2, 0x86, 0xa0, 0x03, 0x00, 0x0f, 0x0d,
+ 0x00, 0x02, 0x04, 0x06, 0x00, 0x03, 0x00, 0x00, 0xb2, 0xa8, 0x00, 0x02,
+ 0x80, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00,
+ 0xf8, 0x08, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0xb9, 0x0c, 0x00, 0x06,
+ 0x48, 0x20, 0x13, 0x04, 0x01, 0x80, 0x00, 0x00, 0xba, 0x38, 0x00, 0x06,
+ 0x48, 0x20, 0x13, 0x04, 0x01, 0x80, 0x00, 0x00, 0xbc, 0x88, 0x00, 0x06,
+ 0x48, 0x20, 0x13, 0x04, 0x01, 0x80, 0x00, 0x00, 0xca, 0xaa, 0x00, 0x04,
+ 0x04, 0x60, 0x82, 0xb0, 0x00, 0x00, 0xc8, 0x2c, 0x00, 0x02, 0x06, 0x09,
+ 0x00, 0x00, 0xcc, 0x60, 0x00, 0x02, 0x06, 0x09, 0x00, 0x00, 0xdb, 0x1c,
+ 0x00, 0x04, 0x04, 0x60, 0x82, 0x56, 0x00, 0x00, 0xe0, 0xc8, 0x00, 0x02,
+ 0x80, 0xda, 0x00, 0x00, 0xed, 0x74, 0x00, 0x02, 0x80, 0xda, 0x00, 0x00,
+ 0xed, 0x94, 0x00, 0x02, 0x80, 0xda, 0x00, 0x00, 0xe7, 0xae, 0x00, 0x04,
+ 0x06, 0xa0, 0x81, 0x90, 0x00, 0x00, 0xe5, 0xb0, 0x00, 0x04, 0x04, 0x60,
+ 0x80, 0x28, 0x00, 0x00, 0xdb, 0xc0, 0x00, 0x04, 0x04, 0x60, 0x80, 0xbe,
+ 0x00, 0x00, 0xda, 0x76, 0x00, 0x04, 0x04, 0x60, 0x81, 0xb8, 0x00, 0x00,
+ 0xe0, 0x32, 0x00, 0x04, 0x04, 0x60, 0x81, 0xc0, 0x00, 0x00, 0xdb, 0x92,
+ 0x00, 0x04, 0x04, 0x60, 0x80, 0xfa, 0x00, 0x00, 0xe3, 0x76, 0x00, 0x04,
+ 0x04, 0x60, 0x81, 0xa0, 0x00, 0x00, 0xdd, 0x48, 0x00, 0x04, 0x04, 0x60,
+ 0x81, 0xda, 0x00, 0x00, 0xcc, 0xa2, 0x00, 0x04, 0x04, 0x60, 0x80, 0xc8,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
+};
diff --git a/sys/contrib/ipfilter/netinet/fil.c b/sys/contrib/ipfilter/netinet/fil.c
new file mode 100644
index 0000000..6d4622e
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/fil.c
@@ -0,0 +1,2132 @@
+/*
+ * Copyright (C) 1993-2000 by Darren Reed.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and due credit is given
+ * to the original author and the contributors.
+ */
+#if !defined(lint)
+static const char sccsid[] = "@(#)fil.c 1.36 6/5/96 (C) 1993-2000 Darren Reed";
+/* static const char rcsid[] = "@(#)$Id: fil.c,v 2.3.2.16 2000/01/27 08:49:37 darrenr Exp $"; */
+static const char rcsid[] = "@(#)$FreeBSD$";
+#endif
+
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/file.h>
+#if defined(__NetBSD__) && (NetBSD >= 199905) && !defined(IPFILTER_LKM) && \
+ defined(_KERNEL)
+# include "opt_ipfilter_log.h"
+#endif
+#if (defined(KERNEL) || defined(_KERNEL)) && defined(__FreeBSD_version) && \
+ (__FreeBSD_version >= 220000)
+# if (__FreeBSD_version >= 400000)
+# ifndef KLD_MODULE
+# include "opt_inet6.h"
+# endif
+# if (__FreeBSD_version == 400019)
+# define CSUM_DELAY_DATA
+# endif
+# endif
+# include <sys/filio.h>
+# include <sys/fcntl.h>
+#else
+# include <sys/ioctl.h>
+#endif
+#if (defined(_KERNEL) || defined(KERNEL)) && !defined(linux)
+# include <sys/systm.h>
+#else
+# include <stdio.h>
+# include <string.h>
+# include <stdlib.h>
+#endif
+#include <sys/uio.h>
+#if !defined(__SVR4) && !defined(__svr4__)
+# ifndef linux
+# include <sys/mbuf.h>
+# endif
+#else
+# include <sys/byteorder.h>
+# if SOLARIS2 < 5
+# include <sys/dditypes.h>
+# endif
+# include <sys/stream.h>
+#endif
+#ifndef linux
+# include <sys/protosw.h>
+# include <sys/socket.h>
+#endif
+#include <net/if.h>
+#ifdef sun
+# include <net/af.h>
+#endif
+#include <net/route.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#ifndef linux
+# include <netinet/ip_var.h>
+#endif
+#if defined(__sgi) && defined(IFF_DRVRLOCK) /* IRIX 6 */
+# include <sys/hashing.h>
+# include <netinet/in_var.h>
+#endif
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+#include <netinet/ip_icmp.h>
+#include "netinet/ip_compat.h"
+#ifdef USE_INET6
+# include <netinet/icmp6.h>
+# if !SOLARIS && defined(_KERNEL)
+# include <netinet6/in6_var.h>
+# endif
+#endif
+#include <netinet/tcpip.h>
+#include "netinet/ip_fil.h"
+#include "netinet/ip_proxy.h"
+#include "netinet/ip_nat.h"
+#include "netinet/ip_frag.h"
+#include "netinet/ip_state.h"
+#include "netinet/ip_auth.h"
+# if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+# if defined(_KERNEL) && !defined(IPFILTER_LKM)
+# include "opt_ipfilter.h"
+# endif
+# endif
+#ifndef MIN
+# define MIN(a,b) (((a)<(b))?(a):(b))
+#endif
+#include "netinet/ipl.h"
+
+#include <machine/in_cksum.h>
+
+#ifndef _KERNEL
+# include "ipf.h"
+# include "ipt.h"
+extern int opts;
+
+# define FR_VERBOSE(verb_pr) verbose verb_pr
+# define FR_DEBUG(verb_pr) debug verb_pr
+# define IPLLOG(a, c, d, e) ipllog()
+#else /* #ifndef _KERNEL */
+# define FR_VERBOSE(verb_pr)
+# define FR_DEBUG(verb_pr)
+# define IPLLOG(a, c, d, e) ipflog(a, c, d, e)
+# if SOLARIS || defined(__sgi)
+extern KRWLOCK_T ipf_mutex, ipf_auth, ipf_nat;
+extern kmutex_t ipf_rw;
+# endif
+# if SOLARIS
+# define FR_NEWAUTH(m, fi, ip, qif) fr_newauth((mb_t *)m, fi, \
+ ip, qif)
+# else /* SOLARIS */
+# define FR_NEWAUTH(m, fi, ip, qif) fr_newauth((mb_t *)m, fi, ip)
+# endif /* SOLARIS || __sgi */
+#endif /* _KERNEL */
+
+
+struct filterstats frstats[2] = {{0,0,0,0,0},{0,0,0,0,0}};
+struct frentry *ipfilter[2][2] = { { NULL, NULL }, { NULL, NULL } },
+#ifdef USE_INET6
+ *ipfilter6[2][2] = { { NULL, NULL }, { NULL, NULL } },
+ *ipacct6[2][2] = { { NULL, NULL }, { NULL, NULL } },
+#endif
+ *ipacct[2][2] = { { NULL, NULL }, { NULL, NULL } };
+struct frgroup *ipfgroups[3][2];
+int fr_flags = IPF_LOGGING;
+int fr_active = 0;
+int fr_chksrc = 0;
+int fr_minttl = 3;
+int fr_minttllog = 1;
+#if defined(IPFILTER_DEFAULT_BLOCK)
+int fr_pass = FR_NOMATCH|FR_BLOCK;
+#else
+int fr_pass = (IPF_DEFAULT_PASS|FR_NOMATCH);
+#endif
+char ipfilter_version[] = IPL_VERSION;
+
+fr_info_t frcache[2];
+
+static int frflushlist __P((int, minor_t, int *, frentry_t **));
+#ifdef _KERNEL
+static void frsynclist __P((frentry_t *));
+#endif
+
+
+/*
+ * bit values for identifying presence of individual IP options
+ */
+struct optlist ipopts[20] = {
+ { IPOPT_NOP, 0x000001 },
+ { IPOPT_RR, 0x000002 },
+ { IPOPT_ZSU, 0x000004 },
+ { IPOPT_MTUP, 0x000008 },
+ { IPOPT_MTUR, 0x000010 },
+ { IPOPT_ENCODE, 0x000020 },
+ { IPOPT_TS, 0x000040 },
+ { IPOPT_TR, 0x000080 },
+ { IPOPT_SECURITY, 0x000100 },
+ { IPOPT_LSRR, 0x000200 },
+ { IPOPT_E_SEC, 0x000400 },
+ { IPOPT_CIPSO, 0x000800 },
+ { IPOPT_SATID, 0x001000 },
+ { IPOPT_SSRR, 0x002000 },
+ { IPOPT_ADDEXT, 0x004000 },
+ { IPOPT_VISA, 0x008000 },
+ { IPOPT_IMITD, 0x010000 },
+ { IPOPT_EIP, 0x020000 },
+ { IPOPT_FINN, 0x040000 },
+ { 0, 0x000000 }
+};
+
+/*
+ * bit values for identifying presence of individual IP security options
+ */
+struct optlist secopt[8] = {
+ { IPSO_CLASS_RES4, 0x01 },
+ { IPSO_CLASS_TOPS, 0x02 },
+ { IPSO_CLASS_SECR, 0x04 },
+ { IPSO_CLASS_RES3, 0x08 },
+ { IPSO_CLASS_CONF, 0x10 },
+ { IPSO_CLASS_UNCL, 0x20 },
+ { IPSO_CLASS_RES2, 0x40 },
+ { IPSO_CLASS_RES1, 0x80 }
+};
+
+
+/*
+ * compact the IP header into a structure which contains just the info.
+ * which is useful for comparing IP headers with.
+ */
+void fr_makefrip(hlen, ip, fin)
+int hlen;
+ip_t *ip;
+fr_info_t *fin;
+{
+ u_short optmsk = 0, secmsk = 0, auth = 0;
+ int i, mv, ol, off, p, plen, v;
+ fr_ip_t *fi = &fin->fin_fi;
+ struct optlist *op;
+ u_char *s, opt;
+ tcphdr_t *tcp;
+
+ fin->fin_rev = 0;
+ fin->fin_fr = NULL;
+ fin->fin_tcpf = 0;
+ fin->fin_data[0] = 0;
+ fin->fin_data[1] = 0;
+ fin->fin_rule = -1;
+ fin->fin_group = -1;
+#ifdef _KERNEL
+ fin->fin_icode = ipl_unreach;
+#endif
+ v = fin->fin_v;
+ fi->fi_v = v;
+ fin->fin_hlen = hlen;
+ if (v == 4) {
+ fin->fin_id = ip->ip_id;
+ fi->fi_tos = ip->ip_tos;
+ off = (ip->ip_off & IP_OFFMASK) << 3;
+ tcp = (tcphdr_t *)((char *)ip + hlen);
+ (*(((u_short *)fi) + 1)) = (*(((u_short *)ip) + 4));
+ fi->fi_src.i6[1] = 0;
+ fi->fi_src.i6[2] = 0;
+ fi->fi_src.i6[3] = 0;
+ fi->fi_dst.i6[1] = 0;
+ fi->fi_dst.i6[2] = 0;
+ fi->fi_dst.i6[3] = 0;
+ fi->fi_saddr = ip->ip_src.s_addr;
+ fi->fi_daddr = ip->ip_dst.s_addr;
+ p = ip->ip_p;
+ fi->fi_fl = (hlen > sizeof(ip_t)) ? FI_OPTIONS : 0;
+ if (ip->ip_off & 0x3fff)
+ fi->fi_fl |= FI_FRAG;
+ plen = ip->ip_len;
+ fin->fin_dlen = plen - hlen;
+ }
+#ifdef USE_INET6
+ else if (v == 6) {
+ ip6_t *ip6 = (ip6_t *)ip;
+
+ off = 0;
+ p = ip6->ip6_nxt;
+ fi->fi_p = p;
+ fi->fi_ttl = ip6->ip6_hlim;
+ tcp = (tcphdr_t *)(ip6 + 1);
+ fi->fi_src.in6 = ip6->ip6_src;
+ fi->fi_dst.in6 = ip6->ip6_dst;
+ fin->fin_id = (u_short)(ip6->ip6_flow & 0xffff);
+ fi->fi_tos = 0;
+ fi->fi_fl = 0;
+ plen = ntohs(ip6->ip6_plen);
+ fin->fin_dlen = plen;
+ }
+#endif
+ else
+ return;
+
+ fin->fin_off = off;
+ fin->fin_plen = plen;
+ fin->fin_dp = (void *)tcp;
+
+ switch (p)
+ {
+#ifdef USE_INET6
+ case IPPROTO_ICMPV6 :
+ {
+ int minicmpsz = sizeof(struct icmp6_hdr);
+ struct icmp6_hdr *icmp6;
+
+ if (fin->fin_dlen > 1) {
+ fin->fin_data[0] = *(u_short *)tcp;
+
+ icmp6 = (struct icmp6_hdr *)tcp;
+
+ switch (icmp6->icmp6_type)
+ {
+ case ICMP6_ECHO_REPLY :
+ case ICMP6_ECHO_REQUEST :
+ minicmpsz = ICMP6ERR_MINPKTLEN;
+ break;
+ case ICMP6_DST_UNREACH :
+ case ICMP6_PACKET_TOO_BIG :
+ case ICMP6_TIME_EXCEEDED :
+ case ICMP6_PARAM_PROB :
+ minicmpsz = ICMP6ERR_IPICMPHLEN;
+ break;
+ default :
+ break;
+ }
+ }
+
+ if (!(plen >= hlen + minicmpsz))
+ fi->fi_fl |= FI_SHORT;
+
+ break;
+ }
+#endif
+ case IPPROTO_ICMP :
+ {
+ int minicmpsz = sizeof(struct icmp);
+ icmphdr_t *icmp;
+
+ if (!off && (fin->fin_dlen > 1)) {
+ fin->fin_data[0] = *(u_short *)tcp;
+
+ icmp = (icmphdr_t *)tcp;
+
+ if (icmp->icmp_type == ICMP_ECHOREPLY ||
+ icmp->icmp_type == ICMP_ECHO)
+ minicmpsz = ICMP_MINLEN;
+
+ /*
+ * type(1) + code(1) + cksum(2) + id(2) seq(2) +
+ * 3*timestamp(3*4)
+ */
+ else if (icmp->icmp_type == ICMP_TSTAMP ||
+ icmp->icmp_type == ICMP_TSTAMPREPLY)
+ minicmpsz = 20;
+
+ /*
+ * type(1) + code(1) + cksum(2) + id(2) seq(2) +
+ * mask(4)
+ */
+ else if (icmp->icmp_type == ICMP_MASKREQ ||
+ icmp->icmp_type == ICMP_MASKREPLY)
+ minicmpsz = 12;
+ }
+
+ if ((!(plen >= hlen + minicmpsz) && !off) ||
+ (off && off < sizeof(struct icmp)))
+ fi->fi_fl |= FI_SHORT;
+
+ break;
+ }
+ case IPPROTO_TCP :
+ fi->fi_fl |= FI_TCPUDP;
+#ifdef USE_INET6
+ if (v == 6) {
+ if (plen < sizeof(struct tcphdr))
+ fi->fi_fl |= FI_SHORT;
+ } else
+#endif
+ if (v == 4) {
+ if ((!IPMINLEN(ip, tcphdr) && !off) ||
+ (off && off < sizeof(struct tcphdr)))
+ fi->fi_fl |= FI_SHORT;
+ }
+ if (!(fi->fi_fl & FI_SHORT) && !off)
+ fin->fin_tcpf = tcp->th_flags;
+ goto getports;
+ case IPPROTO_UDP :
+ fi->fi_fl |= FI_TCPUDP;
+#ifdef USE_INET6
+ if (v == 6) {
+ if (plen < sizeof(struct udphdr))
+ fi->fi_fl |= FI_SHORT;
+ } else
+#endif
+ if (v == 4) {
+ if ((!IPMINLEN(ip, udphdr) && !off) ||
+ (off && off < sizeof(struct udphdr)))
+ fi->fi_fl |= FI_SHORT;
+ }
+getports:
+ if (!off && (fin->fin_dlen > 3)) {
+ fin->fin_data[0] = ntohs(tcp->th_sport);
+ fin->fin_data[1] = ntohs(tcp->th_dport);
+ }
+ break;
+ default :
+ break;
+ }
+
+#ifdef USE_INET6
+ if (v == 6) {
+ fi->fi_optmsk = 0;
+ fi->fi_secmsk = 0;
+ fi->fi_auth = 0;
+ return;
+ }
+#endif
+
+ for (s = (u_char *)(ip + 1), hlen -= (int)sizeof(*ip); hlen > 0; ) {
+ opt = *s;
+ if (opt == '\0')
+ break;
+ else if (opt == IPOPT_NOP)
+ ol = 1;
+ else {
+ if (hlen < 2)
+ break;
+ ol = (int)*(s + 1);
+ if (ol < 2 || ol > hlen)
+ break;
+ }
+ for (i = 9, mv = 4; mv >= 0; ) {
+ op = ipopts + i;
+ if (opt == (u_char)op->ol_val) {
+ optmsk |= op->ol_bit;
+ if (opt == IPOPT_SECURITY) {
+ struct optlist *sp;
+ u_char sec;
+ int j, m;
+
+ sec = *(s + 2); /* classification */
+ for (j = 3, m = 2; m >= 0; ) {
+ sp = secopt + j;
+ if (sec == sp->ol_val) {
+ secmsk |= sp->ol_bit;
+ auth = *(s + 3);
+ auth *= 256;
+ auth += *(s + 4);
+ break;
+ }
+ if (sec < sp->ol_val)
+ j -= m--;
+ else
+ j += m--;
+ }
+ }
+ break;
+ }
+ if (opt < op->ol_val)
+ i -= mv--;
+ else
+ i += mv--;
+ }
+ hlen -= ol;
+ s += ol;
+ }
+ if (auth && !(auth & 0x0100))
+ auth &= 0xff00;
+ fi->fi_optmsk = optmsk;
+ fi->fi_secmsk = secmsk;
+ fi->fi_auth = auth;
+}
+
+
+/*
+ * check an IP packet for TCP/UDP characteristics such as ports and flags.
+ */
+int fr_tcpudpchk(ft, fin)
+frtuc_t *ft;
+fr_info_t *fin;
+{
+ register u_short po, tup;
+ register char i;
+ register int err = 1;
+
+ /*
+ * Both ports should *always* be in the first fragment.
+ * So far, I cannot find any cases where they can not be.
+ *
+ * compare destination ports
+ */
+ if ((i = (int)ft->ftu_dcmp)) {
+ po = ft->ftu_dport;
+ tup = fin->fin_data[1];
+ /*
+ * Do opposite test to that required and
+ * continue if that succeeds.
+ */
+ if (!--i && tup != po) /* EQUAL */
+ err = 0;
+ else if (!--i && tup == po) /* NOTEQUAL */
+ err = 0;
+ else if (!--i && tup >= po) /* LESSTHAN */
+ err = 0;
+ else if (!--i && tup <= po) /* GREATERTHAN */
+ err = 0;
+ else if (!--i && tup > po) /* LT or EQ */
+ err = 0;
+ else if (!--i && tup < po) /* GT or EQ */
+ err = 0;
+ else if (!--i && /* Out of range */
+ (tup >= po && tup <= ft->ftu_dtop))
+ err = 0;
+ else if (!--i && /* In range */
+ (tup <= po || tup >= ft->ftu_dtop))
+ err = 0;
+ }
+ /*
+ * compare source ports
+ */
+ if (err && (i = (int)ft->ftu_scmp)) {
+ po = ft->ftu_sport;
+ tup = fin->fin_data[0];
+ if (!--i && tup != po)
+ err = 0;
+ else if (!--i && tup == po)
+ err = 0;
+ else if (!--i && tup >= po)
+ err = 0;
+ else if (!--i && tup <= po)
+ err = 0;
+ else if (!--i && tup > po)
+ err = 0;
+ else if (!--i && tup < po)
+ err = 0;
+ else if (!--i && /* Out of range */
+ (tup >= po && tup <= ft->ftu_stop))
+ err = 0;
+ else if (!--i && /* In range */
+ (tup <= po || tup >= ft->ftu_stop))
+ err = 0;
+ }
+
+ /*
+ * If we don't have all the TCP/UDP header, then how can we
+ * expect to do any sort of match on it ? If we were looking for
+ * TCP flags, then NO match. If not, then match (which should
+ * satisfy the "short" class too).
+ */
+ if (err && (fin->fin_fi.fi_p == IPPROTO_TCP)) {
+ if (fin->fin_fi.fi_fl & FI_SHORT)
+ return !(ft->ftu_tcpf | ft->ftu_tcpfm);
+ /*
+ * Match the flags ? If not, abort this match.
+ */
+ if (ft->ftu_tcpfm &&
+ ft->ftu_tcpf != (fin->fin_tcpf & ft->ftu_tcpfm)) {
+ FR_DEBUG(("f. %#x & %#x != %#x\n", fin->fin_tcpf,
+ ft->ftu_tcpfm, ft->ftu_tcpf));
+ err = 0;
+ }
+ }
+ return err;
+}
+
+/*
+ * Check the input/output list of rules for a match and result.
+ * Could be per interface, but this gets real nasty when you don't have
+ * kernel sauce.
+ */
+int fr_scanlist(pass, ip, fin, m)
+u_32_t pass;
+ip_t *ip;
+register fr_info_t *fin;
+void *m;
+{
+ register struct frentry *fr;
+ register fr_ip_t *fi = &fin->fin_fi;
+ int rulen, portcmp = 0, off, skip = 0, logged = 0;
+ u_32_t passt;
+
+ fr = fin->fin_fr;
+ fin->fin_fr = NULL;
+ fin->fin_rule = 0;
+ fin->fin_group = 0;
+ if (fin->fin_v == 4)
+ off = ip->ip_off & IP_OFFMASK;
+ else
+ off = 0;
+ pass |= (fi->fi_fl << 24);
+
+ if ((fi->fi_fl & FI_TCPUDP) && (fin->fin_dlen > 3) && !off)
+ portcmp = 1;
+
+ for (rulen = 0; fr; fr = fr->fr_next, rulen++) {
+ if (skip) {
+ skip--;
+ continue;
+ }
+ /*
+ * In all checks below, a null (zero) value in the
+ * filter struture is taken to mean a wildcard.
+ *
+ * check that we are working for the right interface
+ */
+#ifdef _KERNEL
+# if BSD >= 199306
+ if (fin->fin_out != 0) {
+ if ((fr->fr_oifa &&
+ fr->fr_oifa != ((mb_t *)m)->m_pkthdr.rcvif) ||
+ (fr->fr_ifa && fr->fr_ifa != fin->fin_ifp))
+ continue;
+ } else
+# endif
+ if (fr->fr_ifa && fr->fr_ifa != fin->fin_ifp)
+ continue;
+#else
+ if (opts & (OPT_VERBOSE|OPT_DEBUG))
+ printf("\n");
+ FR_VERBOSE(("%c", (pass & FR_PASS) ? 'p' :
+ (pass & FR_AUTH) ? 'a' : 'b'));
+ if (fr->fr_ifa && fr->fr_ifa != fin->fin_ifp)
+ continue;
+ FR_VERBOSE((":i"));
+#endif
+ {
+ register u_32_t *ld, *lm, *lip;
+ register int i;
+
+ lip = (u_32_t *)fi;
+ lm = (u_32_t *)&fr->fr_mip;
+ ld = (u_32_t *)&fr->fr_ip;
+ i = ((*lip & *lm) != *ld);
+ FR_DEBUG(("0. %#08x & %#08x != %#08x\n",
+ *lip, *lm, *ld));
+ if (i)
+ continue;
+ /*
+ * We now know whether the packet version and the
+ * rule version match, along with protocol, ttl and
+ * tos.
+ */
+ lip++, lm++, ld++;
+ /*
+ * Unrolled loops (4 each, for 32 bits).
+ */
+ i |= ((*lip & *lm) != *ld) << 19;
+ FR_DEBUG(("1a. %#08x & %#08x != %#08x\n",
+ *lip, *lm, *ld));
+ if (fi->fi_v == 6) {
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld) << 19;
+ FR_DEBUG(("1b. %#08x & %#08x != %#08x\n",
+ *lip, *lm, *ld));
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld) << 19;
+ FR_DEBUG(("1c. %#08x & %#08x != %#08x\n",
+ *lip, *lm, *ld));
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld) << 19;
+ FR_DEBUG(("1d. %#08x & %#08x != %#08x\n",
+ *lip, *lm, *ld));
+ } else {
+ lip += 3;
+ lm += 3;
+ ld += 3;
+ }
+ i ^= (fr->fr_flags & FR_NOTSRCIP);
+ if (i)
+ continue;
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld) << 20;
+ FR_DEBUG(("2a. %#08x & %#08x != %#08x\n",
+ *lip, *lm, *ld));
+ if (fi->fi_v == 6) {
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld) << 20;
+ FR_DEBUG(("2b. %#08x & %#08x != %#08x\n",
+ *lip, *lm, *ld));
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld) << 20;
+ FR_DEBUG(("2c. %#08x & %#08x != %#08x\n",
+ *lip, *lm, *ld));
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld) << 20;
+ FR_DEBUG(("2d. %#08x & %#08x != %#08x\n",
+ *lip, *lm, *ld));
+ } else {
+ lip += 3;
+ lm += 3;
+ ld += 3;
+ }
+ i ^= (fr->fr_flags & FR_NOTDSTIP);
+ if (i)
+ continue;
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld);
+ FR_DEBUG(("3. %#08x & %#08x != %#08x\n",
+ *lip, *lm, *ld));
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld);
+ FR_DEBUG(("4. %#08x & %#08x != %#08x\n",
+ *lip, *lm, *ld));
+ if (i)
+ continue;
+ }
+
+ /*
+ * If a fragment, then only the first has what we're looking
+ * for here...
+ */
+ if (!portcmp && (fr->fr_dcmp || fr->fr_scmp || fr->fr_tcpf ||
+ fr->fr_tcpfm))
+ continue;
+ if (fi->fi_fl & FI_TCPUDP) {
+ if (!fr_tcpudpchk(&fr->fr_tuc, fin))
+ continue;
+ } else if (fr->fr_icmpm || fr->fr_icmp) {
+ if ((fi->fi_p != IPPROTO_ICMP) || off ||
+ (fin->fin_dlen < 2))
+ continue;
+ if ((fin->fin_data[0] & fr->fr_icmpm) != fr->fr_icmp) {
+ FR_DEBUG(("i. %#x & %#x != %#x\n",
+ fin->fin_data[0], fr->fr_icmpm,
+ fr->fr_icmp));
+ continue;
+ }
+ }
+ FR_VERBOSE(("*"));
+ /*
+ * Just log this packet...
+ */
+ passt = fr->fr_flags;
+#if (BSD >= 199306) && (defined(_KERNEL) || defined(KERNEL))
+ if (securelevel <= 0)
+#endif
+ if ((passt & FR_CALLNOW) && fr->fr_func)
+ passt = (*fr->fr_func)(passt, ip, fin);
+ fin->fin_fr = fr;
+#ifdef IPFILTER_LOG
+ if ((passt & FR_LOGMASK) == FR_LOG) {
+ if (!IPLLOG(passt, ip, fin, m)) {
+ if (passt & FR_LOGORBLOCK)
+ passt |= FR_BLOCK|FR_QUICK;
+ ATOMIC_INCL(frstats[fin->fin_out].fr_skip);
+ }
+ ATOMIC_INCL(frstats[fin->fin_out].fr_pkl);
+ logged = 1;
+ }
+#endif /* IPFILTER_LOG */
+ if (!(skip = fr->fr_skip) && (passt & FR_LOGMASK) != FR_LOG)
+ pass = passt;
+ FR_DEBUG(("pass %#x\n", pass));
+ ATOMIC_INCL(fr->fr_hits);
+ if (pass & FR_ACCOUNT)
+ fr->fr_bytes += (U_QUAD_T)ip->ip_len;
+ else
+ fin->fin_icode = fr->fr_icode;
+ fin->fin_rule = rulen;
+ fin->fin_group = fr->fr_group;
+ if (fr->fr_grp) {
+ fin->fin_fr = fr->fr_grp;
+ pass = fr_scanlist(pass, ip, fin, m);
+ if (fin->fin_fr == NULL) {
+ fin->fin_rule = rulen;
+ fin->fin_group = fr->fr_group;
+ fin->fin_fr = fr;
+ }
+ if (pass & FR_DONTCACHE)
+ logged = 1;
+ }
+ if (pass & FR_QUICK)
+ break;
+ }
+ if (logged)
+ pass |= FR_DONTCACHE;
+ return pass;
+}
+
+
+/*
+ * frcheck - filter check
+ * check using source and destination addresses/ports in a packet whether
+ * or not to pass it on or not.
+ */
+int fr_check(ip, hlen, ifp, out
+#if defined(_KERNEL) && SOLARIS
+, qif, mp)
+qif_t *qif;
+#else
+, mp)
+#endif
+mb_t **mp;
+ip_t *ip;
+int hlen;
+void *ifp;
+int out;
+{
+ /*
+ * The above really sucks, but short of writing a diff
+ */
+ fr_info_t frinfo, *fc;
+ register fr_info_t *fin = &frinfo;
+ int changed, error = EHOSTUNREACH, v = ip->ip_v;
+ frentry_t *fr = NULL, *list;
+ u_32_t pass, apass;
+#if !SOLARIS || !defined(_KERNEL)
+ register mb_t *m = *mp;
+#endif
+
+#ifdef _KERNEL
+ int p, len, drop = 0, logit = 0;
+ mb_t *mc = NULL;
+# if !defined(__SVR4) && !defined(__svr4__)
+# ifdef __sgi
+ char hbuf[(0xf << 2) + sizeof(struct icmp) + sizeof(ip_t) + 8];
+# endif
+ int up;
+
+# ifdef M_CANFASTFWD
+ /*
+ * XXX For now, IP Filter and fast-forwarding of cached flows
+ * XXX are mutually exclusive. Eventually, IP Filter should
+ * XXX get a "can-fast-forward" filter rule.
+ */
+ m->m_flags &= ~M_CANFASTFWD;
+# endif /* M_CANFASTFWD */
+# ifdef CSUM_DELAY_DATA
+ /*
+ * disable delayed checksums.
+ */
+ if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA) {
+ in_delayed_cksum(m);
+ m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA;
+ }
+# endif /* CSUM_DELAY_DATA */
+
+# ifdef USE_INET6
+ if (v == 6) {
+ len = ntohs(((ip6_t*)ip)->ip6_plen);
+ p = ((ip6_t *)ip)->ip6_nxt;
+ } else
+# endif
+ {
+ p = ip->ip_p;
+ len = ip->ip_len;
+ }
+
+ if ((p == IPPROTO_TCP || p == IPPROTO_UDP || p == IPPROTO_ICMP
+# ifdef USE_INET6
+ || (v == 6 && p == IPPROTO_ICMPV6)
+# endif
+ )) {
+ int plen = 0;
+
+ if ((v == 6) || (ip->ip_off & IP_OFFMASK) == 0)
+ switch(p)
+ {
+ case IPPROTO_TCP:
+ plen = sizeof(tcphdr_t);
+ break;
+ case IPPROTO_UDP:
+ plen = sizeof(udphdr_t);
+ break;
+ /* 96 - enough for complete ICMP error IP header */
+ case IPPROTO_ICMP:
+ plen = ICMPERR_MAXPKTLEN - sizeof(ip_t);
+ break;
+# ifdef USE_INET6
+ case IPPROTO_ICMPV6 :
+ /*
+ * XXX does not take intermediate header
+ * into account
+ */
+ plen = ICMP6ERR_MINPKTLEN + 8 - sizeof(ip6_t);
+ break;
+# endif
+ }
+ up = MIN(hlen + plen, len);
+
+ if (up > m->m_len) {
+# ifdef __sgi
+ /* Under IRIX, avoid m_pullup as it makes ping <hostname> panic */
+ if ((up > sizeof(hbuf)) || (m_length(m) < up)) {
+ ATOMIC_INCL(frstats[out].fr_pull[1]);
+ return -1;
+ }
+ m_copydata(m, 0, up, hbuf);
+ ATOMIC_INCL(frstats[out].fr_pull[0]);
+ ip = (ip_t *)hbuf;
+# else /* __ sgi */
+# ifndef linux
+ if ((*mp = m_pullup(m, up)) == 0) {
+ ATOMIC_INCL(frstats[out].fr_pull[1]);
+ return -1;
+ } else {
+ ATOMIC_INCL(frstats[out].fr_pull[0]);
+ m = *mp;
+ ip = mtod(m, ip_t *);
+ }
+# endif /* !linux */
+# endif /* __sgi */
+ } else
+ up = 0;
+ } else
+ up = 0;
+# endif /* !defined(__SVR4) && !defined(__svr4__) */
+# if SOLARIS
+ mb_t *m = qif->qf_m;
+
+ if ((u_int)ip & 0x3)
+ return 2;
+ fin->fin_qfm = m;
+ fin->fin_qif = qif;
+# endif
+#endif /* _KERNEL */
+
+#ifndef __FreeBSD__
+ /*
+ * Be careful here: ip_id is in network byte order when called
+ * from ip_output()
+ */
+ if ((out) && (v == 4))
+ ip->ip_id = ntohs(ip->ip_id);
+#endif
+
+ changed = 0;
+ fin->fin_ifp = ifp;
+ fin->fin_v = v;
+ fin->fin_out = out;
+ fin->fin_mp = mp;
+ fr_makefrip(hlen, ip, fin);
+
+#ifdef _KERNEL
+# ifdef USE_INET6
+ if (v == 6) {
+ ATOMIC_INCL(frstats[0].fr_ipv6[out]);
+ if (((ip6_t *)ip)->ip6_hlim < fr_minttl) {
+ ATOMIC_INCL(frstats[0].fr_badttl);
+ if (fr_minttllog)
+ logit = -2;
+ }
+ } else
+# endif
+ if (!out) {
+ if (fr_chksrc && !fr_verifysrc(ip->ip_src, ifp)) {
+ ATOMIC_INCL(frstats[0].fr_badsrc);
+ if (fr_chksrc == 2)
+ logit = -2;
+ } else if (ip->ip_ttl < fr_minttl) {
+ ATOMIC_INCL(frstats[0].fr_badttl);
+ if (fr_minttllog)
+ logit = -3;
+ }
+ }
+ if (drop) {
+# ifdef IPFILTER_LOG
+ if (logit) {
+ fin->fin_group = logit;
+ pass = FR_INQUE|FR_NOMATCH|FR_LOGB;
+ (void) IPLLOG(pass, ip, fin, m);
+ }
+# endif
+# if !SOLARIS
+ m_freem(m);
+# endif
+ return error;
+ }
+#endif
+ pass = fr_pass;
+ if (fin->fin_fi.fi_fl & FI_SHORT) {
+ ATOMIC_INCL(frstats[out].fr_short);
+ }
+
+ READ_ENTER(&ipf_mutex);
+
+ if (fin->fin_fi.fi_fl & FI_SHORT)
+ ATOMIC_INCL(frstats[out].fr_short);
+
+ /*
+ * Check auth now. This, combined with the check below to see if apass
+ * is 0 is to ensure that we don't count the packet twice, which can
+ * otherwise occur when we reprocess it. As it is, we only count it
+ * after it has no auth. table matchup. This also stops NAT from
+ * occuring until after the packet has been auth'd.
+ */
+ apass = fr_checkauth(ip, fin);
+
+ if (!out) {
+#ifdef USE_INET6
+ if (v == 6)
+ list = ipacct6[0][fr_active];
+ else
+#endif
+ list = ipacct[0][fr_active];
+ changed = ip_natin(ip, fin);
+ if (!apass && (fin->fin_fr = list) &&
+ (fr_scanlist(FR_NOMATCH, ip, fin, m) & FR_ACCOUNT)) {
+ ATOMIC_INCL(frstats[0].fr_acct);
+ }
+ }
+
+ if (apass || (!(fr = ipfr_knownfrag(ip, fin)) &&
+ !(fr = fr_checkstate(ip, fin)))) {
+ /*
+ * If a packet is found in the auth table, then skip checking
+ * the access lists for permission but we do need to consider
+ * the result as if it were from the ACL's.
+ */
+ if (!apass) {
+ fc = frcache + out;
+ if (!bcmp((char *)fin, (char *)fc, FI_CSIZE)) {
+ /*
+ * copy cached data so we can unlock the mutex
+ * earlier.
+ */
+ bcopy((char *)fc, (char *)fin, FI_COPYSIZE);
+ ATOMIC_INCL(frstats[out].fr_chit);
+ if ((fr = fin->fin_fr)) {
+ ATOMIC_INCL(fr->fr_hits);
+ pass = fr->fr_flags;
+ }
+ } else {
+#ifdef USE_INET6
+ if (v == 6)
+ list = ipfilter6[out][fr_active];
+ else
+#endif
+ list = ipfilter[out][fr_active];
+ if ((fin->fin_fr = list))
+ pass = fr_scanlist(fr_pass, ip, fin, m);
+ if (!(pass & (FR_KEEPSTATE|FR_DONTCACHE)))
+ bcopy((char *)fin, (char *)fc,
+ FI_COPYSIZE);
+ if (pass & FR_NOMATCH) {
+ ATOMIC_INCL(frstats[out].fr_nom);
+ }
+ }
+ fr = fin->fin_fr;
+ } else
+ pass = apass;
+
+ /*
+ * If we fail to add a packet to the authorization queue,
+ * then we drop the packet later. However, if it was added
+ * then pretend we've dropped it already.
+ */
+ if ((pass & FR_AUTH))
+ if (fr_newauth((mb_t *)m, fin, ip) != 0)
+#ifdef _KERNEL
+ m = *mp = NULL;
+#else
+ ;
+#endif
+
+ if (pass & FR_PREAUTH) {
+ READ_ENTER(&ipf_auth);
+ if ((fin->fin_fr = ipauth) &&
+ (pass = fr_scanlist(0, ip, fin, m))) {
+ ATOMIC_INCL(fr_authstats.fas_hits);
+ } else {
+ ATOMIC_INCL(fr_authstats.fas_miss);
+ }
+ RWLOCK_EXIT(&ipf_auth);
+ }
+
+ fin->fin_fr = fr;
+ if ((pass & (FR_KEEPFRAG|FR_KEEPSTATE)) == FR_KEEPFRAG) {
+ if (fin->fin_fi.fi_fl & FI_FRAG) {
+ if (ipfr_newfrag(ip, fin, pass) == -1) {
+ ATOMIC_INCL(frstats[out].fr_bnfr);
+ } else {
+ ATOMIC_INCL(frstats[out].fr_nfr);
+ }
+ } else {
+ ATOMIC_INCL(frstats[out].fr_cfr);
+ }
+ }
+ if (pass & FR_KEEPSTATE) {
+ if (fr_addstate(ip, fin, 0) == NULL) {
+ ATOMIC_INCL(frstats[out].fr_bads);
+ } else {
+ ATOMIC_INCL(frstats[out].fr_ads);
+ }
+ }
+ } else if (fr != NULL) {
+ pass = fr->fr_flags;
+ if (pass & FR_LOGFIRST)
+ pass &= ~(FR_LOGFIRST|FR_LOG);
+ }
+
+#if (BSD >= 199306) && (defined(_KERNEL) || defined(KERNEL))
+ if (securelevel <= 0)
+#endif
+ if (fr && fr->fr_func && !(pass & FR_CALLNOW))
+ pass = (*fr->fr_func)(pass, ip, fin);
+
+ /*
+ * Only count/translate packets which will be passed on, out the
+ * interface.
+ */
+ if (out && (pass & FR_PASS)) {
+#ifdef USE_INET6
+ if (v == 6)
+ list = ipacct6[1][fr_active];
+ else
+#endif
+ list = ipacct[1][fr_active];
+ if ((fin->fin_fr = list) &&
+ (fr_scanlist(FR_NOMATCH, ip, fin, m) & FR_ACCOUNT)) {
+ ATOMIC_INCL(frstats[1].fr_acct);
+ }
+ fin->fin_fr = fr;
+ changed = ip_natout(ip, fin);
+ } else
+ fin->fin_fr = fr;
+ RWLOCK_EXIT(&ipf_mutex);
+
+#ifdef IPFILTER_LOG
+ if ((fr_flags & FF_LOGGING) || (pass & FR_LOGMASK)) {
+ if ((fr_flags & FF_LOGNOMATCH) && (pass & FR_NOMATCH)) {
+ pass |= FF_LOGNOMATCH;
+ ATOMIC_INCL(frstats[out].fr_npkl);
+ goto logit;
+ } else if (((pass & FR_LOGMASK) == FR_LOGP) ||
+ ((pass & FR_PASS) && (fr_flags & FF_LOGPASS))) {
+ if ((pass & FR_LOGMASK) != FR_LOGP)
+ pass |= FF_LOGPASS;
+ ATOMIC_INCL(frstats[out].fr_ppkl);
+ goto logit;
+ } else if (((pass & FR_LOGMASK) == FR_LOGB) ||
+ ((pass & FR_BLOCK) && (fr_flags & FF_LOGBLOCK))) {
+ if ((pass & FR_LOGMASK) != FR_LOGB)
+ pass |= FF_LOGBLOCK;
+ ATOMIC_INCL(frstats[out].fr_bpkl);
+logit:
+ if (!IPLLOG(pass, ip, fin, m)) {
+ ATOMIC_INCL(frstats[out].fr_skip);
+ if ((pass & (FR_PASS|FR_LOGORBLOCK)) ==
+ (FR_PASS|FR_LOGORBLOCK))
+ pass ^= FR_PASS|FR_BLOCK;
+ }
+ }
+ }
+#endif /* IPFILTER_LOG */
+
+#ifndef __FreeBSD__
+ if ((out) && (v == 4))
+ ip->ip_id = htons(ip->ip_id);
+#endif
+
+#ifdef _KERNEL
+ /*
+ * Only allow FR_DUP to work if a rule matched - it makes no sense to
+ * set FR_DUP as a "default" as there are no instructions about where
+ * to send the packet.
+ */
+ if (fr && (pass & FR_DUP))
+# if SOLARIS
+ mc = dupmsg(m);
+# else
+# ifndef linux
+ mc = m_copy(m, 0, M_COPYALL);
+# else
+ ;
+# endif
+# endif
+#endif
+ if (pass & FR_PASS) {
+ ATOMIC_INCL(frstats[out].fr_pass);
+ } else if (pass & FR_BLOCK) {
+ ATOMIC_INCL(frstats[out].fr_block);
+ /*
+ * Should we return an ICMP packet to indicate error
+ * status passing through the packet filter ?
+ * WARNING: ICMP error packets AND TCP RST packets should
+ * ONLY be sent in repsonse to incoming packets. Sending them
+ * in response to outbound packets can result in a panic on
+ * some operating systems.
+ */
+ if (!out) {
+#ifdef _KERNEL
+ if (pass & FR_RETICMP) {
+ int dst;
+
+ if ((pass & FR_RETMASK) == FR_FAKEICMP)
+ dst = 1;
+ else
+ dst = 0;
+ send_icmp_err(ip, ICMP_UNREACH, fin, dst);
+ ATOMIC_INCL(frstats[0].fr_ret);
+ } else if (((pass & FR_RETMASK) == FR_RETRST) &&
+ !(fin->fin_fi.fi_fl & FI_SHORT)) {
+ if (send_reset(ip, fin) == 0) {
+ ATOMIC_INCL(frstats[1].fr_ret);
+ }
+ }
+#else
+ if ((pass & FR_RETMASK) == FR_RETICMP) {
+ verbose("- ICMP unreachable sent\n");
+ ATOMIC_INCL(frstats[0].fr_ret);
+ } else if ((pass & FR_RETMASK) == FR_FAKEICMP) {
+ verbose("- forged ICMP unreachable sent\n");
+ ATOMIC_INCL(frstats[0].fr_ret);
+ } else if (((pass & FR_RETMASK) == FR_RETRST) &&
+ !(fin->fin_fi.fi_fl & FI_SHORT)) {
+ verbose("- TCP RST sent\n");
+ ATOMIC_INCL(frstats[1].fr_ret);
+ }
+#endif
+ } else {
+ if (pass & FR_RETRST)
+ error = ECONNRESET;
+ }
+ }
+
+ /*
+ * If we didn't drop off the bottom of the list of rules (and thus
+ * the 'current' rule fr is not NULL), then we may have some extra
+ * instructions about what to do with a packet.
+ * Once we're finished return to our caller, freeing the packet if
+ * we are dropping it (* BSD ONLY *).
+ */
+ if ((changed == -1) && (pass & FR_PASS)) {
+ pass &= ~FR_PASS;
+ pass |= FR_BLOCK;
+ }
+#if defined(_KERNEL)
+# if !SOLARIS
+# if !defined(linux)
+ if (fr) {
+ frdest_t *fdp = &fr->fr_tif;
+
+ if (((pass & FR_FASTROUTE) && !out) ||
+ (fdp->fd_ifp && fdp->fd_ifp != (struct ifnet *)-1)) {
+ if (ipfr_fastroute(m, fin, fdp) == 0)
+ m = *mp = NULL;
+ }
+ if (mc)
+ ipfr_fastroute(mc, fin, &fr->fr_dif);
+ }
+ if (!(pass & FR_PASS) && m)
+ m_freem(m);
+# ifdef __sgi
+ else if (changed && up && m)
+ m_copyback(m, 0, up, hbuf);
+# endif
+# endif /* !linux */
+# else /* !SOLARIS */
+ if (fr) {
+ frdest_t *fdp = &fr->fr_tif;
+
+ if (((pass & FR_FASTROUTE) && !out) ||
+ (fdp->fd_ifp && fdp->fd_ifp != (struct ifnet *)-1)) {
+ if (ipfr_fastroute(ip, m, mp, fin, fdp) == 0)
+ m = *mp = NULL;
+ }
+ if (mc)
+ ipfr_fastroute(ip, mc, mp, fin, &fr->fr_dif);
+ }
+# endif /* !SOLARIS */
+ return (pass & FR_PASS) ? 0 : error;
+#else /* _KERNEL */
+ if (pass & FR_NOMATCH)
+ return 1;
+ if (pass & FR_PASS)
+ return 0;
+ if (pass & FR_AUTH)
+ return -2;
+ return -1;
+#endif /* _KERNEL */
+}
+
+
+/*
+ * ipf_cksum
+ * addr should be 16bit aligned and len is in bytes.
+ * length is in bytes
+ */
+u_short ipf_cksum(addr, len)
+register u_short *addr;
+register int len;
+{
+ register u_32_t sum = 0;
+
+ for (sum = 0; len > 1; len -= 2)
+ sum += *addr++;
+
+ /* mop up an odd byte, if necessary */
+ if (len == 1)
+ sum += *(u_char *)addr;
+
+ /*
+ * add back carry outs from top 16 bits to low 16 bits
+ */
+ sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
+ sum += (sum >> 16); /* add carry */
+ return (u_short)(~sum);
+}
+
+
+/*
+ * NB: This function assumes we've pullup'd enough for all of the IP header
+ * and the TCP header. We also assume that data blocks aren't allocated in
+ * odd sizes.
+ */
+u_short fr_tcpsum(m, ip, tcp)
+mb_t *m;
+ip_t *ip;
+tcphdr_t *tcp;
+{
+ u_short *sp, slen, ts;
+ u_int sum, sum2;
+ int hlen;
+
+ /*
+ * Add up IP Header portion
+ */
+ hlen = ip->ip_hl << 2;
+ slen = ip->ip_len - hlen;
+ sum = htons((u_short)ip->ip_p);
+ sum += htons(slen);
+ sp = (u_short *)&ip->ip_src;
+ sum += *sp++; /* ip_src */
+ sum += *sp++;
+ sum += *sp++; /* ip_dst */
+ sum += *sp++;
+ ts = tcp->th_sum;
+ tcp->th_sum = 0;
+#ifdef KERNEL
+# if SOLARIS
+ sum2 = ip_cksum(m, hlen, sum); /* hlen == offset */
+ sum2 = (sum2 & 0xffff) + (sum2 >> 16);
+ sum2 = ~sum2 & 0xffff;
+# else /* SOLARIS */
+# if defined(BSD) || defined(sun)
+# if BSD >= 199306
+ m->m_data += hlen;
+# else
+ m->m_off += hlen;
+# endif
+ m->m_len -= hlen;
+ sum2 = in_cksum(m, slen);
+ m->m_len += hlen;
+# if BSD >= 199306
+ m->m_data -= hlen;
+# else
+ m->m_off -= hlen;
+# endif
+ /*
+ * Both sum and sum2 are partial sums, so combine them together.
+ */
+ sum = (sum & 0xffff) + (sum >> 16);
+ sum = ~sum & 0xffff;
+ sum2 += sum;
+ sum2 = (sum2 & 0xffff) + (sum2 >> 16);
+# else /* defined(BSD) || defined(sun) */
+{
+ union {
+ u_char c[2];
+ u_short s;
+ } bytes;
+ u_short len = ip->ip_len;
+# if defined(__sgi)
+ int add;
+# endif
+
+ /*
+ * Add up IP Header portion
+ */
+ sp = (u_short *)&ip->ip_src;
+ len -= (ip->ip_hl << 2);
+ sum = ntohs(IPPROTO_TCP);
+ sum += htons(len);
+ sum += *sp++; /* ip_src */
+ sum += *sp++;
+ sum += *sp++; /* ip_dst */
+ sum += *sp++;
+ if (sp != (u_short *)tcp)
+ sp = (u_short *)tcp;
+ sum += *sp++; /* sport */
+ sum += *sp++; /* dport */
+ sum += *sp++; /* seq */
+ sum += *sp++;
+ sum += *sp++; /* ack */
+ sum += *sp++;
+ sum += *sp++; /* off */
+ sum += *sp++; /* win */
+ sum += *sp++; /* Skip over checksum */
+ sum += *sp++; /* urp */
+
+# ifdef __sgi
+ /*
+ * In case we had to copy the IP & TCP header out of mbufs,
+ * skip over the mbuf bits which are the header
+ */
+ if ((caddr_t)ip != mtod(m, caddr_t)) {
+ hlen = (caddr_t)sp - (caddr_t)ip;
+ while (hlen) {
+ add = MIN(hlen, m->m_len);
+ sp = (u_short *)(mtod(m, caddr_t) + add);
+ hlen -= add;
+ if (add == m->m_len) {
+ m = m->m_next;
+ if (!hlen) {
+ if (!m)
+ break;
+ sp = mtod(m, u_short *);
+ }
+ PANIC((!m),("fr_tcpsum(1): not enough data"));
+ }
+ }
+ }
+# endif
+
+ if (!(len -= sizeof(*tcp)))
+ goto nodata;
+ while (len > 1) {
+ if (((caddr_t)sp - mtod(m, caddr_t)) >= m->m_len) {
+ m = m->m_next;
+ PANIC((!m),("fr_tcpsum(2): not enough data"));
+ sp = mtod(m, u_short *);
+ }
+ if (((caddr_t)(sp + 1) - mtod(m, caddr_t)) > m->m_len) {
+ bytes.c[0] = *(u_char *)sp;
+ m = m->m_next;
+ PANIC((!m),("fr_tcpsum(3): not enough data"));
+ sp = mtod(m, u_short *);
+ bytes.c[1] = *(u_char *)sp;
+ sum += bytes.s;
+ sp = (u_short *)((u_char *)sp + 1);
+ }
+ if ((u_long)sp & 1) {
+ bcopy((char *)sp++, (char *)&bytes.s, sizeof(bytes.s));
+ sum += bytes.s;
+ } else
+ sum += *sp++;
+ len -= 2;
+ }
+ if (len)
+ sum += ntohs(*(u_char *)sp << 8);
+nodata:
+ while (sum > 0xffff)
+ sum = (sum & 0xffff) + (sum >> 16);
+ sum2 = (u_short)(~sum & 0xffff);
+}
+# endif /* defined(BSD) || defined(sun) */
+# endif /* SOLARIS */
+#else /* KERNEL */
+ sum2 = 0;
+#endif /* KERNEL */
+ tcp->th_sum = ts;
+ return sum2;
+}
+
+
+#if defined(_KERNEL) && ( ((BSD < 199306) && !SOLARIS) || defined(__sgi) )
+/*
+ * Copyright (c) 1982, 1986, 1988, 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)uipc_mbuf.c 8.2 (Berkeley) 1/4/94
+ * $Id: fil.c,v 2.35.2.30 2000/12/17 05:49:22 darrenr Exp $
+ */
+/*
+ * Copy data from an mbuf chain starting "off" bytes from the beginning,
+ * continuing for "len" bytes, into the indicated buffer.
+ */
+void
+m_copydata(m, off, len, cp)
+ register mb_t *m;
+ register int off;
+ register int len;
+ caddr_t cp;
+{
+ register unsigned count;
+
+ if (off < 0 || len < 0)
+ panic("m_copydata");
+ while (off > 0) {
+ if (m == 0)
+ panic("m_copydata");
+ if (off < m->m_len)
+ break;
+ off -= m->m_len;
+ m = m->m_next;
+ }
+ while (len > 0) {
+ if (m == 0)
+ panic("m_copydata");
+ count = MIN(m->m_len - off, len);
+ bcopy(mtod(m, caddr_t) + off, cp, count);
+ len -= count;
+ cp += count;
+ off = 0;
+ m = m->m_next;
+ }
+}
+
+
+# ifndef linux
+/*
+ * Copy data from a buffer back into the indicated mbuf chain,
+ * starting "off" bytes from the beginning, extending the mbuf
+ * chain if necessary.
+ */
+void
+m_copyback(m0, off, len, cp)
+ struct mbuf *m0;
+ register int off;
+ register int len;
+ caddr_t cp;
+{
+ register int mlen;
+ register struct mbuf *m = m0, *n;
+ int totlen = 0;
+
+ if (m0 == 0)
+ return;
+ while (off > (mlen = m->m_len)) {
+ off -= mlen;
+ totlen += mlen;
+ if (m->m_next == 0) {
+ n = m_getclr(M_DONTWAIT, m->m_type);
+ if (n == 0)
+ goto out;
+ n->m_len = min(MLEN, len + off);
+ m->m_next = n;
+ }
+ m = m->m_next;
+ }
+ while (len > 0) {
+ mlen = min (m->m_len - off, len);
+ bcopy(cp, off + mtod(m, caddr_t), (unsigned)mlen);
+ cp += mlen;
+ len -= mlen;
+ mlen += off;
+ off = 0;
+ totlen += mlen;
+ if (len == 0)
+ break;
+ if (m->m_next == 0) {
+ n = m_get(M_DONTWAIT, m->m_type);
+ if (n == 0)
+ break;
+ n->m_len = min(MLEN, len);
+ m->m_next = n;
+ }
+ m = m->m_next;
+ }
+out:
+#if 0
+ if (((m = m0)->m_flags & M_PKTHDR) && (m->m_pkthdr.len < totlen))
+ m->m_pkthdr.len = totlen;
+#endif
+ return;
+}
+# endif /* linux */
+#endif /* (_KERNEL) && ( ((BSD < 199306) && !SOLARIS) || __sgi) */
+
+
+frgroup_t *fr_findgroup(num, flags, which, set, fgpp)
+u_32_t num, flags;
+minor_t which;
+int set;
+frgroup_t ***fgpp;
+{
+ frgroup_t *fg, **fgp;
+
+ if (which == IPL_LOGAUTH)
+ fgp = &ipfgroups[2][set];
+ else if (flags & FR_ACCOUNT)
+ fgp = &ipfgroups[1][set];
+ else if (flags & (FR_OUTQUE|FR_INQUE))
+ fgp = &ipfgroups[0][set];
+ else
+ return NULL;
+ num &= 0xffff;
+
+ while ((fg = *fgp))
+ if (fg->fg_num == num)
+ break;
+ else
+ fgp = &fg->fg_next;
+ if (fgpp)
+ *fgpp = fgp;
+ return fg;
+}
+
+
+frgroup_t *fr_addgroup(num, fp, which, set)
+u_32_t num;
+frentry_t *fp;
+minor_t which;
+int set;
+{
+ frgroup_t *fg, **fgp;
+
+ if ((fg = fr_findgroup(num, fp->fr_flags, which, set, &fgp)))
+ return fg;
+
+ KMALLOC(fg, frgroup_t *);
+ if (fg) {
+ fg->fg_num = num;
+ fg->fg_next = *fgp;
+ fg->fg_head = fp;
+ fg->fg_start = &fp->fr_grp;
+ *fgp = fg;
+ }
+ return fg;
+}
+
+
+void fr_delgroup(num, flags, which, set)
+u_32_t num, flags;
+minor_t which;
+int set;
+{
+ frgroup_t *fg, **fgp;
+
+ if (!(fg = fr_findgroup(num, flags, which, set, &fgp)))
+ return;
+
+ *fgp = fg->fg_next;
+ KFREE(fg);
+}
+
+
+
+/*
+ * recursively flush rules from the list, descending groups as they are
+ * encountered. if a rule is the head of a group and it has lost all its
+ * group members, then also delete the group reference.
+ */
+static int frflushlist(set, unit, nfreedp, listp)
+int set;
+minor_t unit;
+int *nfreedp;
+frentry_t **listp;
+{
+ register int freed = 0, i;
+ register frentry_t *fp;
+
+ while ((fp = *listp)) {
+ *listp = fp->fr_next;
+ if (fp->fr_grp) {
+ i = frflushlist(set, unit, nfreedp, &fp->fr_grp);
+ MUTEX_ENTER(&ipf_rw);
+ fp->fr_ref -= i;
+ MUTEX_EXIT(&ipf_rw);
+ }
+
+ ATOMIC_DEC32(fp->fr_ref);
+ if (fp->fr_grhead) {
+ fr_delgroup(fp->fr_grhead, fp->fr_flags,
+ unit, set);
+ fp->fr_grhead = 0;
+ }
+ if (fp->fr_ref == 0) {
+ KFREE(fp);
+ freed++;
+ } else
+ fp->fr_next = NULL;
+ }
+ *nfreedp += freed;
+ return freed;
+}
+
+
+int frflush(unit, flags)
+minor_t unit;
+int flags;
+{
+ int flushed = 0, set;
+
+ if (unit != IPL_LOGIPF)
+ return 0;
+ WRITE_ENTER(&ipf_mutex);
+ bzero((char *)frcache, sizeof(frcache[0]) * 2);
+
+ set = fr_active;
+ if (flags & FR_INACTIVE)
+ set = 1 - set;
+
+ if (flags & FR_OUTQUE) {
+#ifdef USE_INET6
+ (void) frflushlist(set, unit, &flushed, &ipfilter6[1][set]);
+ (void) frflushlist(set, unit, &flushed, &ipacct6[1][set]);
+#endif
+ (void) frflushlist(set, unit, &flushed, &ipfilter[1][set]);
+ (void) frflushlist(set, unit, &flushed, &ipacct[1][set]);
+ }
+ if (flags & FR_INQUE) {
+#ifdef USE_INET6
+ (void) frflushlist(set, unit, &flushed, &ipfilter6[0][set]);
+ (void) frflushlist(set, unit, &flushed, &ipacct6[0][set]);
+#endif
+ (void) frflushlist(set, unit, &flushed, &ipfilter[0][set]);
+ (void) frflushlist(set, unit, &flushed, &ipacct[0][set]);
+ }
+ RWLOCK_EXIT(&ipf_mutex);
+ return flushed;
+}
+
+
+char *memstr(src, dst, slen, dlen)
+char *src, *dst;
+int slen, dlen;
+{
+ char *s = NULL;
+
+ while (dlen >= slen) {
+ if (bcmp(src, dst, slen) == 0) {
+ s = dst;
+ break;
+ }
+ dst++;
+ dlen--;
+ }
+ return s;
+}
+
+
+void fixskip(listp, rp, addremove)
+frentry_t **listp, *rp;
+int addremove;
+{
+ frentry_t *fp;
+ int rules = 0, rn = 0;
+
+ for (fp = *listp; fp && (fp != rp); fp = fp->fr_next, rules++)
+ ;
+
+ if (!fp)
+ return;
+
+ for (fp = *listp; fp && (fp != rp); fp = fp->fr_next, rn++)
+ if (fp->fr_skip && (rn + fp->fr_skip >= rules))
+ fp->fr_skip += addremove;
+}
+
+
+#ifdef _KERNEL
+/*
+ * count consecutive 1's in bit mask. If the mask generated by counting
+ * consecutive 1's is different to that passed, return -1, else return #
+ * of bits.
+ */
+int countbits(ip)
+u_32_t ip;
+{
+ u_32_t ipn;
+ int cnt = 0, i, j;
+
+ ip = ipn = ntohl(ip);
+ for (i = 32; i; i--, ipn *= 2)
+ if (ipn & 0x80000000)
+ cnt++;
+ else
+ break;
+ ipn = 0;
+ for (i = 32, j = cnt; i; i--, j--) {
+ ipn *= 2;
+ if (j > 0)
+ ipn++;
+ }
+ if (ipn == ip)
+ return cnt;
+ return -1;
+}
+
+
+/*
+ * return the first IP Address associated with an interface
+ */
+int fr_ifpaddr(v, ifptr, inp)
+int v;
+void *ifptr;
+struct in_addr *inp;
+{
+# ifdef USE_INET6
+ struct in6_addr *inp6 = NULL;
+# endif
+# if SOLARIS
+ ill_t *ill = ifptr;
+# else
+ struct ifnet *ifp = ifptr;
+# endif
+ struct in_addr in;
+
+# if SOLARIS
+# ifdef USE_INET6
+ if (v == 6) {
+ struct in6_addr in6;
+
+ /*
+ * First is always link local.
+ */
+ if (ill->ill_ipif->ipif_next)
+ in6 = ill->ill_ipif->ipif_next->ipif_v6lcl_addr;
+ else
+ bzero((char *)&in6, sizeof(in6));
+ bcopy((char *)&in6, (char *)inp, sizeof(in6));
+ } else
+# endif
+ {
+ in.s_addr = ill->ill_ipif->ipif_local_addr;
+ *inp = in;
+ }
+# else /* SOLARIS */
+# if linux
+ ;
+# else /* linux */
+ struct sockaddr_in *sin;
+ struct ifaddr *ifa;
+
+# if (__FreeBSD_version >= 300000)
+ ifa = TAILQ_FIRST(&ifp->if_addrhead);
+# else
+# if defined(__NetBSD__) || defined(__OpenBSD__)
+ ifa = ifp->if_addrlist.tqh_first;
+# else
+# if defined(__sgi) && defined(IFF_DRVRLOCK) /* IRIX 6 */
+ ifa = &((struct in_ifaddr *)ifp->in_ifaddr)->ia_ifa;
+# else
+ ifa = ifp->if_addrlist;
+# endif
+# endif /* __NetBSD__ || __OpenBSD__ */
+# endif /* __FreeBSD_version >= 300000 */
+# if (BSD < 199306) && !(/*IRIX6*/defined(__sgi) && defined(IFF_DRVRLOCK))
+ sin = (struct sockaddr_in *)&ifa->ifa_addr;
+# else
+ sin = (struct sockaddr_in *)ifa->ifa_addr;
+ while (sin && ifa) {
+ if ((v == 4) && (sin->sin_family == AF_INET))
+ break;
+# ifdef USE_INET6
+ if ((v == 6) && (sin->sin_family == AF_INET6)) {
+ inp6 = &((struct sockaddr_in6 *)sin)->sin6_addr;
+ if (!IN6_IS_ADDR_LINKLOCAL(inp6) &&
+ !IN6_IS_ADDR_LOOPBACK(inp6))
+ break;
+ }
+# endif
+# if (__FreeBSD_version >= 300000)
+ ifa = TAILQ_NEXT(ifa, ifa_link);
+# else
+# if defined(__NetBSD__) || defined(__OpenBSD__)
+ ifa = ifa->ifa_list.tqe_next;
+# else
+ ifa = ifa->ifa_next;
+# endif
+# endif /* __FreeBSD_version >= 300000 */
+ if (ifa)
+ sin = (struct sockaddr_in *)ifa->ifa_addr;
+ }
+ if (ifa == NULL)
+ sin = NULL;
+ if (sin == NULL)
+ return -1;
+# endif /* (BSD < 199306) && (!__sgi && IFF_DRVLOCK) */
+# ifdef USE_INET6
+ if (v == 6)
+ bcopy((char *)inp6, (char *)inp, sizeof(*inp6));
+ else
+# endif
+ {
+ in = sin->sin_addr;
+ *inp = in;
+ }
+# endif /* linux */
+# endif /* SOLARIS */
+ return 0;
+}
+
+
+static void frsynclist(fr)
+register frentry_t *fr;
+{
+ for (; fr; fr = fr->fr_next) {
+ if (fr->fr_ifa != NULL) {
+ fr->fr_ifa = GETUNIT(fr->fr_ifname, fr->fr_ip.fi_v);
+ if (fr->fr_ifa == NULL)
+ fr->fr_ifa = (void *)-1;
+ }
+ if (fr->fr_grp)
+ frsynclist(fr->fr_grp);
+ }
+}
+
+
+void frsync()
+{
+# if !SOLARIS
+ register struct ifnet *ifp;
+
+# if defined(__OpenBSD__) || ((NetBSD >= 199511) && (NetBSD < 1991011)) || \
+ (defined(__FreeBSD_version) && (__FreeBSD_version >= 300000))
+# if (NetBSD >= 199905) || defined(__OpenBSD__)
+ for (ifp = ifnet.tqh_first; ifp; ifp = ifp->if_list.tqe_next)
+# else
+ for (ifp = ifnet.tqh_first; ifp; ifp = ifp->if_link.tqe_next)
+# endif
+# else
+ for (ifp = ifnet; ifp; ifp = ifp->if_next)
+# endif
+ {
+ ip_natsync(ifp);
+ ip_statesync(ifp);
+ }
+ ip_natsync((struct ifnet *)-1);
+# endif
+
+ WRITE_ENTER(&ipf_mutex);
+ frsynclist(ipacct[0][fr_active]);
+ frsynclist(ipacct[1][fr_active]);
+ frsynclist(ipfilter[0][fr_active]);
+ frsynclist(ipfilter[1][fr_active]);
+#ifdef USE_INET6
+ frsynclist(ipacct6[0][fr_active]);
+ frsynclist(ipacct6[1][fr_active]);
+ frsynclist(ipfilter6[0][fr_active]);
+ frsynclist(ipfilter6[1][fr_active]);
+#endif
+ RWLOCK_EXIT(&ipf_mutex);
+}
+
+
+/*
+ * In the functions below, bcopy() is called because the pointer being
+ * copied _from_ in this instance is a pointer to a char buf (which could
+ * end up being unaligned) and on the kernel's local stack.
+ */
+int ircopyptr(a, b, c)
+void *a, *b;
+size_t c;
+{
+ caddr_t ca;
+ int err;
+
+#if SOLARIS
+ if (copyin(a, (char *)&ca, sizeof(ca)))
+ return EFAULT;
+#else
+ bcopy(a, &ca, sizeof(ca));
+#endif
+ err = copyin(ca, b, c);
+ if (err)
+ err = EFAULT;
+ return err;
+}
+
+
+int iwcopyptr(a, b, c)
+void *a, *b;
+size_t c;
+{
+ caddr_t ca;
+ int err;
+
+#if SOLARIS
+ if (copyin(b, (char *)&ca, sizeof(ca)))
+ return EFAULT;
+#else
+ bcopy(b, &ca, sizeof(ca));
+#endif
+ err = copyout(a, ca, c);
+ if (err)
+ err = EFAULT;
+ return err;
+}
+
+#else /* _KERNEL */
+
+
+/*
+ * return the first IP Address associated with an interface
+ */
+int fr_ifpaddr(v, ifptr, inp)
+int v;
+void *ifptr;
+struct in_addr *inp;
+{
+ return 0;
+}
+
+
+int ircopyptr(a, b, c)
+void *a, *b;
+size_t c;
+{
+ caddr_t ca;
+
+ bcopy(a, &ca, sizeof(ca));
+ bcopy(ca, b, c);
+ return 0;
+}
+
+
+int iwcopyptr(a, b, c)
+void *a, *b;
+size_t c;
+{
+ caddr_t ca;
+
+ bcopy(b, &ca, sizeof(ca));
+ bcopy(a, ca, c);
+ return 0;
+}
+
+
+#endif
+
+
+int fr_lock(data, lockp)
+caddr_t data;
+int *lockp;
+{
+ int arg, error;
+
+ error = IRCOPY(data, (caddr_t)&arg, sizeof(arg));
+ if (!error) {
+ error = IWCOPY((caddr_t)lockp, data, sizeof(*lockp));
+ if (!error)
+ *lockp = arg;
+ }
+ return error;
+}
+
+
+void fr_getstat(fiop)
+friostat_t *fiop;
+{
+ bcopy((char *)frstats, (char *)fiop->f_st, sizeof(filterstats_t) * 2);
+ fiop->f_locks[0] = fr_state_lock;
+ fiop->f_locks[1] = fr_nat_lock;
+ fiop->f_locks[2] = fr_frag_lock;
+ fiop->f_locks[3] = fr_auth_lock;
+ fiop->f_fin[0] = ipfilter[0][0];
+ fiop->f_fin[1] = ipfilter[0][1];
+ fiop->f_fout[0] = ipfilter[1][0];
+ fiop->f_fout[1] = ipfilter[1][1];
+ fiop->f_acctin[0] = ipacct[0][0];
+ fiop->f_acctin[1] = ipacct[0][1];
+ fiop->f_acctout[0] = ipacct[1][0];
+ fiop->f_acctout[1] = ipacct[1][1];
+#ifdef USE_INET6
+ fiop->f_fin6[0] = ipfilter6[0][0];
+ fiop->f_fin6[1] = ipfilter6[0][1];
+ fiop->f_fout6[0] = ipfilter6[1][0];
+ fiop->f_fout6[1] = ipfilter6[1][1];
+ fiop->f_acctin6[0] = ipacct6[0][0];
+ fiop->f_acctin6[1] = ipacct6[0][1];
+ fiop->f_acctout6[0] = ipacct6[1][0];
+ fiop->f_acctout6[1] = ipacct6[1][1];
+#else
+ fiop->f_fin6[0] = NULL;
+ fiop->f_fin6[1] = NULL;
+ fiop->f_fout6[0] = NULL;
+ fiop->f_fout6[1] = NULL;
+ fiop->f_acctin6[0] = NULL;
+ fiop->f_acctin6[1] = NULL;
+ fiop->f_acctout6[0] = NULL;
+ fiop->f_acctout6[1] = NULL;
+#endif
+ fiop->f_active = fr_active;
+ fiop->f_froute[0] = ipl_frouteok[0];
+ fiop->f_froute[1] = ipl_frouteok[1];
+
+ fiop->f_running = fr_running;
+ fiop->f_groups[0][0] = ipfgroups[0][0];
+ fiop->f_groups[0][1] = ipfgroups[0][1];
+ fiop->f_groups[1][0] = ipfgroups[1][0];
+ fiop->f_groups[1][1] = ipfgroups[1][1];
+ fiop->f_groups[2][0] = ipfgroups[2][0];
+ fiop->f_groups[2][1] = ipfgroups[2][1];
+#ifdef IPFILTER_LOG
+ fiop->f_logging = 1;
+#else
+ fiop->f_logging = 0;
+#endif
+ fiop->f_defpass = fr_pass;
+ strncpy(fiop->f_version, ipfilter_version, sizeof(fiop->f_version));
+}
+
+
+#ifdef USE_INET6
+int icmptoicmp6types[ICMP_MAXTYPE+1] = {
+ ICMP6_ECHO_REPLY, /* 0: ICMP_ECHOREPLY */
+ -1, /* 1: UNUSED */
+ -1, /* 2: UNUSED */
+ ICMP6_DST_UNREACH, /* 3: ICMP_UNREACH */
+ -1, /* 4: ICMP_SOURCEQUENCH */
+ ND_REDIRECT, /* 5: ICMP_REDIRECT */
+ -1, /* 6: UNUSED */
+ -1, /* 7: UNUSED */
+ ICMP6_ECHO_REQUEST, /* 8: ICMP_ECHO */
+ -1, /* 9: UNUSED */
+ -1, /* 10: UNUSED */
+ ICMP6_TIME_EXCEEDED, /* 11: ICMP_TIMXCEED */
+ ICMP6_PARAM_PROB, /* 12: ICMP_PARAMPROB */
+ -1, /* 13: ICMP_TSTAMP */
+ -1, /* 14: ICMP_TSTAMPREPLY */
+ -1, /* 15: ICMP_IREQ */
+ -1, /* 16: ICMP_IREQREPLY */
+ -1, /* 17: ICMP_MASKREQ */
+ -1, /* 18: ICMP_MASKREPLY */
+};
+
+
+int icmptoicmp6unreach[ICMP_MAX_UNREACH] = {
+ ICMP6_DST_UNREACH_ADDR, /* 0: ICMP_UNREACH_NET */
+ ICMP6_DST_UNREACH_ADDR, /* 1: ICMP_UNREACH_HOST */
+ -1, /* 2: ICMP_UNREACH_PROTOCOL */
+ ICMP6_DST_UNREACH_NOPORT, /* 3: ICMP_UNREACH_PORT */
+ -1, /* 4: ICMP_UNREACH_NEEDFRAG */
+ ICMP6_DST_UNREACH_NOTNEIGHBOR, /* 5: ICMP_UNREACH_SRCFAIL */
+ ICMP6_DST_UNREACH_ADDR, /* 6: ICMP_UNREACH_NET_UNKNOWN */
+ ICMP6_DST_UNREACH_ADDR, /* 7: ICMP_UNREACH_HOST_UNKNOWN */
+ -1, /* 8: ICMP_UNREACH_ISOLATED */
+ ICMP6_DST_UNREACH_ADMIN, /* 9: ICMP_UNREACH_NET_PROHIB */
+ ICMP6_DST_UNREACH_ADMIN, /* 10: ICMP_UNREACH_HOST_PROHIB */
+ -1, /* 11: ICMP_UNREACH_TOSNET */
+ -1, /* 12: ICMP_UNREACH_TOSHOST */
+ ICMP6_DST_UNREACH_ADMIN, /* 13: ICMP_UNREACH_ADMIN_PROHIBIT */
+};
+#endif
diff --git a/sys/contrib/ipfilter/netinet/ip_auth.c b/sys/contrib/ipfilter/netinet/ip_auth.c
new file mode 100644
index 0000000..2931cc6
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_auth.c
@@ -0,0 +1,543 @@
+/*
+ * Copyright (C) 1998-2000 by Darren Reed & Guido van Rooij.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and due credit is given
+ * to the original author and the contributors.
+ */
+#if !defined(lint)
+/*static const char rcsid[] = "@(#)$Id: ip_auth.c,v 2.1.2.2 2000/01/16 10:12:14 darrenr Exp $";*/
+static const char rcsid[] = "@(#)$FreeBSD$";
+#endif
+
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/file.h>
+#if !defined(_KERNEL) && !defined(KERNEL)
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+#endif
+#if (defined(KERNEL) || defined(_KERNEL)) && (__FreeBSD_version >= 220000)
+# include <sys/filio.h>
+# include <sys/fcntl.h>
+#else
+# include <sys/ioctl.h>
+#endif
+#include <sys/uio.h>
+#ifndef linux
+# include <sys/protosw.h>
+#endif
+#include <sys/socket.h>
+#if (defined(_KERNEL) || defined(KERNEL)) && !defined(linux)
+# include <sys/systm.h>
+#endif
+#if !defined(__SVR4) && !defined(__svr4__)
+# ifndef linux
+# include <sys/mbuf.h>
+# endif
+#else
+# include <sys/filio.h>
+# include <sys/byteorder.h>
+# ifdef _KERNEL
+# include <sys/dditypes.h>
+# endif
+# include <sys/stream.h>
+# include <sys/kmem.h>
+#endif
+#if (_BSDI_VERSION >= 199802) || (__FreeBSD_version >= 400000)
+# include <sys/queue.h>
+#endif
+#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(bsdi)
+# include <machine/cpu.h>
+#endif
+#include <net/if.h>
+#ifdef sun
+# include <net/af.h>
+#endif
+#include <net/route.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#ifndef KERNEL
+# define KERNEL
+# define NOT_KERNEL
+#endif
+#ifndef linux
+# include <netinet/ip_var.h>
+#endif
+#ifdef NOT_KERNEL
+# undef KERNEL
+#endif
+#ifdef __sgi
+# ifdef IFF_DRVRLOCK /* IRIX6 */
+# include <sys/hashing.h>
+# endif
+#endif
+#include <netinet/tcp.h>
+#if defined(__sgi) && !defined(IFF_DRVRLOCK) /* IRIX < 6 */
+extern struct ifqueue ipintrq; /* ip packet input queue */
+#else
+# ifndef linux
+# if __FreeBSD_version >= 300000
+# include <net/if_var.h>
+# endif
+# include <netinet/in_var.h>
+# include <netinet/tcp_fsm.h>
+# endif
+#endif
+#include <netinet/udp.h>
+#include <netinet/ip_icmp.h>
+#include "netinet/ip_compat.h"
+#include <netinet/tcpip.h>
+#include "netinet/ip_fil.h"
+#include "netinet/ip_auth.h"
+#if !SOLARIS && !defined(linux)
+# include <net/netisr.h>
+# ifdef __FreeBSD__
+# include <machine/cpufunc.h>
+# endif
+#endif
+#if (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+# if (defined(_KERNEL) || defined(KERNEL)) && !defined(IPFILTER_LKM)
+# include <sys/libkern.h>
+# include <sys/systm.h>
+# endif
+#endif
+
+
+
+#if (SOLARIS || defined(__sgi)) && defined(_KERNEL)
+extern KRWLOCK_T ipf_auth;
+extern kmutex_t ipf_authmx;
+# if SOLARIS
+extern kcondvar_t ipfauthwait;
+# endif
+#endif
+#ifdef linux
+static struct wait_queue *ipfauthwait = NULL;
+#endif
+
+int fr_authsize = FR_NUMAUTH;
+int fr_authused = 0;
+int fr_defaultauthage = 600;
+int fr_auth_lock = 0;
+fr_authstat_t fr_authstats;
+static frauth_t fr_auth[FR_NUMAUTH];
+mb_t *fr_authpkts[FR_NUMAUTH];
+static int fr_authstart = 0, fr_authend = 0, fr_authnext = 0;
+static frauthent_t *fae_list = NULL;
+frentry_t *ipauth = NULL;
+
+
+/*
+ * Check if a packet has authorization. If the packet is found to match an
+ * authorization result and that would result in a feedback loop (i.e. it
+ * will end up returning FR_AUTH) then return FR_BLOCK instead.
+ */
+u_32_t fr_checkauth(ip, fin)
+ip_t *ip;
+fr_info_t *fin;
+{
+ u_short id = ip->ip_id;
+ u_32_t pass;
+ int i;
+
+ if (fr_auth_lock)
+ return 0;
+
+ READ_ENTER(&ipf_auth);
+ for (i = fr_authstart; i != fr_authend; ) {
+ /*
+ * index becomes -2 only after an SIOCAUTHW. Check this in
+ * case the same packet gets sent again and it hasn't yet been
+ * auth'd.
+ */
+ if ((fr_auth[i].fra_index == -2) &&
+ (id == fr_auth[i].fra_info.fin_id) &&
+ !bcmp((char *)fin,(char *)&fr_auth[i].fra_info,FI_CSIZE)) {
+ /*
+ * Avoid feedback loop.
+ */
+ if (!(pass = fr_auth[i].fra_pass) || (pass & FR_AUTH))
+ pass = FR_BLOCK;
+ RWLOCK_EXIT(&ipf_auth);
+ WRITE_ENTER(&ipf_auth);
+ fr_authstats.fas_hits++;
+ fr_auth[i].fra_index = -1;
+ fr_authused--;
+ if (i == fr_authstart) {
+ while (fr_auth[i].fra_index == -1) {
+ i++;
+ if (i == FR_NUMAUTH)
+ i = 0;
+ fr_authstart = i;
+ if (i == fr_authend)
+ break;
+ }
+ if (fr_authstart == fr_authend) {
+ fr_authnext = 0;
+ fr_authstart = fr_authend = 0;
+ }
+ }
+ RWLOCK_EXIT(&ipf_auth);
+ return pass;
+ }
+ i++;
+ if (i == FR_NUMAUTH)
+ i = 0;
+ }
+ fr_authstats.fas_miss++;
+ RWLOCK_EXIT(&ipf_auth);
+ return 0;
+}
+
+
+/*
+ * Check if we have room in the auth array to hold details for another packet.
+ * If we do, store it and wake up any user programs which are waiting to
+ * hear about these events.
+ */
+int fr_newauth(m, fin, ip)
+mb_t *m;
+fr_info_t *fin;
+ip_t *ip;
+{
+#if defined(_KERNEL) && SOLARIS
+ qif_t *qif = fin->fin_qif;
+#endif
+ int i;
+
+ if (fr_auth_lock)
+ return 0;
+
+ WRITE_ENTER(&ipf_auth);
+ if (fr_authstart > fr_authend) {
+ fr_authstats.fas_nospace++;
+ RWLOCK_EXIT(&ipf_auth);
+ return 0;
+ } else {
+ if ((fr_authstart == 0) && (fr_authend == FR_NUMAUTH - 1)) {
+ fr_authstats.fas_nospace++;
+ RWLOCK_EXIT(&ipf_auth);
+ return 0;
+ }
+ }
+
+ fr_authstats.fas_added++;
+ fr_authused++;
+ i = fr_authend++;
+ if (fr_authend == FR_NUMAUTH)
+ fr_authend = 0;
+ RWLOCK_EXIT(&ipf_auth);
+ fr_auth[i].fra_index = i;
+ fr_auth[i].fra_pass = 0;
+ fr_auth[i].fra_age = fr_defaultauthage;
+ bcopy((char *)fin, (char *)&fr_auth[i].fra_info, sizeof(*fin));
+#if !defined(sparc) && !defined(m68k)
+ /*
+ * No need to copyback here as we want to undo the changes, not keep
+ * them.
+ */
+# if SOLARIS && defined(_KERNEL)
+ if ((ip == (ip_t *)m->b_rptr) && (ip->ip_v == 4))
+# endif
+ {
+ register u_short bo;
+
+ bo = ip->ip_len;
+ ip->ip_len = htons(bo);
+# if !SOLARIS && !defined(__NetBSD__) && !defined(__FreeBSD__)
+ /* 4.4BSD converts this ip_input.c, but I don't in solaris.c */
+ bo = ip->ip_id;
+ ip->ip_id = htons(bo);
+# endif
+ bo = ip->ip_off;
+ ip->ip_off = htons(bo);
+ }
+#endif
+#if SOLARIS && defined(_KERNEL)
+ m->b_rptr -= qif->qf_off;
+ fr_authpkts[i] = *(mblk_t **)fin->fin_mp;
+ fr_auth[i].fra_q = qif->qf_q;
+ cv_signal(&ipfauthwait);
+#else
+ fr_authpkts[i] = m;
+# if defined(linux) && defined(_KERNEL)
+ wake_up_interruptible(&ipfauthwait);
+# else
+ WAKEUP(&fr_authnext);
+# endif
+#endif
+ return 1;
+}
+
+
+int fr_auth_ioctl(data, cmd, fr, frptr)
+caddr_t data;
+#if defined(__NetBSD__) || defined(__OpenBSD__) || (FreeBSD_version >= 300003)
+u_long cmd;
+#else
+int cmd;
+#endif
+frentry_t *fr, **frptr;
+{
+ mb_t *m;
+ frauth_t auth, *au = &auth;
+ frauthent_t *fae, **faep;
+ int i, error = 0;
+
+ switch (cmd)
+ {
+ case SIOCSTLCK :
+ error = fr_lock(data, &fr_auth_lock);
+ break;
+ case SIOCINIFR :
+ case SIOCRMIFR :
+ case SIOCADIFR :
+ error = EINVAL;
+ break;
+ case SIOCINAFR :
+ error = EINVAL;
+ break;
+ case SIOCRMAFR :
+ case SIOCADAFR :
+ for (faep = &fae_list; (fae = *faep); )
+ if (&fae->fae_fr == fr)
+ break;
+ else
+ faep = &fae->fae_next;
+ if (cmd == SIOCRMAFR) {
+ if (!fae)
+ error = ESRCH;
+ else {
+ WRITE_ENTER(&ipf_auth);
+ *faep = fae->fae_next;
+ *frptr = fr->fr_next;
+ RWLOCK_EXIT(&ipf_auth);
+ KFREE(fae);
+ }
+ } else {
+ KMALLOC(fae, frauthent_t *);
+ if (fae != NULL) {
+ bcopy((char *)fr, (char *)&fae->fae_fr,
+ sizeof(*fr));
+ WRITE_ENTER(&ipf_auth);
+ fae->fae_age = fr_defaultauthage;
+ fae->fae_fr.fr_hits = 0;
+ fae->fae_fr.fr_next = *frptr;
+ *frptr = &fae->fae_fr;
+ fae->fae_next = *faep;
+ *faep = fae;
+ ipauth = &fae_list->fae_fr;
+ RWLOCK_EXIT(&ipf_auth);
+ } else
+ error = ENOMEM;
+ }
+ break;
+ case SIOCATHST:
+ READ_ENTER(&ipf_auth);
+ fr_authstats.fas_faelist = fae_list;
+ RWLOCK_EXIT(&ipf_auth);
+ error = IWCOPYPTR((char *)&fr_authstats, data,
+ sizeof(fr_authstats));
+ break;
+ case SIOCAUTHW:
+fr_authioctlloop:
+ READ_ENTER(&ipf_auth);
+ if ((fr_authnext != fr_authend) && fr_authpkts[fr_authnext]) {
+ error = IWCOPYPTR((char *)&fr_auth[fr_authnext], data,
+ sizeof(frauth_t));
+ RWLOCK_EXIT(&ipf_auth);
+ if (error)
+ break;
+ WRITE_ENTER(&ipf_auth);
+ fr_authnext++;
+ if (fr_authnext == FR_NUMAUTH)
+ fr_authnext = 0;
+ RWLOCK_EXIT(&ipf_auth);
+ return 0;
+ }
+#ifdef _KERNEL
+# if SOLARIS
+ mutex_enter(&ipf_authmx);
+ if (!cv_wait_sig(&ipfauthwait, &ipf_authmx)) {
+ mutex_exit(&ipf_authmx);
+ return EINTR;
+ }
+ mutex_exit(&ipf_authmx);
+# else
+# ifdef linux
+ interruptible_sleep_on(&ipfauthwait);
+ if (current->signal & ~current->blocked)
+ error = -EINTR;
+# else
+ error = SLEEP(&fr_authnext, "fr_authnext");
+# endif
+# endif
+#endif
+ RWLOCK_EXIT(&ipf_auth);
+ if (!error)
+ goto fr_authioctlloop;
+ break;
+ case SIOCAUTHR:
+ error = IRCOPYPTR(data, (caddr_t)&auth, sizeof(auth));
+ if (error)
+ return error;
+ WRITE_ENTER(&ipf_auth);
+ i = au->fra_index;
+ if ((i < 0) || (i > FR_NUMAUTH) ||
+ (fr_auth[i].fra_info.fin_id != au->fra_info.fin_id)) {
+ RWLOCK_EXIT(&ipf_auth);
+ return EINVAL;
+ }
+ m = fr_authpkts[i];
+ fr_auth[i].fra_index = -2;
+ fr_auth[i].fra_pass = au->fra_pass;
+ fr_authpkts[i] = NULL;
+#ifdef _KERNEL
+ RWLOCK_EXIT(&ipf_auth);
+# ifndef linux
+ if (m && au->fra_info.fin_out) {
+# if SOLARIS
+ error = fr_qout(fr_auth[i].fra_q, m);
+# else /* SOLARIS */
+# if (_BSDI_VERSION >= 199802) || defined(__OpenBSD__)
+ error = ip_output(m, NULL, NULL, IP_FORWARDING, NULL,
+ NULL);
+# else
+ error = ip_output(m, NULL, NULL, IP_FORWARDING, NULL);
+# endif
+# endif /* SOLARIS */
+ if (error)
+ fr_authstats.fas_sendfail++;
+ else
+ fr_authstats.fas_sendok++;
+ } else if (m) {
+# if SOLARIS
+ error = fr_qin(fr_auth[i].fra_q, m);
+# else /* SOLARIS */
+ if (! IF_HANDOFF(&ipintrq, m, NULL))
+ error = ENOBUFS;
+ else
+ schednetisr(NETISR_IP);
+# endif /* SOLARIS */
+ if (error)
+ fr_authstats.fas_quefail++;
+ else
+ fr_authstats.fas_queok++;
+ } else
+ error = EINVAL;
+# endif
+# if SOLARIS
+ if (error)
+ error = EINVAL;
+# else
+ /*
+ * If we experience an error which will result in the packet
+ * not being processed, make sure we advance to the next one.
+ */
+ if (error == ENOBUFS) {
+ fr_authused--;
+ fr_auth[i].fra_index = -1;
+ fr_auth[i].fra_pass = 0;
+ if (i == fr_authstart) {
+ while (fr_auth[i].fra_index == -1) {
+ i++;
+ if (i == FR_NUMAUTH)
+ i = 0;
+ fr_authstart = i;
+ if (i == fr_authend)
+ break;
+ }
+ if (fr_authstart == fr_authend) {
+ fr_authnext = 0;
+ fr_authstart = fr_authend = 0;
+ }
+ }
+ }
+# endif
+#endif /* _KERNEL */
+ break;
+ default :
+ error = EINVAL;
+ break;
+ }
+ return error;
+}
+
+
+#ifdef _KERNEL
+/*
+ * Free all network buffer memory used to keep saved packets.
+ */
+void fr_authunload()
+{
+ register int i;
+ register frauthent_t *fae, **faep;
+ mb_t *m;
+
+ WRITE_ENTER(&ipf_auth);
+ for (i = 0; i < FR_NUMAUTH; i++) {
+ if ((m = fr_authpkts[i])) {
+ FREE_MB_T(m);
+ fr_authpkts[i] = NULL;
+ fr_auth[i].fra_index = -1;
+ }
+ }
+
+
+ for (faep = &fae_list; (fae = *faep); ) {
+ *faep = fae->fae_next;
+ KFREE(fae);
+ }
+ ipauth = NULL;
+ RWLOCK_EXIT(&ipf_auth);
+}
+
+
+/*
+ * Slowly expire held auth records. Timeouts are set
+ * in expectation of this being called twice per second.
+ */
+void fr_authexpire()
+{
+ register int i;
+ register frauth_t *fra;
+ register frauthent_t *fae, **faep;
+ mb_t *m;
+#if !SOLARIS
+ int s;
+#endif
+
+ if (fr_auth_lock)
+ return;
+
+ SPL_NET(s);
+ WRITE_ENTER(&ipf_auth);
+ for (i = 0, fra = fr_auth; i < FR_NUMAUTH; i++, fra++) {
+ if ((!--fra->fra_age) && (m = fr_authpkts[i])) {
+ FREE_MB_T(m);
+ fr_authpkts[i] = NULL;
+ fr_auth[i].fra_index = -1;
+ fr_authstats.fas_expire++;
+ fr_authused--;
+ }
+ }
+
+ for (faep = &fae_list; (fae = *faep); ) {
+ if (!--fae->fae_age) {
+ *faep = fae->fae_next;
+ KFREE(fae);
+ fr_authstats.fas_expire++;
+ } else
+ faep = &fae->fae_next;
+ }
+ ipauth = &fae_list->fae_fr;
+ RWLOCK_EXIT(&ipf_auth);
+ SPL_X(s);
+}
+#endif
diff --git a/sys/contrib/ipfilter/netinet/ip_auth.h b/sys/contrib/ipfilter/netinet/ip_auth.h
new file mode 100644
index 0000000..2851c3d
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_auth.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 1997-2000 by Darren Reed & Guido Van Rooij.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and due credit is given
+ * to the original author and the contributors.
+ *
+ * $Id: ip_auth.h,v 2.1 1999/08/04 17:29:54 darrenr Exp $
+ * $FreeBSD$
+ *
+ */
+#ifndef __IP_AUTH_H__
+#define __IP_AUTH_H__
+
+#define FR_NUMAUTH 32
+
+typedef struct frauth {
+ int fra_age;
+ int fra_index;
+ u_32_t fra_pass;
+ fr_info_t fra_info;
+#if SOLARIS
+ queue_t *fra_q;
+#endif
+} frauth_t;
+
+typedef struct frauthent {
+ struct frentry fae_fr;
+ struct frauthent *fae_next;
+ u_long fae_age;
+} frauthent_t;
+
+typedef struct fr_authstat {
+ U_QUAD_T fas_hits;
+ U_QUAD_T fas_miss;
+ u_long fas_nospace;
+ u_long fas_added;
+ u_long fas_sendfail;
+ u_long fas_sendok;
+ u_long fas_queok;
+ u_long fas_quefail;
+ u_long fas_expire;
+ frauthent_t *fas_faelist;
+} fr_authstat_t;
+
+
+extern frentry_t *ipauth;
+extern struct fr_authstat fr_authstats;
+extern int fr_defaultauthage;
+extern int fr_authsize;
+extern int fr_authused;
+extern int fr_auth_lock;
+extern u_32_t fr_checkauth __P((ip_t *, fr_info_t *));
+extern void fr_authexpire __P((void));
+extern void fr_authunload __P((void));
+extern mb_t *fr_authpkts[];
+extern int fr_newauth __P((mb_t *, fr_info_t *, ip_t *));
+#if defined(__NetBSD__) || defined(__OpenBSD__)
+extern int fr_auth_ioctl __P((caddr_t, u_long, frentry_t *, frentry_t **));
+#else
+extern int fr_auth_ioctl __P((caddr_t, int, frentry_t *, frentry_t **));
+#endif
+#endif /* __IP_AUTH_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_compat.h b/sys/contrib/ipfilter/netinet/ip_compat.h
new file mode 100644
index 0000000..aefd50d
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_compat.h
@@ -0,0 +1,1013 @@
+/*
+ * Copyright (C) 1993-2000 by Darren Reed.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and due credit is given
+ * to the original author and the contributors.
+ *
+ * @(#)ip_compat.h 1.8 1/14/96
+ * $Id: ip_compat.h,v 2.26.2.9 2001/01/14 14:58:01 darrenr Exp $
+ * $FreeBSD$
+ */
+
+#ifndef __IP_COMPAT_H__
+#define __IP_COMPAT_H__
+
+#ifndef __P
+# ifdef __STDC__
+# define __P(x) x
+# else
+# define __P(x) ()
+# endif
+#endif
+#ifndef __STDC__
+# undef const
+# define const
+#endif
+
+#ifndef SOLARIS
+#define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
+#endif
+#if SOLARIS2 >= 8
+# ifndef USE_INET6
+# define USE_INET6
+# endif
+#endif
+
+#if defined(_KERNEL) || defined(KERNEL) || defined(__KERNEL__)
+# undef KERNEL
+# undef _KERNEL
+# undef __KERNEL__
+# define KERNEL
+# define _KERNEL
+# define __KERNEL__
+#endif
+
+#if defined(__SVR4) || defined(__svr4__) || defined(__sgi)
+#define index strchr
+# if !defined(KERNEL)
+# define bzero(a,b) memset(a,0,b)
+# define bcmp memcmp
+# define bcopy(a,b,c) memmove(b,a,c)
+# endif
+#endif
+
+#ifndef offsetof
+#define offsetof(t,m) (int)((&((t *)0L)->m))
+#endif
+
+#if defined(__sgi) || defined(bsdi)
+struct ether_addr {
+ u_char ether_addr_octet[6];
+};
+#endif
+
+#if defined(__sgi) && !defined(IPFILTER_LKM)
+# ifdef __STDC__
+# define IPL_EXTERN(ep) ipfilter##ep
+# else
+# define IPL_EXTERN(ep) ipfilter/**/ep
+# endif
+#else
+# ifdef __STDC__
+# define IPL_EXTERN(ep) ipl##ep
+# else
+# define IPL_EXTERN(ep) ipl/**/ep
+# endif
+#endif
+
+#ifdef linux
+# include <sys/sysmacros.h>
+#endif
+#if SOLARIS
+# define MTYPE(m) ((m)->b_datap->db_type)
+# include <sys/isa_defs.h>
+# include <sys/ioccom.h>
+# include <sys/sysmacros.h>
+# include <sys/kmem.h>
+/*
+ * because Solaris 2 defines these in two places :-/
+ */
+# undef IPOPT_EOL
+# undef IPOPT_NOP
+# undef IPOPT_LSRR
+# undef IPOPT_RR
+# undef IPOPT_SSRR
+# ifndef KERNEL
+# define _KERNEL
+# undef RES_INIT
+# if SOLARIS2 >= 8
+# include <netinet/ip6.h>
+# endif
+# include <inet/common.h>
+# include <inet/ip.h>
+# include <inet/ip_ire.h>
+# undef _KERNEL
+# else /* _KERNEL */
+# if SOLARIS2 >= 8
+# include <netinet/ip6.h>
+# endif
+# include <inet/common.h>
+# include <inet/ip.h>
+# include <inet/ip_ire.h>
+# endif /* _KERNEL */
+# if SOLARIS2 >= 8
+# include <inet/ip_if.h>
+# include <netinet/ip6.h>
+# define ipif_local_addr ipif_lcl_addr
+/* Only defined in private include file */
+# ifndef V4_PART_OF_V6
+# define V4_PART_OF_V6(v6) v6.s6_addr32[3]
+# endif
+# endif
+#else
+# if !defined(__sgi)
+typedef int minor_t;
+#endif
+#endif /* SOLARIS */
+#define IPMINLEN(i, h) ((i)->ip_len >= ((i)->ip_hl * 4 + sizeof(struct h)))
+
+#if defined(__FreeBSD__) && (__FreeBSD__ >= 5) && defined(_KERNEL)
+# include <machine/in_cksum.h>
+#endif
+
+#ifndef IP_OFFMASK
+#define IP_OFFMASK 0x1fff
+#endif
+
+#if BSD > 199306
+# define USE_QUAD_T
+# define U_QUAD_T u_quad_t
+# define QUAD_T quad_t
+#else /* BSD > 199306 */
+# define U_QUAD_T u_long
+# define QUAD_T long
+#endif /* BSD > 199306 */
+
+
+/*
+ * These operating systems already take care of the problem for us.
+ */
+#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || \
+ defined(__sgi)
+typedef u_int32_t u_32_t;
+# if defined(_KERNEL) && !defined(IPFILTER_LKM)
+# if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 104110000)
+# include "opt_inet.h"
+# endif
+# if defined(__FreeBSD_version) && (__FreeBSD_version >= 400000) && \
+ !defined(KLD_MODULE)
+# include "opt_inet6.h"
+# endif
+# ifdef INET6
+# define USE_INET6
+# endif
+# endif
+#else
+/*
+ * Really, any arch where sizeof(long) != sizeof(int).
+ */
+# if defined(__alpha__) || defined(__alpha) || defined(_LP64)
+typedef unsigned int u_32_t;
+# else
+# if SOLARIS2 >= 6
+typedef uint32_t u_32_t;
+# else
+typedef unsigned int u_32_t;
+# endif
+# endif
+#endif /* __NetBSD__ || __OpenBSD__ || __FreeBSD__ || __sgi */
+
+#ifdef USE_INET6
+# if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__)
+# include <netinet/ip6.h>
+# ifdef _KERNEL
+# include <netinet6/ip6_var.h>
+# endif
+typedef struct ip6_hdr ip6_t;
+# endif
+union i6addr {
+ u_32_t i6[4];
+ struct in_addr in4;
+ struct in6_addr in6;
+};
+#else
+union i6addr {
+ u_32_t i6[4];
+ struct in_addr in4;
+};
+#endif
+
+#define IP6CMP(a,b) bcmp((char *)&(a), (char *)&(b), sizeof(a))
+#define IP6EQ(a,b) (bcmp((char *)&(a), (char *)&(b), sizeof(a)) == 0)
+#define IP6NEQ(a,b) (bcmp((char *)&(a), (char *)&(b), sizeof(a)) != 0)
+
+#ifndef MAX
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+
+/*
+ * Security Options for Intenet Protocol (IPSO) as defined in RFC 1108.
+ *
+ * Basic Option
+ *
+ * 00000001 - (Reserved 4)
+ * 00111101 - Top Secret
+ * 01011010 - Secret
+ * 10010110 - Confidential
+ * 01100110 - (Reserved 3)
+ * 11001100 - (Reserved 2)
+ * 10101011 - Unclassified
+ * 11110001 - (Reserved 1)
+ */
+#define IPSO_CLASS_RES4 0x01
+#define IPSO_CLASS_TOPS 0x3d
+#define IPSO_CLASS_SECR 0x5a
+#define IPSO_CLASS_CONF 0x96
+#define IPSO_CLASS_RES3 0x66
+#define IPSO_CLASS_RES2 0xcc
+#define IPSO_CLASS_UNCL 0xab
+#define IPSO_CLASS_RES1 0xf1
+
+#define IPSO_AUTH_GENSER 0x80
+#define IPSO_AUTH_ESI 0x40
+#define IPSO_AUTH_SCI 0x20
+#define IPSO_AUTH_NSA 0x10
+#define IPSO_AUTH_DOE 0x08
+#define IPSO_AUTH_UN 0x06
+#define IPSO_AUTH_FTE 0x01
+
+/*
+ * IP option #defines
+ */
+/*#define IPOPT_RR 7 */
+#define IPOPT_ZSU 10 /* ZSU */
+#define IPOPT_MTUP 11 /* MTUP */
+#define IPOPT_MTUR 12 /* MTUR */
+#define IPOPT_ENCODE 15 /* ENCODE */
+/*#define IPOPT_TS 68 */
+#define IPOPT_TR 82 /* TR */
+/*#define IPOPT_SECURITY 130 */
+/*#define IPOPT_LSRR 131 */
+#define IPOPT_E_SEC 133 /* E-SEC */
+#define IPOPT_CIPSO 134 /* CIPSO */
+/*#define IPOPT_SATID 136 */
+#ifndef IPOPT_SID
+# define IPOPT_SID IPOPT_SATID
+#endif
+/*#define IPOPT_SSRR 137 */
+#define IPOPT_ADDEXT 147 /* ADDEXT */
+#define IPOPT_VISA 142 /* VISA */
+#define IPOPT_IMITD 144 /* IMITD */
+#define IPOPT_EIP 145 /* EIP */
+#define IPOPT_FINN 205 /* FINN */
+
+
+#if defined(__FreeBSD__) && (defined(KERNEL) || defined(_KERNEL))
+# ifdef IPFILTER_LKM
+# include <sys/param.h>
+# define ACTUALLY_LKM_NOT_KERNEL
+# else
+# include <sys/param.h>
+# endif
+# if __FreeBSD__ < 3
+# include <machine/spl.h>
+# else
+# if __FreeBSD__ == 3
+# if defined(IPFILTER_LKM) && !defined(ACTUALLY_LKM_NOT_KERNEL)
+# define ACTUALLY_LKM_NOT_KERNEL
+# endif
+# endif
+# endif
+#endif /* __FreeBSD__ && KERNEL */
+
+/*
+ * Build some macros and #defines to enable the same code to compile anywhere
+ * Well, that's the idea, anyway :-)
+ */
+#if !SOLARIS || (SOLARIS2 < 6) || !defined(KERNEL)
+# define ATOMIC_INCL ATOMIC_INC
+# define ATOMIC_INC64 ATOMIC_INC
+# define ATOMIC_INC32 ATOMIC_INC
+# define ATOMIC_INC16 ATOMIC_INC
+# define ATOMIC_DECL ATOMIC_DEC
+# define ATOMIC_DEC64 ATOMIC_DEC
+# define ATOMIC_DEC32 ATOMIC_DEC
+# define ATOMIC_DEC16 ATOMIC_DEC
+#endif
+#ifdef __sgi
+# define hz HZ
+# include <sys/ksynch.h>
+# define IPF_LOCK_PL plhi
+# include <sys/sema.h>
+#undef kmutex_t
+typedef struct {
+ lock_t *l;
+ int pl;
+} kmutex_t;
+# undef MUTEX_INIT
+# undef MUTEX_DESTROY
+#endif
+#ifdef KERNEL
+# if SOLARIS
+# if SOLARIS2 >= 6
+# include <sys/atomic.h>
+# if SOLARIS2 == 6
+# define ATOMIC_INCL(x) atomic_add_long((uint32_t*)&(x), 1)
+# define ATOMIC_DECL(x) atomic_add_long((uint32_t*)&(x), -1)
+# else
+# define ATOMIC_INCL(x) atomic_add_long(&(x), 1)
+# define ATOMIC_DECL(x) atomic_add_long(&(x), -1)
+# endif
+# define ATOMIC_INC64(x) atomic_add_64((uint64_t*)&(x), 1)
+# define ATOMIC_INC32(x) atomic_add_32((uint32_t*)&(x), 1)
+# define ATOMIC_INC16(x) atomic_add_16((uint16_t*)&(x), 1)
+# define ATOMIC_DEC64(x) atomic_add_64((uint64_t*)&(x), -1)
+# define ATOMIC_DEC32(x) atomic_add_32((uint32_t*)&(x), -1)
+# define ATOMIC_DEC16(x) atomic_add_16((uint16_t*)&(x), -1)
+# else
+# define ATOMIC_INC(x) { mutex_enter(&ipf_rw); (x)++; \
+ mutex_exit(&ipf_rw); }
+# define ATOMIC_DEC(x) { mutex_enter(&ipf_rw); (x)--; \
+ mutex_exit(&ipf_rw); }
+# endif
+# define MUTEX_ENTER(x) mutex_enter(x)
+# if 1
+# define KRWLOCK_T krwlock_t
+# define READ_ENTER(x) rw_enter(x, RW_READER)
+# define WRITE_ENTER(x) rw_enter(x, RW_WRITER)
+# define RW_UPGRADE(x) { if (rw_tryupgrade(x) == 0) { \
+ rw_exit(x); \
+ rw_enter(x, RW_WRITER); } \
+ }
+# define MUTEX_DOWNGRADE(x) rw_downgrade(x)
+# define RWLOCK_INIT(x, y, z) rw_init((x), (y), RW_DRIVER, (z))
+# define RWLOCK_EXIT(x) rw_exit(x)
+# define RW_DESTROY(x) rw_destroy(x)
+# else
+# define KRWLOCK_T kmutex_t
+# define READ_ENTER(x) mutex_enter(x)
+# define WRITE_ENTER(x) mutex_enter(x)
+# define MUTEX_DOWNGRADE(x) ;
+# define RWLOCK_INIT(x, y, z) mutex_init((x), (y), MUTEX_DRIVER, (z))
+# define RWLOCK_EXIT(x) mutex_exit(x)
+# define RW_DESTROY(x) mutex_destroy(x)
+# endif
+# define MUTEX_INIT(x, y, z) mutex_init((x), (y), MUTEX_DRIVER, (z))
+# define MUTEX_DESTROY(x) mutex_destroy(x)
+# define MUTEX_EXIT(x) mutex_exit(x)
+# define MTOD(m,t) (t)((m)->b_rptr)
+# define IRCOPY(a,b,c) copyin((caddr_t)(a), (caddr_t)(b), (c))
+# define IWCOPY(a,b,c) copyout((caddr_t)(a), (caddr_t)(b), (c))
+# define IRCOPYPTR ircopyptr
+# define IWCOPYPTR iwcopyptr
+# define FREE_MB_T(m) freemsg(m)
+# define SPL_NET(x) ;
+# define SPL_IMP(x) ;
+# undef SPL_X
+# define SPL_X(x) ;
+# ifdef sparc
+# define ntohs(x) (x)
+# define ntohl(x) (x)
+# define htons(x) (x)
+# define htonl(x) (x)
+# endif /* sparc */
+# define KMALLOC(a,b) (a) = (b)kmem_alloc(sizeof(*(a)), KM_NOSLEEP)
+# define KMALLOCS(a,b,c) (a) = (b)kmem_alloc((c), KM_NOSLEEP)
+# define GET_MINOR(x) getminor(x)
+typedef struct qif {
+ struct qif *qf_next;
+ ill_t *qf_ill;
+ kmutex_t qf_lock;
+ void *qf_iptr;
+ void *qf_optr;
+ queue_t *qf_in;
+ queue_t *qf_out;
+ struct qinit *qf_wqinfo;
+ struct qinit *qf_rqinfo;
+ struct qinit qf_wqinit;
+ struct qinit qf_rqinit;
+ mblk_t *qf_m; /* These three fields are for passing data up from */
+ queue_t *qf_q; /* fr_qin and fr_qout to the packet processing. */
+ size_t qf_off;
+ size_t qf_len; /* this field is used for in ipfr_fastroute */
+ char qf_name[8];
+ /*
+ * in case the ILL has disappeared...
+ */
+ size_t qf_hl; /* header length */
+ int qf_sap;
+} qif_t;
+extern ill_t *get_unit __P((char *, int));
+# define GETUNIT(n, v) get_unit(n, v)
+# define IFNAME(x) ((ill_t *)x)->ill_name
+# else /* SOLARIS */
+# if defined(__sgi)
+# define ATOMIC_INC(x) { MUTEX_ENTER(&ipf_rw); \
+ (x)++; MUTEX_EXIT(&ipf_rw); }
+# define ATOMIC_DEC(x) { MUTEX_ENTER(&ipf_rw); \
+ (x)--; MUTEX_EXIT(&ipf_rw); }
+# define MUTEX_ENTER(x) (x)->pl = LOCK((x)->l, IPF_LOCK_PL);
+# define KRWLOCK_T kmutex_t
+# define READ_ENTER(x) MUTEX_ENTER(x)
+# define WRITE_ENTER(x) MUTEX_ENTER(x)
+# define RW_UPGRADE(x) ;
+# define MUTEX_DOWNGRADE(x) ;
+# define RWLOCK_EXIT(x) MUTEX_EXIT(x)
+# define MUTEX_EXIT(x) UNLOCK((x)->l, (x)->pl);
+# define MUTEX_INIT(x,y,z) (x)->l = LOCK_ALLOC((uchar_t)-1, IPF_LOCK_PL, (lkinfo_t *)-1, KM_NOSLEEP)
+# define MUTEX_DESTROY(x) LOCK_DEALLOC((x)->l)
+# else /* __sgi */
+# define ATOMIC_INC(x) (x)++
+# define ATOMIC_DEC(x) (x)--
+# define MUTEX_ENTER(x) ;
+# define READ_ENTER(x) ;
+# define WRITE_ENTER(x) ;
+# define RW_UPGRADE(x) ;
+# define MUTEX_DOWNGRADE(x) ;
+# define RWLOCK_EXIT(x) ;
+# define MUTEX_EXIT(x) ;
+# define MUTEX_INIT(x,y,z) ;
+# define MUTEX_DESTROY(x) ;
+# endif /* __sgi */
+# ifndef linux
+# define FREE_MB_T(m) m_freem(m)
+# define MTOD(m,t) mtod(m,t)
+# define IRCOPY(a,b,c) (bcopy((a), (b), (c)), 0)
+# define IWCOPY(a,b,c) (bcopy((a), (b), (c)), 0)
+# define IRCOPYPTR ircopyptr
+# define IWCOPYPTR iwcopyptr
+# endif /* !linux */
+# endif /* SOLARIS */
+
+# ifdef sun
+# if !SOLARIS
+# include <sys/kmem_alloc.h>
+# define GETUNIT(n, v) ifunit(n, IFNAMSIZ)
+# define IFNAME(x) ((struct ifnet *)x)->if_name
+# endif
+# else
+# ifndef linux
+# define GETUNIT(n, v) ifunit(n)
+# if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199606)) || \
+ (defined(OpenBSD) && (OpenBSD >= 199603))
+# define IFNAME(x) ((struct ifnet *)x)->if_xname
+# else
+# define IFNAME(x) ((struct ifnet *)x)->if_name
+# endif
+# endif
+# endif /* sun */
+
+# if defined(sun) && !defined(linux) || defined(__sgi)
+# define UIOMOVE(a,b,c,d) uiomove((caddr_t)a,b,c,d)
+# define SLEEP(id, n) sleep((id), PZERO+1)
+# define WAKEUP(id) wakeup(id)
+# define KFREE(x) kmem_free((char *)(x), sizeof(*(x)))
+# define KFREES(x,s) kmem_free((char *)(x), (s))
+# if !SOLARIS
+extern void m_copydata __P((struct mbuf *, int, int, caddr_t));
+extern void m_copyback __P((struct mbuf *, int, int, caddr_t));
+# endif
+# ifdef __sgi
+# include <sys/kmem.h>
+# include <sys/ddi.h>
+# define KMALLOC(a,b) (a) = (b)kmem_alloc(sizeof(*(a)), KM_NOSLEEP)
+# define KMALLOCS(a,b,c) (a) = (b)kmem_alloc((c), KM_NOSLEEP)
+# define GET_MINOR(x) getminor(x)
+# else
+# if !SOLARIS
+# define KMALLOC(a,b) (a) = (b)new_kmem_alloc(sizeof(*(a)), \
+ KMEM_NOSLEEP)
+# define KMALLOCS(a,b,c) (a) = (b)new_kmem_alloc((c), KMEM_NOSLEEP)
+# endif /* SOLARIS */
+# endif /* __sgi */
+# endif /* sun && !linux */
+# ifndef GET_MINOR
+# define GET_MINOR(x) minor(x)
+# endif
+# if (BSD >= 199306) || defined(__FreeBSD__)
+# include <vm/vm.h>
+# if !defined(__FreeBSD__) || (defined (__FreeBSD__) && __FreeBSD__>=3)
+# include <vm/vm_extern.h>
+# include <sys/proc.h>
+extern vm_map_t kmem_map;
+# else /* !__FreeBSD__ || (__FreeBSD__ && __FreeBSD__>=3) */
+# include <vm/vm_kern.h>
+# endif /* !__FreeBSD__ || (__FreeBSD__ && __FreeBSD__>=3) */
+# ifdef M_PFIL
+# define KMALLOC(a, b) MALLOC((a), b, sizeof(*(a)), M_PFIL, M_NOWAIT)
+# define KMALLOCS(a, b, c) MALLOC((a), b, (c), M_PFIL, M_NOWAIT)
+# define KFREE(x) FREE((x), M_PFIL)
+# define KFREES(x,s) FREE((x), M_PFIL)
+# else
+# define KMALLOC(a, b) MALLOC((a), b, sizeof(*(a)), M_TEMP, M_NOWAIT)
+# define KMALLOCS(a, b, c) MALLOC((a), b, (c), M_TEMP, M_NOWAIT)
+# define KFREE(x) FREE((x), M_TEMP)
+# define KFREES(x,s) FREE((x), M_TEMP)
+# endif /* M_PFIL */
+# define UIOMOVE(a,b,c,d) uiomove(a,b,d)
+# define SLEEP(id, n) tsleep((id), PPAUSE|PCATCH, n, 0)
+# define WAKEUP(id) wakeup(id)
+# endif /* BSD */
+# if defined(NetBSD) && NetBSD <= 1991011 && NetBSD >= 199407
+# define SPL_NET(x) x = splsoftnet()
+# define SPL_X(x) (void) splx(x)
+# else
+# if !SOLARIS && !defined(linux)
+# define SPL_IMP(x) x = splimp()
+# define SPL_NET(x) x = splnet()
+# define SPL_X(x) (void) splx(x)
+# endif
+# endif /* NetBSD && NetBSD <= 1991011 && NetBSD >= 199407 */
+# define PANIC(x,y) if (x) panic y
+#else /* KERNEL */
+# define SLEEP(x,y) ;
+# define WAKEUP(x) ;
+# define PANIC(x,y) ;
+# define ATOMIC_INC(x) (x)++
+# define ATOMIC_DEC(x) (x)--
+# define MUTEX_ENTER(x) ;
+# define READ_ENTER(x) ;
+# define MUTEX_INIT(x,y,z) ;
+# define MUTEX_DESTROY(x) ;
+# define WRITE_ENTER(x) ;
+# define RW_UPGRADE(x) ;
+# define MUTEX_DOWNGRADE(x) ;
+# define RWLOCK_EXIT(x) ;
+# define MUTEX_EXIT(x) ;
+# define SPL_NET(x) ;
+# define SPL_IMP(x) ;
+# undef SPL_X
+# define SPL_X(x) ;
+# define KMALLOC(a,b) (a) = (b)malloc(sizeof(*a))
+# define KMALLOCS(a,b,c) (a) = (b)malloc(c)
+# define KFREE(x) free(x)
+# define KFREES(x,s) free(x)
+# define GETUNIT(x, v) get_unit(x,v)
+# define IRCOPY(a,b,c) (bcopy((a), (b), (c)), 0)
+# define IWCOPY(a,b,c) (bcopy((a), (b), (c)), 0)
+# define IRCOPYPTR ircopyptr
+# define IWCOPYPTR iwcopyptr
+#endif /* KERNEL */
+
+#if SOLARIS
+typedef mblk_t mb_t;
+# if SOLARIS2 >= 7
+# ifdef lint
+# define ALIGN32(ptr) (ptr ? 0L : 0L)
+# define ALIGN16(ptr) (ptr ? 0L : 0L)
+# else
+# define ALIGN32(ptr) (ptr)
+# define ALIGN16(ptr) (ptr)
+# endif
+# endif
+#else
+# ifdef linux
+# ifndef kernel
+typedef struct mb {
+ struct mb *next;
+ u_int len;
+ u_char *data;
+} mb_t;
+# else
+typedef struct sk_buff mb_t;
+# endif
+# else
+typedef struct mbuf mb_t;
+# endif
+#endif /* SOLARIS */
+
+#if defined(linux) || defined(__sgi)
+/*
+ * These #ifdef's are here mainly for linux, but who knows, they may
+ * not be in other places or maybe one day linux will grow up and some
+ * of these will turn up there too.
+ */
+#ifndef ICMP_MINLEN
+# define ICMP_MINLEN 8
+#endif
+#ifndef ICMP_UNREACH
+# define ICMP_UNREACH ICMP_DEST_UNREACH
+#endif
+#ifndef ICMP_SOURCEQUENCH
+# define ICMP_SOURCEQUENCH ICMP_SOURCE_QUENCH
+#endif
+#ifndef ICMP_TIMXCEED
+# define ICMP_TIMXCEED ICMP_TIME_EXCEEDED
+#endif
+#ifndef ICMP_PARAMPROB
+# define ICMP_PARAMPROB ICMP_PARAMETERPROB
+#endif
+#ifndef ICMP_TSTAMP
+# define ICMP_TSTAMP ICMP_TIMESTAMP
+#endif
+#ifndef ICMP_TSTAMPREPLY
+# define ICMP_TSTAMPREPLY ICMP_TIMESTAMPREPLY
+#endif
+#ifndef ICMP_IREQ
+# define ICMP_IREQ ICMP_INFO_REQUEST
+#endif
+#ifndef ICMP_IREQREPLY
+# define ICMP_IREQREPLY ICMP_INFO_REPLY
+#endif
+#ifndef ICMP_MASKREQ
+# define ICMP_MASKREQ ICMP_ADDRESS
+#endif
+#ifndef ICMP_MASKREPLY
+# define ICMP_MASKREPLY ICMP_ADDRESSREPLY
+#endif
+#ifndef IPVERSION
+# define IPVERSION 4
+#endif
+#ifndef IPOPT_MINOFF
+# define IPOPT_MINOFF 4
+#endif
+#ifndef IPOPT_COPIED
+# define IPOPT_COPIED(x) ((x)&0x80)
+#endif
+#ifndef IPOPT_EOL
+# define IPOPT_EOL 0
+#endif
+#ifndef IPOPT_NOP
+# define IPOPT_NOP 1
+#endif
+#ifndef IP_MF
+# define IP_MF ((u_short)0x2000)
+#endif
+#ifndef ETHERTYPE_IP
+# define ETHERTYPE_IP ((u_short)0x0800)
+#endif
+#ifndef TH_FIN
+# define TH_FIN 0x01
+#endif
+#ifndef TH_SYN
+# define TH_SYN 0x02
+#endif
+#ifndef TH_RST
+# define TH_RST 0x04
+#endif
+#ifndef TH_PUSH
+# define TH_PUSH 0x08
+#endif
+#ifndef TH_ACK
+# define TH_ACK 0x10
+#endif
+#ifndef TH_URG
+# define TH_URG 0x20
+#endif
+#ifndef IPOPT_EOL
+# define IPOPT_EOL 0
+#endif
+#ifndef IPOPT_NOP
+# define IPOPT_NOP 1
+#endif
+#ifndef IPOPT_RR
+# define IPOPT_RR 7
+#endif
+#ifndef IPOPT_TS
+# define IPOPT_TS 68
+#endif
+#ifndef IPOPT_SECURITY
+# define IPOPT_SECURITY 130
+#endif
+#ifndef IPOPT_LSRR
+# define IPOPT_LSRR 131
+#endif
+#ifndef IPOPT_SATID
+# define IPOPT_SATID 136
+#endif
+#ifndef IPOPT_SSRR
+# define IPOPT_SSRR 137
+#endif
+#ifndef IPOPT_SECUR_UNCLASS
+# define IPOPT_SECUR_UNCLASS ((u_short)0x0000)
+#endif
+#ifndef IPOPT_SECUR_CONFID
+# define IPOPT_SECUR_CONFID ((u_short)0xf135)
+#endif
+#ifndef IPOPT_SECUR_EFTO
+# define IPOPT_SECUR_EFTO ((u_short)0x789a)
+#endif
+#ifndef IPOPT_SECUR_MMMM
+# define IPOPT_SECUR_MMMM ((u_short)0xbc4d)
+#endif
+#ifndef IPOPT_SECUR_RESTR
+# define IPOPT_SECUR_RESTR ((u_short)0xaf13)
+#endif
+#ifndef IPOPT_SECUR_SECRET
+# define IPOPT_SECUR_SECRET ((u_short)0xd788)
+#endif
+#ifndef IPOPT_SECUR_TOPSECRET
+# define IPOPT_SECUR_TOPSECRET ((u_short)0x6bc5)
+#endif
+#ifndef IPOPT_OLEN
+# define IPOPT_OLEN 1
+#endif
+#endif /* linux || __sgi */
+
+#ifdef linux
+#include <linux/in_systm.h>
+/*
+ * TCP States
+ */
+#define TCPS_CLOSED 0 /* closed */
+#define TCPS_LISTEN 1 /* listening for connection */
+#define TCPS_SYN_SENT 2 /* active, have sent syn */
+#define TCPS_SYN_RECEIVED 3 /* have send and received syn */
+/* states < TCPS_ESTABLISHED are those where connections not established */
+#define TCPS_ESTABLISHED 4 /* established */
+#define TCPS_CLOSE_WAIT 5 /* rcvd fin, waiting for close */
+/* states > TCPS_CLOSE_WAIT are those where user has closed */
+#define TCPS_FIN_WAIT_1 6 /* have closed, sent fin */
+#define TCPS_CLOSING 7 /* closed xchd FIN; await FIN ACK */
+#define TCPS_LAST_ACK 8 /* had fin and close; await FIN ACK */
+/* states > TCPS_CLOSE_WAIT && < TCPS_FIN_WAIT_2 await ACK of FIN */
+#define TCPS_FIN_WAIT_2 9 /* have closed, fin is acked */
+#define TCPS_TIME_WAIT 10 /* in 2*msl quiet wait after close */
+
+/*
+ * file flags.
+ */
+#ifdef WRITE
+#define FWRITE WRITE
+#define FREAD READ
+#else
+#define FWRITE _IOC_WRITE
+#define FREAD _IOC_READ
+#endif
+/*
+ * mbuf related problems.
+ */
+#define mtod(m,t) (t)((m)->data)
+#define m_len len
+#define m_next next
+
+#ifdef IP_DF
+#undef IP_DF
+#endif
+#define IP_DF 0x4000
+
+typedef struct {
+ __u16 th_sport;
+ __u16 th_dport;
+ __u32 th_seq;
+ __u32 th_ack;
+# if defined(__i386__) || defined(__MIPSEL__) || defined(__alpha__) ||\
+ defined(vax)
+ __u8 th_res:4;
+ __u8 th_off:4;
+#else
+ __u8 th_off:4;
+ __u8 th_res:4;
+#endif
+ __u8 th_flags;
+ __u16 th_win;
+ __u16 th_sum;
+ __u16 th_urp;
+} tcphdr_t;
+
+typedef struct {
+ __u16 uh_sport;
+ __u16 uh_dport;
+ __u16 uh_ulen;
+ __u16 uh_sum;
+} udphdr_t;
+
+typedef struct {
+# if defined(__i386__) || defined(__MIPSEL__) || defined(__alpha__) ||\
+ defined(vax)
+ __u8 ip_hl:4;
+ __u8 ip_v:4;
+# else
+ __u8 ip_v:4;
+ __u8 ip_hl:4;
+# endif
+ __u8 ip_tos;
+ __u16 ip_len;
+ __u16 ip_id;
+ __u16 ip_off;
+ __u8 ip_ttl;
+ __u8 ip_p;
+ __u16 ip_sum;
+ struct in_addr ip_src;
+ struct in_addr ip_dst;
+} ip_t;
+
+/*
+ * Structure of an icmp header.
+ */
+typedef struct icmp {
+ __u8 icmp_type; /* type of message, see below */
+ __u8 icmp_code; /* type sub code */
+ __u16 icmp_cksum; /* ones complement cksum of struct */
+ union {
+ __u8 ih_pptr; /* ICMP_PARAMPROB */
+ struct in_addr ih_gwaddr; /* ICMP_REDIRECT */
+ struct ih_idseq {
+ __u16 icd_id;
+ __u16 icd_seq;
+ } ih_idseq;
+ int ih_void;
+ } icmp_hun;
+# define icmp_pptr icmp_hun.ih_pptr
+# define icmp_gwaddr icmp_hun.ih_gwaddr
+# define icmp_id icmp_hun.ih_idseq.icd_id
+# define icmp_seq icmp_hun.ih_idseq.icd_seq
+# define icmp_void icmp_hun.ih_void
+ union {
+ struct id_ts {
+ n_time its_otime;
+ n_time its_rtime;
+ n_time its_ttime;
+ } id_ts;
+ struct id_ip {
+ ip_t idi_ip;
+ /* options and then 64 bits of data */
+ } id_ip;
+ u_long id_mask;
+ char id_data[1];
+ } icmp_dun;
+# define icmp_otime icmp_dun.id_ts.its_otime
+# define icmp_rtime icmp_dun.id_ts.its_rtime
+# define icmp_ttime icmp_dun.id_ts.its_ttime
+# define icmp_ip icmp_dun.id_ip.idi_ip
+# define icmp_mask icmp_dun.id_mask
+# define icmp_data icmp_dun.id_data
+} icmphdr_t;
+
+# ifndef LINUX_IPOVLY
+# define LINUX_IPOVLY
+struct ipovly {
+ caddr_t ih_next, ih_prev; /* for protocol sequence q's */
+ u_char ih_x1; /* (unused) */
+ u_char ih_pr; /* protocol */
+ short ih_len; /* protocol length */
+ struct in_addr ih_src; /* source internet address */
+ struct in_addr ih_dst; /* destination internet address */
+};
+# endif
+
+typedef struct {
+ __u8 ether_dhost[6];
+ __u8 ether_shost[6];
+ __u16 ether_type;
+} ether_header_t;
+
+typedef struct uio {
+ int uio_resid;
+ int uio_rw;
+ caddr_t uio_buf;
+} uio_t;
+
+# define UIO_READ 0
+# define UIO_WRITE 1
+# define UIOMOVE(a, b, c, d) uiomove(a,b,c,d)
+
+/*
+ * For masking struct ifnet onto struct device
+ */
+# define if_name name
+
+# ifdef KERNEL
+# define GETUNIT(x, v) dev_get(x)
+# define FREE_MB_T(m) kfree_skb(m, FREE_WRITE)
+# define uniqtime do_gettimeofday
+# undef INT_MAX
+# undef UINT_MAX
+# undef LONG_MAX
+# undef ULONG_MAX
+# include <linux/netdevice.h>
+# define SPL_X(x)
+# define SPL_NET(x)
+# define SPL_IMP(x)
+
+# define bcmp(a,b,c) memcmp(a,b,c)
+# define bcopy(a,b,c) memcpy(b,a,c)
+# define bzero(a,c) memset(a,0,c)
+
+# define UNITNAME(n) dev_get((n))
+
+# define KMALLOC(a,b) (a) = (b)kmalloc(sizeof(*(a)), GFP_ATOMIC)
+# define KMALLOCS(a,b,c) (a) = (b)kmalloc((c), GFP_ATOMIC)
+# define KFREE(x) kfree_s((x), sizeof(*(x)))
+# define KFREES(x,s) kfree_s((x), (s))
+#define IRCOPY(const void *a, void *b, size_t c) { \
+ int error; \
+
+ error = verify_area(VERIFY_READ, a ,c); \
+ if (!error) \
+ memcpy_fromfs(b, a, c); \
+ return error; \
+}
+static inline int IWCOPY(const void *a, void *b, size_t c)
+{
+ int error;
+
+ error = verify_area(VERIFY_WRITE, b, c);
+ if (!error)
+ memcpy_tofs(b, a, c);
+ return error;
+}
+static inline int IRCOPYPTR(const void *a, void *b, size_t c) {
+ caddr_t ca;
+ int error;
+
+ error = verify_area(VERIFY_READ, a ,sizeof(ca));
+ if (!error) {
+ memcpy_fromfs(ca, a, sizeof(ca));
+ error = verify_area(VERIFY_READ, ca , c);
+ if (!error)
+ memcpy_fromfs(b, ca, c);
+ }
+ return error;
+}
+static inline int IWCOPYPTR(const void *a, void *b, size_t c) {
+ caddr_t ca;
+ int error;
+
+
+ error = verify_area(VERIFY_READ, b ,sizeof(ca));
+ if (!error) {
+ memcpy_fromfs(ca, b, sizeof(ca));
+ error = verify_area(VERIFY_WRITE, ca, c);
+ if (!error)
+ memcpy_tofs(ca, a, c);
+ }
+ return error;
+}
+# else
+# define __KERNEL__
+# undef INT_MAX
+# undef UINT_MAX
+# undef LONG_MAX
+# undef ULONG_MAX
+# define s8 __s8
+# define u8 __u8
+# define s16 __s16
+# define u16 __u16
+# define s32 __s32
+# define u32 __u32
+# include <linux/netdevice.h>
+# undef __KERNEL__
+# endif
+# define ifnet device
+#else
+typedef struct tcphdr tcphdr_t;
+typedef struct udphdr udphdr_t;
+typedef struct icmp icmphdr_t;
+typedef struct ip ip_t;
+typedef struct ether_header ether_header_t;
+#endif /* linux */
+typedef struct tcpiphdr tcpiphdr_t;
+
+#if defined(hpux) || defined(linux)
+struct ether_addr {
+ char ether_addr_octet[6];
+};
+#endif
+
+/*
+ * XXX - This is one of those *awful* hacks which nobody likes
+ */
+#ifdef ultrix
+#define A_A
+#else
+#define A_A &
+#endif
+
+#ifndef ICMP_ROUTERADVERT
+# define ICMP_ROUTERADVERT 9
+#endif
+#ifndef ICMP_ROUTERSOLICIT
+# define ICMP_ROUTERSOLICIT 10
+#endif
+#undef ICMP_MAX_UNREACH
+#define ICMP_MAX_UNREACH 14
+#undef ICMP_MAXTYPE
+#define ICMP_MAXTYPE 18
+/*
+ * ICMP error replies have an IP header (20 bytes), 8 bytes of ICMP data,
+ * another IP header and then 64 bits of data, totalling 56. Of course,
+ * the last 64 bits is dependant on that being available.
+ */
+#define ICMPERR_ICMPHLEN 8
+#define ICMPERR_IPICMPHLEN (20 + 8)
+#define ICMPERR_MINPKTLEN (20 + 8 + 20)
+#define ICMPERR_MAXPKTLEN (20 + 8 + 20 + 8)
+#define ICMP6ERR_MINPKTLEN (40 + 8)
+#define ICMP6ERR_IPICMPHLEN (40 + 8 + 40)
+
+/*
+ * ECN is a new addition to TCP - RFC 2481
+ */
+#ifndef TH_ECN
+# define TH_ECN 0x40
+#endif
+#ifndef TH_CWR
+# define TH_CWR 0x80
+#endif
+#define TH_ECNALL (TH_ECN|TH_CWR)
+
+#define TCPF_ALL (TH_FIN|TH_SYN|TH_RST|TH_PUSH|TH_ACK|TH_URG|TH_ECN|TH_CWR)
+
+#endif /* __IP_COMPAT_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_fil.c b/sys/contrib/ipfilter/netinet/ip_fil.c
new file mode 100644
index 0000000..ff80058
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_fil.c
@@ -0,0 +1,1763 @@
+/*
+ * Copyright (C) 1993-2000 by Darren Reed.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and due credit is given
+ * to the original author and the contributors.
+ */
+#if !defined(lint)
+static const char sccsid[] = "@(#)ip_fil.c 2.41 6/5/96 (C) 1993-1995 Darren Reed";
+/*static const char rcsid[] = "@(#)$Id: ip_fil.c,v 2.42.2.14 2000/07/18 13:57:55 darrenr Exp $";*/
+static const char rcsid[] = "@(#)$FreeBSD$";
+#endif
+
+#ifndef SOLARIS
+#define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
+#endif
+
+#if defined(KERNEL) && !defined(_KERNEL)
+# define _KERNEL
+#endif
+#if defined(_KERNEL) && defined(__FreeBSD_version) && \
+ (__FreeBSD_version >= 400000) && !defined(KLD_MODULE)
+#include "opt_inet6.h"
+#endif
+#include <sys/param.h>
+#if defined(__NetBSD__) && (NetBSD >= 199905) && !defined(IPFILTER_LKM) && \
+ defined(_KERNEL)
+# include "opt_ipfilter_log.h"
+#endif
+#if defined(__FreeBSD__) && !defined(__FreeBSD_version)
+# if !defined(_KERNEL) || defined(IPFILTER_LKM)
+# include <osreldate.h>
+# endif
+#endif
+#ifndef _KERNEL
+# include <stdio.h>
+# include <string.h>
+# include <stdlib.h>
+# include <ctype.h>
+# include <fcntl.h>
+#endif
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/file.h>
+#if __FreeBSD_version >= 220000 && defined(_KERNEL)
+# include <sys/fcntl.h>
+# include <sys/filio.h>
+#else
+# include <sys/ioctl.h>
+#endif
+#include <sys/time.h>
+#ifdef _KERNEL
+# include <sys/systm.h>
+#endif
+#include <sys/uio.h>
+#if !SOLARIS
+# if (NetBSD > 199609) || (OpenBSD > 199603) || (__FreeBSD_version >= 300000)
+# include <sys/dirent.h>
+# else
+# include <sys/dir.h>
+# endif
+# include <sys/mbuf.h>
+#else
+# include <sys/filio.h>
+#endif
+#include <sys/protosw.h>
+#include <sys/socket.h>
+
+#include <net/if.h>
+#ifdef sun
+# include <net/af.h>
+#endif
+#if __FreeBSD_version >= 300000
+# include <net/if_var.h>
+# if defined(_KERNEL) && !defined(IPFILTER_LKM)
+# include "opt_ipfilter.h"
+# endif
+#endif
+#ifdef __sgi
+#include <sys/debug.h>
+# ifdef IFF_DRVRLOCK /* IRIX6 */
+#include <sys/hashing.h>
+# endif
+#endif
+#include <net/route.h>
+#include <netinet/in.h>
+#if !(defined(__sgi) && !defined(IFF_DRVRLOCK)) /* IRIX < 6 */
+# include <netinet/in_var.h>
+#endif
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/ip_var.h>
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+#include <netinet/tcpip.h>
+#include <netinet/ip_icmp.h>
+#ifndef _KERNEL
+# include <unistd.h>
+# include <syslog.h>
+#endif
+#include "netinet/ip_compat.h"
+#ifdef USE_INET6
+# include <netinet/icmp6.h>
+#endif
+#include "netinet/ip_fil.h"
+#include "netinet/ip_proxy.h"
+#include "netinet/ip_nat.h"
+#include "netinet/ip_frag.h"
+#include "netinet/ip_state.h"
+#include "netinet/ip_auth.h"
+#if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+#endif
+#ifndef MIN
+# define MIN(a,b) (((a)<(b))?(a):(b))
+#endif
+#if !SOLARIS && defined(_KERNEL) && !defined(__sgi)
+# include <sys/kernel.h>
+extern int ip_optcopy __P((struct ip *, struct ip *));
+#endif
+
+#include <machine/in_cksum.h>
+
+extern struct protosw inetsw[];
+
+#ifndef _KERNEL
+# include "ipt.h"
+static struct ifnet **ifneta = NULL;
+static int nifs = 0;
+#else
+# if (BSD < 199306) || defined(__sgi)
+extern int tcp_ttl;
+# endif
+#endif
+
+int ipl_unreach = ICMP_UNREACH_FILTER;
+u_long ipl_frouteok[2] = {0, 0};
+
+static int frzerostats __P((caddr_t));
+#if defined(__NetBSD__) || defined(__OpenBSD__) || (__FreeBSD_version >= 300003)
+static int frrequest __P((int, u_long, caddr_t, int));
+#else
+static int frrequest __P((int, int, caddr_t, int));
+#endif
+#ifdef _KERNEL
+static int (*fr_savep) __P((ip_t *, int, void *, int, struct mbuf **));
+static int send_ip __P((ip_t *, fr_info_t *, struct mbuf *));
+# ifdef __sgi
+extern kmutex_t ipf_rw;
+extern KRWLOCK_T ipf_mutex;
+# endif
+#else
+int ipllog __P((void));
+void init_ifp __P((void));
+# ifdef __sgi
+static int no_output __P((struct ifnet *, struct mbuf *,
+ struct sockaddr *));
+static int write_output __P((struct ifnet *, struct mbuf *,
+ struct sockaddr *));
+# else
+static int no_output __P((struct ifnet *, struct mbuf *,
+ struct sockaddr *, struct rtentry *));
+static int write_output __P((struct ifnet *, struct mbuf *,
+ struct sockaddr *, struct rtentry *));
+# endif
+#endif
+int fr_running = 0;
+
+#if (__FreeBSD_version >= 300000) && defined(_KERNEL)
+struct callout_handle ipfr_slowtimer_ch;
+#endif
+#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104230000)
+# include <sys/callout.h>
+struct callout ipfr_slowtimer_ch;
+#endif
+#if defined(__sgi) && defined(_KERNEL)
+toid_t ipfr_slowtimer_ch;
+#endif
+
+#if (_BSDI_VERSION >= 199510) && defined(_KERNEL)
+# include <sys/device.h>
+# include <sys/conf.h>
+
+struct cfdriver iplcd = {
+ NULL, "ipl", NULL, NULL, DV_DULL, 0
+};
+
+struct devsw iplsw = {
+ &iplcd,
+ iplopen, iplclose, iplread, nowrite, iplioctl, noselect, nommap,
+ nostrat, nodump, nopsize, 0,
+ nostop
+};
+#endif /* _BSDI_VERSION >= 199510 && _KERNEL */
+
+#if defined(__NetBSD__) || defined(__OpenBSD__) || \
+ (_BSDI_VERSION >= 199701) || (__FreeBSD_version >= 500011)
+# include <sys/conf.h>
+# if defined(NETBSD_PF)
+# include <net/pfil.h>
+/*
+ * We provide the fr_checkp name just to minimize changes later.
+ */
+int (*fr_checkp) __P((ip_t *ip, int hlen, void *ifp, int out, mb_t **mp));
+# endif /* NETBSD_PF */
+#endif /* __NetBSD__ */
+
+#ifdef _KERNEL
+# if defined(IPFILTER_LKM) && !defined(__sgi)
+int iplidentify(s)
+char *s;
+{
+ if (strcmp(s, "ipl") == 0)
+ return 1;
+ return 0;
+}
+# endif /* IPFILTER_LKM */
+
+
+/*
+ * Try to detect the case when compiling for NetBSD with pseudo-device
+ */
+# if defined(__NetBSD__) && defined(PFIL_HOOKS)
+void
+ipfilterattach(count)
+int count;
+{
+ if (iplattach() != 0)
+ printf("IP Filter failed to attach\n");
+}
+# endif
+
+
+int iplattach()
+{
+ char *defpass;
+ int s;
+# if defined(__sgi) || (defined(NETBSD_PF) && \
+ ((__NetBSD_Version__ >= 104200000) || (__FreeBSD_version >= 500011)))
+ int error = 0;
+# endif
+
+ SPL_NET(s);
+ if (fr_running || (fr_checkp == fr_check)) {
+ printf("IP Filter: already initialized\n");
+ SPL_X(s);
+ return EBUSY;
+ }
+
+# ifdef IPFILTER_LOG
+ ipflog_init();
+# endif
+ if (nat_init() == -1)
+ return -1;
+ if (fr_stateinit() == -1)
+ return -1;
+ if (appr_init() == -1)
+ return -1;
+
+# ifdef NETBSD_PF
+# if (__NetBSD_Version__ >= 104200000) || (__FreeBSD_version >= 500011)
+ error = pfil_add_hook((void *)fr_check, PFIL_IN|PFIL_OUT,
+ &inetsw[ip_protox[IPPROTO_IP]].pr_pfh);
+ if (error) {
+# ifdef USE_INET6
+ goto pfil_error;
+# else
+ appr_unload();
+ ip_natunload();
+ fr_stateunload();
+ return error;
+# endif
+ }
+# else
+ pfil_add_hook((void *)fr_check, PFIL_IN|PFIL_OUT);
+# endif
+# ifdef USE_INET6
+ error = pfil_add_hook((void *)fr_check, PFIL_IN|PFIL_OUT,
+ &inetsw[ip_protox[IPPROTO_IPV6]].pr_pfh);
+ if (error) {
+ pfil_remove_hook((void *)fr_check, PFIL_IN|PFIL_OUT,
+ &inetsw[ip_protox[IPPROTO_IP]].pr_pfh);
+pfil_error:
+ appr_unload();
+ ip_natunload();
+ fr_stateunload();
+ return error;
+ }
+# endif
+# endif
+
+# ifdef __sgi
+ error = ipfilter_sgi_attach();
+ if (error) {
+ SPL_X(s);
+ appr_unload();
+ ip_natunload();
+ fr_stateunload();
+ return error;
+ }
+# endif
+
+ bzero((char *)frcache, sizeof(frcache));
+ fr_savep = fr_checkp;
+ fr_checkp = fr_check;
+ fr_running = 1;
+
+ SPL_X(s);
+ if (fr_pass & FR_PASS)
+ defpass = "pass";
+ else if (fr_pass & FR_BLOCK)
+ defpass = "block";
+ else
+ defpass = "no-match -> block";
+
+ printf("%s initialized. Default = %s all, Logging = %s\n",
+ ipfilter_version, defpass,
+# ifdef IPFILTER_LOG
+ "enabled");
+# else
+ "disabled");
+# endif
+#ifdef _KERNEL
+# if defined(__NetBSD__) && (__NetBSD_Version__ >= 104230000)
+ callout_init(&ipfr_slowtimer_ch);
+ callout_reset(&ipfr_slowtimer_ch, hz / 2, ipfr_slowtimer, NULL);
+# else
+# if (__FreeBSD_version >= 300000) || defined(__sgi)
+ ipfr_slowtimer_ch = timeout(ipfr_slowtimer, NULL, hz/2);
+# else
+ timeout(ipfr_slowtimer, NULL, hz/2);
+# endif
+# endif
+#endif
+ return 0;
+}
+
+
+/*
+ * Disable the filter by removing the hooks from the IP input/output
+ * stream.
+ */
+int ipldetach()
+{
+ int s, i = FR_INQUE|FR_OUTQUE;
+#if defined(NETBSD_PF) && \
+ ((__NetBSD_Version__ >= 104200000) || (__FreeBSD_version >= 500011))
+ int error = 0;
+#endif
+
+#ifdef _KERNEL
+# if defined(__NetBSD__) && (__NetBSD_Version__ >= 104230000)
+ callout_stop(&ipfr_slowtimer_ch);
+# else
+# if (__FreeBSD_version >= 300000)
+ untimeout(ipfr_slowtimer, NULL, ipfr_slowtimer_ch);
+# else
+# ifdef __sgi
+ untimeout(ipfr_slowtimer_ch);
+# else
+ untimeout(ipfr_slowtimer, NULL);
+# endif
+# endif /* FreeBSD */
+# endif /* NetBSD */
+#endif
+ SPL_NET(s);
+ if (!fr_running)
+ {
+ printf("IP Filter: not initialized\n");
+ SPL_X(s);
+ return 0;
+ }
+
+ printf("%s unloaded\n", ipfilter_version);
+
+ fr_checkp = fr_savep;
+ i = frflush(IPL_LOGIPF, i);
+ fr_running = 0;
+
+# ifdef NETBSD_PF
+# if ((__NetBSD_Version__ >= 104200000) || (__FreeBSD_version >= 500011))
+ error = pfil_remove_hook((void *)fr_check, PFIL_IN|PFIL_OUT,
+ &inetsw[ip_protox[IPPROTO_IP]].pr_pfh);
+ if (error)
+ return error;
+# else
+ pfil_remove_hook((void *)fr_check, PFIL_IN|PFIL_OUT);
+# endif
+# ifdef USE_INET6
+ error = pfil_remove_hook((void *)fr_check, PFIL_IN|PFIL_OUT,
+ &inetsw[ip_protox[IPPROTO_IPV6]].pr_pfh);
+ if (error)
+ return error;
+# endif
+# endif
+
+# ifdef __sgi
+ ipfilter_sgi_detach();
+# endif
+
+ appr_unload();
+ ipfr_unload();
+ ip_natunload();
+ fr_stateunload();
+ fr_authunload();
+
+ SPL_X(s);
+ return 0;
+}
+#endif /* _KERNEL */
+
+
+static int frzerostats(data)
+caddr_t data;
+{
+ friostat_t fio;
+ int error;
+
+ fr_getstat(&fio);
+ error = IWCOPYPTR((caddr_t)&fio, data, sizeof(fio));
+ if (error)
+ return EFAULT;
+
+ bzero((char *)frstats, sizeof(*frstats) * 2);
+
+ return 0;
+}
+
+
+/*
+ * Filter ioctl interface.
+ */
+#ifdef __sgi
+int IPL_EXTERN(ioctl)(dev_t dev, int cmd, caddr_t data, int mode
+# ifdef _KERNEL
+ , cred_t *cp, int *rp
+# endif
+)
+#else
+int IPL_EXTERN(ioctl)(dev, cmd, data, mode
+# if (defined(_KERNEL) && ((_BSDI_VERSION >= 199510) || (BSD >= 199506) || \
+ (NetBSD >= 199511) || (__FreeBSD_version >= 220000) || \
+ defined(__OpenBSD__)))
+, p)
+struct proc *p;
+# else
+)
+# endif
+dev_t dev;
+# if defined(__NetBSD__) || defined(__OpenBSD__) || \
+ (_BSDI_VERSION >= 199701) || (__FreeBSD_version >= 300000)
+u_long cmd;
+# else
+int cmd;
+# endif
+caddr_t data;
+int mode;
+#endif /* __sgi */
+{
+#if defined(_KERNEL) && !SOLARIS
+ int s;
+#endif
+ int error = 0, unit = 0, tmp;
+
+#if (BSD >= 199306) && defined(_KERNEL)
+ if ((securelevel >= 2) && (mode & FWRITE))
+ return EPERM;
+#endif
+#ifdef _KERNEL
+ unit = GET_MINOR(dev);
+ if ((IPL_LOGMAX < unit) || (unit < 0))
+ return ENXIO;
+#else
+ unit = dev;
+#endif
+
+ SPL_NET(s);
+
+ if (unit == IPL_LOGNAT) {
+ if (fr_running)
+ error = nat_ioctl(data, cmd, mode);
+ else
+ error = EIO;
+ SPL_X(s);
+ return error;
+ }
+ if (unit == IPL_LOGSTATE) {
+ if (fr_running)
+ error = fr_state_ioctl(data, cmd, mode);
+ else
+ error = EIO;
+ SPL_X(s);
+ return error;
+ }
+ if (unit == IPL_LOGAUTH) {
+ if (!fr_running)
+ return EIO;
+ error = fr_auth_ioctl(data, cmd, NULL, NULL);
+ SPL_X(s);
+ return error;
+ }
+
+ switch (cmd) {
+ case FIONREAD :
+#ifdef IPFILTER_LOG
+ error = IWCOPY((caddr_t)&iplused[IPL_LOGIPF], (caddr_t)data,
+ sizeof(iplused[IPL_LOGIPF]));
+#endif
+ break;
+#if !defined(IPFILTER_LKM) && defined(_KERNEL)
+ case SIOCFRENB :
+ {
+ u_int enable;
+
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+ error = IRCOPY(data, (caddr_t)&enable, sizeof(enable));
+ if (error)
+ break;
+ if (enable)
+ error = iplattach();
+ else
+ error = ipldetach();
+ }
+ break;
+ }
+#endif
+ case SIOCSETFF :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else
+ error = IRCOPY(data, (caddr_t)&fr_flags,
+ sizeof(fr_flags));
+ break;
+ case SIOCGETFF :
+ error = IWCOPY((caddr_t)&fr_flags, data, sizeof(fr_flags));
+ break;
+ case SIOCINAFR :
+ case SIOCRMAFR :
+ case SIOCADAFR :
+ case SIOCZRLST :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else
+ error = frrequest(unit, cmd, data, fr_active);
+ break;
+ case SIOCINIFR :
+ case SIOCRMIFR :
+ case SIOCADIFR :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else
+ error = frrequest(unit, cmd, data, 1 - fr_active);
+ break;
+ case SIOCSWAPA :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+ bzero((char *)frcache, sizeof(frcache[0]) * 2);
+ *(u_int *)data = fr_active;
+ fr_active = 1 - fr_active;
+ }
+ break;
+ case SIOCGETFS :
+ {
+ friostat_t fio;
+
+ fr_getstat(&fio);
+ error = IWCOPYPTR((caddr_t)&fio, data, sizeof(fio));
+ if (error)
+ return EFAULT;
+ break;
+ }
+ case SIOCFRZST :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else
+ error = frzerostats(data);
+ break;
+ case SIOCIPFFL :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+ error = IRCOPY(data, (caddr_t)&tmp, sizeof(tmp));
+ if (!error) {
+ tmp = frflush(unit, tmp);
+ error = IWCOPY((caddr_t)&tmp, data,
+ sizeof(tmp));
+ }
+ }
+ break;
+ case SIOCSTLCK :
+ error = IRCOPY(data, (caddr_t)&tmp, sizeof(tmp));
+ if (!error) {
+ fr_state_lock = tmp;
+ fr_nat_lock = tmp;
+ fr_frag_lock = tmp;
+ fr_auth_lock = tmp;
+ } else
+ error = EFAULT;
+ break;
+#ifdef IPFILTER_LOG
+ case SIOCIPFFB :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else
+ *(int *)data = ipflog_clear(unit);
+ break;
+#endif /* IPFILTER_LOG */
+ case SIOCGFRST :
+ error = IWCOPYPTR((caddr_t)ipfr_fragstats(), data,
+ sizeof(ipfrstat_t));
+ if (error)
+ return EFAULT;
+ break;
+ case SIOCAUTHW :
+ case SIOCAUTHR :
+ if (!(mode & FWRITE)) {
+ error = EPERM;
+ break;
+ }
+ case SIOCFRSYN :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+#if defined(_KERNEL) && defined(__sgi)
+ ipfsync();
+#endif
+ frsync();
+ }
+ break;
+ default :
+ error = EINVAL;
+ break;
+ }
+ SPL_X(s);
+ return error;
+}
+
+
+void fr_forgetifp(ifp)
+void *ifp;
+{
+ register frentry_t *f;
+
+ WRITE_ENTER(&ipf_mutex);
+ for (f = ipacct[0][fr_active]; (f != NULL); f = f->fr_next)
+ if (f->fr_ifa == ifp)
+ f->fr_ifa = (void *)-1;
+ for (f = ipacct[1][fr_active]; (f != NULL); f = f->fr_next)
+ if (f->fr_ifa == ifp)
+ f->fr_ifa = (void *)-1;
+ for (f = ipfilter[0][fr_active]; (f != NULL); f = f->fr_next)
+ if (f->fr_ifa == ifp)
+ f->fr_ifa = (void *)-1;
+ for (f = ipfilter[1][fr_active]; (f != NULL); f = f->fr_next)
+ if (f->fr_ifa == ifp)
+ f->fr_ifa = (void *)-1;
+#ifdef USE_INET6
+ for (f = ipacct6[0][fr_active]; (f != NULL); f = f->fr_next)
+ if (f->fr_ifa == ifp)
+ f->fr_ifa = (void *)-1;
+ for (f = ipacct6[1][fr_active]; (f != NULL); f = f->fr_next)
+ if (f->fr_ifa == ifp)
+ f->fr_ifa = (void *)-1;
+ for (f = ipfilter6[0][fr_active]; (f != NULL); f = f->fr_next)
+ if (f->fr_ifa == ifp)
+ f->fr_ifa = (void *)-1;
+ for (f = ipfilter6[1][fr_active]; (f != NULL); f = f->fr_next)
+ if (f->fr_ifa == ifp)
+ f->fr_ifa = (void *)-1;
+#endif
+ RWLOCK_EXIT(&ipf_mutex);
+ ip_natsync(ifp);
+}
+
+
+static int frrequest(unit, req, data, set)
+int unit;
+#if defined(__NetBSD__) || defined(__OpenBSD__) || (__FreeBSD_version >= 300003)
+u_long req;
+#else
+int req;
+#endif
+int set;
+caddr_t data;
+{
+ register frentry_t *fp, *f, **fprev;
+ register frentry_t **ftail;
+ frentry_t frd;
+ frdest_t *fdp;
+ frgroup_t *fg = NULL;
+ u_int *p, *pp;
+ int error = 0, in;
+ u_int group;
+
+ fp = &frd;
+ error = IRCOPYPTR(data, (caddr_t)fp, sizeof(*fp));
+ if (error)
+ return EFAULT;
+ fp->fr_ref = 0;
+#if (BSD >= 199306) && defined(_KERNEL)
+ if ((securelevel > 0) && (fp->fr_func != NULL))
+ return EPERM;
+#endif
+
+ /*
+ * Check that the group number does exist and that if a head group
+ * has been specified, doesn't exist.
+ */
+ if ((req != SIOCZRLST) && fp->fr_grhead &&
+ fr_findgroup((u_int)fp->fr_grhead, fp->fr_flags, unit, set, NULL))
+ return EEXIST;
+ if ((req != SIOCZRLST) && fp->fr_group &&
+ !fr_findgroup((u_int)fp->fr_group, fp->fr_flags, unit, set, NULL))
+ return ESRCH;
+
+ in = (fp->fr_flags & FR_INQUE) ? 0 : 1;
+
+ if (unit == IPL_LOGAUTH)
+ ftail = fprev = &ipauth;
+ else if ((fp->fr_flags & FR_ACCOUNT) && (fp->fr_v == 4))
+ ftail = fprev = &ipacct[in][set];
+ else if ((fp->fr_flags & (FR_OUTQUE|FR_INQUE)) && (fp->fr_v == 4))
+ ftail = fprev = &ipfilter[in][set];
+#ifdef USE_INET6
+ else if ((fp->fr_flags & FR_ACCOUNT) && (fp->fr_v == 6))
+ ftail = fprev = &ipacct6[in][set];
+ else if ((fp->fr_flags & (FR_OUTQUE|FR_INQUE)) && (fp->fr_v == 6))
+ ftail = fprev = &ipfilter6[in][set];
+#endif
+ else
+ return ESRCH;
+
+ if ((group = fp->fr_group)) {
+ if (!(fg = fr_findgroup(group, fp->fr_flags, unit, set, NULL)))
+ return ESRCH;
+ ftail = fprev = fg->fg_start;
+ }
+
+ bzero((char *)frcache, sizeof(frcache[0]) * 2);
+
+ if (*fp->fr_ifname) {
+ fp->fr_ifa = GETUNIT(fp->fr_ifname, fp->fr_v);
+ if (!fp->fr_ifa)
+ fp->fr_ifa = (void *)-1;
+ }
+#if BSD >= 199306
+ if (*fp->fr_oifname) {
+ fp->fr_oifa = GETUNIT(fp->fr_oifname, fp->fr_v);
+ if (!fp->fr_oifa)
+ fp->fr_oifa = (void *)-1;
+ }
+#endif
+
+ fdp = &fp->fr_dif;
+ fp->fr_flags &= ~FR_DUP;
+ if (*fdp->fd_ifname) {
+ fdp->fd_ifp = GETUNIT(fdp->fd_ifname, fp->fr_v);
+ if (!fdp->fd_ifp)
+ fdp->fd_ifp = (struct ifnet *)-1;
+ else
+ fp->fr_flags |= FR_DUP;
+ }
+
+ fdp = &fp->fr_tif;
+ if (*fdp->fd_ifname) {
+ fdp->fd_ifp = GETUNIT(fdp->fd_ifname, fp->fr_v);
+ if (!fdp->fd_ifp)
+ fdp->fd_ifp = (struct ifnet *)-1;
+ }
+
+ /*
+ * Look for a matching filter rule, but don't include the next or
+ * interface pointer in the comparison (fr_next, fr_ifa).
+ */
+ for (fp->fr_cksum = 0, p = (u_int *)&fp->fr_ip, pp = &fp->fr_cksum;
+ p < pp; p++)
+ fp->fr_cksum += *p;
+
+ for (; (f = *ftail); ftail = &f->fr_next)
+ if ((fp->fr_cksum == f->fr_cksum) &&
+ !bcmp((char *)&f->fr_ip, (char *)&fp->fr_ip, FR_CMPSIZ))
+ break;
+
+ /*
+ * If zero'ing statistics, copy current to caller and zero.
+ */
+ if (req == SIOCZRLST) {
+ if (!f)
+ return ESRCH;
+ error = IWCOPYPTR((caddr_t)f, data, sizeof(*f));
+ if (error)
+ return EFAULT;
+ f->fr_hits = 0;
+ f->fr_bytes = 0;
+ return 0;
+ }
+
+ if (!f) {
+ if (req != SIOCINAFR && req != SIOCINIFR)
+ while ((f = *ftail))
+ ftail = &f->fr_next;
+ else {
+ if (fp->fr_hits) {
+ ftail = fprev;
+ while (--fp->fr_hits && (f = *ftail))
+ ftail = &f->fr_next;
+ }
+ f = NULL;
+ }
+ }
+
+ if (req == SIOCRMAFR || req == SIOCRMIFR) {
+ if (!f)
+ error = ESRCH;
+ else {
+ /*
+ * Only return EBUSY if there is a group list, else
+ * it's probably just state information referencing
+ * the rule.
+ */
+ if ((f->fr_ref > 1) && f->fr_grp)
+ return EBUSY;
+ if (fg && fg->fg_head)
+ fg->fg_head->fr_ref--;
+ if (unit == IPL_LOGAUTH)
+ return fr_auth_ioctl(data, req, f, ftail);
+ if (f->fr_grhead)
+ fr_delgroup((u_int)f->fr_grhead, fp->fr_flags,
+ unit, set);
+ fixskip(fprev, f, -1);
+ *ftail = f->fr_next;
+ f->fr_next = NULL;
+ if (f->fr_ref == 0)
+ KFREE(f);
+ }
+ } else {
+ if (f)
+ error = EEXIST;
+ else {
+ if (unit == IPL_LOGAUTH)
+ return fr_auth_ioctl(data, req, fp, ftail);
+ KMALLOC(f, frentry_t *);
+ if (f != NULL) {
+ if (fg && fg->fg_head)
+ fg->fg_head->fr_ref++;
+ bcopy((char *)fp, (char *)f, sizeof(*f));
+ f->fr_ref = 1;
+ f->fr_hits = 0;
+ f->fr_next = *ftail;
+ *ftail = f;
+ if (req == SIOCINIFR || req == SIOCINAFR)
+ fixskip(fprev, f, 1);
+ f->fr_grp = NULL;
+ if ((group = f->fr_grhead))
+ fg = fr_addgroup(group, f, unit, set);
+ } else
+ error = ENOMEM;
+ }
+ }
+ return (error);
+}
+
+
+#ifdef _KERNEL
+/*
+ * routines below for saving IP headers to buffer
+ */
+# ifdef __sgi
+# ifdef _KERNEL
+int IPL_EXTERN(open)(dev_t *pdev, int flags, int devtype, cred_t *cp)
+# else
+int IPL_EXTERN(open)(dev_t dev, int flags)
+# endif
+# else
+int IPL_EXTERN(open)(dev, flags
+# if ((_BSDI_VERSION >= 199510) || (BSD >= 199506) || (NetBSD >= 199511) || \
+ (__FreeBSD_version >= 220000) || defined(__OpenBSD__)) && defined(_KERNEL)
+, devtype, p)
+int devtype;
+struct proc *p;
+# else
+)
+# endif
+dev_t dev;
+int flags;
+# endif /* __sgi */
+{
+# if defined(__sgi) && defined(_KERNEL)
+ u_int min = geteminor(*pdev);
+# else
+ u_int min = GET_MINOR(dev);
+# endif
+
+ if (IPL_LOGMAX < min)
+ min = ENXIO;
+ else
+ min = 0;
+ return min;
+}
+
+
+# ifdef __sgi
+int IPL_EXTERN(close)(dev_t dev, int flags, int devtype, cred_t *cp)
+#else
+int IPL_EXTERN(close)(dev, flags
+# if ((_BSDI_VERSION >= 199510) || (BSD >= 199506) || (NetBSD >= 199511) || \
+ (__FreeBSD_version >= 220000) || defined(__OpenBSD__)) && defined(_KERNEL)
+, devtype, p)
+int devtype;
+struct proc *p;
+# else
+)
+# endif
+dev_t dev;
+int flags;
+# endif /* __sgi */
+{
+ u_int min = GET_MINOR(dev);
+
+ if (IPL_LOGMAX < min)
+ min = ENXIO;
+ else
+ min = 0;
+ return min;
+}
+
+/*
+ * iplread/ipllog
+ * both of these must operate with at least splnet() lest they be
+ * called during packet processing and cause an inconsistancy to appear in
+ * the filter lists.
+ */
+# ifdef __sgi
+int IPL_EXTERN(read)(dev_t dev, uio_t *uio, cred_t *crp)
+# else
+# if BSD >= 199306
+int IPL_EXTERN(read)(dev, uio, ioflag)
+int ioflag;
+# else
+int IPL_EXTERN(read)(dev, uio)
+# endif
+dev_t dev;
+register struct uio *uio;
+# endif /* __sgi */
+{
+# ifdef IPFILTER_LOG
+ return ipflog_read(GET_MINOR(dev), uio);
+# else
+ return ENXIO;
+# endif
+}
+
+
+/*
+ * send_reset - this could conceivably be a call to tcp_respond(), but that
+ * requires a large amount of setting up and isn't any more efficient.
+ */
+int send_reset(oip, fin)
+struct ip *oip;
+fr_info_t *fin;
+{
+ struct tcphdr *tcp, *tcp2;
+ int tlen = 0, hlen;
+ struct mbuf *m;
+#ifdef USE_INET6
+ ip6_t *ip6, *oip6 = (ip6_t *)oip;
+#endif
+ ip_t *ip;
+
+ tcp = (struct tcphdr *)fin->fin_dp;
+ if (tcp->th_flags & TH_RST)
+ return -1; /* feedback loop */
+# if (BSD < 199306) || defined(__sgi)
+ m = m_get(M_DONTWAIT, MT_HEADER);
+# else
+ m = m_gethdr(M_DONTWAIT, MT_HEADER);
+# endif
+ if (m == NULL)
+ return ENOBUFS;
+ if (m == NULL)
+ return -1;
+
+ tlen = oip->ip_len - fin->fin_hlen - (tcp->th_off << 2) +
+ ((tcp->th_flags & TH_SYN) ? 1 : 0) +
+ ((tcp->th_flags & TH_FIN) ? 1 : 0);
+
+#ifdef USE_INET6
+ hlen = (fin->fin_v == 6) ? sizeof(ip6_t) : sizeof(ip_t);
+#else
+ hlen = sizeof(ip_t);
+#endif
+ m->m_len = sizeof(*tcp2) + hlen;
+# if BSD >= 199306
+ m->m_data += max_linkhdr;
+ m->m_pkthdr.len = m->m_len;
+ m->m_pkthdr.rcvif = (struct ifnet *)0;
+# endif
+ ip = mtod(m, struct ip *);
+# ifdef USE_INET6
+ ip6 = (ip6_t *)ip;
+# endif
+ bzero((char *)ip, sizeof(*tcp2) + hlen);
+ tcp2 = (struct tcphdr *)((char *)ip + hlen);
+
+ tcp2->th_sport = tcp->th_dport;
+ tcp2->th_dport = tcp->th_sport;
+ if (tcp->th_flags & TH_ACK) {
+ tcp2->th_seq = tcp->th_ack;
+ tcp2->th_flags = TH_RST;
+ } else {
+ tcp2->th_ack = ntohl(tcp->th_seq);
+ tcp2->th_ack += tlen;
+ tcp2->th_ack = htonl(tcp2->th_ack);
+ tcp2->th_flags = TH_RST|TH_ACK;
+ }
+ tcp2->th_off = sizeof(*tcp2) >> 2;
+# ifdef USE_INET6
+ if (fin->fin_v == 6) {
+ ip6->ip6_plen = htons(sizeof(struct tcphdr));
+ ip6->ip6_nxt = IPPROTO_TCP;
+ ip6->ip6_src = oip6->ip6_dst;
+ ip6->ip6_dst = oip6->ip6_src;
+ tcp2->th_sum = in6_cksum(m, IPPROTO_TCP,
+ sizeof(*ip6), sizeof(*tcp2));
+ return send_ip(oip, fin, m);
+ }
+# endif
+ ip->ip_p = IPPROTO_TCP;
+ ip->ip_len = htons(sizeof(struct tcphdr));
+ ip->ip_src.s_addr = oip->ip_dst.s_addr;
+ ip->ip_dst.s_addr = oip->ip_src.s_addr;
+ tcp2->th_sum = in_cksum(m, hlen + sizeof(*tcp2));
+ ip->ip_len = hlen + sizeof(*tcp2);
+ return send_ip(oip, fin, m);
+}
+
+
+static int send_ip(oip, fin, m)
+ip_t *oip;
+fr_info_t *fin;
+struct mbuf *m;
+{
+ ip_t *ip;
+
+ ip = mtod(m, ip_t *);
+
+ ip->ip_v = fin->fin_v;
+ if (ip->ip_v == 4) {
+ ip->ip_hl = (sizeof(*oip) >> 2);
+ ip->ip_v = IPVERSION;
+ ip->ip_tos = oip->ip_tos;
+ ip->ip_id = oip->ip_id;
+ ip->ip_off = 0;
+# if (BSD < 199306) || defined(__sgi)
+ ip->ip_ttl = tcp_ttl;
+# else
+ ip->ip_ttl = ip_defttl;
+# endif
+ ip->ip_sum = 0;
+ }
+# ifdef USE_INET6
+ else if (ip->ip_v == 6) {
+ ip6_t *ip6 = (ip6_t *)ip;
+
+ ip6->ip6_hlim = 127;
+
+ return ip6_output(m, NULL, NULL, 0, NULL, NULL);
+ }
+# endif
+# ifdef IPSEC
+ m->m_pkthdr.rcvif = NULL;
+# endif
+ return ipfr_fastroute(m, fin, NULL);
+}
+
+
+int send_icmp_err(oip, type, fin, dst)
+ip_t *oip;
+int type;
+fr_info_t *fin;
+int dst;
+{
+ int err, hlen = 0, xtra = 0, iclen, ohlen = 0, avail, code;
+ struct in_addr dst4;
+ struct icmp *icmp;
+ struct mbuf *m;
+ void *ifp;
+#ifdef USE_INET6
+ ip6_t *ip6, *oip6 = (ip6_t *)oip;
+ struct in6_addr dst6;
+#endif
+ ip_t *ip;
+
+ if ((type < 0) || (type > ICMP_MAXTYPE))
+ return -1;
+
+ code = fin->fin_icode;
+#ifdef USE_INET6
+ if ((code < 0) || (code > sizeof(icmptoicmp6unreach)/sizeof(int)))
+ return -1;
+#endif
+
+ avail = 0;
+ m = NULL;
+ ifp = fin->fin_ifp;
+ if (fin->fin_v == 4) {
+ if ((oip->ip_p == IPPROTO_ICMP) &&
+ !(fin->fin_fi.fi_fl & FI_SHORT))
+ switch (ntohs(fin->fin_data[0]) >> 8)
+ {
+ case ICMP_ECHO :
+ case ICMP_TSTAMP :
+ case ICMP_IREQ :
+ case ICMP_MASKREQ :
+ break;
+ default :
+ return 0;
+ }
+
+# if (BSD < 199306) || defined(__sgi)
+ avail = MLEN;
+ m = m_get(M_DONTWAIT, MT_HEADER);
+# else
+ avail = MHLEN;
+ m = m_gethdr(M_DONTWAIT, MT_HEADER);
+# endif
+ if (m == NULL)
+ return ENOBUFS;
+
+ if (dst == 0) {
+ if (fr_ifpaddr(4, ifp, &dst4) == -1)
+ return -1;
+ } else
+ dst4.s_addr = oip->ip_dst.s_addr;
+
+ hlen = sizeof(ip_t);
+ ohlen = oip->ip_hl << 2;
+ xtra = 8;
+ }
+
+#ifdef USE_INET6
+ else if (fin->fin_v == 6) {
+ hlen = sizeof(ip6_t);
+ ohlen = sizeof(ip6_t);
+ type = icmptoicmp6types[type];
+ if (type == ICMP6_DST_UNREACH)
+ code = icmptoicmp6unreach[code];
+
+ MGETHDR(m, M_DONTWAIT, MT_HEADER);
+ if (!m)
+ return ENOBUFS;
+
+ MCLGET(m, M_DONTWAIT);
+ if ((m->m_flags & M_EXT) == 0) {
+ m_freem(m);
+ return ENOBUFS;
+ }
+# ifdef M_TRAILINGSPACE
+ m->m_len = 0;
+ avail = M_TRAILINGSPACE(m);
+# else
+ avail = MCLBYTES;
+# endif
+ xtra = MIN(ntohs(oip6->ip6_plen) + sizeof(ip6_t),
+ avail - hlen - sizeof(*icmp) - max_linkhdr);
+ if (dst == 0) {
+ if (fr_ifpaddr(6, ifp, (struct in_addr *)&dst6) == -1)
+ return -1;
+ } else
+ dst6 = oip6->ip6_dst;
+ }
+#endif
+
+ iclen = hlen + sizeof(*icmp);
+# if BSD >= 199306
+ avail -= (max_linkhdr + iclen);
+ m->m_data += max_linkhdr;
+ m->m_pkthdr.rcvif = (struct ifnet *)0;
+ if (xtra > avail)
+ xtra = avail;
+ iclen += xtra;
+ m->m_pkthdr.len = iclen;
+#else
+ avail -= (m->m_off + iclen);
+ if (xtra > avail)
+ xtra = avail;
+ iclen += xtra;
+#endif
+ m->m_len = iclen;
+ ip = mtod(m, ip_t *);
+ icmp = (struct icmp *)((char *)ip + hlen);
+ bzero((char *)ip, iclen);
+
+ icmp->icmp_type = type;
+ icmp->icmp_code = fin->fin_icode;
+ icmp->icmp_cksum = 0;
+#ifdef icmp_nextmtu
+ if (type == ICMP_UNREACH &&
+ fin->fin_icode == ICMP_UNREACH_NEEDFRAG && ifp)
+ icmp->icmp_nextmtu = htons(((struct ifnet *) ifp)->if_mtu);
+#endif
+
+ if (avail) {
+ bcopy((char *)oip, (char *)&icmp->icmp_ip, MIN(ohlen, avail));
+ avail -= MIN(ohlen, avail);
+ }
+
+#ifdef USE_INET6
+ ip6 = (ip6_t *)ip;
+ if (fin->fin_v == 6) {
+ ip6->ip6_flow = 0;
+ ip6->ip6_plen = htons(iclen - hlen);
+ ip6->ip6_nxt = IPPROTO_ICMPV6;
+ ip6->ip6_hlim = 0;
+ ip6->ip6_src = dst6;
+ ip6->ip6_dst = oip6->ip6_src;
+ if (avail)
+ bcopy((char *)oip + ohlen,
+ (char *)&icmp->icmp_ip + ohlen, avail);
+ icmp->icmp_cksum = in6_cksum(m, IPPROTO_ICMPV6,
+ sizeof(*ip6), iclen - hlen);
+ } else
+#endif
+ {
+ ip->ip_src.s_addr = dst4.s_addr;
+ ip->ip_dst.s_addr = oip->ip_src.s_addr;
+
+ if (avail > 8)
+ avail = 8;
+ if (avail)
+ bcopy((char *)oip + ohlen,
+ (char *)&icmp->icmp_ip + ohlen, avail);
+ icmp->icmp_cksum = ipf_cksum((u_short *)icmp,
+ sizeof(*icmp) + 8);
+ ip->ip_len = iclen;
+ ip->ip_p = IPPROTO_ICMP;
+ }
+ err = send_ip(oip, fin, m);
+ return err;
+}
+
+
+# if !defined(IPFILTER_LKM) && (__FreeBSD_version < 300000) && !defined(__sgi)
+# if (BSD < 199306)
+int iplinit __P((void));
+
+int
+# else
+void iplinit __P((void));
+
+void
+# endif
+iplinit()
+{
+ if (iplattach() != 0)
+ printf("IP Filter failed to attach\n");
+ ip_init();
+}
+# endif /* ! __NetBSD__ */
+
+
+size_t mbufchainlen(m0)
+register struct mbuf *m0;
+{
+ register size_t len = 0;
+
+ for (; m0; m0 = m0->m_next)
+ len += m0->m_len;
+ return len;
+}
+
+
+int ipfr_fastroute(m0, fin, fdp)
+struct mbuf *m0;
+fr_info_t *fin;
+frdest_t *fdp;
+{
+ register struct ip *ip, *mhip;
+ register struct mbuf *m = m0;
+ register struct route *ro;
+ int len, off, error = 0, hlen, code;
+ struct ifnet *ifp, *sifp;
+ struct sockaddr_in *dst;
+ struct route iproute;
+ frentry_t *fr;
+
+ hlen = fin->fin_hlen;
+ ip = mtod(m0, struct ip *);
+
+#ifdef USE_INET6
+ if (ip->ip_v == 6) {
+ /*
+ * currently "to <if>" and "to <if>:ip#" are not supported
+ * for IPv6
+ */
+ return ip6_output(m0, NULL, NULL, 0, NULL, NULL);
+ }
+#endif
+ /*
+ * Route packet.
+ */
+ ro = &iproute;
+ bzero((caddr_t)ro, sizeof (*ro));
+ dst = (struct sockaddr_in *)&ro->ro_dst;
+ dst->sin_family = AF_INET;
+
+ fr = fin->fin_fr;
+ if (fdp)
+ ifp = fdp->fd_ifp;
+ else {
+ ifp = fin->fin_ifp;
+ dst->sin_addr = ip->ip_dst;
+ }
+
+ /*
+ * In case we're here due to "to <if>" being used with "keep state",
+ * check that we're going in the correct direction.
+ */
+ if ((fr != NULL) && (fin->fin_rev != 0)) {
+ if ((ifp != NULL) && (fdp == &fr->fr_tif))
+ return -1;
+ dst->sin_addr = ip->ip_dst;
+ } else if (fdp)
+ dst->sin_addr = fdp->fd_ip.s_addr ? fdp->fd_ip : ip->ip_dst;
+
+# if BSD >= 199306
+ dst->sin_len = sizeof(*dst);
+# endif
+# if (BSD >= 199306) && !defined(__NetBSD__) && !defined(__bsdi__) && \
+ !defined(__OpenBSD__)
+# ifdef RTF_CLONING
+ rtalloc_ign(ro, RTF_CLONING);
+# else
+ rtalloc_ign(ro, RTF_PRCLONING);
+# endif
+# else
+ rtalloc(ro);
+# endif
+ if (!ifp) {
+ if (!fr || !(fr->fr_flags & FR_FASTROUTE)) {
+ error = -2;
+ goto bad;
+ }
+ if (ro->ro_rt == 0 || (ifp = ro->ro_rt->rt_ifp) == 0) {
+ if (in_localaddr(ip->ip_dst))
+ error = EHOSTUNREACH;
+ else
+ error = ENETUNREACH;
+ goto bad;
+ }
+ if (ro->ro_rt->rt_flags & RTF_GATEWAY)
+ dst = (struct sockaddr_in *)&ro->ro_rt->rt_gateway;
+ }
+ if (ro->ro_rt)
+ ro->ro_rt->rt_use++;
+
+ /*
+ * For input packets which are being "fastrouted", they won't
+ * go back through output filtering and miss their chance to get
+ * NAT'd and counted.
+ */
+ fin->fin_ifp = ifp;
+ if (fin->fin_out == 0) {
+ fin->fin_out = 1;
+ if ((fin->fin_fr = ipacct[1][fr_active]) &&
+ (fr_scanlist(FR_NOMATCH, ip, fin, m) & FR_ACCOUNT)) {
+ ATOMIC_INCL(frstats[1].fr_acct);
+ }
+ fin->fin_fr = NULL;
+ if (!fr || !(fr->fr_flags & FR_RETMASK))
+ (void) fr_checkstate(ip, fin);
+ (void) ip_natout(ip, fin);
+ } else
+ ip->ip_sum = 0;
+ /*
+ * If small enough for interface, can just send directly.
+ */
+ if (ip->ip_len <= ifp->if_mtu) {
+# if BSD >= 199306
+ int i = 0;
+
+ if ((m->m_flags & M_EXT) && MEXT_IS_REF(m))
+ i = 1;
+# endif
+# ifndef sparc
+# ifndef __FreeBSD__
+ ip->ip_id = htons(ip->ip_id);
+# endif
+ ip->ip_len = htons(ip->ip_len);
+ ip->ip_off = htons(ip->ip_off);
+# endif
+ if (!ip->ip_sum)
+ ip->ip_sum = in_cksum(m, hlen);
+# if BSD >= 199306
+ error = (*ifp->if_output)(ifp, m, (struct sockaddr *)dst,
+ ro->ro_rt);
+ if (i) {
+# ifndef __FreeBSD__
+ ip->ip_id = ntohs(ip->ip_id);
+# endif
+ ip->ip_len = ntohs(ip->ip_len);
+ ip->ip_off = ntohs(ip->ip_off);
+ }
+# else
+ error = (*ifp->if_output)(ifp, m, (struct sockaddr *)dst);
+# endif
+ goto done;
+ }
+ /*
+ * Too large for interface; fragment if possible.
+ * Must be able to put at least 8 bytes per fragment.
+ */
+ if (ip->ip_off & IP_DF) {
+ error = EMSGSIZE;
+ goto bad;
+ }
+ len = (ifp->if_mtu - hlen) &~ 7;
+ if (len < 8) {
+ error = EMSGSIZE;
+ goto bad;
+ }
+
+ {
+ int mhlen, firstlen = len;
+ struct mbuf **mnext = &m->m_act;
+
+ /*
+ * Loop through length of segment after first fragment,
+ * make new header and copy data of each part and link onto chain.
+ */
+ m0 = m;
+ mhlen = sizeof (struct ip);
+ for (off = hlen + len; off < ip->ip_len; off += len) {
+# ifdef MGETHDR
+ MGETHDR(m, M_DONTWAIT, MT_HEADER);
+# else
+ MGET(m, M_DONTWAIT, MT_HEADER);
+# endif
+ if (m == 0) {
+ error = ENOBUFS;
+ goto bad;
+ }
+# if BSD >= 199306
+ m->m_data += max_linkhdr;
+# else
+ m->m_off = MMAXOFF - hlen;
+# endif
+ mhip = mtod(m, struct ip *);
+ bcopy((char *)ip, (char *)mhip, sizeof(*ip));
+ if (hlen > sizeof (struct ip)) {
+ mhlen = ip_optcopy(ip, mhip) + sizeof (struct ip);
+ mhip->ip_hl = mhlen >> 2;
+ }
+ m->m_len = mhlen;
+ mhip->ip_off = ((off - hlen) >> 3) + (ip->ip_off & ~IP_MF);
+ if (ip->ip_off & IP_MF)
+ mhip->ip_off |= IP_MF;
+ if (off + len >= ip->ip_len)
+ len = ip->ip_len - off;
+ else
+ mhip->ip_off |= IP_MF;
+ mhip->ip_len = htons((u_short)(len + mhlen));
+ m->m_next = m_copy(m0, off, len);
+ if (m->m_next == 0) {
+ error = ENOBUFS; /* ??? */
+ goto sendorfree;
+ }
+# if BSD >= 199306
+ m->m_pkthdr.len = mhlen + len;
+ m->m_pkthdr.rcvif = NULL;
+# endif
+# ifndef sparc
+ mhip->ip_off = htons((u_short)mhip->ip_off);
+# endif
+ mhip->ip_sum = 0;
+ mhip->ip_sum = in_cksum(m, mhlen);
+ *mnext = m;
+ mnext = &m->m_act;
+ }
+ /*
+ * Update first fragment by trimming what's been copied out
+ * and updating header, then send each fragment (in order).
+ */
+ m_adj(m0, hlen + firstlen - ip->ip_len);
+ ip->ip_len = htons((u_short)(hlen + firstlen));
+ ip->ip_off = htons((u_short)(ip->ip_off | IP_MF));
+ ip->ip_sum = 0;
+ ip->ip_sum = in_cksum(m0, hlen);
+sendorfree:
+ for (m = m0; m; m = m0) {
+ m0 = m->m_act;
+ m->m_act = 0;
+ if (error == 0)
+# if BSD >= 199306
+ error = (*ifp->if_output)(ifp, m,
+ (struct sockaddr *)dst, ro->ro_rt);
+# else
+ error = (*ifp->if_output)(ifp, m,
+ (struct sockaddr *)dst);
+# endif
+ else
+ m_freem(m);
+ }
+ }
+done:
+ if (!error)
+ ipl_frouteok[0]++;
+ else
+ ipl_frouteok[1]++;
+
+ if (ro->ro_rt)
+ RTFREE(ro->ro_rt);
+ return 0;
+bad:
+ if (error == EMSGSIZE) {
+ sifp = fin->fin_ifp;
+ code = fin->fin_icode;
+ fin->fin_icode = ICMP_UNREACH_NEEDFRAG;
+ fin->fin_ifp = ifp;
+ (void) send_icmp_err(ip, ICMP_UNREACH, fin, 1);
+ fin->fin_ifp = sifp;
+ fin->fin_icode = code;
+ }
+ m_freem(m);
+ goto done;
+}
+
+
+int fr_verifysrc(ipa, ifp)
+struct in_addr ipa;
+void *ifp;
+{
+ struct sockaddr_in *dst;
+ struct route iproute;
+
+ bzero((char *)&iproute, sizeof(iproute));
+ dst = (struct sockaddr_in *)&iproute.ro_dst;
+ dst->sin_family = AF_INET;
+ dst->sin_addr = ipa;
+# if (BSD >= 199306) && !defined(__NetBSD__) && !defined(__bsdi__) && \
+ !defined(__OpenBSD__)
+# ifdef RTF_CLONING
+ rtalloc_ign(&iproute, RTF_CLONING);
+# else
+ rtalloc_ign(&iproute, RTF_PRCLONING);
+# endif
+# else
+ rtalloc(&iproute);
+# endif
+ if (iproute.ro_rt == NULL)
+ return 0;
+ return (ifp == iproute.ro_rt->rt_ifp);
+}
+
+#else /* #ifdef _KERNEL */
+
+
+# ifdef __sgi
+static int no_output __P((struct ifnet *ifp, struct mbuf *m,
+ struct sockaddr *s))
+# else
+static int no_output __P((struct ifnet *ifp, struct mbuf *m,
+ struct sockaddr *s, struct rtentry *rt))
+# endif
+{
+ return 0;
+}
+
+
+# ifdef __STDC__
+# ifdef __sgi
+static int write_output __P((struct ifnet *ifp, struct mbuf *m,
+ struct sockaddr *s))
+# else
+static int write_output __P((struct ifnet *ifp, struct mbuf *m,
+ struct sockaddr *s, struct rtentry *rt))
+# endif
+{
+ ip_t *ip = (ip_t *)m;
+# else
+static int write_output(ifp, ip)
+struct ifnet *ifp;
+ip_t *ip;
+{
+# endif
+ char fname[32];
+ int fd;
+
+# if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199606)) || \
+ (defined(OpenBSD) && (OpenBSD >= 199603))
+ sprintf(fname, "/tmp/%s", ifp->if_xname);
+# else
+ sprintf(fname, "/tmp/%s%d", ifp->if_name, ifp->if_unit);
+# endif
+ fd = open(fname, O_WRONLY|O_APPEND);
+ if (fd == -1) {
+ perror("open");
+ return -1;
+ }
+ write(fd, (char *)ip, ntohs(ip->ip_len));
+ close(fd);
+ return 0;
+}
+
+
+struct ifnet *get_unit(name, v)
+char *name;
+int v;
+{
+ struct ifnet *ifp, **ifa;
+# if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199606)) || \
+ (defined(OpenBSD) && (OpenBSD >= 199603))
+ for (ifa = ifneta; ifa && (ifp = *ifa); ifa++) {
+ if (!strcmp(name, ifp->if_xname))
+ return ifp;
+ }
+# else
+ char ifname[32], *s;
+
+ for (ifa = ifneta; ifa && (ifp = *ifa); ifa++) {
+ (void) sprintf(ifname, "%s%d", ifp->if_name, ifp->if_unit);
+ if (!strcmp(name, ifname))
+ return ifp;
+ }
+# endif
+
+ if (!ifneta) {
+ ifneta = (struct ifnet **)malloc(sizeof(ifp) * 2);
+ if (!ifneta)
+ return NULL;
+ ifneta[1] = NULL;
+ ifneta[0] = (struct ifnet *)calloc(1, sizeof(*ifp));
+ if (!ifneta[0]) {
+ free(ifneta);
+ return NULL;
+ }
+ nifs = 1;
+ } else {
+ nifs++;
+ ifneta = (struct ifnet **)realloc(ifneta,
+ (nifs + 1) * sizeof(*ifa));
+ if (!ifneta) {
+ nifs = 0;
+ return NULL;
+ }
+ ifneta[nifs] = NULL;
+ ifneta[nifs - 1] = (struct ifnet *)malloc(sizeof(*ifp));
+ if (!ifneta[nifs - 1]) {
+ nifs--;
+ return NULL;
+ }
+ }
+ ifp = ifneta[nifs - 1];
+
+# if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199606)) || \
+ (defined(OpenBSD) && (OpenBSD >= 199603))
+ strncpy(ifp->if_xname, name, sizeof(ifp->if_xname));
+# else
+ for (s = name; *s && !isdigit(*s); s++)
+ ;
+ if (*s && isdigit(*s)) {
+ ifp->if_unit = atoi(s);
+ ifp->if_name = (char *)malloc(s - name + 1);
+ strncpy(ifp->if_name, name, s - name);
+ ifp->if_name[s - name] = '\0';
+ } else {
+ ifp->if_name = strdup(name);
+ ifp->if_unit = -1;
+ }
+# endif
+ ifp->if_output = no_output;
+ return ifp;
+}
+
+
+
+void init_ifp()
+{
+ struct ifnet *ifp, **ifa;
+ char fname[32];
+ int fd;
+
+# if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199606)) || \
+ (defined(OpenBSD) && (OpenBSD >= 199603))
+ for (ifa = ifneta; ifa && (ifp = *ifa); ifa++) {
+ ifp->if_output = write_output;
+ sprintf(fname, "/tmp/%s", ifp->if_xname);
+ fd = open(fname, O_WRONLY|O_CREAT|O_EXCL|O_TRUNC, 0600);
+ if (fd == -1)
+ perror("open");
+ else
+ close(fd);
+ }
+# else
+
+ for (ifa = ifneta; ifa && (ifp = *ifa); ifa++) {
+ ifp->if_output = write_output;
+ sprintf(fname, "/tmp/%s%d", ifp->if_name, ifp->if_unit);
+ fd = open(fname, O_WRONLY|O_CREAT|O_EXCL|O_TRUNC, 0600);
+ if (fd == -1)
+ perror("open");
+ else
+ close(fd);
+ }
+# endif
+}
+
+
+int ipfr_fastroute(ip, fin, fdp)
+ip_t *ip;
+fr_info_t *fin;
+frdest_t *fdp;
+{
+ struct ifnet *ifp = fdp->fd_ifp;
+
+ if (!ifp)
+ return 0; /* no routing table out here */
+
+ ip->ip_len = htons((u_short)ip->ip_len);
+ ip->ip_off = htons((u_short)(ip->ip_off | IP_MF));
+ ip->ip_sum = 0;
+#ifdef __sgi
+ (*ifp->if_output)(ifp, (void *)ip, NULL);
+#else
+ (*ifp->if_output)(ifp, (void *)ip, NULL, 0);
+#endif
+ return 0;
+}
+
+
+int ipllog __P((void))
+{
+ verbose("l");
+ return 0;
+}
+
+
+int send_reset(ip, ifp)
+ip_t *ip;
+struct ifnet *ifp;
+{
+ verbose("- TCP RST sent\n");
+ return 0;
+}
+
+
+int icmp_error(ip, ifp)
+ip_t *ip;
+struct ifnet *ifp;
+{
+ verbose("- TCP RST sent\n");
+ return 0;
+}
+
+
+void frsync()
+{
+ return;
+}
+#endif /* _KERNEL */
diff --git a/sys/contrib/ipfilter/netinet/ip_fil.h b/sys/contrib/ipfilter/netinet/ip_fil.h
new file mode 100644
index 0000000..a960349
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_fil.h
@@ -0,0 +1,634 @@
+/*
+ * Copyright (C) 1993-2000 by Darren Reed.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and due credit is given
+ * to the original author and the contributors.
+ *
+ * @(#)ip_fil.h 1.35 6/5/96
+ * $Id: ip_fil.h,v 2.29.2.4 2000/11/12 11:54:53 darrenr Exp $
+ * $FreeBSD$
+ */
+
+#ifndef __IP_FIL_H__
+#define __IP_FIL_H__
+
+/*
+ * Pathnames for various IP Filter control devices. Used by LKM
+ * and userland, so defined here.
+ */
+#define IPNAT_NAME "/dev/ipnat"
+#define IPSTATE_NAME "/dev/ipstate"
+#define IPAUTH_NAME "/dev/ipauth"
+
+#ifndef SOLARIS
+# define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
+#endif
+
+#if defined(KERNEL) && !defined(_KERNEL)
+# define _KERNEL
+#endif
+
+#ifndef __P
+# ifdef __STDC__
+# define __P(x) x
+# else
+# define __P(x) ()
+# endif
+#endif
+
+#if defined(__STDC__) || defined(__GNUC__)
+# define SIOCADAFR _IOW('r', 60, struct frentry *)
+# define SIOCRMAFR _IOW('r', 61, struct frentry *)
+# define SIOCSETFF _IOW('r', 62, u_int)
+# define SIOCGETFF _IOR('r', 63, u_int)
+# define SIOCGETFS _IOWR('r', 64, struct friostat *)
+# define SIOCIPFFL _IOWR('r', 65, int)
+# define SIOCIPFFB _IOR('r', 66, int)
+# define SIOCADIFR _IOW('r', 67, struct frentry *)
+# define SIOCRMIFR _IOW('r', 68, struct frentry *)
+# define SIOCSWAPA _IOR('r', 69, u_int)
+# define SIOCINAFR _IOW('r', 70, struct frentry *)
+# define SIOCINIFR _IOW('r', 71, struct frentry *)
+# define SIOCFRENB _IOW('r', 72, u_int)
+# define SIOCFRSYN _IOW('r', 73, u_int)
+# define SIOCFRZST _IOWR('r', 74, struct friostat *)
+# define SIOCZRLST _IOWR('r', 75, struct frentry *)
+# define SIOCAUTHW _IOWR('r', 76, struct fr_info *)
+# define SIOCAUTHR _IOWR('r', 77, struct fr_info *)
+# define SIOCATHST _IOWR('r', 78, struct fr_authstat *)
+# define SIOCSTLCK _IOWR('r', 79, u_int)
+# define SIOCSTPUT _IOWR('r', 80, struct ipstate_save *)
+# define SIOCSTGET _IOWR('r', 81, struct ipstate_save *)
+# define SIOCSTGSZ _IOWR('r', 82, struct natget *)
+# define SIOCGFRST _IOWR('r', 83, struct ipfrstat *)
+#else
+# define SIOCADAFR _IOW(r, 60, struct frentry *)
+# define SIOCRMAFR _IOW(r, 61, struct frentry *)
+# define SIOCSETFF _IOW(r, 62, u_int)
+# define SIOCGETFF _IOR(r, 63, u_int)
+# define SIOCGETFS _IOWR(r, 64, struct friostat *)
+# define SIOCIPFFL _IOWR(r, 65, int)
+# define SIOCIPFFB _IOR(r, 66, int)
+# define SIOCADIFR _IOW(r, 67, struct frentry *)
+# define SIOCRMIFR _IOW(r, 68, struct frentry *)
+# define SIOCSWAPA _IOR(r, 69, u_int)
+# define SIOCINAFR _IOW(r, 70, struct frentry *)
+# define SIOCINIFR _IOW(r, 71, struct frentry *)
+# define SIOCFRENB _IOW(r, 72, u_int)
+# define SIOCFRSYN _IOW(r, 73, u_int)
+# define SIOCFRZST _IOWR(r, 74, struct friostat *)
+# define SIOCZRLST _IOWR(r, 75, struct frentry *)
+# define SIOCAUTHW _IOWR(r, 76, struct fr_info *)
+# define SIOCAUTHR _IOWR(r, 77, struct fr_info *)
+# define SIOCATHST _IOWR(r, 78, struct fr_authstat *)
+# define SIOCSTLCK _IOWR(r, 79, u_int)
+# define SIOCSTPUT _IOWR(r, 80, struct ipstate_save *)
+# define SIOCSTGET _IOWR(r, 81, struct ipstate_save *)
+# define SIOCSTGSZ _IOWR(r, 82, struct natget *)
+# define SIOCGFRST _IOWR(r, 83, struct ipfrstat *)
+#endif
+#define SIOCADDFR SIOCADAFR
+#define SIOCDELFR SIOCRMAFR
+#define SIOCINSFR SIOCINAFR
+
+
+typedef struct fr_ip {
+ u_32_t fi_v:4; /* IP version */
+ u_32_t fi_fl:4; /* packet flags */
+ u_32_t fi_tos:8; /* IP packet TOS */
+ u_32_t fi_ttl:8; /* IP packet TTL */
+ u_32_t fi_p:8; /* IP packet protocol */
+ union i6addr fi_src; /* source address from packet */
+ union i6addr fi_dst; /* destination address from packet */
+ u_32_t fi_optmsk; /* bitmask composed from IP options */
+ u_short fi_secmsk; /* bitmask composed from IP security options */
+ u_short fi_auth; /* authentication code from IP sec. options */
+} fr_ip_t;
+
+#define FI_OPTIONS (FF_OPTIONS >> 24)
+#define FI_TCPUDP (FF_TCPUDP >> 24) /* TCP/UCP implied comparison*/
+#define FI_FRAG (FF_FRAG >> 24)
+#define FI_SHORT (FF_SHORT >> 24)
+#define FI_CMP (FI_OPTIONS|FI_TCPUDP|FI_SHORT)
+
+#define fi_saddr fi_src.in4.s_addr
+#define fi_daddr fi_dst.in4.s_addr
+
+
+/*
+ * These are both used by the state and NAT code to indicate that one port or
+ * the other should be treated as a wildcard.
+ */
+#define FI_W_SPORT 0x00000100
+#define FI_W_DPORT 0x00000200
+#define FI_WILDP (FI_W_SPORT|FI_W_DPORT)
+#define FI_W_SADDR 0x00000400
+#define FI_W_DADDR 0x00000800
+#define FI_WILDA (FI_W_SADDR|FI_W_DADDR)
+#define FI_NEWFR 0x00001000
+
+typedef struct fr_info {
+ void *fin_ifp; /* interface packet is `on' */
+ struct fr_ip fin_fi; /* IP Packet summary */
+ u_short fin_data[2]; /* TCP/UDP ports, ICMP code/type */
+ u_char fin_out; /* in or out ? 1 == out, 0 == in */
+ u_char fin_rev; /* state only: 1 = reverse */
+ u_short fin_hlen; /* length of IP header in bytes */
+ u_char fin_tcpf; /* TCP header flags (SYN, ACK, etc) */
+ /* From here on is packet specific */
+ u_char fin_icode; /* ICMP error to return */
+ u_short fin_rule; /* rule # last matched */
+ u_32_t fin_group; /* group number, -1 for none */
+ struct frentry *fin_fr; /* last matching rule */
+ char *fin_dp; /* start of data past IP header */
+ u_short fin_dlen; /* length of data portion of packet */
+ u_short fin_id; /* IP packet id field */
+ void *fin_mp; /* pointer to pointer to mbuf */
+#if SOLARIS
+ void *fin_qfm; /* pointer to mblk where pkt starts */
+ void *fin_qif;
+#endif
+ u_short fin_plen;
+ u_short fin_off;
+} fr_info_t;
+
+#define fin_v fin_fi.fi_v
+
+/*
+ * Size for compares on fr_info structures
+ */
+#define FI_CSIZE offsetof(fr_info_t, fin_icode)
+
+/*
+ * Size for copying cache fr_info structure
+ */
+#define FI_COPYSIZE offsetof(fr_info_t, fin_dp)
+
+typedef struct frdest {
+ void *fd_ifp;
+ struct in_addr fd_ip;
+ char fd_ifname[IFNAMSIZ];
+} frdest_t;
+
+typedef struct frpcmp {
+ int frp_cmp; /* data for port comparisons */
+ u_short frp_port; /* top port for <> and >< */
+ u_short frp_top; /* top port for <> and >< */
+} frpcmp_t;
+
+typedef struct frtuc {
+ u_char ftu_tcpfm; /* tcp flags mask */
+ u_char ftu_tcpf; /* tcp flags */
+ frpcmp_t ftu_src;
+ frpcmp_t ftu_dst;
+} frtuc_t;
+
+#define ftu_scmp ftu_src.frp_cmp
+#define ftu_dcmp ftu_dst.frp_cmp
+#define ftu_sport ftu_src.frp_port
+#define ftu_dport ftu_dst.frp_port
+#define ftu_stop ftu_src.frp_top
+#define ftu_dtop ftu_dst.frp_top
+
+typedef struct frentry {
+ struct frentry *fr_next;
+ u_32_t fr_group; /* group to which this rule belongs */
+ u_32_t fr_grhead; /* group # which this rule starts */
+ struct frentry *fr_grp;
+ int fr_ref; /* reference count - for grouping */
+ void *fr_ifa;
+#if BSD >= 199306
+ void *fr_oifa;
+#endif
+ /*
+ * These are only incremented when a packet matches this rule and
+ * it is the last match
+ */
+ U_QUAD_T fr_hits;
+ U_QUAD_T fr_bytes;
+ /*
+ * Fields after this may not change whilst in the kernel.
+ */
+ struct fr_ip fr_ip;
+ struct fr_ip fr_mip; /* mask structure */
+
+
+ u_short fr_icmpm; /* data for ICMP packets (mask) */
+ u_short fr_icmp;
+
+ frtuc_t fr_tuc;
+ u_32_t fr_flags; /* per-rule flags && options (see below) */
+ u_int fr_skip; /* # of rules to skip */
+ u_int fr_loglevel; /* syslog log facility + priority */
+ int (*fr_func) __P((int, ip_t *, fr_info_t *)); /* call this function */
+ int fr_sap; /* For solaris only */
+ u_char fr_icode; /* return ICMP code */
+ char fr_ifname[IFNAMSIZ];
+#if BSD >= 199306
+ char fr_oifname[IFNAMSIZ];
+#endif
+ struct frdest fr_tif; /* "to" interface */
+ struct frdest fr_dif; /* duplicate packet interfaces */
+ u_int fr_cksum; /* checksum on filter rules for performance */
+} frentry_t;
+
+#define fr_v fr_ip.fi_v
+#define fr_proto fr_ip.fi_p
+#define fr_ttl fr_ip.fi_ttl
+#define fr_tos fr_ip.fi_tos
+#define fr_tcpfm fr_tuc.ftu_tcpfm
+#define fr_tcpf fr_tuc.ftu_tcpf
+#define fr_scmp fr_tuc.ftu_scmp
+#define fr_dcmp fr_tuc.ftu_dcmp
+#define fr_dport fr_tuc.ftu_dport
+#define fr_sport fr_tuc.ftu_sport
+#define fr_stop fr_tuc.ftu_stop
+#define fr_dtop fr_tuc.ftu_dtop
+#define fr_dst fr_ip.fi_dst.in4
+#define fr_src fr_ip.fi_src.in4
+#define fr_dmsk fr_mip.fi_dst.in4
+#define fr_smsk fr_mip.fi_src.in4
+
+#ifndef offsetof
+#define offsetof(t,m) (int)((&((t *)0L)->m))
+#endif
+#define FR_CMPSIZ (sizeof(struct frentry) - offsetof(frentry_t, fr_ip))
+
+/*
+ * fr_flags
+ */
+#define FR_BLOCK 0x00001 /* do not allow packet to pass */
+#define FR_PASS 0x00002 /* allow packet to pass */
+#define FR_OUTQUE 0x00004 /* outgoing packets */
+#define FR_INQUE 0x00008 /* ingoing packets */
+#define FR_LOG 0x00010 /* Log */
+#define FR_LOGB 0x00011 /* Log-fail */
+#define FR_LOGP 0x00012 /* Log-pass */
+#define FR_LOGBODY 0x00020 /* Log the body */
+#define FR_LOGFIRST 0x00040 /* Log the first byte if state held */
+#define FR_RETRST 0x00080 /* Return TCP RST packet - reset connection */
+#define FR_RETICMP 0x00100 /* Return ICMP unreachable packet */
+#define FR_FAKEICMP 0x00180 /* Return ICMP unreachable with fake source */
+#define FR_NOMATCH 0x00200 /* no match occured */
+#define FR_ACCOUNT 0x00400 /* count packet bytes */
+#define FR_KEEPFRAG 0x00800 /* keep fragment information */
+#define FR_KEEPSTATE 0x01000 /* keep `connection' state information */
+#define FR_INACTIVE 0x02000
+#define FR_QUICK 0x04000 /* match & stop processing list */
+#define FR_FASTROUTE 0x08000 /* bypass normal routing */
+#define FR_CALLNOW 0x10000 /* call another function (fr_func) if matches */
+#define FR_DUP 0x20000 /* duplicate packet */
+#define FR_LOGORBLOCK 0x40000 /* block the packet if it can't be logged */
+#define FR_NOTSRCIP 0x80000 /* not the src IP# */
+#define FR_NOTDSTIP 0x100000 /* not the dst IP# */
+#define FR_AUTH 0x200000 /* use authentication */
+#define FR_PREAUTH 0x400000 /* require preauthentication */
+#define FR_DONTCACHE 0x800000 /* don't cache the result */
+
+#define FR_LOGMASK (FR_LOG|FR_LOGP|FR_LOGB)
+#define FR_RETMASK (FR_RETICMP|FR_RETRST|FR_FAKEICMP)
+
+/*
+ * These correspond to #define's for FI_* and are stored in fr_flags
+ */
+#define FF_OPTIONS 0x01000000
+#define FF_TCPUDP 0x02000000
+#define FF_FRAG 0x04000000
+#define FF_SHORT 0x08000000
+/*
+ * recognized flags for SIOCGETFF and SIOCSETFF, and get put in fr_flags
+ */
+#define FF_LOGPASS 0x10000000
+#define FF_LOGBLOCK 0x20000000
+#define FF_LOGNOMATCH 0x40000000
+#define FF_LOGGING (FF_LOGPASS|FF_LOGBLOCK|FF_LOGNOMATCH)
+#define FF_BLOCKNONIP 0x80000000 /* Solaris2 Only */
+
+#define FR_NONE 0
+#define FR_EQUAL 1
+#define FR_NEQUAL 2
+#define FR_LESST 3
+#define FR_GREATERT 4
+#define FR_LESSTE 5
+#define FR_GREATERTE 6
+#define FR_OUTRANGE 7
+#define FR_INRANGE 8
+
+typedef struct filterstats {
+ u_long fr_pass; /* packets allowed */
+ u_long fr_block; /* packets denied */
+ u_long fr_nom; /* packets which don't match any rule */
+ u_long fr_short; /* packets which are short */
+ u_long fr_ppkl; /* packets allowed and logged */
+ u_long fr_bpkl; /* packets denied and logged */
+ u_long fr_npkl; /* packets unmatched and logged */
+ u_long fr_pkl; /* packets logged */
+ u_long fr_skip; /* packets to be logged but buffer full */
+ u_long fr_ret; /* packets for which a return is sent */
+ u_long fr_acct; /* packets for which counting was performed */
+ u_long fr_bnfr; /* bad attempts to allocate fragment state */
+ u_long fr_nfr; /* new fragment state kept */
+ u_long fr_cfr; /* add new fragment state but complete pkt */
+ u_long fr_bads; /* bad attempts to allocate packet state */
+ u_long fr_ads; /* new packet state kept */
+ u_long fr_chit; /* cached hit */
+ u_long fr_tcpbad; /* TCP checksum check failures */
+ u_long fr_pull[2]; /* good and bad pullup attempts */
+ u_long fr_badsrc; /* source received doesn't match route */
+ u_long fr_badttl; /* TTL in packet doesn't reach minimum */
+#if SOLARIS
+ u_long fr_notdata; /* PROTO/PCPROTO that have no data */
+ u_long fr_nodata; /* mblks that have no data */
+ u_long fr_bad; /* bad IP packets to the filter */
+ u_long fr_notip; /* packets passed through no on ip queue */
+ u_long fr_drop; /* packets dropped - no info for them! */
+ u_long fr_copy; /* messages copied due to db_ref > 1 */
+#endif
+ u_long fr_ipv6[2]; /* IPv6 packets in/out */
+} filterstats_t;
+
+/*
+ * For SIOCGETFS
+ */
+typedef struct friostat {
+ struct filterstats f_st[2];
+ struct frentry *f_fin[2];
+ struct frentry *f_fout[2];
+ struct frentry *f_acctin[2];
+ struct frentry *f_acctout[2];
+ struct frentry *f_fin6[2];
+ struct frentry *f_fout6[2];
+ struct frentry *f_acctin6[2];
+ struct frentry *f_acctout6[2];
+ struct frentry *f_auth;
+ struct frgroup *f_groups[3][2];
+ u_long f_froute[2];
+ int f_defpass; /* default pass - from fr_pass */
+ char f_active; /* 1 or 0 - active rule set */
+ char f_running; /* 1 if running, else 0 */
+ char f_logging; /* 1 if enabled, else 0 */
+ char f_version[32]; /* version string */
+ int f_locks[4];
+} friostat_t;
+
+typedef struct optlist {
+ u_short ol_val;
+ int ol_bit;
+} optlist_t;
+
+
+/*
+ * Group list structure.
+ */
+typedef struct frgroup {
+ u_32_t fg_num;
+ struct frgroup *fg_next;
+ struct frentry *fg_head;
+ struct frentry **fg_start;
+} frgroup_t;
+
+
+/*
+ * Log structure. Each packet header logged is prepended by one of these.
+ * Following this in the log records read from the device will be an ipflog
+ * structure which is then followed by any packet data.
+ */
+typedef struct iplog {
+ u_32_t ipl_magic;
+ u_int ipl_count;
+ u_long ipl_sec;
+ u_long ipl_usec;
+ size_t ipl_dsize;
+ struct iplog *ipl_next;
+} iplog_t;
+
+#define IPL_MAGIC 0x49504c4d /* 'IPLM' */
+
+typedef struct ipflog {
+#if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199603)) || \
+ (defined(OpenBSD) && (OpenBSD >= 199603))
+ u_char fl_ifname[IFNAMSIZ];
+#else
+ u_int fl_unit;
+ u_char fl_ifname[4];
+#endif
+ u_char fl_plen; /* extra data after hlen */
+ u_char fl_hlen; /* length of IP headers saved */
+ u_short fl_loglevel; /* syslog log level */
+ u_32_t fl_rule;
+ u_32_t fl_group;
+ u_32_t fl_flags;
+ u_32_t fl_lflags;
+} ipflog_t;
+
+
+#ifndef ICMP_UNREACH_FILTER
+# define ICMP_UNREACH_FILTER 13
+#endif
+
+#ifndef IPF_LOGGING
+# define IPF_LOGGING 0
+#endif
+#ifndef IPF_DEFAULT_PASS
+# define IPF_DEFAULT_PASS FR_PASS
+#endif
+
+#define IPMINLEN(i, h) ((i)->ip_len >= ((i)->ip_hl * 4 + sizeof(struct h)))
+#define IPLLOGSIZE 8192
+
+/*
+ * Device filenames for reading log information. Use ipf on Solaris2 because
+ * ipl is already a name used by something else.
+ */
+#ifndef IPL_NAME
+# if SOLARIS
+# define IPL_NAME "/dev/ipf"
+# else
+# define IPL_NAME "/dev/ipl"
+# endif
+#endif
+#define IPL_NAT IPNAT_NAME
+#define IPL_STATE IPSTATE_NAME
+#define IPL_AUTH IPAUTH_NAME
+
+#define IPL_LOGIPF 0 /* Minor device #'s for accessing logs */
+#define IPL_LOGNAT 1
+#define IPL_LOGSTATE 2
+#define IPL_LOGAUTH 3
+#define IPL_LOGMAX 3
+
+#if !defined(CDEV_MAJOR) && defined (__FreeBSD_version) && \
+ (__FreeBSD_version >= 220000)
+# define CDEV_MAJOR 79
+#endif
+
+/*
+ * Post NetBSD 1.2 has the PFIL interface for packet filters. This turns
+ * on those hooks. We don't need any special mods in non-IP Filter code
+ * with this!
+ */
+#if (defined(NetBSD) && (NetBSD > 199609) && (NetBSD <= 1991011)) || \
+ (defined(NetBSD1_2) && NetBSD1_2 > 1) || (defined(__FreeBSD_version) && \
+ (__FreeBSD_version >= 500011))
+# if (NetBSD >= 199905)
+# define PFIL_HOOKS
+# endif
+# ifdef PFIL_HOOKS
+# define NETBSD_PF
+# endif
+#endif
+
+
+#ifndef _KERNEL
+struct ifnet;
+extern int fr_check __P((ip_t *, int, void *, int, mb_t **));
+extern int (*fr_checkp) __P((ip_t *, int, void *, int, mb_t **));
+extern int send_reset __P((ip_t *, struct ifnet *));
+extern int icmp_error __P((ip_t *, struct ifnet *));
+extern int ipf_log __P((void));
+extern int ipfr_fastroute __P((ip_t *, fr_info_t *, frdest_t *));
+extern struct ifnet *get_unit __P((char *, int));
+# if defined(__NetBSD__) || defined(__OpenBSD__) || \
+ (_BSDI_VERSION >= 199701) || (__FreeBSD_version >= 300000)
+extern int iplioctl __P((dev_t, u_long, caddr_t, int));
+# else
+extern int iplioctl __P((dev_t, int, caddr_t, int));
+# endif
+extern int iplopen __P((dev_t, int));
+extern int iplclose __P((dev_t, int));
+#else /* #ifndef _KERNEL */
+# if defined(__NetBSD__) && defined(PFIL_HOOKS)
+extern void ipfilterattach __P((int));
+# endif
+extern int iplattach __P((void));
+extern int ipl_enable __P((void));
+extern int ipl_disable __P((void));
+extern void ipflog_init __P((void));
+extern int ipflog_clear __P((minor_t));
+extern int ipflog_read __P((minor_t, struct uio *));
+extern int ipflog __P((u_int, ip_t *, fr_info_t *, mb_t *));
+extern int ipllog __P((int, fr_info_t *, void **, size_t *, int *, int));
+extern int send_icmp_err __P((ip_t *, int, fr_info_t *, int));
+extern int send_reset __P((ip_t *, fr_info_t *));
+# if SOLARIS
+extern int fr_check __P((ip_t *, int, void *, int, qif_t *, mb_t **));
+extern int (*fr_checkp) __P((ip_t *, int, void *,
+ int, qif_t *, mb_t **));
+# if SOLARIS2 >= 7
+extern int iplioctl __P((dev_t, int, intptr_t, int, cred_t *, int *));
+# else
+extern int iplioctl __P((dev_t, int, int *, int, cred_t *, int *));
+# endif
+extern int iplopen __P((dev_t *, int, int, cred_t *));
+extern int iplclose __P((dev_t, int, int, cred_t *));
+extern int ipfsync __P((void));
+extern int ipfr_fastroute __P((ip_t *, mblk_t *, mblk_t **,
+ fr_info_t *, frdest_t *));
+extern void copyin_mblk __P((mblk_t *, size_t, size_t, char *));
+extern void copyout_mblk __P((mblk_t *, size_t, size_t, char *));
+extern int fr_qin __P((queue_t *, mblk_t *));
+extern int fr_qout __P((queue_t *, mblk_t *));
+extern int iplread __P((dev_t, struct uio *, cred_t *));
+# else /* SOLARIS */
+extern int fr_check __P((ip_t *, int, void *, int, mb_t **));
+extern int (*fr_checkp) __P((ip_t *, int, void *, int, mb_t **));
+extern int ipfr_fastroute __P((mb_t *, fr_info_t *, frdest_t *));
+extern size_t mbufchainlen __P((mb_t *));
+# ifdef __sgi
+# include <sys/cred.h>
+extern int iplioctl __P((dev_t, int, caddr_t, int, cred_t *, int *));
+extern int iplopen __P((dev_t *, int, int, cred_t *));
+extern int iplclose __P((dev_t, int, int, cred_t *));
+extern int iplread __P((dev_t, struct uio *, cred_t *));
+extern int ipfsync __P((void));
+extern int ipfilter_sgi_attach __P((void));
+extern void ipfilter_sgi_detach __P((void));
+extern void ipfilter_sgi_intfsync __P((void));
+# else
+# ifdef IPFILTER_LKM
+extern int iplidentify __P((char *));
+# endif
+# if (_BSDI_VERSION >= 199510) || (__FreeBSD_version >= 220000) || \
+ (NetBSD >= 199511) || defined(__OpenBSD__)
+# if defined(__NetBSD__) || (_BSDI_VERSION >= 199701) || \
+ defined(__OpenBSD__) || (__FreeBSD_version >= 300000)
+extern int iplioctl __P((dev_t, u_long, caddr_t, int, struct proc *));
+# else
+extern int iplioctl __P((dev_t, int, caddr_t, int, struct proc *));
+# endif
+extern int iplopen __P((dev_t, int, int, struct proc *));
+extern int iplclose __P((dev_t, int, int, struct proc *));
+# else
+# ifndef linux
+extern int iplopen __P((dev_t, int));
+extern int iplclose __P((dev_t, int));
+extern int iplioctl __P((dev_t, int, caddr_t, int));
+# else
+extern int iplioctl(struct inode *, struct file *, u_int, u_long);
+extern int iplopen __P((struct inode *, struct file *));
+extern void iplclose __P((struct inode *, struct file *));
+# endif /* !linux */
+# endif /* (_BSDI_VERSION >= 199510) */
+# if BSD >= 199306
+extern int iplread __P((dev_t, struct uio *, int));
+# else
+# ifndef linux
+extern int iplread __P((dev_t, struct uio *));
+# else
+extern int iplread(struct inode *, struct file *, char *, int);
+# endif /* !linux */
+# endif /* BSD >= 199306 */
+# endif /* __ sgi */
+# endif /* SOLARIS */
+#endif /* #ifndef _KERNEL */
+
+extern char *memstr __P((char *, char *, int, int));
+extern void fixskip __P((frentry_t **, frentry_t *, int));
+extern int countbits __P((u_32_t));
+extern int ipldetach __P((void));
+extern u_short ipf_cksum __P((u_short *, int));
+extern int ircopyptr __P((void *, void *, size_t));
+extern int iwcopyptr __P((void *, void *, size_t));
+
+extern int frflush __P((minor_t, int));
+extern void frsync __P((void));
+extern frgroup_t *fr_addgroup __P((u_32_t, frentry_t *, minor_t, int));
+extern void fr_delgroup __P((u_32_t, u_32_t, minor_t, int));
+extern frgroup_t *fr_findgroup __P((u_32_t, u_32_t, minor_t, int,
+ frgroup_t ***));
+
+extern int fr_copytolog __P((int, char *, int));
+extern void fr_forgetifp __P((void *));
+extern void fr_getstat __P((struct friostat *));
+extern int fr_ifpaddr __P((int, void *, struct in_addr *));
+extern int fr_lock __P((caddr_t, int *));
+extern void fr_makefrip __P((int, ip_t *, fr_info_t *));
+extern u_short fr_tcpsum __P((mb_t *, ip_t *, tcphdr_t *));
+extern int fr_scanlist __P((u_32_t, ip_t *, fr_info_t *, void *));
+extern int fr_tcpudpchk __P((frtuc_t *, fr_info_t *));
+extern int fr_verifysrc __P((struct in_addr, void *));
+
+extern int ipl_unreach;
+extern int fr_running;
+extern u_long ipl_frouteok[2];
+extern int fr_pass;
+extern int fr_flags;
+extern int fr_active;
+extern int fr_chksrc;
+extern int fr_minttl;
+extern int fr_minttllog;
+extern fr_info_t frcache[2];
+extern char ipfilter_version[];
+extern iplog_t **iplh[IPL_LOGMAX+1], *iplt[IPL_LOGMAX+1];
+extern size_t iplused[IPL_LOGMAX + 1];
+extern struct frentry *ipfilter[2][2], *ipacct[2][2];
+#ifdef USE_INET6
+extern struct frentry *ipfilter6[2][2], *ipacct6[2][2];
+extern int icmptoicmp6types[ICMP_MAXTYPE+1];
+extern int icmptoicmp6unreach[ICMP_MAX_UNREACH];
+#endif
+extern struct frgroup *ipfgroups[3][2];
+extern struct filterstats frstats[];
+
+#endif /* __IP_FIL_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_frag.c b/sys/contrib/ipfilter/netinet/ip_frag.c
new file mode 100644
index 0000000..f5548fc
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_frag.c
@@ -0,0 +1,576 @@
+/*
+ * Copyright (C) 1993-2000 by Darren Reed.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and due credit is given
+ * to the original author and the contributors.
+ */
+#if !defined(lint)
+static const char sccsid[] = "@(#)ip_frag.c 1.11 3/24/96 (C) 1993-1995 Darren Reed";
+static const char rcsid[] = "@(#)$FreeBSD$";
+#endif
+
+#if defined(KERNEL) && !defined(_KERNEL)
+# define _KERNEL
+#endif
+
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/file.h>
+#if !defined(_KERNEL) && !defined(KERNEL)
+# include <stdio.h>
+# include <string.h>
+# include <stdlib.h>
+#endif
+#if (defined(KERNEL) || defined(_KERNEL)) && (__FreeBSD_version >= 220000)
+# include <sys/filio.h>
+# include <sys/fcntl.h>
+#else
+# include <sys/ioctl.h>
+#endif
+#include <sys/uio.h>
+#ifndef linux
+# include <sys/protosw.h>
+#endif
+#include <sys/socket.h>
+#if defined(_KERNEL) && !defined(linux)
+# include <sys/systm.h>
+#endif
+#if !defined(__SVR4) && !defined(__svr4__)
+# if defined(_KERNEL) && !defined(__sgi)
+# include <sys/kernel.h>
+# endif
+# ifndef linux
+# include <sys/mbuf.h>
+# endif
+#else
+# include <sys/byteorder.h>
+# ifdef _KERNEL
+# include <sys/dditypes.h>
+# endif
+# include <sys/stream.h>
+# include <sys/kmem.h>
+#endif
+#include <net/if.h>
+#ifdef sun
+# include <net/af.h>
+#endif
+#include <net/route.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#ifndef linux
+# include <netinet/ip_var.h>
+#endif
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+#include <netinet/ip_icmp.h>
+#include "netinet/ip_compat.h"
+#include <netinet/tcpip.h>
+#include "netinet/ip_fil.h"
+#include "netinet/ip_proxy.h"
+#include "netinet/ip_nat.h"
+#include "netinet/ip_frag.h"
+#include "netinet/ip_state.h"
+#include "netinet/ip_auth.h"
+#if (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+# if (defined(KERNEL) || defined(_KERNEL))
+# ifndef IPFILTER_LKM
+# include <sys/libkern.h>
+# include <sys/systm.h>
+# endif
+extern struct callout_handle ipfr_slowtimer_ch;
+# endif
+#endif
+#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104230000)
+# include <sys/callout.h>
+extern struct callout ipfr_slowtimer_ch;
+#endif
+
+
+static ipfr_t *ipfr_heads[IPFT_SIZE];
+static ipfr_t *ipfr_nattab[IPFT_SIZE];
+static ipfrstat_t ipfr_stats;
+static int ipfr_inuse = 0;
+
+int fr_ipfrttl = 120; /* 60 seconds */
+int fr_frag_lock = 0;
+
+#ifdef _KERNEL
+# if SOLARIS2 >= 7
+extern timeout_id_t ipfr_timer_id;
+# else
+extern int ipfr_timer_id;
+# endif
+#endif
+#if (SOLARIS || defined(__sgi)) && defined(_KERNEL)
+extern KRWLOCK_T ipf_frag, ipf_natfrag, ipf_nat, ipf_mutex;
+# if SOLARIS
+extern KRWLOCK_T ipf_solaris;
+# else
+KRWLOCK_T ipf_solaris;
+# endif
+extern kmutex_t ipf_rw;
+#endif
+
+
+static ipfr_t *ipfr_new __P((ip_t *, fr_info_t *, u_int, ipfr_t **));
+static ipfr_t *ipfr_lookup __P((ip_t *, fr_info_t *, ipfr_t **));
+static void ipfr_delete __P((ipfr_t *));
+
+
+ipfrstat_t *ipfr_fragstats()
+{
+ ipfr_stats.ifs_table = ipfr_heads;
+ ipfr_stats.ifs_nattab = ipfr_nattab;
+ ipfr_stats.ifs_inuse = ipfr_inuse;
+ return &ipfr_stats;
+}
+
+
+/*
+ * add a new entry to the fragment cache, registering it as having come
+ * through this box, with the result of the filter operation.
+ */
+static ipfr_t *ipfr_new(ip, fin, pass, table)
+ip_t *ip;
+fr_info_t *fin;
+u_int pass;
+ipfr_t *table[];
+{
+ ipfr_t **fp, *fra, frag;
+ u_int idx, off;
+
+ if (ipfr_inuse >= IPFT_SIZE)
+ return NULL;
+
+ if (!(fin->fin_fi.fi_fl & FI_FRAG))
+ return NULL;
+
+ frag.ipfr_p = ip->ip_p;
+ idx = ip->ip_p;
+ frag.ipfr_id = ip->ip_id;
+ idx += ip->ip_id;
+ frag.ipfr_tos = ip->ip_tos;
+ frag.ipfr_src.s_addr = ip->ip_src.s_addr;
+ idx += ip->ip_src.s_addr;
+ frag.ipfr_dst.s_addr = ip->ip_dst.s_addr;
+ idx += ip->ip_dst.s_addr;
+ frag.ipfr_ifp = fin->fin_ifp;
+ idx *= 127;
+ idx %= IPFT_SIZE;
+
+ /*
+ * first, make sure it isn't already there...
+ */
+ for (fp = &table[idx]; (fra = *fp); fp = &fra->ipfr_next)
+ if (!bcmp((char *)&frag.ipfr_src, (char *)&fra->ipfr_src,
+ IPFR_CMPSZ)) {
+ ATOMIC_INCL(ipfr_stats.ifs_exists);
+ return NULL;
+ }
+
+ /*
+ * allocate some memory, if possible, if not, just record that we
+ * failed to do so.
+ */
+ KMALLOC(fra, ipfr_t *);
+ if (fra == NULL) {
+ ATOMIC_INCL(ipfr_stats.ifs_nomem);
+ return NULL;
+ }
+
+ if ((fra->ipfr_rule = fin->fin_fr) != NULL) {
+ ATOMIC_INC32(fin->fin_fr->fr_ref);
+ }
+
+
+ /*
+ * Instert the fragment into the fragment table, copy the struct used
+ * in the search using bcopy rather than reassign each field.
+ * Set the ttl to the default and mask out logging from "pass"
+ */
+ if ((fra->ipfr_next = table[idx]))
+ table[idx]->ipfr_prev = fra;
+ fra->ipfr_prev = NULL;
+ fra->ipfr_data = NULL;
+ table[idx] = fra;
+ bcopy((char *)&frag.ipfr_src, (char *)&fra->ipfr_src, IPFR_CMPSZ);
+ fra->ipfr_ttl = fr_ipfrttl;
+ /*
+ * Compute the offset of the expected start of the next packet.
+ */
+ off = ip->ip_off & IP_OFFMASK;
+ if (!off)
+ fra->ipfr_seen0 = 1;
+ fra->ipfr_off = off + (fin->fin_dlen >> 3);
+ ATOMIC_INCL(ipfr_stats.ifs_new);
+ ATOMIC_INC32(ipfr_inuse);
+ return fra;
+}
+
+
+int ipfr_newfrag(ip, fin, pass)
+ip_t *ip;
+fr_info_t *fin;
+u_int pass;
+{
+ ipfr_t *ipf;
+
+ if ((ip->ip_v != 4) || (fr_frag_lock))
+ return -1;
+ WRITE_ENTER(&ipf_frag);
+ ipf = ipfr_new(ip, fin, pass, ipfr_heads);
+ RWLOCK_EXIT(&ipf_frag);
+ return ipf ? 0 : -1;
+}
+
+
+int ipfr_nat_newfrag(ip, fin, pass, nat)
+ip_t *ip;
+fr_info_t *fin;
+u_int pass;
+nat_t *nat;
+{
+ ipfr_t *ipf;
+
+ if ((ip->ip_v != 4) || (fr_frag_lock))
+ return -1;
+ WRITE_ENTER(&ipf_natfrag);
+ ipf = ipfr_new(ip, fin, pass, ipfr_nattab);
+ if (ipf != NULL) {
+ ipf->ipfr_data = nat;
+ nat->nat_data = ipf;
+ }
+ RWLOCK_EXIT(&ipf_natfrag);
+ return ipf ? 0 : -1;
+}
+
+
+/*
+ * check the fragment cache to see if there is already a record of this packet
+ * with its filter result known.
+ */
+static ipfr_t *ipfr_lookup(ip, fin, table)
+ip_t *ip;
+fr_info_t *fin;
+ipfr_t *table[];
+{
+ ipfr_t *f, frag;
+ u_int idx;
+
+ if (!(fin->fin_fi.fi_fl & FI_FRAG))
+ return NULL;
+
+ /*
+ * For fragments, we record protocol, packet id, TOS and both IP#'s
+ * (these should all be the same for all fragments of a packet).
+ *
+ * build up a hash value to index the table with.
+ */
+ frag.ipfr_p = ip->ip_p;
+ idx = ip->ip_p;
+ frag.ipfr_id = ip->ip_id;
+ idx += ip->ip_id;
+ frag.ipfr_tos = ip->ip_tos;
+ frag.ipfr_src.s_addr = ip->ip_src.s_addr;
+ idx += ip->ip_src.s_addr;
+ frag.ipfr_dst.s_addr = ip->ip_dst.s_addr;
+ idx += ip->ip_dst.s_addr;
+ frag.ipfr_ifp = fin->fin_ifp;
+ idx *= 127;
+ idx %= IPFT_SIZE;
+
+ /*
+ * check the table, careful to only compare the right amount of data
+ */
+ for (f = table[idx]; f; f = f->ipfr_next)
+ if (!bcmp((char *)&frag.ipfr_src, (char *)&f->ipfr_src,
+ IPFR_CMPSZ)) {
+ u_short atoff, off;
+
+ /*
+ * XXX - We really need to be guarding against the
+ * retransmission of (src,dst,id,offset-range) here
+ * because a fragmented packet is never resent with
+ * the same IP ID#.
+ */
+ off = ip->ip_off & IP_OFFMASK;
+ if (f->ipfr_seen0) {
+ if (!off || (fin->fin_fi.fi_fl & FI_SHORT))
+ continue;
+ } else if (!off)
+ f->ipfr_seen0 = 1;
+
+ if (f != table[idx]) {
+ /*
+ * move fragment info. to the top of the list
+ * to speed up searches.
+ */
+ if ((f->ipfr_prev->ipfr_next = f->ipfr_next))
+ f->ipfr_next->ipfr_prev = f->ipfr_prev;
+ f->ipfr_next = table[idx];
+ table[idx]->ipfr_prev = f;
+ f->ipfr_prev = NULL;
+ table[idx] = f;
+ }
+ atoff = off + (fin->fin_dlen >> 3);
+ /*
+ * If we've follwed the fragments, and this is the
+ * last (in order), shrink expiration time.
+ */
+ if (off == f->ipfr_off) {
+ if (!(ip->ip_off & IP_MF))
+ f->ipfr_ttl = 1;
+ else
+ f->ipfr_off = atoff;
+ }
+ ATOMIC_INCL(ipfr_stats.ifs_hits);
+ return f;
+ }
+ return NULL;
+}
+
+
+/*
+ * functional interface for NAT lookups of the NAT fragment cache
+ */
+nat_t *ipfr_nat_knownfrag(ip, fin)
+ip_t *ip;
+fr_info_t *fin;
+{
+ nat_t *nat;
+ ipfr_t *ipf;
+
+ if ((ip->ip_v != 4) || (fr_frag_lock))
+ return NULL;
+ READ_ENTER(&ipf_natfrag);
+ ipf = ipfr_lookup(ip, fin, ipfr_nattab);
+ if (ipf != NULL) {
+ nat = ipf->ipfr_data;
+ /*
+ * This is the last fragment for this packet.
+ */
+ if ((ipf->ipfr_ttl == 1) && (nat != NULL)) {
+ nat->nat_data = NULL;
+ ipf->ipfr_data = NULL;
+ }
+ } else
+ nat = NULL;
+ RWLOCK_EXIT(&ipf_natfrag);
+ return nat;
+}
+
+
+/*
+ * functional interface for normal lookups of the fragment cache
+ */
+frentry_t *ipfr_knownfrag(ip, fin)
+ip_t *ip;
+fr_info_t *fin;
+{
+ frentry_t *fr = NULL;
+ ipfr_t *fra;
+
+ if ((ip->ip_v != 4) || (fr_frag_lock))
+ return NULL;
+ READ_ENTER(&ipf_frag);
+ fra = ipfr_lookup(ip, fin, ipfr_heads);
+ if (fra != NULL)
+ fr = fra->ipfr_rule;
+ RWLOCK_EXIT(&ipf_frag);
+ return fr;
+}
+
+
+/*
+ * forget any references to this external object.
+ */
+void ipfr_forget(nat)
+void *nat;
+{
+ ipfr_t *fr;
+ int idx;
+
+ WRITE_ENTER(&ipf_natfrag);
+ for (idx = IPFT_SIZE - 1; idx >= 0; idx--)
+ for (fr = ipfr_heads[idx]; fr; fr = fr->ipfr_next)
+ if (fr->ipfr_data == nat)
+ fr->ipfr_data = NULL;
+
+ RWLOCK_EXIT(&ipf_natfrag);
+}
+
+
+static void ipfr_delete(fra)
+ipfr_t *fra;
+{
+ frentry_t *fr;
+
+ fr = fra->ipfr_rule;
+ if (fr != NULL) {
+ ATOMIC_DEC32(fr->fr_ref);
+ if (fr->fr_ref == 0)
+ KFREE(fr);
+ }
+ if (fra->ipfr_prev)
+ fra->ipfr_prev->ipfr_next = fra->ipfr_next;
+ if (fra->ipfr_next)
+ fra->ipfr_next->ipfr_prev = fra->ipfr_prev;
+ KFREE(fra);
+}
+
+
+/*
+ * Free memory in use by fragment state info. kept.
+ */
+void ipfr_unload()
+{
+ ipfr_t **fp, *fra;
+ nat_t *nat;
+ int idx;
+
+ WRITE_ENTER(&ipf_frag);
+ for (idx = IPFT_SIZE - 1; idx >= 0; idx--)
+ for (fp = &ipfr_heads[idx]; (fra = *fp); ) {
+ *fp = fra->ipfr_next;
+ ipfr_delete(fra);
+ }
+ RWLOCK_EXIT(&ipf_frag);
+
+ WRITE_ENTER(&ipf_nat);
+ WRITE_ENTER(&ipf_natfrag);
+ for (idx = IPFT_SIZE - 1; idx >= 0; idx--)
+ for (fp = &ipfr_nattab[idx]; (fra = *fp); ) {
+ *fp = fra->ipfr_next;
+ nat = fra->ipfr_data;
+ if (nat != NULL) {
+ if (nat->nat_data == fra)
+ nat->nat_data = NULL;
+ }
+ ipfr_delete(fra);
+ }
+ RWLOCK_EXIT(&ipf_natfrag);
+ RWLOCK_EXIT(&ipf_nat);
+}
+
+
+#ifdef _KERNEL
+void ipfr_fragexpire()
+{
+ ipfr_t **fp, *fra;
+ nat_t *nat;
+ int idx;
+#if defined(_KERNEL)
+# if !SOLARIS
+ int s;
+# endif
+#endif
+
+ if (fr_frag_lock)
+ return;
+
+ SPL_NET(s);
+ WRITE_ENTER(&ipf_frag);
+
+ /*
+ * Go through the entire table, looking for entries to expire,
+ * decreasing the ttl by one for each entry. If it reaches 0,
+ * remove it from the chain and free it.
+ */
+ for (idx = IPFT_SIZE - 1; idx >= 0; idx--)
+ for (fp = &ipfr_heads[idx]; (fra = *fp); ) {
+ --fra->ipfr_ttl;
+ if (fra->ipfr_ttl == 0) {
+ *fp = fra->ipfr_next;
+ ipfr_delete(fra);
+ ATOMIC_INCL(ipfr_stats.ifs_expire);
+ ATOMIC_DEC32(ipfr_inuse);
+ } else
+ fp = &fra->ipfr_next;
+ }
+ RWLOCK_EXIT(&ipf_frag);
+
+ /*
+ * Same again for the NAT table, except that if the structure also
+ * still points to a NAT structure, and the NAT structure points back
+ * at the one to be free'd, NULL the reference from the NAT struct.
+ * NOTE: We need to grab both mutex's early, and in this order so as
+ * to prevent a deadlock if both try to expire at the same time.
+ */
+ WRITE_ENTER(&ipf_nat);
+ WRITE_ENTER(&ipf_natfrag);
+ for (idx = IPFT_SIZE - 1; idx >= 0; idx--)
+ for (fp = &ipfr_nattab[idx]; (fra = *fp); ) {
+ --fra->ipfr_ttl;
+ if (fra->ipfr_ttl == 0) {
+ ATOMIC_INCL(ipfr_stats.ifs_expire);
+ ATOMIC_DEC32(ipfr_inuse);
+ nat = fra->ipfr_data;
+ if (nat != NULL) {
+ if (nat->nat_data == fra)
+ nat->nat_data = NULL;
+ }
+ *fp = fra->ipfr_next;
+ ipfr_delete(fra);
+ } else
+ fp = &fra->ipfr_next;
+ }
+ RWLOCK_EXIT(&ipf_natfrag);
+ RWLOCK_EXIT(&ipf_nat);
+ SPL_X(s);
+}
+
+
+/*
+ * Slowly expire held state for fragments. Timeouts are set * in expectation
+ * of this being called twice per second.
+ */
+# if (BSD >= 199306) || SOLARIS || defined(__sgi)
+# if defined(SOLARIS2) && (SOLARIS2 < 7)
+void ipfr_slowtimer()
+# else
+void ipfr_slowtimer __P((void *ptr))
+# endif
+# else
+int ipfr_slowtimer()
+# endif
+{
+#if defined(_KERNEL) && SOLARIS
+ extern int fr_running;
+
+ if (fr_running <= 0)
+ return;
+#endif
+
+ READ_ENTER(&ipf_solaris);
+#ifdef __sgi
+ ipfilter_sgi_intfsync();
+#endif
+
+ ipfr_fragexpire();
+ fr_timeoutstate();
+ ip_natexpire();
+ fr_authexpire();
+# if SOLARIS
+ ipfr_timer_id = timeout(ipfr_slowtimer, NULL, drv_usectohz(500000));
+ RWLOCK_EXIT(&ipf_solaris);
+# else
+# if defined(__NetBSD__) && (__NetBSD_Version__ >= 104240000)
+ callout_reset(&ipfr_slowtimer_ch, hz / 2, ipfr_slowtimer, NULL);
+# else
+# if (__FreeBSD_version >= 300000)
+ ipfr_slowtimer_ch = timeout(ipfr_slowtimer, NULL, hz/2);
+# else
+ timeout(ipfr_slowtimer, NULL, hz/2);
+# endif
+# if (BSD < 199306) && !defined(__sgi)
+ return 0;
+# endif /* FreeBSD */
+# endif /* NetBSD */
+# endif /* SOLARIS */
+}
+#endif /* defined(_KERNEL) */
diff --git a/sys/contrib/ipfilter/netinet/ip_frag.h b/sys/contrib/ipfilter/netinet/ip_frag.h
new file mode 100644
index 0000000..2d0b9be
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_frag.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 1993-2000 by Darren Reed.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and due credit is given
+ * to the original author and the contributors.
+ *
+ * @(#)ip_frag.h 1.5 3/24/96
+ * $Id: ip_frag.h,v 2.4.2.2 2000/11/10 13:10:54 darrenr Exp $
+ * $FreeBSD$
+ */
+
+#ifndef __IP_FRAG_H__
+#define __IP_FRAG_H__
+
+#define IPFT_SIZE 257
+
+typedef struct ipfr {
+ struct ipfr *ipfr_next, *ipfr_prev;
+ void *ipfr_data;
+ struct in_addr ipfr_src;
+ struct in_addr ipfr_dst;
+ void *ipfr_ifp;
+ u_short ipfr_id;
+ u_char ipfr_p;
+ u_char ipfr_tos;
+ u_short ipfr_off;
+ u_char ipfr_ttl;
+ u_char ipfr_seen0;
+ frentry_t *ipfr_rule;
+} ipfr_t;
+
+
+typedef struct ipfrstat {
+ u_long ifs_exists; /* add & already exists */
+ u_long ifs_nomem;
+ u_long ifs_new;
+ u_long ifs_hits;
+ u_long ifs_expire;
+ u_long ifs_inuse;
+ struct ipfr **ifs_table;
+ struct ipfr **ifs_nattab;
+} ipfrstat_t;
+
+#define IPFR_CMPSZ (offsetof(ipfr_t, ipfr_off) - \
+ offsetof(ipfr_t, ipfr_src))
+
+extern int fr_ipfrttl;
+extern int fr_frag_lock;
+extern ipfrstat_t *ipfr_fragstats __P((void));
+extern int ipfr_newfrag __P((ip_t *, fr_info_t *, u_int));
+extern int ipfr_nat_newfrag __P((ip_t *, fr_info_t *, u_int, struct nat *));
+extern nat_t *ipfr_nat_knownfrag __P((ip_t *, fr_info_t *));
+extern frentry_t *ipfr_knownfrag __P((ip_t *, fr_info_t *));
+extern void ipfr_forget __P((void *));
+extern void ipfr_unload __P((void));
+extern void ipfr_fragexpire __P((void));
+
+#if (BSD >= 199306) || SOLARIS || defined(__sgi)
+# if defined(SOLARIS2) && (SOLARIS2 < 7)
+extern void ipfr_slowtimer __P((void));
+# else
+extern void ipfr_slowtimer __P((void *));
+# endif
+#else
+extern int ipfr_slowtimer __P((void));
+#endif /* (BSD >= 199306) || SOLARIS */
+
+#endif /* __IP_FIL_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_ftp_pxy.c b/sys/contrib/ipfilter/netinet/ip_ftp_pxy.c
new file mode 100644
index 0000000..6e4fe53
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_ftp_pxy.c
@@ -0,0 +1,786 @@
+/*
+ * Simple FTP transparent proxy for in-kernel use. For use with the NAT
+ * code.
+ *
+ * $FreeBSD$
+ */
+#if SOLARIS && defined(_KERNEL)
+extern kmutex_t ipf_rw;
+#endif
+
+#define isdigit(x) ((x) >= '0' && (x) <= '9')
+#define isupper(x) (((unsigned)(x) >= 'A') && ((unsigned)(x) <= 'Z'))
+#define islower(x) (((unsigned)(x) >= 'a') && ((unsigned)(x) <= 'z'))
+#define isalpha(x) (isupper(x) || islower(x))
+#define toupper(x) (isupper(x) ? (x) : (x) - 'a' + 'A')
+
+#define IPF_FTP_PROXY
+
+#define IPF_MINPORTLEN 18
+#define IPF_MAXPORTLEN 30
+#define IPF_MIN227LEN 39
+#define IPF_MAX227LEN 51
+#define IPF_FTPBUFSZ 96 /* This *MUST* be >= 53! */
+
+
+int ippr_ftp_client __P((fr_info_t *, ip_t *, nat_t *, ftpinfo_t *, int));
+int ippr_ftp_complete __P((char *, size_t));
+int ippr_ftp_in __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *));
+int ippr_ftp_init __P((void));
+int ippr_ftp_new __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *));
+int ippr_ftp_out __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *));
+int ippr_ftp_pasv __P((fr_info_t *, ip_t *, nat_t *, ftpside_t *, int));
+int ippr_ftp_port __P((fr_info_t *, ip_t *, nat_t *, ftpside_t *, int));
+int ippr_ftp_process __P((fr_info_t *, ip_t *, nat_t *, ftpinfo_t *, int));
+int ippr_ftp_server __P((fr_info_t *, ip_t *, nat_t *, ftpinfo_t *, int));
+int ippr_ftp_valid __P((char *, size_t));
+u_short ippr_ftp_atoi __P((char **));
+
+static frentry_t natfr;
+int ippr_ftp_pasvonly = 0;
+int ippr_ftp_insecure = 0;
+
+
+/*
+ * Initialize local structures.
+ */
+int ippr_ftp_init()
+{
+ bzero((char *)&natfr, sizeof(natfr));
+ natfr.fr_ref = 1;
+ natfr.fr_flags = FR_INQUE|FR_PASS|FR_QUICK|FR_KEEPSTATE;
+ return 0;
+}
+
+
+int ippr_ftp_new(fin, ip, aps, nat)
+fr_info_t *fin;
+ip_t *ip;
+ap_session_t *aps;
+nat_t *nat;
+{
+ ftpinfo_t *ftp;
+ ftpside_t *f;
+
+ KMALLOC(ftp, ftpinfo_t *);
+ if (ftp == NULL)
+ return -1;
+ aps->aps_data = ftp;
+ aps->aps_psiz = sizeof(ftpinfo_t);
+
+ bzero((char *)ftp, sizeof(*ftp));
+ f = &ftp->ftp_side[0];
+ f->ftps_rptr = f->ftps_buf;
+ f->ftps_wptr = f->ftps_buf;
+ f = &ftp->ftp_side[1];
+ f->ftps_rptr = f->ftps_buf;
+ f->ftps_wptr = f->ftps_buf;
+ return 0;
+}
+
+
+int ippr_ftp_port(fin, ip, nat, f, dlen)
+fr_info_t *fin;
+ip_t *ip;
+nat_t *nat;
+ftpside_t *f;
+int dlen;
+{
+ tcphdr_t *tcp, tcph, *tcp2 = &tcph;
+ char newbuf[IPF_FTPBUFSZ], *s;
+ u_short a5, a6, sp, dp;
+ u_int a1, a2, a3, a4;
+ struct in_addr swip;
+ size_t nlen, olen;
+ fr_info_t fi;
+ int inc, off;
+ nat_t *ipn;
+ mb_t *m;
+#if SOLARIS
+ mb_t *m1;
+#endif
+
+ tcp = (tcphdr_t *)fin->fin_dp;
+ /*
+ * Check for client sending out PORT message.
+ */
+ if (dlen < IPF_MINPORTLEN)
+ return 0;
+ off = fin->fin_hlen + (tcp->th_off << 2);
+ /*
+ * Skip the PORT command + space
+ */
+ s = f->ftps_rptr + 5;
+ /*
+ * Pick out the address components, two at a time.
+ */
+ a1 = ippr_ftp_atoi(&s);
+ if (!s)
+ return 0;
+ a2 = ippr_ftp_atoi(&s);
+ if (!s)
+ return 0;
+ /*
+ * check that IP address in the PORT/PASV reply is the same as the
+ * sender of the command - prevents using PORT for port scanning.
+ */
+ a1 <<= 16;
+ a1 |= a2;
+ if (a1 != ntohl(nat->nat_inip.s_addr))
+ return 0;
+
+ a5 = ippr_ftp_atoi(&s);
+ if (!s)
+ return 0;
+ if (*s == ')')
+ s++;
+
+ /*
+ * check for CR-LF at the end.
+ */
+ if (*s == '\n')
+ s--;
+ if ((*s == '\r') && (*(s + 1) == '\n')) {
+ s += 2;
+ a6 = a5 & 0xff;
+ } else
+ return 0;
+ a5 >>= 8;
+ a5 &= 0xff;
+ /*
+ * Calculate new address parts for PORT command
+ */
+ a1 = ntohl(ip->ip_src.s_addr);
+ a2 = (a1 >> 16) & 0xff;
+ a3 = (a1 >> 8) & 0xff;
+ a4 = a1 & 0xff;
+ a1 >>= 24;
+ olen = s - f->ftps_rptr;
+ /* DO NOT change this to sprintf! */
+ (void) sprintf(newbuf, "%s %u,%u,%u,%u,%u,%u\r\n",
+ "PORT", a1, a2, a3, a4, a5, a6);
+
+ nlen = strlen(newbuf);
+ inc = nlen - olen;
+ if ((inc + ip->ip_len) > 65535)
+ return 0;
+
+#if SOLARIS
+ m = fin->fin_qfm;
+ for (m1 = m; m1->b_cont; m1 = m1->b_cont)
+ ;
+ if ((inc > 0) && (m1->b_datap->db_lim - m1->b_wptr < inc)) {
+ mblk_t *nm;
+
+ /* alloc enough to keep same trailer space for lower driver */
+ nm = allocb(nlen, BPRI_MED);
+ PANIC((!nm),("ippr_ftp_out: allocb failed"));
+
+ nm->b_band = m1->b_band;
+ nm->b_wptr += nlen;
+
+ m1->b_wptr -= olen;
+ PANIC((m1->b_wptr < m1->b_rptr),
+ ("ippr_ftp_out: cannot handle fragmented data block"));
+
+ linkb(m1, nm);
+ } else {
+ if (m1->b_datap->db_struiolim == m1->b_wptr)
+ m1->b_datap->db_struiolim += inc;
+ m1->b_datap->db_struioflag &= ~STRUIO_IP;
+ m1->b_wptr += inc;
+ }
+ copyin_mblk(m, off, nlen, newbuf);
+#else
+ m = *((mb_t **)fin->fin_mp);
+ if (inc < 0)
+ m_adj(m, inc);
+ /* the mbuf chain will be extended if necessary by m_copyback() */
+ m_copyback(m, off, nlen, newbuf);
+# ifdef M_PKTHDR
+ if (!(m->m_flags & M_PKTHDR))
+ m->m_pkthdr.len += inc;
+# endif
+#endif
+ if (inc != 0) {
+#if SOLARIS || defined(__sgi)
+ register u_32_t sum1, sum2;
+
+ sum1 = ip->ip_len;
+ sum2 = ip->ip_len + inc;
+
+ /* Because ~1 == -2, We really need ~1 == -1 */
+ if (sum1 > sum2)
+ sum2--;
+ sum2 -= sum1;
+ sum2 = (sum2 & 0xffff) + (sum2 >> 16);
+
+ fix_outcksum(&ip->ip_sum, sum2);
+#endif
+ ip->ip_len += inc;
+ }
+
+ /*
+ * Add skeleton NAT entry for connection which will come back the
+ * other way.
+ */
+ sp = htons(a5 << 8 | a6);
+ /*
+ * Don't allow the PORT command to specify a port < 1024 due to
+ * security crap.
+ */
+ if (ntohs(sp) < 1024)
+ return 0;
+ /*
+ * The server may not make the connection back from port 20, but
+ * it is the most likely so use it here to check for a conflicting
+ * mapping.
+ */
+ dp = htons(fin->fin_data[1] - 1);
+ ipn = nat_outlookup(fin->fin_ifp, IPN_TCP, nat->nat_p, nat->nat_inip,
+ ip->ip_dst, (dp << 16) | sp, 0);
+ if (ipn == NULL) {
+ int slen;
+
+ slen = ip->ip_len;
+ ip->ip_len = fin->fin_hlen + sizeof(*tcp2);
+ bcopy((char *)fin, (char *)&fi, sizeof(fi));
+ bzero((char *)tcp2, sizeof(*tcp2));
+ tcp2->th_win = htons(8192);
+ tcp2->th_sport = sp;
+ tcp2->th_off = 5;
+ tcp2->th_dport = 0; /* XXX - don't specify remote port */
+ fi.fin_data[0] = ntohs(sp);
+ fi.fin_data[1] = 0;
+ fi.fin_dlen = sizeof(*tcp2);
+ fi.fin_dp = (char *)tcp2;
+ fi.fin_fr = &natfr;
+ swip = ip->ip_src;
+ fi.fin_fi.fi_saddr = nat->nat_inip.s_addr;
+ ip->ip_src = nat->nat_inip;
+ ipn = nat_new(nat->nat_ptr, ip, &fi, IPN_TCP|FI_W_DPORT,
+ NAT_OUTBOUND);
+ if (ipn != NULL) {
+ ipn->nat_age = fr_defnatage;
+ (void) fr_addstate(ip, &fi, FI_W_DPORT);
+ }
+ ip->ip_len = slen;
+ ip->ip_src = swip;
+ }
+ return APR_INC(inc);
+}
+
+
+int ippr_ftp_client(fin, ip, nat, ftp, dlen)
+fr_info_t *fin;
+nat_t *nat;
+ftpinfo_t *ftp;
+ip_t *ip;
+int dlen;
+{
+ char *rptr, *wptr, cmd[6], c;
+ ftpside_t *f;
+ int inc, i;
+
+ inc = 0;
+ f = &ftp->ftp_side[0];
+ rptr = f->ftps_rptr;
+ wptr = f->ftps_wptr;
+
+ for (i = 0; (i < 5) && (i < dlen); i++) {
+ c = rptr[i];
+ if (isalpha(c)) {
+ cmd[i] = toupper(c);
+ } else {
+ cmd[i] = c;
+ }
+ }
+ cmd[i] = '\0';
+
+ if ((ftp->ftp_passok == 0) && !strncmp(cmd, "USER ", 5))
+ ftp->ftp_passok = 1;
+ else if ((ftp->ftp_passok == 2) && !strncmp(cmd, "PASS ", 5))
+ ftp->ftp_passok = 3;
+ else if ((ftp->ftp_passok == 4) && !ippr_ftp_pasvonly &&
+ !strncmp(cmd, "PORT ", 5)) {
+ inc = ippr_ftp_port(fin, ip, nat, f, dlen);
+ } else if (ippr_ftp_insecure && !ippr_ftp_pasvonly &&
+ !strncmp(cmd, "PORT ", 5)) {
+ inc = ippr_ftp_port(fin, ip, nat, f, dlen);
+ }
+
+ while ((*rptr++ != '\n') && (rptr < wptr))
+ ;
+ f->ftps_rptr = rptr;
+ return inc;
+}
+
+
+int ippr_ftp_pasv(fin, ip, nat, f, dlen)
+fr_info_t *fin;
+ip_t *ip;
+nat_t *nat;
+ftpside_t *f;
+int dlen;
+{
+ tcphdr_t *tcp, tcph, *tcp2 = &tcph;
+ struct in_addr swip, swip2;
+ u_short a5, a6, sp, dp;
+ u_int a1, a2, a3, a4;
+ fr_info_t fi;
+ nat_t *ipn;
+ int inc;
+ char *s;
+
+ /*
+ * Check for PASV reply message.
+ */
+ if (dlen < IPF_MIN227LEN)
+ return 0;
+ else if (strncmp(f->ftps_rptr, "227 Entering Passive Mode", 25))
+ return 0;
+
+ tcp = (tcphdr_t *)fin->fin_dp;
+
+ /*
+ * Skip the PORT command + space
+ */
+ s = f->ftps_rptr + 25;
+ while (*s && !isdigit(*s))
+ s++;
+ /*
+ * Pick out the address components, two at a time.
+ */
+ a1 = ippr_ftp_atoi(&s);
+ if (!s)
+ return 0;
+ a2 = ippr_ftp_atoi(&s);
+ if (!s)
+ return 0;
+
+ /*
+ * check that IP address in the PORT/PASV reply is the same as the
+ * sender of the command - prevents using PORT for port scanning.
+ */
+ a1 <<= 16;
+ a1 |= a2;
+ if (a1 != ntohl(nat->nat_oip.s_addr))
+ return 0;
+
+ a5 = ippr_ftp_atoi(&s);
+ if (!s)
+ return 0;
+
+ if (*s == ')')
+ s++;
+ if (*s == '\n')
+ s--;
+ /*
+ * check for CR-LF at the end.
+ */
+ if ((*s == '\r') && (*(s + 1) == '\n')) {
+ s += 2;
+ a6 = a5 & 0xff;
+ } else
+ return 0;
+ a5 >>= 8;
+ /*
+ * Calculate new address parts for 227 reply
+ */
+ a1 = ntohl(ip->ip_src.s_addr);
+ a2 = (a1 >> 16) & 0xff;
+ a3 = (a1 >> 8) & 0xff;
+ a4 = a1 & 0xff;
+ a1 >>= 24;
+ inc = 0;
+#if 0
+ olen = s - f->ftps_rptr;
+ (void) sprintf(newbuf, "%s %u,%u,%u,%u,%u,%u\r\n",
+ "227 Entering Passive Mode", a1, a2, a3, a4, a5, a6);
+ nlen = strlen(newbuf);
+ inc = nlen - olen;
+ if ((inc + ip->ip_len) > 65535)
+ return 0;
+
+#if SOLARIS
+ m = fin->fin_qfm;
+ for (m1 = m; m1->b_cont; m1 = m1->b_cont)
+ ;
+ if ((inc > 0) && (m1->b_datap->db_lim - m1->b_wptr < inc)) {
+ mblk_t *nm;
+
+ /* alloc enough to keep same trailer space for lower driver */
+ nm = allocb(nlen, BPRI_MED);
+ PANIC((!nm),("ippr_ftp_out: allocb failed"));
+
+ nm->b_band = m1->b_band;
+ nm->b_wptr += nlen;
+
+ m1->b_wptr -= olen;
+ PANIC((m1->b_wptr < m1->b_rptr),
+ ("ippr_ftp_out: cannot handle fragmented data block"));
+
+ linkb(m1, nm);
+ } else {
+ m1->b_wptr += inc;
+ }
+ /*copyin_mblk(m, off, nlen, newbuf);*/
+#else /* SOLARIS */
+ m = *((mb_t **)fin->fin_mp);
+ if (inc < 0)
+ m_adj(m, inc);
+ /* the mbuf chain will be extended if necessary by m_copyback() */
+ /*m_copyback(m, off, nlen, newbuf);*/
+#endif /* SOLARIS */
+ if (inc != 0) {
+#if SOLARIS || defined(__sgi)
+ register u_32_t sum1, sum2;
+
+ sum1 = ip->ip_len;
+ sum2 = ip->ip_len + inc;
+
+ /* Because ~1 == -2, We really need ~1 == -1 */
+ if (sum1 > sum2)
+ sum2--;
+ sum2 -= sum1;
+ sum2 = (sum2 & 0xffff) + (sum2 >> 16);
+
+ fix_outcksum(&ip->ip_sum, sum2);
+#endif /* SOLARIS || defined(__sgi) */
+ ip->ip_len += inc;
+ }
+#endif /* 0 */
+
+ /*
+ * Add skeleton NAT entry for connection which will come back the
+ * other way.
+ */
+ sp = 0;
+ dp = htons(fin->fin_data[1] - 1);
+ ipn = nat_outlookup(fin->fin_ifp, IPN_TCP, nat->nat_p, nat->nat_inip,
+ ip->ip_dst, (dp << 16) | sp, 0);
+ if (ipn == NULL) {
+ int slen;
+
+ slen = ip->ip_len;
+ ip->ip_len = fin->fin_hlen + sizeof(*tcp2);
+ bcopy((char *)fin, (char *)&fi, sizeof(fi));
+ bzero((char *)tcp2, sizeof(*tcp2));
+ tcp2->th_win = htons(8192);
+ tcp2->th_sport = 0; /* XXX - fake it for nat_new */
+ tcp2->th_off = 5;
+ fi.fin_data[1] = a5 << 8 | a6;
+ fi.fin_dlen = sizeof(*tcp2);
+ tcp2->th_dport = htons(fi.fin_data[1]);
+ fi.fin_data[0] = 0;
+ fi.fin_dp = (char *)tcp2;
+ fi.fin_fr = &natfr;
+ swip = ip->ip_src;
+ swip2 = ip->ip_dst;
+ fi.fin_fi.fi_daddr = ip->ip_src.s_addr;
+ fi.fin_fi.fi_saddr = nat->nat_inip.s_addr;
+ ip->ip_dst = ip->ip_src;
+ ip->ip_src = nat->nat_inip;
+ ipn = nat_new(nat->nat_ptr, ip, &fi, IPN_TCP|FI_W_SPORT,
+ NAT_OUTBOUND);
+ if (ipn != NULL) {
+ ipn->nat_age = fr_defnatage;
+ (void) fr_addstate(ip, &fi, FI_W_SPORT);
+ }
+ ip->ip_len = slen;
+ ip->ip_src = swip;
+ ip->ip_dst = swip2;
+ }
+ return inc;
+}
+
+
+int ippr_ftp_server(fin, ip, nat, ftp, dlen)
+fr_info_t *fin;
+ip_t *ip;
+nat_t *nat;
+ftpinfo_t *ftp;
+int dlen;
+{
+ char *rptr, *wptr;
+ ftpside_t *f;
+ int inc;
+
+ inc = 0;
+ f = &ftp->ftp_side[1];
+ rptr = f->ftps_rptr;
+ wptr = f->ftps_wptr;
+
+ if ((ftp->ftp_passok == 1) && !strncmp(rptr, "331", 3))
+ ftp->ftp_passok = 2;
+ else if ((ftp->ftp_passok == 3) && !strncmp(rptr, "230", 3))
+ ftp->ftp_passok = 4;
+ else if ((ftp->ftp_passok == 3) && !strncmp(rptr, "530", 3))
+ ftp->ftp_passok = 0;
+ else if ((ftp->ftp_passok == 4) && !strncmp(rptr, "227 ", 4)) {
+ inc = ippr_ftp_pasv(fin, ip, nat, f, dlen);
+ } else if (ippr_ftp_insecure && !strncmp(rptr, "227 ", 4)) {
+ inc = ippr_ftp_pasv(fin, ip, nat, f, dlen);
+ }
+ while ((*rptr++ != '\n') && (rptr < wptr))
+ ;
+ f->ftps_rptr = rptr;
+ return inc;
+}
+
+
+/*
+ * Look to see if the buffer starts with something which we recognise as
+ * being the correct syntax for the FTP protocol.
+ */
+int ippr_ftp_valid(buf, len)
+char *buf;
+size_t len;
+{
+ register char *s, c;
+ register size_t i = len;
+
+ if (i < 5)
+ return 2;
+ s = buf;
+ c = *s++;
+ i--;
+
+ if (isdigit(c)) {
+ c = *s++;
+ i--;
+ if (isdigit(c)) {
+ c = *s++;
+ i--;
+ if (isdigit(c)) {
+ c = *s++;
+ i--;
+ if ((c != '-') && (c != ' '))
+ return 1;
+ } else
+ return 1;
+ } else
+ return 1;
+ } else if (isalpha(c)) {
+ c = *s++;
+ i--;
+ if (isalpha(c)) {
+ c = *s++;
+ i--;
+ if (isalpha(c)) {
+ c = *s++;
+ i--;
+ if (isalpha(c)) {
+ c = *s++;
+ i--;
+ if ((c != ' ') && (c != '\r'))
+ return 1;
+ } else if ((c != ' ') && (c != '\r'))
+ return 1;
+ } else
+ return 1;
+ } else
+ return 1;
+ } else
+ return 1;
+ for (; i; i--) {
+ c = *s++;
+ if (c == '\n')
+ return 0;
+ }
+ return 2;
+}
+
+
+int ippr_ftp_process(fin, ip, nat, ftp, rv)
+fr_info_t *fin;
+ip_t *ip;
+nat_t *nat;
+ftpinfo_t *ftp;
+int rv;
+{
+ int mlen, len, off, inc, i, sel;
+ char *rptr, *wptr;
+ ftpside_t *f, *t;
+ tcphdr_t *tcp;
+ mb_t *m;
+
+ tcp = (tcphdr_t *)fin->fin_dp;
+ off = fin->fin_hlen + (tcp->th_off << 2);
+
+#if SOLARIS
+ m = fin->fin_qfm;
+#else
+ m = *((mb_t **)fin->fin_mp);
+#endif
+
+#if SOLARIS
+ mlen = msgdsize(m) - off;
+#else
+ mlen = mbufchainlen(m) - off;
+#endif
+
+ t = &ftp->ftp_side[1 - rv];
+ f = &ftp->ftp_side[rv];
+ if (!mlen) {
+ if (!t->ftps_seq ||
+ (int)ntohl(tcp->th_ack) - (int)t->ftps_seq > 0)
+ t->ftps_seq = ntohl(tcp->th_ack);
+ f->ftps_len = 0;
+ return 0;
+ }
+
+ inc = 0;
+ rptr = f->ftps_rptr;
+ wptr = f->ftps_wptr;
+
+ sel = nat->nat_aps->aps_sel[1 - rv];
+ if (rv)
+ i = nat->nat_aps->aps_ackoff[sel];
+ else
+ i = nat->nat_aps->aps_seqoff[sel];
+ /*
+ * XXX - Ideally, this packet should get dropped because we now know
+ * that it is out of order (and there is no real danger in doing so
+ * apart from causing packets to go through here ordered).
+ */
+ if (f->ftps_len + f->ftps_seq == ntohl(tcp->th_seq))
+ f->ftps_seq = ntohl(tcp->th_seq);
+ else if (ntohl(tcp->th_seq) + i != f->ftps_seq) {
+ return APR_ERR(-1);
+ }
+ f->ftps_len = mlen;
+
+ while (mlen > 0) {
+ len = MIN(mlen, FTP_BUFSZ / 2);
+
+#if SOLARIS
+ copyout_mblk(m, off, len, wptr);
+#else
+ m_copydata(m, off, len, wptr);
+#endif
+ mlen -= len;
+ off += len;
+ wptr += len;
+ f->ftps_wptr = wptr;
+ if (f->ftps_junk == 2)
+ f->ftps_junk = ippr_ftp_valid(rptr, wptr - rptr);
+
+ while ((f->ftps_junk == 0) && (wptr > rptr)) {
+ f->ftps_junk = ippr_ftp_valid(rptr, wptr - rptr);
+ if (f->ftps_junk == 0) {
+ len = wptr - rptr;
+ f->ftps_rptr = rptr;
+ if (rv)
+ inc += ippr_ftp_server(fin, ip, nat,
+ ftp, len);
+ else
+ inc += ippr_ftp_client(fin, ip, nat,
+ ftp, len);
+ rptr = f->ftps_rptr;
+ }
+ }
+
+ while ((f->ftps_junk == 1) && (rptr < wptr)) {
+ while ((rptr < wptr) && (*rptr != '\r'))
+ rptr++;
+
+ if (*rptr == '\r') {
+ if (rptr + 1 < wptr) {
+ if (*(rptr + 1) == '\n') {
+ rptr += 2;
+ f->ftps_junk = 0;
+ } else
+ rptr++;
+ } else
+ break;
+ }
+ }
+ f->ftps_rptr = rptr;
+
+ if (rptr == wptr) {
+ rptr = wptr = f->ftps_buf;
+ } else {
+ if ((wptr > f->ftps_buf + FTP_BUFSZ / 2)) {
+ i = wptr - rptr;
+ if ((rptr == f->ftps_buf) ||
+ (wptr - rptr > FTP_BUFSZ / 2)) {
+ f->ftps_junk = 1;
+ rptr = wptr = f->ftps_buf;
+ } else {
+ bcopy(rptr, f->ftps_buf, i);
+ wptr = f->ftps_buf + i;
+ rptr = f->ftps_buf;
+ }
+ }
+ f->ftps_rptr = rptr;
+ f->ftps_wptr = wptr;
+ }
+ }
+
+ t->ftps_seq = ntohl(tcp->th_ack);
+ f->ftps_rptr = rptr;
+ f->ftps_wptr = wptr;
+ return APR_INC(inc);
+}
+
+
+int ippr_ftp_out(fin, ip, aps, nat)
+fr_info_t *fin;
+ip_t *ip;
+ap_session_t *aps;
+nat_t *nat;
+{
+ ftpinfo_t *ftp;
+
+ ftp = aps->aps_data;
+ if (ftp == NULL)
+ return 0;
+ return ippr_ftp_process(fin, ip, nat, ftp, 0);
+}
+
+
+int ippr_ftp_in(fin, ip, aps, nat)
+fr_info_t *fin;
+ip_t *ip;
+ap_session_t *aps;
+nat_t *nat;
+{
+ ftpinfo_t *ftp;
+
+ ftp = aps->aps_data;
+ if (ftp == NULL)
+ return 0;
+ return ippr_ftp_process(fin, ip, nat, ftp, 1);
+}
+
+
+/*
+ * ippr_ftp_atoi - implement a version of atoi which processes numbers in
+ * pairs separated by commas (which are expected to be in the range 0 - 255),
+ * returning a 16 bit number combining either side of the , as the MSB and
+ * LSB.
+ */
+u_short ippr_ftp_atoi(ptr)
+char **ptr;
+{
+ register char *s = *ptr, c;
+ register u_char i = 0, j = 0;
+
+ while ((c = *s++) && isdigit(c)) {
+ i *= 10;
+ i += c - '0';
+ }
+ if (c != ',') {
+ *ptr = NULL;
+ return 0;
+ }
+ while ((c = *s++) && isdigit(c)) {
+ j *= 10;
+ j += c - '0';
+ }
+ *ptr = s;
+ i &= 0xff;
+ j &= 0xff;
+ return (i << 8) | j;
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_log.c b/sys/contrib/ipfilter/netinet/ip_log.c
new file mode 100644
index 0000000..082a0a3
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_log.c
@@ -0,0 +1,507 @@
+/*
+ * Copyright (C) 1997-2000 by Darren Reed.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and due credit is given
+ * to the original author and the contributors.
+ *
+ * $Id: ip_log.c,v 2.5.2.1 2000/07/19 13:11:47 darrenr Exp $
+ * $FreeBSD$
+ */
+#include <sys/param.h>
+#if defined(KERNEL) && !defined(_KERNEL)
+# define _KERNEL
+#endif
+#if defined(__NetBSD__) && (NetBSD >= 199905) && !defined(IPFILTER_LKM)
+# include "opt_ipfilter_log.h"
+#endif
+#ifdef __FreeBSD__
+# if defined(IPFILTER_LKM) || defined(_KERNEL)
+# if !defined(__FreeBSD_version)
+# include <sys/osreldate.h>
+# endif
+# if !defined(IPFILTER_LKM)
+# if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000)
+# include "opt_ipfilter.h"
+# endif
+# endif
+# else
+# ifdef KLD_MODULE
+# include <osreldate.h>
+# endif
+# endif
+#endif
+#ifdef IPFILTER_LOG
+# ifndef SOLARIS
+# define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
+# endif
+# ifndef _KERNEL
+# include <stdio.h>
+# include <string.h>
+# include <stdlib.h>
+# include <ctype.h>
+# endif
+# include <sys/errno.h>
+# include <sys/types.h>
+# include <sys/file.h>
+# if __FreeBSD_version >= 220000 && defined(_KERNEL)
+# include <sys/fcntl.h>
+# include <sys/filio.h>
+# else
+# include <sys/ioctl.h>
+# endif
+# include <sys/time.h>
+# if defined(_KERNEL) && !defined(linux)
+# include <sys/systm.h>
+# endif
+# include <sys/uio.h>
+# if !SOLARIS
+# if (NetBSD > 199609) || (OpenBSD > 199603) || (__FreeBSD_version >= 300000)
+# include <sys/dirent.h>
+# else
+# include <sys/dir.h>
+# endif
+# ifndef linux
+# include <sys/mbuf.h>
+# endif
+# else
+# include <sys/filio.h>
+# include <sys/cred.h>
+# include <sys/ddi.h>
+# include <sys/sunddi.h>
+# include <sys/ksynch.h>
+# include <sys/kmem.h>
+# include <sys/mkdev.h>
+# include <sys/dditypes.h>
+# include <sys/cmn_err.h>
+# endif
+# ifndef linux
+# include <sys/protosw.h>
+# endif
+# include <sys/socket.h>
+
+# include <net/if.h>
+# ifdef sun
+# include <net/af.h>
+# endif
+# if __FreeBSD_version >= 300000
+# include <net/if_var.h>
+# endif
+# include <net/route.h>
+# include <netinet/in.h>
+# ifdef __sgi
+# include <sys/ddi.h>
+# ifdef IFF_DRVRLOCK /* IRIX6 */
+# include <sys/hashing.h>
+# endif
+# endif
+# if !defined(linux) && !(defined(__sgi) && !defined(IFF_DRVRLOCK)) /*IRIX<6*/
+# include <netinet/in_var.h>
+# endif
+# include <netinet/in_systm.h>
+# include <netinet/ip.h>
+# include <netinet/tcp.h>
+# include <netinet/udp.h>
+# include <netinet/ip_icmp.h>
+# ifndef linux
+# include <netinet/ip_var.h>
+# endif
+# ifndef _KERNEL
+# include <syslog.h>
+# endif
+# include "netinet/ip_compat.h"
+# include <netinet/tcpip.h>
+# include "netinet/ip_fil.h"
+# include "netinet/ip_proxy.h"
+# include "netinet/ip_nat.h"
+# include "netinet/ip_frag.h"
+# include "netinet/ip_state.h"
+# include "netinet/ip_auth.h"
+# if (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+# endif
+
+# ifndef MIN
+# define MIN(a,b) (((a)<(b))?(a):(b))
+# endif
+
+
+# if SOLARIS || defined(__sgi)
+extern kmutex_t ipl_mutex;
+# if SOLARIS
+extern kcondvar_t iplwait;
+# endif
+# endif
+
+iplog_t **iplh[IPL_LOGMAX+1], *iplt[IPL_LOGMAX+1], *ipll[IPL_LOGMAX+1];
+size_t iplused[IPL_LOGMAX+1];
+static fr_info_t iplcrc[IPL_LOGMAX+1];
+# ifdef linux
+static struct wait_queue *iplwait[IPL_LOGMAX+1];
+# endif
+
+
+/*
+ * Initialise log buffers & pointers. Also iniialised the CRC to a local
+ * secret for use in calculating the "last log checksum".
+ */
+void ipflog_init()
+{
+ int i;
+
+ for (i = IPL_LOGMAX; i >= 0; i--) {
+ iplt[i] = NULL;
+ ipll[i] = NULL;
+ iplh[i] = &iplt[i];
+ iplused[i] = 0;
+ bzero((char *)&iplcrc[i], sizeof(iplcrc[i]));
+ }
+}
+
+
+/*
+ * ipflog
+ * Create a log record for a packet given that it has been triggered by a
+ * rule (or the default setting). Calculate the transport protocol header
+ * size using predetermined size of a couple of popular protocols and thus
+ * how much data to copy into the log, including part of the data body if
+ * requested.
+ */
+int ipflog(flags, ip, fin, m)
+u_int flags;
+ip_t *ip;
+fr_info_t *fin;
+mb_t *m;
+{
+ ipflog_t ipfl;
+ register size_t mlen, hlen;
+ size_t sizes[2];
+ void *ptrs[2];
+ int types[2];
+ u_char p;
+# if SOLARIS
+ ill_t *ifp = fin->fin_ifp;
+# else
+ struct ifnet *ifp = fin->fin_ifp;
+# endif
+
+ /*
+ * calculate header size.
+ */
+ hlen = fin->fin_hlen;
+ if (fin->fin_off == 0) {
+ p = fin->fin_fi.fi_p;
+ if (p == IPPROTO_TCP)
+ hlen += MIN(sizeof(tcphdr_t), fin->fin_dlen);
+ else if (p == IPPROTO_UDP)
+ hlen += MIN(sizeof(udphdr_t), fin->fin_dlen);
+ else if (p == IPPROTO_ICMP) {
+ struct icmp *icmp;
+
+ icmp = (struct icmp *)fin->fin_dp;
+
+ /*
+ * For ICMP, if the packet is an error packet, also
+ * include the information about the packet which
+ * caused the error.
+ */
+ switch (icmp->icmp_type)
+ {
+ case ICMP_UNREACH :
+ case ICMP_SOURCEQUENCH :
+ case ICMP_REDIRECT :
+ case ICMP_TIMXCEED :
+ case ICMP_PARAMPROB :
+ hlen += MIN(sizeof(struct icmp) + 8,
+ fin->fin_dlen);
+ break;
+ default :
+ hlen += MIN(sizeof(struct icmp),
+ fin->fin_dlen);
+ break;
+ }
+ }
+ }
+ /*
+ * Get the interface number and name to which this packet is
+ * currently associated.
+ */
+# if SOLARIS
+ ipfl.fl_unit = (u_char)ifp->ill_ppa;
+ bcopy(ifp->ill_name, ipfl.fl_ifname, MIN(ifp->ill_name_length, 4));
+ mlen = (flags & FR_LOGBODY) ? MIN(msgdsize(m) - hlen, 128) : 0;
+# else
+# if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199603)) || \
+ (defined(OpenBSD) && (OpenBSD >= 199603))
+ strncpy(ipfl.fl_ifname, ifp->if_xname, IFNAMSIZ);
+# else
+# ifndef linux
+ ipfl.fl_unit = (u_char)ifp->if_unit;
+# endif
+ if ((ipfl.fl_ifname[0] = ifp->if_name[0]))
+ if ((ipfl.fl_ifname[1] = ifp->if_name[1]))
+ if ((ipfl.fl_ifname[2] = ifp->if_name[2]))
+ ipfl.fl_ifname[3] = ifp->if_name[3];
+# endif
+ mlen = (flags & FR_LOGBODY) ? MIN(fin->fin_plen - hlen, 128) : 0;
+# endif
+ ipfl.fl_plen = (u_char)mlen;
+ ipfl.fl_hlen = (u_char)hlen;
+ ipfl.fl_rule = fin->fin_rule;
+ ipfl.fl_group = fin->fin_group;
+ if (fin->fin_fr != NULL)
+ ipfl.fl_loglevel = fin->fin_fr->fr_loglevel;
+ else
+ ipfl.fl_loglevel = 0xffff;
+ ipfl.fl_flags = flags;
+ ptrs[0] = (void *)&ipfl;
+ sizes[0] = sizeof(ipfl);
+ types[0] = 0;
+# if SOLARIS
+ /*
+ * Are we copied from the mblk or an aligned array ?
+ */
+ if (ip == (ip_t *)m->b_rptr) {
+ ptrs[1] = m;
+ sizes[1] = hlen + mlen;
+ types[1] = 1;
+ } else {
+ ptrs[1] = ip;
+ sizes[1] = hlen + mlen;
+ types[1] = 0;
+ }
+# else
+ ptrs[1] = m;
+ sizes[1] = hlen + mlen;
+ types[1] = 1;
+# endif
+ return ipllog(IPL_LOGIPF, fin, ptrs, sizes, types, 2);
+}
+
+
+/*
+ * ipllog
+ */
+int ipllog(dev, fin, items, itemsz, types, cnt)
+int dev;
+fr_info_t *fin;
+void **items;
+size_t *itemsz;
+int *types, cnt;
+{
+ caddr_t buf, s;
+ iplog_t *ipl;
+ size_t len;
+ int i;
+
+ /*
+ * Check to see if this log record has a CRC which matches the last
+ * record logged. If it does, just up the count on the previous one
+ * rather than create a new one.
+ */
+ MUTEX_ENTER(&ipl_mutex);
+ if (fin != NULL) {
+ if ((ipll[dev] != NULL) &&
+ bcmp((char *)fin, (char *)&iplcrc[dev], FI_CSIZE) == 0) {
+ ipll[dev]->ipl_count++;
+ MUTEX_EXIT(&ipl_mutex);
+ return 1;
+ }
+ bcopy((char *)fin, (char *)&iplcrc[dev], FI_CSIZE);
+ } else
+ bzero((char *)&iplcrc[dev], FI_CSIZE);
+ MUTEX_EXIT(&ipl_mutex);
+
+ /*
+ * Get the total amount of data to be logged.
+ */
+ for (i = 0, len = sizeof(iplog_t); i < cnt; i++)
+ len += itemsz[i];
+
+ /*
+ * check that we have space to record this information and can
+ * allocate that much.
+ */
+ KMALLOCS(buf, caddr_t, len);
+ if (!buf)
+ return 0;
+ MUTEX_ENTER(&ipl_mutex);
+ if ((iplused[dev] + len) > IPLLOGSIZE) {
+ MUTEX_EXIT(&ipl_mutex);
+ KFREES(buf, len);
+ return 0;
+ }
+ iplused[dev] += len;
+ MUTEX_EXIT(&ipl_mutex);
+
+ /*
+ * advance the log pointer to the next empty record and deduct the
+ * amount of space we're going to use.
+ */
+ ipl = (iplog_t *)buf;
+ ipl->ipl_magic = IPL_MAGIC;
+ ipl->ipl_count = 1;
+ ipl->ipl_next = NULL;
+ ipl->ipl_dsize = len;
+# if SOLARIS || defined(sun) || defined(linux)
+ uniqtime((struct timeval *)&ipl->ipl_sec);
+# else
+# if BSD >= 199306 || defined(__FreeBSD__) || defined(__sgi)
+ microtime((struct timeval *)&ipl->ipl_sec);
+# endif
+# endif
+
+ /*
+ * Loop through all the items to be logged, copying each one to the
+ * buffer. Use bcopy for normal data or the mb_t copyout routine.
+ */
+ for (i = 0, s = buf + sizeof(*ipl); i < cnt; i++) {
+ if (types[i] == 0)
+ bcopy(items[i], s, itemsz[i]);
+ else if (types[i] == 1) {
+# if SOLARIS
+ copyout_mblk(items[i], 0, itemsz[i], s);
+# else
+ m_copydata(items[i], 0, itemsz[i], s);
+# endif
+ }
+ s += itemsz[i];
+ }
+ MUTEX_ENTER(&ipl_mutex);
+ ipll[dev] = ipl;
+ *iplh[dev] = ipl;
+ iplh[dev] = &ipl->ipl_next;
+# if SOLARIS
+ cv_signal(&iplwait);
+ mutex_exit(&ipl_mutex);
+# else
+ MUTEX_EXIT(&ipl_mutex);
+# ifdef linux
+ wake_up_interruptible(&iplwait[dev]);
+# else
+ wakeup(&iplh[dev]);
+# endif
+# endif
+ return 1;
+}
+
+
+int ipflog_read(unit, uio)
+minor_t unit;
+struct uio *uio;
+{
+ size_t dlen, copied;
+ int error = 0;
+ iplog_t *ipl;
+# if defined(_KERNEL) && !SOLARIS
+ int s;
+# endif
+
+ /*
+ * Sanity checks. Make sure the minor # is valid and we're copying
+ * a valid chunk of data.
+ */
+ if (IPL_LOGMAX < unit)
+ return ENXIO;
+ if (!uio->uio_resid)
+ return 0;
+ if ((uio->uio_resid < sizeof(iplog_t)) ||
+ (uio->uio_resid > IPLLOGSIZE))
+ return EINVAL;
+
+ /*
+ * Lock the log so we can snapshot the variables. Wait for a signal
+ * if the log is empty.
+ */
+ SPL_NET(s);
+ MUTEX_ENTER(&ipl_mutex);
+
+ while (!iplused[unit] || !iplt[unit]) {
+# if SOLARIS && defined(_KERNEL)
+ if (!cv_wait_sig(&iplwait, &ipl_mutex)) {
+ MUTEX_EXIT(&ipl_mutex);
+ return EINTR;
+ }
+# else
+# ifdef linux
+ interruptible_sleep_on(&iplwait[unit]);
+ if (current->signal & ~current->blocked)
+ return -EINTR;
+# else
+ MUTEX_EXIT(&ipl_mutex);
+ SPL_X(s);
+ error = SLEEP(&iplh[unit], "ipl sleep");
+ if (error)
+ return error;
+ SPL_NET(s);
+ MUTEX_ENTER(&ipl_mutex);
+# endif /* linux */
+# endif /* SOLARIS */
+ }
+
+# if BSD >= 199306 || defined(__FreeBSD__)
+ uio->uio_rw = UIO_READ;
+# endif
+
+ for (copied = 0; (ipl = iplt[unit]); copied += dlen) {
+ dlen = ipl->ipl_dsize;
+ if (dlen > uio->uio_resid)
+ break;
+ /*
+ * Don't hold the mutex over the uiomove call.
+ */
+ iplt[unit] = ipl->ipl_next;
+ iplused[unit] -= dlen;
+ MUTEX_EXIT(&ipl_mutex);
+ SPL_X(s);
+ error = UIOMOVE((caddr_t)ipl, dlen, UIO_READ, uio);
+ if (error) {
+ SPL_NET(s);
+ MUTEX_ENTER(&ipl_mutex);
+ ipl->ipl_next = iplt[unit];
+ iplt[unit] = ipl;
+ iplused[unit] += dlen;
+ break;
+ }
+ KFREES((caddr_t)ipl, dlen);
+ SPL_NET(s);
+ MUTEX_ENTER(&ipl_mutex);
+ }
+ if (!iplt[unit]) {
+ iplused[unit] = 0;
+ iplh[unit] = &iplt[unit];
+ ipll[unit] = NULL;
+ }
+
+ MUTEX_EXIT(&ipl_mutex);
+ SPL_X(s);
+# ifdef linux
+ if (!error)
+ return (int)copied;
+ return -error;
+# else
+ return error;
+# endif
+}
+
+
+int ipflog_clear(unit)
+minor_t unit;
+{
+ iplog_t *ipl;
+ int used;
+
+ MUTEX_ENTER(&ipl_mutex);
+ while ((ipl = iplt[unit])) {
+ iplt[unit] = ipl->ipl_next;
+ KFREES((caddr_t)ipl, ipl->ipl_dsize);
+ }
+ iplh[unit] = &iplt[unit];
+ ipll[unit] = NULL;
+ used = iplused[unit];
+ iplused[unit] = 0;
+ bzero((char *)&iplcrc[unit], FI_CSIZE);
+ MUTEX_EXIT(&ipl_mutex);
+ return used;
+}
+#endif /* IPFILTER_LOG */
diff --git a/sys/contrib/ipfilter/netinet/ip_nat.c b/sys/contrib/ipfilter/netinet/ip_nat.c
new file mode 100644
index 0000000..816d8e7
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_nat.c
@@ -0,0 +1,2739 @@
+/*
+ * Copyright (C) 1995-2000 by Darren Reed.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and due credit is given
+ * to the original author and the contributors.
+ *
+ * Added redirect stuff and a LOT of bug fixes. (mcn@EnGarde.com)
+ */
+#if !defined(lint)
+/*static const char rcsid[] = "@(#)$Id: ip_nat.c,v 2.37.2.16 2000/07/18 13:57:40 darrenr Exp $";*/
+static const char rcsid[] = "@(#)$FreeBSD$";
+#endif
+
+#if defined(__FreeBSD__) && defined(KERNEL) && !defined(_KERNEL)
+#define _KERNEL
+#endif
+
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/file.h>
+#if defined(__NetBSD__) && (NetBSD >= 199905) && !defined(IPFILTER_LKM) && \
+ defined(_KERNEL)
+# include "opt_ipfilter_log.h"
+#endif
+#if !defined(_KERNEL) && !defined(KERNEL)
+# include <stdio.h>
+# include <string.h>
+# include <stdlib.h>
+#endif
+#if (defined(KERNEL) || defined(_KERNEL)) && (__FreeBSD_version >= 220000)
+# include <sys/filio.h>
+# include <sys/fcntl.h>
+#else
+# include <sys/ioctl.h>
+#endif
+#include <sys/fcntl.h>
+#include <sys/uio.h>
+#ifndef linux
+# include <sys/protosw.h>
+#endif
+#include <sys/socket.h>
+#if defined(_KERNEL) && !defined(linux)
+# include <sys/systm.h>
+#endif
+#if !defined(__SVR4) && !defined(__svr4__)
+# ifndef linux
+# include <sys/mbuf.h>
+# endif
+#else
+# include <sys/filio.h>
+# include <sys/byteorder.h>
+# ifdef _KERNEL
+# include <sys/dditypes.h>
+# endif
+# include <sys/stream.h>
+# include <sys/kmem.h>
+#endif
+#if __FreeBSD_version >= 300000
+# include <sys/queue.h>
+#endif
+#include <net/if.h>
+#if __FreeBSD_version >= 300000
+# include <net/if_var.h>
+# if defined(_KERNEL) && !defined(IPFILTER_LKM)
+# include "opt_ipfilter.h"
+# endif
+#endif
+#ifdef sun
+# include <net/af.h>
+#endif
+#include <net/route.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+
+#ifdef __sgi
+# ifdef IFF_DRVRLOCK /* IRIX6 */
+#include <sys/hashing.h>
+#include <netinet/in_var.h>
+# endif
+#endif
+
+#ifdef RFC1825
+# include <vpn/md5.h>
+# include <vpn/ipsec.h>
+extern struct ifnet vpnif;
+#endif
+
+#ifndef linux
+# include <netinet/ip_var.h>
+#endif
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+#include <netinet/ip_icmp.h>
+#include "netinet/ip_compat.h"
+#include <netinet/tcpip.h>
+#include "netinet/ip_fil.h"
+#include "netinet/ip_proxy.h"
+#include "netinet/ip_nat.h"
+#include "netinet/ip_frag.h"
+#include "netinet/ip_state.h"
+#if (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+#endif
+#ifndef MIN
+# define MIN(a,b) (((a)<(b))?(a):(b))
+#endif
+#undef SOCKADDR_IN
+#define SOCKADDR_IN struct sockaddr_in
+
+nat_t **nat_table[2] = { NULL, NULL },
+ *nat_instances = NULL;
+ipnat_t *nat_list = NULL;
+u_int ipf_nattable_sz = NAT_TABLE_SZ;
+u_int ipf_natrules_sz = NAT_SIZE;
+u_int ipf_rdrrules_sz = RDR_SIZE;
+u_int ipf_hostmap_sz = HOSTMAP_SIZE;
+u_32_t nat_masks = 0;
+u_32_t rdr_masks = 0;
+ipnat_t **nat_rules = NULL;
+ipnat_t **rdr_rules = NULL;
+hostmap_t **maptable = NULL;
+
+u_long fr_defnatage = DEF_NAT_AGE,
+ fr_defnaticmpage = 6; /* 3 seconds */
+natstat_t nat_stats;
+int fr_nat_lock = 0;
+#if (SOLARIS || defined(__sgi)) && defined(_KERNEL)
+extern kmutex_t ipf_rw;
+extern KRWLOCK_T ipf_nat;
+#endif
+
+static int nat_flushtable __P((void));
+static int nat_clearlist __P((void));
+static void nat_addnat __P((struct ipnat *));
+static void nat_addrdr __P((struct ipnat *));
+static void nat_delete __P((struct nat *));
+static void nat_delrdr __P((struct ipnat *));
+static void nat_delnat __P((struct ipnat *));
+static int fr_natgetent __P((caddr_t));
+static int fr_natgetsz __P((caddr_t));
+static int fr_natputent __P((caddr_t));
+static void nat_tabmove __P((nat_t *, u_32_t));
+static int nat_match __P((fr_info_t *, ipnat_t *, ip_t *));
+static hostmap_t *nat_hostmap __P((ipnat_t *, struct in_addr,
+ struct in_addr));
+static void nat_hostmapdel __P((struct hostmap *));
+
+
+int nat_init()
+{
+ KMALLOCS(nat_table[0], nat_t **, sizeof(nat_t *) * ipf_nattable_sz);
+ if (nat_table[0] != NULL)
+ bzero((char *)nat_table[0], ipf_nattable_sz * sizeof(nat_t *));
+ else
+ return -1;
+
+ KMALLOCS(nat_table[1], nat_t **, sizeof(nat_t *) * ipf_nattable_sz);
+ if (nat_table[1] != NULL)
+ bzero((char *)nat_table[1], ipf_nattable_sz * sizeof(nat_t *));
+ else
+ return -1;
+
+ KMALLOCS(nat_rules, ipnat_t **, sizeof(ipnat_t *) * ipf_natrules_sz);
+ if (nat_rules != NULL)
+ bzero((char *)nat_rules, ipf_natrules_sz * sizeof(ipnat_t *));
+ else
+ return -1;
+
+ KMALLOCS(rdr_rules, ipnat_t **, sizeof(ipnat_t *) * ipf_rdrrules_sz);
+ if (rdr_rules != NULL)
+ bzero((char *)rdr_rules, ipf_rdrrules_sz * sizeof(ipnat_t *));
+ else
+ return -1;
+
+ KMALLOCS(maptable, hostmap_t **, sizeof(hostmap_t *) * ipf_hostmap_sz);
+ if (maptable != NULL)
+ bzero((char *)maptable, sizeof(hostmap_t *) * ipf_hostmap_sz);
+ else
+ return -1;
+ return 0;
+}
+
+
+static void nat_addrdr(n)
+ipnat_t *n;
+{
+ ipnat_t **np;
+ u_32_t j;
+ u_int hv;
+ int k;
+
+ k = countbits(n->in_outmsk);
+ if ((k >= 0) && (k != 32))
+ rdr_masks |= 1 << k;
+ j = (n->in_outip & n->in_outmsk);
+ hv = NAT_HASH_FN(j, 0, ipf_rdrrules_sz);
+ np = rdr_rules + hv;
+ while (*np != NULL)
+ np = &(*np)->in_rnext;
+ n->in_rnext = NULL;
+ n->in_prnext = np;
+ *np = n;
+}
+
+
+static void nat_addnat(n)
+ipnat_t *n;
+{
+ ipnat_t **np;
+ u_32_t j;
+ u_int hv;
+ int k;
+
+ k = countbits(n->in_inmsk);
+ if ((k >= 0) && (k != 32))
+ nat_masks |= 1 << k;
+ j = (n->in_inip & n->in_inmsk);
+ hv = NAT_HASH_FN(j, 0, ipf_natrules_sz);
+ np = nat_rules + hv;
+ while (*np != NULL)
+ np = &(*np)->in_mnext;
+ n->in_mnext = NULL;
+ n->in_pmnext = np;
+ *np = n;
+}
+
+
+static void nat_delrdr(n)
+ipnat_t *n;
+{
+ if (n->in_rnext)
+ n->in_rnext->in_prnext = n->in_prnext;
+ *n->in_prnext = n->in_rnext;
+}
+
+
+static void nat_delnat(n)
+ipnat_t *n;
+{
+ if (n->in_mnext)
+ n->in_mnext->in_pmnext = n->in_pmnext;
+ *n->in_pmnext = n->in_mnext;
+}
+
+
+/*
+ * check if an ip address has already been allocated for a given mapping that
+ * is not doing port based translation.
+ *
+ * Must be called with ipf_nat held as a write lock.
+ */
+static struct hostmap *nat_hostmap(np, real, map)
+ipnat_t *np;
+struct in_addr real;
+struct in_addr map;
+{
+ hostmap_t *hm;
+ u_int hv;
+
+ hv = real.s_addr % HOSTMAP_SIZE;
+ for (hm = maptable[hv]; hm; hm = hm->hm_next)
+ if ((hm->hm_realip.s_addr == real.s_addr) &&
+ (np == hm->hm_ipnat)) {
+ hm->hm_ref++;
+ return hm;
+ }
+
+ KMALLOC(hm, hostmap_t *);
+ if (hm) {
+ hm->hm_next = maptable[hv];
+ hm->hm_pnext = maptable + hv;
+ if (maptable[hv])
+ maptable[hv]->hm_pnext = &hm->hm_next;
+ maptable[hv] = hm;
+ hm->hm_ipnat = np;
+ hm->hm_realip = real;
+ hm->hm_mapip = map;
+ hm->hm_ref = 1;
+ }
+ return hm;
+}
+
+
+/*
+ * Must be called with ipf_nat held as a write lock.
+ */
+static void nat_hostmapdel(hm)
+struct hostmap *hm;
+{
+ ATOMIC_DEC32(hm->hm_ref);
+ if (hm->hm_ref == 0) {
+ if (hm->hm_next)
+ hm->hm_next->hm_pnext = hm->hm_pnext;
+ *hm->hm_pnext = hm->hm_next;
+ KFREE(hm);
+ }
+}
+
+
+void fix_outcksum(sp, n)
+u_short *sp;
+u_32_t n;
+{
+ register u_short sumshort;
+ register u_32_t sum1;
+
+ if (!n)
+ return;
+#if SOLARIS2 >= 6
+ else if (n & NAT_HW_CKSUM) {
+ *sp = n & 0xffff;
+ return;
+ }
+#endif
+ sum1 = (~ntohs(*sp)) & 0xffff;
+ sum1 += (n);
+ sum1 = (sum1 >> 16) + (sum1 & 0xffff);
+ /* Again */
+ sum1 = (sum1 >> 16) + (sum1 & 0xffff);
+ sumshort = ~(u_short)sum1;
+ *(sp) = htons(sumshort);
+}
+
+
+void fix_incksum(sp, n)
+u_short *sp;
+u_32_t n;
+{
+ register u_short sumshort;
+ register u_32_t sum1;
+
+ if (!n)
+ return;
+#if SOLARIS2 >= 6
+ else if (n & NAT_HW_CKSUM) {
+ *sp = n & 0xffff;
+ return;
+ }
+#endif
+#ifdef sparc
+ sum1 = (~(*sp)) & 0xffff;
+#else
+ sum1 = (~ntohs(*sp)) & 0xffff;
+#endif
+ sum1 += ~(n) & 0xffff;
+ sum1 = (sum1 >> 16) + (sum1 & 0xffff);
+ /* Again */
+ sum1 = (sum1 >> 16) + (sum1 & 0xffff);
+ sumshort = ~(u_short)sum1;
+ *(sp) = htons(sumshort);
+}
+
+
+/*
+ * fix_datacksum is used *only* for the adjustments of checksums in the data
+ * section of an IP packet.
+ *
+ * The only situation in which you need to do this is when NAT'ing an
+ * ICMP error message. Such a message, contains in its body the IP header
+ * of the original IP packet, that causes the error.
+ *
+ * You can't use fix_incksum or fix_outcksum in that case, because for the
+ * kernel the data section of the ICMP error is just data, and no special
+ * processing like hardware cksum or ntohs processing have been done by the
+ * kernel on the data section.
+ */
+void fix_datacksum(sp, n)
+u_short *sp;
+u_32_t n;
+{
+ register u_short sumshort;
+ register u_32_t sum1;
+
+ if (!n)
+ return;
+
+ sum1 = (~ntohs(*sp)) & 0xffff;
+ sum1 += (n);
+ sum1 = (sum1 >> 16) + (sum1 & 0xffff);
+ /* Again */
+ sum1 = (sum1 >> 16) + (sum1 & 0xffff);
+ sumshort = ~(u_short)sum1;
+ *(sp) = htons(sumshort);
+}
+
+/*
+ * How the NAT is organised and works.
+ *
+ * Inside (interface y) NAT Outside (interface x)
+ * -------------------- -+- -------------------------------------
+ * Packet going | out, processsed by ip_natout() for x
+ * ------------> | ------------>
+ * src=10.1.1.1 | src=192.1.1.1
+ * |
+ * | in, processed by ip_natin() for x
+ * <------------ | <------------
+ * dst=10.1.1.1 | dst=192.1.1.1
+ * -------------------- -+- -------------------------------------
+ * ip_natout() - changes ip_src and if required, sport
+ * - creates a new mapping, if required.
+ * ip_natin() - changes ip_dst and if required, dport
+ *
+ * In the NAT table, internal source is recorded as "in" and externally
+ * seen as "out".
+ */
+
+/*
+ * Handle ioctls which manipulate the NAT.
+ */
+int nat_ioctl(data, cmd, mode)
+#if defined(__NetBSD__) || defined(__OpenBSD__) || (__FreeBSD_version >= 300003)
+u_long cmd;
+#else
+int cmd;
+#endif
+caddr_t data;
+int mode;
+{
+ register ipnat_t *nat, *nt, *n = NULL, **np = NULL;
+ int error = 0, ret, arg;
+ ipnat_t natd;
+ u_32_t i, j;
+
+#if (BSD >= 199306) && defined(_KERNEL)
+ if ((securelevel >= 2) && (mode & FWRITE))
+ return EPERM;
+#endif
+
+ nat = NULL; /* XXX gcc -Wuninitialized */
+ KMALLOC(nt, ipnat_t *);
+ if ((cmd == SIOCADNAT) || (cmd == SIOCRMNAT))
+ error = IRCOPYPTR(data, (char *)&natd, sizeof(natd));
+ else if (cmd == SIOCIPFFL) { /* SIOCFLNAT & SIOCCNATL */
+ error = IRCOPY(data, (char *)&arg, sizeof(arg));
+ if (error)
+ error = EFAULT;
+ }
+
+ if (error)
+ goto done;
+
+ /*
+ * For add/delete, look to see if the NAT entry is already present
+ */
+ WRITE_ENTER(&ipf_nat);
+ if ((cmd == SIOCADNAT) || (cmd == SIOCRMNAT)) {
+ nat = &natd;
+ nat->in_flags &= IPN_USERFLAGS;
+ if ((nat->in_redir & NAT_MAPBLK) == 0) {
+ if ((nat->in_flags & IPN_SPLIT) == 0)
+ nat->in_inip &= nat->in_inmsk;
+ if ((nat->in_flags & IPN_IPRANGE) == 0)
+ nat->in_outip &= nat->in_outmsk;
+ }
+ for (np = &nat_list; (n = *np); np = &n->in_next)
+ if (!bcmp((char *)&nat->in_flags, (char *)&n->in_flags,
+ IPN_CMPSIZ))
+ break;
+ }
+
+ switch (cmd)
+ {
+#ifdef IPFILTER_LOG
+ case SIOCIPFFB :
+ {
+ int tmp;
+
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+ tmp = ipflog_clear(IPL_LOGNAT);
+ IWCOPY((char *)&tmp, (char *)data, sizeof(tmp));
+ }
+ break;
+ }
+#endif
+ case SIOCADNAT :
+ if (!(mode & FWRITE)) {
+ error = EPERM;
+ break;
+ }
+ if (n) {
+ error = EEXIST;
+ break;
+ }
+ if (nt == NULL) {
+ error = ENOMEM;
+ break;
+ }
+ n = nt;
+ nt = NULL;
+ bcopy((char *)nat, (char *)n, sizeof(*n));
+ n->in_ifp = (void *)GETUNIT(n->in_ifname, 4);
+ if (!n->in_ifp)
+ n->in_ifp = (void *)-1;
+ if (n->in_plabel[0] != '\0') {
+ n->in_apr = appr_match(n->in_p, n->in_plabel);
+ if (!n->in_apr) {
+ error = ENOENT;
+ break;
+ }
+ }
+ n->in_next = NULL;
+ *np = n;
+
+ if (n->in_redir & NAT_REDIRECT) {
+ n->in_flags &= ~IPN_NOTDST;
+ nat_addrdr(n);
+ }
+ if (n->in_redir & (NAT_MAP|NAT_MAPBLK)) {
+ n->in_flags &= ~IPN_NOTSRC;
+ nat_addnat(n);
+ }
+
+ n->in_use = 0;
+ if (n->in_redir & NAT_MAPBLK)
+ n->in_space = USABLE_PORTS * ~ntohl(n->in_outmsk);
+ else if (n->in_flags & IPN_AUTOPORTMAP)
+ n->in_space = USABLE_PORTS * ~ntohl(n->in_inmsk);
+ else if (n->in_flags & IPN_IPRANGE)
+ n->in_space = ntohl(n->in_outmsk) - ntohl(n->in_outip);
+ else if (n->in_flags & IPN_SPLIT)
+ n->in_space = 2;
+ else
+ n->in_space = ~ntohl(n->in_outmsk);
+ /*
+ * Calculate the number of valid IP addresses in the output
+ * mapping range. In all cases, the range is inclusive of
+ * the start and ending IP addresses.
+ * If to a CIDR address, lose 2: broadcast + network address
+ * (so subtract 1)
+ * If to a range, add one.
+ * If to a single IP address, set to 1.
+ */
+ if (n->in_space) {
+ if ((n->in_flags & IPN_IPRANGE) != 0)
+ n->in_space += 1;
+ else
+ n->in_space -= 1;
+ } else
+ n->in_space = 1;
+ if ((n->in_outmsk != 0xffffffff) && (n->in_outmsk != 0) &&
+ ((n->in_flags & (IPN_IPRANGE|IPN_SPLIT)) == 0))
+ n->in_nip = ntohl(n->in_outip) + 1;
+ else if ((n->in_flags & IPN_SPLIT) &&
+ (n->in_redir & NAT_REDIRECT))
+ n->in_nip = ntohl(n->in_inip);
+ else
+ n->in_nip = ntohl(n->in_outip);
+ if (n->in_redir & NAT_MAP) {
+ n->in_pnext = ntohs(n->in_pmin);
+ /*
+ * Multiply by the number of ports made available.
+ */
+ if (ntohs(n->in_pmax) >= ntohs(n->in_pmin)) {
+ n->in_space *= (ntohs(n->in_pmax) -
+ ntohs(n->in_pmin) + 1);
+ /*
+ * Because two different sources can map to
+ * different destinations but use the same
+ * local IP#/port #.
+ * If the result is smaller than in_space, then
+ * we may have wrapped around 32bits.
+ */
+ i = n->in_inmsk;
+ if ((i != 0) && (i != 0xffffffff)) {
+ j = n->in_space * (~ntohl(i) + 1);
+ if (j >= n->in_space)
+ n->in_space = j;
+ else
+ n->in_space = 0xffffffff;
+ }
+ }
+ /*
+ * If no protocol is specified, multiple by 256.
+ */
+ if ((n->in_flags & IPN_TCPUDP) == 0) {
+ j = n->in_space * 256;
+ if (j >= n->in_space)
+ n->in_space = j;
+ else
+ n->in_space = 0xffffffff;
+ }
+ }
+ /* Otherwise, these fields are preset */
+ n = NULL;
+ nat_stats.ns_rules++;
+ break;
+ case SIOCRMNAT :
+ if (!(mode & FWRITE)) {
+ error = EPERM;
+ n = NULL;
+ break;
+ }
+ if (!n) {
+ error = ESRCH;
+ break;
+ }
+ if (n->in_redir & NAT_REDIRECT)
+ nat_delrdr(n);
+ if (n->in_redir & (NAT_MAPBLK|NAT_MAP))
+ nat_delnat(n);
+ if (nat_list == NULL) {
+ nat_masks = 0;
+ rdr_masks = 0;
+ }
+ *np = n->in_next;
+ if (!n->in_use) {
+ if (n->in_apr)
+ appr_free(n->in_apr);
+ KFREE(n);
+ nat_stats.ns_rules--;
+ } else {
+ n->in_flags |= IPN_DELETE;
+ n->in_next = NULL;
+ }
+ n = NULL;
+ break;
+ case SIOCGNATS :
+ MUTEX_DOWNGRADE(&ipf_nat);
+ nat_stats.ns_table[0] = nat_table[0];
+ nat_stats.ns_table[1] = nat_table[1];
+ nat_stats.ns_list = nat_list;
+ nat_stats.ns_nattab_sz = ipf_nattable_sz;
+ nat_stats.ns_rultab_sz = ipf_natrules_sz;
+ nat_stats.ns_rdrtab_sz = ipf_rdrrules_sz;
+ nat_stats.ns_instances = nat_instances;
+ nat_stats.ns_apslist = ap_sess_list;
+ error = IWCOPYPTR((char *)&nat_stats, (char *)data,
+ sizeof(nat_stats));
+ break;
+ case SIOCGNATL :
+ {
+ natlookup_t nl;
+
+ MUTEX_DOWNGRADE(&ipf_nat);
+ error = IRCOPYPTR((char *)data, (char *)&nl, sizeof(nl));
+ if (error)
+ break;
+
+ if (nat_lookupredir(&nl)) {
+ error = IWCOPYPTR((char *)&nl, (char *)data,
+ sizeof(nl));
+ } else
+ error = ESRCH;
+ break;
+ }
+ case SIOCIPFFL : /* old SIOCFLNAT & SIOCCNATL */
+ if (!(mode & FWRITE)) {
+ error = EPERM;
+ break;
+ }
+ error = 0;
+ if (arg == 0)
+ ret = nat_flushtable();
+ else if (arg == 1)
+ ret = nat_clearlist();
+ else
+ error = EINVAL;
+ MUTEX_DOWNGRADE(&ipf_nat);
+ if (!error) {
+ error = IWCOPY((caddr_t)&ret, data, sizeof(ret));
+ if (error)
+ error = EFAULT;
+ }
+ break;
+ case SIOCSTLCK :
+ error = IRCOPY(data, (caddr_t)&arg, sizeof(arg));
+ if (!error) {
+ error = IWCOPY((caddr_t)&fr_nat_lock, data,
+ sizeof(fr_nat_lock));
+ if (!error)
+ fr_nat_lock = arg;
+ } else
+ error = EFAULT;
+ break;
+ case SIOCSTPUT :
+ if (fr_nat_lock)
+ error = fr_natputent(data);
+ else
+ error = EACCES;
+ break;
+ case SIOCSTGSZ :
+ if (fr_nat_lock)
+ error = fr_natgetsz(data);
+ else
+ error = EACCES;
+ break;
+ case SIOCSTGET :
+ if (fr_nat_lock)
+ error = fr_natgetent(data);
+ else
+ error = EACCES;
+ break;
+ case FIONREAD :
+#ifdef IPFILTER_LOG
+ arg = (int)iplused[IPL_LOGNAT];
+ MUTEX_DOWNGRADE(&ipf_nat);
+ error = IWCOPY((caddr_t)&arg, (caddr_t)data, sizeof(arg));
+ if (error)
+ error = EFAULT;
+#endif
+ break;
+ default :
+ error = EINVAL;
+ break;
+ }
+ RWLOCK_EXIT(&ipf_nat); /* READ/WRITE */
+done:
+ if (nt)
+ KFREE(nt);
+ return error;
+}
+
+
+static int fr_natgetsz(data)
+caddr_t data;
+{
+ ap_session_t *aps;
+ nat_t *nat, *n;
+ int error = 0;
+ natget_t ng;
+
+ error = IRCOPY(data, (caddr_t)&ng, sizeof(ng));
+ if (error)
+ return EFAULT;
+
+ nat = ng.ng_ptr;
+ if (!nat) {
+ nat = nat_instances;
+ ng.ng_sz = 0;
+ if (nat == NULL) {
+ error = IWCOPY((caddr_t)&ng, data, sizeof(ng));
+ if (error)
+ error = EFAULT;
+ return error;
+ }
+ } else {
+ /*
+ * Make sure the pointer we're copying from exists in the
+ * current list of entries. Security precaution to prevent
+ * copying of random kernel data.
+ */
+ for (n = nat_instances; n; n = n->nat_next)
+ if (n == nat)
+ break;
+ if (!n)
+ return ESRCH;
+ }
+
+ ng.ng_sz = sizeof(nat_save_t);
+ aps = nat->nat_aps;
+ if ((aps != NULL) && (aps->aps_data != 0)) {
+ ng.ng_sz += sizeof(ap_session_t);
+ ng.ng_sz += aps->aps_psiz;
+ }
+
+ error = IWCOPY((caddr_t)&ng, data, sizeof(ng));
+ if (error)
+ error = EFAULT;
+ return error;
+}
+
+
+static int fr_natgetent(data)
+caddr_t data;
+{
+ nat_save_t ipn, *ipnp, *ipnn = NULL;
+ register nat_t *n, *nat;
+ ap_session_t *aps;
+ int error;
+
+ error = IRCOPY(data, (caddr_t)&ipnp, sizeof(ipnp));
+ if (error)
+ return EFAULT;
+ error = IRCOPY((caddr_t)ipnp, (caddr_t)&ipn, sizeof(ipn));
+ if (error)
+ return EFAULT;
+
+ nat = ipn.ipn_next;
+ if (!nat) {
+ nat = nat_instances;
+ if (nat == NULL) {
+ if (nat_instances == NULL)
+ return ENOENT;
+ return 0;
+ }
+ } else {
+ /*
+ * Make sure the pointer we're copying from exists in the
+ * current list of entries. Security precaution to prevent
+ * copying of random kernel data.
+ */
+ for (n = nat_instances; n; n = n->nat_next)
+ if (n == nat)
+ break;
+ if (!n)
+ return ESRCH;
+ }
+
+ ipn.ipn_next = nat->nat_next;
+ ipn.ipn_dsize = 0;
+ bcopy((char *)nat, (char *)&ipn.ipn_nat, sizeof(ipn.ipn_nat));
+ ipn.ipn_nat.nat_data = NULL;
+
+ if (nat->nat_ptr) {
+ bcopy((char *)nat->nat_ptr, (char *)&ipn.ipn_ipnat,
+ sizeof(ipn.ipn_ipnat));
+ }
+
+ if (nat->nat_fr)
+ bcopy((char *)nat->nat_fr, (char *)&ipn.ipn_rule,
+ sizeof(ipn.ipn_rule));
+
+ if ((aps = nat->nat_aps)) {
+ ipn.ipn_dsize = sizeof(*aps);
+ if (aps->aps_data)
+ ipn.ipn_dsize += aps->aps_psiz;
+ KMALLOCS(ipnn, nat_save_t *, sizeof(*ipnn) + ipn.ipn_dsize);
+ if (ipnn == NULL)
+ return ENOMEM;
+ bcopy((char *)&ipn, (char *)ipnn, sizeof(ipn));
+
+ bcopy((char *)aps, ipnn->ipn_data, sizeof(*aps));
+ if (aps->aps_data) {
+ bcopy(aps->aps_data, ipnn->ipn_data + sizeof(*aps),
+ aps->aps_psiz);
+ ipnn->ipn_dsize += aps->aps_psiz;
+ }
+ error = IWCOPY((caddr_t)ipnn, ipnp,
+ sizeof(ipn) + ipn.ipn_dsize);
+ if (error)
+ error = EFAULT;
+ KFREES(ipnn, sizeof(*ipnn) + ipn.ipn_dsize);
+ } else {
+ error = IWCOPY((caddr_t)&ipn, ipnp, sizeof(ipn));
+ if (error)
+ error = EFAULT;
+ }
+ return error;
+}
+
+
+static int fr_natputent(data)
+caddr_t data;
+{
+ nat_save_t ipn, *ipnp, *ipnn = NULL;
+ register nat_t *n, *nat;
+ ap_session_t *aps;
+ frentry_t *fr;
+ ipnat_t *in;
+
+ int error;
+
+ error = IRCOPY(data, (caddr_t)&ipnp, sizeof(ipnp));
+ if (error)
+ return EFAULT;
+ error = IRCOPY((caddr_t)ipnp, (caddr_t)&ipn, sizeof(ipn));
+ if (error)
+ return EFAULT;
+ nat = NULL;
+ if (ipn.ipn_dsize) {
+ KMALLOCS(ipnn, nat_save_t *, sizeof(ipn) + ipn.ipn_dsize);
+ if (ipnn == NULL)
+ return ENOMEM;
+ bcopy((char *)&ipn, (char *)ipnn, sizeof(ipn));
+ error = IRCOPY((caddr_t)ipnp, (caddr_t)ipn.ipn_data,
+ ipn.ipn_dsize);
+ if (error) {
+ error = EFAULT;
+ goto junkput;
+ }
+ } else
+ ipnn = NULL;
+
+ KMALLOC(nat, nat_t *);
+ if (nat == NULL) {
+ error = EFAULT;
+ goto junkput;
+ }
+
+ bcopy((char *)&ipn.ipn_nat, (char *)nat, sizeof(*nat));
+ /*
+ * Initialize all these so that nat_delete() doesn't cause a crash.
+ */
+ nat->nat_phnext[0] = NULL;
+ nat->nat_phnext[1] = NULL;
+ fr = nat->nat_fr;
+ nat->nat_fr = NULL;
+ aps = nat->nat_aps;
+ nat->nat_aps = NULL;
+ in = nat->nat_ptr;
+ nat->nat_ptr = NULL;
+ nat->nat_data = NULL;
+
+ /*
+ * Restore the rule associated with this nat session
+ */
+ if (in) {
+ KMALLOC(in, ipnat_t *);
+ if (in == NULL) {
+ error = ENOMEM;
+ goto junkput;
+ }
+ nat->nat_ptr = in;
+ bcopy((char *)&ipn.ipn_ipnat, (char *)in, sizeof(*in));
+ in->in_use = 1;
+ in->in_flags |= IPN_DELETE;
+ in->in_next = NULL;
+ in->in_rnext = NULL;
+ in->in_prnext = NULL;
+ in->in_mnext = NULL;
+ in->in_pmnext = NULL;
+ in->in_ifp = GETUNIT(in->in_ifname, 4);
+ if (in->in_plabel[0] != '\0') {
+ in->in_apr = appr_match(in->in_p, in->in_plabel);
+ }
+ }
+
+ /*
+ * Restore ap_session_t structure. Include the private data allocated
+ * if it was there.
+ */
+ if (aps) {
+ KMALLOC(aps, ap_session_t *);
+ if (aps == NULL) {
+ error = ENOMEM;
+ goto junkput;
+ }
+ nat->nat_aps = aps;
+ aps->aps_next = ap_sess_list;
+ ap_sess_list = aps;
+ bcopy(ipnn->ipn_data, (char *)aps, sizeof(*aps));
+ if (in)
+ aps->aps_apr = in->in_apr;
+ if (aps->aps_psiz) {
+ KMALLOCS(aps->aps_data, void *, aps->aps_psiz);
+ if (aps->aps_data == NULL) {
+ error = ENOMEM;
+ goto junkput;
+ }
+ bcopy(ipnn->ipn_data + sizeof(*aps), aps->aps_data,
+ aps->aps_psiz);
+ } else {
+ aps->aps_psiz = 0;
+ aps->aps_data = NULL;
+ }
+ }
+
+ /*
+ * If there was a filtering rule associated with this entry then
+ * build up a new one.
+ */
+ if (fr != NULL) {
+ if (nat->nat_flags & FI_NEWFR) {
+ KMALLOC(fr, frentry_t *);
+ nat->nat_fr = fr;
+ if (fr == NULL) {
+ error = ENOMEM;
+ goto junkput;
+ }
+ bcopy((char *)&ipn.ipn_fr, (char *)fr, sizeof(*fr));
+ ipn.ipn_nat.nat_fr = fr;
+ error = IWCOPY((caddr_t)&ipn, ipnp, sizeof(ipn));
+ if (error) {
+ error = EFAULT;
+ goto junkput;
+ }
+ } else {
+ for (n = nat_instances; n; n = n->nat_next)
+ if (n->nat_fr == fr)
+ break;
+ if (!n) {
+ error = ESRCH;
+ goto junkput;
+ }
+ }
+ }
+
+ if (ipnn)
+ KFREES(ipnn, sizeof(ipn) + ipn.ipn_dsize);
+ nat_insert(nat);
+ return 0;
+junkput:
+ if (ipnn)
+ KFREES(ipnn, sizeof(ipn) + ipn.ipn_dsize);
+ if (nat)
+ nat_delete(nat);
+ return error;
+}
+
+
+/*
+ * Delete a nat entry from the various lists and table.
+ */
+static void nat_delete(natd)
+struct nat *natd;
+{
+ struct ipnat *ipn;
+
+ if (natd->nat_flags & FI_WILDP)
+ nat_stats.ns_wilds--;
+ if (natd->nat_hnext[0])
+ natd->nat_hnext[0]->nat_phnext[0] = natd->nat_phnext[0];
+ *natd->nat_phnext[0] = natd->nat_hnext[0];
+ if (natd->nat_hnext[1])
+ natd->nat_hnext[1]->nat_phnext[1] = natd->nat_phnext[1];
+ *natd->nat_phnext[1] = natd->nat_hnext[1];
+
+ if (natd->nat_fr != NULL) {
+ ATOMIC_DEC32(natd->nat_fr->fr_ref);
+ }
+
+ if (natd->nat_hm != NULL)
+ nat_hostmapdel(natd->nat_hm);
+
+ /*
+ * If there is an active reference from the nat entry to its parent
+ * rule, decrement the rule's reference count and free it too if no
+ * longer being used.
+ */
+ ipn = natd->nat_ptr;
+ if (ipn != NULL) {
+ ipn->in_space++;
+ ipn->in_use--;
+ if (!ipn->in_use && (ipn->in_flags & IPN_DELETE)) {
+ if (ipn->in_apr)
+ appr_free(ipn->in_apr);
+ KFREE(ipn);
+ nat_stats.ns_rules--;
+ }
+ }
+
+ MUTEX_DESTROY(&natd->nat_lock);
+ /*
+ * If there's a fragment table entry too for this nat entry, then
+ * dereference that as well.
+ */
+ ipfr_forget((void *)natd);
+ aps_free(natd->nat_aps);
+ nat_stats.ns_inuse--;
+ KFREE(natd);
+}
+
+
+/*
+ * nat_flushtable - clear the NAT table of all mapping entries.
+ */
+static int nat_flushtable()
+{
+ register nat_t *nat, **natp;
+ register int j = 0;
+
+ /*
+ * ALL NAT mappings deleted, so lets just make the deletions
+ * quicker.
+ */
+ if (nat_table[0] != NULL)
+ bzero((char *)nat_table[0],
+ sizeof(nat_table[0]) * ipf_nattable_sz);
+ if (nat_table[1] != NULL)
+ bzero((char *)nat_table[1],
+ sizeof(nat_table[1]) * ipf_nattable_sz);
+
+ for (natp = &nat_instances; (nat = *natp); ) {
+ *natp = nat->nat_next;
+#ifdef IPFILTER_LOG
+ nat_log(nat, NL_FLUSH);
+#endif
+ nat_delete(nat);
+ j++;
+ }
+ nat_stats.ns_inuse = 0;
+ return j;
+}
+
+
+/*
+ * nat_clearlist - delete all rules in the active NAT mapping list.
+ */
+static int nat_clearlist()
+{
+ register ipnat_t *n, **np = &nat_list;
+ int i = 0;
+
+ if (nat_rules != NULL)
+ bzero((char *)nat_rules, sizeof(*nat_rules) * ipf_natrules_sz);
+ if (rdr_rules != NULL)
+ bzero((char *)rdr_rules, sizeof(*rdr_rules) * ipf_rdrrules_sz);
+
+ while ((n = *np)) {
+ *np = n->in_next;
+ if (!n->in_use) {
+ if (n->in_apr)
+ appr_free(n->in_apr);
+ KFREE(n);
+ nat_stats.ns_rules--;
+ } else {
+ n->in_flags |= IPN_DELETE;
+ n->in_next = NULL;
+ }
+ i++;
+ }
+ nat_masks = 0;
+ rdr_masks = 0;
+ return i;
+}
+
+
+/*
+ * Create a new NAT table entry.
+ * NOTE: assumes write lock on ipf_nat has been obtained already.
+ */
+nat_t *nat_new(np, ip, fin, flags, direction)
+ipnat_t *np;
+ip_t *ip;
+fr_info_t *fin;
+u_int flags;
+int direction;
+{
+ register u_32_t sum1, sum2, sumd, l;
+ u_short port = 0, sport = 0, dport = 0, nport = 0;
+ struct in_addr in, inb;
+ tcphdr_t *tcp = NULL;
+ hostmap_t *hm = NULL;
+ nat_t *nat, *natl;
+ u_short nflags;
+#if SOLARIS && defined(_KERNEL) && (SOLARIS2 >= 6)
+ qif_t *qf = fin->fin_qif;
+#endif
+
+ nflags = flags & np->in_flags;
+ if (flags & IPN_TCPUDP) {
+ tcp = (tcphdr_t *)fin->fin_dp;
+ sport = tcp->th_sport;
+ dport = tcp->th_dport;
+ }
+
+ /* Give me a new nat */
+ KMALLOC(nat, nat_t *);
+ if (nat == NULL) {
+ nat_stats.ns_memfail++;
+ return NULL;
+ }
+
+ bzero((char *)nat, sizeof(*nat));
+ nat->nat_flags = flags;
+ if (flags & FI_WILDP)
+ nat_stats.ns_wilds++;
+ /*
+ * Search the current table for a match.
+ */
+ if (direction == NAT_OUTBOUND) {
+ /*
+ * Values at which the search for a free resouce starts.
+ */
+ u_32_t st_ip;
+ u_short st_port;
+
+ /*
+ * If it's an outbound packet which doesn't match any existing
+ * record, then create a new port
+ */
+ l = 0;
+ st_ip = np->in_nip;
+ st_port = np->in_pnext;
+
+ do {
+ port = 0;
+ in.s_addr = htonl(np->in_nip);
+ if (l == 0) {
+ /*
+ * Check to see if there is an existing NAT
+ * setup for this IP address pair.
+ */
+ hm = nat_hostmap(np, ip->ip_src, in);
+ if (hm != NULL)
+ in.s_addr = hm->hm_mapip.s_addr;
+ } else if ((l == 1) && (hm != NULL)) {
+ nat_hostmapdel(hm);
+ hm = NULL;
+ }
+ in.s_addr = ntohl(in.s_addr);
+
+ nat->nat_hm = hm;
+
+ if ((np->in_outmsk == 0xffffffff) &&
+ (np->in_pnext == 0)) {
+ if (l > 0)
+ goto badnat;
+ }
+
+ if (np->in_redir & NAT_MAPBLK) {
+ if ((l >= np->in_ppip) || ((l > 0) &&
+ !(flags & IPN_TCPUDP)))
+ goto badnat;
+ /*
+ * map-block - Calculate destination address.
+ */
+ in.s_addr = ntohl(ip->ip_src.s_addr);
+ in.s_addr &= ntohl(~np->in_inmsk);
+ inb.s_addr = in.s_addr;
+ in.s_addr /= np->in_ippip;
+ in.s_addr &= ntohl(~np->in_outmsk);
+ in.s_addr += ntohl(np->in_outip);
+ /*
+ * Calculate destination port.
+ */
+ if ((flags & IPN_TCPUDP) &&
+ (np->in_ppip != 0)) {
+ port = ntohs(sport) + l;
+ port %= np->in_ppip;
+ port += np->in_ppip *
+ (inb.s_addr % np->in_ippip);
+ port += MAPBLK_MINPORT;
+ port = htons(port);
+ }
+ } else if (!np->in_outip &&
+ (np->in_outmsk == 0xffffffff)) {
+ /*
+ * 0/32 - use the interface's IP address.
+ */
+ if ((l > 0) ||
+ fr_ifpaddr(4, fin->fin_ifp, &in) == -1)
+ goto badnat;
+ in.s_addr = ntohl(in.s_addr);
+ } else if (!np->in_outip && !np->in_outmsk) {
+ /*
+ * 0/0 - use the original source address/port.
+ */
+ if (l > 0)
+ goto badnat;
+ in.s_addr = ntohl(ip->ip_src.s_addr);
+ } else if ((np->in_outmsk != 0xffffffff) &&
+ (np->in_pnext == 0) &&
+ ((l > 0) || (hm == NULL)))
+ np->in_nip++;
+ natl = NULL;
+
+ if ((nflags & IPN_TCPUDP) &&
+ ((np->in_redir & NAT_MAPBLK) == 0) &&
+ (np->in_flags & IPN_AUTOPORTMAP)) {
+ if ((l > 0) && (l % np->in_ppip == 0)) {
+ if (l > np->in_space) {
+ goto badnat;
+ } else if ((l > np->in_ppip) &&
+ np->in_outmsk != 0xffffffff)
+ np->in_nip++;
+ }
+ if (np->in_ppip != 0) {
+ port = ntohs(sport);
+ port += (l % np->in_ppip);
+ port %= np->in_ppip;
+ port += np->in_ppip *
+ (ntohl(ip->ip_src.s_addr) %
+ np->in_ippip);
+ port += MAPBLK_MINPORT;
+ port = htons(port);
+ }
+ } else if (((np->in_redir & NAT_MAPBLK) == 0) &&
+ (nflags & IPN_TCPUDP) &&
+ (np->in_pnext != 0)) {
+ port = htons(np->in_pnext++);
+ if (np->in_pnext > ntohs(np->in_pmax)) {
+ np->in_pnext = ntohs(np->in_pmin);
+ if (np->in_outmsk != 0xffffffff)
+ np->in_nip++;
+ }
+ }
+
+ if (np->in_flags & IPN_IPRANGE) {
+ if (np->in_nip > ntohl(np->in_outmsk))
+ np->in_nip = ntohl(np->in_outip);
+ } else {
+ if ((np->in_outmsk != 0xffffffff) &&
+ ((np->in_nip + 1) & ntohl(np->in_outmsk)) >
+ ntohl(np->in_outip))
+ np->in_nip = ntohl(np->in_outip) + 1;
+ }
+
+ if (!port && (flags & IPN_TCPUDP))
+ port = sport;
+
+ /*
+ * Here we do a lookup of the connection as seen from
+ * the outside. If an IP# pair already exists, try
+ * again. So if you have A->B becomes C->B, you can
+ * also have D->E become C->E but not D->B causing
+ * another C->B. Also take protocol and ports into
+ * account when determining whether a pre-existing
+ * NAT setup will cause an external conflict where
+ * this is appropriate.
+ */
+ inb.s_addr = htonl(in.s_addr);
+ natl = nat_inlookup(fin->fin_ifp, flags & ~FI_WILDP,
+ (u_int)ip->ip_p, ip->ip_dst, inb,
+ (port << 16) | dport, 1);
+
+ /*
+ * Has the search wrapped around and come back to the
+ * start ?
+ */
+ if ((natl != NULL) &&
+ (np->in_pnext != 0) && (st_port == np->in_pnext) &&
+ (np->in_nip != 0) && (st_ip == np->in_nip))
+ goto badnat;
+ l++;
+ } while (natl != NULL);
+
+ if (np->in_space > 0)
+ np->in_space--;
+
+ /* Setup the NAT table */
+ nat->nat_inip = ip->ip_src;
+ nat->nat_outip.s_addr = htonl(in.s_addr);
+ nat->nat_oip = ip->ip_dst;
+ if (nat->nat_hm == NULL)
+ nat->nat_hm = nat_hostmap(np, ip->ip_src,
+ nat->nat_outip);
+
+ sum1 = LONG_SUM(ntohl(ip->ip_src.s_addr)) + ntohs(sport);
+ sum2 = LONG_SUM(in.s_addr) + ntohs(port);
+
+ if (flags & IPN_TCPUDP) {
+ nat->nat_inport = sport;
+ nat->nat_outport = port; /* sport */
+ nat->nat_oport = dport;
+ }
+ } else {
+ /*
+ * Otherwise, it's an inbound packet. Most likely, we don't
+ * want to rewrite source ports and source addresses. Instead,
+ * we want to rewrite to a fixed internal address and fixed
+ * internal port.
+ */
+ if (np->in_flags & IPN_SPLIT) {
+ in.s_addr = np->in_nip;
+ if (np->in_inip == htonl(in.s_addr))
+ np->in_nip = ntohl(np->in_inmsk);
+ else {
+ np->in_nip = ntohl(np->in_inip);
+ if (np->in_flags & IPN_ROUNDR) {
+ nat_delrdr(np);
+ nat_addrdr(np);
+ }
+ }
+ } else {
+ in.s_addr = ntohl(np->in_inip);
+ if (np->in_flags & IPN_ROUNDR) {
+ nat_delrdr(np);
+ nat_addrdr(np);
+ }
+ }
+ if (!np->in_pnext)
+ nport = dport;
+ else {
+ /*
+ * Whilst not optimized for the case where
+ * pmin == pmax, the gain is not significant.
+ */
+ nport = ntohs(dport) - ntohs(np->in_pmin) +
+ ntohs(np->in_pnext);
+ nport = htons(nport);
+ }
+
+ /*
+ * When the redirect-to address is set to 0.0.0.0, just
+ * assume a blank `forwarding' of the packet. We don't
+ * setup any translation for this either.
+ */
+ if (in.s_addr == 0) {
+ if (nport == dport)
+ goto badnat;
+ in.s_addr = ntohl(ip->ip_dst.s_addr);
+ }
+
+ nat->nat_inip.s_addr = htonl(in.s_addr);
+ nat->nat_outip = ip->ip_dst;
+ nat->nat_oip = ip->ip_src;
+
+ sum1 = LONG_SUM(ntohl(ip->ip_dst.s_addr)) + ntohs(dport);
+ sum2 = LONG_SUM(in.s_addr) + ntohs(nport);
+
+ if (flags & IPN_TCPUDP) {
+ nat->nat_inport = nport;
+ nat->nat_outport = dport;
+ nat->nat_oport = sport;
+ }
+ }
+
+ CALC_SUMD(sum1, sum2, sumd);
+ nat->nat_sumd[0] = (sumd & 0xffff) + (sumd >> 16);
+#if SOLARIS && defined(_KERNEL) && (SOLARIS2 >= 6)
+ if ((flags == IPN_TCP) && dohwcksum &&
+ (qf->qf_ill->ill_ick.ick_magic == ICK_M_CTL_MAGIC)) {
+ if (direction == NAT_OUTBOUND)
+ sum1 = LONG_SUM(ntohl(in.s_addr));
+ else
+ sum1 = LONG_SUM(ntohl(ip->ip_src.s_addr));
+ sum1 += LONG_SUM(ntohl(ip->ip_dst.s_addr));
+ sum1 += 30;
+ sum1 = (sum1 & 0xffff) + (sum1 >> 16);
+ nat->nat_sumd[1] = NAT_HW_CKSUM|(sum1 & 0xffff);
+ } else
+#endif
+ nat->nat_sumd[1] = nat->nat_sumd[0];
+
+ if ((flags & IPN_TCPUDP) && ((sport != port) || (dport != nport))) {
+ if (direction == NAT_OUTBOUND)
+ sum1 = LONG_SUM(ntohl(ip->ip_src.s_addr));
+ else
+ sum1 = LONG_SUM(ntohl(ip->ip_dst.s_addr));
+
+ sum2 = LONG_SUM(in.s_addr);
+
+ CALC_SUMD(sum1, sum2, sumd);
+ nat->nat_ipsumd = (sumd & 0xffff) + (sumd >> 16);
+ } else
+ nat->nat_ipsumd = nat->nat_sumd[0];
+
+ in.s_addr = htonl(in.s_addr);
+
+#ifdef _KERNEL
+ strncpy(nat->nat_ifname, IFNAME(fin->fin_ifp), IFNAMSIZ);
+#endif
+ nat_insert(nat);
+
+ nat->nat_dir = direction;
+ nat->nat_ifp = fin->fin_ifp;
+ nat->nat_ptr = np;
+ nat->nat_p = ip->ip_p;
+ nat->nat_bytes = 0;
+ nat->nat_pkts = 0;
+ nat->nat_fr = fin->fin_fr;
+ if (nat->nat_fr != NULL) {
+ ATOMIC_INC32(nat->nat_fr->fr_ref);
+ }
+ if (direction == NAT_OUTBOUND) {
+ if (flags & IPN_TCPUDP)
+ tcp->th_sport = port;
+ } else {
+ if (flags & IPN_TCPUDP)
+ tcp->th_dport = nport;
+ }
+ np->in_use++;
+#ifdef IPFILTER_LOG
+ nat_log(nat, (u_int)np->in_redir);
+#endif
+ return nat;
+badnat:
+ nat_stats.ns_badnat++;
+ if ((hm = nat->nat_hm) != NULL)
+ nat_hostmapdel(hm);
+ KFREE(nat);
+ return NULL;
+}
+
+
+void nat_insert(nat)
+nat_t *nat;
+{
+ nat_t **natp;
+ u_int hv;
+
+ MUTEX_INIT(&nat->nat_lock, "nat entry lock", NULL);
+
+ nat->nat_age = fr_defnatage;
+ nat->nat_ifname[sizeof(nat->nat_ifname) - 1] = '\0';
+ if (nat->nat_ifname[0] !='\0') {
+ nat->nat_ifp = GETUNIT(nat->nat_ifname, 4);
+ }
+
+ nat->nat_next = nat_instances;
+ nat_instances = nat;
+
+ hv = NAT_HASH_FN(nat->nat_inip.s_addr, nat->nat_inport,
+ ipf_nattable_sz);
+ natp = &nat_table[0][hv];
+ if (*natp)
+ (*natp)->nat_phnext[0] = &nat->nat_hnext[0];
+ nat->nat_phnext[0] = natp;
+ nat->nat_hnext[0] = *natp;
+ *natp = nat;
+
+ hv = NAT_HASH_FN(nat->nat_outip.s_addr, nat->nat_outport,
+ ipf_nattable_sz);
+ natp = &nat_table[1][hv];
+ if (*natp)
+ (*natp)->nat_phnext[1] = &nat->nat_hnext[1];
+ nat->nat_phnext[1] = natp;
+ nat->nat_hnext[1] = *natp;
+ *natp = nat;
+
+ nat_stats.ns_added++;
+ nat_stats.ns_inuse++;
+}
+
+
+nat_t *nat_icmplookup(ip, fin, dir)
+ip_t *ip;
+fr_info_t *fin;
+int dir;
+{
+ icmphdr_t *icmp;
+ tcphdr_t *tcp = NULL;
+ ip_t *oip;
+ int flags = 0, type, minlen;
+
+ icmp = (icmphdr_t *)fin->fin_dp;
+ /*
+ * Does it at least have the return (basic) IP header ?
+ * Only a basic IP header (no options) should be with an ICMP error
+ * header.
+ */
+ if ((ip->ip_hl != 5) || (ip->ip_len < ICMPERR_MINPKTLEN))
+ return NULL;
+ type = icmp->icmp_type;
+ /*
+ * If it's not an error type, then return.
+ */
+ if ((type != ICMP_UNREACH) && (type != ICMP_SOURCEQUENCH) &&
+ (type != ICMP_REDIRECT) && (type != ICMP_TIMXCEED) &&
+ (type != ICMP_PARAMPROB))
+ return NULL;
+
+ oip = (ip_t *)((char *)fin->fin_dp + 8);
+ minlen = (oip->ip_hl << 2);
+ if (minlen < sizeof(ip_t))
+ return NULL;
+ if (ip->ip_len < ICMPERR_IPICMPHLEN + minlen)
+ return NULL;
+ /*
+ * Is the buffer big enough for all of it ? It's the size of the IP
+ * header claimed in the encapsulated part which is of concern. It
+ * may be too big to be in this buffer but not so big that it's
+ * outside the ICMP packet, leading to TCP deref's causing problems.
+ * This is possible because we don't know how big oip_hl is when we
+ * do the pullup early in fr_check() and thus can't gaurantee it is
+ * all here now.
+ */
+#ifdef _KERNEL
+ {
+ mb_t *m;
+
+# if SOLARIS
+ m = fin->fin_qfm;
+ if ((char *)oip + fin->fin_dlen - ICMPERR_ICMPHLEN > (char *)m->b_wptr)
+ return NULL;
+# else
+ m = *(mb_t **)fin->fin_mp;
+ if ((char *)oip + fin->fin_dlen - ICMPERR_ICMPHLEN >
+ (char *)ip + m->m_len)
+ return NULL;
+# endif
+ }
+#endif
+
+ if (oip->ip_p == IPPROTO_TCP)
+ flags = IPN_TCP;
+ else if (oip->ip_p == IPPROTO_UDP)
+ flags = IPN_UDP;
+ if (flags & IPN_TCPUDP) {
+ minlen += 8; /* + 64bits of data to get ports */
+ if (ip->ip_len < ICMPERR_IPICMPHLEN + minlen)
+ return NULL;
+ tcp = (tcphdr_t *)((char *)oip + (oip->ip_hl << 2));
+ if (dir == NAT_INBOUND)
+ return nat_inlookup(fin->fin_ifp, flags,
+ (u_int)oip->ip_p, oip->ip_dst, oip->ip_src,
+ (tcp->th_sport << 16) | tcp->th_dport, 0);
+ else
+ return nat_outlookup(fin->fin_ifp, flags,
+ (u_int)oip->ip_p, oip->ip_dst, oip->ip_src,
+ (tcp->th_sport << 16) | tcp->th_dport, 0);
+ }
+ if (dir == NAT_INBOUND)
+ return nat_inlookup(fin->fin_ifp, 0, (u_int)oip->ip_p,
+ oip->ip_dst, oip->ip_src, 0, 0);
+ else
+ return nat_outlookup(fin->fin_ifp, 0, (u_int)oip->ip_p,
+ oip->ip_dst, oip->ip_src, 0, 0);
+}
+
+
+/*
+ * This should *ONLY* be used for incoming packets to make sure a NAT'd ICMP
+ * packet gets correctly recognised.
+ */
+nat_t *nat_icmp(ip, fin, nflags, dir)
+ip_t *ip;
+fr_info_t *fin;
+u_int *nflags;
+int dir;
+{
+ u_32_t sum1, sum2, sumd, sumd2 = 0;
+ struct in_addr in;
+ icmphdr_t *icmp;
+ udphdr_t *udp;
+ nat_t *nat;
+ ip_t *oip;
+ int flags = 0;
+
+ if ((fin->fin_fi.fi_fl & FI_SHORT) || (ip->ip_off & IP_OFFMASK))
+ return NULL;
+ /*
+ * nat_icmplookup() will return NULL for `defective' packets.
+ */
+ if ((ip->ip_v != 4) || !(nat = nat_icmplookup(ip, fin, dir)))
+ return NULL;
+ *nflags = IPN_ICMPERR;
+ icmp = (icmphdr_t *)fin->fin_dp;
+ oip = (ip_t *)&icmp->icmp_ip;
+ if (oip->ip_p == IPPROTO_TCP)
+ flags = IPN_TCP;
+ else if (oip->ip_p == IPPROTO_UDP)
+ flags = IPN_UDP;
+ udp = (udphdr_t *)((((char *)oip) + (oip->ip_hl << 2)));
+ /*
+ * Need to adjust ICMP header to include the real IP#'s and
+ * port #'s. Only apply a checksum change relative to the
+ * IP address change as it will be modified again in ip_natout
+ * for both address and port. Two checksum changes are
+ * necessary for the two header address changes. Be careful
+ * to only modify the checksum once for the port # and twice
+ * for the IP#.
+ */
+
+ /*
+ * Step 1
+ * Fix the IP addresses in the offending IP packet. You also need
+ * to adjust the IP header checksum of that offending IP packet
+ * and the ICMP checksum of the ICMP error message itself.
+ *
+ * Unfortunately, for UDP and TCP, the IP addresses are also contained
+ * in the pseudo header that is used to compute the UDP resp. TCP
+ * checksum. So, we must compensate that as well. Even worse, the
+ * change in the UDP and TCP checksums require yet another
+ * adjustment of the ICMP checksum of the ICMP error message.
+ *
+ * For the moment we forget about TCP, because that checksum is not
+ * in the first 8 bytes, so it will not be available in most cases.
+ */
+
+ if (oip->ip_dst.s_addr == nat->nat_oip.s_addr) {
+ sum1 = LONG_SUM(ntohl(oip->ip_src.s_addr));
+ in = nat->nat_inip;
+ oip->ip_src = in;
+ } else {
+ sum1 = LONG_SUM(ntohl(oip->ip_dst.s_addr));
+ in = nat->nat_outip;
+ oip->ip_dst = in;
+ }
+
+ sum2 = LONG_SUM(ntohl(in.s_addr));
+
+ CALC_SUMD(sum1, sum2, sumd);
+
+ if (nat->nat_dir == NAT_OUTBOUND) {
+ /*
+ * Fix IP checksum of the offending IP packet to adjust for
+ * the change in the IP address.
+ *
+ * Normally, you would expect that the ICMP checksum of the
+ * ICMP error message needs to be adjusted as well for the
+ * IP address change in oip.
+ * However, this is a NOP, because the ICMP checksum is
+ * calculated over the complete ICMP packet, which includes the
+ * changed oip IP addresses and oip->ip_sum. However, these
+ * two changes cancel each other out (if the delta for
+ * the IP address is x, then the delta for ip_sum is minus x),
+ * so no change in the icmp_cksum is necessary.
+ *
+ * Be careful that nat_dir refers to the direction of the
+ * offending IP packet (oip), not to its ICMP response (icmp)
+ */
+ fix_datacksum(&oip->ip_sum, sumd);
+
+ /*
+ * Fix UDP pseudo header checksum to compensate for the
+ * IP address change.
+ */
+ if (oip->ip_p == IPPROTO_UDP && udp->uh_sum) {
+ /*
+ * The UDP checksum is optional, only adjust it
+ * if it has been set.
+ */
+ sum1 = ntohs(udp->uh_sum);
+ fix_datacksum(&udp->uh_sum, sumd);
+ sum2 = ntohs(udp->uh_sum);
+
+ /*
+ * Fix ICMP checksum to compensate the UDP
+ * checksum adjustment.
+ */
+ CALC_SUMD(sum1, sum2, sumd);
+ sumd2 = sumd;
+ }
+
+#if 0
+ /*
+ * Fix TCP pseudo header checksum to compensate for the
+ * IP address change. Before we can do the change, we
+ * must make sure that oip is sufficient large to hold
+ * the TCP checksum (normally it does not!).
+ */
+ if (oip->ip_p == IPPROTO_TCP) {
+
+ }
+#endif
+ } else {
+
+ /*
+ * Fix IP checksum of the offending IP packet to adjust for
+ * the change in the IP address.
+ *
+ * Normally, you would expect that the ICMP checksum of the
+ * ICMP error message needs to be adjusted as well for the
+ * IP address change in oip.
+ * However, this is a NOP, because the ICMP checksum is
+ * calculated over the complete ICMP packet, which includes the
+ * changed oip IP addresses and oip->ip_sum. However, these
+ * two changes cancel each other out (if the delta for
+ * the IP address is x, then the delta for ip_sum is minus x),
+ * so no change in the icmp_cksum is necessary.
+ *
+ * Be careful that nat_dir refers to the direction of the
+ * offending IP packet (oip), not to its ICMP response (icmp)
+ */
+ fix_datacksum(&oip->ip_sum, sumd);
+
+/* XXX FV : without having looked at Solaris source code, it seems unlikely
+ * that SOLARIS would compensate this in the kernel (a body of an IP packet
+ * in the data section of an ICMP packet). I have the feeling that this should
+ * be unconditional, but I'm not in a position to check.
+ */
+#if !SOLARIS && !defined(__sgi)
+ /*
+ * Fix UDP pseudo header checksum to compensate for the
+ * IP address change.
+ */
+ if (oip->ip_p == IPPROTO_UDP && udp->uh_sum) {
+ /*
+ * The UDP checksum is optional, only adjust it
+ * if it has been set
+ */
+ sum1 = ntohs(udp->uh_sum);
+ fix_datacksum(&udp->uh_sum, sumd);
+ sum2 = ntohs(udp->uh_sum);
+
+ /*
+ * Fix ICMP checksum to compensate the UDP
+ * checksum adjustment.
+ */
+ CALC_SUMD(sum1, sum2, sumd);
+ sumd2 = sumd;
+ }
+
+#if 0
+ /*
+ * Fix TCP pseudo header checksum to compensate for the
+ * IP address change. Before we can do the change, we
+ * must make sure that oip is sufficient large to hold
+ * the TCP checksum (normally it does not!).
+ */
+ if (oip->ip_p == IPPROTO_TCP) {
+
+ };
+#endif
+
+#endif
+ }
+
+ if ((flags & IPN_TCPUDP) != 0) {
+ tcphdr_t *tcp;
+
+ /*
+ * XXX - what if this is bogus hl and we go off the end ?
+ * In this case, nat_icmpinlookup() will have returned NULL.
+ */
+ tcp = (tcphdr_t *)udp;
+
+ /*
+ * Step 2 :
+ * For offending TCP/UDP IP packets, translate the ports as
+ * well, based on the NAT specification. Of course such
+ * a change must be reflected in the ICMP checksum as well.
+ *
+ * Advance notice : Now it becomes complicated :-)
+ *
+ * Since the port fields are part of the TCP/UDP checksum
+ * of the offending IP packet, you need to adjust that checksum
+ * as well... but, if you change, you must change the icmp
+ * checksum *again*, to reflect that change.
+ *
+ * To further complicate: the TCP checksum is not in the first
+ * 8 bytes of the offending ip packet, so it most likely is not
+ * available (we might have to fix that if the encounter a
+ * device that returns more than 8 data bytes on icmp error)
+ */
+
+ if (nat->nat_oport == tcp->th_dport) {
+ if (tcp->th_sport != nat->nat_inport) {
+ /*
+ * Fix ICMP checksum to compensate port
+ * adjustment.
+ */
+ sum1 = ntohs(tcp->th_sport);
+ sum2 = ntohs(nat->nat_inport);
+ CALC_SUMD(sum1, sum2, sumd);
+ sumd2 += sumd;
+ tcp->th_sport = nat->nat_inport;
+
+ /*
+ * Fix udp checksum to compensate port
+ * adjustment. NOTE : the offending IP packet
+ * flows the other direction compared to the
+ * ICMP message.
+ *
+ * The UDP checksum is optional, only adjust
+ * it if it has been set.
+ */
+ if (oip->ip_p == IPPROTO_UDP && udp->uh_sum) {
+
+ sum1 = ntohs(udp->uh_sum);
+ fix_datacksum(&udp->uh_sum, sumd);
+ sum2 = ntohs(udp->uh_sum);
+
+ /*
+ * Fix ICMP checksum to
+ * compensate UDP checksum
+ * adjustment.
+ */
+ CALC_SUMD(sum1, sum2, sumd);
+ sumd2 += sumd;
+ }
+ }
+ } else {
+ if (tcp->th_dport != nat->nat_outport) {
+ /*
+ * Fix ICMP checksum to compensate port
+ * adjustment.
+ */
+ sum1 = ntohs(tcp->th_dport);
+ sum2 = ntohs(nat->nat_outport);
+ CALC_SUMD(sum1, sum2, sumd);
+ sumd2 += sumd;
+ tcp->th_dport = nat->nat_outport;
+
+ /*
+ * Fix udp checksum to compensate port
+ * adjustment. NOTE : the offending IP
+ * packet flows the other direction compared
+ * to the ICMP message.
+ *
+ * The UDP checksum is optional, only adjust
+ * it if it has been set.
+ */
+ if (oip->ip_p == IPPROTO_UDP && udp->uh_sum) {
+
+ sum1 = ntohs(udp->uh_sum);
+ fix_datacksum(&udp->uh_sum, sumd);
+ sum2 = ntohs(udp->uh_sum);
+
+ /*
+ * Fix ICMP checksum to compensate
+ * UDP checksum adjustment.
+ */
+ CALC_SUMD(sum1, sum2, sumd);
+ sumd2 += sumd;
+ }
+ }
+ }
+ if (sumd2) {
+ sumd2 = (sumd2 & 0xffff) + (sumd2 >> 16);
+ sumd2 = (sumd2 & 0xffff) + (sumd2 >> 16);
+ if (nat->nat_dir == NAT_OUTBOUND) {
+ fix_outcksum(&icmp->icmp_cksum, sumd2);
+ } else {
+ fix_incksum(&icmp->icmp_cksum, sumd2);
+ }
+ }
+ }
+ nat->nat_age = fr_defnaticmpage;
+ return nat;
+}
+
+
+/*
+ * NB: these lookups don't lock access to the list, it assume it has already
+ * been done!
+ */
+/*
+ * Lookup a nat entry based on the mapped destination ip address/port and
+ * real source address/port. We use this lookup when receiving a packet,
+ * we're looking for a table entry, based on the destination address.
+ * NOTE: THE PACKET BEING CHECKED (IF FOUND) HAS A MAPPING ALREADY.
+ */
+nat_t *nat_inlookup(ifp, flags, p, src, mapdst, ports, rw)
+void *ifp;
+register u_int flags, p;
+struct in_addr src , mapdst;
+u_32_t ports;
+int rw;
+{
+ register u_short sport, dport;
+ register nat_t *nat;
+ register int nflags;
+ register u_32_t dst;
+ u_int hv;
+
+ dst = mapdst.s_addr;
+ dport = ports >> 16;
+ sport = ports & 0xffff;
+ flags &= IPN_TCPUDP;
+
+ hv = NAT_HASH_FN(dst, dport, ipf_nattable_sz);
+ nat = nat_table[1][hv];
+ for (; nat; nat = nat->nat_hnext[1]) {
+ nflags = nat->nat_flags;
+ if ((!ifp || ifp == nat->nat_ifp) &&
+ nat->nat_oip.s_addr == src.s_addr &&
+ nat->nat_outip.s_addr == dst &&
+ (((p == 0) && (flags == (nat->nat_flags & IPN_TCPUDP)))
+ || (p == nat->nat_p)) && (!flags ||
+ (((nat->nat_oport == sport) || (nflags & FI_W_DPORT)) &&
+ ((nat->nat_outport == dport) || (nflags & FI_W_SPORT)))))
+ return nat;
+ }
+ if (!nat_stats.ns_wilds || !(flags & IPN_TCPUDP))
+ return NULL;
+ if (!rw) {
+ RWLOCK_EXIT(&ipf_nat);
+ }
+ hv = NAT_HASH_FN(dst, 0, ipf_nattable_sz);
+ if (!rw) {
+ WRITE_ENTER(&ipf_nat);
+ }
+ nat = nat_table[1][hv];
+ for (; nat; nat = nat->nat_hnext[1]) {
+ nflags = nat->nat_flags;
+ if (ifp && ifp != nat->nat_ifp)
+ continue;
+ if (!(nflags & IPN_TCPUDP))
+ continue;
+ if (!(nflags & FI_WILDP))
+ continue;
+ if (nat->nat_oip.s_addr != src.s_addr ||
+ nat->nat_outip.s_addr != dst)
+ continue;
+ if (((nat->nat_oport == sport) || (nflags & FI_W_DPORT)) &&
+ ((nat->nat_outport == dport) || (nflags & FI_W_SPORT))) {
+ nat_tabmove(nat, ports);
+ break;
+ }
+ }
+ if (!rw) {
+ MUTEX_DOWNGRADE(&ipf_nat);
+ }
+ return nat;
+}
+
+
+/*
+ * This function is only called for TCP/UDP NAT table entries where the
+ * original was placed in the table without hashing on the ports and we now
+ * want to include hashing on port numbers.
+ */
+static void nat_tabmove(nat, ports)
+nat_t *nat;
+u_32_t ports;
+{
+ register u_short sport, dport;
+ nat_t **natp;
+ u_int hv;
+
+ dport = ports >> 16;
+ sport = ports & 0xffff;
+
+ if (nat->nat_oport == dport) {
+ nat->nat_inport = sport;
+ nat->nat_outport = sport;
+ }
+
+ /*
+ * Remove the NAT entry from the old location
+ */
+ if (nat->nat_hnext[0])
+ nat->nat_hnext[0]->nat_phnext[0] = nat->nat_phnext[0];
+ *nat->nat_phnext[0] = nat->nat_hnext[0];
+
+ if (nat->nat_hnext[1])
+ nat->nat_hnext[1]->nat_phnext[1] = nat->nat_phnext[1];
+ *nat->nat_phnext[1] = nat->nat_hnext[1];
+
+ /*
+ * Add into the NAT table in the new position
+ */
+ hv = NAT_HASH_FN(nat->nat_inip.s_addr, sport, ipf_nattable_sz);
+ natp = &nat_table[0][hv];
+ if (*natp)
+ (*natp)->nat_phnext[0] = &nat->nat_hnext[0];
+ nat->nat_phnext[0] = natp;
+ nat->nat_hnext[0] = *natp;
+ *natp = nat;
+
+ hv = NAT_HASH_FN(nat->nat_outip.s_addr, sport, ipf_nattable_sz);
+ natp = &nat_table[1][hv];
+ if (*natp)
+ (*natp)->nat_phnext[1] = &nat->nat_hnext[1];
+ nat->nat_phnext[1] = natp;
+ nat->nat_hnext[1] = *natp;
+ *natp = nat;
+}
+
+
+/*
+ * Lookup a nat entry based on the source 'real' ip address/port and
+ * destination address/port. We use this lookup when sending a packet out,
+ * we're looking for a table entry, based on the source address.
+ * NOTE: THE PACKET BEING CHECKED (IF FOUND) HAS A MAPPING ALREADY.
+ */
+nat_t *nat_outlookup(ifp, flags, p, src, dst, ports, rw)
+void *ifp;
+register u_int flags, p;
+struct in_addr src , dst;
+u_32_t ports;
+int rw;
+{
+ register u_short sport, dport;
+ register nat_t *nat;
+ register int nflags;
+ u_32_t srcip;
+ u_int hv;
+
+ sport = ports & 0xffff;
+ dport = ports >> 16;
+ flags &= IPN_TCPUDP;
+ srcip = src.s_addr;
+
+ hv = NAT_HASH_FN(srcip, sport, ipf_nattable_sz);
+ nat = nat_table[0][hv];
+ for (; nat; nat = nat->nat_hnext[0]) {
+ nflags = nat->nat_flags;
+
+ if ((!ifp || ifp == nat->nat_ifp) &&
+ nat->nat_inip.s_addr == srcip &&
+ nat->nat_oip.s_addr == dst.s_addr &&
+ (((p == 0) && (flags == (nflags & IPN_TCPUDP)))
+ || (p == nat->nat_p)) && (!flags ||
+ ((nat->nat_inport == sport || nflags & FI_W_SPORT) &&
+ (nat->nat_oport == dport || nflags & FI_W_DPORT))))
+ return nat;
+ }
+ if (!nat_stats.ns_wilds || !(flags & IPN_TCPUDP))
+ return NULL;
+ if (!rw) {
+ RWLOCK_EXIT(&ipf_nat);
+ }
+ hv = NAT_HASH_FN(srcip, 0, ipf_nattable_sz);
+ if (!rw) {
+ WRITE_ENTER(&ipf_nat);
+ }
+ nat = nat_table[0][hv];
+ for (; nat; nat = nat->nat_hnext[0]) {
+ nflags = nat->nat_flags;
+ if (ifp && ifp != nat->nat_ifp)
+ continue;
+ if (!(nflags & IPN_TCPUDP))
+ continue;
+ if (!(nflags & FI_WILDP))
+ continue;
+ if ((nat->nat_inip.s_addr != srcip) ||
+ (nat->nat_oip.s_addr != dst.s_addr))
+ continue;
+ if (((nat->nat_inport == sport) || (nflags & FI_W_SPORT)) &&
+ ((nat->nat_oport == dport) || (nflags & FI_W_DPORT))) {
+ nat_tabmove(nat, ports);
+ break;
+ }
+ }
+ if (!rw) {
+ MUTEX_DOWNGRADE(&ipf_nat);
+ }
+ return nat;
+}
+
+
+/*
+ * Lookup the NAT tables to search for a matching redirect
+ */
+nat_t *nat_lookupredir(np)
+register natlookup_t *np;
+{
+ u_32_t ports;
+ nat_t *nat;
+
+ ports = (np->nl_outport << 16) | np->nl_inport;
+ /*
+ * If nl_inip is non null, this is a lookup based on the real
+ * ip address. Else, we use the fake.
+ */
+ if ((nat = nat_outlookup(NULL, np->nl_flags, 0, np->nl_inip,
+ np->nl_outip, ports, 0))) {
+ np->nl_realip = nat->nat_outip;
+ np->nl_realport = nat->nat_outport;
+ }
+ return nat;
+}
+
+
+static int nat_match(fin, np, ip)
+fr_info_t *fin;
+ipnat_t *np;
+ip_t *ip;
+{
+ frtuc_t *ft;
+
+ if (ip->ip_v != 4)
+ return 0;
+
+ if (np->in_p && ip->ip_p != np->in_p)
+ return 0;
+ if (fin->fin_out) {
+ if (!(np->in_redir & (NAT_MAP|NAT_MAPBLK)))
+ return 0;
+ if (((fin->fin_fi.fi_saddr & np->in_inmsk) != np->in_inip)
+ ^ ((np->in_flags & IPN_NOTSRC) != 0))
+ return 0;
+ if (((fin->fin_fi.fi_daddr & np->in_srcmsk) != np->in_srcip)
+ ^ ((np->in_flags & IPN_NOTDST) != 0))
+ return 0;
+ } else {
+ if (!(np->in_redir & NAT_REDIRECT))
+ return 0;
+ if (((fin->fin_fi.fi_saddr & np->in_srcmsk) != np->in_srcip)
+ ^ ((np->in_flags & IPN_NOTSRC) != 0))
+ return 0;
+ if (((fin->fin_fi.fi_daddr & np->in_outmsk) != np->in_outip)
+ ^ ((np->in_flags & IPN_NOTDST) != 0))
+ return 0;
+ }
+
+ ft = &np->in_tuc;
+ if (!(fin->fin_fi.fi_fl & FI_TCPUDP) ||
+ (fin->fin_fi.fi_fl & FI_SHORT) || (ip->ip_off & IP_OFFMASK)) {
+ if (ft->ftu_scmp || ft->ftu_dcmp)
+ return 0;
+ return 1;
+ }
+
+ return fr_tcpudpchk(ft, fin);
+}
+
+
+/*
+ * Packets going out on the external interface go through this.
+ * Here, the source address requires alteration, if anything.
+ */
+int ip_natout(ip, fin)
+ip_t *ip;
+fr_info_t *fin;
+{
+ register ipnat_t *np = NULL;
+ register u_32_t ipa;
+ tcphdr_t *tcp = NULL;
+ u_short sport = 0, dport = 0, *csump = NULL;
+ struct ifnet *ifp;
+ int natadd = 1;
+ frentry_t *fr;
+ u_int nflags = 0, hv, msk;
+ u_32_t iph;
+ nat_t *nat;
+ int i;
+
+ if (nat_list == NULL || (fr_nat_lock))
+ return 0;
+
+ if ((fr = fin->fin_fr) && !(fr->fr_flags & FR_DUP) &&
+ fr->fr_tif.fd_ifp && fr->fr_tif.fd_ifp != (void *)-1)
+ ifp = fr->fr_tif.fd_ifp;
+ else
+ ifp = fin->fin_ifp;
+
+ if (!(ip->ip_off & IP_OFFMASK) && !(fin->fin_fi.fi_fl & FI_SHORT)) {
+ if (ip->ip_p == IPPROTO_TCP)
+ nflags = IPN_TCP;
+ else if (ip->ip_p == IPPROTO_UDP)
+ nflags = IPN_UDP;
+ if ((nflags & IPN_TCPUDP)) {
+ tcp = (tcphdr_t *)fin->fin_dp;
+ sport = tcp->th_sport;
+ dport = tcp->th_dport;
+ }
+ }
+
+ ipa = ip->ip_src.s_addr;
+
+ READ_ENTER(&ipf_nat);
+
+ if ((ip->ip_p == IPPROTO_ICMP) &&
+ (nat = nat_icmp(ip, fin, &nflags, NAT_OUTBOUND)))
+ ;
+ else if ((ip->ip_off & (IP_OFFMASK|IP_MF)) &&
+ (nat = ipfr_nat_knownfrag(ip, fin)))
+ natadd = 0;
+ else if ((nat = nat_outlookup(ifp, nflags, (u_int)ip->ip_p,
+ ip->ip_src, ip->ip_dst,
+ (dport << 16) | sport, 0))) {
+ nflags = nat->nat_flags;
+ if ((nflags & (FI_W_SPORT|FI_W_DPORT)) != 0) {
+ if ((nflags & FI_W_SPORT) &&
+ (nat->nat_inport != sport))
+ nat->nat_inport = sport;
+ else if ((nflags & FI_W_DPORT) &&
+ (nat->nat_oport != dport))
+ nat->nat_oport = dport;
+ if (nat->nat_outport == 0)
+ nat->nat_outport = sport;
+ nat->nat_flags &= ~(FI_W_DPORT|FI_W_SPORT);
+ nflags = nat->nat_flags;
+ nat_stats.ns_wilds--;
+ }
+ } else {
+ RWLOCK_EXIT(&ipf_nat);
+ WRITE_ENTER(&ipf_nat);
+ /*
+ * If there is no current entry in the nat table for this IP#,
+ * create one for it (if there is a matching rule).
+ */
+ msk = 0xffffffff;
+ i = 32;
+maskloop:
+ iph = ipa & htonl(msk);
+ hv = NAT_HASH_FN(iph, 0, ipf_natrules_sz);
+ for (np = nat_rules[hv]; np; np = np->in_mnext)
+ {
+ if ((np->in_ifp && (np->in_ifp != ifp)) ||
+ !np->in_space)
+ continue;
+ if ((np->in_flags & IPN_RF) &&
+ !(np->in_flags & nflags))
+ continue;
+ if (np->in_flags & IPN_FILTER) {
+ if (!nat_match(fin, np, ip))
+ continue;
+ } else if ((ipa & np->in_inmsk) != np->in_inip)
+ continue;
+ if (np->in_redir & (NAT_MAP|NAT_MAPBLK)) {
+ if (*np->in_plabel && !appr_ok(ip, tcp, np))
+ continue;
+ /*
+ * If it's a redirection, then we don't want to
+ * create new outgoing port stuff.
+ * Redirections are only for incoming
+ * connections.
+ */
+ if (!(np->in_redir & (NAT_MAP|NAT_MAPBLK)))
+ continue;
+ if ((nat = nat_new(np, ip, fin, (u_int)nflags,
+ NAT_OUTBOUND))) {
+ np->in_hits++;
+ break;
+ }
+ }
+ }
+ if ((np == NULL) && (i > 0)) {
+ do {
+ i--;
+ msk <<= 1;
+ } while ((i >= 0) && ((nat_masks & (1 << i)) == 0));
+ if (i >= 0)
+ goto maskloop;
+ }
+ MUTEX_DOWNGRADE(&ipf_nat);
+ }
+
+ /*
+ * NOTE: ipf_nat must now only be held as a read lock
+ */
+ if (nat) {
+ np = nat->nat_ptr;
+ if (natadd && (fin->fin_fi.fi_fl & FI_FRAG) &&
+ np && (np->in_flags & IPN_FRAG))
+ ipfr_nat_newfrag(ip, fin, 0, nat);
+ MUTEX_ENTER(&nat->nat_lock);
+ nat->nat_age = fr_defnatage;
+ nat->nat_bytes += ip->ip_len;
+ nat->nat_pkts++;
+ MUTEX_EXIT(&nat->nat_lock);
+
+ /*
+ * Fix up checksums, not by recalculating them, but
+ * simply computing adjustments.
+ */
+ if (nflags == IPN_ICMPERR) {
+ u_32_t s1, s2, sumd;
+
+ s1 = LONG_SUM(ntohl(ip->ip_src.s_addr));
+ s2 = LONG_SUM(ntohl(nat->nat_outip.s_addr));
+ CALC_SUMD(s1, s2, sumd);
+
+ if (nat->nat_dir == NAT_OUTBOUND)
+ fix_incksum(&ip->ip_sum, sumd);
+ else
+ fix_outcksum(&ip->ip_sum, sumd);
+ }
+#if SOLARIS || defined(__sgi)
+ else {
+ if (nat->nat_dir == NAT_OUTBOUND)
+ fix_outcksum(&ip->ip_sum, nat->nat_ipsumd);
+ else
+ fix_incksum(&ip->ip_sum, nat->nat_ipsumd);
+ }
+#endif
+ ip->ip_src = nat->nat_outip;
+
+ if (!(ip->ip_off & IP_OFFMASK) &&
+ !(fin->fin_fi.fi_fl & FI_SHORT)) {
+
+ if ((nat->nat_outport != 0) && (nflags & IPN_TCPUDP)) {
+ tcp->th_sport = nat->nat_outport;
+ fin->fin_data[0] = ntohs(tcp->th_sport);
+ }
+
+ if (ip->ip_p == IPPROTO_TCP) {
+ csump = &tcp->th_sum;
+ MUTEX_ENTER(&nat->nat_lock);
+ fr_tcp_age(&nat->nat_age,
+ nat->nat_tcpstate, fin, 1);
+ if (nat->nat_age < fr_defnaticmpage)
+ nat->nat_age = fr_defnaticmpage;
+#ifdef LARGE_NAT
+ else if (nat->nat_age > fr_defnatage)
+ nat->nat_age = fr_defnatage;
+#endif
+ /*
+ * Increase this because we may have
+ * "keep state" following this too and
+ * packet storms can occur if this is
+ * removed too quickly.
+ */
+ if (nat->nat_age == fr_tcpclosed)
+ nat->nat_age = fr_tcplastack;
+ MUTEX_EXIT(&nat->nat_lock);
+ } else if (ip->ip_p == IPPROTO_UDP) {
+ udphdr_t *udp = (udphdr_t *)tcp;
+
+ if (udp->uh_sum)
+ csump = &udp->uh_sum;
+ } else if (ip->ip_p == IPPROTO_ICMP) {
+ nat->nat_age = fr_defnaticmpage;
+ }
+
+ if (csump) {
+ if (nat->nat_dir == NAT_OUTBOUND)
+ fix_outcksum(csump, nat->nat_sumd[1]);
+ else
+ fix_incksum(csump, nat->nat_sumd[1]);
+ }
+ }
+
+ if ((np->in_apr != NULL) && (np->in_dport == 0 ||
+ (tcp != NULL && dport == np->in_dport))) {
+ i = appr_check(ip, fin, nat);
+ if (i == 0)
+ i = 1;
+ } else
+ i = 1;
+ ATOMIC_INCL(nat_stats.ns_mapped[1]);
+ RWLOCK_EXIT(&ipf_nat); /* READ */
+ return i;
+ }
+ RWLOCK_EXIT(&ipf_nat); /* READ/WRITE */
+ return 0;
+}
+
+
+/*
+ * Packets coming in from the external interface go through this.
+ * Here, the destination address requires alteration, if anything.
+ */
+int ip_natin(ip, fin)
+ip_t *ip;
+fr_info_t *fin;
+{
+ register struct in_addr src;
+ register struct in_addr in;
+ register ipnat_t *np;
+ u_int nflags = 0, natadd = 1, hv, msk;
+ struct ifnet *ifp = fin->fin_ifp;
+ tcphdr_t *tcp = NULL;
+ u_short sport = 0, dport = 0, *csump = NULL;
+ nat_t *nat;
+ u_32_t iph;
+ int i;
+
+ if ((nat_list == NULL) || (ip->ip_v != 4) || (fr_nat_lock))
+ return 0;
+
+ if (!(ip->ip_off & IP_OFFMASK) && !(fin->fin_fi.fi_fl & FI_SHORT)) {
+ if (ip->ip_p == IPPROTO_TCP)
+ nflags = IPN_TCP;
+ else if (ip->ip_p == IPPROTO_UDP)
+ nflags = IPN_UDP;
+ if ((nflags & IPN_TCPUDP)) {
+ tcp = (tcphdr_t *)fin->fin_dp;
+ dport = tcp->th_dport;
+ sport = tcp->th_sport;
+ }
+ }
+
+ in = ip->ip_dst;
+ /* make sure the source address is to be redirected */
+ src = ip->ip_src;
+
+ READ_ENTER(&ipf_nat);
+
+ if ((ip->ip_p == IPPROTO_ICMP) &&
+ (nat = nat_icmp(ip, fin, &nflags, NAT_INBOUND)))
+ ;
+ else if ((ip->ip_off & (IP_OFFMASK|IP_MF)) &&
+ (nat = ipfr_nat_knownfrag(ip, fin)))
+ natadd = 0;
+ else if ((nat = nat_inlookup(fin->fin_ifp, nflags, (u_int)ip->ip_p,
+ ip->ip_src, in, (dport << 16) | sport,
+ 0))) {
+ nflags = nat->nat_flags;
+ if ((nflags & (FI_W_SPORT|FI_W_DPORT)) != 0) {
+ if ((nat->nat_oport != sport) && (nflags & FI_W_DPORT))
+ nat->nat_oport = sport;
+ else if ((nat->nat_outport != dport) &&
+ (nflags & FI_W_SPORT))
+ nat->nat_outport = dport;
+ nat->nat_flags &= ~(FI_W_SPORT|FI_W_DPORT);
+ nflags = nat->nat_flags;
+ nat_stats.ns_wilds--;
+ }
+ } else {
+ RWLOCK_EXIT(&ipf_nat);
+ WRITE_ENTER(&ipf_nat);
+ /*
+ * If there is no current entry in the nat table for this IP#,
+ * create one for it (if there is a matching rule).
+ */
+ msk = 0xffffffff;
+ i = 32;
+maskloop:
+ iph = in.s_addr & htonl(msk);
+ hv = NAT_HASH_FN(iph, 0, ipf_rdrrules_sz);
+ for (np = rdr_rules[hv]; np; np = np->in_rnext) {
+ if ((np->in_ifp && (np->in_ifp != ifp)) ||
+ (np->in_p && (np->in_p != ip->ip_p)) ||
+ (np->in_flags && !(nflags & np->in_flags)))
+ continue;
+ if (np->in_flags & IPN_FILTER) {
+ if (!nat_match(fin, np, ip))
+ continue;
+ } else if ((in.s_addr & np->in_outmsk) != np->in_outip)
+ continue;
+ if ((np->in_redir & NAT_REDIRECT) &&
+ (!np->in_pmin || (np->in_flags & IPN_FILTER) ||
+ ((ntohs(np->in_pmax) >= ntohs(dport)) &&
+ (ntohs(dport) >= ntohs(np->in_pmin)))))
+ if ((nat = nat_new(np, ip, fin, nflags,
+ NAT_INBOUND))) {
+ np->in_hits++;
+ break;
+ }
+ }
+
+ if ((np == NULL) && (i > 0)) {
+ do {
+ i--;
+ msk <<= 1;
+ } while ((i >= 0) && ((rdr_masks & (1 << i)) == 0));
+ if (i >= 0)
+ goto maskloop;
+ }
+ MUTEX_DOWNGRADE(&ipf_nat);
+ }
+
+ /*
+ * NOTE: ipf_nat must now only be held as a read lock
+ */
+ if (nat) {
+ np = nat->nat_ptr;
+ fin->fin_fr = nat->nat_fr;
+ if (natadd && (fin->fin_fi.fi_fl & FI_FRAG) &&
+ np && (np->in_flags & IPN_FRAG))
+ ipfr_nat_newfrag(ip, fin, 0, nat);
+ if ((np->in_apr != NULL) && (np->in_dport == 0 ||
+ (tcp != NULL && sport == np->in_dport))) {
+ i = appr_check(ip, fin, nat);
+ if (i == -1) {
+ RWLOCK_EXIT(&ipf_nat);
+ return i;
+ }
+ }
+
+ MUTEX_ENTER(&nat->nat_lock);
+ if (nflags != IPN_ICMPERR)
+ nat->nat_age = fr_defnatage;
+
+ nat->nat_bytes += ip->ip_len;
+ nat->nat_pkts++;
+ MUTEX_EXIT(&nat->nat_lock);
+ ip->ip_dst = nat->nat_inip;
+ fin->fin_fi.fi_daddr = nat->nat_inip.s_addr;
+
+ /*
+ * Fix up checksums, not by recalculating them, but
+ * simply computing adjustments.
+ */
+#if SOLARIS || defined(__sgi)
+ if (nat->nat_dir == NAT_OUTBOUND)
+ fix_incksum(&ip->ip_sum, nat->nat_ipsumd);
+ else
+ fix_outcksum(&ip->ip_sum, nat->nat_ipsumd);
+#endif
+ if (!(ip->ip_off & IP_OFFMASK) &&
+ !(fin->fin_fi.fi_fl & FI_SHORT)) {
+
+ if ((nat->nat_inport != 0) && (nflags & IPN_TCPUDP)) {
+ tcp->th_dport = nat->nat_inport;
+ fin->fin_data[1] = ntohs(tcp->th_dport);
+ }
+
+ if (ip->ip_p == IPPROTO_TCP) {
+ csump = &tcp->th_sum;
+ MUTEX_ENTER(&nat->nat_lock);
+ fr_tcp_age(&nat->nat_age,
+ nat->nat_tcpstate, fin, 0);
+ if (nat->nat_age < fr_defnaticmpage)
+ nat->nat_age = fr_defnaticmpage;
+#ifdef LARGE_NAT
+ else if (nat->nat_age > fr_defnatage)
+ nat->nat_age = fr_defnatage;
+#endif
+ /*
+ * Increase this because we may have
+ * "keep state" following this too and
+ * packet storms can occur if this is
+ * removed too quickly.
+ */
+ if (nat->nat_age == fr_tcpclosed)
+ nat->nat_age = fr_tcplastack;
+ MUTEX_EXIT(&nat->nat_lock);
+ } else if (ip->ip_p == IPPROTO_UDP) {
+ udphdr_t *udp = (udphdr_t *)tcp;
+
+ if (udp->uh_sum)
+ csump = &udp->uh_sum;
+ } else if (ip->ip_p == IPPROTO_ICMP) {
+ nat->nat_age = fr_defnaticmpage;
+ }
+
+ if (csump) {
+ if (nat->nat_dir == NAT_OUTBOUND)
+ fix_incksum(csump, nat->nat_sumd[0]);
+ else
+ fix_outcksum(csump, nat->nat_sumd[0]);
+ }
+ }
+ ATOMIC_INCL(nat_stats.ns_mapped[0]);
+ RWLOCK_EXIT(&ipf_nat); /* READ */
+ return 1;
+ }
+ RWLOCK_EXIT(&ipf_nat); /* READ/WRITE */
+ return 0;
+}
+
+
+/*
+ * Free all memory used by NAT structures allocated at runtime.
+ */
+void ip_natunload()
+{
+ WRITE_ENTER(&ipf_nat);
+ (void) nat_clearlist();
+ (void) nat_flushtable();
+ RWLOCK_EXIT(&ipf_nat);
+
+ if (nat_table[0] != NULL) {
+ KFREES(nat_table[0], sizeof(nat_t *) * ipf_nattable_sz);
+ nat_table[0] = NULL;
+ }
+ if (nat_table[1] != NULL) {
+ KFREES(nat_table[1], sizeof(nat_t *) * ipf_nattable_sz);
+ nat_table[1] = NULL;
+ }
+ if (nat_rules != NULL) {
+ KFREES(nat_rules, sizeof(ipnat_t *) * ipf_natrules_sz);
+ nat_rules = NULL;
+ }
+ if (rdr_rules != NULL) {
+ KFREES(rdr_rules, sizeof(ipnat_t *) * ipf_rdrrules_sz);
+ rdr_rules = NULL;
+ }
+ if (maptable != NULL) {
+ KFREES(maptable, sizeof(hostmap_t *) * ipf_hostmap_sz);
+ maptable = NULL;
+ }
+}
+
+
+/*
+ * Slowly expire held state for NAT entries. Timeouts are set in
+ * expectation of this being called twice per second.
+ */
+void ip_natexpire()
+{
+ register struct nat *nat, **natp;
+#if defined(_KERNEL) && !SOLARIS
+ int s;
+#endif
+
+ SPL_NET(s);
+ WRITE_ENTER(&ipf_nat);
+ for (natp = &nat_instances; (nat = *natp); ) {
+ nat->nat_age--;
+ if (nat->nat_age) {
+ natp = &nat->nat_next;
+ continue;
+ }
+ *natp = nat->nat_next;
+#ifdef IPFILTER_LOG
+ nat_log(nat, NL_EXPIRE);
+#endif
+ nat_delete(nat);
+ nat_stats.ns_expire++;
+ }
+ RWLOCK_EXIT(&ipf_nat);
+ SPL_X(s);
+}
+
+
+/*
+ */
+void ip_natsync(ifp)
+void *ifp;
+{
+ register ipnat_t *n;
+ register nat_t *nat;
+ register u_32_t sum1, sum2, sumd;
+ struct in_addr in;
+ ipnat_t *np;
+ void *ifp2;
+#if defined(_KERNEL) && !SOLARIS
+ int s;
+#endif
+
+ /*
+ * Change IP addresses for NAT sessions for any protocol except TCP
+ * since it will break the TCP connection anyway.
+ */
+ SPL_NET(s);
+ WRITE_ENTER(&ipf_nat);
+ for (nat = nat_instances; nat; nat = nat->nat_next)
+ if (((ifp == NULL) || (ifp == nat->nat_ifp)) &&
+ !(nat->nat_flags & IPN_TCP) && (np = nat->nat_ptr) &&
+ (np->in_outmsk == 0xffffffff) && !np->in_nip) {
+ ifp2 = nat->nat_ifp;
+ /*
+ * Change the map-to address to be the same as the
+ * new one.
+ */
+ sum1 = nat->nat_outip.s_addr;
+ if (fr_ifpaddr(4, ifp2, &in) != -1)
+ nat->nat_outip = in;
+ sum2 = nat->nat_outip.s_addr;
+
+ if (sum1 == sum2)
+ continue;
+ /*
+ * Readjust the checksum adjustment to take into
+ * account the new IP#.
+ */
+ CALC_SUMD(sum1, sum2, sumd);
+ /* XXX - dont change for TCP when solaris does
+ * hardware checksumming.
+ */
+ sumd += nat->nat_sumd[0];
+ nat->nat_sumd[0] = (sumd & 0xffff) + (sumd >> 16);
+ nat->nat_sumd[1] = nat->nat_sumd[0];
+ }
+
+ for (n = nat_list; (n != NULL); n = n->in_next)
+ if (n->in_ifp == ifp) {
+ n->in_ifp = (void *)GETUNIT(n->in_ifname, 4);
+ if (!n->in_ifp)
+ n->in_ifp = (void *)-1;
+ }
+ RWLOCK_EXIT(&ipf_nat);
+ SPL_X(s);
+}
+
+
+#ifdef IPFILTER_LOG
+void nat_log(nat, type)
+struct nat *nat;
+u_int type;
+{
+ struct ipnat *np;
+ struct natlog natl;
+ void *items[1];
+ size_t sizes[1];
+ int rulen, types[1];
+
+ natl.nl_inip = nat->nat_inip;
+ natl.nl_outip = nat->nat_outip;
+ natl.nl_origip = nat->nat_oip;
+ natl.nl_bytes = nat->nat_bytes;
+ natl.nl_pkts = nat->nat_pkts;
+ natl.nl_origport = nat->nat_oport;
+ natl.nl_inport = nat->nat_inport;
+ natl.nl_outport = nat->nat_outport;
+ natl.nl_p = nat->nat_p;
+ natl.nl_type = type;
+ natl.nl_rule = -1;
+#ifndef LARGE_NAT
+ if (nat->nat_ptr != NULL) {
+ for (rulen = 0, np = nat_list; np; np = np->in_next, rulen++)
+ if (np == nat->nat_ptr) {
+ natl.nl_rule = rulen;
+ break;
+ }
+ }
+#endif
+ items[0] = &natl;
+ sizes[0] = sizeof(natl);
+ types[0] = 0;
+
+ (void) ipllog(IPL_LOGNAT, NULL, items, sizes, types, 1);
+}
+#endif
diff --git a/sys/contrib/ipfilter/netinet/ip_nat.h b/sys/contrib/ipfilter/netinet/ip_nat.h
new file mode 100644
index 0000000..afa7e14
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_nat.h
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 1995-2000 by Darren Reed.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and due credit is given
+ * to the original author and the contributors.
+ *
+ * @(#)ip_nat.h 1.5 2/4/96
+ * $Id: ip_nat.h,v 2.17.2.14 2000/11/18 03:58:04 darrenr Exp $
+ * $FreeBSD$
+ */
+
+#ifndef __IP_NAT_H__
+#define __IP_NAT_H__
+
+#ifndef SOLARIS
+#define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
+#endif
+
+#if defined(__STDC__) || defined(__GNUC__)
+#define SIOCADNAT _IOW('r', 60, struct ipnat *)
+#define SIOCRMNAT _IOW('r', 61, struct ipnat *)
+#define SIOCGNATS _IOWR('r', 62, struct natstat *)
+#define SIOCGNATL _IOWR('r', 63, struct natlookup *)
+#else
+#define SIOCADNAT _IOW(r, 60, struct ipnat *)
+#define SIOCRMNAT _IOW(r, 61, struct ipnat *)
+#define SIOCGNATS _IOWR(r, 62, struct natstat *)
+#define SIOCGNATL _IOWR(r, 63, struct natlookup *)
+#endif
+
+#undef LARGE_NAT /* define this if you're setting up a system to NAT
+ * LARGE numbers of networks/hosts - i.e. in the
+ * hundreds or thousands. In such a case, you should
+ * also change the RDR_SIZE and NAT_SIZE below to more
+ * appropriate sizes. The figures below were used for
+ * a setup with 1000-2000 networks to NAT.
+ */
+#define NAT_SIZE 127
+#define RDR_SIZE 127
+#define HOSTMAP_SIZE 127
+#define NAT_TABLE_SZ 127
+#ifdef LARGE_NAT
+#undef NAT_SIZE
+#undef RDR_SIZE
+#undef NAT_TABLE_SZ
+#undef HOSTMAP_SIZE 127
+#define NAT_SIZE 2047
+#define RDR_SIZE 2047
+#define NAT_TABLE_SZ 16383
+#define HOSTMAP_SIZE 8191
+#endif
+#ifndef APR_LABELLEN
+#define APR_LABELLEN 16
+#endif
+#define NAT_HW_CKSUM 0x80000000
+
+#define DEF_NAT_AGE 1200 /* 10 minutes (600 seconds) */
+
+struct ap_session;
+
+typedef struct nat {
+ u_long nat_age;
+ int nat_flags;
+ u_32_t nat_sumd[2];
+ u_32_t nat_ipsumd;
+ void *nat_data;
+ struct ap_session *nat_aps; /* proxy session */
+ struct frentry *nat_fr; /* filter rule ptr if appropriate */
+ struct in_addr nat_inip;
+ struct in_addr nat_outip;
+ struct in_addr nat_oip; /* other ip */
+ U_QUAD_T nat_pkts;
+ U_QUAD_T nat_bytes;
+ u_short nat_oport; /* other port */
+ u_short nat_inport;
+ u_short nat_outport;
+ u_short nat_use;
+ u_char nat_tcpstate[2];
+ u_char nat_p; /* protocol for NAT */
+ struct ipnat *nat_ptr; /* pointer back to the rule */
+ struct hostmap *nat_hm;
+ struct nat *nat_next;
+ struct nat *nat_hnext[2];
+ struct nat **nat_phnext[2];
+ void *nat_ifp;
+ int nat_dir;
+ char nat_ifname[IFNAMSIZ];
+#if SOLARIS || defined(__sgi)
+ kmutex_t nat_lock;
+#endif
+} nat_t;
+
+typedef struct ipnat {
+ struct ipnat *in_next;
+ struct ipnat *in_rnext;
+ struct ipnat **in_prnext;
+ struct ipnat *in_mnext;
+ struct ipnat **in_pmnext;
+ void *in_ifp;
+ void *in_apr;
+ u_long in_space;
+ u_int in_use;
+ u_int in_hits;
+ struct in_addr in_nextip;
+ u_short in_pnext;
+ u_short in_ippip; /* IP #'s per IP# */
+ u_32_t in_flags; /* From here to in_dport must be reflected */
+ u_short in_spare;
+ u_short in_ppip; /* ports per IP */
+ u_short in_port[2]; /* correctly in IPN_CMPSIZ */
+ struct in_addr in_in[2];
+ struct in_addr in_out[2];
+ struct in_addr in_src[2];
+ struct frtuc in_tuc;
+ int in_redir; /* 0 if it's a mapping, 1 if it's a hard redir */
+ char in_ifname[IFNAMSIZ];
+ char in_plabel[APR_LABELLEN]; /* proxy label */
+ char in_p; /* protocol */
+} ipnat_t;
+
+#define in_pmin in_port[0] /* Also holds static redir port */
+#define in_pmax in_port[1]
+#define in_nip in_nextip.s_addr
+#define in_inip in_in[0].s_addr
+#define in_inmsk in_in[1].s_addr
+#define in_outip in_out[0].s_addr
+#define in_outmsk in_out[1].s_addr
+#define in_srcip in_src[0].s_addr
+#define in_srcmsk in_src[1].s_addr
+#define in_scmp in_tuc.ftu_scmp
+#define in_dcmp in_tuc.ftu_dcmp
+#define in_stop in_tuc.ftu_stop
+#define in_dtop in_tuc.ftu_dtop
+#define in_sport in_tuc.ftu_sport
+#define in_dport in_tuc.ftu_dport
+
+#define NAT_OUTBOUND 0
+#define NAT_INBOUND 1
+
+#define NAT_MAP 0x01
+#define NAT_REDIRECT 0x02
+#define NAT_BIMAP (NAT_MAP|NAT_REDIRECT)
+#define NAT_MAPBLK 0x04
+/* 0x100 reserved for FI_W_SPORT */
+/* 0x200 reserved for FI_W_DPORT */
+/* 0x400 reserved for FI_W_SADDR */
+/* 0x800 reserved for FI_W_DADDR */
+/* 0x1000 reserved for FI_W_NEWFR */
+
+#define MAPBLK_MINPORT 1024 /* don't use reserved ports for src port */
+#define USABLE_PORTS (65536 - MAPBLK_MINPORT)
+
+#define IPN_CMPSIZ (sizeof(ipnat_t) - offsetof(ipnat_t, in_flags))
+
+typedef struct natlookup {
+ struct in_addr nl_inip;
+ struct in_addr nl_outip;
+ struct in_addr nl_realip;
+ int nl_flags;
+ u_short nl_inport;
+ u_short nl_outport;
+ u_short nl_realport;
+} natlookup_t;
+
+
+typedef struct nat_save {
+ void *ipn_next;
+ struct nat ipn_nat;
+ struct ipnat ipn_ipnat;
+ struct frentry ipn_fr;
+ int ipn_dsize;
+ char ipn_data[4];
+} nat_save_t;
+
+#define ipn_rule ipn_nat.nat_fr
+
+typedef struct natget {
+ void *ng_ptr;
+ int ng_sz;
+} natget_t;
+
+
+typedef struct hostmap {
+ struct hostmap *hm_next;
+ struct hostmap **hm_pnext;
+ struct ipnat *hm_ipnat;
+ struct in_addr hm_realip;
+ struct in_addr hm_mapip;
+ int hm_ref;
+} hostmap_t;
+
+
+typedef struct natstat {
+ u_long ns_mapped[2];
+ u_long ns_rules;
+ u_long ns_added;
+ u_long ns_expire;
+ u_long ns_inuse;
+ u_long ns_logged;
+ u_long ns_logfail;
+ u_long ns_memfail;
+ u_long ns_badnat;
+ nat_t **ns_table[2];
+ ipnat_t *ns_list;
+ void *ns_apslist;
+ u_int ns_nattab_sz;
+ u_int ns_rultab_sz;
+ u_int ns_rdrtab_sz;
+ nat_t *ns_instances;
+ u_int ns_wilds;
+} natstat_t;
+
+#define IPN_ANY 0x000
+#define IPN_TCP 0x001
+#define IPN_UDP 0x002
+#define IPN_TCPUDP (IPN_TCP|IPN_UDP)
+#define IPN_DELETE 0x004
+#define IPN_ICMPERR 0x008
+#define IPN_RF (IPN_TCPUDP|IPN_DELETE|IPN_ICMPERR)
+#define IPN_AUTOPORTMAP 0x010
+#define IPN_IPRANGE 0x020
+#define IPN_USERFLAGS (IPN_TCPUDP|IPN_AUTOPORTMAP|IPN_IPRANGE|IPN_SPLIT|\
+ IPN_ROUNDR|IPN_FILTER|IPN_NOTSRC|IPN_NOTDST)
+#define IPN_FILTER 0x040
+#define IPN_SPLIT 0x080
+#define IPN_ROUNDR 0x100
+#define IPN_NOTSRC 0x080000
+#define IPN_NOTDST 0x100000
+#define IPN_FRAG 0x200000
+
+
+typedef struct natlog {
+ struct in_addr nl_origip;
+ struct in_addr nl_outip;
+ struct in_addr nl_inip;
+ u_short nl_origport;
+ u_short nl_outport;
+ u_short nl_inport;
+ u_short nl_type;
+ int nl_rule;
+ U_QUAD_T nl_pkts;
+ U_QUAD_T nl_bytes;
+ u_char nl_p;
+} natlog_t;
+
+
+#define NL_NEWMAP NAT_MAP
+#define NL_NEWRDR NAT_REDIRECT
+#define NL_NEWBIMAP NAT_BIMAP
+#define NL_NEWBLOCK NAT_MAPBLK
+#define NL_FLUSH 0xfffe
+#define NL_EXPIRE 0xffff
+
+#define NAT_HASH_FN(k,l,m) (((k) + ((k) >> 12) + l) % (m))
+
+#define LONG_SUM(in) (((in) & 0xffff) + ((in) >> 16))
+
+#define CALC_SUMD(s1, s2, sd) { \
+ (s1) = ((s1) & 0xffff) + ((s1) >> 16); \
+ (s2) = ((s2) & 0xffff) + ((s2) >> 16); \
+ /* Do it twice */ \
+ (s1) = ((s1) & 0xffff) + ((s1) >> 16); \
+ (s2) = ((s2) & 0xffff) + ((s2) >> 16); \
+ /* Because ~1 == -2, We really need ~1 == -1 */ \
+ if ((s1) > (s2)) (s2)--; \
+ (sd) = (s2) - (s1); \
+ (sd) = ((sd) & 0xffff) + ((sd) >> 16); }
+
+
+extern u_int ipf_nattable_sz;
+extern u_int ipf_natrules_sz;
+extern u_int ipf_rdrrules_sz;
+extern int fr_nat_lock;
+extern void ip_natsync __P((void *));
+extern u_long fr_defnatage;
+extern u_long fr_defnaticmpage;
+extern nat_t **nat_table[2];
+extern nat_t *nat_instances;
+extern ipnat_t **nat_rules;
+extern ipnat_t **rdr_rules;
+extern natstat_t nat_stats;
+#if defined(__NetBSD__) || defined(__OpenBSD__) || (__FreeBSD_version >= 300003)
+extern int nat_ioctl __P((caddr_t, u_long, int));
+#else
+extern int nat_ioctl __P((caddr_t, int, int));
+#endif
+extern int nat_init __P((void));
+extern nat_t *nat_new __P((ipnat_t *, ip_t *, fr_info_t *, u_int, int));
+extern nat_t *nat_outlookup __P((void *, u_int, u_int, struct in_addr,
+ struct in_addr, u_32_t, int));
+extern nat_t *nat_inlookup __P((void *, u_int, u_int, struct in_addr,
+ struct in_addr, u_32_t, int));
+extern nat_t *nat_maplookup __P((void *, u_int, struct in_addr,
+ struct in_addr));
+extern nat_t *nat_lookupredir __P((natlookup_t *));
+extern nat_t *nat_icmplookup __P((ip_t *, fr_info_t *, int));
+extern nat_t *nat_icmp __P((ip_t *, fr_info_t *, u_int *, int));
+extern void nat_insert __P((nat_t *));
+
+extern int ip_natout __P((ip_t *, fr_info_t *));
+extern int ip_natin __P((ip_t *, fr_info_t *));
+extern void ip_natunload __P((void)), ip_natexpire __P((void));
+extern void nat_log __P((struct nat *, u_int));
+extern void fix_incksum __P((u_short *, u_32_t));
+extern void fix_outcksum __P((u_short *, u_32_t));
+extern void fix_datacksum __P((u_short *, u_32_t));
+
+#endif /* __IP_NAT_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_proxy.c b/sys/contrib/ipfilter/netinet/ip_proxy.c
new file mode 100644
index 0000000..47d0e5e
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_proxy.c
@@ -0,0 +1,452 @@
+/*
+ * Copyright (C) 1997-2000 by Darren Reed.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and due credit is given
+ * to the original author and the contributors.
+ */
+#if !defined(lint)
+/*static const char rcsid[] = "@(#)$Id: ip_proxy.c,v 2.2.2.1 1999/09/19 12:18:19 darrenr Exp $";*/
+static const char rcsid[] = "@(#)$FreeBSD$";
+#endif
+
+#if defined(__FreeBSD__) && defined(KERNEL) && !defined(_KERNEL)
+# define _KERNEL
+#endif
+
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/file.h>
+#if !defined(__FreeBSD_version)
+# include <sys/ioctl.h>
+#endif
+#include <sys/fcntl.h>
+#include <sys/uio.h>
+#if !defined(_KERNEL) && !defined(KERNEL)
+# include <stdio.h>
+# include <string.h>
+# include <stdlib.h>
+#endif
+#ifndef linux
+# include <sys/protosw.h>
+#endif
+#include <sys/socket.h>
+#if defined(_KERNEL)
+# if !defined(linux)
+# include <sys/systm.h>
+# else
+# include <linux/string.h>
+# endif
+#endif
+#if !defined(__SVR4) && !defined(__svr4__)
+# ifndef linux
+# include <sys/mbuf.h>
+# endif
+#else
+# include <sys/byteorder.h>
+# ifdef _KERNEL
+# include <sys/dditypes.h>
+# endif
+# include <sys/stream.h>
+# include <sys/kmem.h>
+#endif
+#if __FreeBSD__ > 2
+# include <sys/queue.h>
+#endif
+#include <net/if.h>
+#ifdef sun
+# include <net/af.h>
+#endif
+#include <net/route.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#ifndef linux
+# include <netinet/ip_var.h>
+#endif
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+#include <netinet/ip_icmp.h>
+#include "netinet/ip_compat.h"
+#include <netinet/tcpip.h>
+#include "netinet/ip_fil.h"
+#include "netinet/ip_proxy.h"
+#include "netinet/ip_nat.h"
+#include "netinet/ip_state.h"
+#if (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+#endif
+
+
+#ifndef MIN
+#define MIN(a,b) (((a)<(b))?(a):(b))
+#endif
+
+static ap_session_t *appr_new_session __P((aproxy_t *, ip_t *,
+ fr_info_t *, nat_t *));
+static int appr_fixseqack __P((fr_info_t *, ip_t *, ap_session_t *, int ));
+
+
+#define AP_SESS_SIZE 53
+
+#if defined(_KERNEL) && !defined(linux)
+#include "netinet/ip_ftp_pxy.c"
+#include "netinet/ip_rcmd_pxy.c"
+#include "netinet/ip_raudio_pxy.c"
+#endif
+
+ap_session_t *ap_sess_tab[AP_SESS_SIZE];
+ap_session_t *ap_sess_list = NULL;
+aproxy_t *ap_proxylist = NULL;
+aproxy_t ap_proxies[] = {
+#ifdef IPF_FTP_PROXY
+ { NULL, "ftp", (char)IPPROTO_TCP, 0, 0, ippr_ftp_init, NULL,
+ ippr_ftp_new, ippr_ftp_in, ippr_ftp_out },
+#endif
+#ifdef IPF_RCMD_PROXY
+ { NULL, "rcmd", (char)IPPROTO_TCP, 0, 0, ippr_rcmd_init, NULL,
+ ippr_rcmd_new, NULL, ippr_rcmd_out },
+#endif
+#ifdef IPF_RAUDIO_PROXY
+ { NULL, "raudio", (char)IPPROTO_TCP, 0, 0, ippr_raudio_init, NULL,
+ ippr_raudio_new, ippr_raudio_in, ippr_raudio_out },
+#endif
+ { NULL, "", '\0', 0, 0, NULL, NULL }
+};
+
+
+int appr_add(ap)
+aproxy_t *ap;
+{
+ aproxy_t *a;
+
+ for (a = ap_proxies; a->apr_p; a++)
+ if ((a->apr_p == ap->apr_p) &&
+ !strncmp(a->apr_label, ap->apr_label,
+ sizeof(ap->apr_label)))
+ return -1;
+
+ for (a = ap_proxylist; a->apr_p; a = a->apr_next)
+ if ((a->apr_p == ap->apr_p) &&
+ !strncmp(a->apr_label, ap->apr_label,
+ sizeof(ap->apr_label)))
+ return -1;
+ ap->apr_next = ap_proxylist;
+ ap_proxylist = ap;
+ return (*ap->apr_init)();
+}
+
+
+int appr_del(ap)
+aproxy_t *ap;
+{
+ aproxy_t *a, **app;
+
+ for (app = &ap_proxylist; (a = *app); app = &a->apr_next)
+ if (a == ap) {
+ if (ap->apr_ref != 0)
+ return 1;
+ *app = a->apr_next;
+ return 0;
+ }
+ return -1;
+}
+
+
+int appr_ok(ip, tcp, nat)
+ip_t *ip;
+tcphdr_t *tcp;
+ipnat_t *nat;
+{
+ aproxy_t *apr = nat->in_apr;
+ u_short dport = nat->in_dport;
+
+ if (!apr || (apr->apr_flags & APR_DELETE) ||
+ (ip->ip_p != apr->apr_p))
+ return 0;
+ if ((tcp && (tcp->th_dport != dport)) || (!tcp && dport))
+ return 0;
+ return 1;
+}
+
+
+/*
+ * Allocate a new application proxy structure and fill it in with the
+ * relevant details. call the init function once complete, prior to
+ * returning.
+ */
+static ap_session_t *appr_new_session(apr, ip, fin, nat)
+aproxy_t *apr;
+ip_t *ip;
+fr_info_t *fin;
+nat_t *nat;
+{
+ register ap_session_t *aps;
+
+ if (!apr || (apr->apr_flags & APR_DELETE) || (ip->ip_p != apr->apr_p))
+ return NULL;
+
+ KMALLOC(aps, ap_session_t *);
+ if (!aps)
+ return NULL;
+ bzero((char *)aps, sizeof(*aps));
+ aps->aps_p = ip->ip_p;
+ aps->aps_data = NULL;
+ aps->aps_apr = apr;
+ aps->aps_psiz = 0;
+ if (apr->apr_new != NULL)
+ if ((*apr->apr_new)(fin, ip, aps, nat) == -1) {
+ KFREE(aps);
+ return NULL;
+ }
+ aps->aps_nat = nat;
+ aps->aps_next = ap_sess_list;
+ ap_sess_list = aps;
+ return aps;
+}
+
+
+/*
+ * check to see if a packet should be passed through an active proxy routine
+ * if one has been setup for it.
+ */
+int appr_check(ip, fin, nat)
+ip_t *ip;
+fr_info_t *fin;
+nat_t *nat;
+{
+ ap_session_t *aps;
+ aproxy_t *apr;
+ tcphdr_t *tcp = NULL;
+ u_32_t sum;
+ short rv;
+ int err;
+
+ if (nat->nat_aps == NULL)
+ nat->nat_aps = appr_new_session(nat->nat_ptr->in_apr, ip,
+ fin, nat);
+ aps = nat->nat_aps;
+ if ((aps != NULL) && (aps->aps_p == ip->ip_p)) {
+ if (ip->ip_p == IPPROTO_TCP) {
+ tcp = (tcphdr_t *)fin->fin_dp;
+ /*
+ * verify that the checksum is correct. If not, then
+ * don't do anything with this packet.
+ */
+#if SOLARIS && defined(_KERNEL)
+ sum = fr_tcpsum(fin->fin_qfm, ip, tcp);
+#else
+ sum = fr_tcpsum(*(mb_t **)fin->fin_mp, ip, tcp);
+#endif
+ if (sum != tcp->th_sum) {
+ frstats[fin->fin_out].fr_tcpbad++;
+ return -1;
+ }
+ }
+
+ apr = aps->aps_apr;
+ err = 0;
+ if (fin->fin_out != 0) {
+ if (apr->apr_outpkt != NULL)
+ err = (*apr->apr_outpkt)(fin, ip, aps, nat);
+ } else {
+ if (apr->apr_inpkt != NULL)
+ err = (*apr->apr_inpkt)(fin, ip, aps, nat);
+ }
+
+ rv = APR_EXIT(err);
+ if (rv == -1)
+ return rv;
+
+ if (tcp != NULL) {
+ err = appr_fixseqack(fin, ip, aps, APR_INC(err));
+#if SOLARIS && defined(_KERNEL)
+ tcp->th_sum = fr_tcpsum(fin->fin_qfm, ip, tcp);
+#else
+ tcp->th_sum = fr_tcpsum(*(mb_t **)fin->fin_mp, ip, tcp);
+#endif
+ }
+ aps->aps_bytes += ip->ip_len;
+ aps->aps_pkts++;
+ return 1;
+ }
+ return 0;
+}
+
+
+aproxy_t *appr_match(pr, name)
+u_int pr;
+char *name;
+{
+ aproxy_t *ap;
+
+ for (ap = ap_proxies; ap->apr_p; ap++)
+ if ((ap->apr_p == pr) &&
+ !strncmp(name, ap->apr_label, sizeof(ap->apr_label))) {
+ ap->apr_ref++;
+ return ap;
+ }
+
+ for (ap = ap_proxylist; ap; ap = ap->apr_next)
+ if ((ap->apr_p == pr) &&
+ !strncmp(name, ap->apr_label, sizeof(ap->apr_label))) {
+ ap->apr_ref++;
+ return ap;
+ }
+ return NULL;
+}
+
+
+void appr_free(ap)
+aproxy_t *ap;
+{
+ ap->apr_ref--;
+}
+
+
+void aps_free(aps)
+ap_session_t *aps;
+{
+ ap_session_t *a, **ap;
+
+ if (!aps)
+ return;
+
+ for (ap = &ap_sess_list; (a = *ap); ap = &a->aps_next)
+ if (a == aps) {
+ *ap = a->aps_next;
+ break;
+ }
+
+ if ((aps->aps_data != NULL) && (aps->aps_psiz != 0))
+ KFREES(aps->aps_data, aps->aps_psiz);
+ KFREE(aps);
+}
+
+
+static int appr_fixseqack(fin, ip, aps, inc)
+fr_info_t *fin;
+ip_t *ip;
+ap_session_t *aps;
+int inc;
+{
+ int sel, ch = 0, out, nlen;
+ u_32_t seq1, seq2;
+ tcphdr_t *tcp;
+
+ tcp = (tcphdr_t *)fin->fin_dp;
+ out = fin->fin_out;
+ nlen = ip->ip_len;
+ nlen -= (ip->ip_hl << 2) + (tcp->th_off << 2);
+
+ if (out != 0) {
+ seq1 = (u_32_t)ntohl(tcp->th_seq);
+ sel = aps->aps_sel[out];
+
+ /* switch to other set ? */
+ if ((aps->aps_seqmin[!sel] > aps->aps_seqmin[sel]) &&
+ (seq1 > aps->aps_seqmin[!sel]))
+ sel = aps->aps_sel[out] = !sel;
+
+ if (aps->aps_seqoff[sel]) {
+ seq2 = aps->aps_seqmin[sel] - aps->aps_seqoff[sel];
+ if (seq1 > seq2) {
+ seq2 = aps->aps_seqoff[sel];
+ seq1 += seq2;
+ tcp->th_seq = htonl(seq1);
+ ch = 1;
+ }
+ }
+
+ if (inc && (seq1 > aps->aps_seqmin[!sel])) {
+ aps->aps_seqmin[!sel] = seq1 + nlen - 1;
+ aps->aps_seqoff[!sel] = aps->aps_seqoff[sel] + inc;
+ }
+
+ /***/
+
+ seq1 = ntohl(tcp->th_ack);
+ sel = aps->aps_sel[1 - out];
+
+ /* switch to other set ? */
+ if ((aps->aps_ackmin[!sel] > aps->aps_ackmin[sel]) &&
+ (seq1 > aps->aps_ackmin[!sel]))
+ sel = aps->aps_sel[1 - out] = !sel;
+
+ if (aps->aps_ackoff[sel] && (seq1 > aps->aps_ackmin[sel])) {
+ seq2 = aps->aps_ackoff[sel];
+ tcp->th_ack = htonl(seq1 - seq2);
+ ch = 1;
+ }
+ } else {
+ seq1 = ntohl(tcp->th_seq);
+ sel = aps->aps_sel[out];
+
+ /* switch to other set ? */
+ if ((aps->aps_ackmin[!sel] > aps->aps_ackmin[sel]) &&
+ (seq1 > aps->aps_ackmin[!sel]))
+ sel = aps->aps_sel[out] = !sel;
+
+ if (aps->aps_ackoff[sel]) {
+ seq2 = aps->aps_ackmin[sel] -
+ aps->aps_ackoff[sel];
+ if (seq1 > seq2) {
+ seq2 = aps->aps_ackoff[sel];
+ seq1 += seq2;
+ tcp->th_seq = htonl(seq1);
+ ch = 1;
+ }
+ }
+
+ if (inc && (seq1 > aps->aps_ackmin[!sel])) {
+ aps->aps_ackmin[!sel] = seq1 + nlen - 1;
+ aps->aps_ackoff[!sel] = aps->aps_ackoff[sel] + inc;
+ }
+
+ /***/
+
+ seq1 = ntohl(tcp->th_ack);
+ sel = aps->aps_sel[1 - out];
+
+ /* switch to other set ? */
+ if ((aps->aps_seqmin[!sel] > aps->aps_seqmin[sel]) &&
+ (seq1 > aps->aps_seqmin[!sel]))
+ sel = aps->aps_sel[1 - out] = !sel;
+
+ if (aps->aps_seqoff[sel] && (seq1 > aps->aps_seqmin[sel])) {
+ seq2 = aps->aps_seqoff[sel];
+ tcp->th_ack = htonl(seq1 - seq2);
+ ch = 1;
+ }
+ }
+ return ch ? 2 : 0;
+}
+
+
+int appr_init()
+{
+ aproxy_t *ap;
+ int err = 0;
+
+ for (ap = ap_proxies; ap->apr_p; ap++) {
+ err = (*ap->apr_init)();
+ if (err != 0)
+ break;
+ }
+ return err;
+}
+
+
+void appr_unload()
+{
+ aproxy_t *ap;
+
+ for (ap = ap_proxies; ap->apr_p; ap++)
+ if (ap->apr_fini)
+ (*ap->apr_fini)();
+ for (ap = ap_proxylist; ap; ap = ap->apr_next)
+ if (ap->apr_fini)
+ (*ap->apr_fini)();
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_proxy.h b/sys/contrib/ipfilter/netinet/ip_proxy.h
new file mode 100644
index 0000000..f22c709
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_proxy.h
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 1997-2000 by Darren Reed.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and due credit is given
+ * to the original author and the contributors.
+ *
+ * $Id: ip_proxy.h,v 2.8.2.4 2000/12/02 00:15:03 darrenr Exp $
+ * $FreeBSD$
+ */
+
+#ifndef __IP_PROXY_H__
+#define __IP_PROXY_H__
+
+#ifndef SOLARIS
+#define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
+#endif
+
+#ifndef APR_LABELLEN
+#define APR_LABELLEN 16
+#endif
+#define AP_SESS_SIZE 53
+
+struct nat;
+struct ipnat;
+
+typedef struct ap_tcp {
+ u_short apt_sport; /* source port */
+ u_short apt_dport; /* destination port */
+ short apt_sel[2]; /* {seq,ack}{off,min} set selector */
+ short apt_seqoff[2]; /* sequence # difference */
+ tcp_seq apt_seqmin[2]; /* don't change seq-off until after this */
+ short apt_ackoff[2]; /* sequence # difference */
+ tcp_seq apt_ackmin[2]; /* don't change seq-off until after this */
+ u_char apt_state[2]; /* connection state */
+} ap_tcp_t;
+
+typedef struct ap_udp {
+ u_short apu_sport; /* source port */
+ u_short apu_dport; /* destination port */
+} ap_udp_t;
+
+typedef struct ap_session {
+ struct aproxy *aps_apr;
+ union {
+ struct ap_tcp apu_tcp;
+ struct ap_udp apu_udp;
+ } aps_un;
+ u_int aps_flags;
+ U_QUAD_T aps_bytes; /* bytes sent */
+ U_QUAD_T aps_pkts; /* packets sent */
+ void *aps_nat; /* pointer back to nat struct */
+ void *aps_data; /* private data */
+ int aps_p; /* protocol */
+ int aps_psiz; /* size of private data */
+ struct ap_session *aps_hnext;
+ struct ap_session *aps_next;
+} ap_session_t;
+
+#define aps_sport aps_un.apu_tcp.apt_sport
+#define aps_dport aps_un.apu_tcp.apt_dport
+#define aps_sel aps_un.apu_tcp.apt_sel
+#define aps_seqoff aps_un.apu_tcp.apt_seqoff
+#define aps_seqmin aps_un.apu_tcp.apt_seqmin
+#define aps_state aps_un.apu_tcp.apt_state
+#define aps_ackoff aps_un.apu_tcp.apt_ackoff
+#define aps_ackmin aps_un.apu_tcp.apt_ackmin
+
+
+typedef struct aproxy {
+ struct aproxy *apr_next;
+ char apr_label[APR_LABELLEN]; /* Proxy label # */
+ u_char apr_p; /* protocol */
+ int apr_ref; /* +1 per rule referencing it */
+ int apr_flags;
+ int (* apr_init) __P((void));
+ void (* apr_fini) __P((void));
+ int (* apr_new) __P((fr_info_t *, ip_t *,
+ ap_session_t *, struct nat *));
+ int (* apr_inpkt) __P((fr_info_t *, ip_t *,
+ ap_session_t *, struct nat *));
+ int (* apr_outpkt) __P((fr_info_t *, ip_t *,
+ ap_session_t *, struct nat *));
+} aproxy_t;
+
+#define APR_DELETE 1
+
+#define APR_ERR(x) (((x) & 0xffff) << 16)
+#define APR_EXIT(x) (((x) >> 16) & 0xffff)
+#define APR_INC(x) ((x) & 0xffff)
+
+#define FTP_BUFSZ 160
+/*
+ * For the ftp proxy.
+ */
+typedef struct ftpside {
+ char *ftps_rptr;
+ char *ftps_wptr;
+ u_32_t ftps_seq;
+ u_32_t ftps_len;
+ int ftps_junk;
+ char ftps_buf[FTP_BUFSZ];
+} ftpside_t;
+
+typedef struct ftpinfo {
+ u_int ftp_passok;
+ ftpside_t ftp_side[2];
+} ftpinfo_t;
+
+/*
+ * Real audio proxy structure and #defines
+ */
+typedef struct {
+ int rap_seenpna;
+ int rap_seenver;
+ int rap_version;
+ int rap_eos; /* End Of Startup */
+ int rap_gotid;
+ int rap_gotlen;
+ int rap_mode;
+ int rap_sdone;
+ u_short rap_plport;
+ u_short rap_prport;
+ u_short rap_srport;
+ char rap_svr[19];
+ u_32_t rap_sbf; /* flag to indicate which of the 19 bytes have
+ * been filled
+ */
+ tcp_seq rap_sseq;
+} raudio_t;
+
+#define RA_ID_END 0
+#define RA_ID_UDP 1
+#define RA_ID_ROBUST 7
+
+#define RAP_M_UDP 1
+#define RAP_M_ROBUST 2
+#define RAP_M_TCP 4
+#define RAP_M_UDP_ROBUST (RAP_M_UDP|RAP_M_ROBUST)
+
+
+extern ap_session_t *ap_sess_tab[AP_SESS_SIZE];
+extern ap_session_t *ap_sess_list;
+extern aproxy_t ap_proxies[];
+extern int ippr_ftp_pasvonly;
+
+extern int appr_add __P((aproxy_t *));
+extern int appr_del __P((aproxy_t *));
+extern int appr_init __P((void));
+extern void appr_unload __P((void));
+extern int appr_ok __P((ip_t *, tcphdr_t *, struct ipnat *));
+extern void appr_free __P((aproxy_t *));
+extern void aps_free __P((ap_session_t *));
+extern int appr_check __P((ip_t *, fr_info_t *, struct nat *));
+extern aproxy_t *appr_match __P((u_int, char *));
+
+#endif /* __IP_PROXY_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_raudio_pxy.c b/sys/contrib/ipfilter/netinet/ip_raudio_pxy.c
new file mode 100644
index 0000000..8b2c231
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_raudio_pxy.c
@@ -0,0 +1,308 @@
+/*
+ * $FreeBSD$
+ */
+#if SOLARIS && defined(_KERNEL)
+extern kmutex_t ipf_rw;
+#endif
+
+#define IPF_RAUDIO_PROXY
+
+
+int ippr_raudio_init __P((void));
+int ippr_raudio_new __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *));
+int ippr_raudio_in __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *));
+int ippr_raudio_out __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *));
+
+static frentry_t raudiofr;
+
+
+/*
+ * Real Audio application proxy initialization.
+ */
+int ippr_raudio_init()
+{
+ bzero((char *)&raudiofr, sizeof(raudiofr));
+ raudiofr.fr_ref = 1;
+ raudiofr.fr_flags = FR_INQUE|FR_PASS|FR_QUICK|FR_KEEPSTATE;
+ return 0;
+}
+
+
+/*
+ * Setup for a new proxy to handle Real Audio.
+ */
+int ippr_raudio_new(fin, ip, aps, nat)
+fr_info_t *fin;
+ip_t *ip;
+ap_session_t *aps;
+nat_t *nat;
+{
+ raudio_t *rap;
+
+
+ KMALLOCS(aps->aps_data, void *, sizeof(raudio_t));
+ if (aps->aps_data == NULL)
+ return -1;
+
+ bzero(aps->aps_data, sizeof(raudio_t));
+ rap = aps->aps_data;
+ aps->aps_psiz = sizeof(raudio_t);
+ rap->rap_mode = RAP_M_TCP; /* default is for TCP */
+ return 0;
+}
+
+
+
+int ippr_raudio_out(fin, ip, aps, nat)
+fr_info_t *fin;
+ip_t *ip;
+ap_session_t *aps;
+nat_t *nat;
+{
+ raudio_t *rap = aps->aps_data;
+ unsigned char membuf[512 + 1], *s;
+ u_short id = 0;
+ tcphdr_t *tcp;
+ int off, dlen;
+ int len = 0;
+ mb_t *m;
+#if SOLARIS
+ mb_t *m1;
+#endif
+
+ /*
+ * If we've already processed the start messages, then nothing left
+ * for the proxy to do.
+ */
+ if (rap->rap_eos == 1)
+ return 0;
+
+ tcp = (tcphdr_t *)fin->fin_dp;
+ off = (ip->ip_hl << 2) + (tcp->th_off << 2);
+ bzero(membuf, sizeof(membuf));
+#if SOLARIS
+ m = fin->fin_qfm;
+
+ dlen = msgdsize(m) - off;
+ if (dlen <= 0)
+ return 0;
+ copyout_mblk(m, off, MIN(sizeof(membuf), dlen), (char *)membuf);
+#else
+ m = *(mb_t **)fin->fin_mp;
+
+ dlen = mbufchainlen(m) - off;
+ if (dlen <= 0)
+ return 0;
+ m_copydata(m, off, MIN(sizeof(membuf), dlen), (char *)membuf);
+#endif
+ /*
+ * In all the startup parsing, ensure that we don't go outside
+ * the packet buffer boundary.
+ */
+ /*
+ * Look for the start of connection "PNA" string if not seen yet.
+ */
+ if (rap->rap_seenpna == 0) {
+ s = (u_char *)memstr("PNA", (char *)membuf, 3, dlen);
+ if (s == NULL)
+ return 0;
+ s += 3;
+ rap->rap_seenpna = 1;
+ } else
+ s = membuf;
+
+ /*
+ * Directly after the PNA will be the version number of this
+ * connection.
+ */
+ if (rap->rap_seenpna == 1 && rap->rap_seenver == 0) {
+ if ((s + 1) - membuf < dlen) {
+ rap->rap_version = (*s << 8) | *(s + 1);
+ s += 2;
+ rap->rap_seenver = 1;
+ } else
+ return 0;
+ }
+
+ /*
+ * Now that we've been past the PNA and version number, we're into the
+ * startup messages block. This ends when a message with an ID of 0.
+ */
+ while ((rap->rap_eos == 0) && ((s + 1) - membuf < dlen)) {
+ if (rap->rap_gotid == 0) {
+ id = (*s << 8) | *(s + 1);
+ s += 2;
+ rap->rap_gotid = 1;
+ if (id == RA_ID_END) {
+ rap->rap_eos = 1;
+ break;
+ }
+ } else if (rap->rap_gotlen == 0) {
+ len = (*s << 8) | *(s + 1);
+ s += 2;
+ rap->rap_gotlen = 1;
+ }
+
+ if (rap->rap_gotid == 1 && rap->rap_gotlen == 1) {
+ if (id == RA_ID_UDP) {
+ rap->rap_mode &= ~RAP_M_TCP;
+ rap->rap_mode |= RAP_M_UDP;
+ rap->rap_plport = (*s << 8) | *(s + 1);
+ } else if (id == RA_ID_ROBUST) {
+ rap->rap_mode |= RAP_M_ROBUST;
+ rap->rap_prport = (*s << 8) | *(s + 1);
+ }
+ s += len;
+ rap->rap_gotlen = 0;
+ rap->rap_gotid = 0;
+ }
+ }
+ return 0;
+}
+
+
+int ippr_raudio_in(fin, ip, aps, nat)
+fr_info_t *fin;
+ip_t *ip;
+ap_session_t *aps;
+nat_t *nat;
+{
+ unsigned char membuf[IPF_MAXPORTLEN + 1], *s;
+ tcphdr_t *tcp, tcph, *tcp2 = &tcph;
+ raudio_t *rap = aps->aps_data;
+ struct in_addr swa, swb;
+ int off, dlen, slen;
+ int a1, a2, a3, a4;
+ u_short sp, dp;
+ fr_info_t fi;
+ tcp_seq seq;
+ nat_t *ipn;
+ u_char swp;
+ mb_t *m;
+#if SOLARIS
+ mb_t *m1;
+#endif
+
+ /*
+ * Wait until we've seen the end of the start messages and even then
+ * only proceed further if we're using UDP. If they want to use TCP
+ * then data is sent back on the same channel that is already open.
+ */
+ if (rap->rap_sdone != 0)
+ return 0;
+
+ tcp = (tcphdr_t *)fin->fin_dp;
+ off = (ip->ip_hl << 2) + (tcp->th_off << 2);
+ m = *(mb_t **)fin->fin_mp;
+
+#if SOLARIS
+ m = fin->fin_qfm;
+
+ dlen = msgdsize(m) - off;
+ if (dlen <= 0)
+ return 0;
+ bzero(membuf, sizeof(membuf));
+ copyout_mblk(m, off, MIN(sizeof(membuf), dlen), (char *)membuf);
+#else
+ dlen = mbufchainlen(m) - off;
+ if (dlen <= 0)
+ return 0;
+ bzero(membuf, sizeof(membuf));
+ m_copydata(m, off, MIN(sizeof(membuf), dlen), (char *)membuf);
+#endif
+
+ seq = ntohl(tcp->th_seq);
+ /*
+ * Check to see if the data in this packet is of interest to us.
+ * We only care for the first 19 bytes coming back from the server.
+ */
+ if (rap->rap_sseq == 0) {
+ s = (u_char *)memstr("PNA", (char *)membuf, 3, dlen);
+ if (s == NULL)
+ return 0;
+ a1 = s - membuf;
+ dlen -= a1;
+ a1 = 0;
+ rap->rap_sseq = seq;
+ a2 = MIN(dlen, sizeof(rap->rap_svr));
+ } else if (seq <= rap->rap_sseq + sizeof(rap->rap_svr)) {
+ /*
+ * seq # which is the start of data and from that the offset
+ * into the buffer array.
+ */
+ a1 = seq - rap->rap_sseq;
+ a2 = MIN(dlen, sizeof(rap->rap_svr));
+ a2 -= a1;
+ s = membuf;
+ } else
+ return 0;
+
+ for (a3 = a1, a4 = a2; (a4 > 0) && (a3 < 19) && (a3 >= 0); a4--,a3++) {
+ rap->rap_sbf |= (1 << a3);
+ rap->rap_svr[a3] = *s++;
+ }
+
+ if ((rap->rap_sbf != 0x7ffff) || (!rap->rap_eos)) /* 19 bits */
+ return 0;
+ rap->rap_sdone = 1;
+
+ s = (u_char *)rap->rap_svr + 11;
+ if (((*s << 8) | *(s + 1)) == RA_ID_ROBUST) {
+ s += 2;
+ rap->rap_srport = (*s << 8) | *(s + 1);
+ }
+
+ swp = ip->ip_p;
+ swa = ip->ip_src;
+ swb = ip->ip_dst;
+
+ ip->ip_p = IPPROTO_UDP;
+ ip->ip_src = nat->nat_inip;
+ ip->ip_dst = nat->nat_oip;
+
+ bcopy((char *)fin, (char *)&fi, sizeof(fi));
+ bzero((char *)tcp2, sizeof(*tcp2));
+ tcp2->th_off = 5;
+ fi.fin_dp = (char *)tcp2;
+ fi.fin_fr = &raudiofr;
+ fi.fin_dlen = sizeof(*tcp2);
+ tcp2->th_win = htons(8192);
+ slen = ip->ip_len;
+ ip->ip_len = fin->fin_hlen + sizeof(*tcp);
+
+ if (((rap->rap_mode & RAP_M_UDP_ROBUST) == RAP_M_UDP_ROBUST) &&
+ (rap->rap_srport != 0)) {
+ dp = rap->rap_srport;
+ sp = rap->rap_prport;
+ tcp2->th_sport = htons(sp);
+ tcp2->th_dport = htons(dp);
+ fi.fin_data[0] = dp;
+ fi.fin_data[1] = sp;
+ ipn = nat_new(nat->nat_ptr, ip, &fi,
+ IPN_UDP | (sp ? 0 : FI_W_SPORT), NAT_OUTBOUND);
+ if (ipn != NULL) {
+ ipn->nat_age = fr_defnatage;
+ (void) fr_addstate(ip, &fi, sp ? 0 : FI_W_SPORT);
+ }
+ }
+
+ if ((rap->rap_mode & RAP_M_UDP) == RAP_M_UDP) {
+ sp = rap->rap_plport;
+ tcp2->th_sport = htons(sp);
+ tcp2->th_dport = 0; /* XXX - don't specify remote port */
+ fi.fin_data[0] = sp;
+ fi.fin_data[1] = 0;
+ ipn = nat_new(nat->nat_ptr, ip, &fi, IPN_UDP|FI_W_DPORT,
+ NAT_OUTBOUND);
+ if (ipn != NULL) {
+ ipn->nat_age = fr_defnatage;
+ (void) fr_addstate(ip, &fi, FI_W_DPORT);
+ }
+ }
+
+ ip->ip_p = swp;
+ ip->ip_len = slen;
+ ip->ip_src = swa;
+ ip->ip_dst = swb;
+ return 0;
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_rcmd_pxy.c b/sys/contrib/ipfilter/netinet/ip_rcmd_pxy.c
new file mode 100644
index 0000000..0ae0210
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_rcmd_pxy.c
@@ -0,0 +1,174 @@
+/*
+ * $Id: ip_rcmd_pxy.c,v 1.4.2.4 2000/11/01 14:34:20 darrenr Exp $
+ */
+/*
+ * Simple RCMD transparent proxy for in-kernel use. For use with the NAT
+ * code.
+ * $FreeBSD$
+ */
+#if SOLARIS && defined(_KERNEL)
+extern kmutex_t ipf_rw;
+#endif
+
+#define isdigit(x) ((x) >= '0' && (x) <= '9')
+
+#define IPF_RCMD_PROXY
+
+
+int ippr_rcmd_init __P((void));
+int ippr_rcmd_new __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *));
+int ippr_rcmd_out __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *));
+u_short ipf_rcmd_atoi __P((char *));
+int ippr_rcmd_portmsg __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *));
+
+static frentry_t rcmdfr;
+
+
+/*
+ * RCMD application proxy initialization.
+ */
+int ippr_rcmd_init()
+{
+ bzero((char *)&rcmdfr, sizeof(rcmdfr));
+ rcmdfr.fr_ref = 1;
+ rcmdfr.fr_flags = FR_INQUE|FR_PASS|FR_QUICK|FR_KEEPSTATE;
+ return 0;
+}
+
+
+/*
+ * Setup for a new RCMD proxy.
+ */
+int ippr_rcmd_new(fin, ip, aps, nat)
+fr_info_t *fin;
+ip_t *ip;
+ap_session_t *aps;
+nat_t *nat;
+{
+ tcphdr_t *tcp = (tcphdr_t *)fin->fin_dp;
+
+ aps->aps_psiz = sizeof(u_32_t);
+ KMALLOCS(aps->aps_data, u_32_t *, sizeof(u_32_t));
+ if (aps->aps_data == NULL)
+ return -1;
+ *(u_32_t *)aps->aps_data = 0;
+ aps->aps_sport = tcp->th_sport;
+ aps->aps_dport = tcp->th_dport;
+ return 0;
+}
+
+
+/*
+ * ipf_rcmd_atoi - implement a simple version of atoi
+ */
+u_short ipf_rcmd_atoi(ptr)
+char *ptr;
+{
+ register char *s = ptr, c;
+ register u_short i = 0;
+
+ while ((c = *s++) && isdigit(c)) {
+ i *= 10;
+ i += c - '0';
+ }
+ return i;
+}
+
+
+int ippr_rcmd_portmsg(fin, ip, aps, nat)
+fr_info_t *fin;
+ip_t *ip;
+ap_session_t *aps;
+nat_t *nat;
+{
+ char portbuf[8], *s;
+ struct in_addr swip;
+ u_short sp, dp;
+ int off, dlen;
+ tcphdr_t *tcp, tcph, *tcp2 = &tcph;
+ fr_info_t fi;
+ nat_t *ipn;
+ mb_t *m;
+#if SOLARIS
+ mb_t *m1;
+#endif
+
+ tcp = (tcphdr_t *)fin->fin_dp;
+
+ if (tcp->th_flags & TH_SYN) {
+ *(u_32_t *)aps->aps_data = htonl(ntohl(tcp->th_seq) + 1);
+ return 0;
+ }
+
+ if ((*(u_32_t *)aps->aps_data != 0) &&
+ (tcp->th_seq != *(u_32_t *)aps->aps_data))
+ return 0;
+
+ off = (ip->ip_hl << 2) + (tcp->th_off << 2);
+
+#if SOLARIS
+ m = fin->fin_qfm;
+
+ dlen = msgdsize(m) - off;
+ bzero(portbuf, sizeof(portbuf));
+ copyout_mblk(m, off, MIN(sizeof(portbuf), dlen), portbuf);
+#else
+ m = *(mb_t **)fin->fin_mp;
+ dlen = mbufchainlen(m) - off;
+ bzero(portbuf, sizeof(portbuf));
+ m_copydata(m, off, MIN(sizeof(portbuf), dlen), portbuf);
+#endif
+
+ portbuf[sizeof(portbuf) - 1] = '\0';
+ s = portbuf;
+ sp = ipf_rcmd_atoi(s);
+ if (!sp)
+ return 0;
+
+ /*
+ * Add skeleton NAT entry for connection which will come back the
+ * other way.
+ */
+ sp = htons(sp);
+ dp = htons(fin->fin_data[1]);
+ ipn = nat_outlookup(fin->fin_ifp, IPN_TCP, nat->nat_p, nat->nat_inip,
+ ip->ip_dst, (dp << 16) | sp, 0);
+ if (ipn == NULL) {
+ int slen;
+
+ slen = ip->ip_len;
+ ip->ip_len = fin->fin_hlen + sizeof(*tcp);
+ bcopy((char *)fin, (char *)&fi, sizeof(fi));
+ bzero((char *)tcp2, sizeof(*tcp2));
+ tcp2->th_win = htons(8192);
+ tcp2->th_sport = sp;
+ tcp2->th_dport = 0; /* XXX - don't specify remote port */
+ tcp2->th_off = 5;
+ fi.fin_data[0] = ntohs(sp);
+ fi.fin_data[1] = 0;
+ fi.fin_dp = (char *)tcp2;
+ fi.fin_dlen = sizeof(*tcp2);
+ swip = ip->ip_src;
+ ip->ip_src = nat->nat_inip;
+ ipn = nat_new(nat->nat_ptr, ip, &fi, IPN_TCP|FI_W_DPORT,
+ NAT_OUTBOUND);
+ if (ipn != NULL) {
+ ipn->nat_age = fr_defnatage;
+ fi.fin_fr = &rcmdfr;
+ (void) fr_addstate(ip, &fi, FI_W_DPORT);
+ }
+ ip->ip_len = slen;
+ ip->ip_src = swip;
+ }
+ return 0;
+}
+
+
+int ippr_rcmd_out(fin, ip, aps, nat)
+fr_info_t *fin;
+ip_t *ip;
+ap_session_t *aps;
+nat_t *nat;
+{
+ return ippr_rcmd_portmsg(fin, ip, aps, nat);
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_state.c b/sys/contrib/ipfilter/netinet/ip_state.c
new file mode 100644
index 0000000..8cfe62d
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_state.c
@@ -0,0 +1,1901 @@
+/*
+ * Copyright (C) 1995-2000 by Darren Reed.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and due credit is given
+ * to the original author and the contributors.
+ */
+#if !defined(lint)
+static const char sccsid[] = "@(#)ip_state.c 1.8 6/5/96 (C) 1993-1995 Darren Reed";
+static const char rcsid[] = "@(#)$FreeBSD$";
+#endif
+
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/file.h>
+#if defined(__NetBSD__) && (NetBSD >= 199905) && !defined(IPFILTER_LKM) && \
+ defined(_KERNEL)
+# include "opt_ipfilter_log.h"
+#endif
+#if defined(_KERNEL) && defined(__FreeBSD_version) && \
+ (__FreeBSD_version >= 400000) && !defined(KLD_MODULE)
+#include "opt_inet6.h"
+#endif
+#if !defined(_KERNEL) && !defined(KERNEL) && !defined(__KERNEL__)
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+#else
+# ifdef linux
+# include <linux/kernel.h>
+# include <linux/module.h>
+# endif
+#endif
+#if (defined(KERNEL) || defined(_KERNEL)) && (__FreeBSD_version >= 220000)
+# include <sys/filio.h>
+# include <sys/fcntl.h>
+# if (__FreeBSD_version >= 300000) && !defined(IPFILTER_LKM)
+# include "opt_ipfilter.h"
+# endif
+#else
+# include <sys/ioctl.h>
+#endif
+#include <sys/time.h>
+#include <sys/uio.h>
+#ifndef linux
+# include <sys/protosw.h>
+#endif
+#include <sys/socket.h>
+#if (defined(_KERNEL) || defined(KERNEL)) && !defined(linux)
+# include <sys/systm.h>
+#endif
+#if !defined(__SVR4) && !defined(__svr4__)
+# ifndef linux
+# include <sys/mbuf.h>
+# endif
+#else
+# include <sys/filio.h>
+# include <sys/byteorder.h>
+# ifdef _KERNEL
+# include <sys/dditypes.h>
+# endif
+# include <sys/stream.h>
+# include <sys/kmem.h>
+#endif
+
+#include <net/if.h>
+#ifdef sun
+# include <net/af.h>
+#endif
+#include <net/route.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+#ifndef linux
+# include <netinet/ip_var.h>
+# include <netinet/tcp_fsm.h>
+#endif
+#include <netinet/udp.h>
+#include <netinet/ip_icmp.h>
+#include "netinet/ip_compat.h"
+#include <netinet/tcpip.h>
+#include "netinet/ip_fil.h"
+#include "netinet/ip_nat.h"
+#include "netinet/ip_frag.h"
+#include "netinet/ip_proxy.h"
+#include "netinet/ip_state.h"
+#ifdef USE_INET6
+#include <netinet/icmp6.h>
+#endif
+#if (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+# if (defined(_KERNEL) || defined(KERNEL)) && !defined(IPFILTER_LKM)
+# include <sys/libkern.h>
+# include <sys/systm.h>
+# endif
+#endif
+
+#ifndef MIN
+# define MIN(a,b) (((a)<(b))?(a):(b))
+#endif
+
+#define TCP_CLOSE (TH_FIN|TH_RST)
+
+static ipstate_t **ips_table = NULL;
+static ipstate_t *ips_list = NULL;
+static int ips_num = 0;
+static int ips_wild = 0;
+static ips_stat_t ips_stats;
+#if (SOLARIS || defined(__sgi)) && defined(_KERNEL)
+extern KRWLOCK_T ipf_state, ipf_mutex;
+extern kmutex_t ipf_rw;
+#endif
+
+#ifdef USE_INET6
+static frentry_t *fr_checkicmp6matchingstate __P((ip6_t *, fr_info_t *));
+#endif
+static int fr_matchsrcdst __P((ipstate_t *, union i6addr, union i6addr,
+ fr_info_t *, tcphdr_t *));
+static frentry_t *fr_checkicmpmatchingstate __P((ip_t *, fr_info_t *));
+static int fr_matchicmpqueryreply __P((int, ipstate_t *, icmphdr_t *));
+static int fr_state_flush __P((int));
+static ips_stat_t *fr_statetstats __P((void));
+static void fr_delstate __P((ipstate_t *));
+static int fr_state_remove __P((caddr_t));
+static void fr_ipsmove __P((ipstate_t **, ipstate_t *, u_int));
+int fr_stputent __P((caddr_t));
+int fr_stgetent __P((caddr_t));
+void fr_stinsert __P((ipstate_t *));
+
+
+#define FIVE_DAYS (2 * 5 * 86400) /* 5 days: half closed session */
+
+#define TCP_MSL 240 /* 2 minutes */
+u_long fr_tcpidletimeout = FIVE_DAYS,
+ fr_tcpclosewait = 2 * TCP_MSL,
+ fr_tcplastack = 2 * TCP_MSL,
+ fr_tcptimeout = 2 * TCP_MSL,
+ fr_tcpclosed = 120,
+ fr_tcphalfclosed = 2 * 2 * 3600, /* 2 hours */
+ fr_udptimeout = 240,
+ fr_icmptimeout = 120;
+int fr_statemax = IPSTATE_MAX,
+ fr_statesize = IPSTATE_SIZE;
+int fr_state_doflush = 0,
+ fr_state_lock = 0;
+
+static int icmpreplytype4[ICMP_MAXTYPE + 1];
+
+int fr_stateinit()
+{
+ int i;
+
+ KMALLOCS(ips_table, ipstate_t **, fr_statesize * sizeof(ipstate_t *));
+ if (ips_table != NULL)
+ bzero((char *)ips_table, fr_statesize * sizeof(ipstate_t *));
+ else
+ return -1;
+
+ /* fill icmp reply type table */
+ for (i = 0; i <= ICMP_MAXTYPE; i++)
+ icmpreplytype4[i] = -1;
+ icmpreplytype4[ICMP_ECHO] = ICMP_ECHOREPLY;
+ icmpreplytype4[ICMP_TSTAMP] = ICMP_TSTAMPREPLY;
+ icmpreplytype4[ICMP_IREQ] = ICMP_IREQREPLY;
+ icmpreplytype4[ICMP_MASKREQ] = ICMP_MASKREPLY;
+
+ return 0;
+}
+
+
+static ips_stat_t *fr_statetstats()
+{
+ ips_stats.iss_active = ips_num;
+ ips_stats.iss_table = ips_table;
+ ips_stats.iss_list = ips_list;
+ return &ips_stats;
+}
+
+
+/*
+ * flush state tables. two actions currently defined:
+ * which == 0 : flush all state table entries
+ * which == 1 : flush TCP connections which have started to close but are
+ * stuck for some reason.
+ */
+static int fr_state_flush(which)
+int which;
+{
+ register ipstate_t *is, **isp;
+#if defined(_KERNEL) && !SOLARIS
+ int s;
+#endif
+ int delete, removed = 0;
+
+ SPL_NET(s);
+ for (isp = &ips_list; (is = *isp); ) {
+ delete = 0;
+
+ switch (which)
+ {
+ case 0 :
+ delete = 1;
+ break;
+ case 1 :
+ if (is->is_p != IPPROTO_TCP)
+ break;
+ if ((is->is_state[0] != TCPS_ESTABLISHED) ||
+ (is->is_state[1] != TCPS_ESTABLISHED))
+ delete = 1;
+ break;
+ }
+
+ if (delete) {
+ if (is->is_p == IPPROTO_TCP)
+ ips_stats.iss_fin++;
+ else
+ ips_stats.iss_expire++;
+#ifdef IPFILTER_LOG
+ ipstate_log(is, ISL_FLUSH);
+#endif
+ fr_delstate(is);
+ removed++;
+ } else
+ isp = &is->is_next;
+ }
+ SPL_X(s);
+ return removed;
+}
+
+
+static int fr_state_remove(data)
+caddr_t data;
+{
+ ipstate_t *sp, st;
+ int error;
+
+ sp = &st;
+ error = IRCOPYPTR(data, (caddr_t)&st, sizeof(st));
+ if (error)
+ return EFAULT;
+
+ for (sp = ips_list; sp; sp = sp->is_next)
+ if ((sp->is_p == st.is_p) && (sp->is_v == st.is_v) &&
+ !bcmp((char *)&sp->is_src, (char *)&st.is_src,
+ sizeof(st.is_src)) &&
+ !bcmp((char *)&sp->is_dst, (char *)&st.is_src,
+ sizeof(st.is_dst)) &&
+ !bcmp((char *)&sp->is_ps, (char *)&st.is_ps,
+ sizeof(st.is_ps))) {
+ WRITE_ENTER(&ipf_state);
+#ifdef IPFILTER_LOG
+ ipstate_log(sp, ISL_REMOVE);
+#endif
+ fr_delstate(sp);
+ RWLOCK_EXIT(&ipf_state);
+ return 0;
+ }
+ return ESRCH;
+}
+
+
+int fr_state_ioctl(data, cmd, mode)
+caddr_t data;
+#if defined(__NetBSD__) || defined(__OpenBSD__)
+u_long cmd;
+#else
+int cmd;
+#endif
+int mode;
+{
+ int arg, ret, error = 0;
+
+ switch (cmd)
+ {
+ case SIOCDELST :
+ error = fr_state_remove(data);
+ break;
+ case SIOCIPFFL :
+ error = IRCOPY(data, (caddr_t)&arg, sizeof(arg));
+ if (error)
+ break;
+ if (arg == 0 || arg == 1) {
+ WRITE_ENTER(&ipf_state);
+ ret = fr_state_flush(arg);
+ RWLOCK_EXIT(&ipf_state);
+ error = IWCOPY((caddr_t)&ret, data, sizeof(ret));
+ } else
+ error = EINVAL;
+ break;
+#ifdef IPFILTER_LOG
+ case SIOCIPFFB :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+ int tmp;
+
+ tmp = ipflog_clear(IPL_LOGSTATE);
+ IWCOPY((char *)&tmp, data, sizeof(tmp));
+ }
+ break;
+#endif
+ case SIOCGETFS :
+ error = IWCOPYPTR((caddr_t)fr_statetstats(), data,
+ sizeof(ips_stat_t));
+ break;
+ case FIONREAD :
+#ifdef IPFILTER_LOG
+ arg = (int)iplused[IPL_LOGSTATE];
+ error = IWCOPY((caddr_t)&arg, (caddr_t)data, sizeof(arg));
+#endif
+ break;
+ case SIOCSTLCK :
+ error = fr_lock(data, &fr_state_lock);
+ break;
+ case SIOCSTPUT :
+ if (!fr_state_lock) {
+ error = EACCES;
+ break;
+ }
+ error = fr_stputent(data);
+ break;
+ case SIOCSTGET :
+ if (!fr_state_lock) {
+ error = EACCES;
+ break;
+ }
+ error = fr_stgetent(data);
+ break;
+ default :
+ error = EINVAL;
+ break;
+ }
+ return error;
+}
+
+
+int fr_stgetent(data)
+caddr_t data;
+{
+ register ipstate_t *is, *isn;
+ ipstate_save_t ips, *ipsp;
+ int error;
+
+ error = IRCOPY(data, (caddr_t)&ipsp, sizeof(ipsp));
+ if (error)
+ return EFAULT;
+ error = IRCOPY((caddr_t)ipsp, (caddr_t)&ips, sizeof(ips));
+ if (error)
+ return EFAULT;
+
+ isn = ips.ips_next;
+ if (!isn) {
+ isn = ips_list;
+ if (isn == NULL) {
+ if (ips.ips_next == NULL)
+ return ENOENT;
+ return 0;
+ }
+ } else {
+ /*
+ * Make sure the pointer we're copying from exists in the
+ * current list of entries. Security precaution to prevent
+ * copying of random kernel data.
+ */
+ for (is = ips_list; is; is = is->is_next)
+ if (is == isn)
+ break;
+ if (!is)
+ return ESRCH;
+ }
+ ips.ips_next = isn->is_next;
+ bcopy((char *)isn, (char *)&ips.ips_is, sizeof(ips.ips_is));
+ if (isn->is_rule)
+ bcopy((char *)isn->is_rule, (char *)&ips.ips_fr,
+ sizeof(ips.ips_fr));
+ error = IWCOPY((caddr_t)&ips, ipsp, sizeof(ips));
+ if (error)
+ error = EFAULT;
+ return error;
+}
+
+
+int fr_stputent(data)
+caddr_t data;
+{
+ register ipstate_t *is, *isn;
+ ipstate_save_t ips, *ipsp;
+ int error, out;
+ frentry_t *fr;
+
+ error = IRCOPY(data, (caddr_t)&ipsp, sizeof(ipsp));
+ if (error)
+ return EFAULT;
+ error = IRCOPY((caddr_t)ipsp, (caddr_t)&ips, sizeof(ips));
+ if (error)
+ return EFAULT;
+
+ KMALLOC(isn, ipstate_t *);
+ if (isn == NULL)
+ return ENOMEM;
+
+ bcopy((char *)&ips.ips_is, (char *)isn, sizeof(*isn));
+ fr = isn->is_rule;
+ if (fr != NULL) {
+ if (isn->is_flags & FI_NEWFR) {
+ KMALLOC(fr, frentry_t *);
+ if (fr == NULL) {
+ KFREE(isn);
+ return ENOMEM;
+ }
+ bcopy((char *)&ips.ips_fr, (char *)fr, sizeof(*fr));
+ out = fr->fr_flags & FR_OUTQUE ? 1 : 0;
+ isn->is_rule = fr;
+ ips.ips_is.is_rule = fr;
+ if (*fr->fr_ifname) {
+ fr->fr_ifa = GETUNIT(fr->fr_ifname, fr->fr_v);
+ if (fr->fr_ifa == NULL)
+ fr->fr_ifa = (void *)-1;
+#ifdef _KERNEL
+ else {
+ strncpy(isn->is_ifname[out],
+ IFNAME(fr->fr_ifa), IFNAMSIZ);
+ isn->is_ifp[out] = fr->fr_ifa;
+ }
+#endif
+ } else
+ fr->fr_ifa = NULL;
+ /*
+ * send a copy back to userland of what we ended up
+ * to allow for verification.
+ */
+ error = IWCOPY((caddr_t)&ips, ipsp, sizeof(ips));
+ if (error) {
+ KFREE(isn);
+ KFREE(fr);
+ return EFAULT;
+ }
+ } else {
+ for (is = ips_list; is; is = is->is_next)
+ if (is->is_rule == fr)
+ break;
+ if (!is) {
+ KFREE(isn);
+ return ESRCH;
+ }
+ }
+ }
+ fr_stinsert(isn);
+ return 0;
+}
+
+
+void fr_stinsert(is)
+register ipstate_t *is;
+{
+ register u_int hv = is->is_hv;
+
+ MUTEX_INIT(&is->is_lock, "ipf state entry", NULL);
+
+ is->is_ifname[0][sizeof(is->is_ifname[0]) - 1] = '\0';
+ if (is->is_ifname[0][0] != '\0') {
+ is->is_ifp[0] = GETUNIT(is->is_ifname[0], is->is_v);
+ }
+ is->is_ifname[1][sizeof(is->is_ifname[0]) - 1] = '\0';
+ if (is->is_ifname[1][0] != '\0') {
+ is->is_ifp[1] = GETUNIT(is->is_ifname[1], is->is_v);
+ }
+
+ /*
+ * add into list table.
+ */
+ if (ips_list)
+ ips_list->is_pnext = &is->is_next;
+ is->is_pnext = &ips_list;
+ is->is_next = ips_list;
+ ips_list = is;
+ if (ips_table[hv])
+ ips_table[hv]->is_phnext = &is->is_hnext;
+ else
+ ips_stats.iss_inuse++;
+ is->is_phnext = ips_table + hv;
+ is->is_hnext = ips_table[hv];
+ ips_table[hv] = is;
+ ips_num++;
+}
+
+
+/*
+ * Create a new ipstate structure and hang it off the hash table.
+ */
+ipstate_t *fr_addstate(ip, fin, flags)
+ip_t *ip;
+fr_info_t *fin;
+u_int flags;
+{
+ register tcphdr_t *tcp = NULL;
+ register ipstate_t *is;
+ register u_int hv;
+ ipstate_t ips;
+ u_int pass;
+ int out;
+
+ if (fr_state_lock || (fin->fin_off & IP_OFFMASK) ||
+ (fin->fin_fi.fi_fl & FI_SHORT))
+ return NULL;
+ if (ips_num == fr_statemax) {
+ ips_stats.iss_max++;
+ fr_state_doflush = 1;
+ return NULL;
+ }
+ out = fin->fin_out;
+ is = &ips;
+ bzero((char *)is, sizeof(*is));
+ ips.is_age = 1;
+ ips.is_state[0] = 0;
+ ips.is_state[1] = 0;
+ /*
+ * Copy and calculate...
+ */
+ hv = (is->is_p = fin->fin_fi.fi_p);
+ is->is_src = fin->fin_fi.fi_src;
+ hv += is->is_saddr;
+ is->is_dst = fin->fin_fi.fi_dst;
+ hv += is->is_daddr;
+#ifdef USE_INET6
+ if (fin->fin_v == 6) {
+ if (is->is_p == IPPROTO_ICMPV6) {
+ if (IN6_IS_ADDR_MULTICAST(&is->is_dst.in6))
+ flags |= FI_W_DADDR;
+ if (out)
+ hv -= is->is_daddr;
+ else
+ hv -= is->is_saddr;
+ }
+ }
+#endif
+
+ switch (is->is_p)
+ {
+#ifdef USE_INET6
+ case IPPROTO_ICMPV6 :
+#endif
+ case IPPROTO_ICMP :
+ {
+ struct icmp *ic = (struct icmp *)fin->fin_dp;
+
+#ifdef USE_INET6
+ if ((is->is_p == IPPROTO_ICMPV6) &&
+ ((ic->icmp_type & ICMP6_INFOMSG_MASK) == 0))
+ return NULL;
+#endif
+ switch (ic->icmp_type)
+ {
+#ifdef USE_INET6
+ case ICMP6_ECHO_REQUEST :
+ is->is_icmp.ics_type = ICMP6_ECHO_REPLY;
+ hv += (is->is_icmp.ics_id = ic->icmp_id);
+ hv += (is->is_icmp.ics_seq = ic->icmp_seq);
+ break;
+ case ICMP6_MEMBERSHIP_QUERY :
+ case ND_ROUTER_SOLICIT :
+ case ND_NEIGHBOR_SOLICIT :
+ is->is_icmp.ics_type = ic->icmp_type + 1;
+ break;
+#endif
+ case ICMP_ECHO :
+ case ICMP_TSTAMP :
+ case ICMP_IREQ :
+ case ICMP_MASKREQ :
+ is->is_icmp.ics_type = ic->icmp_type;
+ hv += (is->is_icmp.ics_id = ic->icmp_id);
+ hv += (is->is_icmp.ics_seq = ic->icmp_seq);
+ break;
+ default :
+ return NULL;
+ }
+ ATOMIC_INCL(ips_stats.iss_icmp);
+ is->is_age = fr_icmptimeout;
+ break;
+ }
+ case IPPROTO_TCP :
+ {
+ tcp = (tcphdr_t *)fin->fin_dp;
+
+ if (tcp->th_flags & TH_RST)
+ return NULL;
+ /*
+ * The endian of the ports doesn't matter, but the ack and
+ * sequence numbers do as we do mathematics on them later.
+ */
+ is->is_dport = tcp->th_dport;
+ is->is_sport = tcp->th_sport;
+ if ((flags & (FI_W_DPORT|FI_W_SPORT)) == 0) {
+ hv += tcp->th_dport;
+ hv += tcp->th_sport;
+ }
+ is->is_send = ntohl(tcp->th_seq) + fin->fin_dlen -
+ (tcp->th_off << 2) +
+ ((tcp->th_flags & TH_SYN) ? 1 : 0) +
+ ((tcp->th_flags & TH_FIN) ? 1 : 0);
+ is->is_maxsend = is->is_send;
+ is->is_dend = 0;
+ is->is_maxdwin = 1;
+ is->is_maxswin = ntohs(tcp->th_win);
+ if (is->is_maxswin == 0)
+ is->is_maxswin = 1;
+ /*
+ * If we're creating state for a starting connection, start the
+ * timer on it as we'll never see an error if it fails to
+ * connect.
+ */
+ ATOMIC_INCL(ips_stats.iss_tcp);
+ break;
+ }
+ case IPPROTO_UDP :
+ {
+ tcp = (tcphdr_t *)fin->fin_dp;
+
+ is->is_dport = tcp->th_dport;
+ is->is_sport = tcp->th_sport;
+ if ((flags & (FI_W_DPORT|FI_W_SPORT)) == 0) {
+ hv += tcp->th_dport;
+ hv += tcp->th_sport;
+ }
+ ATOMIC_INCL(ips_stats.iss_udp);
+ is->is_age = fr_udptimeout;
+ break;
+ }
+ default :
+ return NULL;
+ }
+
+ KMALLOC(is, ipstate_t *);
+ if (is == NULL) {
+ ATOMIC_INCL(ips_stats.iss_nomem);
+ return NULL;
+ }
+ bcopy((char *)&ips, (char *)is, sizeof(*is));
+ hv %= fr_statesize;
+ is->is_hv = hv;
+ is->is_rule = fin->fin_fr;
+ if (is->is_rule != NULL) {
+ ATOMIC_INC32(is->is_rule->fr_ref);
+ pass = is->is_rule->fr_flags;
+ } else
+ pass = fr_flags;
+ WRITE_ENTER(&ipf_state);
+
+ is->is_pass = pass;
+ is->is_pkts = 1;
+ is->is_bytes = fin->fin_dlen + fin->fin_hlen;
+ /*
+ * We want to check everything that is a property of this packet,
+ * but we don't (automatically) care about it's fragment status as
+ * this may change.
+ */
+ is->is_v = fin->fin_fi.fi_v;
+ is->is_opt = fin->fin_fi.fi_optmsk;
+ is->is_optmsk = 0xffffffff;
+ is->is_sec = fin->fin_fi.fi_secmsk;
+ is->is_secmsk = 0xffff;
+ is->is_auth = fin->fin_fi.fi_auth;
+ is->is_authmsk = 0xffff;
+ is->is_flags = fin->fin_fi.fi_fl & FI_CMP;
+ is->is_flags |= FI_CMP << 4;
+ is->is_flags |= flags & (FI_WILDP|FI_WILDA);
+ if (flags & (FI_WILDP|FI_WILDA))
+ ips_wild++;
+ is->is_ifp[1 - out] = NULL;
+ is->is_ifp[out] = fin->fin_ifp;
+#ifdef _KERNEL
+ strncpy(is->is_ifname[out], IFNAME(fin->fin_ifp), IFNAMSIZ);
+#endif
+ is->is_ifname[1 - out][0] = '\0';
+ if (pass & FR_LOGFIRST)
+ is->is_pass &= ~(FR_LOGFIRST|FR_LOG);
+ fr_stinsert(is);
+ if (is->is_p == IPPROTO_TCP) {
+ MUTEX_ENTER(&is->is_lock);
+ fr_tcp_age(&is->is_age, is->is_state, fin,
+ 0); /* 0 = packet from the source */
+ MUTEX_EXIT(&is->is_lock);
+ }
+#ifdef IPFILTER_LOG
+ ipstate_log(is, ISL_NEW);
+#endif
+ RWLOCK_EXIT(&ipf_state);
+ fin->fin_rev = IP6NEQ(is->is_dst, fin->fin_fi.fi_dst);
+ if ((fin->fin_fi.fi_fl & FI_FRAG) && (pass & FR_KEEPFRAG))
+ ipfr_newfrag(ip, fin, pass ^ FR_KEEPSTATE);
+ return is;
+}
+
+
+
+/*
+ * check to see if a packet with TCP headers fits within the TCP window.
+ * change timeout depending on whether new packet is a SYN-ACK returning for a
+ * SYN or a RST or FIN which indicate time to close up shop.
+ */
+int fr_tcpstate(is, fin, ip, tcp)
+register ipstate_t *is;
+fr_info_t *fin;
+ip_t *ip;
+tcphdr_t *tcp;
+{
+ register tcp_seq seq, ack, end;
+ register int ackskew;
+ tcpdata_t *fdata, *tdata;
+ u_short win, maxwin;
+ int ret = 0;
+ int source;
+
+ /*
+ * Find difference between last checked packet and this packet.
+ */
+ source = IP6EQ(fin->fin_fi.fi_src, is->is_src);
+ fdata = &is->is_tcp.ts_data[!source];
+ tdata = &is->is_tcp.ts_data[source];
+ seq = ntohl(tcp->th_seq);
+ ack = ntohl(tcp->th_ack);
+ win = ntohs(tcp->th_win);
+ end = seq + fin->fin_dlen - (tcp->th_off << 2) +
+ ((tcp->th_flags & TH_SYN) ? 1 : 0) +
+ ((tcp->th_flags & TH_FIN) ? 1 : 0);
+
+ MUTEX_ENTER(&is->is_lock);
+ if (fdata->td_end == 0) {
+ /*
+ * Must be a (outgoing) SYN-ACK in reply to a SYN.
+ */
+ fdata->td_end = end;
+ fdata->td_maxwin = 1;
+ fdata->td_maxend = end + 1;
+ }
+
+ if (!(tcp->th_flags & TH_ACK)) { /* Pretend an ack was sent */
+ ack = tdata->td_end;
+ } else if (((tcp->th_flags & (TH_ACK|TH_RST)) == (TH_ACK|TH_RST)) &&
+ (ack == 0)) {
+ /* gross hack to get around certain broken tcp stacks */
+ ack = tdata->td_end;
+ }
+
+ if (seq == end)
+ seq = end = fdata->td_end;
+
+ maxwin = tdata->td_maxwin;
+ ackskew = tdata->td_end - ack;
+
+#define SEQ_GE(a,b) ((int)((a) - (b)) >= 0)
+#define SEQ_GT(a,b) ((int)((a) - (b)) > 0)
+ if ((SEQ_GE(fdata->td_maxend, end)) &&
+ (SEQ_GE(seq, fdata->td_end - maxwin)) &&
+/* XXX what about big packets */
+#define MAXACKWINDOW 66000
+ (ackskew >= -MAXACKWINDOW) &&
+ (ackskew <= MAXACKWINDOW)) {
+ /* if ackskew < 0 then this should be due to fragented
+ * packets. There is no way to know the length of the
+ * total packet in advance.
+ * We do know the total length from the fragment cache though.
+ * Note however that there might be more sessions with
+ * exactly the same source and destination paramters in the
+ * state cache (and source and destination is the only stuff
+ * that is saved in the fragment cache). Note further that
+ * some TCP connections in the state cache are hashed with
+ * sport and dport as well which makes it not worthwhile to
+ * look for them.
+ * Thus, when ackskew is negative but still seems to belong
+ * to this session, we bump up the destinations end value.
+ */
+ if (ackskew < 0)
+ tdata->td_end = ack;
+
+ /* update max window seen */
+ if (fdata->td_maxwin < win)
+ fdata->td_maxwin = win;
+ if (SEQ_GT(end, fdata->td_end))
+ fdata->td_end = end;
+ if (SEQ_GE(ack + win, tdata->td_maxend)) {
+ tdata->td_maxend = ack + win;
+ if (win == 0)
+ tdata->td_maxend++;
+ }
+
+ ATOMIC_INCL(ips_stats.iss_hits);
+ /*
+ * Nearing end of connection, start timeout.
+ */
+ /* source ? 0 : 1 -> !source */
+ fr_tcp_age(&is->is_age, is->is_state, fin, !source);
+ ret = 1;
+ }
+ MUTEX_EXIT(&is->is_lock);
+ return ret;
+}
+
+
+static int fr_matchsrcdst(is, src, dst, fin, tcp)
+ipstate_t *is;
+union i6addr src, dst;
+fr_info_t *fin;
+tcphdr_t *tcp;
+{
+ int ret = 0, rev, out, flags;
+ u_short sp, dp;
+ void *ifp;
+
+ rev = fin->fin_rev = IP6NEQ(is->is_dst, dst);
+ ifp = fin->fin_ifp;
+ out = fin->fin_out;
+
+ if (tcp != NULL) {
+ flags = is->is_flags;
+ sp = tcp->th_sport;
+ dp = tcp->th_dport;
+ } else {
+ flags = is->is_flags & FI_WILDA;
+ sp = 0;
+ dp = 0;
+ }
+
+ if (rev == 0) {
+ if (!out) {
+ if (is->is_ifpin == NULL || is->is_ifpin == ifp)
+ ret = 1;
+ } else {
+ if (is->is_ifpout == NULL || is->is_ifpout == ifp)
+ ret = 1;
+ }
+ } else {
+ if (out) {
+ if (is->is_ifpin == NULL || is->is_ifpin == ifp)
+ ret = 1;
+ } else {
+ if (is->is_ifpout == NULL || is->is_ifpout == ifp)
+ ret = 1;
+ }
+ }
+ if (ret == 0)
+ return 0;
+ ret = 0;
+
+ if (rev == 0) {
+ if (
+ (IP6EQ(is->is_dst, dst) || (flags & FI_W_DADDR)) &&
+ (IP6EQ(is->is_src, src) || (flags & FI_W_SADDR)) &&
+ (!tcp || ((sp == is->is_sport || flags & FI_W_SPORT) &&
+ (dp == is->is_dport || flags & FI_W_DPORT)))) {
+ ret = 1;
+ }
+ } else {
+ if (
+ (IP6EQ(is->is_dst, src) || (flags & FI_W_DADDR)) &&
+ (IP6EQ(is->is_src, dst) || (flags & FI_W_SADDR)) &&
+ (!tcp || ((sp == is->is_dport || flags & FI_W_DPORT) &&
+ (dp == is->is_sport || flags & FI_W_SPORT)))) {
+ ret = 1;
+ }
+ }
+ if (ret == 0)
+ return 0;
+
+ /*
+ * Whether or not this should be here, is questionable, but the aim
+ * is to get this out of the main line.
+ */
+ if (tcp == NULL)
+ flags = is->is_flags & (FI_CMP|(FI_CMP<<4));
+
+ if (((fin->fin_fi.fi_fl & (flags >> 4)) != (flags & FI_CMP)) ||
+ ((fin->fin_fi.fi_optmsk & is->is_optmsk) != is->is_opt) ||
+ ((fin->fin_fi.fi_secmsk & is->is_secmsk) != is->is_sec) ||
+ ((fin->fin_fi.fi_auth & is->is_authmsk) != is->is_auth))
+ return 0;
+
+ if ((flags & (FI_W_SPORT|FI_W_DPORT))) {
+ if ((flags & FI_W_SPORT) != 0) {
+ if (rev == 0) {
+ is->is_sport = sp;
+ is->is_send = htonl(tcp->th_seq);
+ } else {
+ is->is_sport = dp;
+ is->is_send = htonl(tcp->th_ack);
+ }
+ is->is_maxsend = is->is_send + 1;
+ } else if ((flags & FI_W_DPORT) != 0) {
+ if (rev == 0) {
+ is->is_dport = dp;
+ is->is_dend = htonl(tcp->th_ack);
+ } else {
+ is->is_dport = sp;
+ is->is_dend = htonl(tcp->th_seq);
+ }
+ is->is_maxdend = is->is_dend + 1;
+ }
+ is->is_flags &= ~(FI_W_SPORT|FI_W_DPORT);
+ ips_wild--;
+ }
+
+ ret = -1;
+
+ if (!rev) {
+ if (out) {
+ if (!is->is_ifpout)
+ ret = 1;
+ } else {
+ if (!is->is_ifpin)
+ ret = 0;
+ }
+ } else {
+ if (out) {
+ if (!is->is_ifpin)
+ ret = 0;
+ } else {
+ if (!is->is_ifpout)
+ ret = 1;
+ }
+ }
+
+ if (ret >= 0) {
+ is->is_ifp[ret] = ifp;
+#ifdef _KERNEL
+ strncpy(is->is_ifname[out], IFNAME(fin->fin_ifp),
+ sizeof(is->is_ifname[1]));
+#endif
+ }
+#ifdef _KERNEL
+ if (ret >= 0) {
+ strncpy(is->is_ifname[out], IFNAME(fin->fin_ifp),
+ sizeof(is->is_ifname[1]));
+ }
+#endif
+ return 1;
+}
+
+static int fr_matchicmpqueryreply(v, is, icmp)
+int v;
+ipstate_t *is;
+icmphdr_t *icmp;
+{
+ if (v == 4) {
+ /*
+ * If we matched its type on the way in, then when going out
+ * it will still be the same type.
+ */
+ if (((icmp->icmp_type == is->is_type) ||
+ (icmpreplytype4[is->is_type] == icmp->icmp_type)) &&
+ (icmp->icmp_id == is->is_icmp.ics_id) &&
+ (icmp->icmp_seq == is->is_icmp.ics_seq)) {
+ return 1;
+ };
+ }
+#ifdef USE_INET6
+ else if (is->is_v == 6) {
+ if ((is->is_type == ICMP6_ECHO_REPLY) &&
+ (icmp->icmp_type == ICMP6_ECHO_REQUEST) &&
+ (icmp->icmp_id == is->is_icmp.ics_id) &&
+ (icmp->icmp_seq == is->is_icmp.ics_seq)) {
+ return 1;
+ };
+ }
+#endif
+ return 0;
+}
+
+static frentry_t *fr_checkicmpmatchingstate(ip, fin)
+ip_t *ip;
+fr_info_t *fin;
+{
+ register ipstate_t *is, **isp;
+ register u_short sport, dport;
+ register u_char pr;
+ union i6addr dst, src;
+ struct icmp *ic;
+ u_short savelen;
+ icmphdr_t *icmp;
+ fr_info_t ofin;
+ int type, len;
+ tcphdr_t *tcp;
+ frentry_t *fr;
+ ip_t *oip;
+ u_int hv;
+
+ /*
+ * Does it at least have the return (basic) IP header ?
+ * Only a basic IP header (no options) should be with
+ * an ICMP error header.
+ */
+ if (((ip->ip_v != 4) || (ip->ip_hl != 5)) ||
+ (fin->fin_plen < ICMPERR_MINPKTLEN))
+ return NULL;
+ ic = (struct icmp *)fin->fin_dp;
+ type = ic->icmp_type;
+ /*
+ * If it's not an error type, then return
+ */
+ if ((type != ICMP_UNREACH) && (type != ICMP_SOURCEQUENCH) &&
+ (type != ICMP_REDIRECT) && (type != ICMP_TIMXCEED) &&
+ (type != ICMP_PARAMPROB))
+ return NULL;
+
+ oip = (ip_t *)((char *)ic + ICMPERR_ICMPHLEN);
+ if (fin->fin_plen < ICMPERR_MAXPKTLEN + ((oip->ip_hl - 5) << 2))
+ return NULL;
+
+ /*
+ * Sanity checks.
+ */
+ len = fin->fin_dlen - ICMPERR_ICMPHLEN;
+ if ((len <= 0) || ((oip->ip_hl << 2) > len))
+ return NULL;
+
+ /*
+ * Is the buffer big enough for all of it ? It's the size of the IP
+ * header claimed in the encapsulated part which is of concern. It
+ * may be too big to be in this buffer but not so big that it's
+ * outside the ICMP packet, leading to TCP deref's causing problems.
+ * This is possible because we don't know how big oip_hl is when we
+ * do the pullup early in fr_check() and thus can't gaurantee it is
+ * all here now.
+ */
+#ifdef _KERNEL
+ {
+ mb_t *m;
+
+# if SOLARIS
+ m = fin->fin_qfm;
+ if ((char *)oip + len > (char *)m->b_wptr)
+ return NULL;
+# else
+ m = *(mb_t **)fin->fin_mp;
+ if ((char *)oip + len > (char *)ip + m->m_len)
+ return NULL;
+# endif
+ }
+#endif
+
+ /*
+ * in the IPv4 case we must zero the i6addr union otherwise
+ * the IP6EQ and IP6NEQ macros produce the wrong results because
+ * of the 'junk' in the unused part of the union
+ */
+ bzero((char *)&src, sizeof(src));
+ bzero((char *)&dst, sizeof(dst));
+
+ if (oip->ip_p == IPPROTO_ICMP) {
+ icmp = (icmphdr_t *)((char *)oip + (oip->ip_hl << 2));
+
+ /*
+ * a ICMP error can only be generated as a result of an
+ * ICMP query, not as the response on an ICMP error
+ *
+ * XXX theoretically ICMP_ECHOREP and the other reply's are
+ * ICMP query's as well, but adding them here seems strange XXX
+ */
+ if ((icmp->icmp_type != ICMP_ECHO) &&
+ (icmp->icmp_type != ICMP_TSTAMP) &&
+ (icmp->icmp_type != ICMP_IREQ) &&
+ (icmp->icmp_type != ICMP_MASKREQ))
+ return NULL;
+
+ /*
+ * perform a lookup of the ICMP packet in the state table
+ */
+ hv = (pr = oip->ip_p);
+ src.in4 = oip->ip_src;
+ hv += src.in4.s_addr;
+ dst.in4 = oip->ip_dst;
+ hv += dst.in4.s_addr;
+ hv += icmp->icmp_id;
+ hv += icmp->icmp_seq;
+ hv %= fr_statesize;
+
+ savelen = oip->ip_len;
+ oip->ip_len = len;
+ ofin.fin_v = 4;
+ fr_makefrip(oip->ip_hl << 2, oip, &ofin);
+ oip->ip_len = savelen;
+ ofin.fin_ifp = fin->fin_ifp;
+ ofin.fin_out = !fin->fin_out;
+ ofin.fin_mp = NULL; /* if dereferenced, panic XXX */
+
+ READ_ENTER(&ipf_state);
+ for (isp = &ips_table[hv]; (is = *isp); isp = &is->is_hnext)
+ if ((is->is_p == pr) && (is->is_v == 4) &&
+ fr_matchsrcdst(is, src, dst, &ofin, NULL) &&
+ fr_matchicmpqueryreply(is->is_v, is, icmp)) {
+ ips_stats.iss_hits++;
+ is->is_pkts++;
+ is->is_bytes += ip->ip_len;
+ fr = is->is_rule;
+ RWLOCK_EXIT(&ipf_state);
+ return fr;
+ }
+ RWLOCK_EXIT(&ipf_state);
+ return NULL;
+ };
+
+ if ((oip->ip_p != IPPROTO_TCP) && (oip->ip_p != IPPROTO_UDP))
+ return NULL;
+
+ tcp = (tcphdr_t *)((char *)oip + (oip->ip_hl << 2));
+ dport = tcp->th_dport;
+ sport = tcp->th_sport;
+
+ hv = (pr = oip->ip_p);
+ src.in4 = oip->ip_src;
+ hv += src.in4.s_addr;
+ dst.in4 = oip->ip_dst;
+ hv += dst.in4.s_addr;
+ hv += dport;
+ hv += sport;
+ hv %= fr_statesize;
+ /*
+ * we make an fin entry to be able to feed it to
+ * matchsrcdst note that not all fields are encessary
+ * but this is the cleanest way. Note further we fill
+ * in fin_mp such that if someone uses it we'll get
+ * a kernel panic. fr_matchsrcdst does not use this.
+ *
+ * watch out here, as ip is in host order and oip in network
+ * order. Any change we make must be undone afterwards.
+ */
+ savelen = oip->ip_len;
+ oip->ip_len = len;
+ ofin.fin_v = 4;
+ fr_makefrip(oip->ip_hl << 2, oip, &ofin);
+ oip->ip_len = savelen;
+ ofin.fin_ifp = fin->fin_ifp;
+ ofin.fin_out = !fin->fin_out;
+ ofin.fin_mp = NULL; /* if dereferenced, panic XXX */
+ READ_ENTER(&ipf_state);
+ for (isp = &ips_table[hv]; (is = *isp); isp = &is->is_hnext) {
+ /*
+ * Only allow this icmp though if the
+ * encapsulated packet was allowed through the
+ * other way around. Note that the minimal amount
+ * of info present does not allow for checking against
+ * tcp internals such as seq and ack numbers.
+ */
+ if ((is->is_p == pr) && (is->is_v == 4) &&
+ fr_matchsrcdst(is, src, dst, &ofin, tcp)) {
+ fr = is->is_rule;
+ ips_stats.iss_hits++;
+ is->is_pkts++;
+ is->is_bytes += fin->fin_plen;
+ /*
+ * we deliberately do not touch the timeouts
+ * for the accompanying state table entry.
+ * It remains to be seen if that is correct. XXX
+ */
+ RWLOCK_EXIT(&ipf_state);
+ return fr;
+ }
+ }
+ RWLOCK_EXIT(&ipf_state);
+ return NULL;
+}
+
+
+static void fr_ipsmove(isp, is, hv)
+ipstate_t **isp, *is;
+u_int hv;
+{
+ u_int hvm;
+
+ hvm = is->is_hv;
+ /*
+ * Remove the hash from the old location...
+ */
+ if (is->is_hnext)
+ is->is_hnext->is_phnext = isp;
+ *isp = is->is_hnext;
+ if (ips_table[hvm] == NULL)
+ ips_stats.iss_inuse--;
+
+ /*
+ * ...and put the hash in the new one.
+ */
+ hvm = hv % fr_statesize;
+ is->is_hv = hvm;
+ isp = &ips_table[hvm];
+ if (*isp)
+ (*isp)->is_phnext = &is->is_hnext;
+ else
+ ips_stats.iss_inuse++;
+ is->is_phnext = isp;
+ is->is_hnext = *isp;
+ *isp = is;
+}
+
+
+/*
+ * Check if a packet has a registered state.
+ */
+frentry_t *fr_checkstate(ip, fin)
+ip_t *ip;
+fr_info_t *fin;
+{
+ union i6addr dst, src;
+ register ipstate_t *is, **isp;
+ register u_char pr;
+ u_int hv, hvm, hlen, tryagain, pass, v;
+ struct icmp *ic;
+ frentry_t *fr;
+ tcphdr_t *tcp;
+
+ if (fr_state_lock || (fin->fin_off & IP_OFFMASK) ||
+ (fin->fin_fi.fi_fl & FI_SHORT))
+ return NULL;
+
+ is = NULL;
+ hlen = fin->fin_hlen;
+ tcp = (tcphdr_t *)((char *)ip + hlen);
+ ic = (struct icmp *)tcp;
+ hv = (pr = fin->fin_fi.fi_p);
+ src = fin->fin_fi.fi_src;
+ dst = fin->fin_fi.fi_dst;
+ hv += src.in4.s_addr;
+ hv += dst.in4.s_addr;
+
+ /*
+ * Search the hash table for matching packet header info.
+ */
+ v = fin->fin_fi.fi_v;
+ switch (fin->fin_fi.fi_p)
+ {
+#ifdef USE_INET6
+ case IPPROTO_ICMPV6 :
+ if (v == 6) {
+ if (fin->fin_out)
+ hv -= dst.in4.s_addr;
+ else
+ hv -= src.in4.s_addr;
+ if ((ic->icmp_type == ICMP6_ECHO_REQUEST) ||
+ (ic->icmp_type == ICMP6_ECHO_REPLY)) {
+ hv += ic->icmp_id;
+ hv += ic->icmp_seq;
+ }
+ }
+#endif
+ case IPPROTO_ICMP :
+ if (v == 4) {
+ hv += ic->icmp_id;
+ hv += ic->icmp_seq;
+ }
+ hv %= fr_statesize;
+ READ_ENTER(&ipf_state);
+ for (isp = &ips_table[hv]; (is = *isp); isp = &is->is_hnext) {
+ if ((is->is_p == pr) && (is->is_v == v) &&
+ fr_matchsrcdst(is, src, dst, fin, NULL) &&
+ fr_matchicmpqueryreply(v, is, ic)) {
+ is->is_age = fr_icmptimeout;
+ break;
+ }
+ }
+ if (is != NULL)
+ break;
+ RWLOCK_EXIT(&ipf_state);
+ /*
+ * No matching icmp state entry. Perhaps this is a
+ * response to another state entry.
+ */
+#ifdef USE_INET6
+ if (v == 6)
+ fr = fr_checkicmp6matchingstate((ip6_t *)ip, fin);
+ else
+#endif
+ fr = fr_checkicmpmatchingstate(ip, fin);
+ if (fr)
+ return fr;
+ break;
+ case IPPROTO_TCP :
+ {
+ register u_short dport, sport;
+ register int i;
+
+ i = tcp->th_flags;
+ /*
+ * Just plain ignore RST flag set with either FIN or SYN.
+ */
+ if ((i & TH_RST) &&
+ ((i & (TH_FIN|TH_SYN|TH_RST)) != TH_RST))
+ break;
+ case IPPROTO_UDP :
+ dport = tcp->th_dport;
+ sport = tcp->th_sport;
+ tryagain = 0;
+ hv += dport;
+ hv += sport;
+ READ_ENTER(&ipf_state);
+retry_tcpudp:
+ hvm = hv % fr_statesize;
+ for (isp = &ips_table[hvm]; (is = *isp); isp = &is->is_hnext)
+ if ((is->is_p == pr) && (is->is_v == v) &&
+ fr_matchsrcdst(is, src, dst, fin, tcp)) {
+ if ((pr == IPPROTO_TCP)) {
+ if (!fr_tcpstate(is, fin, ip, tcp)) {
+ continue;
+ }
+ }
+ break;
+ }
+ if (is != NULL) {
+ if (tryagain &&
+ !(is->is_flags & (FI_WILDP|FI_WILDA))) {
+ hv += dport;
+ hv += sport;
+ fr_ipsmove(isp, is, hv);
+ MUTEX_DOWNGRADE(&ipf_state);
+ }
+ break;
+ }
+ RWLOCK_EXIT(&ipf_state);
+ if (!tryagain && ips_wild) {
+ hv -= dport;
+ hv -= sport;
+ tryagain = 1;
+ WRITE_ENTER(&ipf_state);
+ goto retry_tcpudp;
+ }
+ break;
+ }
+ default :
+ break;
+ }
+ if (is == NULL) {
+ ATOMIC_INCL(ips_stats.iss_miss);
+ return NULL;
+ }
+ MUTEX_ENTER(&is->is_lock);
+ is->is_bytes += fin->fin_plen;
+ ips_stats.iss_hits++;
+ is->is_pkts++;
+ MUTEX_EXIT(&is->is_lock);
+ fr = is->is_rule;
+ fin->fin_fr = fr;
+ pass = is->is_pass;
+#ifndef _KERNEL
+ if (tcp->th_flags & TCP_CLOSE)
+ fr_delstate(is);
+#endif
+ RWLOCK_EXIT(&ipf_state);
+ if ((fin->fin_fi.fi_fl & FI_FRAG) && (pass & FR_KEEPFRAG))
+ ipfr_newfrag(ip, fin, pass ^ FR_KEEPSTATE);
+ return fr;
+}
+
+
+void ip_statesync(ifp)
+void *ifp;
+{
+ register ipstate_t *is;
+
+ WRITE_ENTER(&ipf_state);
+ for (is = ips_list; is; is = is->is_next) {
+ if (is->is_ifpin == ifp) {
+ is->is_ifpin = GETUNIT(is->is_ifname[0], is->is_v);
+ if (!is->is_ifpin)
+ is->is_ifpin = (void *)-1;
+ }
+ if (is->is_ifpout == ifp) {
+ is->is_ifpout = GETUNIT(is->is_ifname[1], is->is_v);
+ if (!is->is_ifpout)
+ is->is_ifpout = (void *)-1;
+ }
+ }
+ RWLOCK_EXIT(&ipf_state);
+}
+
+
+/*
+ * Must always be called with fr_ipfstate held as a write lock.
+ */
+static void fr_delstate(is)
+ipstate_t *is;
+{
+ frentry_t *fr;
+
+ if (is->is_flags & (FI_WILDP|FI_WILDA))
+ ips_wild--;
+ if (is->is_next)
+ is->is_next->is_pnext = is->is_pnext;
+ *is->is_pnext = is->is_next;
+ if (is->is_hnext)
+ is->is_hnext->is_phnext = is->is_phnext;
+ *is->is_phnext = is->is_hnext;
+ if (ips_table[is->is_hv] == NULL)
+ ips_stats.iss_inuse--;
+
+ fr = is->is_rule;
+ if (fr != NULL) {
+ fr->fr_ref--;
+ if (fr->fr_ref == 0) {
+ KFREE(fr);
+ }
+ }
+#ifdef _KERNEL
+ MUTEX_DESTROY(&is->is_lock);
+#endif
+ KFREE(is);
+ ips_num--;
+}
+
+
+/*
+ * Free memory in use by all state info. kept.
+ */
+void fr_stateunload()
+{
+ register ipstate_t *is;
+
+ WRITE_ENTER(&ipf_state);
+ while ((is = ips_list))
+ fr_delstate(is);
+ ips_stats.iss_inuse = 0;
+ ips_num = 0;
+ RWLOCK_EXIT(&ipf_state);
+ KFREES(ips_table, fr_statesize * sizeof(ipstate_t *));
+ ips_table = NULL;
+}
+
+
+/*
+ * Slowly expire held state for thingslike UDP and ICMP. Timeouts are set
+ * in expectation of this being called twice per second.
+ */
+void fr_timeoutstate()
+{
+ register ipstate_t *is, **isp;
+#if defined(_KERNEL) && !SOLARIS
+ int s;
+#endif
+
+ SPL_NET(s);
+ WRITE_ENTER(&ipf_state);
+ for (isp = &ips_list; (is = *isp); )
+ if (is->is_age && !--is->is_age) {
+ if (is->is_p == IPPROTO_TCP)
+ ips_stats.iss_fin++;
+ else
+ ips_stats.iss_expire++;
+#ifdef IPFILTER_LOG
+ ipstate_log(is, ISL_EXPIRE);
+#endif
+ fr_delstate(is);
+ } else
+ isp = &is->is_next;
+ if (fr_state_doflush) {
+ (void) fr_state_flush(1);
+ fr_state_doflush = 0;
+ }
+ RWLOCK_EXIT(&ipf_state);
+ SPL_X(s);
+}
+
+
+/*
+ * Original idea freom Pradeep Krishnan for use primarily with NAT code.
+ * (pkrishna@netcom.com)
+ *
+ * Rewritten by Arjan de Vet <Arjan.deVet@adv.iae.nl>, 2000-07-29:
+ *
+ * - (try to) base state transitions on real evidence only,
+ * i.e. packets that are sent and have been received by ipfilter;
+ * diagram 18.12 of TCP/IP volume 1 by W. Richard Stevens was used.
+ *
+ * - deal with half-closed connections correctly;
+ *
+ * - store the state of the source in state[0] such that ipfstat
+ * displays the state as source/dest instead of dest/source; the calls
+ * to fr_tcp_age have been changed accordingly.
+ *
+ * Parameters:
+ *
+ * state[0] = state of source (host that initiated connection)
+ * state[1] = state of dest (host that accepted the connection)
+ *
+ * dir == 0 : a packet from source to dest
+ * dir == 1 : a packet from dest to source
+ *
+ */
+void fr_tcp_age(age, state, fin, dir)
+u_long *age;
+u_char *state;
+fr_info_t *fin;
+int dir;
+{
+ tcphdr_t *tcp = (tcphdr_t *)fin->fin_dp;
+ u_char flags = tcp->th_flags;
+ int dlen, ostate;
+
+ ostate = state[1 - dir];
+
+ dlen = fin->fin_plen - fin->fin_hlen - (tcp->th_off << 2);
+
+ if (flags & TH_RST) {
+ if (!(tcp->th_flags & TH_PUSH) && !dlen) {
+ *age = fr_tcpclosed;
+ state[dir] = TCPS_CLOSED;
+ } else {
+ *age = fr_tcpclosewait;
+ state[dir] = TCPS_CLOSE_WAIT;
+ }
+ return;
+ }
+
+ *age = fr_tcptimeout; /* default 4 mins */
+
+ switch(state[dir])
+ {
+ case TCPS_CLOSED: /* 0 */
+ if ((flags & TH_OPENING) == TH_OPENING) {
+ /*
+ * 'dir' received an S and sends SA in response,
+ * CLOSED -> SYN_RECEIVED
+ */
+ state[dir] = TCPS_SYN_RECEIVED;
+ *age = fr_tcptimeout;
+ } else if ((flags & (TH_SYN|TH_ACK)) == TH_SYN) {
+ /* 'dir' sent S, CLOSED -> SYN_SENT */
+ state[dir] = TCPS_SYN_SENT;
+ *age = fr_tcptimeout;
+ }
+ /*
+ * The next piece of code makes it possible to get
+ * already established connections into the state table
+ * after a restart or reload of the filter rules; this
+ * does not work when a strict 'flags S keep state' is
+ * used for tcp connections of course
+ */
+ if ((flags & (TH_FIN|TH_SYN|TH_RST|TH_ACK)) == TH_ACK) {
+ /* we saw an A, guess 'dir' is in ESTABLISHED mode */
+ state[dir] = TCPS_ESTABLISHED;
+ *age = fr_tcpidletimeout;
+ }
+ /*
+ * TODO: besides regular ACK packets we can have other
+ * packets as well; it is yet to be determined how we
+ * should initialize the states in those cases
+ */
+ break;
+
+ case TCPS_LISTEN: /* 1 */
+ /* NOT USED */
+ break;
+
+ case TCPS_SYN_SENT: /* 2 */
+ if ((flags & (TH_SYN|TH_FIN|TH_ACK)) == TH_ACK) {
+ /*
+ * We see an A from 'dir' which is in SYN_SENT
+ * state: 'dir' sent an A in response to an SA
+ * which it received, SYN_SENT -> ESTABLISHED
+ */
+ state[dir] = TCPS_ESTABLISHED;
+ *age = fr_tcpidletimeout;
+ } else if (flags & TH_FIN) {
+ /*
+ * We see an F from 'dir' which is in SYN_SENT
+ * state and wants to close its side of the
+ * connection; SYN_SENT -> FIN_WAIT_1
+ */
+ state[dir] = TCPS_FIN_WAIT_1;
+ *age = fr_tcpidletimeout; /* or fr_tcptimeout? */
+ } else if ((flags & TH_OPENING) == TH_OPENING) {
+ /*
+ * We see an SA from 'dir' which is already in
+ * SYN_SENT state, this means we have a
+ * simultaneous open; SYN_SENT -> SYN_RECEIVED
+ */
+ state[dir] = TCPS_SYN_RECEIVED;
+ *age = fr_tcptimeout;
+ }
+ break;
+
+ case TCPS_SYN_RECEIVED: /* 3 */
+ if ((flags & (TH_SYN|TH_FIN|TH_ACK)) == TH_ACK) {
+ /*
+ * We see an A from 'dir' which was in SYN_RECEIVED
+ * state so it must now be in established state,
+ * SYN_RECEIVED -> ESTABLISHED
+ */
+ state[dir] = TCPS_ESTABLISHED;
+ *age = fr_tcpidletimeout;
+ } else if (flags & TH_FIN) {
+ /*
+ * We see an F from 'dir' which is in SYN_RECEIVED
+ * state and wants to close its side of the connection;
+ * SYN_RECEIVED -> FIN_WAIT_1
+ */
+ state[dir] = TCPS_FIN_WAIT_1;
+ *age = fr_tcpidletimeout;
+ }
+ break;
+
+ case TCPS_ESTABLISHED: /* 4 */
+ if (flags & TH_FIN) {
+ /*
+ * 'dir' closed its side of the connection; this
+ * gives us a half-closed connection;
+ * ESTABLISHED -> FIN_WAIT_1
+ */
+ state[dir] = TCPS_FIN_WAIT_1;
+ *age = fr_tcphalfclosed;
+ } else if (flags & TH_ACK) {
+ /* an ACK, should we exclude other flags here? */
+ if (ostate == TCPS_FIN_WAIT_1) {
+ /*
+ * We know the other side did an active close,
+ * so we are ACKing the recvd FIN packet (does
+ * the window matching code guarantee this?)
+ * and go into CLOSE_WAIT state; this gives us
+ * a half-closed connection
+ */
+ state[dir] = TCPS_CLOSE_WAIT;
+ *age = fr_tcphalfclosed;
+ } else if (ostate < TCPS_CLOSE_WAIT)
+ /*
+ * Still a fully established connection,
+ * reset timeout
+ */
+ *age = fr_tcpidletimeout;
+ }
+ break;
+
+ case TCPS_CLOSE_WAIT: /* 5 */
+ if (flags & TH_FIN) {
+ /*
+ * Application closed and 'dir' sent a FIN, we're now
+ * going into LAST_ACK state
+ */
+ *age = fr_tcplastack;
+ state[dir] = TCPS_LAST_ACK;
+ } else {
+ /*
+ * We remain in CLOSE_WAIT because the other side has
+ * closed already and we did not close our side yet;
+ * reset timeout
+ */
+ *age = fr_tcphalfclosed;
+ }
+ break;
+
+ case TCPS_FIN_WAIT_1: /* 6 */
+ if ((flags & TH_ACK) && ostate > TCPS_CLOSE_WAIT) {
+ /*
+ * If the other side is not active anymore it has sent
+ * us a FIN packet that we are ack'ing now with an ACK;
+ * this means both sides have now closed the connection
+ * and we go into TIME_WAIT
+ */
+ /*
+ * XXX: how do we know we really are ACKing the FIN
+ * packet here? does the window code guarantee that?
+ */
+ state[dir] = TCPS_TIME_WAIT;
+ *age = fr_tcptimeout;
+ } else
+ /*
+ * We closed our side of the connection already but the
+ * other side is still active (ESTABLISHED/CLOSE_WAIT);
+ * continue with this half-closed connection
+ */
+ *age = fr_tcphalfclosed;
+ break;
+
+ case TCPS_CLOSING: /* 7 */
+ /* NOT USED */
+ break;
+
+ case TCPS_LAST_ACK: /* 8 */
+ if (flags & TH_ACK) {
+ if ((flags & TH_PUSH) || dlen)
+ /*
+ * There is still data to be delivered, reset
+ * timeout
+ */
+ *age = fr_tcplastack;
+ }
+ /*
+ * We cannot detect when we go out of LAST_ACK state to CLOSED
+ * because that is based on the reception of ACK packets;
+ * ipfilter can only detect that a packet has been sent by a
+ * host
+ */
+ break;
+
+ case TCPS_FIN_WAIT_2: /* 9 */
+ /* NOT USED */
+ break;
+
+ case TCPS_TIME_WAIT: /* 10 */
+ /* we're in 2MSL timeout now */
+ break;
+ }
+}
+
+
+#ifdef IPFILTER_LOG
+void ipstate_log(is, type)
+struct ipstate *is;
+u_int type;
+{
+ struct ipslog ipsl;
+ void *items[1];
+ size_t sizes[1];
+ int types[1];
+
+ ipsl.isl_type = type;
+ ipsl.isl_pkts = is->is_pkts;
+ ipsl.isl_bytes = is->is_bytes;
+ ipsl.isl_src = is->is_src;
+ ipsl.isl_dst = is->is_dst;
+ ipsl.isl_p = is->is_p;
+ ipsl.isl_v = is->is_v;
+ ipsl.isl_flags = is->is_flags;
+ if (ipsl.isl_p == IPPROTO_TCP || ipsl.isl_p == IPPROTO_UDP) {
+ ipsl.isl_sport = is->is_sport;
+ ipsl.isl_dport = is->is_dport;
+ if (ipsl.isl_p == IPPROTO_TCP) {
+ ipsl.isl_state[0] = is->is_state[0];
+ ipsl.isl_state[1] = is->is_state[1];
+ }
+ } else if (ipsl.isl_p == IPPROTO_ICMP)
+ ipsl.isl_itype = is->is_icmp.ics_type;
+ else {
+ ipsl.isl_ps.isl_filler[0] = 0;
+ ipsl.isl_ps.isl_filler[1] = 0;
+ }
+ items[0] = &ipsl;
+ sizes[0] = sizeof(ipsl);
+ types[0] = 0;
+
+ (void) ipllog(IPL_LOGSTATE, NULL, items, sizes, types, 1);
+}
+#endif
+
+
+#ifdef USE_INET6
+frentry_t *fr_checkicmp6matchingstate(ip, fin)
+ip6_t *ip;
+fr_info_t *fin;
+{
+ register ipstate_t *is, **isp;
+ register u_short sport, dport;
+ register u_char pr;
+ struct icmp6_hdr *ic, *oic;
+ union i6addr dst, src;
+ u_short savelen;
+ fr_info_t ofin;
+ tcphdr_t *tcp;
+ frentry_t *fr;
+ ip6_t *oip;
+ int type;
+ u_int hv;
+
+ /*
+ * Does it at least have the return (basic) IP header ?
+ * Only a basic IP header (no options) should be with
+ * an ICMP error header.
+ */
+ if ((fin->fin_v != 6) || (fin->fin_plen < ICMP6ERR_MINPKTLEN))
+ return NULL;
+ ic = (struct icmp6_hdr *)fin->fin_dp;
+ type = ic->icmp6_type;
+ /*
+ * If it's not an error type, then return
+ */
+ if ((type != ICMP6_DST_UNREACH) && (type != ICMP6_PACKET_TOO_BIG) &&
+ (type != ICMP6_TIME_EXCEEDED) && (type != ICMP6_PARAM_PROB))
+ return NULL;
+
+ oip = (ip6_t *)((char *)ic + ICMPERR_ICMPHLEN);
+ if (fin->fin_plen < sizeof(*oip))
+ return NULL;
+
+ if (oip->ip6_nxt == IPPROTO_ICMPV6) {
+ oic = (struct icmp6_hdr *)(oip + 1);
+ /*
+ * a ICMP error can only be generated as a result of an
+ * ICMP query, not as the response on an ICMP error
+ *
+ * XXX theoretically ICMP_ECHOREP and the other reply's are
+ * ICMP query's as well, but adding them here seems strange XXX
+ */
+ if (!(oic->icmp6_type & ICMP6_INFOMSG_MASK))
+ return NULL;
+
+ /*
+ * perform a lookup of the ICMP packet in the state table
+ */
+ hv = (pr = oip->ip6_nxt);
+ src.in6 = oip->ip6_src;
+ hv += src.in4.s_addr;
+ dst.in6 = oip->ip6_dst;
+ hv += dst.in4.s_addr;
+ hv += oic->icmp6_id;
+ hv += oic->icmp6_seq;
+ hv %= fr_statesize;
+
+ oip->ip6_plen = ntohs(oip->ip6_plen);
+ ofin.fin_v = 6;
+ fr_makefrip(sizeof(*oip), (ip_t *)oip, &ofin);
+ oip->ip6_plen = htons(oip->ip6_plen);
+ ofin.fin_ifp = fin->fin_ifp;
+ ofin.fin_out = !fin->fin_out;
+ ofin.fin_mp = NULL; /* if dereferenced, panic XXX */
+
+ READ_ENTER(&ipf_state);
+ for (isp = &ips_table[hv]; (is = *isp); isp = &is->is_hnext)
+ if ((is->is_p == pr) &&
+ (oic->icmp6_id == is->is_icmp.ics_id) &&
+ (oic->icmp6_seq == is->is_icmp.ics_seq) &&
+ fr_matchsrcdst(is, src, dst, &ofin, NULL)) {
+ /*
+ * in the state table ICMP query's are stored
+ * with the type of the corresponding ICMP
+ * response. Correct here
+ */
+ if (((is->is_type == ICMP6_ECHO_REPLY) &&
+ (oic->icmp6_type == ICMP6_ECHO_REQUEST)) ||
+ (is->is_type - 1 == oic->icmp6_type )) {
+ ips_stats.iss_hits++;
+ is->is_pkts++;
+ is->is_bytes += fin->fin_plen;
+ return is->is_rule;
+ }
+ }
+ RWLOCK_EXIT(&ipf_state);
+
+ return NULL;
+ };
+
+ if ((oip->ip6_nxt != IPPROTO_TCP) && (oip->ip6_nxt != IPPROTO_UDP))
+ return NULL;
+ tcp = (tcphdr_t *)(oip + 1);
+ dport = tcp->th_dport;
+ sport = tcp->th_sport;
+
+ hv = (pr = oip->ip6_nxt);
+ src.in6 = oip->ip6_src;
+ hv += src.in4.s_addr;
+ dst.in6 = oip->ip6_dst;
+ hv += dst.in4.s_addr;
+ hv += dport;
+ hv += sport;
+ hv %= fr_statesize;
+ /*
+ * we make an fin entry to be able to feed it to
+ * matchsrcdst note that not all fields are encessary
+ * but this is the cleanest way. Note further we fill
+ * in fin_mp such that if someone uses it we'll get
+ * a kernel panic. fr_matchsrcdst does not use this.
+ *
+ * watch out here, as ip is in host order and oip in network
+ * order. Any change we make must be undone afterwards.
+ */
+ savelen = oip->ip6_plen;
+ oip->ip6_plen = ip->ip6_plen - sizeof(*ip) - ICMPERR_ICMPHLEN;
+ ofin.fin_v = 6;
+ fr_makefrip(sizeof(*oip), (ip_t *)oip, &ofin);
+ oip->ip6_plen = savelen;
+ ofin.fin_ifp = fin->fin_ifp;
+ ofin.fin_out = !fin->fin_out;
+ ofin.fin_mp = NULL; /* if dereferenced, panic XXX */
+ READ_ENTER(&ipf_state);
+ for (isp = &ips_table[hv]; (is = *isp); isp = &is->is_hnext) {
+ /*
+ * Only allow this icmp though if the
+ * encapsulated packet was allowed through the
+ * other way around. Note that the minimal amount
+ * of info present does not allow for checking against
+ * tcp internals such as seq and ack numbers.
+ */
+ if ((is->is_p == pr) && (is->is_v == 6) &&
+ fr_matchsrcdst(is, src, dst, &ofin, tcp)) {
+ fr = is->is_rule;
+ ips_stats.iss_hits++;
+ /*
+ * we must swap src and dst here because the icmp
+ * comes the other way around
+ */
+ is->is_pkts++;
+ is->is_bytes += fin->fin_plen;
+ /*
+ * we deliberately do not touch the timeouts
+ * for the accompanying state table entry.
+ * It remains to be seen if that is correct. XXX
+ */
+ RWLOCK_EXIT(&ipf_state);
+ return fr;
+ }
+ }
+ RWLOCK_EXIT(&ipf_state);
+ return NULL;
+}
+#endif
diff --git a/sys/contrib/ipfilter/netinet/ip_state.h b/sys/contrib/ipfilter/netinet/ip_state.h
new file mode 100644
index 0000000..765709c
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_state.h
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 1995-2000 by Darren Reed.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and due credit is given
+ * to the original author and the contributors.
+ *
+ * @(#)ip_state.h 1.3 1/12/96 (C) 1995 Darren Reed
+ * $Id: ip_state.h,v 2.13.2.1 2000/07/08 02:15:35 darrenr Exp $
+ * $FreeBSD$
+ */
+#ifndef __IP_STATE_H__
+#define __IP_STATE_H__
+
+#if defined(__STDC__) || defined(__GNUC__)
+# define SIOCDELST _IOW('r', 61, struct ipstate *)
+#else
+# define SIOCDELST _IOW(r, 61, struct ipstate *)
+#endif
+
+#define IPSTATE_SIZE 5737
+#define IPSTATE_MAX 4013 /* Maximum number of states held */
+
+#define PAIRS(s1,d1,s2,d2) ((((s1) == (s2)) && ((d1) == (d2))) ||\
+ (((s1) == (d2)) && ((d1) == (s2))))
+#define IPPAIR(s1,d1,s2,d2) PAIRS((s1).s_addr, (d1).s_addr, \
+ (s2).s_addr, (d2).s_addr)
+
+
+typedef struct udpstate {
+ u_short us_sport;
+ u_short us_dport;
+} udpstate_t;
+
+typedef struct icmpstate {
+ u_short ics_id;
+ u_short ics_seq;
+ u_char ics_type;
+} icmpstate_t;
+
+typedef struct tcpdata {
+ u_32_t td_end;
+ u_32_t td_maxend;
+ u_short td_maxwin;
+} tcpdata_t;
+
+typedef struct tcpstate {
+ u_short ts_sport;
+ u_short ts_dport;
+ tcpdata_t ts_data[2];
+ u_char ts_state[2];
+} tcpstate_t;
+
+typedef struct ipstate {
+ struct ipstate *is_next;
+ struct ipstate **is_pnext;
+ struct ipstate *is_hnext;
+ struct ipstate **is_phnext;
+ u_long is_age;
+ u_int is_pass;
+ U_QUAD_T is_pkts;
+ U_QUAD_T is_bytes;
+ void *is_ifp[2];
+ frentry_t *is_rule;
+ union i6addr is_src;
+ union i6addr is_dst;
+ u_char is_p; /* Protocol */
+ u_char is_v;
+ u_int is_hv;
+ u_32_t is_flags;
+ u_32_t is_opt; /* packet options set */
+ u_32_t is_optmsk; /* " " mask */
+ u_short is_sec; /* security options set */
+ u_short is_secmsk; /* " " mask */
+ u_short is_auth; /* authentication options set */
+ u_short is_authmsk; /* " " mask */
+ union {
+ icmpstate_t is_ics;
+ tcpstate_t is_ts;
+ udpstate_t is_us;
+ } is_ps;
+ char is_ifname[2][IFNAMSIZ];
+#if SOLARIS || defined(__sgi)
+ kmutex_t is_lock;
+#endif
+} ipstate_t;
+
+#define is_saddr is_src.in4.s_addr
+#define is_daddr is_dst.in4.s_addr
+#define is_icmp is_ps.is_ics
+#define is_type is_icmp.ics_type
+#define is_code is_icmp.ics_code
+#define is_tcp is_ps.is_ts
+#define is_udp is_ps.is_us
+#define is_send is_tcp.ts_data[0].td_end
+#define is_dend is_tcp.ts_data[1].td_end
+#define is_maxswin is_tcp.ts_data[0].td_maxwin
+#define is_maxdwin is_tcp.ts_data[1].td_maxwin
+#define is_maxsend is_tcp.ts_data[0].td_maxend
+#define is_maxdend is_tcp.ts_data[1].td_maxend
+#define is_sport is_tcp.ts_sport
+#define is_dport is_tcp.ts_dport
+#define is_state is_tcp.ts_state
+#define is_ifpin is_ifp[0]
+#define is_ifpout is_ifp[1]
+
+#define TH_OPENING (TH_SYN|TH_ACK)
+/*
+ * is_flags:
+ * Bits 0 - 3 are use as a mask with the current packet's bits to check for
+ * whether it is short, tcp/udp, a fragment or the presence of IP options.
+ * Bits 4 - 7 are set from the initial packet and contain what the packet
+ * anded with bits 0-3 must match.
+ * Bits 8,9 are used to indicate wildcard source/destination port matching.
+ */
+
+typedef struct ipstate_save {
+ void *ips_next;
+ struct ipstate ips_is;
+ struct frentry ips_fr;
+} ipstate_save_t;
+
+#define ips_rule ips_is.is_rule
+
+
+typedef struct ipslog {
+ U_QUAD_T isl_pkts;
+ U_QUAD_T isl_bytes;
+ union i6addr isl_src;
+ union i6addr isl_dst;
+ u_short isl_type;
+ union {
+ u_short isl_filler[2];
+ u_short isl_ports[2];
+ u_short isl_icmp;
+ } isl_ps;
+ u_char isl_v;
+ u_char isl_p;
+ u_char isl_flags;
+ u_char isl_state[2];
+} ipslog_t;
+
+#define isl_sport isl_ps.isl_ports[0]
+#define isl_dport isl_ps.isl_ports[1]
+#define isl_itype isl_ps.isl_icmp
+
+#define ISL_NEW 0
+#define ISL_EXPIRE 0xffff
+#define ISL_FLUSH 0xfffe
+#define ISL_REMOVE 0xfffd
+
+
+typedef struct ips_stat {
+ u_long iss_hits;
+ u_long iss_miss;
+ u_long iss_max;
+ u_long iss_tcp;
+ u_long iss_udp;
+ u_long iss_icmp;
+ u_long iss_nomem;
+ u_long iss_expire;
+ u_long iss_fin;
+ u_long iss_active;
+ u_long iss_logged;
+ u_long iss_logfail;
+ u_long iss_inuse;
+ ipstate_t **iss_table;
+ ipstate_t *iss_list;
+} ips_stat_t;
+
+
+extern u_long fr_tcpidletimeout;
+extern u_long fr_tcpclosewait;
+extern u_long fr_tcplastack;
+extern u_long fr_tcptimeout;
+extern u_long fr_tcpclosed;
+extern u_long fr_tcphalfclosed;
+extern u_long fr_udptimeout;
+extern u_long fr_icmptimeout;
+extern int fr_state_lock;
+extern int fr_stateinit __P((void));
+extern int fr_tcpstate __P((ipstate_t *, fr_info_t *, ip_t *, tcphdr_t *));
+extern ipstate_t *fr_addstate __P((ip_t *, fr_info_t *, u_int));
+extern frentry_t *fr_checkstate __P((ip_t *, fr_info_t *));
+extern void ip_statesync __P((void *));
+extern void fr_timeoutstate __P((void));
+extern void fr_tcp_age __P((u_long *, u_char *, fr_info_t *, int));
+extern void fr_stateunload __P((void));
+extern void ipstate_log __P((struct ipstate *, u_int));
+#if defined(__NetBSD__) || defined(__OpenBSD__)
+extern int fr_state_ioctl __P((caddr_t, u_long, int));
+#else
+extern int fr_state_ioctl __P((caddr_t, int, int));
+#endif
+
+#endif /* __IP_STATE_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ipl.h b/sys/contrib/ipfilter/netinet/ipl.h
new file mode 100644
index 0000000..79d0bd3
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ipl.h
@@ -0,0 +1,17 @@
+/*
+ * Copyright (C) 1993-2000 by Darren Reed.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and due credit is given
+ * to the original author and the contributors.
+ *
+ * @(#)ipl.h 1.21 6/5/96
+ * $FreeBSD$
+ */
+
+#ifndef __IPL_H__
+#define __IPL_H__
+
+#define IPL_VERSION "IP Filter: v3.4.16"
+
+#endif
diff --git a/sys/contrib/ipfilter/netinet/mlfk_ipl.c b/sys/contrib/ipfilter/netinet/mlfk_ipl.c
new file mode 100644
index 0000000..2a51d7d
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/mlfk_ipl.c
@@ -0,0 +1,196 @@
+/*
+ * Copyright 1999 Guido van Rooij. All rights reserved.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/conf.h>
+#include <sys/socket.h>
+#include <sys/sysctl.h>
+#include <net/if.h>
+#include <netinet/in_systm.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#if (__FreeBSD_version >= 199511)
+# include <net/route.h>
+# include <netinet/ip_var.h>
+# include <netinet/tcp.h>
+# include <netinet/tcpip.h>
+#endif
+
+
+#include <netinet/ipl.h>
+#include <netinet/ip_compat.h>
+#include <netinet/ip_fil.h>
+#include <netinet/ip_state.h>
+#include <netinet/ip_nat.h>
+#include <netinet/ip_auth.h>
+#include <netinet/ip_frag.h>
+#include <netinet/ip_proxy.h>
+
+static dev_t ipf_devs[IPL_LOGMAX + 1];
+
+SYSCTL_DECL(_net_inet);
+SYSCTL_NODE(_net_inet, OID_AUTO, ipf, CTLFLAG_RW, 0, "IPF");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_flags, CTLFLAG_RW, &fr_flags, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_pass, CTLFLAG_RW, &fr_pass, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_active, CTLFLAG_RD, &fr_active, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_tcpidletimeout, CTLFLAG_RW,
+ &fr_tcpidletimeout, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_tcpclosewait, CTLFLAG_RW,
+ &fr_tcpclosewait, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_tcplastack, CTLFLAG_RW,
+ &fr_tcplastack, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_tcptimeout, CTLFLAG_RW,
+ &fr_tcptimeout, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_tcpclosed, CTLFLAG_RW,
+ &fr_tcpclosed, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_tcphalfclosed, CTLFLAG_RW,
+ &fr_tcphalfclosed, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_udptimeout, CTLFLAG_RW,
+ &fr_udptimeout, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_icmptimeout, CTLFLAG_RW,
+ &fr_icmptimeout, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_defnatage, CTLFLAG_RW,
+ &fr_defnatage, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_ipfrttl, CTLFLAG_RW,
+ &fr_ipfrttl, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, ipl_unreach, CTLFLAG_RW,
+ &ipl_unreach, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_running, CTLFLAG_RD,
+ &fr_running, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_authsize, CTLFLAG_RD,
+ &fr_authsize, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_authused, CTLFLAG_RD,
+ &fr_authused, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_defaultauthage, CTLFLAG_RW,
+ &fr_defaultauthage, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_chksrc, CTLFLAG_RW, &fr_chksrc, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, ippr_ftp_pasvonly, CTLFLAG_RW,
+ &ippr_ftp_pasvonly, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_minttl, CTLFLAG_RW, &fr_minttl, 0, "");
+SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_minttllog, CTLFLAG_RW,
+ &fr_minttllog, 0, "");
+
+#define CDEV_MAJOR 79
+static struct cdevsw ipl_cdevsw = {
+ /* open */ iplopen,
+ /* close */ iplclose,
+ /* read */ iplread,
+ /* write */ nowrite,
+ /* ioctl */ iplioctl,
+ /* poll */ nopoll,
+ /* mmap */ nommap,
+ /* strategy */ nostrategy,
+ /* name */ "ipl",
+ /* maj */ CDEV_MAJOR,
+ /* dump */ nodump,
+ /* psize */ nopsize,
+ /* flags */ 0,
+};
+
+static int
+ipfilter_modevent(module_t mod, int type, void *unused)
+{
+ char *c;
+ int i, error = 0;
+
+ switch (type) {
+ case MOD_LOAD :
+
+ error = iplattach();
+ if (error)
+ break;
+
+ c = NULL;
+ for(i=strlen(IPL_NAME); i>0; i--)
+ if (IPL_NAME[i] == '/') {
+ c = &IPL_NAME[i+1];
+ break;
+ }
+ if (!c)
+ c = IPL_NAME;
+ ipf_devs[IPL_LOGIPF] =
+ make_dev(&ipl_cdevsw, IPL_LOGIPF, 0, 0, 0600, c);
+
+ c = NULL;
+ for(i=strlen(IPL_NAT); i>0; i--)
+ if (IPL_NAT[i] == '/') {
+ c = &IPL_NAT[i+1];
+ break;
+ }
+ if (!c)
+ c = IPL_NAT;
+ ipf_devs[IPL_LOGNAT] =
+ make_dev(&ipl_cdevsw, IPL_LOGNAT, 0, 0, 0600, c);
+
+ c = NULL;
+ for(i=strlen(IPL_STATE); i>0; i--)
+ if (IPL_STATE[i] == '/') {
+ c = &IPL_STATE[i+1];
+ break;
+ }
+ if (!c)
+ c = IPL_STATE;
+ ipf_devs[IPL_LOGSTATE] =
+ make_dev(&ipl_cdevsw, IPL_LOGSTATE, 0, 0, 0600, c);
+
+ c = NULL;
+ for(i=strlen(IPL_AUTH); i>0; i--)
+ if (IPL_AUTH[i] == '/') {
+ c = &IPL_AUTH[i+1];
+ break;
+ }
+ if (!c)
+ c = IPL_AUTH;
+ ipf_devs[IPL_LOGAUTH] =
+ make_dev(&ipl_cdevsw, IPL_LOGAUTH, 0, 0, 0600, c);
+
+ break;
+ case MOD_UNLOAD :
+ destroy_dev(ipf_devs[IPL_LOGIPF]);
+ destroy_dev(ipf_devs[IPL_LOGNAT]);
+ destroy_dev(ipf_devs[IPL_LOGSTATE]);
+ destroy_dev(ipf_devs[IPL_LOGAUTH]);
+ error = ipldetach();
+ break;
+ default:
+ error = EINVAL;
+ break;
+ }
+ return error;
+}
+
+static moduledata_t ipfiltermod = {
+ IPL_VERSION,
+ ipfilter_modevent,
+ 0
+};
+DECLARE_MODULE(ipfilter, ipfiltermod, SI_SUB_PROTO_DOMAIN, SI_ORDER_ANY);
OpenPOWER on IntegriCloud